4a30449df90693f80750c79f16225a0000b9fa4c kent Tue Mar 26 22:48:30 2013 -0700 Added test case. diff --git src/inc/meta.h src/inc/meta.h new file mode 100644 index 0000000..2861bd7 --- /dev/null +++ src/inc/meta.h @@ -0,0 +1,76 @@ +/* metaRa - stuff to parse and interpret a genome-hub meta.txt file, which is in + * a hierarchical ra format. That is something like: + * meta topLevel + * cellLine HELA + * + * meta midLevel + * target H3K4Me3 + * antibody abCamAntiH3k4me3 + * + * meta lowLevel + * fileName hg19/chipSeq/helaH3k4me3.narrowPeak.bigBed + * The file is interpreted so that lower level stanzas inherit tags from higher level ones. + */ + +#ifndef META_H +#define META_H + +struct metaTagVal +/* A tag/value pair. */ + { + struct metaTagVal *next; /* Next in list. */ + char *tag; /* Tag name. */ + char *val; /* Tag value. */ + }; + +struct metaTagVal *metaTagValNew(char *tag, char *val); +/* Create new meta tag/val */ + +int metaTagValCmp(const void *va, const void *vb); +/* Compare to sort based on tag name . */ + +struct meta +/* A node in the metadata tree */ + { + struct meta *next; /* Pointer to next younger sibling. */ + struct meta *children; /* Pointer to eldest child. */ + struct meta *parent; /* Pointer to parent. */ + char *name; /* Same as val of meta tag. Not allocated here. */ + struct metaTagVal *tagList; /* All tags, including the "meta" one. */ + int indent; /* Indentation level. */ + }; + +struct meta *metaLoadAll(char *fileName, char *keyTag, char *parentTag, + boolean ignoreOtherStanzas, boolean ignoreIndent); +/* Loads in all ra stanzas from file and turns them into a list of meta, some of which + * may have children. The keyTag parameter is optional. If non-null it should be set to + * the tag name that starts a stanza. If null, the first tag of the first stanza will be used. + * The parentTag if non-NULL will be a tag name used to define the parent of a stanza. + * The ignoreOtherStanzas flag if set will ignore stanzas that start with other tags. + * If not set the routine will abort on such stanzas. The ignoreIndent if set will + * use the parentTag (which must be set) to define the hierarchy. Otherwise the program + * will look at the indentation, and if there is a parentTag complain about any + * disagreements between indentation and parentTag. */ + +void metaWriteAll(struct meta *metaList, char *fileName, int indent, boolean withParent); +/* Write out metadata, including children, optionally adding meta tag. By convention + * for out meta.txt/meta.ra files, indent is 3, withParent is FALSE. */ + +char *metaLocalTagVal(struct meta *meta, char *tag); +/* Return value of tag found in this node, not going up to parents. */ + +char *metaTagVal(struct meta *meta, char *tag); +/* Return value of tag found in this node or if its not there in parents. + * Returns NULL if tag not found. */ + +void metaAddTag(struct meta *meta, char *tag, char *val); +/* Return value of tag found in this node, not going up to parents. */ + +void metaSortTags(struct meta *meta); +/* Do canonical sort so that the first tag stays first but the + * rest are alphabetical. */ + +struct hash *metaHash(struct meta *forest); +/* Return hash of meta at all levels of heirarchy keyed by forest. */ + +#endif /* META_H */