conservation_colorer.cpp

来自「ncbi源码」· C++ 代码 · 共 641 行 · 第 1/2 页

CPP
641
字号
    typedef map < const UngappedAlignedBlock * , FloatVector > BlockRowScores;    BlockRowScores blockFitScores, blockZFitScores, blockRowFitScores;    float minBlockFit, maxBlockFit, minBlockZFit, maxBlockZFit, minBlockRowFit, maxBlockRowFit;    BlockMap::const_iterator b, be = blocks.end();    for (b=blocks.begin(); b!=be; ++b) {        blockFitScores[b->first].resize(nRows, 0.0f);        for (int blockColumn=0; blockColumn<b->first->width; ++blockColumn) {            profileColumn = b->second[blockColumn];            ColumnProfile& profile = alignmentProfile[profileColumn];            pe = profile.end();            // fit scores            for (p=profile.begin(); p!=pe; ++p) {                int& fit = fitScores[profileColumn][p->first];                fit = GetPSSMScore(alignment->GetPSSM(),                    p->first, b->first->GetRangeOfRow(0)->from + blockColumn);                if (blockColumn == 0 && b == blocks.begin() && p == profile.begin()) {                    minFit = maxFit = fit;                } else {                    if (fit < minFit) minFit = fit;                    else if (fit > maxFit) maxFit = fit;                }            }            // add up residue fit scores to get block fit scores            for (row=0; row<nRows; ++row) {                char ch = ScreenResidueCharacter(b->first->GetCharacterAt(blockColumn, row));                blockFitScores[b->first][row] += fitScores[profileColumn][ch];            }        }        // find average/min/max block fit        float average = 0.0f;        for (row=0; row<nRows; ++row) {            float& score = blockFitScores[b->first][row];            score /= b->first->width;   // average fit score across the block for this row            average += score;            if (row == 0 && b == blocks.begin()) {                minBlockFit = maxBlockFit = score;            } else {                if (score < minBlockFit) minBlockFit = score;                else if (score > maxBlockFit) maxBlockFit = score;            }        }        average /= nRows;        // calculate block Z scores from block fit scores        if (nRows >= 2) {            // calculate standard deviation of block fit score over all rows of this block            float stdDev = 0.0f;            for (row=0; row<nRows; ++row)                stdDev += (blockFitScores[b->first][row] - average) *                          (blockFitScores[b->first][row] - average);            stdDev /= nRows - 1;            stdDev = sqrt(stdDev);            if (stdDev > 1e-10) {                // calculate Z scores for each row                blockZFitScores[b->first].resize(nRows);                for (row=0; row<nRows; ++row)                    blockZFitScores[b->first][row] = (blockFitScores[b->first][row] - average) / stdDev;            }        }    }    // calculate row fit scores based on Z-scores for each block across a given row    if (blocks.size() >= 2) {        for (b=blocks.begin(); b!=be; ++b)            blockRowFitScores[b->first].resize(nRows, kMin_Float);        // calculate row average, standard deviation, and Z-scores        for (row=0; row<nRows; ++row) {            float average = 0.0f;            for (b=blocks.begin(); b!=be; ++b)                average += blockFitScores[b->first][row];            average /= blocks.size();            float stdDev = 0.0f;            for (b=blocks.begin(); b!=be; ++b)                stdDev += (blockFitScores[b->first][row] - average) *                          (blockFitScores[b->first][row] - average);            stdDev /= blocks.size() - 1;            stdDev = sqrt(stdDev);            if (stdDev > 1e-10) {                for (b=blocks.begin(); b!=be; ++b)                    blockRowFitScores[b->first][row] = (blockFitScores[b->first][row] - average) / stdDev;            }        }    }    // now assign colors    double scale;    fitColors.resize(nRows * nColumns);    for (profileColumn=0; profileColumn<nColumns; ++profileColumn) {        // fit        CharIntMap::const_iterator c, ce = fitScores[profileColumn].end();        for (c=fitScores[profileColumn].begin(); c!=ce; ++c) {            if (maxFit == minFit)                scale = 1.0;            else                scale = 1.0 * (c->second - minFit) / (maxFit - minFit);            fitColors[profileColumn][c->first] = GlobalColors()->Get(Colors::eConservationMap, scale);        }    }    // block fit    blockFitColors.clear();    for (b=blocks.begin(); b!=be; ++b) {        blockFitColors[b->first].resize(nRows);        for (row=0; row<nRows; ++row) {            if (maxBlockFit == minBlockFit)                scale = 1.0;            else                scale = 1.0 * (blockFitScores[b->first][row] - minBlockFit) / (maxBlockFit - minBlockFit);            blockFitColors[b->first][row] = GlobalColors()->Get(Colors::eConservationMap, scale);        }    }    // block Z fit    blockZFitColors.clear();    for (b=blocks.begin(); b!=be; ++b) {        blockZFitColors[b->first].resize(nRows, Vector(0,0,0));        if (blockZFitScores.find(b->first) != blockZFitScores.end()) {  // if this column has scores            for (row=0; row<nRows; ++row) {                             // normalize colors per column                float zScore = blockZFitScores[b->first][row];                if (row == 0) {                    minBlockZFit = maxBlockZFit = zScore;                } else {                    if (zScore < minBlockZFit) minBlockZFit = zScore;                    else if (zScore > maxBlockZFit) maxBlockZFit = zScore;                }            }            for (row=0; row<nRows; ++row) {                if (maxBlockZFit == minBlockZFit)                    scale = 1.0;                else                    scale = 1.0 * (blockZFitScores[b->first][row] - minBlockZFit) /                                        (maxBlockZFit - minBlockZFit);                blockZFitColors[b->first][row] = GlobalColors()->Get(Colors::eConservationMap, scale);            }        }    }    // block row fit    blockRowFitColors.clear();    for (b=blocks.begin(); b!=be; ++b)        blockRowFitColors[b->first].resize(nRows, Vector(0,0,0));    if (blocks.size() >= 2) {        for (row=0; row<nRows; ++row) {            if (blockRowFitScores.begin()->second[row] != kMin_Float) { // if this row has fit scores                for (b=blocks.begin(); b!=be; ++b) {                    // normalize colors per row                    float zScore = blockRowFitScores[b->first][row];                    if (b == blocks.begin()) {                        minBlockRowFit = maxBlockRowFit = zScore;                    } else {                        if (zScore < minBlockRowFit) minBlockRowFit = zScore;                        else if (zScore > maxBlockRowFit) maxBlockRowFit = zScore;                    }                }                for (b=blocks.begin(); b!=be; ++b) {                    if (maxBlockRowFit == minBlockRowFit)                        scale = 1.0;                    else                        scale = 1.0 * (blockRowFitScores[b->first][row] - minBlockRowFit) /                                            (maxBlockRowFit - minBlockRowFit);                    blockRowFitColors[b->first][row] = GlobalColors()->Get(Colors::eConservationMap, scale);                }            }        }    }    fitColorsCurrent = true;}void ConservationColorer::GetProfileIndexAndResidue(    const UngappedAlignedBlock *block, int blockColumn, int row,    int *profileIndex, char *residue) const{    BlockMap::const_iterator b = blocks.find(block);    *profileIndex = b->second[blockColumn];    *residue = ScreenResidueCharacter(b->first->GetCharacterAt(blockColumn, row));}void ConservationColorer::Clear(void){    nColumns = 0;    blocks.clear();    FreeColors();}void ConservationColorer::FreeColors(void){    alignmentProfile.clear();    identities.clear();    varietyColors.clear();    weightedVarietyColors.clear();    informationContentColors.clear();    fitColors.clear();    blockFitColors.clear();    blockZFitColors.clear();    blockRowFitColors.clear();    basicColorsCurrent = fitColorsCurrent = false;}END_SCOPE(Cn3D)/** ---------------------------------------------------------------------------* $Log: conservation_colorer.cpp,v $* Revision 1000.3  2004/06/01 18:28:29  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.35** Revision 1.35  2004/05/21 21:41:39  gorelenk* Added PCH ncbi_pch.hpp** Revision 1.34  2004/03/15 18:23:01  thiessen* prefer prefix vs. postfix ++/-- operators** Revision 1.33  2004/02/19 17:04:53  thiessen* remove cn3d/ from include paths; add pragma to disable annoying msvc warning** Revision 1.32  2003/12/11 19:35:54  thiessen* use built-in blosum62 matrix** Revision 1.31  2003/11/04 18:09:17  thiessen* rearrange headers for OSX build** Revision 1.30  2003/02/13 18:31:39  thiessen* separate basic from fit color calculation** Revision 1.29  2003/02/12 15:36:14  thiessen* clean up fit scoring code** Revision 1.28  2003/02/06 16:39:53  thiessen* add block row fit coloring** Revision 1.27  2003/02/03 19:20:03  thiessen* format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros** Revision 1.26  2003/01/31 17:18:58  thiessen* many small additions and changes...** Revision 1.25  2003/01/30 14:00:23  thiessen* add Block Z Fit coloring** Revision 1.24  2003/01/28 21:07:56  thiessen* add block fit coloring algorithm; tweak row dragging; fix style bug** Revision 1.23  2002/07/23 16:40:39  thiessen* remove static decl** Revision 1.22  2002/07/23 15:46:50  thiessen* print out more BLAST info; tweak save file name** Revision 1.21  2002/04/27 16:32:12  thiessen* fix small leaks/bugs found by BoundsChecker** Revision 1.20  2002/03/01 15:47:10  thiessen* fix bug in fit coloring for non-standard residues** Revision 1.19  2002/02/13 19:45:29  thiessen* Fit coloring by info content contribution** Revision 1.18  2001/09/27 15:37:58  thiessen* decouple sequence import and BLAST** Revision 1.17  2001/08/24 00:41:35  thiessen* tweak conservation colors and opengl font handling** Revision 1.16  2001/08/13 22:30:59  thiessen* add structure window mouse drag/zoom; add highlight option to render settings** Revision 1.15  2001/06/04 14:58:00  thiessen* add proximity sort; highlight sequence on browser launch** Revision 1.14  2001/06/02 17:22:45  thiessen* fixes for GCC** Revision 1.13  2001/05/31 18:47:08  thiessen* add preliminary style dialog; remove LIST_TYPE; add thread single and delete all; misc tweaks** Revision 1.12  2001/05/25 01:38:16  thiessen* minor fixes for compiling on SGI** Revision 1.11  2001/05/22 22:37:13  thiessen* check data registry path** Revision 1.10  2001/05/22 19:09:30  thiessen* many minor fixes to compile/run on Solaris/GTK** Revision 1.9  2001/03/22 00:33:16  thiessen* initial threading working (PSSM only); free color storage in undo stack** Revision 1.8  2001/02/22 00:30:06  thiessen* make directories global ; allow only one Sequence per StructureObject** Revision 1.7  2001/02/15 00:03:54  thiessen* print out total information content** Revision 1.6  2001/02/13 20:33:49  thiessen* add information content coloring** Revision 1.5  2000/11/30 15:49:38  thiessen* add show/hide rows; unpack sec. struc. and domain features** Revision 1.4  2000/10/16 20:03:07  thiessen* working block creation** Revision 1.3  2000/10/16 14:25:48  thiessen* working alignment fit coloring** Revision 1.2  2000/10/04 17:41:30  thiessen* change highlight color (cell background) handling** Revision 1.1  2000/09/20 22:24:48  thiessen* working conservation coloring; split and center unaligned justification**/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?