57c27eb76af85e951c3586834eef4499f628ac5f
kent
  Wed Nov 24 14:21:01 2021 -0800
One shot self-imposed- data problem fixer.  Nothing to see here.

diff --git src/hg/oneShot/demergeSingle/demergeSingle.c src/hg/oneShot/demergeSingle/demergeSingle.c
index 2e7c6a3..30294f2 100644
--- src/hg/oneShot/demergeSingle/demergeSingle.c
+++ src/hg/oneShot/demergeSingle/demergeSingle.c
@@ -1,79 +1,88 @@
 /* demergeSingle - Help propagate terminology changes used in merged tracks to what makes them up.. */
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
+#include "obscure.h"
 #include "options.h"
 #include "fieldedTable.h"
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "demergeSingle - Help propagate terminology changes used in merged tracks to what makes them up.\n"
   "usage:\n"
-  "   demergeSingle merged oldSingle newSingle\n"
+  "   demergeSingle merged fileList backupSuffix\n"
   "options:\n"
   "   -xxx=XXX\n"
   );
 }
 
 /* Command line validation table. */
 static struct optionSpec options[] = {
    {NULL, 0},
 };
 
 void demergeOne(struct fieldedTable *mergedTable, struct hash *mergedHash, 
     char *oldFile, char *newFile)
 {
 char *requiredSingle[] = {"cluster", "total"};
 struct fieldedTable *oldTable = fieldedTableFromTabFile(oldFile, oldFile,
     requiredSingle, ArraySize(requiredSingle));
 uglyf("%s has %d rows and %d fields\n", oldFile, oldTable->rowCount, oldTable->fieldCount);
 
 /* Open output file and write header */
 FILE *f = mustOpen(newFile, "w");
 fprintf(f, "#label\told_label");
 int i;
 for (i=1; i<mergedTable->fieldCount; ++i)
     fprintf(f, "\t%s", mergedTable->fields[i]);
 fprintf(f, "\n");
 
 int joinIx = fieldedTableMustFindFieldIx(oldTable, "total");
 struct fieldedRow *fr;
 for (fr = oldTable->rowList; fr != NULL; fr = fr->next)
     {
     char *key = fr->row[joinIx];
     struct fieldedRow *mergedRow = hashMustFindVal(mergedHash, key);
     char *organCellType = mergedRow->row[0];
     nextWord(&organCellType);	// skip organ
     fprintf(f, "%s\t%s", organCellType, fr->row[0]);
     int i;
     for (i=1; i<mergedTable->fieldCount; ++i)
 	fprintf(f, "\t%s", mergedRow->row[i]);
     fprintf(f, "\n");
     }
 carefulClose(&f);
 }
 
 
-void demergeSingle(char *merged, char *oldSingle, char *newSingle)
+void demergeSingle(char *merged, char *oldFiles, char *backupSuffix)
 /* demergeSingle - Help propagate terminology changes used in merged tracks to what makes them up.. */
 {
 char *required[] = {"count", "total", "cell_class",};
 struct fieldedTable *mergedTable = fieldedTableFromTabFile(merged, merged, 
     required, ArraySize(required));
 uglyf("%s has %d rows and %d fields\n", merged, mergedTable->rowCount, mergedTable->fieldCount);
 struct hash *mergedHash = fieldedTableUniqueIndex(mergedTable, "total");
 
-demergeOne(mergedTable, mergedHash, oldSingle, newSingle);
+struct slName *fileList = readAllLines(oldFiles);
+uglyf("Processing %d files\n", slCount(fileList));
+struct slName *file;
+for (file = fileList; file != NULL; file = file->next)
+    {
+    char newPath[PATH_LEN];
+    safef(newPath, sizeof(newPath), "%s%s", file->name, backupSuffix);
+    demergeOne(mergedTable, mergedHash, file->name, newPath);
+    }
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 optionInit(&argc, argv, options);
 if (argc != 4)
     usage();
 demergeSingle(argv[1], argv[2], argv[3]);
 return 0;
 }