diff --git a/pypgatk/commands/validate_peptides.py b/pypgatk/commands/validate_peptides.py
index 0ecbb47..9c6466b 100644
--- a/pypgatk/commands/validate_peptides.py
+++ b/pypgatk/commands/validate_peptides.py
@@ -21,12 +21,12 @@
@click.option('-n', '--number_of_processes', help='Used to specify the number of processes. Default is 40.')
@click.option('-r', '--relative', help='When using ppm as ions_tolerance (not Da), it needs to be turned on',
is_flag=True)
-@click.option('-msgf', '--msgf',
- help='If it is the standard format of MSGF output, please turn on this switch, otherwise it defaults to mzTab format',
+@click.option('-m', '--mztab',
+ help='If the tsv was obtained from mzTab, please enable this option. Default to tsv obtained from parquet',
is_flag=True)
@click.pass_context
def validate_peptides(ctx, config_file, mzml_path, mzml_files, infile_name, outfile_name, ions_tolerance,
- number_of_processes, relative, msgf):
+ number_of_processes, relative, mztab):
config_data = None
if config_file is not None:
config_data = read_yaml_from_file(config_file)
@@ -47,8 +47,8 @@ def validate_peptides(ctx, config_file, mzml_path, mzml_files, infile_name, outf
pipeline_arguments[ValidatePeptidesService.CONFIG_NUMBER_OF_PROCESSES] = number_of_processes
if relative is not None:
pipeline_arguments[ValidatePeptidesService.CONFIG_RELATIVE] = relative
- if msgf is not None:
- pipeline_arguments[ValidatePeptidesService.CONFIG_MSGF] = msgf
+ if mztab is not None:
+ pipeline_arguments[ValidatePeptidesService.CONFIG_MZTAB] = mztab
validate_peptides_service = ValidatePeptidesService(config_data, pipeline_arguments)
if validate_flag:
diff --git a/pypgatk/proteogenomics/blast_get_position.py b/pypgatk/proteogenomics/blast_get_position.py
index 4196fce..f631df5 100644
--- a/pypgatk/proteogenomics/blast_get_position.py
+++ b/pypgatk/proteogenomics/blast_get_position.py
@@ -8,61 +8,69 @@
from pypgatk.toolbox.general import ParameterConfiguration
+def get_details(fasta, peptide):
+ res = []
+ i = 0
+ j = 0
+ for AA1, AA2 in zip(fasta, peptide):
+ i += 1
+ j += 1
+ if AA1 == AA2:
+ continue
+ else:
+ res.append(str(i) + "|" + AA1 + ">" + AA2)
+ return res
-def _blast_set(fasta_set, peptide):
+def peptide_blast_protein(fasta, peptide):
length = len(peptide)
- position_set = set()
- for fasta in fasta_set:
- if len(fasta) >= length:
- alignments_score = pairwise2.align.localms(sequenceA=fasta, sequenceB=peptide, match=1, mismatch=0, open=-1, extend=0, score_only=True)
- if alignments_score == length:
- return "canonical"
- elif alignments_score == length - 1:
- alignments_local = pairwise2.align.localms(sequenceA=fasta, sequenceB=peptide, match=1, mismatch=0, open=-1, extend=0)
- for alignment in alignments_local:
- # insertion e.g., ABCDMEFGH<----ABCDEFGH
- if alignment.end - alignment.start == length + 1:
- s = fasta[alignment.start:alignment.end]
- for i in range(length):
- if peptide[i] != s[i]:
- position_set.add(i + 1)
- break
- # substitution e.g., ABCDMFGH<----ABCDEFGH
- elif alignment.end - alignment.start == length:
- s = fasta[alignment.start:alignment.end]
- for i in range(length):
- if peptide[i] != s[i]:
- position_set.add(i + 1)
- break
- # substitution e.g., ABCDEFGM<----ABCDEFGH
- elif alignment.end - alignment.start == length - 1:
- s = fasta[alignment.start:alignment.end]
- if peptide[0] != s[0]:
- position_set.add(1)
- elif peptide[-1] != s[-1]:
- position_set.add(length)
- elif alignments_score == length - 2:
- alignments_local = pairwise2.align.localms(sequenceA=fasta, sequenceB=peptide, match=1, mismatch=-1,
- open=-1, extend=0)
- for alignment in alignments_local:
- # deletion e.g., ABCEFGH<----ABCDEFGH
- if alignment.end - alignment.start == length and alignment.score == length - 2:
- s = fasta[alignment.start:alignment.end - 1]
- if pairwise2.align.localms(sequenceA=s, sequenceB=peptide, match=1, mismatch=0, open=0,
- extend=0, score_only=True) == length - 1:
- for i in range(length - 1):
- if peptide[i] != s[i]:
- position_set.add(i + 1)
- break
- if position_set:
- return position_set
+ mismatch = []
+ if len(fasta) >= length:
+ score = pairwise2.align.localms(sequenceA=fasta, sequenceB=peptide,
+ match=1, mismatch=0, open=-2, extend=-2, score_only=True)
+ if score == length-1:
+ alignment = pairwise2.align.localms(sequenceA=fasta, sequenceB=peptide,
+ match=1, mismatch=0, open=-2, extend=-2)[0]
+ if alignment.end - alignment.start == length:
+ mismatch = get_details(alignment.seqA[alignment.start:alignment.end], alignment.seqB[alignment.start:alignment.end])
+ elif alignment.end - alignment.start == length-1:
+ res = get_details(alignment.seqA[alignment.start:alignment.end+1], alignment.seqB[alignment.start:alignment.end+1])
+ if len(res) == 1:
+ if res[0].split(">")[1]!="-":
+ mismatch = res
+ else:
+ mismatch = get_details(alignment.seqA[alignment.start-1:alignment.end], alignment.seqB[alignment.start-1:alignment.end])
+ elif len(res) == 0:
+ mismatch = get_details(alignment.seqA[alignment.start-1:alignment.end], alignment.seqB[alignment.start-1:alignment.end])
+ else:
+ print("Number of mismatch Error")
+ return mismatch
+
+def _blast_set(fasta_dict, peptide):
+ positions = dict()
+ for fasta in fasta_dict.keys():
+ mismatch = peptide_blast_protein(fasta, peptide)
+ if len(mismatch) == 1:
+ if positions.get(mismatch[0]):
+ positions[mismatch[0]].update(fasta_dict[fasta])
+ else:
+ positions[mismatch[0]] = fasta_dict[fasta]
+ elif len(mismatch) > 1:
+ print("Number of mismatch > 1")
+ print(peptide)
+ print(fasta)
+ print(mismatch)
+ if positions:
+ res = []
+ for key,value in positions.items():
+ splits = key.split("|")
+ splits.append(",".join(value))
+ res.append(splits)
+ return res
else:
return "non-canonical"
-
class BlastGetPositionService(ParameterConfiguration):
CONFIG_KEY_BlastGetPosition = 'blast_get_position'
- # CONFIG_CANONICAL_PEPTIDE_PREFIX = 'canonical_peptide_prefix'
CONFIG_INPUT_REFERENCE_DATABASE = 'input_reference_database'
CONFIG_NUMBER_OF_PROCESSES = 'number_of_processes'
@@ -79,9 +87,14 @@ def __init__(self, config_data, pipeline_arguments):
self._number_of_processes = self.get_blast_parameters(variable=self.CONFIG_NUMBER_OF_PROCESSES,
default_value='40')
- self.fa_set = set()
+
+ self.fasta_dict = dict()
for j in SeqIO.parse(self._input_reference_database, "fasta"):
- self.fa_set.add(str(j.seq))
+ if self.fasta_dict.get(str(j.seq)):
+ self.fasta_dict[str(j.seq)].add(j.id)
+ else:
+ self.fasta_dict[str(j.seq)] = {j.id}
+
self.blast_dict = Manager().dict()
def get_blast_parameters(self, variable: str, default_value):
@@ -92,7 +105,7 @@ def get_blast_parameters(self, variable: str, default_value):
variable in self.get_default_parameters()[self.CONFIG_KEY_BlastGetPosition]:
value_return = self.get_default_parameters()[self.CONFIG_KEY_BlastGetPosition][variable]
return value_return
-
+
def _blast_canonical(self, df):
seq_set = set(df["sequence"].to_list())
@@ -104,7 +117,7 @@ def _blast_canonical(self, df):
auto.make_automaton()
- for protein_seq in self.fa_set:
+ for protein_seq in self.fasta_dict.keys():
for end_ind, found in auto.iter(protein_seq):
seq_dict[found] = "canonical"
print("Found", found, "at position", end_ind, "in protein sequence")
@@ -113,7 +126,7 @@ def _blast_canonical(self, df):
return df
def _result(self, sequence):
- self.blast_dict[sequence] = _blast_set(self.fa_set, sequence)
+ self.blast_dict[sequence] = _blast_set(self.fasta_dict, sequence)
def blast(self, input_psm_to_blast, output_psm):
"""
@@ -137,7 +150,7 @@ def blast(self, input_psm_to_blast, output_psm):
else:
raise ValueError("The input file format is not supported.")
- psm = psm.head(4)
+
psm = self._blast_canonical(psm)
first_filter = psm[psm.position == "canonical"]
@@ -163,25 +176,24 @@ def blast(self, input_psm_to_blast, output_psm):
psm_to_findpos = psm_to_findpos[psm_to_findpos.position != "non-canonical"]
if len(psm_to_findpos) > 0:
- psm_to_findpos["var_num"] = psm_to_findpos.apply(lambda x: len(x["position"]), axis=1)
- psm_to_findpos = psm_to_findpos.loc[psm_to_findpos.index.repeat(psm_to_findpos["var_num"])]
- psm_to_findpos["var_num"].iloc[0] = 0
- psm_id = psm_to_findpos["usi"].iloc[0]
- for i in range(1, psm_to_findpos.shape[0]):
- if psm_to_findpos["usi"].iloc[i] == psm_id:
- psm_to_findpos["var_num"].iloc[i] = psm_to_findpos["var_num"].iloc[i - 1] + 1
- else:
- psm_id = psm_to_findpos["usi"].iloc[i]
- psm_to_findpos["var_num"].iloc[i] = 0
- psm_to_findpos["position"] = psm_to_findpos.apply(
- lambda x: str(x["position"])[1:-1].split(",")[x["var_num"]],
- axis=1)
- psm_to_findpos.drop(columns="var_num", axis=1, inplace=True)
- psm_to_findpos["position"] = psm_to_findpos.apply(lambda x: x["position"].replace(' ', ''), axis=1)
+ psm_to_findpos = psm_to_findpos.explode("position", ignore_index=True)
+ psm_to_findpos["variant"] = psm_to_findpos["position"].apply(lambda x : x[1])
+ psm_to_findpos["protein"] = psm_to_findpos["position"].apply(lambda x : x[2])
+ psm_to_findpos["position"] = psm_to_findpos["position"].apply(lambda x : x[0])
all_psm_out = pd.concat([first_filter, second_filter, non_filter, psm_to_findpos], axis=0, join='outer')
all_psm_out = all_psm_out.sort_values("usi")
- all_psm_out.to_csv(output_psm, header=1, sep=",", index=None)
+
+ if output_psm.endswith(".csv.gz"):
+ all_psm_out.to_csv(output_psm, header=True, sep=",", index=None, compression="gzip")
+ elif output_psm.endswith(".csv"):
+ all_psm_out.to_csv(output_psm, header=True, sep=",", index=None)
+ elif output_psm.endswith(".tsv.gz"):
+ all_psm_out.to_csv(output_psm, header=True, sep="\t", index=None, compression="gzip")
+ elif output_psm.endswith(".tsv"):
+ all_psm_out.to_csv(output_psm, header=True, sep="\t", index=None)
+ else:
+ all_psm_out.to_csv(output_psm, header=True, sep="\t", index=None)
end_time = datetime.datetime.now()
print("End time :", end_time)
diff --git a/pypgatk/proteogenomics/validate_peptides.py b/pypgatk/proteogenomics/validate_peptides.py
index 03b393f..ec54e04 100644
--- a/pypgatk/proteogenomics/validate_peptides.py
+++ b/pypgatk/proteogenomics/validate_peptides.py
@@ -19,7 +19,7 @@ class ValidatePeptidesService(ParameterConfiguration):
CONFIG_IONS_TOLERANCE = 'ions_tolerance'
CONFIG_NUMBER_OF_PROCESSES = 'number_of_processes'
CONFIG_RELATIVE = 'relative'
- CONFIG_MSGF = 'msgf'
+ CONFIG_MZTAB = 'mztab'
def __init__(self, config_data, pipeline_arguments):
"""
@@ -35,7 +35,7 @@ def __init__(self, config_data, pipeline_arguments):
self._mzml_files = self.get_validate_parameters(variable=self.CONFIG_MZML_FILES, default_value=False)
self._ions_tolerance = self.get_validate_parameters(variable=self.CONFIG_IONS_TOLERANCE, default_value=0.02)
self._relative = self.get_validate_parameters(variable=self.CONFIG_RELATIVE, default_value=False)
- self._msgf = self.get_validate_parameters(variable=self.CONFIG_MSGF, default_value=False)
+ self._mztab = self.get_validate_parameters(variable=self.CONFIG_MZTAB, default_value=False)
self._number_of_processes = self.get_validate_parameters(variable=self.CONFIG_NUMBER_OF_PROCESSES,
default_value=40)
@@ -51,20 +51,10 @@ def get_validate_parameters(self, variable: str, default_value):
return value_return
def _predict_MS2_spectrum(self, peptide, size, product_ion_charge=1):
- if self._msgf:
- peptide = re.sub("[-?]", "", peptide)
- modification = re.finditer("(\+\d{1,}\.\d{1,})", peptide)
-
- a = 0
- for i in modification:
- peptide = peptide[:i.start() + a] + '[' + peptide[i.start() + a:i.end() + a] + ']' + peptide[
- i.end() + a:]
- a += 2
-
tsg = TheoreticalSpectrumGenerator()
spec = MSSpectrum()
peptide = AASequence.fromString(peptide)
- # size = len(peptide.toUnmodifiedString())
+
p = Param()
p.setValue("add_metainfo", "true")
p.setValue("add_first_prefix_ion", "true")
@@ -122,10 +112,7 @@ def _match_exp2predicted(self, exp_peak, pred_peak):
return match_ions
def _inspect_spectrum(self, df, mzml_path, mzml_files):
- if self._msgf:
- df.loc[:, "peptide_length"] = df.apply(lambda x: len(re.sub("[^A-Z]", "", x["Peptide"])), axis=1)
- else:
- df.loc[:, "peptide_length"] = df.apply(lambda x: len(x["sequence"]), axis=1)
+ df.loc[:, "peptide_length"] = df.apply(lambda x: len(x["sequence"]), axis=1)
df["status"] = "skiped"
@@ -145,7 +132,11 @@ def _inspect_spectrum(self, df, mzml_path, mzml_files):
df["median_intensity"] = float(0)
mzml_file = None
- spectra_file = str(df.loc[0, "SpecFile"])
+ if self._mztab:
+ spectra_file = str(df.loc[0, "SpecFile"])
+ else:
+ spectra_file = str(df.loc[0, "reference_file_name"]) + ".mzML"
+
if mzml_files and not mzml_path:
mzml_list = mzml_files.split(",")
for file in mzml_list:
@@ -170,14 +161,13 @@ def _inspect_spectrum(self, df, mzml_path, mzml_files):
return df
for i in range(df.shape[0]):
- scan_num = int(df.loc[i, "ScanNum"])
- if self._msgf:
- # seq = DF.loc[i, "Variant Peptide"]
- seq = re.sub("[^A-Z]", "", df.loc[i, "Peptide"])
- length = df.loc[i, "peptide_length"]
+ if self._mztab:
+ scan_num = int(df.loc[i, "ScanNum"])
else:
- seq = df.loc[i, "sequence"]
- length = df.loc[i, "peptide_length"]
+ scan_num = int(df.loc[i, "scan_number"])
+
+ seq = df.loc[i, "sequence"]
+ length = df.loc[i, "peptide_length"]
# get peaks through ScanNum
try:
@@ -190,11 +180,12 @@ def _inspect_spectrum(self, df, mzml_path, mzml_files):
exp_peaks = pd.DataFrame({"mz": exp_peaks[0], "intensity": exp_peaks[1]})
- if self._msgf:
- predicted_peaks = self._predict_MS2_spectrum(str(df.loc[i, "Peptide"]), length, 1)
- else:
+ if self._mztab:
predicted_peaks = self._predict_MS2_spectrum(
str(df.loc[i, "opt_global_cv_MS:1000889_peptidoform_sequence"]), length, 1)
+ else:
+ predicted_peaks = self._predict_MS2_spectrum(
+ str(df.loc[i, "peptidoform"]).replace("[","(").replace("]",")").replace("-",""), length, 1)
match_ions = self._match_exp2predicted(exp_peaks, predicted_peaks)
max_intensity = exp_peaks["intensity"].max()
@@ -295,9 +286,24 @@ def _multiprocess_inspect_spectrum(self, df):
def validate(self, infile_name, outfile_name: str):
start_time = datetime.datetime.now()
print("Start time :", start_time)
- df_psm = pd.read_table(infile_name, header=0, sep="\t")
- grouped_dfs = df_psm.groupby("SpecFile")
+ if infile_name.endswith(".csv.gz"):
+ df_psm = pd.read_csv(infile_name, header=0, sep=",", compression="gzip")
+ elif infile_name.endswith(".csv"):
+ df_psm = pd.read_csv(infile_name, header=0, sep=",")
+ elif infile_name.endswith(".tsv.gz"):
+ df_psm = pd.read_table(infile_name, header=0, sep="\t", compression="gzip")
+ elif infile_name.endswith(".tsv"):
+ df_psm = pd.read_table(infile_name, header=0, sep="\t")
+ else:
+ raise ValueError("The input file format is not supported.")
+
+
+ if self._mztab:
+ grouped_dfs = df_psm.groupby("SpecFile")
+ else:
+ grouped_dfs = df_psm.groupby("reference_file_name")
+
list_of_dfs = [group_df.reset_index(drop=True) for name, group_df in grouped_dfs]
pool = Pool(int(self._number_of_processes))
@@ -307,22 +313,18 @@ def validate(self, infile_name, outfile_name: str):
pool.join()
df_output = pd.concat(self.df_list, axis=0, ignore_index=True)
- df_output.to_csv(outfile_name, header=True, sep="\t", index=None)
-
- # if self._msgf:
- # df_sub = df_output[df_output["status"] == "checked"]
- # saav_psm_passed = df_sub[df_sub["flanking_ions_support"]=="YES"]["PrecursorError(ppm)"]
- # saav_psm_failed = df_sub[df_sub["flanking_ions_support"]=="NO"]["PrecursorError(ppm)"]
- # plot=plt.figure(figsize=(10,7))
- # plot1=plot.add_subplot(1,2,1)
- # plot2=plot.add_subplot(1,2,2)
- # plot1.hist(saav_psm_passed,bins=20)
- # plot1.set_xlabel("PrecursorError(ppm)")
- # plot1.set_title("SpectrumAI curated")
- # plot2.hist(saav_psm_failed,bins=20)
- # plot2.set_xlabel("PrecursorError(ppm)")
- # plot2.set_title("SpectrumAI discarded")
- # plt.savefig("precursorError_histogram.pdf")
+
+
+ if outfile_name.endswith(".csv.gz"):
+ df_output.to_csv(outfile_name, header=True, sep=",", index=None, compression="gzip")
+ elif outfile_name.endswith(".csv"):
+ df_output.to_csv(outfile_name, header=True, sep=",", index=None)
+ elif outfile_name.endswith(".tsv.gz"):
+ df_output.to_csv(outfile_name, header=True, sep="\t", index=None, compression="gzip")
+ elif outfile_name.endswith(".tsv"):
+ df_output.to_csv(outfile_name, header=True, sep="\t", index=None)
+ else:
+ df_output.to_csv(outfile_name, header=True, sep="\t", index=None)
end_time = datetime.datetime.now()
print("End time :", end_time)
diff --git a/pypgatk/testdata/test_blast_validate.mzML b/pypgatk/testdata/test_blast_validate.mzML
deleted file mode 100644
index 17f4359..0000000
--- a/pypgatk/testdata/test_blast_validate.mzML
+++ /dev/null
@@ -1,238 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- AAAA4JVEWUAAAAAgj4NZQAAAAGCYhFtAAAAA4M3EW0AAAABgmAVcQAAAAIAcU1xAAAAAIJnFXEAAAACgfvtcQAAAAKCKBF1AAAAAIC7DXUAAAACgMwVeQAAAAOA/gl5AAAAA4B0EYEAAAABgTgRgQAAAAAA3JGBAAAAAQGskYEAAAADAVURgQAAAAMCERGBAAAAAYG9kYEAAAAAAnmRgQAAAAEBIwmBAAAAA4G0CYUAAAACAIUJhQAAAAOAhw2FAAAAAYHeCY0AAAADA9sJjQAAAAGD2wWRAAAAAgCDDZEAAAADA+eJkQAAAAABKJGVAAAAAYNHjZUAAAABA90FmQAAAAMDiaWZAAAAA4M5CZ0AAAADgnmRnQAAAAEC5hGdAAAAAoPLVZ0AAAAAAV1loQAAAAMDRYmhAAAAAoB2kaEAAAACgzSJpQAAAAOB05GpAAAAAwKGDbEAAAABgdcVsQAAAAACm421AAAAAIMsFb0AAAADAg4NvQAAAACCTEnBAAAAAIMKBcEAAAAAgKRJxQAAAAMD/InFAAAAAwAszcUAAAABAp8FxQAAAAKC00XFAAAAAoKehckAAAADgEtJyQAAAAGAi4nJAAAAAABgjc0AAAACgmDpzQAAAAEB4QnNAAAAAgBdSc0AAAACAFrJzQAAAAIBgsnNAAAAAYK3Kc0AAAADgnKp0QAAAAIDNKnZAAAAAwASzdkAAAABgem53QAAAAGBthHdAAAAA4BWTd0AAAACA6ap3QAAAACBAI3hAAAAAgAJbeEAAAADgL3t4QAAAACDXInlAAAAAIK8zeUAAAAAgL+R5QAAAACAh+3pAAAAAYEote0AAAACg9i17QAAAAADGpHtAAAAAwJALfEAAAADAlQx8QAAAAKDwSHxAAAAAwBxNfEAAAABAgox8QAAAAOC3ZH1AAAAAIHZsfUAAAABAiHR9QAAAAKBPpH1AAAAAIKaMfkAAAAAgSvR+QAAAAEAJlH9AAAAAQAakf0AAAACAEq1/QAAAACCQrX9AAAAAoHSuf0AAAABAHFqAQAAAAMDEo4BAAAAAgFacgUAAAADAR9qBQAAAAKBT4oFAAAAAQH5igkAAAACAf2qCQAAAAMA2uoJAAAAAgD/kgkAAAAAAx1CDQAAAACBZBIVAAAAAoPaqhkAAAACgHnOIQAAAAOBDe4tAAAAAgHcDjEAAAADgeguMQAAAAIBJWpFAAAAAoClckkAAAABA0W2WQA==
-
-
-
-
-
- Ceu+RNz9rETavKFHZXksRdrkm0RVHiFEiGJ8RAtgH0QoE6ZEmEVxRJN7mkQs8BVEY0PrRRb8xUXr/sBFdM3PRWxsy0US6c1FSajKRZw8mUVaAhlEoZxgRs63lEQxdTxELuagRFYte0VX8QBGn5MRRSSrGkUdplhEZSZXRvBkHkQ2qxlENoh1RE0XgEZNbihElkMrRKCyJERocKJFnSV3RLcmpkTrYa1EyxELRjh+g0XsFadF4hwhRaeGOkScZEZF+vBxRHqqs0W3T4RGTolVRI+N3EVCPjZEJfhpRFNClkZxdYtEIE1KREZtJEU1uxtESTkmRYlbpUTJwypE+IhSRTwoJ0R8MENEbURNReCFIUSgDXNEBIGARL3bK0Qu+IhENnphRJXFF0WSvKFE/uK8RPV2SkQEbDdEKj4YRNltKUQ5DVlEoHCTRBXGZ0SM1DdE8m4nRVL7PUQNhjBFu2xzRee+RUVWcs1FljIyRFhtYkSJKwtFI5YmRPn7b0TlooBEVo0lRatYGUXrVR1EmjlDRD7pikXBLn1EQ+FKRo3FskSf045EE+MXRLemOETPUj9ENMaHRK1EoEXlqA1FP43nRRvXkkRBWUpEKfBFRNn1TUQ=
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
- 3050
- 9318
- 16593
-
-
-32398
-0
-
\ No newline at end of file
diff --git a/pypgatk/testdata/test_blast_validate_psms.tsv b/pypgatk/testdata/test_blast_validate_psms.tsv
deleted file mode 100644
index 95ffba2..0000000
--- a/pypgatk/testdata/test_blast_validate_psms.tsv
+++ /dev/null
@@ -1,7 +0,0 @@
-PSH sequence PSM_ID accession unique database database_version search_engine search_engine_score[1] modifications retention_time charge exp_mass_to_charge calc_mass_to_charge spectra_ref pre post start end opt_global_q-value opt_global_cv_MS:1002217_decoy_peptide opt_global_cv_MS:1000889_peptidoform_sequence SpecFile ScanNum position
-PSM YHTINGHNAEVR 0 "ENSP00000504571.1,ENSP00000503242.1,ENSP00000503961.1,ENSP00000504660.1,ENSP00000497298.1,ENSP00000503452.1,ENSP00000504799.1,ENSP00000503190.1,ENSP00000503898.1,ENSP00000503968.1,ENSP00000503885.1,ENSP00000504049.1,ENSP00000503550.1,ENSP00000503870.1,ENSP00000503521.1,ENSP00000503236.1,ENSP00000503360.1,ENSP00000503021.1,ENSP00000503915.1,ENSP00000503460.1,ENSP00000346694.4,ENSP00000478691.2,ENSP00000504439.1,ENSP00000504329.1,ENSP00000503476.1,ENSP00000504831.1,ENSP00000504023.1,ENSP00000504721.1,ENSP00000503514.1,ENSP00000503375.1,ENSP00000349101.8,ENSP00000503047.1,ENSP00000503833.1,ENSP00000503836.1,ENSP00000503703.1,ENSP00000503429.1,ENSP00000354021.4,ENSP00000504415.1,ENSP00000503060.1,ENSP00000503501.1,altorf_ENST00000679318.1_2,altorf_ENST00000677339.1_2,altorf_ENST00000678501.1_2,altorf_ENST00000676903.1_2,altorf_ENST00000608362.2_2,altorf_ENST00000677631.1_2,altorf_ENST00000676749.1_2,altorf_ENST00000678035.1_1,altorf_ENST00000678075.1_1,altorf_ENST00000678183.1_3,altorf_ENST00000679021.1_3,altorf_ENST00000677321.1_2,altorf_ENST00000677571.1_2,altorf_ENST00000677906.1_2,altorf_ENST00000678277.1_3,altorf_ENST00000678973.1_2,altorf_ENST00000679124.1_2,altorf_ENST00000679123.1_2,altorf_ENST00000677574.1_2,altorf_ENST00000678631.1_2,altorf_ENST00000678998.1_2,altorf_ENST00000354667.8_2,altorf_ENST00000618183.5_2,altorf_ENST00000677839.1_2,altorf_ENST00000676746.1_3,altorf_ENST00000678675.1_3,altorf_ENST00000676524.1_2,altorf_ENST00000678935.1_2,altorf_ENST00000678962.1_2,altorf_ENST00000679001.1_2,altorf_ENST00000678449.1_2,altorf_ENST00000356674.8_3,altorf_ENST00000678697.1_2,altorf_ENST00000678431.1_2,altorf_ENST00000676497.1_2,altorf_ENST00000677396.1_2,altorf_ENST00000678779.1_2,altorf_ENST00000360787.8_2,altorf_ENST00000679243.1_2,altorf_ENST00000677656.1_2,altorf_ENST00000678884.1_2,ncRNA_ENST00000677075.1_1,ncRNA_ENST00000476233.2_2,ncRNA_ENST00000676932.1_2,ncRNA_ENST00000677669.1_3,ncRNA_ENST00000490912.6_3,ncRNA_ENST00000463181.5_2,ncRNA_ENST00000495810.2_2,COSMIC:HNRNPA2B1_ENST00000618183:p.R225S:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.H108P:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.K104N:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.R190G:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.G65V:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.M53I:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.L37*:Substitution-Nonsense,COSMIC:HNRNPA2B1_ENST00000618183:p.E11G:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.E92Q:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.E133Q:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.D87H:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000618183:p.M1?:,COSMIC:HNRNPA2B1:p.G233A:Substitution-Missense,COSMIC:HNRNPA2B1:p.G280C:Substitution-Missense,COSMIC:HNRNPA2B1:p.G224*:Substitution-Nonsense,COSMIC:HNRNPA2B1:p.N255Y:Substitution-Missense,COSMIC:HNRNPA2B1:p.K104N:Substitution-Missense,COSMIC:HNRNPA2B1:p.G285S:Substitution-Missense,COSMIC:HNRNPA2B1:p.H108P:Substitution-Missense,COSMIC:HNRNPA2B1:p.R190G:Substitution-Missense,COSMIC:HNRNPA2B1:p.G65V:Substitution-Missense,COSMIC:HNRNPA2B1:p.M53I:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.G221A:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.G268C:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.N243Y:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.G212*:Substitution-Nonsense,COSMIC:HNRNPA2B1_ENST00000356674:p.G273S:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.R178G:Substitution-Missense,COSMIC:HNRNPA2B1:p.L37*:Substitution-Nonsense,COSMIC:HNRNPA2B1_ENST00000356674:p.H96P:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.K92N:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.G53V:Substitution-Missense,COSMIC:HNRNPA2B1:p.G214V:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.M41I:Substitution-Missense,COSMIC:HNRNPA2B1:p.G237V:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.L25*:Substitution-Nonsense,COSMIC:HNRNPA2B1:p.R203K:Substitution-Missense,COSMIC:HNRNPA2B1:p.Y336C:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.G202V:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.G225V:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.R191K:Substitution-Missense,COSMIC:HNRNPA2B1:p.G332C:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.Y324C:Substitution-Missense,COSMIC:HNRNPA2B1:p.E11G:Substitution-Missense,COSMIC:HNRNPA2B1:p.E133Q:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.G320C:Substitution-Missense,COSMIC:HNRNPA2B1:p.E92Q:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.E121Q:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.E80Q:Substitution-Missense,COSMIC:HNRNPA2B1:p.M1?:,COSMIC:HNRNPA2B1:p.D87H:Substitution-Missense,COSMIC:HNRNPA2B1:p.G248*:Substitution-Nonsense,COSMIC:HNRNPA2B1_ENST00000356674:p.D75H:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.M1?:,COSMIC:HNRNPA2B1:p.G217V:Substitution-Missense,COSMIC:HNRNPA2B1_ENST00000356674:p.G236*:Substitution-Nonsense,COSMIC:HNRNPA2B1_ENST00000356674:p.G205V:Substitution-Missense,cbiomut:ENST00000354667:HNRNPA2B1:p.D76H:Missense_Mutation,cbiomut:ENST00000354667:HNRNPA2B1:p.D76H:Missense_Mutation,cbiomut:ENST00000354667:HNRNPA2B1:p.D76H:Missense_Mutation" 0 PXD014145_decoy "[, , Percolator, 3.05]" 0.642512 436.4756905 3 470.901519 470.9006154 ms_run[8]:controllerType=0 controllerNumber=1 scan=1500 "K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K" "K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K" "162,162,162,162,162,162,162,122,122,174,174,162,162,162,162,162,174,162,162,162,174,162,162,174,174,162,162,162,174,162,174,162,162,162,162,162,174,162,162,162,395,455,395,395,395,395,395,474,474,326,326,395,395,395,382,395,395,439,455,395,395,230,218,395,326,326,395,395,395,439,455,326,395,455,395,395,395,230,455,395,395,566,395,395,431,1358,1118,395,174,174,174,174,174,174,173,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,162,162,162,162,162,162,173,162,162,162,174,162,174,161,174,174,162,162,162,174,162,174,174,162,174,162,162,174,174,174,162,162,174,162,162,174,174,174" "173,173,173,173,173,173,173,133,133,185,185,173,173,173,173,173,185,173,173,173,185,173,173,185,185,173,173,173,185,173,185,173,173,173,173,173,185,173,173,173,406,466,406,406,406,406,406,485,485,337,337,406,406,406,393,406,406,450,466,406,406,241,229,406,337,337,406,406,406,450,466,337,406,466,406,406,406,241,466,406,406,577,406,406,442,1369,1129,406,185,185,185,185,185,185,184,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,173,173,173,173,173,173,184,173,173,173,185,173,185,172,185,185,173,173,173,185,173,185,185,173,185,173,173,185,185,185,173,173,185,173,173,185,185,185" 0.0561798 0 YHTINGHNAEVR test_blast_validate.mzML 1500 canonical
-PSM KMVSLAK 4 pseudo_ENST00000454683.1_2 1 PXD014145_decoy "[, , Percolator, 3.05]" 0.668987 741.1 2 388.740661 388.7385759 ms_run[1]:controllerType=0 controllerNumber=1 scan=3252 R N 443 449 0.0947368 0 KMVSLAK test_blast_validate.mzML 3252 2
-PSM KMVSLAK 4 pseudo_ENST00000454683.1_2 1 PXD014145_decoy "[, , Percolator, 3.05]" 0.668987 741.1 2 388.740661 388.7385759 ms_run[1]:controllerType=0 controllerNumber=1 scan=3252 R N 443 449 0.0947368 0 KMVSLAK test_blast_validate.mzML 3252 4
-PSM KMVSLAK 4 pseudo_ENST00000454683.1_2 1 PXD014145_decoy "[, , Percolator, 3.05]" 0.668987 741.1 2 388.740661 388.7385759 ms_run[1]:controllerType=0 controllerNumber=1 scan=3252 R N 443 449 0.0947368 0 KMVSLAK test_blast_validate.mzML 3252 5
-PSM KMVSLAK 4 pseudo_ENST00000454683.1_2 1 PXD014145_decoy "[, , Percolator, 3.05]" 0.668987 741.1 2 388.740661 388.7385759 ms_run[1]:controllerType=0 controllerNumber=1 scan=3252 R N 443 449 0.0947368 0 KMVSLAK test_blast_validate.mzML 3252 6
-PSM AAMAAWPPAAQAAAAAVAVVGGGGEPGAPR 8 "altorf_ENST00000247706.4_2,altorf_ENST00000593489.1_2" 0 PXD014145_decoy "[, , Percolator, 3.05]" 0.547212 1209.2 5 529.4764486 529.4750268 ms_run[5]:controllerType=0 controllerNumber=1 scan=6341 "R,R" "G,G" "183,147" "212,176" 0.0526316 0 AAMAAWPPAAQAAAAAVAVVGGGGEPGAPR test_blast_validate.mzML 6341 non-canonical
diff --git a/pypgatk/testdata/test_validate.mzML b/pypgatk/testdata/test_validate.mzML
deleted file mode 100644
index 78474ce..0000000
--- a/pypgatk/testdata/test_validate.mzML
+++ /dev/null
@@ -1,195 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
- 3759
- 11862
-
-
-20562
-0
-
\ No newline at end of file
diff --git a/pypgatk/testdata/test_validate_psms.tsv b/pypgatk/testdata/test_validate_psms.tsv
deleted file mode 100644
index 403b7ba..0000000
--- a/pypgatk/testdata/test_validate_psms.tsv
+++ /dev/null
@@ -1,3 +0,0 @@
-SpecFile Biological.set Retention.time.min. Ion.injection.time.ms. SpecID ScanNum FragMethod Precursor IsotopeError PrecursorError(ppm) Charge Peptide Protein DeNovoScore MSGFScore SpecEValue EValue percolator.svm.score PSM.q.value peptide.q.value tmt10plex_126 tmt10plex_127N tmt10plex_127C tmt10plex_128N tmt10plex_128C tmt10plex_129N tmt10plex_129C tmt10plex_130N tmt10plex_130C tmt10plex_131 position Variant Peptide
-test_validate.mzML Set1 59.558592 83.3344385 controllerType=0 controllerNumber=1 scan=19937 19937 HCD 1052.5897 0 -0.115971394 2 +229.163TIAEC+57.021LAEELINAAK+229.163 "=_18600958@4.20978040680119@fr10:1378089(pre=-,post=-)" 188 171 5.79E-18 6.76E-10 1.897 0 0 128042 61780 190414 226202 244759 139458 116483 176833 133302 137712 8 TIAECLAEELINAAK
-test_validate.mzML Set1 27.764549 150.000006 controllerType=0 controllerNumber=1 scan=8461 8461 HCD 1068.8729 2 -7.502769 3 +229.163K+229.163AAAPTPEEEMDEC+57.021EQALAAEPK+229.163 "=_21935565@4.06037609192942@fr8:1746571(pre=-,post=-)" 192 55 7.83E-12 0.001002411 0.854 0.007575758 0.005524862 28336.2 6073.63 30612.8 22688 30643.6 24194.2 11743.9 21621.2 15252.3 15450.5 6 KAAAPTPEEEMDECEQALAAEPK
diff --git a/pypgatk/tests/pypgatk_tests.py b/pypgatk/tests/pypgatk_tests.py
index bf37fea..64bf060 100644
--- a/pypgatk/tests/pypgatk_tests.py
+++ b/pypgatk/tests/pypgatk_tests.py
@@ -282,16 +282,6 @@ def test_check_ensembl_database(self):
'testdata/proteindb_from_ENSEMBL_VCF-clean.fa', '--add_stop_codons', '--num_aa', '6'])
self.assertEqual(result.exit_code, 0)
- # @pytest.mark.skip(reason="Not working with pytest pooling")
- # def test_validate_peptides_msgf(self):
- # runner = CliRunner()
- # result = runner.invoke(cli,
- # ['validate_peptides', '--mzml_path', 'testdata',
- # '--infile_name', 'testdata/test_validate_psms.tsv', '--outfile_name',
- # 'testdata/test_validate_psms_out.tsv', '--msgf'])
- # print("ERROR IN RESULT: + " + str(result.exception) + " + " + result.output)
- # self.assertEqual(result.exit_code, 0)
-
def test_blast(self):
runner = CliRunner()
result = runner.invoke(cli,
@@ -300,15 +290,5 @@ def test_blast(self):
'testdata/test_blast_reference_database.fa'])
self.assertEqual(result.exit_code, 0)
- # @pytest.mark.skip(reason="Not working with pytest pooling")
- # def test_blast_out_validate(self):
- # runner = CliRunner()
- # result = runner.invoke(cli,
- # ['validate_peptides', '--mzml_files', 'testdata/test_blast_validate.mzML',
- # '--infile_name', 'testdata/test_blast_validate_psms.tsv', '--outfile_name',
- # 'testdata/test_blast_validate_psms_out.tsv'])
- # self.assertEqual(result.exit_code, 0)
-
-
if __name__ == '__main__':
unittest.main()