Skip to content

Commit 2465f4c

Browse files
authored
Merge pull request #160 from bigbio/dev
Dev
2 parents 74f7df5 + fc37024 commit 2465f4c

File tree

9 files changed

+520
-310
lines changed

9 files changed

+520
-310
lines changed

docs/LFQ_PXD007683/multiqc_report.html

Lines changed: 59 additions & 62 deletions
Large diffs are not rendered by default.

docs/PXD003133/multiqc_report.html

Lines changed: 111 additions & 17 deletions
Large diffs are not rendered by default.

docs/PXD051187/multiqc_report.html

Lines changed: 17 additions & 20 deletions
Large diffs are not rendered by default.

docs/PXD054720/multiqc_report.html

Lines changed: 17 additions & 20 deletions
Large diffs are not rendered by default.

docs/TMT_PXD007683/multiqc_report.html

Lines changed: 60 additions & 63 deletions
Large diffs are not rendered by default.

docs/dia/multiqc_report.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<title>MultiQC Report</title>
2424

2525
<!-- JSON plot data -->
26-
<script type="text/plain" id="mqc_compressed_plotdata">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</script>
26+
<script type="text/plain" id="mqc_compressed_plotdata">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</script>
2727

2828
<script type="application/json" id="mqc_config">{"decimalPoint_format": ".", "plots_num_data_points_do_not_automatically_load": 100, "sample_names_rename": [], "show_hide_mode": [], "show_hide_patterns": [], "show_hide_regex": [], "thousandsSep_format": ""}</script>
2929

@@ -6974,7 +6974,7 @@ <h4>JavaScript Disabled</h4>
69746974
<div id="analysis_dirs_wrapper">
69756975
<p>Report
69766976

6977-
generated on 2025-04-23, 07:12 UTC
6977+
generated on 2025-05-08, 06:53 UTC
69786978

69796979

69806980
based on data in:
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import numpy as np
2+
3+
4+
def qualUniform(group_df_rt):
5+
"""
6+
Parameters:
7+
-----------
8+
group_df_rt: group["Retention time"] or group["retention_time"]
9+
10+
"""
11+
x = group_df_rt / np.nansum(group_df_rt)
12+
n = group_df_rt.notna().sum()
13+
y = np.nansum(x) / n
14+
worst = ((1 - y) ** 0.5) * 1 / n + (y**0.5) * (n - 1) / n
15+
sc = np.sum(np.abs(x - y) ** 0.5) / n
16+
result = 1.0 if worst == 0 else float((worst - sc) / worst)
17+
18+
return result

pmultiqc/modules/quantms/maxquant.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from sklearn.preprocessing import StandardScaler
1212

1313
from pmultiqc.modules.common.file_utils import get_filename
14+
from ..common.calc_utils import qualUniform
1415
from ...logging import get_logger, Timer
1516

1617
# Initialize logger for this module
@@ -442,6 +443,112 @@ def get_evidence(file_path):
442443
return result
443444

444445

