Skip to content

Commit

Permalink
Address segfaults on memory free at end of search (#74)
Browse files Browse the repository at this point in the history
* minor changes

* clean mstoolkit

* properly set cushion for iArraySizeGlobal value which addresses segfault at end of search

* add array size mass cushion calculation as a function as it's used in a couple of places
  • Loading branch information
jke000 authored Feb 1, 2025
1 parent 629e67f commit 0630b06
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 111 deletions.
2 changes: 1 addition & 1 deletion CometSearch/CometDataInternal.h
Original file line number Diff line number Diff line change
Expand Up @@ -704,7 +704,7 @@ struct StaticParams
EnzymeInfo enzymeInformation;
MassUtil massUtility;
double dInverseBinWidth; // this is used in BIN() many times so use inverse binWidth to do multiply vs. divide
int iArraySizeGlobal; // (int)((g_staticParams.options.dPeptideMassHigh + g_staticParams.tolerances.dInputTolerancePlus + 2.0) * g_staticParams.dInverseBinWidth)
int iArraySizeGlobal; // (int)((g_staticParams.options.dPeptideMassHigh + plus_tol_in_daltons + buffer) * g_staticParams.dInverseBinWidth)
double dOneMinusBinOffset; // this is used in BIN() many times so calculate once
IonInfo ionInformation;
int iXcorrProcessingOffset;
Expand Down
157 changes: 49 additions & 108 deletions CometSearch/CometPreprocess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,11 +302,20 @@ bool CometPreprocess::ReadPrecursors(MSReader &mstReader)
}

// tolerances are fixed above except if ppm is specified
if (g_staticParams.tolerances.iMassToleranceUnits == 2) // ppm
else if (g_staticParams.tolerances.iMassToleranceUnits == 2) // ppm
{
dToleranceLow = g_staticParams.tolerances.dInputToleranceMinus * dProtonatedMass / 1E6;
dToleranceHigh = g_staticParams.tolerances.dInputTolerancePlus * dProtonatedMass / 1E6;
}
else
{
char szErrorMsg[256];
sprintf(szErrorMsg, " Error - peptide_mass_units must be 0, 1 or 2. Value set is %d.\n", g_staticParams.tolerances.iMassToleranceUnits);
string strErrorMsg(szErrorMsg);
g_cometStatus.SetStatus(CometResult_Failed, strErrorMsg);
logerr(szErrorMsg);
return false;
}

// these are the range of neutral mass bins if any theoretical peptide falls into,
// we want to add them to the fragment index
Expand Down Expand Up @@ -713,36 +722,11 @@ bool CometPreprocess::Preprocess(struct Query *pScoring,
pPre.iHighestIon = 0;
pPre.dHighestIntensity = 0;

//MH: Find appropriately sized array cushion based on user parameters. Fixes error found by Patrick Pedrioli for
// very wide mass tolerance searches (i.e. 500 Da).
double dCushion = 0.0;
if (g_staticParams.tolerances.iMassToleranceUnits == 0) // amu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
{
dCushion *= 8; //MH: hope +8 is large enough charge because g_staticParams.options.iEndCharge can be overridden.
}
}
else if (g_staticParams.tolerances.iMassToleranceUnits == 1) // mmu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * 0.001;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
{
dCushion *= 8; //MH: hope +8 is large enough charge because g_staticParams.options.iEndCharge can be overridden.
}
}
else // ppm
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * g_staticParams.options.dPeptideMassHigh / 1E6;
}

// initialize these temporary arrays before re-using
memset(pdTmpRawData, 0, g_staticParams.iArraySizeGlobal * sizeof(double));
memset(pdTmpFastXcorrData, 0, g_staticParams.iArraySizeGlobal * sizeof(double));
memset(pdTmpCorrelationData, 0, g_staticParams.iArraySizeGlobal * sizeof(double));
size_t iTmp = (size_t)(g_staticParams.iArraySizeGlobal * sizeof(double));
memset(pdTmpRawData, 0, iTmp);
memset(pdTmpFastXcorrData, 0, iTmp);
memset(pdTmpCorrelationData, 0, iTmp);

