Skip to content

Commit

Permalink
Second fragment neutral loss; address issue 72 (#73)
Browse files Browse the repository at this point in the history
* initial commit for adding support for 2nd fragment neutral loss peak

* fix incorrect parsing of neutral loss masses

* add missing bounds checks for arrays to address issue 72; increment version string in prep for next release
  • Loading branch information
jke000 authored Jan 29, 2025
1 parent 0d65aa2 commit 50a6902
Show file tree
Hide file tree
Showing 10 changed files with 492 additions and 262 deletions.
20 changes: 16 additions & 4 deletions Comet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -578,21 +578,29 @@ void LoadParameters(char *pszParamsFile,
else if (!strncmp(szParamName, "variable_mod", 12) && strlen(szParamName)==14)
{
char szTmp[512];
char szTmp1[512];

varModsParam.szVarModChar[0] = '\0';
sscanf(szParamVal, "%lf %31s %d %511s %d %d %d %lf",
sscanf(szParamVal, "%lf %31s %d %511s %d %d %d %s",
&varModsParam.dVarModMass,
varModsParam.szVarModChar,
&varModsParam.iBinaryMod,
szTmp,
&varModsParam.iVarModTermDistance,
&varModsParam.iWhichTerm,
&varModsParam.iRequireThisMod,
&varModsParam.dNeutralLoss);
szTmp1);

char *pStr;

// the 8th entry can have to fragment NL values, comma separated
if ( (pStr = strchr(szTmp1, ',')) )
sscanf(szTmp1, "%lf,%lf", &varModsParam.dNeutralLoss, &varModsParam.dNeutralLoss2);
else
sscanf(szTmp1, "%lf", &varModsParam.dNeutralLoss);

// the 4th entry can either be just the max_num_var_mod or a comma separated
// value composed of min_num,max_num
char *pStr;
if ( (pStr=strchr(szTmp, ',')) == NULL)
{
sscanf(szTmp, "%d", &varModsParam.iMaxNumVarModAAPerMod);
Expand Down Expand Up @@ -1410,7 +1418,11 @@ void LoadParameters(char *pszParamsFile,
}
} // while

fgets(szParamBuf, SIZE_BUF, fp);
if ( (fgets(szParamBuf, SIZE_BUF, fp) == NULL))
{
sprintf(szErrorMsg, " Error - cannot fgets a line after expected [COMET_ENZYME_INFO]\n");
logout(szErrorMsg);
}

// Get enzyme specificity.
char szSearchEnzymeName[ENZYME_NAME_LEN];
Expand Down
4 changes: 4 additions & 0 deletions CometSearch/CometData.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ struct VarMods
{
double dVarModMass;
double dNeutralLoss;
double dNeutralLoss2; // 2nd neutral fragment NL
int iBinaryMod;
int iMaxNumVarModAAPerMod;
int iMinNumVarModAAPerMod;
Expand All @@ -244,6 +245,7 @@ struct VarMods
iWhichTerm = 0;
dVarModMass = 0.0;
dNeutralLoss = 0.0;
dNeutralLoss2 = 0.0;
szVarModChar[0] = '\0';
bNtermMod = false;
bCtermMod = false;
Expand All @@ -260,6 +262,7 @@ struct VarMods
iWhichTerm = a.iWhichTerm;
dVarModMass = a.dVarModMass;
dNeutralLoss = a.dNeutralLoss;
dNeutralLoss2 = a.dNeutralLoss2;
strcpy(szVarModChar, a.szVarModChar);
bNtermMod = a.bNtermMod;
bCtermMod = a.bCtermMod;
Expand All @@ -277,6 +280,7 @@ struct VarMods
dVarModMass = a.dVarModMass;
strcpy(szVarModChar, a.szVarModChar);
dNeutralLoss = a.dNeutralLoss;
dNeutralLoss2 = a.dNeutralLoss2;
bNtermMod = a.bNtermMod;
bCtermMod = a.bCtermMod;
bUseMod = a.bUseMod;
Expand Down
1 change: 1 addition & 0 deletions CometSearch/CometDataInternal.h
Original file line number Diff line number Diff line change
Expand Up @@ -805,6 +805,7 @@ struct StaticParams
variableModParameters.varModList[i].iWhichTerm = 0; // specify N (0) or C-term (1)
variableModParameters.varModList[i].dVarModMass = 0.0;
variableModParameters.varModList[i].dNeutralLoss = 0.0;
variableModParameters.varModList[i].dNeutralLoss2 = 0.0;
strcpy(variableModParameters.varModList[i].szVarModChar, "X");

#ifdef CRUX
Expand Down
6 changes: 4 additions & 2 deletions CometSearch/CometFragmentIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -793,8 +793,9 @@ bool CometFragmentIndex::WritePlainPeptideIndex(ThreadPool *tp)
// write VariableMod:
fprintf(fp, "VariableMod:");
for (int x = 0; x < FRAGINDEX_VMODS; ++x)
fprintf(fp, " %lf:%lf:%s", g_staticParams.variableModParameters.varModList[x].dVarModMass,
fprintf(fp, " %lf:%lf:%lf:%s", g_staticParams.variableModParameters.varModList[x].dVarModMass,
g_staticParams.variableModParameters.varModList[x].dNeutralLoss,
g_staticParams.variableModParameters.varModList[x].dNeutralLoss2,
g_staticParams.variableModParameters.varModList[x].szVarModChar);
fprintf(fp, "\n");

Expand Down Expand Up @@ -1021,8 +1022,9 @@ bool CometFragmentIndex::ReadPlainPeptideIndex(void)

iss >> subStr; // parse each word which is a colon delimited triplet pair for modmass:neutralloss:modchars

int iRet = sscanf(subStr.c_str(), "%lf:%lf:%s", &(g_staticParams.variableModParameters.varModList[iNumMods].dVarModMass),
int iRet = sscanf(subStr.c_str(), "%lf:%lf:%lf:%s", &(g_staticParams.variableModParameters.varModList[iNumMods].dVarModMass),
&(g_staticParams.variableModParameters.varModList[iNumMods].dNeutralLoss),
&(g_staticParams.variableModParameters.varModList[iNumMods].dNeutralLoss2),
g_staticParams.variableModParameters.varModList[iNumMods].szVarModChar);

iNumMods++;
Expand Down
10 changes: 8 additions & 2 deletions CometSearch/CometMassSpecUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -387,11 +387,17 @@ void CometMassSpecUtils::GetPrevNextAA(FILE *fpfasta,

if (strSeq.size() < 1)
{
printf("Error - parsed sequence in GetPrevNextAA() is empty. File pointer %ld, query %d, result %d.\n", *it, iWhichQuery, iWhichResult);
printf(" Error: parsed sequence in GetPrevNextAA() is empty. File pointer %ld, query %d, result %d.\n", *it, iWhichQuery, iWhichResult);
pOutput[iWhichResult].cPrevAA = pOutput[iWhichResult].cNextAA = '-';
return;
}
char* szSequence = (char*)malloc(strSeq.size() + 1);

if (szSequence == NULL)
{
printf(" Error: cannot allocate memory for szSequence[%d]\n", strSeq.size() + 1);
exit(1);
}
strcpy(szSequence, strSeq.c_str());

int iLenSequence = (int)strlen(szSequence);
Expand Down Expand Up @@ -512,7 +518,7 @@ void CometMassSpecUtils::GetPrevNextAA(FILE *fpfasta,

if (!bFound)
{
printf(" Error, did not match peptide in GetPrevNextAA(); pep %s, iWhichQuery %d, iWhichResult %d\n",
printf(" Error: did not match peptide in GetPrevNextAA(); pep %s, iWhichQuery %d, iWhichResult %d\n",
pOutput[iWhichResult].szPeptide, iWhichQuery, iWhichResult);
exit(1);
}
Expand Down
115 changes: 72 additions & 43 deletions CometSearch/CometPostAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -532,68 +532,97 @@ void CometPostAnalysis::CalculateSP(Results *pOutput,
{
for (int iMod = 0; iMod < VMODS; iMod++)
{
if (iWhichIonSeries <= 2) // abc ions
for (int iWhichNL = 0; iWhichNL < 2; ++iWhichNL)
{
if (iCountNLB[iMod][iii] > 0)
if (iWhichIonSeries <= 2) // abc ions
{
int iScaleFactor = iCountNLB[iMod][iii];
double dNewMass = dFragmentIonMass - (iScaleFactor * g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss / ctCharge);

if (dNewMass >= 0)
if (iCountNLB[iMod][iii] > 0)
{
int iFragmentIonMass = BIN(dNewMass);

fSpScore = FindSpScore(g_pvQuery.at(iWhichQuery), iFragmentIonMass, iMax);
int iScaleFactor = iCountNLB[iMod][iii];
double dNewMass;

if (iWhichNL == 0)
{
if (g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss == 0.0)
continue;
dNewMass = dFragmentIonMass - (iScaleFactor * g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss / ctCharge);
}
else
{
if (g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss2 == 0.0)
continue;
dNewMass = dFragmentIonMass - (iScaleFactor * g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss2 / ctCharge);
}

if (fSpScore > FLOAT_ZERO)
if (dNewMass >= 0)
{
iAddMatchedFragment = 1;
int iFragmentIonMass = BIN(dNewMass);

// Simple sum intensity.
dTmpIntenMatch += fSpScore;
fSpScore = FindSpScore(g_pvQuery.at(iWhichQuery), iFragmentIonMass, iMax);

// Increase score for consecutive fragment ion series matches.
if (ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge])
dAddConsecutive = 0.075;
if (fSpScore > FLOAT_ZERO)
{
iAddMatchedFragment = 1;

ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge] = 1;
}
else
{
ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge] = 0;
// Simple sum intensity.
dTmpIntenMatch += fSpScore;

// Increase score for consecutive fragment ion series matches.
if (ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge])
dAddConsecutive = 0.075;

ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge] = 1;
}
else
{
ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge] = 0;
}
}
}
}
}
else // xyz ions
{
if (iCountNLY[iMod][iii] > 0)
else // xyz ions
{
int iScaleFactor = iCountNLY[iMod][iii];
double dNewMass = dFragmentIonMass - (iScaleFactor * g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss / ctCharge);

if (dNewMass >= 0)
if (iCountNLY[iMod][iii] > 0)
{
int iFragmentIonMass = BIN(dNewMass);
int iScaleFactor = iCountNLY[iMod][iii];
double dNewMass;

fSpScore = FindSpScore(g_pvQuery.at(iWhichQuery), iFragmentIonMass, iMax);
if (iWhichNL == 0)
{
if (g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss == 0.0)
continue;
dNewMass = dFragmentIonMass - (iScaleFactor * g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss / ctCharge);
}
else
{
if (g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss2 == 0.0)
continue;
dNewMass = dFragmentIonMass - (iScaleFactor * g_staticParams.variableModParameters.varModList[iMod].dNeutralLoss2 / ctCharge);
}

if (fSpScore > FLOAT_ZERO)
if (dNewMass >= 0)
{
iAddMatchedFragment = 1;
int iFragmentIonMass = BIN(dNewMass);

// Simple sum intensity.
dTmpIntenMatch += fSpScore;
fSpScore = FindSpScore(g_pvQuery.at(iWhichQuery), iFragmentIonMass, iMax);

// Increase score for consecutive fragment ion series matches.
if (ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge])
dAddConsecutive = 0.075;
if (fSpScore > FLOAT_ZERO)
{
iAddMatchedFragment = 1;

ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge] = 1;
}
else
{
ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge] = 0;
// Simple sum intensity.
dTmpIntenMatch += fSpScore;

// Increase score for consecutive fragment ion series matches.
if (ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge])
dAddConsecutive = 0.075;

ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge] = 1;
}
else
{
ionSeries[iWhichIonSeries].bPreviousMatch[ctCharge] = 0;
}
}
}
}
Expand Down
Loading

0 comments on commit 50a6902

Please sign in to comment.