446+
# HeatMap
447+
def calculate_heatmap(evidence_df, oversampling, msms_missed_cleavages):
448+
449+
if any(x is None for x in (evidence_df, oversampling, msms_missed_cleavages)):
450+
return None
451+
452+
if any(
453+
column not in evidence_df.columns
454+
for column in ["Potential contaminant", "Intensity", "Raw file", "Retention time", "Charge"]
455+
):
456+
return None
457+
458+
if evidence_df[evidence_df["Potential contaminant"] == "+"].empty:
459+
logger.info("The evidence.txt file does not contain any contaminants")
460+
461+
evidence_data = evidence_df.copy()
462+
463+
# 8. Pep Missing Values
464+
global_peps = evidence_df["Modified sequence"].unique()
465+
global_peps_count = len(global_peps)
466+
467+
heatmap_dict = dict()
468+
for raw_file, group in evidence_data[
469+
[
470+
"Potential contaminant", "Intensity", "Retention time",
471+
"Raw file", "Modified sequence"
472+
]
473+
].groupby("Raw file"):
474+
475+
# 1. Contaminants
476+
contaminant = 1 - (group[group["Potential contaminant"] == "+"]["Intensity"].sum()
477+
/ group["Intensity"].sum())
478+
479+
# 2. Peptide Intensity
480+
peptide_intensity = np.minimum(1.0, np.nanmedian(group["Intensity"]) / (2**23))
481+
482+
# 8. Pep Missing Values
483+
pep_missing_values = np.minimum(
484+
1.0,
485+
len(set(global_peps) & set(group["Modified sequence"].unique())) / global_peps_count
486+
)
487+
488+
heatmap_dict[raw_file] = {
489+
"Contaminants": contaminant,
490+
"Peptide Intensity": peptide_intensity,
491+
"ID rate over RT": qualUniform(group["Retention time"]), # 6. ID rate over RT
492+
"Pep Missing Values": pep_missing_values,
493+
}
494+
495+
# 4. Missed Cleavages
496+
missed_cleavages = {key: value["0"] / 100 for key, value in msms_missed_cleavages.items()}
497+
498+
# 5. Missed Cleavages Var
499+
mc_median = np.median(list(missed_cleavages.values()))
500+
missed_cleavages_var = dict(
501+
zip(
502+
missed_cleavages.keys(),
503+
list(map(lambda v: 1 - np.abs(v - mc_median), missed_cleavages.values())),
504+
)
505+
)
506+
for raw_file in missed_cleavages.keys():
507+
heatmap_dict[raw_file]["Missed Cleavages"] = missed_cleavages[raw_file]
508+
heatmap_dict[raw_file]["Missed Cleavages Var"] = missed_cleavages_var[raw_file]
509+
510+
# 3. Charge
511+
charge = dict()
512+
for raw_file, group in evidence_data.loc[
513+
~evidence_data["is_transferred"], ["Charge", "Raw file"]
514+
].groupby("Raw file"):
515+
charge[raw_file] = group["Charge"].value_counts()[2] / len(group)
516+
charge_median = np.median(list(charge.values()))
517+
heatmap_charge = dict(
518+
zip(
519+
charge.keys(),
520+
list(map(lambda v: 1 - np.abs(v - charge_median), charge.values())),
521+
)
522+
)
523+
for raw_file in heatmap_charge.keys():
524+
heatmap_dict[raw_file]["Charge"] = heatmap_charge[raw_file]
525+
526+
# 7. MS2 OverSampling
527+
for raw_file, value in oversampling.items():
528+
heatmap_dict[raw_file]["MS2 OverSampling"] = np.minimum(1.0, (value["1"] / 100))
529+
530+
# Sort the xnames
531+
heatmap_xname_order = [
532+
"Contaminants",
533+
"Peptide Intensity",
534+
"Charge",
535+
"Missed Cleavages",
536+
"Missed Cleavages Var",
537+
"ID rate over RT",
538+
"MS2 OverSampling",
539+
"Pep Missing Values",
540+
]
541+
542+
for raw_file in heatmap_charge.keys():
543+
heatmap_dict[raw_file] = {
544+
key: heatmap_dict[raw_file][key]
545+
for key in heatmap_xname_order
546+
if key in heatmap_dict[raw_file].keys()
547+
}
548+
549+
return heatmap_dict
550+
551+
445552
# 3-1. evidence.txt: Top Contaminants per Raw file
446553
def evidence_top_contaminants(evidence_df, top_n):
447554
if any(
@@ -450,6 +557,10 @@ def evidence_top_contaminants(evidence_df, top_n):
450557
):
451558
return None
452559

560+
if evidence_df[evidence_df["Potential contaminant"] == "+"].empty:
561+
logger.info("The evidence.txt file does not contain any contaminants")
562+
return None
563+
453564
evidence_data = evidence_df.copy()
454565

455566
if "Protein Names" in evidence_data.columns:

0 commit comments

Comments
 (0)