Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}
Exemple #7
0
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;
}
Exemple #8
0
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;
}
Exemple #9
0
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;
}
Exemple #10
0
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;
}
Exemple #11
0
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;
}
Exemple #12
0
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;
}