15d0836b4dba65919e83ce5ef0aaafe5a0edc72f
angie
  Wed Apr 17 12:49:53 2013 -0700
Making annoGratorGpVar able to handle VCF input too.  In order for a grator tosee what type of input is coming from the primary source, the streamer should
be passed in along with the primary row, as it is for formatters now.
refs #6152

diff --git src/hg/lib/variant.c src/hg/lib/variant.c
index 8cc7a52..1ba9f52 100644
--- src/hg/lib/variant.c
+++ src/hg/lib/variant.c
@@ -54,50 +54,52 @@
 /* add dashes at the end of a sequence to pad it out so it's length is count */
 {
 char *ret = needMem(count + 1);
 int inLen = strlen(input);
 
 safecpy(ret, count + 1, input);
 count -= inLen;
 
 char *ptr = &ret[inLen];
 while(count--)
     *ptr++ = '-';
 
 return ret;
 }
 
-struct variant *variantFromPgSnp(struct pgSnp *pgSnp)
-/* convert pgSnp record to variant record */
+struct variant *variantNew(char *chrom, unsigned start, unsigned end, unsigned numAlleles,
+			   char *slashSepAlleles, struct lm *lm)
+/* Create a variant from basic information that is easy to extract from most other variant
+ * formats: coords, allele count, and string of slash-separated alleles. */
 {
 struct variant *variant;
 
 // this is probably the wrong way to do this.  Alleles in
 // variant should be their size in query bases
-int alleleLength = pgSnp->chromEnd - pgSnp->chromStart;
+int alleleLength = end - start;
 
 // We have a new variant!
-AllocVar(variant);
-variant->chrom = cloneString(pgSnp->chrom);
-variant->chromStart = pgSnp->chromStart;
-variant->chromEnd = pgSnp->chromEnd;
-variant->numAlleles = pgSnp->alleleCount;
+lmAllocVar(lm, variant);
+variant->chrom = lmCloneString(lm, chrom);
+variant->chromStart = start;
+variant->chromEnd = end;
+variant->numAlleles = numAlleles;
 
 // get the alleles.
-char *nextAlleleString = cloneString(pgSnp->name);
+char *nextAlleleString = lmCloneString(lm, slashSepAlleles);
 int alleleNumber = 0;
-for( ; alleleNumber < pgSnp->alleleCount; alleleNumber++)
+for( ; alleleNumber < numAlleles; alleleNumber++)
     {
     if (nextAlleleString == NULL)
 	errAbort("number of alleles in pgSnp doesn't match number in name");
     
     char *thisAlleleString = nextAlleleString;
 
     // advance pointer to next variant string
     // probably there's some kent routine to do this behind the curtain
     nextAlleleString = strchr(thisAlleleString, '/');
     if (nextAlleleString)	 // null out '/' and move to next char
 	{
 	*nextAlleleString = 0;
 	nextAlleleString++;
 	}
 
@@ -112,23 +114,30 @@
 	{
 	if ( alleleStringLength < alleleLength)
 	    {
 	    thisAlleleString = addDashes(thisAlleleString, alleleLength);
 	    alleleStringLength = alleleLength;
 	    }
 	}
 
     // we have a new allele!
     struct allele *allele;
     AllocVar(allele);
     slAddHead(&variant->alleles, allele);
     allele->variant = variant;
     allele->length = alleleStringLength; 
     toLowerN(thisAlleleString, alleleStringLength);
-    allele->sequence = cloneString(thisAlleleString);
+    allele->sequence = lmCloneString(lm, thisAlleleString);
     }
 
 slReverse(&variant->alleles);
 
 return variant;
 }
 
+struct variant *variantFromPgSnp(struct pgSnp *pgSnp, struct lm *lm)
+/* convert pgSnp record to variant record */
+{
+return variantNew(pgSnp->chrom, pgSnp->chromStart, pgSnp->chromEnd, pgSnp->alleleCount,
+		  pgSnp->name, lm);
+}
+