AjBool ensIntronTrace(const EnsPIntron intron, ajuint level) { AjPStr indent = NULL; if(!intron) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensIntronTrace %p\n" "%S Feature %p\n" "%S PreviousExon %p\n" "%S NextExon %p\n" "%S Use %u\n", indent, intron, indent, intron->Feature, indent, intron->PreviousExon, indent, intron->NextExon, indent, intron->Use); ensFeatureTrace(intron->Feature, level + 1); ensExonTrace(intron->PreviousExon, level + 1); ensExonTrace(intron->NextExon, level + 1); ajStrDel(&indent); return ajTrue; }
AjBool ensProjectionsegmentTrace(const EnsPProjectionsegment ps, ajuint level) { AjPStr indent = NULL; if(!ps) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensProjectionsegmentTrace %p\n" "%S SrcStart %d\n" "%S SrcEnd %d\n" "%S TrgSlice %p\n" "%S Use %u\n", indent, ps, indent, ps->SrcStart, indent, ps->SrcEnd, indent, ps->TrgSlice, indent, ps->Use); ensSliceTrace(ps->TrgSlice, level + 1); ajStrDel(&indent); return ajTrue; }
AjBool ensGvdatabaseadaptorTrace(const EnsPGvdatabaseadaptor gvdba, ajuint level) { AjPStr indent = NULL; if (!gvdba) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensGvdatabaseadaptorTrace %p\n" "%S Databaseadaptor %p\n" "%S Failedvariations '%B'\n", indent, gvdba, indent, gvdba->Adaptor, indent, gvdba->Failedvariations); ensDatabaseadaptorTrace(gvdba->Adaptor, level + 1); ajStrDel(&indent); return ajTrue; }
AjBool ensKaryotypebandTrace(const EnsPKaryotypeband kb, ajuint level) { AjPStr indent = NULL; if(!kb) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensKaryotypebandTrace %p\n" "%S Adaptor %p\n" "%S Identifier %u\n" "%S Feature %p\n" "%S Name '%S'\n" "%S Stain '%S'\n", indent, kb, indent, kb->Adaptor, indent, kb->Identifier, indent, kb->Feature, indent, kb->Name, indent, kb->Stain); ensFeatureTrace(kb->Feature, 1); ajStrDel(&indent); return ajTrue; }
AjBool ensCacheTrace(const EnsPCache cache, ajuint level) { double ratio = 0.0; AjPStr indent = NULL; if(!cache) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); if(cache->Hit || cache->Miss) ratio = (double) cache->Hit / ((double) cache->Hit + (double) cache->Miss); ajDebug("%SensCache trace %p\n" "%S Label '%S'\n" "%S List %p length: %u\n" "%S Table %p length: %u\n" "%S Type %d\n" "%S Synchron %B\n" "%S MaxBytes %u\n" "%S MaxCount %u\n" "%S MaxSize %u\n" "%S Bytes %u\n" "%S Count %u\n" "%S Dropped %u\n" "%S Removed %u\n" "%S Stored %u\n" "%S Hit %u\n" "%S Miss %u\n" "%S Hit/(Hit + Miss) %f\n", indent, cache, indent, cache->Label, indent, cache->List, ajListGetLength(cache->List), indent, cache->Table, ajTableGetLength(cache->Table), indent, cache->Type, indent, cache->Synchron, indent, cache->MaxBytes, indent, cache->MaxCount, indent, cache->MaxSize, indent, cache->Bytes, indent, cache->Count, indent, cache->Dropped, indent, cache->Removed, indent, cache->Stored, indent, cache->Hit, indent, cache->Miss, indent, ratio); ajStrDel(&indent); return ajTrue; }
AjBool ensAssemblyexceptionTrace(const EnsPAssemblyexception ae, ajuint level) { AjPStr indent = NULL; if(!ae) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensAssemblyexceptionTrace %p\n" "%S Identifier %u\n" "%S SeqregionIdentifier %u\n" "%S SeqregionStart %u\n" "%S SeqregionEnd %u\n" "%S ExcSeqregionIdentifier %u\n" "%S ExcRegionStart %d\n" "%S ExcRegionEnd %u\n" "%S Orientation %d\n" "%S Type '%s'\n" "%S Use %u\n", indent, ae, indent, ae->Identifier, indent, ae->SeqregionIdentifier, indent, ae->SeqregionStart, indent, ae->SeqregionEnd, indent, ae->ExcRegionIdentifier, indent, ae->ExcRegionStart, indent, ae->ExcRegionEnd, indent, ensAssemblyexceptionTypeToChar(ae->Type), indent, ae->Orientation, indent, ae->Use); ajStrDel(&indent); return ajTrue; }
AjBool ensGvsynonymTrace(const EnsPGvsynonym gvs, ajuint level) { AjPStr indent = NULL; if (!gvs) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensGvsynonymTrace %p\n" "%S Use %u\n" "%S Identifier %u\n" "%S Adaptor %p\n" "%S Gvsource %p\n" "%S Name '%S'\n" "%S Moleculetype '%S'\n" "%S Gvvariationidentifier %u\n" "%S Subidentifier %u\n", indent, gvs, indent, gvs->Use, indent, gvs->Identifier, indent, gvs->Adaptor, indent, gvs->Gvsource, indent, gvs->Name, indent, gvs->Moleculetype, indent, gvs->Gvvariationidentifier, indent, gvs->Subidentifier); ensGvsourceTrace(gvs->Gvsource, level + 1); ajStrDel(&indent); return ajTrue; }
static void extractfeat_GetRegionPad(const AjPSeq seq, AjPStr *featstr, ajint start, ajint end, AjBool sense, AjBool beginning) { ajint tmp; ajint pad; AjPStr result; ajDebug("In extractfeat_GetRegionPad start=%d, end=%d\n", start, end); result = ajStrNew(); if(start > end) return; if(start < 0) { pad = -start; if(ajSeqIsNuc(seq)) ajStrAppendCountK(&result, 'N', pad); else ajStrAppendCountK(&result, 'X', pad); start = 0; } if(end > (ajint) ajSeqGetLen(seq)-1) tmp = ajSeqGetLen(seq)-1; else tmp = end; if(start <= (ajint) ajSeqGetLen(seq) && tmp >= 0) { ajDebug("Get subsequence %d-%d\n", start, tmp); ajStrAppendSubS(&result, ajSeqGetSeqS(seq), start, tmp); ajDebug("result=%S\n", result); } if(end > (ajint) ajSeqGetLen(seq)-1) { pad = end - ajSeqGetLen(seq)+1; if(ajSeqIsNuc(seq)) ajStrAppendCountK(&result, 'N', pad); else ajStrAppendCountK(&result, 'X', pad); ajDebug("result=%S\n", result); } /* if feature was in reverse sense, then get reverse complement */ if(!sense) { ajDebug("get reverse sense of subsequence\n"); ajSeqstrReverse(&result); ajDebug("result=%S\n", result); } if(beginning) { ajDebug("Prepend to featstr: %S\n", result); ajStrInsertS(featstr, 0, result); } else { ajDebug("Append to featstr: %S\n", result); ajStrAppendS(featstr, result); } ajDebug("featstr=%S\n", *featstr); ajStrDel(&result); return; }
AjBool ensSeqTrace(const AjPSeq seq, ajuint level) { AjPStr indent = NULL; if(!seq) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensSeqTrace %p\n" "%S Name '%S'\n" "%S Acc '%S'\n" "%S Sv '%S'\n" "%S Gi '%S'\n" "%S Tax '%S'\n" "%S Taxid '%S'\n" "%S Organelle '%S'\n" "%S Type '%S'\n" "%S Molecule '%S'\n" "%S Class '%S'\n" "%S Division '%S'\n" "%S Evidence '%S'\n" "%S Db '%S'\n" "%S Setdb '%S'\n" "%S Full '%S'\n" "%S Date %p\n" "%S Desc '%S'\n" "%S Fulldesc %p\n" "%S Doc '%S'\n" "%S Usa '%S'\n" "%S Ufo '%S'\n" "%S Formatstr '%S'\n" "%S Filename '%S'\n" "%S Entryname '%S'\n" "%S TextPtr '%S'\n" "%S Acclist %p\n" "%S Keylist %p\n" "%S Taxlist %p\n" "%S Genelist %p\n" "%S Reflist %p\n" "%S Cmtlist %p\n" "%S Xreflist %p\n" "%S Seq %p\n" "%S Fttable %p\n" "%S Accuracy %p\n" "%S Fpos %Lu\n" "%S Rev '%B'\n" "%S Reversed '%B'\n" "%S Trimmed '%B'\n" "%S Circular '%B'\n" "%S Begin %d\n" "%S End %d\n" "%S Offset %u\n" "%S Offend %u\n" "%S Qualsize %u\n" "%S Weight %f\n" "%S Format %d\n" "%S Etype %d\n", indent, seq, indent, seq->Name, indent, seq->Acc, indent, seq->Sv, indent, seq->Gi, indent, seq->Tax, indent, seq->Taxid, indent, seq->Organelle, indent, seq->Type, indent, seq->Molecule, indent, seq->Type, indent, seq->Division, indent, seq->Evidence, indent, seq->Db, indent, seq->Setdb, indent, seq->Full, indent, seq->Date, indent, seq->Desc, indent, seq->Fulldesc, indent, seq->Doc, indent, seq->Usa, indent, seq->Ufo, indent, seq->Formatstr, indent, seq->Filename, indent, seq->Entryname, indent, seq->TextPtr, indent, seq->Acclist, indent, seq->Keylist, indent, seq->Taxlist, indent, seq->Genelist, indent, seq->Reflist, indent, seq->Cmtlist, indent, seq->Xreflist, indent, seq->Seq, indent, seq->Fttable, indent, seq->Accuracy, indent, seq->Fpos, indent, seq->Rev, indent, seq->Reversed, indent, seq->Trimmed, indent, seq->Circular, indent, seq->Begin, indent, seq->End, indent, seq->Offset, indent, seq->Offend, indent, seq->Qualsize, indent, seq->Weight, indent, seq->Format, indent, seq->EType); ajStrDel(&indent); return ajTrue; }
AjBool ensSeqDescTrace(const AjPSeqDesc seqdesc, ajuint level) { AjIList iter = NULL; AjPStr indent = NULL; AjPStr value = NULL; if(!seqdesc) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensSeqDescTrace %p\n" "%S Name '%S'\n" "%S Short %p\n" "%S EC %p\n" "%S AltNames %p\n" "%S SubNames %p\n" "%S Includes %p\n" "%S Contains %p\n" "%S Precursor '%B'\n" "%S Fragments %u\n", indent, seqdesc, indent, seqdesc->Name, indent, seqdesc->Short, indent, seqdesc->EC, indent, seqdesc->AltNames, indent, seqdesc->SubNames, indent, seqdesc->Includes, indent, seqdesc->Contains, indent, seqdesc->Precursor, indent, seqdesc->Fragments); /* Trace the AJAX List of AJAX String short names. */ if(seqdesc->Short) { ajDebug("%S AJAX List of AJAX String short names:\n", indent); iter = ajListIterNew(seqdesc->Short); while(!ajListIterDone(iter)) { value = (AjPStr) ajListIterGet(iter); ajDebug("%S '%S'\n", indent, value); } ajListIterDel(&iter); } /* Trace the AJAX List of AJAX String EC numbers. */ if(seqdesc->EC) { ajDebug("%S AJAX List of AJAX String EC numbers:\n", indent); iter = ajListIterNew(seqdesc->EC); while(!ajListIterDone(iter)) { value = (AjPStr) ajListIterGet(iter); ajDebug("%S '%S'\n", indent, value); } ajListIterDel(&iter); } ajStrDel(&indent); return ajTrue; }
AjBool ensSeqQueryTrace(const AjPSeqQuery seqquery, ajuint level) { AjPStr indent = NULL; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensSeqQueryTrace %p\n" "%S DbName '%S'\n" "%S DbAlias '%S'\n" "%S DbType '%S'\n" "%S Id '%S'\n" "%S Acc '%S'\n" "%S Des '%S'\n" "%S Key '%S'\n" "%S Org '%S'\n" "%S Sv '%S'\n" "%S Gi '%S'\n" "%S CaseId '%B'\n" "%S HasAcc '%B'\n" "%S Method '%S'\n" "%S Formatstr '%S'\n" "%S IndexDir '%S'\n" "%S Directory '%S'\n" "%S Filename '%S'\n" "%S Exclude '%S'\n" "%S DbFields '%S'\n" "%S DbFilter '%S'\n" "%S DbProxy '%S'\n" "%S DbHttpVer '%S'\n" "%S DbIdentifier '%S'\n" "%S DbAccession '%S'\n" "%S DbSequence '%S'\n" "%S DbReturn '%S'\n" "%S Field '%S'\n" "%S QryString '%S'\n" "%S Application '%S'\n" "%S Fpos %Ld\n" "%S Type %d\n" "%S QryDone '%B'\n" "%S Access %p\n" "%S QryData %p\n" "%S Wild '%B'\n", indent, seqquery, indent, seqquery->DbName, indent, seqquery->DbAlias, indent, seqquery->DbType, indent, seqquery->Id, indent, seqquery->Acc, indent, seqquery->Des, indent, seqquery->Key, indent, seqquery->Org, indent, seqquery->Sv, indent, seqquery->Gi, indent, seqquery->CaseId, indent, seqquery->HasAcc, indent, seqquery->Method, indent, seqquery->Formatstr, indent, seqquery->IndexDir, indent, seqquery->Directory, indent, seqquery->Filename, indent, seqquery->Exclude, indent, seqquery->DbFields, indent, seqquery->DbFilter, indent, seqquery->DbProxy, indent, seqquery->DbHttpVer, indent, seqquery->DbIdentifier, indent, seqquery->DbAccession, indent, seqquery->DbSequence, indent, seqquery->DbReturn, indent, seqquery->Field, indent, seqquery->QryString, indent, seqquery->Application, indent, seqquery->Fpos, indent, seqquery->Type, indent, seqquery->QryDone, indent, seqquery->Access, indent, seqquery->QryData, indent, seqquery->Wild); ajStrDel(&indent); return ajTrue; }
AjBool ensSeqinTrace(const AjPSeqin seqin, ajuint level) { AjPStr indent = NULL; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensSeqinTrace %p\n" "%S Name '%S'\n" "%S Acc '%S'\n" "%S Inputtype '%S'\n" "%S Type '%S'\n" "%S Db '%S'\n" "%S Full '%S'\n" "%S Date '%S'\n" "%S Desc '%S'\n" "%S Doc '%S'\n" "%S Inseq '%S'\n" "%S Begin %d\n" "%S End %d\n" "%S List %p\n" "%S Usa '%S'\n" "%S Ufo '%S'\n" "%S Fttable %p\n" "%S Ftquery %p\n" "%S Formatstr '%S'\n" "%S Filename '%S'\n" "%S Entryname '%S'\n" "%S Filebuff %p\n" "%S Search '%B'\n" "%S Single '%B'\n" "%S CaseId '%B'\n" "%S Features '%B'\n" "%S IsNuc '%B'\n" "%S IsProt '%B'\n" "%S multi '%B'\n" "%S multiset '%B'\n" "%S multidone '%B'\n" "%S Lower '%B'\n" "%S Upper '%B'\n" "%S Text '%B'\n" "%S Count %d\n" "%S Filecount %d\n" "%S Fileseqs %d\n" "%S Rev '%B'\n" "%S Fpos %Ld\n" "%S Query %p\n" "%S Data %p\n" "%S Format %d\n" "%S Records %u\n", indent, seqin, indent, seqin->Name, indent, seqin->Acc, indent, seqin->Inputtype, indent, seqin->Type, indent, seqin->Db, indent, seqin->Full, indent, seqin->Date, indent, seqin->Desc, indent, seqin->Doc, indent, seqin->Inseq, indent, seqin->Begin, indent, seqin->End, indent, seqin->List, indent, seqin->Usa, indent, seqin->Ufo, indent, seqin->Fttable, indent, seqin->Ftquery, indent, seqin->Formatstr, indent, seqin->Filename, indent, seqin->Entryname, indent, seqin->Filebuff, indent, seqin->Search, indent, seqin->Single, indent, seqin->CaseId, indent, seqin->Features, indent, seqin->IsNuc, indent, seqin->IsProt, indent, seqin->multi, indent, seqin->multiset, indent, seqin->multidone, indent, seqin->Lower, indent, seqin->Upper, indent, seqin->Text, indent, seqin->Count, indent, seqin->Filecount, indent, seqin->Fileseqs, indent, seqin->Rev, indent, seqin->Fpos, indent, seqin->Query, indent, seqin->Data, indent, seqin->Format, indent, seqin->Records); ajStrDel(&indent); ensSeqQueryTrace(seqin->Query, level + 1); return ajTrue; }
int main(int argc, char **argv) { AjPSeqset seqset; AjPSeqall seqall; AjPSeq queryseq; const AjPSeq targetseq; ajint wordlen; AjPTable wordsTable = NULL; AjPList* matchlist = NULL; AjPFile logfile; AjPFeattable* seqsetftables = NULL; AjPFeattable seqallseqftable = NULL; AjPFeattabOut ftoutforseqsetseq = NULL; AjPFeattabOut ftoutforseqallseq = NULL; AjPAlign align = NULL; AjIList iter = NULL; ajint targetstart; ajint querystart; ajint len; ajuint i, j; ajulong nAllMatches = 0; ajulong sumAllScore = 0; AjBool dumpAlign = ajTrue; AjBool dumpFeature = ajTrue; AjBool checkmode = ajFalse; EmbPWordRK* wordsw = NULL; ajuint npatterns = 0; ajuint seqsetsize; ajuint nmatches; ajuint* nmatchesseqset; ajuint* lastlocation; /* Cursors for Rabin-Karp search. */ /* Shows until what point the query sequence was * scanned for a pattern sequences in the seqset. */ char* paddedheader = NULL; const char* header; AjPStr padding; header = "Pattern %S #pat-sequences #all-matches avg-match-length\n"; padding = ajStrNew(); embInit("wordmatch", argc, argv); wordlen = ajAcdGetInt("wordsize"); seqset = ajAcdGetSeqset("asequence"); seqall = ajAcdGetSeqall("bsequence"); logfile = ajAcdGetOutfile("logfile"); dumpAlign = ajAcdGetToggle("dumpalign"); dumpFeature = ajAcdGetToggle("dumpfeat"); if(dumpAlign) { align = ajAcdGetAlign("outfile"); ajAlignSetExternal(align, ajTrue); } seqsetsize = ajSeqsetGetSize(seqset); ajSeqsetTrim(seqset); AJCNEW0(matchlist, seqsetsize); AJCNEW0(seqsetftables, seqsetsize); AJCNEW0(nmatchesseqset, seqsetsize); if (dumpFeature) { ftoutforseqsetseq = ajAcdGetFeatout("aoutfeat"); ftoutforseqallseq = ajAcdGetFeatout("boutfeat"); } checkmode = !dumpFeature && !dumpAlign; embWordLength(wordlen); ajFmtPrintF(logfile, "Small sequence/file for constructing" " target patterns: %S\n", ajSeqsetGetUsa(seqset)); ajFmtPrintF(logfile, "Large sequence/file to be scanned" " for patterns: %S\n", ajSeqallGetUsa(seqall)); ajFmtPrintF(logfile, "Number of sequences in the patterns file: %u\n", seqsetsize); ajFmtPrintF(logfile, "Pattern/word length: %u\n", wordlen); for(i=0;i<seqsetsize;i++) { targetseq = ajSeqsetGetseqSeq(seqset, i); embWordGetTable(&wordsTable, targetseq); } AJCNEW0(lastlocation, seqsetsize); if(ajTableGetLength(wordsTable)>0) { npatterns = embWordRabinKarpInit(wordsTable, &wordsw, wordlen, seqset); ajFmtPrintF(logfile, "Number of patterns/words found: %u\n", npatterns); while(ajSeqallNext(seqall,&queryseq)) { for(i=0;i<seqsetsize;i++) { lastlocation[i]=0; if (!checkmode) matchlist[i] = ajListstrNew(); } nmatches = embWordRabinKarpSearch( ajSeqGetSeqS(queryseq), seqset, (EmbPWordRK const *)wordsw, wordlen, npatterns, matchlist, lastlocation, checkmode); nAllMatches += nmatches; if (checkmode) continue; for(i=0;i<seqsetsize;i++) { if(ajListGetLength(matchlist[i])>0) { iter = ajListIterNewread(matchlist[i]) ; while(embWordMatchIter(iter, &targetstart, &querystart, &len, &targetseq)) { if(dumpAlign) { ajAlignDefineSS(align, targetseq, queryseq); ajAlignSetScoreI(align, len); /* ungapped alignment means same length * for both sequences */ ajAlignSetSubRange(align, targetstart, 1, len, ajSeqIsReversed(targetseq), ajSeqGetLen(targetseq), querystart, 1, len, ajSeqIsReversed(queryseq), ajSeqGetLen(queryseq)); } } if(dumpAlign) { ajAlignWrite(align); ajAlignReset(align); } if(ajListGetLength(matchlist[i])>0 && dumpFeature) { embWordMatchListConvToFeat(matchlist[i], &seqsetftables[i], &seqallseqftable, targetseq, queryseq); ajFeattableWrite(ftoutforseqallseq, seqallseqftable); ajFeattableDel(&seqallseqftable); } ajListIterDel(&iter); } embWordMatchListDelete(&matchlist[i]); } } /* search completed, now report statistics */ for(i=0;i<npatterns;i++) { sumAllScore += wordsw[i]->lenMatches; for(j=0;j<wordsw[i]->nseqs;j++) nmatchesseqset[wordsw[i]->seqindxs[j]] += wordsw[i]->nSeqMatches[j]; } ajFmtPrintF(logfile, "Number of sequences in the file scanned " "for patterns: %u\n", ajSeqallGetCount(seqall)); ajFmtPrintF(logfile, "Number of all matches: %Lu" " (wordmatch finds exact matches only)\n", nAllMatches); if(nAllMatches>0) { ajFmtPrintF(logfile, "Sum of match lengths: %Lu\n", sumAllScore); ajFmtPrintF(logfile, "Average match length: %.2f\n", sumAllScore*1.0/nAllMatches); ajFmtPrintF(logfile, "\nDistribution of the matches among pattern" " sequences:\n"); ajFmtPrintF(logfile, "-----------------------------------------" "-----------\n"); for(i=0;i<ajSeqsetGetSize(seqset);i++) { if (nmatchesseqset[i]>0) ajFmtPrintF(logfile, "%-42s: %8u\n", ajSeqGetNameC(ajSeqsetGetseqSeq(seqset, i)), nmatchesseqset[i]); ajFeattableWrite(ftoutforseqsetseq, seqsetftables[i]); ajFeattableDel(&seqsetftables[i]); } ajFmtPrintF(logfile, "\nPattern statistics:\n"); ajFmtPrintF(logfile, "-------------------\n"); if(wordlen>7) ajStrAppendCountK(&padding, ' ', wordlen-7); paddedheader = ajFmtString(header,padding); ajFmtPrintF(logfile, paddedheader); for(i=0;i<npatterns;i++) if (wordsw[i]->nMatches>0) ajFmtPrintF(logfile, "%-7s: %12u %12u %17.2f\n", wordsw[i]->word->fword, wordsw[i]->nseqs, wordsw[i]->nMatches, wordsw[i]->lenMatches*1.0/wordsw[i]->nMatches); } } for(i=0;i<npatterns;i++) { for(j=0;j<wordsw[i]->nseqs;j++) AJFREE(wordsw[i]->locs[j]); AJFREE(wordsw[i]->locs); AJFREE(wordsw[i]->seqindxs); AJFREE(wordsw[i]->nnseqlocs); AJFREE(wordsw[i]->nSeqMatches); AJFREE(wordsw[i]); } embWordFreeTable(&wordsTable); AJFREE(wordsw); AJFREE(matchlist); AJFREE(lastlocation); AJFREE(nmatchesseqset); AJFREE(seqsetftables); if(dumpAlign) { ajAlignClose(align); ajAlignDel(&align); } if(dumpFeature) { ajFeattabOutDel(&ftoutforseqsetseq); ajFeattabOutDel(&ftoutforseqallseq); } ajFileClose(&logfile); ajSeqallDel(&seqall); ajSeqsetDel(&seqset); ajSeqDel(&queryseq); ajStrDel(&padding); AJFREE(paddedheader); embExit(); return 0; }