Example #1
0
void writeCharactersBlockToStream(
    const NxsCharactersBlock & cb,
    ostream & outf,
    const std::vector<std::string> & taxaNames,
    MultiFormatReader::DataFormatType f,
    long interleaveLen)
{
    const unsigned nt = taxaNames.size();
    const unsigned nc = cb.GetNChar();
    unsigned nCharsToWrite;
    unsigned seqStartColumn = 0;

    if (IsRelaxedPhylipType(f))
    {
        for (unsigned i = 0; i < nt; ++i)
        {
            const std::string & name = taxaNames[i];
            if (name.length() > seqStartColumn)
                seqStartColumn = name.length();
        }
        seqStartColumn += 1;
    }


    if (IsPhylipType(f) || IsRelaxedPhylipType(f))
    {
        std::string sep;

        outf << nt << ' ' << nc << '\n';

        if (IsInterleaveType(f) && interleaveLen > 0)
        {
            std::vector<std::string> storedSeqs;
            storedSeqs.reserve(nt);
            std::string *sp;
            nCharsToWrite = (nc > (unsigned) interleaveLen ? (unsigned)interleaveLen : nc);
            for (unsigned i = 0; i < nt; ++i)
            {
                const std::string & name = taxaNames[i];
                storedSeqs.push_back(cb.GetMatrixRowAsStr(i));
                sp = &(storedSeqs[i]);
                if (IsRelaxedPhylipType(f))
                {
                    sep.clear();
                    sep.append(seqStartColumn - name.length(), ' ');
                }
                outf << name << sep << sp->substr(0, nCharsToWrite) << '\n';
            }

            for (unsigned currIndex = (unsigned)interleaveLen; currIndex < nc; currIndex += (unsigned)interleaveLen)
            {
                outf << '\n';
                nCharsToWrite = ((nc - currIndex) > (unsigned)interleaveLen ? (unsigned)interleaveLen : (nc - currIndex));
                for (unsigned i = 0; i < nt; ++i)
                {
                    sp = &(storedSeqs[i]);
                    outf << sp->substr(currIndex, nCharsToWrite) << '\n';
                }
            }
        }
        else
        {
            if (interleaveLen > 0)
            {
                // not interleaved, but wrapping at interleaveLen
                for (unsigned i = 0; i < nt; ++i)
                {
                    nCharsToWrite = (nc > (unsigned)interleaveLen ? (unsigned)interleaveLen : nc);
                    const std::string & name = taxaNames[i];
                    std::string seq = cb.GetMatrixRowAsStr(i);
                    if (IsRelaxedPhylipType(f))
                    {
                        sep.clear();
                        sep.append(seqStartColumn - name.length(), ' ');
                    }
                    outf << name << sep << seq.substr(0, nCharsToWrite) << '\n';
                    for (unsigned currIndex = (unsigned)interleaveLen; currIndex < nc; currIndex += (unsigned)interleaveLen)
                    {
                        nCharsToWrite = ((nc - currIndex) > (unsigned)interleaveLen ? (unsigned)interleaveLen : (nc - currIndex));
                        outf << seq.substr(currIndex, nCharsToWrite) << '\n';
                    }
                }
            }
            else
            {
                // not interleaved, and not wrapping
                for (unsigned i = 0; i < nt; ++i)
                {
                    const std::string & name = taxaNames[i];
                    std::string seq = cb.GetMatrixRowAsStr(i);
                    if (IsRelaxedPhylipType(f))
                    {
                        sep.clear();
                        sep.append(seqStartColumn - name.length(), ' ');
                    }
                    outf << name << sep << seq << '\n';
                }
            }
        }
    }
    else if (IsFastaType(f))
    {
        if (interleaveLen < 1)
            interleaveLen = 60; // default FASTA line length
        for (unsigned i = 0; i < nt; ++i)
        {
            nCharsToWrite = (nc > (unsigned)interleaveLen ? (unsigned)interleaveLen : nc);
            const std::string & name = taxaNames[i];
            std::string seq = cb.GetMatrixRowAsStr(i);
            outf << '>' << name << '\n' << seq.substr(0, nCharsToWrite) << '\n';
            for (unsigned currIndex = (unsigned)interleaveLen; currIndex < nc; currIndex += (unsigned)interleaveLen)
            {
                nCharsToWrite = ((nc - currIndex) > (unsigned)interleaveLen ? (unsigned)interleaveLen : (nc - currIndex));
                outf << seq.substr(currIndex, nCharsToWrite) << '\n';
            }
        }
    }
    else
    {
        throw NxsException("writeCharactersBlockToStream requested for unsupported format");
    }
}