void phaseChangeModel::correct ( const scalar dt, scalarField& availableMass, volScalarField& dMass, volScalarField& dEnergy ) { if (!active()) { return; } correctModel ( dt, availableMass, dMass, dEnergy ); latestMassPC_ = sum(dMass.primitiveField()); totalMassPC_ += latestMassPC_; availableMass -= dMass; dMass.correctBoundaryConditions(); if (writeTime()) { scalar phaseChangeMass = getModelProperty<scalar>("phaseChangeMass"); phaseChangeMass += returnReduce(totalMassPC_, sumOp<scalar>()); setModelProperty<scalar>("phaseChangeMass", phaseChangeMass); totalMassPC_ = 0.0; } }
void phaseChangeModel::correct ( const scalar dt, scalarField& availableMass, volScalarField& dMass, volScalarField& dEnergy ) { correctModel ( dt, availableMass, dMass, dEnergy ); latestMassPC_ = sum(dMass.internalField()); totalMassPC_ += latestMassPC_; availableMass -= dMass; dMass.correctBoundaryConditions(); }
//********************************************************************************************************************** int ChimeraPerseusCommand::driver(string chimeraFileName, vector<seqData>& sequences, string accnosFileName, int& numChimeras){ try { vector<vector<double> > correctModel(4); //could be an option in the future to input own model matrix for(int i=0;i<4;i++){ correctModel[i].resize(4); } correctModel[0][0] = 0.000000; //AA correctModel[1][0] = 11.619259; //CA correctModel[2][0] = 11.694004; //TA correctModel[3][0] = 7.748623; //GA correctModel[1][1] = 0.000000; //CC correctModel[2][1] = 7.619657; //TC correctModel[3][1] = 12.852562; //GC correctModel[2][2] = 0.000000; //TT correctModel[3][2] = 10.964048; //TG correctModel[3][3] = 0.000000; //GG for(int i=0;i<4;i++){ for(int j=0;j<i;j++){ correctModel[j][i] = correctModel[i][j]; } } int numSeqs = sequences.size(); int alignLength = sequences[0].sequence.size(); ofstream chimeraFile; ofstream accnosFile; m->openOutputFile(chimeraFileName, chimeraFile); m->openOutputFile(accnosFileName, accnosFile); Perseus myPerseus; vector<vector<double> > binMatrix = myPerseus.binomial(alignLength); chimeraFile << "SequenceIndex\tName\tDiffsToBestMatch\tBestMatchIndex\tBestMatchName\tDiffstToChimera\tIndexofLeftParent\tIndexOfRightParent\tNameOfLeftParent\tNameOfRightParent\tDistanceToBestMatch\tcIndex\t(cIndex - singleDist)\tloonIndex\tMismatchesToChimera\tMismatchToTrimera\tChimeraBreakPoint\tLogisticProbability\tTypeOfSequence\n"; vector<bool> chimeras(numSeqs, 0); for(int i=0;i<numSeqs;i++){ if (m->control_pressed) { chimeraFile.close(); m->mothurRemove(chimeraFileName); accnosFile.close(); m->mothurRemove(accnosFileName); return 0; } vector<bool> restricted = chimeras; vector<vector<int> > leftDiffs(numSeqs); vector<vector<int> > leftMaps(numSeqs); vector<vector<int> > rightDiffs(numSeqs); vector<vector<int> > rightMaps(numSeqs); vector<int> singleLeft, bestLeft; vector<int> singleRight, bestRight; int bestSingleIndex, bestSingleDiff; vector<pwAlign> alignments(numSeqs); int comparisons = myPerseus.getAlignments(i, sequences, alignments, leftDiffs, leftMaps, rightDiffs, rightMaps, bestSingleIndex, bestSingleDiff, restricted); if (m->control_pressed) { chimeraFile.close(); m->mothurRemove(chimeraFileName); accnosFile.close(); m->mothurRemove(accnosFileName); return 0; } int minMismatchToChimera, leftParentBi, rightParentBi, breakPointBi; string dummyA, dummyB; if(comparisons >= 2){ minMismatchToChimera = myPerseus.getChimera(sequences, leftDiffs, rightDiffs, leftParentBi, rightParentBi, breakPointBi, singleLeft, bestLeft, singleRight, bestRight, restricted); if (m->control_pressed) { chimeraFile.close(); m->mothurRemove(chimeraFileName); accnosFile.close(); m->mothurRemove(accnosFileName); return 0; } int minMismatchToTrimera = numeric_limits<int>::max(); int leftParentTri, middleParentTri, rightParentTri, breakPointTriA, breakPointTriB; if(minMismatchToChimera >= 3 && comparisons >= 3){ minMismatchToTrimera = myPerseus.getTrimera(sequences, leftDiffs, leftParentTri, middleParentTri, rightParentTri, breakPointTriA, breakPointTriB, singleLeft, bestLeft, singleRight, bestRight, restricted); if (m->control_pressed) { chimeraFile.close(); m->mothurRemove(chimeraFileName); accnosFile.close(); m->mothurRemove(accnosFileName); return 0; } } double singleDist = myPerseus.modeledPairwiseAlignSeqs(sequences[i].sequence, sequences[bestSingleIndex].sequence, dummyA, dummyB, correctModel); if (m->control_pressed) { chimeraFile.close(); m->mothurRemove(chimeraFileName); accnosFile.close(); m->mothurRemove(accnosFileName); return 0; } string type; string chimeraRefSeq; if(minMismatchToChimera - minMismatchToTrimera >= 3){ type = "trimera"; chimeraRefSeq = myPerseus.stitchTrimera(alignments, leftParentTri, middleParentTri, rightParentTri, breakPointTriA, breakPointTriB, leftMaps, rightMaps); } else{ type = "chimera"; chimeraRefSeq = myPerseus.stitchBimera(alignments, leftParentBi, rightParentBi, breakPointBi, leftMaps, rightMaps); } ; if (m->control_pressed) { chimeraFile.close(); m->mothurRemove(chimeraFileName); accnosFile.close(); m->mothurRemove(accnosFileName); return 0; } double chimeraDist = myPerseus.modeledPairwiseAlignSeqs(sequences[i].sequence, chimeraRefSeq, dummyA, dummyB, correctModel); if (m->control_pressed) { chimeraFile.close(); m->mothurRemove(chimeraFileName); accnosFile.close(); m->mothurRemove(accnosFileName); return 0; } double cIndex = chimeraDist;//modeledPairwiseAlignSeqs(sequences[i].sequence, chimeraRefSeq); double loonIndex = myPerseus.calcLoonIndex(sequences[i].sequence, sequences[leftParentBi].sequence, sequences[rightParentBi].sequence, breakPointBi, binMatrix); if (m->control_pressed) { chimeraFile.close(); m->mothurRemove(chimeraFileName); accnosFile.close(); m->mothurRemove(accnosFileName); return 0; } chimeraFile << i << '\t' << sequences[i].seqName << '\t' << bestSingleDiff << '\t' << bestSingleIndex << '\t' << sequences[bestSingleIndex].seqName << '\t'; chimeraFile << minMismatchToChimera << '\t' << leftParentBi << '\t' << rightParentBi << '\t' << sequences[leftParentBi].seqName << '\t' << sequences[rightParentBi].seqName << '\t'; chimeraFile << singleDist << '\t' << cIndex << '\t' << (cIndex - singleDist) << '\t' << loonIndex << '\t'; chimeraFile << minMismatchToChimera << '\t' << minMismatchToTrimera << '\t' << breakPointBi << '\t'; double probability = myPerseus.classifyChimera(singleDist, cIndex, loonIndex, alpha, beta); chimeraFile << probability << '\t'; if(probability > cutoff){ chimeraFile << type << endl; accnosFile << sequences[i].seqName << endl; chimeras[i] = 1; numChimeras++; } else{ chimeraFile << "good" << endl; } } else{ chimeraFile << i << '\t' << sequences[i].seqName << "\t0\t0\tNull\t0\t0\t0\tNull\tNull\t0.0\t0.0\t0.0\t0\t0\t0\t0.0\t0.0\tgood" << endl; } //report progress if((i+1) % 100 == 0){ m->mothurOut("Processing sequence: " + toString(i+1) + "\n"); } } if((numSeqs) % 100 != 0){ m->mothurOut("Processing sequence: " + toString(numSeqs) + "\n"); } chimeraFile.close(); accnosFile.close(); return numSeqs; } catch(exception& e) { m->errorOut(e, "ChimeraPerseusCommand", "driver"); exit(1); } }