void IndividualLocus :: AppendAllelesToList (RGDList& alleleList) { RGDListIterator it (mAllelesByName); IndividualAllele* nextAllele; while (nextAllele = (IndividualAllele*) it ()) alleleList.Append (nextAllele); }
bool LocusCollection :: FindAllCopiesOfNamedLocus (const RGString& name, RGDList& results) { RGDListIterator it (mLociByName); IndividualLocus* nextLocus; while (nextLocus = (IndividualLocus*) it ()) { if (name == nextLocus->GetName ()) results.Append (nextLocus); } if (results.Entries () > 0) return true; return false; }
bool GenotypeSet :: FindAllGenotypes (const RGString& fileName, RGDList& genotypes) { RGDListIterator it (mGenotypes); GenotypesForAMarkerSet* nextSet; IndividualGenotype* ig; int startEntries = genotypes.Entries (); int endEntries; while (nextSet = (GenotypesForAMarkerSet*) it ()) { ig = nextSet->FindGenotypeForFileName (fileName); if (ig != NULL) genotypes.Append (ig); } endEntries = genotypes.Entries (); if (endEntries > startEntries) return true; return false; }
STRBaseLaneStandard :: STRBaseLaneStandard (const RGString& xmlString) : BaseLaneStandard (xmlString), mCharacteristicArray (NULL), mDifferenceArray (NULL), mUnnormalizedDifferenceArray(0), mNormsLeft (NULL), mNormsRight (NULL), mRelativeSizes (NULL), mSize (0), mDifferenceSize (0), mOmissionSize (0), mOmissionArray (NULL), mNumberOfLargePeaks (0), mLargeCharacteristicArray (NULL), mLargeDifferenceArray (NULL), mNumberOfLargeDifferences (0), mFirstIntervalFraction (-1.0), mSmallestIntervalFraction (-1.0), mMaxRelativeHeight (-1), mCorrelationAcceptanceThreshold (0.993), mCorrelationAutoAcceptanceThreshold (0.9975) // //, mLastHalfSize (0), mLastHalfCharacteristicArray (NULL), mLastHalfUnnormalizedDifferenceArray (NULL), //mLastHalfRelativeSizes (NULL), mLastHalfDifferenceSize (0), mLastHalfNormsLeft (NULL), mLastHalfNormsRight (NULL) { RGString TextInput (xmlString); RGBracketStringSearch CharacteristicsToken ("<Characteristics>", "</Characteristics>", TextInput); RGString CharacteristicsString; RGString HeightString; RGBracketStringSearch HeightToken ("<RelativeHeights>", "</RelativeHeights>", TextInput); RGBracketStringSearch OmissionSearch ("<Omissions>", "</Omissions>", TextInput); RGBracketStringSearch AcceptanceThresholdSearch ("<CorrelationAcceptanceThreshold>", "</CorrelationAcceptanceThreshold>", TextInput); RGBracketStringSearch AutoAcceptanceThresholdSearch ("<CorrelationAutoAcceptanceThreshold>", "</CorrelationAutoAcceptanceThreshold>", TextInput); RGString OmissionString; size_t endPosition; RGString token; RGString delim; RGString numberString; double minChar; double maxChar; RGDList tokens; double value; RGPDouble* valuePtr; double previous; double next; double cumulative; int i = 0; double temp; int k; int j; if (!CharacteristicsToken.FindNextBracketedString (0, endPosition, CharacteristicsString)) { Msg << "Internal Lane Standard named " << Name << " could not find Characteristics token from string\n"; Msg << TextInput << "\n"; Valid = FALSE; } else { RGStringTokenizer data (CharacteristicsString); data.AddDelimiter (' '); data.AddDelimiter (" "); data.AddDelimiter (" "); data.AddDelimiter (" "); data.AddDelimiter (" "); data.AddRemoveItem (','); data.AddDelimiter ('\t'); data.AddDelimiter ('\n'); while (data.NextToken (token, delim)) { if (token.Length () > 0) { value = token.ConvertToDouble (); valuePtr = new RGPDouble (value); if (tokens.Entries () == 0) { minChar = maxChar = value; tokens.Append (valuePtr); } else if (value < minChar) { minChar = value; tokens.Prepend (valuePtr); } else if (value > maxChar) { maxChar = value; tokens.Append (valuePtr); } else tokens.Insert (valuePtr); } } mSize = (int)tokens.Entries (); NCharacteristics = mSize; mCharacteristicArray = new double [mSize]; mDifferenceSize = mSize - 1; mDifferenceArray = new double [mDifferenceSize]; mUnnormalizedDifferenceArray = new double [mDifferenceSize]; mNormsLeft = new double [mDifferenceSize]; mNormsRight = new double [mDifferenceSize]; //mLastHalfSize = mSize / 2; //if (2 * mLastHalfSize < mSize) // mLastHalfSize += 1; //mLastHalfDifferenceSize = mLastHalfSize - 1; //mLastHalfCharacteristicArray = new double [mLastHalfSize]; //mLastHalfUnnormalizedDifferenceArray = new double [mLastHalfDifferenceSize]; //mLastHalfNormsLeft = new double [mLastHalfDifferenceSize]; //mLastHalfNormsRight = new double [mLastHalfDifferenceSize]; while (valuePtr = (RGPDouble*)tokens.GetFirst ()) { mCharacteristicArray [i] = valuePtr->GetDouble (); delete valuePtr; i++; } //int displacement = mSize - mLastHalfSize; // +0, +1, -1????? //for (i=0; i<mLastHalfSize; i++) // mLastHalfCharacteristicArray [i] = mCharacteristicArray [i + displacement]; previous = mCharacteristicArray [0]; for (i=0; i<mDifferenceSize; i++) { next = mCharacteristicArray [i+1]; mUnnormalizedDifferenceArray [i] = mDifferenceArray [i] = next - previous; previous = next; } //for (i=0; i<mLastHalfSize; i++) // mLastHalfUnnormalizedDifferenceArray [i] = mUnnormalizedDifferenceArray [i + displacement]; double norm = 0.0; for (i=0; i<mDifferenceSize; i++) norm += mDifferenceArray [i] * mDifferenceArray [i]; norm = sqrt (norm); if (norm > 0.0) { for (i=0; i<mDifferenceSize; i++) mDifferenceArray [i] /= norm; } cumulative = 0.0; for (i=0; i<mDifferenceSize; i++) { temp = mUnnormalizedDifferenceArray [i]; cumulative += temp * temp; mNormsLeft [i] = cumulative; } cumulative = 0.0; for (i=mDifferenceSize-1; i>=0; i--) { temp = mUnnormalizedDifferenceArray [i]; cumulative += temp * temp; mNormsRight [i] = cumulative; } //cumulative = 0.0; //for (i=0; i<mLastHalfDifferenceSize; i++) { // temp = mLastHalfUnnormalizedDifferenceArray [i]; // cumulative += temp * temp; // mLastHalfNormsLeft [i] = cumulative; //} //cumulative = 0.0; //for (i=mLastHalfDifferenceSize-1; i>=0; i--) { // temp = mLastHalfUnnormalizedDifferenceArray [i]; // cumulative += temp * temp; // mLastHalfNormsRight [i] = cumulative; //} MaxCharacteristic = maxChar; MinCharacteristic = minChar; double width = mCharacteristicArray [mSize - 1] - mCharacteristicArray [0]; if (width > 0.0) mFirstIntervalFraction = mUnnormalizedDifferenceArray [0] / width; else mFirstIntervalFraction = 1.0; double temp = mUnnormalizedDifferenceArray [0]; double value; for (i=0; i<mDifferenceSize; i++) { value = mUnnormalizedDifferenceArray [i]; if (value < temp) temp = value; } if (width > 0.0) mSmallestIntervalFraction = temp / width; else mSmallestIntervalFraction = 1.0; if (!HeightToken.FindNextBracketedString (0, endPosition, HeightString)) { mRelativeSizes = NULL; // mLastHalfRelativeSizes = NULL; } else { RGStringTokenizer data2 (HeightString); data2.AddDelimiter (' '); data2.AddDelimiter (" "); data2.AddDelimiter (" "); data2.AddDelimiter (" "); data2.AddDelimiter (" "); data2.AddRemoveItem (','); data2.AddDelimiter ('\t'); data2.AddDelimiter ('\n'); mRelativeSizes = new int [mSize]; for (k=0; k<mSize; k++) mRelativeSizes [k] = -1; k = 0; while (data2.NextToken (token, delim)) { if (token.Length () > 0) { token.ToUpper (); char first = token.GetFirstCharacter (); switch (first) { case 'H': mRelativeSizes [k] = 5; break; case 'L': mRelativeSizes [k] = 1; break; case 'M': if (token.Length () == 1) mRelativeSizes [k] = 3; else if (token.GetLastCharacter () == 'H') mRelativeSizes [k] = 4; else mRelativeSizes [k] = 2; break; default: mRelativeSizes [k] = -1; } } k++; if (k >= mSize) break; } //mLastHalfRelativeSizes = new int [mLastHalfSize]; //for (i=0; i<mLastHalfSize; i++) // mLastHalfRelativeSizes [i] = mRelativeSizes [i + displacement]; int maxRelativeSize = 0; int relativeSize; for (j=0; j<mSize; j++) { relativeSize = mRelativeSizes [j]; if (relativeSize > maxRelativeSize) maxRelativeSize = relativeSize; } int numberOfHighsInILS = 0; mMaxRelativeHeight = maxRelativeSize; for (j=0; j<mSize; j++) { if (mRelativeSizes [j] == maxRelativeSize) numberOfHighsInILS++; } mNumberOfLargePeaks = numberOfHighsInILS; mNumberOfLargeDifferences = numberOfHighsInILS - 1; mLargeCharacteristicArray = new double [numberOfHighsInILS]; if (mNumberOfLargeDifferences > 0) mLargeDifferenceArray = new double [mNumberOfLargeDifferences]; k = 0; for (j=0; j<mSize; j++) { if (mRelativeSizes [j] == maxRelativeSize) { mLargeCharacteristicArray [k] = mCharacteristicArray [j]; k++; } } if (mLargeDifferenceArray != NULL) { for (j=0; j<mNumberOfLargeDifferences; j++) mLargeDifferenceArray [j] = mLargeCharacteristicArray [j + 1] - mLargeCharacteristicArray [j]; } } if (OmissionSearch.FindNextBracketedString (0, endPosition, OmissionString)) { RGStringTokenizer omissionData (OmissionString); omissionData.AddDelimiter (' '); omissionData.AddDelimiter (" "); omissionData.AddDelimiter (" "); omissionData.AddDelimiter (" "); omissionData.AddDelimiter (" "); omissionData.AddRemoveItem (','); omissionData.AddDelimiter ('\t'); omissionData.AddDelimiter ('\n'); while (omissionData.NextToken (token, delim)) { if (token.Length () > 0) { value = token.ConvertToDouble (); valuePtr = new RGPDouble (value); if (tokens.Entries () == 0) { minChar = maxChar = value; tokens.Append (valuePtr); } else if (value < minChar) { minChar = value; tokens.Prepend (valuePtr); } else if (value > maxChar) { maxChar = value; tokens.Append (valuePtr); } else tokens.Insert (valuePtr); } } mOmissionSize = (int)tokens.Entries (); if (mOmissionSize == 0) return; mOmissionArray = new double [mOmissionSize]; i = 0; while (valuePtr = (RGPDouble*)tokens.GetFirst ()) { mOmissionArray [i] = valuePtr->GetDouble (); delete valuePtr; i++; } } } cout << "ILS Name = " << Name.GetData () << endl; if (!AcceptanceThresholdSearch.FindNextBracketedString (0, endPosition, numberString)) cout << "\tCould not find ILS acceptance threshold...using " << mCorrelationAcceptanceThreshold << endl; else { mCorrelationAcceptanceThreshold = numberString.ConvertToDouble (); cout << "\tFrom ILS settings...ILS acceptance threshold = " << mCorrelationAcceptanceThreshold << endl; } if (!AutoAcceptanceThresholdSearch.FindNextBracketedString (0, endPosition, numberString)) cout << "\tCould not find ILS auto acceptance threshold...using default value = " << mCorrelationAutoAcceptanceThreshold << endl << endl; else { mCorrelationAutoAcceptanceThreshold = numberString.ConvertToDouble (); cout << "\tFrom ILS settings...ILS auto acceptance threshold = " << mCorrelationAutoAcceptanceThreshold << endl << endl; } }
Boolean STRBaseLocus :: ExtractGridSignals (RGDList& channelSignalList, const LaneStandard* ls, RGDList& locusDataSignalList, ChannelData* lsData, Locus* locus) { int lsSize = ls->GetNumberOfCharacteristics (); int i1; int i2; double c1; double c2; Notice* newNotice; if (lsSize < 0) { Msg << "Number of characteristics not available for Locus named " << LocusName << "\n"; newNotice = new SetupErrorNumberPeaksUnavailableForLocus; locus->AddNoticeToList (newNotice); return FALSE; } if (LowerBoundGridLSBasePair < 0.0) { i1 = (int) floor (LowerBoundGridLSIndex); if (i1 < 0) { Msg << "Internal Lane Standard lower bound index for Grid is out of bounds for Locus named " << LocusName << "\n"; return FALSE; } i2 = i1 + 1; c2 = LowerBoundGridLSIndex - i1; c1 = 1.0 - c2; MinimumGridTime = c1 * ls->GetLaneStandardTimeForCharacteristicNumber (i1) + c2 * ls->GetLaneStandardTimeForCharacteristicNumber (i2); // cout << "Not using base pairs for minimum of locus " << LocusName << endl; } else MinimumGridTime = lsData->GetTimeForSpecifiedID (LowerBoundGridLSBasePair); if (UpperBoundGridLSBasePair < 0.0) { i1 = (int) floor (UpperBoundGridLSIndex); if (i1 < 0) { Msg << "Internal Lane Standard upper bound index for Grid is out of bounds for Locus named " << LocusName << "\n"; return FALSE; } i2 = i1 + 1; c2 = UpperBoundGridLSIndex - i1; c1 = 1.0 - c2; MaximumGridTime = c1 * ls->GetLaneStandardTimeForCharacteristicNumber (i1) + c2 * ls->GetLaneStandardTimeForCharacteristicNumber (i2); // cout << "Not using base pairs for maximum of locus " << LocusName << endl; } else MaximumGridTime = lsData->GetTimeForSpecifiedID (UpperBoundGridLSBasePair); RGDListIterator it (channelSignalList); DataSignal* nextSignal; double nextMean; locusDataSignalList.Clear (); // Assume channelSignalList is in increasing order by signal means while (nextSignal = (DataSignal*) it ()) { nextMean = nextSignal->GetMean (); if (nextMean >= MinimumGridTime) { if (nextMean <= MaximumGridTime) { it.RemoveCurrentItem (); locusDataSignalList.Append (nextSignal); } else break; } } if (locusDataSignalList.Entries () < mLocusSize) { Msg << "Locus named " << LocusName << " could not find the required number of unanalyzed peaks in range\n"; newNotice = new LocusHasTooFewPeaks; locus->AddNoticeToList (newNotice); return FALSE; } return TRUE; }
RGPersistent* RGHashTable :: Append (RGPersistent* p) { RGDList* list = SelectList (p); NumberOfEntries++; return list->Append (p); }
int Ladder :: AmendLadderData (LadderInputFile* inFile, RGString& oldLadderString) { RGString newLadderString; // Parse oldLadder data into pieces for individual edits RGString locusString; RGString* newLocusString; RGDList locusStrings; size_t startPos = 0; size_t endPos; RGXMLTagSearch locusSearch ("Locus", oldLadderString); RGXMLTagSearch searchRegionsSearch ("SearchRegions", oldLadderString); RGString* ilsName = (RGString*)inFile->GetILSNameList ().First (); endPos = 0; oldLadderString.FindNextSubstring (0, "\t\t\t<Locus>", endPos); RGString insertBase; insertBase << "\t\t\t\t\t<ILSName>" << ilsName->GetData () << "</ILSName>\n"; insertBase << "\t\t\t\t</LSBases>"; RGString leadString = oldLadderString.ExtractSubstring (0, endPos - 1); //cout << "Lead string = \n" << leadString.GetData () << endl; endPos = 0; leadString.FindAndReplaceNextSubstring ("\t\t\t\t</LSBases>", insertBase, endPos); //cout << "Lead string = \n" << leadString.GetData () << endl; newLadderString << leadString; startPos = 0; while (locusSearch.FindNextTag (startPos, endPos, locusString)) { newLocusString = new RGString (locusString); locusStrings.Append (newLocusString); startPos = endPos; } if (mLocusList.size () != locusStrings.Entries ()) { cout << "Number of loci in bins file does not match number of loci in ladder file" << endl; return -152; } Locus* nextLocus; RGString locusInsert; RGString currentLocusString; RGString nameString; RGXMLTagSearch locusNameSearch ("Name", currentLocusString); RGXMLTagSearch coreRepeatSearch ("CoreRepeatNumber", currentLocusString); double minSearch; double maxSearch; RGString repeatString; int repeatNumber; while (locusStrings.Entries () > 0) { newLocusString = (RGString*) locusStrings.GetFirst (); currentLocusString = *newLocusString; locusNameSearch.ResetSearch (); coreRepeatSearch.ResetSearch (); locusNameSearch.FindNextTag (0, endPos, nameString); nextLocus = FindLocusByName (nameString); if (nextLocus == NULL) { cout << "Could not find locus named " << nameString.GetData () << ". Exiting..." << endl; return -155; } if (!coreRepeatSearch.FindNextTag (0, endPos, repeatString)) repeatNumber = 4; else repeatNumber = repeatString.ConvertToInteger (); locusInsert = ""; minSearch = nextLocus->GetMinSearchILSBP () - repeatNumber + 1; maxSearch = nextLocus->GetMaxSearchILSBP () + repeatNumber -1; locusInsert << "\t\t\t\t\t<Region>\n"; locusInsert << "\t\t\t\t\t\t<ILSName>" << ilsName->GetData () << "</ILSName>\n"; locusInsert << "\t\t\t\t\t\t<MinGrid>" << 0.01 * floor (100.0 * minSearch + 0.5) << "</MinGrid>\n"; locusInsert << "\t\t\t\t\t\t<MaxGrid>" << 0.01 * floor (100.0 * maxSearch + 0.5) << "</MaxGrid>\n"; locusInsert << "\t\t\t\t\t</Region>\n"; locusInsert << "\t\t\t\t</SearchRegions>"; endPos = 0; currentLocusString.FindAndReplaceNextSubstring ("\t\t\t\t</SearchRegions>", locusInsert, endPos); newLadderString << "\t\t\t<Locus>" << currentLocusString << "</Locus>\n"; delete newLocusString; } newLadderString << "\t\t</Set>\n"; newLadderString << "\t</Kits>\n"; newLadderString << "</KitData>\n"; RGString ladderPath = inFile->GetOutputConfigDirectoryPath () + "/" + inFile->GetLadderFileName (); RGTextOutput ladderOutput (ladderPath, FALSE); if (!ladderOutput.FileIsValid ()) { cout << "Could not open ladder output file: " << ladderPath.GetData () << endl; return -161; } ladderOutput << newLadderString; cout << "Ladder update completed successfully..." << endl; return 0; }