src/hg/overlapSelect/chromAnnMap.c 1.2

1.2 2009/07/31 18:09:23 markd
added rcsids
Index: src/hg/overlapSelect/chromAnnMap.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/overlapSelect/chromAnnMap.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -b -B -U 1000000 -r1.1 -r1.2
--- src/hg/overlapSelect/chromAnnMap.c	12 Aug 2008 01:04:34 -0000	1.1
+++ src/hg/overlapSelect/chromAnnMap.c	31 Jul 2009 18:09:23 -0000	1.2
@@ -1,103 +1,105 @@
 /* Object the maps ranges to chromAnn objects */
 #include "common.h"
 #include "chromAnnMap.h"
 #include "chromAnn.h"
 #include "genomeRangeTree.h"
 
+static char const rcsid[] = "$Id$";
+
 struct chromAnnMap
 /* Object the maps ranges to chromAnn objects */
 {
     struct genomeRangeTree* ranges; // values are lists of chromAnn object
 };
 
 struct chromAnnMap *chromAnnMapNew()
 /* construct a new object */
 {
 struct chromAnnMap *cam;
 AllocVar(cam);
 cam->ranges = genomeRangeTreeNew();
 return cam;
 }
 
 void chromAnnMapAdd(struct chromAnnMap *cam,
                     struct chromAnn *ca)
 /* add a record to the table. */
 {
 /* don't add if zero-length, they can't select */
 if (ca->start < ca->end)
     genomeRangeTreeAddValList(cam->ranges, ca->chrom, ca->start, ca->end, ca);
 else
     chromAnnFree(&ca);
 }
 
 struct chromAnnRef *chromAnnMapFindOverlap(struct chromAnnMap *cam,
                                            struct chromAnn *ca)
 /* get list of overlaps to ca */
 {
 struct range *or, *overs
     = genomeRangeTreeAllOverlapping(cam->ranges, ca->chrom, ca->start, ca->end);
 struct chromAnnRef *overlaps = NULL;
 for (or = overs; or != NULL; or = or->next)
     {
     struct chromAnn *ca;
     for (ca = or->val; ca != NULL; ca = ca->next)
         chromAnnRefAdd(&overlaps, ca);
     }
 return overlaps;
 }
 
 struct chromAnnMapIter chromAnnMapFirst(struct chromAnnMap *cam)
 /* get iterator over a chromAnnMap */
 {
 struct chromAnnMapIter iter;
 ZeroVar(&iter);
 iter.cam = cam;
 iter.chromCookie = hashFirst(cam->ranges->hash);
 return iter;
 }
 
 struct chromAnn *chromAnnMapIterNext(struct chromAnnMapIter *iter)
 /* next element in select table */
 {
 if (iter->currentCa == NULL)
     {
     // no more chromAnns in this range
     if (iter->currentRange == NULL)
         {
         // no more ranges on this chrom
         struct hashEl *chromEl = hashNext(&iter->chromCookie);
         if (chromEl == NULL)
             return NULL;  // no more chroms
         iter->currentRange = genomeRangeTreeList(iter->cam->ranges, chromEl->name);
         }
     iter->currentCa = iter->currentRange->val;
     iter->currentRange = iter->currentRange->next;
     }
 struct chromAnn *ca = iter->currentCa;
 iter->currentCa = iter->currentCa->next;
 return ca;
 }
 
 void chromAnnMapFree(struct chromAnnMap **camPtr)
 /* free chromAnnMap structures. */
 {
 struct chromAnnMap *cam = *camPtr;
 if (cam != NULL)
     {
     struct hashCookie chromCookie = hashFirst(cam->ranges->hash);
     struct hashEl *chromEl;
     for (chromEl = hashNext(&chromCookie); chromEl != NULL; chromEl = chromEl->next)
         {
         struct range *r, *ranges = genomeRangeTreeList(cam->ranges, chromEl->name);
         for (r = ranges; r != NULL; r = r->next)
             {
             struct chromAnn *ca, *cas = r->val;
             while ((ca = slPopHead(&cas)) != NULL)
                 chromAnnFree(&ca);
             }
         }
     freez(camPtr);
     }
 }