9fd1c6fa1c7581d60eacdc0eb14c5afda0d35e9b
kent
  Mon Sep 2 11:41:17 2019 -0700
Generating organ table if need be.

diff --git src/hca/hcat/hcatTabUpdate/hcatTabUpdate.c src/hca/hcat/hcatTabUpdate/hcatTabUpdate.c
index a608945..666da90 100644
--- src/hca/hcat/hcatTabUpdate/hcatTabUpdate.c
+++ src/hca/hcat/hcatTabUpdate/hcatTabUpdate.c
@@ -335,65 +335,104 @@
     else
         safef(labName, sizeof(labName), "%s", short_name);
     labName[50] = 0;  // not too long
 
     char *outFields[4] = {"?short_name", "institution", "@contact_id@hcat_contributor@name@id", 
 	"@@contributors@id@hcat_lab_contributors@lab_id@contributor_id@hcat_contributor@name@id"};
     struct fieldedTable *labTable = fieldedTableNew("lab", outFields, ArraySize(outFields));
     char *outRow[4] = {labName, institute, contact, contributors};
     fieldedTableAdd(labTable, outRow, ArraySize(outRow), 1);
     return labTable;
     }
 else
     return NULL;
 }
 
+struct fieldedTable *makeOrgan(struct fieldedTable *inProject)
+/* If there's and organ field we make an organ table. */
+{
+uglyf("Trying to make organs for %s\n", inProject->name);
+
+/* See if it's even in the inProject table, and return quickly with a NULL if not. */
+int organIx = fieldedTableFindFieldIx(inProject, "organ");
+uglyf("organsIx %d\n", organIx);
+if (organIx < 0)
+    return NULL;
+
+/* Make up our little generic table */
+char *outFields[] = {"?short_name", "description",};
+struct fieldedTable *organTable = fieldedTableNew("organ", outFields, ArraySize(outFields));
+
+/* Fetch the input value, which is a comma separated list.  Then go through
+ * the list and make a table entry for each item. */
+char **inRow = inProject->rowList->row;
+char *organTsv = inRow[organIx];
+struct dyString *csvScratch = dyStringNew(0);
+char *organName;
+while ((organName = csvParseNext(&organTsv, csvScratch)) != NULL)
+    {
+    char *outRow[2] = {organName, "NEEDS DESCRIPTION"};
+    fieldedTableAdd(organTable, outRow, ArraySize(outRow), 0);
+    }
+
+/* Clean up and go home. */
+dyStringFree(&csvScratch);
+return organTable;
+}
+
 void hcatTabUpdate(char *inDir, char *outDir)
 /* hcatTabUpdate - Update the hcat database given a tab seperated input and output dir. */
 {
 // We are actually just looking for specific files in inDir. */
 
 /* Load up input projects table */
 char *projectFile = "hcat_project.tsv";
 char inPath[PATH_LEN];
 safef(inPath, sizeof(inPath), "%s/%s", inDir, projectFile);
 char *projectRequired[] = {"short_name", "contact_name", "contributors"};
 struct fieldedTable *inProject = fieldedTableFromTabFile(inPath, inPath, 
     projectRequired, ArraySize(projectRequired));
 
 /* Load up samples table */
 char *sampleFile = "hcat_sample.tsv";
 safef(inPath, sizeof(inPath), "%s/%s", inDir, sampleFile);
 char *sampleRequired[] = {"short_name",};
 struct fieldedTable *inSample = fieldedTableFromTabFile(inPath, inPath, 
     sampleRequired, ArraySize(sampleRequired));
 
 
 /* Make sure inProject table makes sense by having exactly one row */
 if (inProject->rowCount != 1)
     errAbort("Expected one row in %s, got %d\n", projectFile, inProject->rowCount);
 
 struct fieldedTable *outContributor = makeContributors(inProject);
 struct fieldedTable *outProject = makeProject(inProject, inSample);
 struct fieldedTable *outLab = makeLab(inProject);
+struct fieldedTable *outOrgan = makeOrgan(inProject);
 
 /* Write output from lowest level to highest level tables. */
 makeDirsOnPath(outDir);
 char outPath[PATH_LEN];
 safef(outPath, sizeof(outPath), "%s/hcat_%s", outDir, "contributor.tsv");
 fieldedTableToTabFile(outContributor, outPath);
 
+if (outOrgan != NULL)
+    {
+    safef(outPath, sizeof(outPath), "%s/hcat_%s", outDir, "organ.tsv");
+    fieldedTableToTabFile(outOrgan, outPath);
+    }
+
 if (outLab != NULL)
     {
     safef(outPath, sizeof(outPath), "%s/hcat_%s", outDir, "lab.tsv");
     fieldedTableToTabFile(outLab, outPath);
     }
 
 safef(outPath, sizeof(outPath), "%s/hcat_%s", outDir, "project.tsv");
 fieldedTableToTabFile(outProject, outPath);
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 optionInit(&argc, argv, options);
 if (argc != 3)