be4311c07e14feb728abc6425ee606ffaa611a58
markd
  Fri Jan 22 06:46:58 2021 -0800
merge with master

diff --git src/hg/utils/mafToBigMaf/mafToBigMaf.c src/hg/utils/mafToBigMaf/mafToBigMaf.c
index 221afe0..2c5808b 100644
--- src/hg/utils/mafToBigMaf/mafToBigMaf.c
+++ src/hg/utils/mafToBigMaf/mafToBigMaf.c
@@ -1,82 +1,93 @@
 /* mafToBigMaf - Put ucsc standard maf file into bigMaf format. */
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "options.h"
 #include "maf.h"
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "mafToBigMaf - Put ucsc standard maf file into bigMaf format\n"
   "usage:\n"
   "   mafToBigMaf referenceDb input.maf out.bed\n"
   "options:\n"
   "   -xxx=XXX\n"
   );
 }
 
 /* Command line validation table. */
 static struct optionSpec options[] = {
    {NULL, 0},
 };
 
 void packageAli(FILE *out, struct mafAli *ali)
 {
 }
 
 void mafToBigMaf(char *referenceDb, char *inputMaf, char *outBed)
 /* mafToBigMaf - Put ucsc standard maf file into bigMaf format. */
 {
 struct mafFile *mf = mafOpen(inputMaf);
 FILE *out = mustOpen(outBed, "w");
 
 struct mafAli *ali;
 char lastChrom[1024];
 *lastChrom = 0;
 unsigned lastEnd = 0;
 while ((ali = mafNext(mf)) != NULL)
     {
     struct mafComp *master = ali->components;
     char *dot = strchr(master->src, '.');
 
     if (dot == NULL)
         errAbort("maf block on line %d missing properly formated reference sequence", mf->lf->lineIx);
 
     *dot = 0;
     char *chrom = dot + 1;
 
     if (differentString(referenceDb, master->src))
+        {
+        // there might be a dot in the organism name
+        *dot = '.';
+        dot = strchr(dot + 1, '.');
+        if (dot != NULL)
+            {
+            *dot = 0;
+            chrom = dot + 1;
+            }
+        if ((dot == NULL) || differentString(referenceDb, master->src))
             errAbort("reference databases (%s) must be first component of every block on line %d", referenceDb, mf->lf->lineIx);
+        }
 
     if (master->strand != '+')
         errAbort("reference sequence has to be on positive strand on line %d", mf->lf->lineIx);
 
     if (sameString(lastChrom, chrom))
         {
         if (master->start < lastEnd)
             errAbort("reference sequence out of order on line %d (start address %d is less than last end address %d)", mf->lf->lineIx, master->start, lastEnd);
         }
     else
         safecpy(lastChrom, sizeof lastChrom, chrom);
 
     lastEnd = master->start + master->size;
 
     fprintf(out, "%s\t%d\t%d\t", chrom, master->start, lastEnd);
     *dot = '.';
     mafWriteDelimiter(out, ali, ';');
     fputc('\n', out);
     mafAliFree(&ali);
     }
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 optionInit(&argc, argv, options);
 if (argc != 4)
     usage();
 mafToBigMaf(argv[1],argv[2],argv[3]);
 return 0;
 }