static void moveMeToFirst(struct mafAli *maf, char *myName) /* Find component matching myName, and move it to first. */ { struct mafComp *comp = mafMayFindCompPrefix(maf, myName, "."); if (NULL == comp) comp = mafFindCompPrefix(maf, myName, NULL); slRemoveEl(&maf->components, comp); slAddHead(&maf->components, comp); }
struct mafComp *mafFindCompPrefix(struct mafAli *maf, char *pre, char *sep) /* Find component of given source that starts with pre followed by sep or die trying. */ { struct mafComp *mc = mafMayFindCompPrefix(maf, pre, sep); if (mc == NULL) errAbort("Couldn't find %s%s... in maf", pre,sep); return mc; }
struct mafComp *mafMaster(struct mafAli *maf, struct mafFile *mf, char *fileName) /* Get master component from maf. Error abort if no master component */ { struct mafComp *mcMaster = mafMayFindCompPrefix(maf, database, "."); if (mcMaster == NULL) { errAbort("Couldn't find %s. sequence line %d of %s\n", database, mf->lf->lineIx, fileName); } return mcMaster; }
void fillHoles(struct mafAli *mafList, struct subSpecies *speciesList, struct twoBitFile *twoBit) { int lastEnd = 100000000; struct mafAli *prevMaf = NULL, *maf, *nextMaf; struct subSpecies *species; /* for(species = speciesList; species; species = species->next) { blockStatus = &species->blockStatus; blockStatus->mc->rightStatus = MAF_NEW_STATUS; blockStatus->mc->rightLen = 0; } */ for(maf = mafList; maf ; prevMaf = maf, maf = nextMaf) { struct mafComp *mc = NULL, *masterMc, *lastMc = NULL; struct mafAli *newMaf = NULL; struct blockStatus *blockStatus; nextMaf = maf->next; masterMc=maf->components; if (masterMc->start > lastEnd) { struct subSpecies *species; for(species = speciesList; species; species = species->next) { mc = NULL; // printf("looking at %s\n",species->name); blockStatus = &species->blockStatus; if (blockStatus->mc) { // printf("should match at %s\n",blockStatus->mc->src); switch (blockStatus->mc->rightStatus) { case MAF_MISSING_STATUS: //printf("missing right\n"); case MAF_NEW_NESTED_STATUS: case MAF_MAYBE_NEW_NESTED_STATUS: case MAF_CONTIG_STATUS: case MAF_TANDEM_STATUS: case MAF_INSERT_STATUS: AllocVar(mc); mc->rightStatus = mc->leftStatus = blockStatus->mc->rightStatus; mc->rightLen = mc->leftLen = blockStatus->mc->rightLen; mc->src = blockStatus->mc->src; mc->srcSize = blockStatus->mc->srcSize; mc->strand = blockStatus->mc->strand; mc->start = blockStatus->mc->start + blockStatus->mc->size; if (lastMc == NULL) { struct mafComp *miniMasterMc = NULL; char *seqName; struct dnaSeq *seq; AllocVar(miniMasterMc); miniMasterMc->next = mc; miniMasterMc->strand = '+'; miniMasterMc->srcSize = masterMc->srcSize; miniMasterMc->src = masterMc->src; miniMasterMc->start = lastEnd; miniMasterMc->size = masterMc->start - lastEnd; if ((seqName = strchr(miniMasterMc->src, '.')) != NULL) seqName++; else seqName = miniMasterMc->src; // printf("hole filled from %d to %d\n",lastEnd, masterMc->start); seq = twoBitReadSeqFrag(twoBit, seqName, lastEnd, masterMc->start); miniMasterMc->text = seq->dna; AllocVar(newMaf); newMaf->textSize = maf->textSize; newMaf->components = miniMasterMc; newMaf->next = maf; if (prevMaf) prevMaf->next = newMaf; else mafList = newMaf; //masterMc = miniMasterMc; } else { lastMc->next = mc; } lastMc = mc; if (blockStatus->mc->rightStatus == MAF_MISSING_STATUS) { if (addN) { char buffer[256]; safef(buffer, sizeof(buffer), "%s.N",species->name); mc->src = cloneString(buffer); mc->start = 0; mc->srcSize = 200000; mc->size = masterMc->start - lastEnd; mc->text = needMem(mc->size + 1); memset(mc->text, 'N', mc->size); } } else { if (addDash) { mc->size = masterMc->size; mc->srcSize = blockStatus->mc->srcSize; mc->text = needMem(mc->size + 1); memset(mc->text, '-', mc->size); mc->text[mc->size] = 0; if (mc->size == 0) errAbort("bad dash add"); mc->size = 0; } } break; } } } } lastEnd = masterMc->start + masterMc->size; for(lastMc = masterMc; lastMc->next; lastMc = lastMc->next) ; for(species = speciesList; species; species = species->next) { blockStatus = &species->blockStatus; mc = NULL; if ((blockStatus->masterStart <= masterMc->start) && (blockStatus->masterEnd > masterMc->start) && ((mc = mafMayFindCompPrefix(maf, species->name,NULL)) == NULL)) { if (blockStatus->mc != NULL) { switch (blockStatus->mc->rightStatus) { case MAF_MISSING_STATUS: case MAF_CONTIG_STATUS: case MAF_TANDEM_STATUS: case MAF_INSERT_STATUS: case MAF_NEW_NESTED_STATUS: case MAF_MAYBE_NEW_NESTED_STATUS: AllocVar(mc); mc->rightStatus = mc->leftStatus = blockStatus->mc->rightStatus; if (mc->rightStatus == MAF_NEW_NESTED_STATUS) mc->rightStatus = MAF_INSERT_STATUS; if (mc->leftStatus == MAF_NEW_NESTED_STATUS) mc->leftStatus = MAF_INSERT_STATUS; mc->rightLen = mc->leftLen = blockStatus->mc->rightLen; mc->src = blockStatus->mc->src; mc->strand = blockStatus->mc->strand; mc->srcSize = blockStatus->mc->srcSize; mc->start = blockStatus->mc->start + blockStatus->mc->size ; lastMc->next = mc; lastMc = mc; if (addN && (blockStatus->mc->rightStatus == MAF_MISSING_STATUS)) { char buffer[256]; safef(buffer, sizeof(buffer), "%s.N",species->name); mc->src = cloneString(buffer); mc->start = 0; mc->srcSize = 200000; mc->size = maf->textSize; mc->text = needMem(mc->size + 1); memset(mc->text, 'N', mc->size); } else if (addDash) { mc->size = masterMc->size; mc->text = needMem(mc->size + 1); if (mc->size == 0) errAbort("bad dash add"); memset(mc->text, '-', mc->size); mc->text[mc->size] = 0; mc->size = 0; } break; default: break; } } } if (mc) { blockStatus->mc = mc; } } } }
void bridgeSpecies(struct mafAli *mafList, struct subSpecies *subSpecies) { struct mafAli *maf; int pushState, leftLen; struct mafComp *masterMc, *mc, *prevMc; prevMc = mc = NULL; for(; subSpecies; subSpecies = subSpecies->next) { //printf("bridging %s\n",subSpecies->name); pushState = 0; leftLen = 0; for(maf = mafList; maf ; maf = maf->next) { masterMc = maf->components; prevMc = mc; if ((mc = mafMayFindCompPrefix(maf, subSpecies->name,NULL)) == NULL) { continue; } if (mc->leftStatus == 0) errAbort("zero left status %s:%d\n",mc->src, mc->start); #ifdef NOTNOW if (pushState && (mc->leftStatus == MAF_INSERT_STATUS)) { if (prevMc && !((prevMc->rightStatus == mc->leftStatus) && (prevMc->rightLen == mc->leftLen))) { printf("boo\n"); mc->leftStatus = MAF_NEW_NESTED_STATUS; mc->leftLen = 0; } } #endif if (mc->leftStatus == MAF_NEW_STATUS) { if (pushState) { //printf("bridged on %s: %s:%d-%d\n",mc->src,"chr22",masterMc->start, masterMc->start + masterMc->size); mc->leftStatus = MAF_NEW_NESTED_STATUS; mc->leftLen = leftLen; } pushState++; } if (mc->rightStatus == 0) { errAbort("zero right status\n"); } else if (isContigOrTandem(mc->rightStatus) || (mc->rightStatus == MAF_INSERT_STATUS)) leftLen = mc->rightLen; else if (mc->rightStatus == MAF_NEW_STATUS) { pushState--; if (pushState) { //printf("arched on %s: %s:%d-%d\n",mc->src,"chr22",masterMc->start, masterMc->start + masterMc->size); mc->rightStatus = MAF_NEW_NESTED_STATUS; mc->rightLen = leftLen; } } } //printf("pushState %d\n",pushState); } }