progressDialog.setTitle("Creating PRIDE XML File. Please Wait... (Part 2 of 2: Exporting IDs)");
long increment = totalProgress / (2 * identification.getProteinIdentification().size());
PSMaps pSMaps = new PSMaps();
pSMaps = (PSMaps) identification.getUrParam(pSMaps);
ProteinMap proteinTargetDecoyMap = pSMaps.getProteinMap();
PsmSpecificMap psmTargetDecoyMap = pSMaps.getPsmSpecificMap();
PeptideSpecificMap peptideTargetDecoyMap = pSMaps.getPeptideSpecificMap();
// get the list of algorithms used
String searchEngineReport;
ArrayList<Integer> seList = projectDetails.getIdentificationAlgorithms();
Collections.sort(seList);
searchEngineReport = Advocate.getAdvocate(seList.get(0)).getName();
for (int i = 1; i < seList.size(); i++) {
if (i == seList.size() - 1) {
searchEngineReport += " and ";
} else {
searchEngineReport += ", ";
}
searchEngineReport += Advocate.getAdvocate(seList.get(i)).getName();
}
searchEngineReport += " post-processed by PeptideShaker v" + peptideShakerVersion;
for (String spectrumFile : identification.getSpectrumFiles()) {
identification.loadSpectrumMatches(spectrumFile, null);
}
identification.loadPeptideMatches(null);
identification.loadProteinMatches(null);
for (String spectrumFile : identification.getSpectrumFiles()) {
identification.loadSpectrumMatchParameters(spectrumFile, psmProbabilities, null);
}
identification.loadPeptideMatchParameters(peptideProbabilities, null);
identification.loadProteinMatchParameters(proteinProbabilities, null);
for (String proteinKey : identification.getProteinIdentification()) {
if (waitingHandler.isRunCanceled()) {
break;
}
ProteinMatch proteinMatch = identification.getProteinMatch(proteinKey);
proteinProbabilities = (PSParameter) identification.getProteinMatchParameter(proteinKey, proteinProbabilities);
double confidenceThreshold;
br.write(getCurrentTabSpace() + "<GelFreeIdentification>" + System.getProperty("line.separator"));
tabCounter++;
// protein accession and database
br.write(getCurrentTabSpace() + "<Accession>" + proteinMatch.getMainMatch() + "</Accession>" + System.getProperty("line.separator"));
br.write(getCurrentTabSpace() + "<Database>" + sequenceFactory.getHeader(proteinMatch.getMainMatch()).getDatabaseType() + "</Database>" + System.getProperty("line.separator"));
identification.loadPeptideMatches(proteinMatch.getPeptideMatchesKeys(), null); // @TODO: should use the progress dialog here, but this messes up the overall progress bar...
identification.loadPeptideMatchParameters(proteinMatch.getPeptideMatchesKeys(), peptideProbabilities, null);
for (String peptideKey : proteinMatch.getPeptideMatchesKeys()) {
if (waitingHandler.isRunCanceled()) {
break;
}
PeptideMatch currentMatch = identification.getPeptideMatch(peptideKey);
peptideProbabilities = (PSParameter) identification.getPeptideMatchParameter(peptideKey, peptideProbabilities);
identification.loadSpectrumMatches(currentMatch.getSpectrumMatches(), null); // @TODO: should use the progress dialog here, but this messes up the overall progress bar...
identification.loadSpectrumMatchParameters(currentMatch.getSpectrumMatches(), psmProbabilities, null);
for (String spectrumKey : currentMatch.getSpectrumMatches()) {
if (waitingHandler.isRunCanceled()) {
break;
}
psmProbabilities = (PSParameter) identification.getSpectrumMatchParameter(spectrumKey, psmProbabilities);
SpectrumMatch spectrumMatch = identification.getSpectrumMatch(spectrumKey);
PeptideAssumption bestAssumption = spectrumMatch.getBestPeptideAssumption();
Peptide tempPeptide = bestAssumption.getPeptide();
// the peptide
br.write(getCurrentTabSpace() + "<PeptideItem>" + System.getProperty("line.separator"));
tabCounter++;
// peptide sequence
br.write(getCurrentTabSpace() + "<Sequence>" + tempPeptide.getSequence() + "</Sequence>" + System.getProperty("line.separator"));
// peptide start and end
String proteinAccession = proteinMatch.getMainMatch();
String proteinSequence = sequenceFactory.getProtein(proteinAccession).getSequence();
int peptideStart = proteinSequence.lastIndexOf(tempPeptide.getSequence()) + 1; // @TODO: lastIndexOf should be avoided!!
br.write(getCurrentTabSpace() + "<Start>" + peptideStart + "</Start>" + System.getProperty("line.separator"));
br.write(getCurrentTabSpace() + "<End>" + (peptideStart + tempPeptide.getSequence().length() - 1) + "</End>" + System.getProperty("line.separator"));
// spectrum index reference
br.write(getCurrentTabSpace() + "<SpectrumReference>" + spectrumIndexes.get(spectrumMatch.getKey()) + "</SpectrumReference>" + System.getProperty("line.separator"));
// modifications
writePtms(tempPeptide);
// fragment ions
writeFragmentIons(spectrumMatch);
// Get scores
HashMap<Integer, Double> eValues = new HashMap<Integer, Double>();
Double mascotScore = null, msAmandaScore = null;
for (int se : spectrumMatch.getAdvocates()) {
for (double eValue : spectrumMatch.getAllAssumptions(se).keySet()) {
for (SpectrumIdentificationAssumption assumption : spectrumMatch.getAllAssumptions(se).get(eValue)) {
if (assumption instanceof PeptideAssumption) {
PeptideAssumption peptideAssumption = (PeptideAssumption) assumption;
if (peptideAssumption.getPeptide().isSameSequenceAndModificationStatus(bestAssumption.getPeptide(), sequenceMatchingPreferences)) {
if (!eValues.containsKey(se) || eValues.get(se) > eValue) {
eValues.put(se, eValue);
if (se == Advocate.mascot.getIndex()) {
mascotScore = ((MascotScore) assumption.getUrParam(new MascotScore(0))).getScore();
} else if (se == Advocate.msAmanda.getIndex()
&& peptideAssumption.getUrParam(new MsAmandaScore()) != null) {
msAmandaScore = ((MsAmandaScore) assumption.getUrParam(new MsAmandaScore())).getScore();
}
}
}
}
}
}
}
// PTM scores
ArrayList<String> modifications = new ArrayList<String>();
for (ModificationMatch modificationMatch : bestAssumption.getPeptide().getModificationMatches()) {
if (modificationMatch.isVariable()) {
if (!modifications.contains(modificationMatch.getTheoreticPtm())) {
modifications.add(modificationMatch.getTheoreticPtm());
}
}
}
StringBuilder dScore = new StringBuilder();
Collections.sort(modifications);
PSPtmScores ptmScores = new PSPtmScores();
for (String mod : modifications) {
if (spectrumMatch.getUrParam(ptmScores) != null) {
if (dScore.length() > 0) {
dScore.append(", ");
}
ptmScores = (PSPtmScores) spectrumMatch.getUrParam(new PSPtmScores());
dScore.append(mod).append(" (");
if (ptmScores != null && ptmScores.getPtmScoring(mod) != null) {
PtmScoring ptmScoring = ptmScores.getPtmScoring(mod);
boolean firstSite = true;
ArrayList<Integer> sites = new ArrayList<Integer>(ptmScoring.getDSites());
Collections.sort(sites);
for (int site : sites) {
if (firstSite) {
firstSite = false;
} else {
dScore.append(", ");
}
dScore.append(site).append(": ").append(ptmScoring.getDeltaScore(site));
}
} else {
dScore.append("Not Scored");
}
dScore.append(")");
}
}
StringBuilder probabilisticScore = new StringBuilder();
if (ptmScoringPreferences.isProbabilitsticScoreCalculation()) {
for (String mod : modifications) {
if (spectrumMatch.getUrParam(ptmScores) != null) {
if (probabilisticScore.length() > 0) {
probabilisticScore.append(", ");
}
ptmScores = (PSPtmScores) spectrumMatch.getUrParam(new PSPtmScores());
probabilisticScore.append(mod).append(" (");
if (ptmScores != null && ptmScores.getPtmScoring(mod) != null) {
PtmScoring ptmScoring = ptmScores.getPtmScoring(mod);
boolean firstSite = true;
ArrayList<Integer> sites = new ArrayList<Integer>(ptmScoring.getProbabilisticSites());
Collections.sort(sites);
for (int site : sites) {
if (firstSite) {
firstSite = false;
} else {
probabilisticScore.append(", ");
}
probabilisticScore.append(site).append(": ").append(ptmScoring.getProbabilisticScore(site));
}
} else {
probabilisticScore.append("Not Scored");
}
probabilisticScore.append(")");
}
}
}
// @TODO: the line below uses the protein tree, which has to be rebuilt if not available...
ArrayList<String> peptideParentProteins = tempPeptide.getParentProteins(sequenceMatchingPreferences);
String peptideProteins = "";
for (String accession : peptideParentProteins) {
if (!peptideProteins.equals("")) {
peptideProteins += ", ";
}
peptideProteins += accession;
}
// additional peptide id parameters
br.write(getCurrentTabSpace() + "<additional>" + System.getProperty("line.separator"));
tabCounter++;
br.write(getCurrentTabSpace() + "<userParam name=\"Spectrum File\" value=\"" + Spectrum.getSpectrumFile(spectrumKey) + "\" />" + System.getProperty("line.separator"));
writeCvTerm(new CvTerm("PSI-MS", "MS:1000796", "Spectrum Title", "" + StringEscapeUtils.escapeHtml4(Spectrum.getSpectrumTitle(spectrumKey))));
br.write(getCurrentTabSpace() + "<userParam name=\"Protein Inference\" value=\"" + peptideProteins + "\" />" + System.getProperty("line.separator"));
br.write(getCurrentTabSpace() + "<userParam name=\"Peptide Confidence\" value=\"" + Util.roundDouble(peptideProbabilities.getPeptideConfidence(), CONFIDENCE_DECIMALS) + "\" />" + System.getProperty("line.separator"));
confidenceThreshold = peptideTargetDecoyMap.getTargetDecoyMap(peptideTargetDecoyMap.getCorrectedKey(peptideProbabilities.getSpecificMapKey())).getTargetDecoyResults().getConfidenceLimit();
br.write(getCurrentTabSpace() + "<userParam name=\"Peptide Confidence Threshold\" value=\"" + Util.roundDouble(confidenceThreshold, CONFIDENCE_DECIMALS) + "\" />" + System.getProperty("line.separator"));
MatchValidationLevel matchValidationLevel = peptideProbabilities.getMatchValidationLevel();
if (matchValidationLevel == MatchValidationLevel.doubtful && !peptideProbabilities.getReasonDoubtful().equals("")) {
br.write(getCurrentTabSpace() + "<userParam name=\"Peptide Validation\" value=\"" + matchValidationLevel + " (" + StringEscapeUtils.escapeHtml4(peptideProbabilities.getReasonDoubtful()) + ")" + "\" />" + System.getProperty("line.separator"));
} else {
br.write(getCurrentTabSpace() + "<userParam name=\"Peptide Validation\" value=\"" + matchValidationLevel + "\" />" + System.getProperty("line.separator"));
}
br.write(getCurrentTabSpace() + "<userParam name=\"PSM Confidence\" value=\"" + Util.roundDouble(psmProbabilities.getPsmConfidence(), CONFIDENCE_DECIMALS) + "\" />" + System.getProperty("line.separator"));
Integer charge = new Integer(psmProbabilities.getSpecificMapKey());
String fileName = Spectrum.getSpectrumFile(spectrumKey);
confidenceThreshold = psmTargetDecoyMap.getTargetDecoyMap(charge, fileName).getTargetDecoyResults().getConfidenceLimit();
br.write(getCurrentTabSpace() + "<userParam name=\"PSM Confidence Threshold\" value=\"" + Util.roundDouble(confidenceThreshold, CONFIDENCE_DECIMALS) + "\" />" + System.getProperty("line.separator"));
matchValidationLevel = psmProbabilities.getMatchValidationLevel();
if (matchValidationLevel == MatchValidationLevel.doubtful && !psmProbabilities.getReasonDoubtful().equals("")) {
br.write(getCurrentTabSpace() + "<userParam name=\"PSM Validation\" value=\"" + matchValidationLevel + " (" + StringEscapeUtils.escapeHtml4(psmProbabilities.getReasonDoubtful()) + ")" + "\" />" + System.getProperty("line.separator"));
} else {
br.write(getCurrentTabSpace() + "<userParam name=\"PSM Validation\" value=\"" + matchValidationLevel + "\" />" + System.getProperty("line.separator"));
}
writeCvTerm(new CvTerm("PSI-MS", "MS:1000041", "Charge State", "" + bestAssumption.getIdentificationCharge().value)); // @TODO: is 2+ etc supported?
//br.write(getCurrentTabSpace() + "<userParam name=\"Identified Charge\" value=\"" + bestAssumption.getIdentificationCharge().value + "\" />" + System.getProperty("line.separator"));
// search engine specific parameters
ArrayList<Integer> searchEngines = new ArrayList<Integer>(eValues.keySet());
Collections.sort(searchEngines);
// add the search engine e-values
ArrayList<Integer> algorithms = new ArrayList<Integer>(eValues.keySet());
Collections.sort(algorithms);
for (int tempAdvocate : algorithms) {
double eValue = eValues.get(tempAdvocate);
if (tempAdvocate == Advocate.msgf.getIndex()) {
writeCvTerm(new CvTerm("PSI-MS", "MS:1002052", "MS-GF:SpecEValue", Double.toString(eValue)));
} else if (tempAdvocate == Advocate.mascot.getIndex()) {
writeCvTerm(new CvTerm("PSI-MS", "MS:1001172", "Mascot:expectation value", Double.toString(eValue)));
} else if (tempAdvocate == Advocate.omssa.getIndex()) {
writeCvTerm(new CvTerm("PSI-MS", "MS:1001328", "OMSSA:evalue", Double.toString(eValue)));
} else if (tempAdvocate == Advocate.xtandem.getIndex()) {
writeCvTerm(new CvTerm("PSI-MS", "MS:1001330", "X!Tandem:expect", Double.toString(eValue)));
} else if (tempAdvocate == Advocate.comet.getIndex()) {
writeCvTerm(new CvTerm("PSI-MS", "MS:1002257", "Comet:expectation value", Double.toString(eValue)));
} else {
br.write(getCurrentTabSpace() + "<userParam name=\"" + Advocate.getAdvocate(tempAdvocate).getName()
+ " e-value\" value=\"" + eValue + "\" />" + System.getProperty("line.separator")); // @TODO: add cv params for the other new advocates
}
// @TODO: add scores for MyriMatch!
// @TODO: add generic e-value for user algorithms?
}
// add the additional search engine scores
if (mascotScore != null) {
writeCvTerm(new CvTerm("PSI-MS", "MS:1001171", "Mascot:score", "" + mascotScore));
}
if (msAmandaScore != null) {
writeCvTerm(new CvTerm("PSI-MS", "MS:1002319", "Amanda:AmandaScore", "" + msAmandaScore));
}
// @TODO: add additional scores for OMSSA and X!Tandem as well
// "MS:1001329", "OMSSA:pvalue"
// "PRIDE:0000182","X|Tandem Z score"
// "MS:1001331", "X!Tandem:hyperscore"
// PTM scoring
if (dScore.length() > 0) {
br.write(getCurrentTabSpace() + "<userParam name=\"PTM D-score\" value=\"" + dScore + "\" />" + System.getProperty("line.separator"));
}
if (ptmScoringPreferences.isProbabilitsticScoreCalculation() && probabilisticScore.length() > 0) {
br.write(getCurrentTabSpace() + "<userParam name=\"PTM "
+ ptmScoringPreferences.getSelectedProbabilisticScore().getName()
+ "\" value=\"" + probabilisticScore + "\" />" + System.getProperty("line.separator"));
}
tabCounter--;
br.write(getCurrentTabSpace() + "</additional>" + System.getProperty("line.separator"));
tabCounter--;
br.write(getCurrentTabSpace() + "</PeptideItem>" + System.getProperty("line.separator"));
}
}
// additional protein id parameters
br.write(getCurrentTabSpace() + "<additional>" + System.getProperty("line.separator"));
tabCounter++;
if (ProteinMatch.isDecoy(proteinKey)) {
br.write(getCurrentTabSpace() + "<userParam name=\"Decoy\" value=\"1\" />" + System.getProperty("line.separator"));
} else {
br.write(getCurrentTabSpace() + "<userParam name=\"Decoy\" value=\"0\" />" + System.getProperty("line.separator"));
}
try {
if (spectrumCountingPreferences.getSelectedMethod() == SpectrumCountingPreferences.SpectralCountingMethod.EMPAI) {
writeCvTerm(new CvTerm("PSI-MS", "MS:1001905", "emPAI value", "" + identificationFeaturesGenerator.getSpectrumCounting(proteinKey)));
} else {
br.write(getCurrentTabSpace() + "<userParam name=\"NSAF+\" value=\""
+ identificationFeaturesGenerator.getSpectrumCounting(proteinKey) + "\" />" + System.getProperty("line.separator"));
}
} catch (Exception e) {
e.printStackTrace(); // @TODO: add better error handling
}
MatchValidationLevel matchValidationLevel = psmProbabilities.getMatchValidationLevel();
if (matchValidationLevel == MatchValidationLevel.doubtful && !proteinProbabilities.getReasonDoubtful().equals("")) {
br.write(getCurrentTabSpace() + "<userParam name=\"Protein Validation\" value=\"" + matchValidationLevel + " (" + StringEscapeUtils.escapeHtml4(proteinProbabilities.getReasonDoubtful()) + ")" + "\" />" + System.getProperty("line.separator"));
} else {
br.write(getCurrentTabSpace() + "<userParam name=\"Protein Validation\" value=\"" + matchValidationLevel + "\" />" + System.getProperty("line.separator"));
}
String otherProteins = "";
boolean first = true;
for (String otherAccession : proteinMatch.getTheoreticProteinsAccessions()) {
if (!otherAccession.equals(proteinMatch.getMainMatch())) {
if (first) {
first = false;
} else {
otherAccession += ", ";
}
otherProteins += otherAccession;
}
}
if (!otherProteins.equals("")) {
br.write(getCurrentTabSpace() + "<userParam name=\"Secondary proteins\" value=\"" + otherProteins + "\" />" + System.getProperty("line.separator"));
}
tabCounter--;
br.write(getCurrentTabSpace() + "</additional>" + System.getProperty("line.separator"));
// protein score
br.write(getCurrentTabSpace() + "<Score>" + Util.roundDouble(proteinProbabilities.getProteinConfidence(), CONFIDENCE_DECIMALS) + "</Score>" + System.getProperty("line.separator"));
// protein threshold
confidenceThreshold = proteinTargetDecoyMap.getTargetDecoyMap().getTargetDecoyResults().getConfidenceLimit();
br.write(getCurrentTabSpace() + "<Threshold>" + Util.roundDouble(confidenceThreshold, CONFIDENCE_DECIMALS) + "</Threshold>" + System.getProperty("line.separator"));
// the search engines used
br.write(getCurrentTabSpace() + "<SearchEngine>" + searchEngineReport + "</SearchEngine>" + System.getProperty("line.separator"));