// pdTmpRawData is a binned array holding raw data
if (!LoadIons(pScoring, pdTmpRawData, mstSpectrum, &pPre))
Expand Down Expand Up @@ -1370,26 +1354,8 @@ bool CometPreprocess::PreprocessSpectrum(Spectrum &spec,

//MH: Find appropriately sized array cushion based on user parameters. Fixes error found by Patrick Pedrioli for
// very wide mass tolerance searches (i.e. 500 Da).
double dCushion = 0.0;
if (g_staticParams.tolerances.iMassToleranceUnits == 0) // amu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
dCushion *= pScoring->_spectrumInfoInternal.iChargeState;
}
else if (g_staticParams.tolerances.iMassToleranceUnits == 1) // mmu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * 0.001;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
dCushion *= pScoring->_spectrumInfoInternal.iChargeState;
}
else // ppm
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * dMass / 1E6;
}
pScoring->_spectrumInfoInternal.iArraySize = (int)((dMass + dCushion + 2.0) * g_staticParams.dInverseBinWidth);
double dCushion = GetMassCushion(pScoring->_pepMassInfo.dExpPepMass);
pScoring->_spectrumInfoInternal.iArraySize = (int)((pScoring->_pepMassInfo.dExpPepMass + dCushion + 2.0) * g_staticParams.dInverseBinWidth);

Threading::LockMutex(_maxChargeMutex);
// g_massRange.iMaxFragmentCharge is global maximum fragment ion charge across all spectra.
Expand Down Expand Up @@ -1580,6 +1546,36 @@ bool CometPreprocess::AdjustMassTol(struct Query *pScoring)
}


double CometPreprocess::GetMassCushion(double dMass)
{
// MH: Find appropriately sized array cushion based on user parameters.
// Fixes error found by Patrick Pedrioli for very wide mass tolerance
// searches (i.e. 500 Da).

double dCushion = 0.0;

if (g_staticParams.tolerances.iMassToleranceUnits == 0) // amu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
dCushion *= 8; //MH: hope +8 is large enough charge because g_staticParams.options.iEndCharge can be overridden.
}
else if (g_staticParams.tolerances.iMassToleranceUnits == 1) // mmu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * 0.001;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
dCushion *= 8; //MH: hope +8 is large enough charge because g_staticParams.options.iEndCharge can be overridden.
}
else // ppm
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * dMass / 1E6;
}

return dCushion;
}

// Reads MSMS data file as ASCII mass/intensity pairs.
bool CometPreprocess::LoadIons(struct Query *pScoring,
double *pdTmpRawData,
Expand Down Expand Up @@ -1805,32 +1801,6 @@ bool CometPreprocess::AllocateMemory(int maxNumThreads)
{
int i;

//MH: Find appropriately sized array cushion based on user parameters. Fixes error found by Patrick Pedrioli for
// very wide mass tolerance searches (i.e. 500 Da).
double dCushion = 0.0;
if (g_staticParams.tolerances.iMassToleranceUnits == 0) // amu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
{
dCushion *= 8; //MH: hope +8 is large enough charge because g_staticParams.options.iEndCharge can be overridden.
}
}
else if (g_staticParams.tolerances.iMassToleranceUnits == 1) // mmu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * 0.001;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
{
dCushion *= 8; //MH: hope +8 is large enough charge because g_staticParams.options.iEndCharge can be overridden.
}
}
else // ppm
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * g_staticParams.options.dPeptideMassHigh / 1E6;
}

