EventTree *eventTree_construct(CactusDisk *cactusDisk, Name rootEventName) { EventTree *eventTree; eventTree = st_malloc(sizeof(EventTree)); eventTree->cactusDisk = cactusDisk; cactusDisk_setEventTree(cactusDisk, eventTree); eventTree->events = stSortedSet_construct3(eventTree_constructP, NULL); eventTree->rootEvent = event_construct(rootEventName, "ROOT", INT64_MAX, NULL, eventTree); //do this last as reciprocal call made to add the event to the events. return eventTree; }
void eventTree_copyConstructP(EventTree *eventTree, Event *event, int64_t (unaryEventFilterFn)(Event *event)) { int64_t i; Event *event2; for(i=0; i<event_getChildNumber(event); i++) { event2 = event_getChild(event, i); while(event_getChildNumber(event2) == 1 && unaryEventFilterFn != NULL && !unaryEventFilterFn(event2)) { //skip the event event2 = event_getChild(event2, 0); } event_setOutgroupStatus(event_construct(event_getName(event2), event_getHeader(event2), event_getBranchLength(event2), eventTree_getEvent(eventTree, event_getName(event)), eventTree), event_isOutgroup(event2)); eventTree_copyConstructP(eventTree, event2, unaryEventFilterFn); } }
Event *event_construct2(Name name, const char *header, float branchLength, Event *parentEvent, Event *childEvent, EventTree *eventTree) { Event *event; event = event_construct(name, header, branchLength, parentEvent, eventTree); #ifndef NDEBUG assert(parentEvent != NULL); assert(childEvent != NULL); assert(listContains(parentEvent->children, childEvent)); #endif listRemove(parentEvent->children, childEvent); listAppend(event->children, childEvent); childEvent->parent = event; childEvent->branchLength = childEvent->branchLength - event->branchLength; if (childEvent->branchLength < 0.0) { childEvent->branchLength = 0.0; } return event; }
Event *event_loadFromBinaryRepresentation(void **binaryString, EventTree *eventTree) { Event *event, *parentEvent; Name name; float branchLength; char *header; event = NULL; if (binaryRepresentation_peekNextElementType(*binaryString) == CODE_EVENT) { binaryRepresentation_popNextElementType(binaryString); parentEvent = eventTree_getEvent(eventTree, binaryRepresentation_getName(binaryString)); assert(parentEvent != NULL); name = binaryRepresentation_getName(binaryString); branchLength = binaryRepresentation_getFloat(binaryString); header = binaryRepresentation_getString(binaryString); event = event_construct(name, header, branchLength, parentEvent, eventTree); event_setOutgroupStatus(event, binaryRepresentation_getBool(binaryString)); free(header); } return event; }
Event *event_construct3(const char *header, float branchLength, Event *parentEvent, EventTree *eventTree) { return event_construct(cactusDisk_getUniqueID(flower_getCactusDisk( eventTree_getFlower(eventTree))), header, branchLength, parentEvent, eventTree); }