//MH: Initally mark all arrays as available (i.e. false=not inuse).
pbMemoryPool = new bool[maxNumThreads];
for (i=0; i<maxNumThreads; ++i)
Expand Down Expand Up @@ -1973,52 +1943,23 @@ bool CometPreprocess::PreprocessSingleSpectrum(int iPrecursorCharge,
pPre.iHighestIon = 0;
pPre.dHighestIntensity = 0;

//MH: Find appropriately sized array cushion based on user parameters. Fixes error found by Patrick Pedrioli for
// very wide mass tolerance searches (i.e. 500 Da).
double dCushion = 0.0;
if (g_staticParams.tolerances.iMassToleranceUnits == 0) // amu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
dCushion *= 8; //MH: hope +8 is large enough charge because g_staticParams.options.iEndCharge can be overridden.
}
else if (g_staticParams.tolerances.iMassToleranceUnits == 1) // mmu
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * 0.001;

if (g_staticParams.tolerances.iMassToleranceType == 1) // precursor m/z tolerance
dCushion *= 8; //MH: hope +8 is large enough charge because g_staticParams.options.iEndCharge can be overridden.
}
else // ppm
{
dCushion = g_staticParams.tolerances.dInputTolerancePlus * g_staticParams.options.dPeptideMassHigh / 1E6;
}

if (!AdjustMassTol(pScoring))
{
return false;
}

pScoring->_spectrumInfoInternal.iArraySize = (int)((pScoring->_pepMassInfo.dExpPepMass + dCushion + 2.0) * g_staticParams.dInverseBinWidth);
pScoring->_spectrumInfoInternal.iArraySize = g_staticParams.iArraySizeGlobal;

// initialize these temporary arrays before re-using
size_t iTmp= (size_t)(pScoring->_spectrumInfoInternal.iArraySize)*sizeof(double);

double *pdTmpRawData = ppdTmpRawDataArr[0];
double *pdTmpFastXcorrData = ppdTmpFastXcorrDataArr[0];
double *pdTmpCorrelationData = ppdTmpCorrelationDataArr[0];

size_t iTmp = (size_t)(g_staticParams.iArraySizeGlobal * sizeof(double));
memset(pdTmpRawData, 0, iTmp);
memset(pdTmpFastXcorrData, 0, iTmp);
memset(pdTmpCorrelationData, 0, iTmp);
memset(pdTmpSpectrum, 0, iTmp);

// Loop through single spectrum and store in pdTmpRawData array
double dIon=0,
dIntensity=0;

memset(pdTmpSpectrum, 0, g_staticParams.iArraySizeGlobal * sizeof(double));

// set dIntensityCutoff based on either minimum intensity or % of base peak
double dIntensityCutoff = g_staticParams.options.dMinIntensity;

Expand Down
1 change: 1 addition & 0 deletions CometSearch/CometPreprocess.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class CometPreprocess
double *pdInten,
int iNumPeaks,
double *pdTmpSpectrum);
static double GetMassCushion(double dMass);

private:

Expand Down
2 changes: 1 addition & 1 deletion CometSearch/CometSearch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2829,7 +2829,7 @@ bool CometSearch::SearchForPeptides(struct sDBEntry dbe,
{
pbDuplFragment[iVal] = false;
_uiBinnedIonMasses[ctCharge][ctIonSeries][ctLen][0] = 0;
// note no need to initialize fragment NL positions as no mods here
// note no need to initialize fragment NL positions as no mods here
}
}

Expand Down
3 changes: 2 additions & 1 deletion CometSearch/CometSearchManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1747,7 +1747,8 @@ bool CometSearchManager::InitializeStaticParams()
return false;
}

g_staticParams.iArraySizeGlobal = (int)((g_staticParams.options.dPeptideMassHigh + g_staticParams.tolerances.dInputTolerancePlus + 2.0) * g_staticParams.dInverseBinWidth);
double dCushion = CometPreprocess::GetMassCushion(g_staticParams.options.dPeptideMassHigh);
g_staticParams.iArraySizeGlobal = (int)((g_staticParams.options.dPeptideMassHigh + dCushion + 5.0) * g_staticParams.dInverseBinWidth);

return true;
}
Expand Down

0 comments on commit 0630b06

Please sign in to comment.