# HG changeset patch
# User galaxyp
# Date 1602620806 0
# Node ID e030fdaaf63108663a2fa5cc501f51d007385922
"planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/openms commit 55a2aeba8bfd8a6910630721de9857dcdfe05d3c"
diff -r 000000000000 -r e030fdaaf631 404-urls.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/404-urls.patch Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,11 @@
+diff -ruN FeatureFinderSuperHirn.xml FeatureFinderSuperHirn.xml
+--- FeatureFinderSuperHirn.xml 2020-10-02 12:06:56.398572301 +0200
++++ FeatureFinderSuperHirn.xml 2020-10-02 12:07:31.511153834 +0200
+@@ -105,6 +105,6 @@
+
++For more information, visit https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/2.6.0/html/UTILS_FeatureFinderSuperHirn.html]]>
+
+
diff -r 000000000000 -r e030fdaaf631 OMSSAAdapter.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OMSSAAdapter.patch Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,10 @@
+--- OMSSAAdapter.xml 2020-06-16 15:51:40.315400730 +0200
++++ /tmp/OMSSAAdapter.xml 2020-06-16 15:50:23.536086074 +0200
+@@ -22,6 +22,7 @@
+ mkdir database &&
+ ln -s '$database' 'database/${re.sub("[^\w\-_]", "_", $database.element_identifier)}.$gxy2omsext($database.ext)' &&
+
++makeblastdb -dbtype prot -in 'database/${re.sub("[^\w\-_]", "_", $database.element_identifier)}.$gxy2omsext($database.ext)' &&
+ ## Main program call
+
+ set -o pipefail &&
diff -r 000000000000 -r e030fdaaf631 PepNovoAdapter.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PepNovoAdapter.patch Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,35 @@
+--- PepNovoAdapter.xml 2020-05-12 15:55:24.712831518 +0200
++++ /tmp/PepNovoAdapter.xml 2020-05-12 15:36:31.267276757 +0200
+@@ -42,8 +42,13 @@
+
+
+
+-
+-
++
++
++
++
++
++
++
+
+
+
+@@ -51,8 +56,14 @@
+
+
+
+-
+-
++
++
++
++
++
++
++
++
+
+
+ TRYPSIN
diff -r 000000000000 -r e030fdaaf631 StaticModification.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/StaticModification.xml Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,3007 @@
+
+
+
+
+ Applies a set of modifications to all PeptideIDs in an idXML file.
+
+ StaticModification
+ macros.xml
+ macros_autotest.xml
+ macros_test.xml
+
+
+
+
+
+
+
+
+
+
+
+ default (nothing chosen)
+ 15N-oxobutanoic (N-term C)
+ 15N-oxobutanoic (Protein N-term S)
+ 15N-oxobutanoic (Protein N-term T)
+ 2-dimethylsuccinyl (C)
+ 2-monomethylsuccinyl (C)
+ 2-nitrobenzyl (Y)
+ 2-succinyl (C)
+ 2HPG (R)
+ 3-deoxyglucosone (R)
+ 3-phosphoglyceryl (K)
+ 3sulfo (N-term)
+ 4-ONE (C)
+ 4-ONE (H)
+ 4-ONE (K)
+ 4-ONE+Delta:H(-2)O(-1) (C)
+ 4-ONE+Delta:H(-2)O(-1) (H)
+ 4-ONE+Delta:H(-2)O(-1) (K)
+ 4AcAllylGal (C)
+ a-type-ion (C-term)
+ AccQTag (K)
+ AccQTag (N-term)
+ Acetyl (C)
+ Acetyl (H)
+ Acetyl (K)
+ Acetyl (N-term)
+ Acetyl (Protein N-term)
+ Acetyl (R)
+ Acetyl (S)
+ Acetyl (T)
+ Acetyl (Y)
+ Acetyl:13C(2) (K)
+ Acetyl:13C(2) (Protein N-term)
+ Acetyl:2H(3) (H)
+ Acetyl:2H(3) (K)
+ Acetyl:2H(3) (N-term)
+ Acetyl:2H(3) (Protein N-term)
+ Acetyl:2H(3) (S)
+ Acetyl:2H(3) (T)
+ Acetyl:2H(3) (Y)
+ Acetyldeoxyhypusine (K)
+ Acetylhypusine (K)
+ ADP-Ribosyl (C)
+ ADP-Ribosyl (D)
+ ADP-Ribosyl (E)
+ ADP-Ribosyl (K)
+ ADP-Ribosyl (N)
+ ADP-Ribosyl (R)
+ ADP-Ribosyl (S)
+ ADP-Ribosyl (T)
+ AEBS (H)
+ AEBS (K)
+ AEBS (Protein N-term)
+ AEBS (S)
+ AEBS (Y)
+ AEC-MAEC (S)
+ AEC-MAEC (T)
+ AEC-MAEC:2H(4) (S)
+ AEC-MAEC:2H(4) (T)
+ AFB1_Dialdehyde (K)
+ AHA-Alkyne (M)
+ AHA-Alkyne-KDDDD (M)
+ AHA-SS (M)
+ AHA-SS_CAM (M)
+ Ahx2+Hsl (C-term)
+ Ala->Arg (A)
+ Ala->Asn (A)
+ Ala->Asp (A)
+ Ala->Cys (A)
+ Ala->Gln (A)
+ Ala->Glu (A)
+ Ala->Gly (A)
+ Ala->His (A)
+ Ala->Lys (A)
+ Ala->Met (A)
+ Ala->Phe (A)
+ Ala->Pro (A)
+ Ala->Ser (A)
+ Ala->Thr (A)
+ Ala->Trp (A)
+ Ala->Tyr (A)
+ Ala->Val (A)
+ Ala->Xle (A)
+ Amidated (C-term)
+ Amidated (Protein C-term)
+ Amidine (K)
+ Amidine (N-term)
+ Amidino (C)
+ Amino (Y)
+ Ammonia-loss (N)
+ Ammonia-loss (N-term C)
+ Ammonia-loss (Protein N-term S)
+ Ammonia-loss (Protein N-term T)
+ Ammonium (C-term)
+ Ammonium (D)
+ Ammonium (E)
+ AMTzHexNAc2 (N)
+ AMTzHexNAc2 (S)
+ AMTzHexNAc2 (T)
+ Archaeol (C)
+ Arg (N-term)
+ Arg->Ala (R)
+ Arg->Asn (R)
+ Arg->Asp (R)
+ Arg->Cys (R)
+ Arg->Gln (R)
+ Arg->Glu (R)
+ Arg->GluSA (R)
+ Arg->Gly (R)
+ Arg->His (R)
+ Arg->Lys (R)
+ Arg->Met (R)
+ Arg->Npo (R)
+ Arg->Orn (R)
+ Arg->Phe (R)
+ Arg->Pro (R)
+ Arg->Ser (R)
+ Arg->Thr (R)
+ Arg->Trp (R)
+ Arg->Tyr (R)
+ Arg->Val (R)
+ Arg->Xle (R)
+ Arg-loss (C-term R)
+ Arg2PG (R)
+ Argbiotinhydrazide (R)
+ AROD (C)
+ Asn->Ala (N)
+ Asn->Arg (N)
+ Asn->Asp (N)
+ Asn->Cys (N)
+ Asn->Gln (N)
+ Asn->Glu (N)
+ Asn->Gly (N)
+ Asn->His (N)
+ Asn->Lys (N)
+ Asn->Met (N)
+ Asn->Phe (N)
+ Asn->Pro (N)
+ Asn->Ser (N)
+ Asn->Thr (N)
+ Asn->Trp (N)
+ Asn->Tyr (N)
+ Asn->Val (N)
+ Asn->Xle (N)
+ Asp->Ala (D)
+ Asp->Arg (D)
+ Asp->Asn (D)
+ Asp->Cys (D)
+ Asp->Gln (D)
+ Asp->Glu (D)
+ Asp->Gly (D)
+ Asp->His (D)
+ Asp->Lys (D)
+ Asp->Met (D)
+ Asp->Phe (D)
+ Asp->Pro (D)
+ Asp->Ser (D)
+ Asp->Thr (D)
+ Asp->Trp (D)
+ Asp->Tyr (D)
+ Asp->Val (D)
+ Asp->Xle (D)
+ Aspartylurea (H)
+ Atto495Maleimide (C)
+ AzidoF (F)
+ azole (C)
+ azole (S)
+ Bacillosamine (N)
+ BADGE (C)
+ BDMAPP (H)
+ BDMAPP (K)
+ BDMAPP (Protein N-term)
+ BDMAPP (W)
+ BDMAPP (Y)
+ BEMAD_C (C)
+ BEMAD_C:2H(6) (C)
+ BEMAD_ST (S)
+ BEMAD_ST (T)
+ BEMAD_ST:2H(6) (S)
+ BEMAD_ST:2H(6) (T)
+ Benzoyl (K)
+ Benzoyl (N-term)
+ benzylguanidine (K)
+ betaFNA (C)
+ betaFNA (K)
+ BHT (C)
+ BHT (H)
+ BHT (K)
+ BHTOH (C)
+ BHTOH (H)
+ BHTOH (K)
+ Biotin (K)
+ Biotin (N-term)
+ Biotin-HPDP (C)
+ Biotin-PEG-PRA (M)
+ Biotin-PEO-Amine (D)
+ Biotin-PEO-Amine (E)
+ Biotin-PEO-Amine (Protein C-term)
+ Biotin-phenacyl (C)
+ Biotin-phenacyl (H)
+ Biotin-phenacyl (S)
+ Biotin-tyramide (Y)
+ Biotin:Cayman-10013 (C)
+ Biotin:Cayman-10141 (C)
+ Biotin:Invitrogen-M1602 (C)
+ Biotin:Sigma-B1267 (C)
+ Biotin:Thermo-21325 (K)
+ Biotin:Thermo-21328 (K)
+ Biotin:Thermo-21328 (N-term)
+ Biotin:Thermo-21330 (K)
+ Biotin:Thermo-21330 (N-term)
+ Biotin:Thermo-21345 (Q)
+ Biotin:Thermo-21360 (X)
+ Biotin:Thermo-21901+2H2O (C)
+ Biotin:Thermo-21901+H2O (C)
+ Biotin:Thermo-21911 (C)
+ Biotin:Thermo-33033 (X)
+ Biotin:Thermo-33033-H (X)
+ Biotin:Thermo-88310 (K)
+ Biotin:Thermo-88317 (S)
+ Biotin:Thermo-88317 (Y)
+ biotinAcrolein298 (C)
+ biotinAcrolein298 (H)
+ biotinAcrolein298 (K)
+ biotinAcrolein298 (Protein N-term)
+ BisANS (K)
+ bisANS-sulfonates (K)
+ bisANS-sulfonates (S)
+ bisANS-sulfonates (T)
+ BITC (C)
+ BITC (K)
+ BITC (N-term)
+ BMP-piperidinol (C)
+ BMP-piperidinol (M)
+ Bodipy (C)
+ Brij35 (N-term)
+ Brij58 (N-term)
+ Bromo (F)
+ Bromo (H)
+ Bromo (W)
+ Bromo (Y)
+ Bromobimane (C)
+ Butyryl (K)
+ C8-QAT (K)
+ C8-QAT (N-term)
+ CAF (N-term)
+ CAMthiopropanoyl (K)
+ CAMthiopropanoyl (Protein N-term)
+ Can-FP-biotin (S)
+ Can-FP-biotin (T)
+ Can-FP-biotin (Y)
+ Carbamidomethyl (C)
+ Carbamidomethyl (D)
+ Carbamidomethyl (E)
+ Carbamidomethyl (H)
+ Carbamidomethyl (K)
+ Carbamidomethyl (M)
+ Carbamidomethyl (N-term)
+ Carbamidomethyl (S)
+ Carbamidomethyl (T)
+ Carbamidomethyl (U)
+ Carbamidomethyl (Y)
+ CarbamidomethylDTT (C)
+ Carbamyl (C)
+ Carbamyl (K)
+ Carbamyl (M)
+ Carbamyl (N-term)
+ Carbamyl (Protein N-term)
+ Carbamyl (R)
+ Carbamyl (S)
+ Carbamyl (T)
+ Carbamyl (Y)
+ Carbofuran (S)
+ Carbonyl (A)
+ Carbonyl (E)
+ Carbonyl (I)
+ Carbonyl (L)
+ Carbonyl (Q)
+ Carbonyl (R)
+ Carbonyl (S)
+ Carbonyl (V)
+ Carboxy (D)
+ Carboxy (E)
+ Carboxy (K)
+ Carboxy (Protein N-term M)
+ Carboxy (W)
+ Carboxy->Thiocarboxy (Protein C-term G)
+ Carboxyethyl (H)
+ Carboxyethyl (K)
+ Carboxyethylpyrrole (K)
+ Carboxymethyl (C)
+ Carboxymethyl (K)
+ Carboxymethyl (N-term)
+ Carboxymethyl (U)
+ Carboxymethyl (W)
+ Carboxymethyl:13C(2) (C)
+ CarboxymethylDMAP (N-term)
+ CarboxymethylDTT (C)
+ Cation:Ag (C-term)
+ Cation:Ag (D)
+ Cation:Ag (E)
+ Cation:Al[III] (C-term)
+ Cation:Al[III] (D)
+ Cation:Al[III] (E)
+ Cation:Ca[II] (C-term)
+ Cation:Ca[II] (D)
+ Cation:Ca[II] (E)
+ Cation:Cu[I] (C-term)
+ Cation:Cu[I] (D)
+ Cation:Cu[I] (E)
+ Cation:Cu[I] (H)
+ Cation:Fe[II] (C-term)
+ Cation:Fe[II] (D)
+ Cation:Fe[II] (E)
+ Cation:Fe[III] (C-term)
+ Cation:Fe[III] (D)
+ Cation:Fe[III] (E)
+ Cation:K (C-term)
+ Cation:K (D)
+ Cation:K (E)
+ Cation:Li (C-term)
+ Cation:Li (D)
+ Cation:Li (E)
+ Cation:Mg[II] (C-term)
+ Cation:Mg[II] (D)
+ Cation:Mg[II] (E)
+ Cation:Na (C-term)
+ Cation:Na (D)
+ Cation:Na (E)
+ Cation:Ni[II] (C-term)
+ Cation:Ni[II] (D)
+ Cation:Ni[II] (E)
+ Cation:Zn[II] (C-term)
+ Cation:Zn[II] (D)
+ Cation:Zn[II] (E)
+ Cation:Zn[II] (H)
+ cGMP (C)
+ cGMP (S)
+ cGMP+RMP-loss (C)
+ cGMP+RMP-loss (S)
+ CHDH (D)
+ Chlorination (W)
+ Chlorination (Y)
+ Cholesterol (Protein C-term)
+ CIGG (K)
+ CLIP_TRAQ_2 (K)
+ CLIP_TRAQ_2 (N-term)
+ CLIP_TRAQ_2 (Y)
+ CLIP_TRAQ_3 (K)
+ CLIP_TRAQ_3 (N-term)
+ CLIP_TRAQ_3 (Y)
+ CLIP_TRAQ_4 (K)
+ CLIP_TRAQ_4 (N-term)
+ CLIP_TRAQ_4 (Y)
+ CoenzymeA (C)
+ Cresylphosphate (H)
+ Cresylphosphate (K)
+ Cresylphosphate (R)
+ Cresylphosphate (S)
+ Cresylphosphate (T)
+ Cresylphosphate (Y)
+ CresylSaligeninPhosphate (H)
+ CresylSaligeninPhosphate (K)
+ CresylSaligeninPhosphate (R)
+ CresylSaligeninPhosphate (S)
+ CresylSaligeninPhosphate (T)
+ CresylSaligeninPhosphate (Y)
+ Crotonaldehyde (C)
+ Crotonaldehyde (H)
+ Crotonaldehyde (K)
+ Crotonyl (K)
+ CuSMo (C)
+ CUSTOM0 (A)
+ CUSTOM0 (C)
+ CUSTOM0 (C-term)
+ CUSTOM0 (D)
+ CUSTOM0 (E)
+ CUSTOM0 (F)
+ CUSTOM0 (G)
+ CUSTOM0 (H)
+ CUSTOM0 (I)
+ CUSTOM0 (K)
+ CUSTOM0 (L)
+ CUSTOM0 (M)
+ CUSTOM0 (N)
+ CUSTOM0 (N-term)
+ CUSTOM0 (P)
+ CUSTOM0 (Q)
+ CUSTOM0 (R)
+ CUSTOM0 (S)
+ CUSTOM0 (T)
+ CUSTOM0 (V)
+ CUSTOM0 (W)
+ CUSTOM0 (Y)
+ CUSTOM1 (A)
+ CUSTOM1 (C)
+ CUSTOM1 (C-term)
+ CUSTOM1 (D)
+ CUSTOM1 (E)
+ CUSTOM1 (F)
+ CUSTOM1 (G)
+ CUSTOM1 (H)
+ CUSTOM1 (I)
+ CUSTOM1 (K)
+ CUSTOM1 (L)
+ CUSTOM1 (M)
+ CUSTOM1 (N)
+ CUSTOM1 (N-term)
+ CUSTOM1 (P)
+ CUSTOM1 (Q)
+ CUSTOM1 (R)
+ CUSTOM1 (S)
+ CUSTOM1 (T)
+ CUSTOM1 (V)
+ CUSTOM1 (W)
+ CUSTOM1 (Y)
+ CUSTOM2 (A)
+ CUSTOM2 (C)
+ CUSTOM2 (C-term)
+ CUSTOM2 (D)
+ CUSTOM2 (E)
+ CUSTOM2 (F)
+ CUSTOM2 (G)
+ CUSTOM2 (H)
+ CUSTOM2 (I)
+ CUSTOM2 (K)
+ CUSTOM2 (L)
+ CUSTOM2 (M)
+ CUSTOM2 (N)
+ CUSTOM2 (N-term)
+ CUSTOM2 (P)
+ CUSTOM2 (Q)
+ CUSTOM2 (R)
+ CUSTOM2 (S)
+ CUSTOM2 (T)
+ CUSTOM2 (V)
+ CUSTOM2 (W)
+ CUSTOM2 (Y)
+ CUSTOM3 (A)
+ CUSTOM3 (C)
+ CUSTOM3 (C-term)
+ CUSTOM3 (D)
+ CUSTOM3 (E)
+ CUSTOM3 (F)
+ CUSTOM3 (G)
+ CUSTOM3 (H)
+ CUSTOM3 (I)
+ CUSTOM3 (K)
+ CUSTOM3 (L)
+ CUSTOM3 (M)
+ CUSTOM3 (N)
+ CUSTOM3 (N-term)
+ CUSTOM3 (P)
+ CUSTOM3 (Q)
+ CUSTOM3 (R)
+ CUSTOM3 (S)
+ CUSTOM3 (T)
+ CUSTOM3 (V)
+ CUSTOM3 (W)
+ CUSTOM3 (Y)
+ CUSTOM4 (A)
+ CUSTOM4 (C)
+ CUSTOM4 (C-term)
+ CUSTOM4 (D)
+ CUSTOM4 (E)
+ CUSTOM4 (F)
+ CUSTOM4 (G)
+ CUSTOM4 (H)
+ CUSTOM4 (I)
+ CUSTOM4 (K)
+ CUSTOM4 (L)
+ CUSTOM4 (M)
+ CUSTOM4 (N)
+ CUSTOM4 (N-term)
+ CUSTOM4 (P)
+ CUSTOM4 (Q)
+ CUSTOM4 (R)
+ CUSTOM4 (S)
+ CUSTOM4 (T)
+ CUSTOM4 (V)
+ CUSTOM4 (W)
+ CUSTOM4 (Y)
+ CUSTOM5 (A)
+ CUSTOM5 (C)
+ CUSTOM5 (C-term)
+ CUSTOM5 (D)
+ CUSTOM5 (E)
+ CUSTOM5 (F)
+ CUSTOM5 (G)
+ CUSTOM5 (H)
+ CUSTOM5 (I)
+ CUSTOM5 (K)
+ CUSTOM5 (L)
+ CUSTOM5 (M)
+ CUSTOM5 (N)
+ CUSTOM5 (N-term)
+ CUSTOM5 (P)
+ CUSTOM5 (Q)
+ CUSTOM5 (R)
+ CUSTOM5 (S)
+ CUSTOM5 (T)
+ CUSTOM5 (V)
+ CUSTOM5 (W)
+ CUSTOM5 (Y)
+ CUSTOM6 (A)
+ CUSTOM6 (C)
+ CUSTOM6 (C-term)
+ CUSTOM6 (D)
+ CUSTOM6 (E)
+ CUSTOM6 (F)
+ CUSTOM6 (G)
+ CUSTOM6 (H)
+ CUSTOM6 (I)
+ CUSTOM6 (K)
+ CUSTOM6 (L)
+ CUSTOM6 (M)
+ CUSTOM6 (N)
+ CUSTOM6 (N-term)
+ CUSTOM6 (P)
+ CUSTOM6 (Q)
+ CUSTOM6 (R)
+ CUSTOM6 (S)
+ CUSTOM6 (T)
+ CUSTOM6 (V)
+ CUSTOM6 (W)
+ CUSTOM6 (Y)
+ CUSTOM7 (A)
+ CUSTOM7 (C)
+ CUSTOM7 (C-term)
+ CUSTOM7 (D)
+ CUSTOM7 (E)
+ CUSTOM7 (F)
+ CUSTOM7 (G)
+ CUSTOM7 (H)
+ CUSTOM7 (I)
+ CUSTOM7 (K)
+ CUSTOM7 (L)
+ CUSTOM7 (M)
+ CUSTOM7 (N)
+ CUSTOM7 (N-term)
+ CUSTOM7 (P)
+ CUSTOM7 (Q)
+ CUSTOM7 (R)
+ CUSTOM7 (S)
+ CUSTOM7 (T)
+ CUSTOM7 (V)
+ CUSTOM7 (W)
+ CUSTOM7 (Y)
+ CUSTOM8 (A)
+ CUSTOM8 (C)
+ CUSTOM8 (C-term)
+ CUSTOM8 (D)
+ CUSTOM8 (E)
+ CUSTOM8 (F)
+ CUSTOM8 (G)
+ CUSTOM8 (H)
+ CUSTOM8 (I)
+ CUSTOM8 (K)
+ CUSTOM8 (L)
+ CUSTOM8 (M)
+ CUSTOM8 (N)
+ CUSTOM8 (N-term)
+ CUSTOM8 (P)
+ CUSTOM8 (Q)
+ CUSTOM8 (R)
+ CUSTOM8 (S)
+ CUSTOM8 (T)
+ CUSTOM8 (V)
+ CUSTOM8 (W)
+ CUSTOM8 (Y)
+ CUSTOM9 (A)
+ CUSTOM9 (C)
+ CUSTOM9 (C-term)
+ CUSTOM9 (D)
+ CUSTOM9 (E)
+ CUSTOM9 (F)
+ CUSTOM9 (G)
+ CUSTOM9 (H)
+ CUSTOM9 (I)
+ CUSTOM9 (K)
+ CUSTOM9 (L)
+ CUSTOM9 (M)
+ CUSTOM9 (N)
+ CUSTOM9 (N-term)
+ CUSTOM9 (P)
+ CUSTOM9 (Q)
+ CUSTOM9 (R)
+ CUSTOM9 (S)
+ CUSTOM9 (T)
+ CUSTOM9 (V)
+ CUSTOM9 (W)
+ CUSTOM9 (Y)
+ Cy3-maleimide (C)
+ Cy3b-maleimide (C)
+ Cyano (C)
+ CyDye-Cy3 (C)
+ CyDye-Cy5 (C)
+ Cys->Ala (C)
+ Cys->Arg (C)
+ Cys->Asn (C)
+ Cys->Asp (C)
+ Cys->CamSec (C)
+ Cys->Dha (C)
+ Cys->ethylaminoAla (C)
+ Cys->Gln (C)
+ Cys->Glu (C)
+ Cys->Gly (C)
+ Cys->His (C)
+ Cys->Lys (C)
+ Cys->Met (C)
+ Cys->methylaminoAla (C)
+ Cys->Oxoalanine (C)
+ Cys->Phe (C)
+ Cys->Pro (C)
+ Cys->PyruvicAcid (Protein N-term C)
+ Cys->SecNEM (C)
+ Cys->SecNEM:2H(5) (C)
+ Cys->Ser (C)
+ Cys->Thr (C)
+ Cys->Trp (C)
+ Cys->Tyr (C)
+ Cys->Val (C)
+ Cys->Xle (C)
+ Cysteinyl (C)
+ cysTMT (C)
+ cysTMT6plex (C)
+ Cytopiloyne (C)
+ Cytopiloyne (K)
+ Cytopiloyne (N-term)
+ Cytopiloyne (P)
+ Cytopiloyne (R)
+ Cytopiloyne (S)
+ Cytopiloyne (Y)
+ Cytopiloyne+water (C)
+ Cytopiloyne+water (K)
+ Cytopiloyne+water (N-term)
+ Cytopiloyne+water (R)
+ Cytopiloyne+water (S)
+ Cytopiloyne+water (T)
+ Cytopiloyne+water (Y)
+ DAET (S)
+ DAET (T)
+ Dansyl (K)
+ Dansyl (N-term)
+ Dap-DSP (A)
+ Dap-DSP (E)
+ Dap-DSP (K)
+ Deamidated (N)
+ Deamidated (Protein N-term F)
+ Deamidated (Q)
+ Deamidated (R)
+ Deamidated:18O(1) (N)
+ Deamidated:18O(1) (Q)
+ Decanoyl (S)
+ Decanoyl (T)
+ Decarboxylation (D)
+ Decarboxylation (E)
+ DEDGFLYMVYASQETFG (K)
+ Dehydrated (D)
+ Dehydrated (N-term C)
+ Dehydrated (Protein C-term N)
+ Dehydrated (Protein C-term Q)
+ Dehydrated (S)
+ Dehydrated (T)
+ Dehydrated (Y)
+ Dehydro (C)
+ Delta:H(-4)O(2) (W)
+ Delta:H(-4)O(3) (W)
+ Delta:H(1)N(-1)18O(1) (N)
+ Delta:H(10)C(8)O(1) (K)
+ Delta:H(2)C(2) (H)
+ Delta:H(2)C(2) (K)
+ Delta:H(2)C(2) (N-term)
+ Delta:H(2)C(2) (Protein N-term)
+ Delta:H(2)C(3) (K)
+ Delta:H(2)C(3)O(1) (K)
+ Delta:H(2)C(3)O(1) (R)
+ Delta:H(2)C(5) (K)
+ Delta:H(3)C(3)O(2) (K)
+ Delta:H(4)C(2) (H)
+ Delta:H(4)C(2) (K)
+ Delta:H(4)C(2) (N-term)
+ Delta:H(4)C(2)O(-1)S(1) (S)
+ Delta:H(4)C(3) (H)
+ Delta:H(4)C(3) (K)
+ Delta:H(4)C(3) (Protein N-term)
+ Delta:H(4)C(3)O(1) (C)
+ Delta:H(4)C(3)O(1) (H)
+ Delta:H(4)C(3)O(1) (K)
+ Delta:H(4)C(3)O(1) (R)
+ Delta:H(4)C(5)O(1) (R)
+ Delta:H(4)C(6) (K)
+ Delta:H(5)C(2) (P)
+ Delta:H(6)C(3)O(1) (C)
+ Delta:H(6)C(3)O(1) (H)
+ Delta:H(6)C(3)O(1) (K)
+ Delta:H(6)C(3)O(1) (Protein N-term)
+ Delta:H(6)C(6)O(1) (K)
+ Delta:H(6)C(7)O(4) (R)
+ Delta:H(8)C(6)O(1) (K)
+ Delta:H(8)C(6)O(1) (Protein N-term)
+ Delta:H(8)C(6)O(2) (K)
+ Delta:Hg(1) (C)
+ Delta:O(4) (W)
+ Delta:S(-1)Se(1) (C)
+ Delta:S(-1)Se(1) (M)
+ Delta:Se(1) (C)
+ Deoxy (D)
+ Deoxy (S)
+ Deoxy (T)
+ Deoxyhypusine (K)
+ Deoxyhypusine (Q)
+ DeStreak (C)
+ Dethiomethyl (M)
+ dHex (N)
+ dHex (S)
+ dHex (T)
+ dHex(1)Hex(1) (S)
+ dHex(1)Hex(1) (T)
+ dHex(1)Hex(1)HexA(1)HexNAc(3) (S)
+ dHex(1)Hex(1)HexA(1)HexNAc(3) (T)
+ dHex(1)Hex(1)HexNAc(1)Kdn(1) (S)
+ dHex(1)Hex(1)HexNAc(1)Kdn(1) (T)
+ dHex(1)Hex(1)HexNAc(1)NeuAc(1) (S)
+ dHex(1)Hex(1)HexNAc(1)NeuAc(1) (T)
+ dHex(1)Hex(1)HexNAc(1)NeuGc(1) (S)
+ dHex(1)Hex(1)HexNAc(1)NeuGc(1) (T)
+ dHex(1)Hex(1)HexNAc(2)Kdn(1) (S)
+ dHex(1)Hex(1)HexNAc(2)Kdn(1) (T)
+ dHex(1)Hex(1)HexNAc(2)NeuAc(1) (S)
+ dHex(1)Hex(1)HexNAc(2)NeuAc(1) (T)
+ dHex(1)Hex(1)HexNAc(2)NeuAc(1)Sulf(1) (S)
+ dHex(1)Hex(1)HexNAc(2)NeuAc(1)Sulf(1) (T)
+ dHex(1)Hex(1)HexNAc(2)NeuAc(2) (S)
+ dHex(1)Hex(1)HexNAc(2)NeuAc(2) (T)
+ dHex(1)Hex(1)HexNAc(2)Sulf(1) (S)
+ dHex(1)Hex(1)HexNAc(2)Sulf(1) (T)
+ dHex(1)Hex(1)HexNAc(3) (S)
+ dHex(1)Hex(1)HexNAc(3) (T)
+ dHex(1)Hex(1)HexNAc(3)NeuAc(1) (S)
+ dHex(1)Hex(1)HexNAc(3)NeuAc(1) (T)
+ dHex(1)Hex(1)HexNAc(3)NeuAc(1)Sulf(1) (S)
+ dHex(1)Hex(1)HexNAc(3)NeuAc(1)Sulf(1) (T)
+ dHex(1)Hex(1)HexNAc(3)NeuGc(1) (S)
+ dHex(1)Hex(1)HexNAc(3)NeuGc(1) (T)
+ dHex(1)Hex(1)HexNAc(3)Sulf(1) (S)
+ dHex(1)Hex(1)HexNAc(3)Sulf(1) (T)
+ dHex(1)Hex(1)HexNAc(4) (S)
+ dHex(1)Hex(1)HexNAc(4) (T)
+ dHex(1)Hex(2) (S)
+ dHex(1)Hex(2) (T)
+ dHex(1)Hex(2)HexA(1) (S)
+ dHex(1)Hex(2)HexA(1) (T)
+ dHex(1)Hex(2)HexA(1)HexNAc(1) (S)
+ dHex(1)Hex(2)HexA(1)HexNAc(1) (T)
+ dHex(1)Hex(2)HexA(1)HexNAc(1)Sulf(1) (S)
+ dHex(1)Hex(2)HexA(1)HexNAc(1)Sulf(1) (T)
+ dHex(1)Hex(2)HexA(1)HexNAc(2) (S)
+ dHex(1)Hex(2)HexA(1)HexNAc(2) (T)
+ dHex(1)Hex(2)HexNAc(1) (S)
+ dHex(1)Hex(2)HexNAc(1) (T)
+ dHex(1)Hex(2)HexNAc(1)NeuAc(2) (S)
+ dHex(1)Hex(2)HexNAc(1)NeuAc(2) (T)
+ dHex(1)Hex(2)HexNAc(1)Sulf(1) (S)
+ dHex(1)Hex(2)HexNAc(1)Sulf(1) (T)
+ dHex(1)Hex(2)HexNAc(2)NeuAc(1)Sulf(1) (S)
+ dHex(1)Hex(2)HexNAc(2)NeuAc(1)Sulf(1) (T)
+ dHex(1)Hex(2)HexNAc(2)NeuAc(2) (S)
+ dHex(1)Hex(2)HexNAc(2)NeuAc(2) (T)
+ dHex(1)Hex(2)HexNAc(2)NeuAc(2)Sulf(1) (S)
+ dHex(1)Hex(2)HexNAc(2)NeuAc(2)Sulf(1) (T)
+ dHex(1)Hex(2)HexNAc(2)NeuGc(1) (N)
+ dHex(1)Hex(2)HexNAc(2)NeuGc(1) (S)
+ dHex(1)Hex(2)HexNAc(2)NeuGc(1) (T)
+ dHex(1)Hex(2)HexNAc(2)NeuGc(2) (S)
+ dHex(1)Hex(2)HexNAc(2)NeuGc(2) (T)
+ dHex(1)Hex(2)HexNAc(2)NeuGc(3) (S)
+ dHex(1)Hex(2)HexNAc(2)NeuGc(3) (T)
+ dHex(1)Hex(2)HexNAc(2)Pent(1) (N)
+ dHex(1)Hex(2)HexNAc(2)Sulf(1) (S)
+ dHex(1)Hex(2)HexNAc(2)Sulf(1) (T)
+ dHex(1)Hex(2)HexNAc(3) (N)
+ dHex(1)Hex(2)HexNAc(3) (S)
+ dHex(1)Hex(2)HexNAc(3) (T)
+ dHex(1)Hex(2)HexNAc(3)NeuAc(1) (S)
+ dHex(1)Hex(2)HexNAc(3)NeuAc(1) (T)
+ dHex(1)Hex(2)HexNAc(3)NeuAc(1)Sulf(1) (S)
+ dHex(1)Hex(2)HexNAc(3)NeuAc(1)Sulf(1) (T)
+ dHex(1)Hex(2)HexNAc(3)Sulf(1) (S)
+ dHex(1)Hex(2)HexNAc(3)Sulf(1) (T)
+ dHex(1)Hex(2)HexNAc(4) (N)
+ dHex(1)Hex(2)HexNAc(4) (S)
+ dHex(1)Hex(2)HexNAc(4) (T)
+ dHex(1)Hex(2)HexNAc(4)NeuAc(1) (S)
+ dHex(1)Hex(2)HexNAc(4)NeuAc(1) (T)
+ dHex(1)Hex(2)HexNAc(4)NeuAc(2) (S)
+ dHex(1)Hex(2)HexNAc(4)NeuAc(2) (T)
+ dHex(1)Hex(2)HexNAc(4)Sulf(2) (S)
+ dHex(1)Hex(2)HexNAc(4)Sulf(2) (T)
+ dHex(1)Hex(3) (S)
+ dHex(1)Hex(3) (T)
+ dHex(1)Hex(3)HexA(1)HexNAc(1) (S)
+ dHex(1)Hex(3)HexA(1)HexNAc(1) (T)
+ dHex(1)Hex(3)HexA(1)HexNAc(1)Sulf(1) (S)
+ dHex(1)Hex(3)HexA(1)HexNAc(1)Sulf(1) (T)
+ dHex(1)Hex(3)HexA(1)HexNAc(2) (S)
+ dHex(1)Hex(3)HexA(1)HexNAc(2) (T)
+ dHex(1)Hex(3)HexA(1)HexNAc(2)Sulf(1) (S)
+ dHex(1)Hex(3)HexA(1)HexNAc(2)Sulf(1) (T)
+ dHex(1)Hex(3)HexA(1)HexNAc(3)Sulf(1) (S)
+ dHex(1)Hex(3)HexA(1)HexNAc(3)Sulf(1) (T)
+ dHex(1)Hex(3)HexA(2)HexNAc(2) (S)
+ dHex(1)Hex(3)HexA(2)HexNAc(2) (T)
+ dHex(1)Hex(3)HexNAc(1) (S)
+ dHex(1)Hex(3)HexNAc(1) (T)
+ dHex(1)Hex(3)HexNAc(1)Sulf(1) (S)
+ dHex(1)Hex(3)HexNAc(1)Sulf(1) (T)
+ dHex(1)Hex(3)HexNAc(2) (N)
+ dHex(1)Hex(3)HexNAc(2) (S)
+ dHex(1)Hex(3)HexNAc(2) (T)
+ dHex(1)Hex(3)HexNAc(2)NeuGc(1) (S)
+ dHex(1)Hex(3)HexNAc(2)NeuGc(1) (T)
+ dHex(1)Hex(3)HexNAc(2)Pent(1) (N)
+ dHex(1)Hex(3)HexNAc(2)Sulf(1) (N)
+ dHex(1)Hex(3)HexNAc(2)Sulf(1) (S)
+ dHex(1)Hex(3)HexNAc(2)Sulf(1) (T)
+ dHex(1)Hex(3)HexNAc(3) (N)
+ dHex(1)Hex(3)HexNAc(3) (S)
+ dHex(1)Hex(3)HexNAc(3) (T)
+ dHex(1)Hex(3)HexNAc(3)NeuAc(2) (S)
+ dHex(1)Hex(3)HexNAc(3)NeuAc(2) (T)
+ dHex(1)Hex(3)HexNAc(3)Pent(1) (N)
+ dHex(1)Hex(3)HexNAc(3)Pent(2) (N)
+ dHex(1)Hex(3)HexNAc(3)Pent(3) (N)
+ dHex(1)Hex(3)HexNAc(3)Sulf(1) (S)
+ dHex(1)Hex(3)HexNAc(3)Sulf(1) (T)
+ dHex(1)Hex(3)HexNAc(4) (N)
+ dHex(1)Hex(3)HexNAc(4) (S)
+ dHex(1)Hex(3)HexNAc(4) (T)
+ dHex(1)Hex(3)HexNAc(4)NeuAc(1) (N)
+ dHex(1)Hex(3)HexNAc(4)Pent(1) (N)
+ dHex(1)Hex(3)HexNAc(4)Pent(2) (N)
+ dHex(1)Hex(3)HexNAc(4)Pent(3) (N)
+ dHex(1)Hex(3)HexNAc(4)Sulf(1) (N)
+ dHex(1)Hex(3)HexNAc(5) (N)
+ dHex(1)Hex(3)HexNAc(5) (S)
+ dHex(1)Hex(3)HexNAc(5) (T)
+ dHex(1)Hex(3)HexNAc(5)NeuAc(1) (N)
+ dHex(1)Hex(3)HexNAc(5)NeuAc(1) (S)
+ dHex(1)Hex(3)HexNAc(5)NeuAc(1) (T)
+ dHex(1)Hex(3)HexNAc(5)Sulf(1) (N)
+ dHex(1)Hex(3)HexNAc(6) (N)
+ dHex(1)Hex(3)HexNAc(6) (S)
+ dHex(1)Hex(3)HexNAc(6) (T)
+ dHex(1)Hex(3)HexNAc(6)Sulf(1) (N)
+ dHex(1)Hex(4) (S)
+ dHex(1)Hex(4) (T)
+ dHex(1)Hex(4)HexA(1) (S)
+ dHex(1)Hex(4)HexA(1) (T)
+ dHex(1)Hex(4)HexA(1)HexNAc(2) (S)
+ dHex(1)Hex(4)HexA(1)HexNAc(2) (T)
+ dHex(1)Hex(4)HexA(1)HexNAc(3)Sulf(1) (S)
+ dHex(1)Hex(4)HexA(1)HexNAc(3)Sulf(1) (T)
+ dHex(1)Hex(4)HexNAc(1)Pent(1) (N)
+ dHex(1)Hex(4)HexNAc(2) (N)
+ dHex(1)Hex(4)HexNAc(2) (S)
+ dHex(1)Hex(4)HexNAc(2) (T)
+ dHex(1)Hex(4)HexNAc(2)Pent(1) (N)
+ dHex(1)Hex(4)HexNAc(3) (N)
+ dHex(1)Hex(4)HexNAc(3)NeuAc(1) (N)
+ dHex(1)Hex(4)HexNAc(3)NeuAc(1) (S)
+ dHex(1)Hex(4)HexNAc(3)NeuAc(1) (T)
+ dHex(1)Hex(4)HexNAc(3)NeuAc(1)Sulf(1) (N)
+ dHex(1)Hex(4)HexNAc(3)NeuGc(1) (N)
+ dHex(1)Hex(4)HexNAc(3)Pent(1) (N)
+ dHex(1)Hex(4)HexNAc(3)Sulf(1) (N)
+ dHex(1)Hex(4)HexNAc(4) (N)
+ dHex(1)Hex(4)HexNAc(4) (S)
+ dHex(1)Hex(4)HexNAc(4) (T)
+ dHex(1)Hex(4)HexNAc(4)NeuAc(1) (N)
+ dHex(1)Hex(4)HexNAc(4)NeuAc(1) (S)
+ dHex(1)Hex(4)HexNAc(4)NeuAc(1) (T)
+ dHex(1)Hex(4)HexNAc(4)NeuAc(1)Sulf(1) (N)
+ dHex(1)Hex(4)HexNAc(4)Pent(1) (N)
+ dHex(1)Hex(4)HexNAc(4)Sulf(1) (N)
+ dHex(1)Hex(4)HexNAc(5) (N)
+ dHex(1)Hex(4)HexNAc(5)Sulf(1) (N)
+ dHex(1)Hex(5) (S)
+ dHex(1)Hex(5) (T)
+ dHex(1)Hex(5)HexA(1)HexNAc(3)Sulf(1) (N)
+ dHex(1)Hex(5)HexA(1)HexNAc(3)Sulf(2) (N)
+ dHex(1)Hex(5)HexNAc(2) (N)
+ dHex(1)Hex(5)HexNAc(2)Pent(1) (N)
+ dHex(1)Hex(5)HexNAc(3) (N)
+ dHex(1)Hex(5)HexNAc(3)NeuAc(1) (N)
+ dHex(1)Hex(5)HexNAc(3)NeuAc(1)Sulf(1) (N)
+ dHex(1)Hex(5)HexNAc(3)NeuGc(1) (N)
+ dHex(1)Hex(5)HexNAc(3)NeuGc(1)Sulf(1) (N)
+ dHex(1)Hex(5)HexNAc(3)Sulf(1) (N)
+ dHex(1)Hex(5)HexNAc(4) (N)
+ dHex(1)Hex(5)HexNAc(4)Me(2)Pent(1) (N)
+ dHex(1)Hex(5)HexNAc(4)NeuAc(1) (N)
+ dHex(1)Hex(5)HexNAc(4)NeuAc(2) (N)
+ dHex(1)Hex(5)HexNAc(4)Pent(1) (N)
+ dHex(1)Hex(5)HexNAc(4)Sulf(1) (N)
+ dHex(1)Hex(5)HexNAc(4)Sulf(2) (N)
+ dHex(1)Hex(5)HexNAc(5) (N)
+ dHex(1)Hex(6) (S)
+ dHex(1)Hex(6) (T)
+ dHex(1)Hex(6)HexNAc(2) (N)
+ dHex(1)Hex(6)HexNAc(3) (N)
+ dHex(1)Hex(6)HexNAc(3)Sulf(1) (N)
+ dHex(1)Hex(6)HexNAc(4) (N)
+ dHex(1)Hex(7)HexNAc(2) (N)
+ dHex(1)Hex(7)HexNAc(3) (N)
+ dHex(1)Hex(7)HexNAc(3)Phos(1) (N)
+ dHex(1)Hex(7)HexNAc(3)Sulf(1) (N)
+ dHex(1)Hex(7)HexNAc(4) (N)
+ dHex(1)Hex(8)HexNAc(2) (N)
+ dHex(1)HexNAc(3) (S)
+ dHex(1)HexNAc(3) (T)
+ dHex(1)HexNAc(4) (S)
+ dHex(1)HexNAc(4) (T)
+ dHex(1)HexNAc(5) (S)
+ dHex(1)HexNAc(5) (T)
+ dHex(2)Hex(1)HexNAc(1)Kdn(1) (S)
+ dHex(2)Hex(1)HexNAc(1)Kdn(1) (T)
+ dHex(2)Hex(1)HexNAc(2)Kdn(1) (S)
+ dHex(2)Hex(1)HexNAc(2)Kdn(1) (T)
+ dHex(2)Hex(1)HexNAc(2)NeuAc(1) (S)
+ dHex(2)Hex(1)HexNAc(2)NeuAc(1) (T)
+ dHex(2)Hex(1)HexNAc(2)NeuGc(1) (S)
+ dHex(2)Hex(1)HexNAc(2)NeuGc(1) (T)
+ dHex(2)Hex(1)HexNAc(3) (S)
+ dHex(2)Hex(1)HexNAc(3) (T)
+ dHex(2)Hex(1)HexNAc(4)Sulf(1) (S)
+ dHex(2)Hex(1)HexNAc(4)Sulf(1) (T)
+ dHex(2)Hex(2) (S)
+ dHex(2)Hex(2) (T)
+ dHex(2)Hex(2)HexA(1) (S)
+ dHex(2)Hex(2)HexA(1) (T)
+ dHex(2)Hex(2)HexA(1)HexNAc(1) (S)
+ dHex(2)Hex(2)HexA(1)HexNAc(1) (T)
+ dHex(2)Hex(2)HexA(1)HexNAc(2)Sulf(1) (S)
+ dHex(2)Hex(2)HexA(1)HexNAc(2)Sulf(1) (T)
+ dHex(2)Hex(2)HexNAc(1) (S)
+ dHex(2)Hex(2)HexNAc(1) (T)
+ dHex(2)Hex(2)HexNAc(2) (N)
+ dHex(2)Hex(2)HexNAc(2) (S)
+ dHex(2)Hex(2)HexNAc(2) (T)
+ dHex(2)Hex(2)HexNAc(2)Kdn(1) (S)
+ dHex(2)Hex(2)HexNAc(2)Kdn(1) (T)
+ dHex(2)Hex(2)HexNAc(2)NeuAc(1) (S)
+ dHex(2)Hex(2)HexNAc(2)NeuAc(1) (T)
+ dHex(2)Hex(2)HexNAc(2)NeuAc(1)Sulf(1) (S)
+ dHex(2)Hex(2)HexNAc(2)NeuAc(1)Sulf(1) (T)
+ dHex(2)Hex(2)HexNAc(2)NeuGc(1) (S)
+ dHex(2)Hex(2)HexNAc(2)NeuGc(1) (T)
+ dHex(2)Hex(2)HexNAc(2)Sulf(1) (S)
+ dHex(2)Hex(2)HexNAc(2)Sulf(1) (T)
+ dHex(2)Hex(2)HexNAc(2)Sulf(2) (S)
+ dHex(2)Hex(2)HexNAc(2)Sulf(2) (T)
+ dHex(2)Hex(2)HexNAc(3) (N)
+ dHex(2)Hex(2)HexNAc(3) (S)
+ dHex(2)Hex(2)HexNAc(3) (T)
+ dHex(2)Hex(2)HexNAc(3)NeuAc(1) (S)
+ dHex(2)Hex(2)HexNAc(3)NeuAc(1) (T)
+ dHex(2)Hex(2)HexNAc(3)NeuGc(1) (S)
+ dHex(2)Hex(2)HexNAc(3)NeuGc(1) (T)
+ dHex(2)Hex(2)HexNAc(3)Sulf(1) (S)
+ dHex(2)Hex(2)HexNAc(3)Sulf(1) (T)
+ dHex(2)Hex(2)HexNAc(4) (S)
+ dHex(2)Hex(2)HexNAc(4) (T)
+ dHex(2)Hex(2)HexNAc(4)Sulf(2) (S)
+ dHex(2)Hex(2)HexNAc(4)Sulf(2) (T)
+ dHex(2)Hex(2)HexNAc(5) (S)
+ dHex(2)Hex(2)HexNAc(5) (T)
+ dHex(2)Hex(2)HexNAc(6)Sulf(1) (S)
+ dHex(2)Hex(2)HexNAc(6)Sulf(1) (T)
+ dHex(2)Hex(3) (S)
+ dHex(2)Hex(3) (T)
+ dHex(2)Hex(3)HexA(1)HexNAc(1)Sulf(1) (S)
+ dHex(2)Hex(3)HexA(1)HexNAc(1)Sulf(1) (T)
+ dHex(2)Hex(3)HexA(1)HexNAc(2)Sulf(1) (S)
+ dHex(2)Hex(3)HexA(1)HexNAc(2)Sulf(1) (T)
+ dHex(2)Hex(3)HexA(1)HexNAc(3)Sulf(1) (S)
+ dHex(2)Hex(3)HexA(1)HexNAc(3)Sulf(1) (T)
+ dHex(2)Hex(3)HexNAc(1)Sulf(1) (S)
+ dHex(2)Hex(3)HexNAc(1)Sulf(1) (T)
+ dHex(2)Hex(3)HexNAc(2) (N)
+ dHex(2)Hex(3)HexNAc(2) (S)
+ dHex(2)Hex(3)HexNAc(2) (T)
+ dHex(2)Hex(3)HexNAc(2)NeuGc(1) (S)
+ dHex(2)Hex(3)HexNAc(2)NeuGc(1) (T)
+ dHex(2)Hex(3)HexNAc(2)Sulf(1) (S)
+ dHex(2)Hex(3)HexNAc(2)Sulf(1) (T)
+ dHex(2)Hex(3)HexNAc(3) (N)
+ dHex(2)Hex(3)HexNAc(3) (S)
+ dHex(2)Hex(3)HexNAc(3) (T)
+ dHex(2)Hex(3)HexNAc(3)NeuAc(1) (S)
+ dHex(2)Hex(3)HexNAc(3)NeuAc(1) (T)
+ dHex(2)Hex(3)HexNAc(3)NeuAc(2) (S)
+ dHex(2)Hex(3)HexNAc(3)NeuAc(2) (T)
+ dHex(2)Hex(3)HexNAc(3)Pent(1) (N)
+ dHex(2)Hex(3)HexNAc(3)Pent(2) (N)
+ dHex(2)Hex(3)HexNAc(3)Sulf(1) (S)
+ dHex(2)Hex(3)HexNAc(3)Sulf(1) (T)
+ dHex(2)Hex(3)HexNAc(4) (N)
+ dHex(2)Hex(3)HexNAc(4) (S)
+ dHex(2)Hex(3)HexNAc(4) (T)
+ dHex(2)Hex(3)HexNAc(4)NeuAc(1) (N)
+ dHex(2)Hex(3)HexNAc(4)Pent(1) (N)
+ dHex(2)Hex(3)HexNAc(4)Pent(2) (N)
+ dHex(2)Hex(3)HexNAc(5) (N)
+ dHex(2)Hex(3)HexNAc(5) (S)
+ dHex(2)Hex(3)HexNAc(5) (T)
+ dHex(2)Hex(3)HexNAc(6) (N)
+ dHex(2)Hex(4) (S)
+ dHex(2)Hex(4) (T)
+ dHex(2)Hex(4)HexA(1)HexNAc(3)Sulf(1) (S)
+ dHex(2)Hex(4)HexA(1)HexNAc(3)Sulf(1) (T)
+ dHex(2)Hex(4)HexNAc(1) (S)
+ dHex(2)Hex(4)HexNAc(1) (T)
+ dHex(2)Hex(4)HexNAc(2) (N)
+ dHex(2)Hex(4)HexNAc(2) (S)
+ dHex(2)Hex(4)HexNAc(2) (T)
+ dHex(2)Hex(4)HexNAc(3) (N)
+ dHex(2)Hex(4)HexNAc(3)NeuAc(1)Sulf(1) (N)
+ dHex(2)Hex(4)HexNAc(3)Pent(1) (N)
+ dHex(2)Hex(4)HexNAc(4) (N)
+ dHex(2)Hex(4)HexNAc(4) (S)
+ dHex(2)Hex(4)HexNAc(4) (T)
+ dHex(2)Hex(4)HexNAc(4)Pent(1) (N)
+ dHex(2)Hex(4)HexNAc(4)Sulf(1) (N)
+ dHex(2)Hex(4)HexNAc(5) (N)
+ dHex(2)Hex(4)HexNAc(5) (S)
+ dHex(2)Hex(4)HexNAc(5) (T)
+ dHex(2)Hex(5)HexNAc(2)Me(1) (S)
+ dHex(2)Hex(5)HexNAc(2)Me(1) (T)
+ dHex(2)Hex(5)HexNAc(3)Pent(1) (N)
+ dHex(2)Hex(5)HexNAc(4) (N)
+ dHex(2)HexNAc(2)Kdn(1) (S)
+ dHex(2)HexNAc(2)Kdn(1) (T)
+ dHex(2)HexNAc(5) (S)
+ dHex(2)HexNAc(5) (T)
+ dHex(2)HexNAc(7) (S)
+ dHex(2)HexNAc(7) (T)
+ dHex(3)Hex(1)HexNAc(2)Kdn(1) (S)
+ dHex(3)Hex(1)HexNAc(2)Kdn(1) (T)
+ dHex(3)Hex(1)HexNAc(3)Kdn(1) (S)
+ dHex(3)Hex(1)HexNAc(3)Kdn(1) (T)
+ dHex(3)Hex(2)HexA(1)HexNAc(2)Sulf(1) (S)
+ dHex(3)Hex(2)HexA(1)HexNAc(2)Sulf(1) (T)
+ dHex(3)Hex(2)HexNAc(2) (S)
+ dHex(3)Hex(2)HexNAc(2) (T)
+ dHex(3)Hex(2)HexNAc(2)Kdn(1) (S)
+ dHex(3)Hex(2)HexNAc(2)Kdn(1) (T)
+ dHex(3)Hex(2)HexNAc(3) (S)
+ dHex(3)Hex(2)HexNAc(3) (T)
+ dHex(3)Hex(2)HexNAc(3)Kdn(1) (S)
+ dHex(3)Hex(2)HexNAc(3)Kdn(1) (T)
+ dHex(3)Hex(2)HexNAc(4) (S)
+ dHex(3)Hex(2)HexNAc(4) (T)
+ dHex(3)Hex(2)HexNAc(4)Sulf(2) (S)
+ dHex(3)Hex(2)HexNAc(4)Sulf(2) (T)
+ dHex(3)Hex(3)HexNAc(1) (S)
+ dHex(3)Hex(3)HexNAc(1) (T)
+ dHex(3)Hex(3)HexNAc(2) (S)
+ dHex(3)Hex(3)HexNAc(2) (T)
+ dHex(3)Hex(3)HexNAc(3) (S)
+ dHex(3)Hex(3)HexNAc(3) (T)
+ dHex(3)Hex(3)HexNAc(3)NeuAc(1) (S)
+ dHex(3)Hex(3)HexNAc(3)NeuAc(1) (T)
+ dHex(3)Hex(3)HexNAc(3)Pent(1) (N)
+ dHex(3)Hex(3)HexNAc(4) (N)
+ dHex(3)Hex(3)HexNAc(4)Pent(1) (N)
+ dHex(3)Hex(4)HexNAc(4) (N)
+ dHex(3)Hex(4)HexNAc(4) (S)
+ dHex(3)Hex(4)HexNAc(4) (T)
+ dHex(3)Hex(4)HexNAc(4)Sulf(1) (N)
+ dHex(3)HexNAc(3)Kdn(1) (S)
+ dHex(3)HexNAc(3)Kdn(1) (T)
+ dHex(4)Hex(1)HexNAc(1)Kdn(2) (S)
+ dHex(4)Hex(1)HexNAc(1)Kdn(2) (T)
+ dHex(4)Hex(1)HexNAc(2)Kdn(1) (S)
+ dHex(4)Hex(1)HexNAc(2)Kdn(1) (T)
+ dHex(4)Hex(1)HexNAc(3)Kdn(1) (S)
+ dHex(4)Hex(1)HexNAc(3)Kdn(1) (T)
+ dHex(4)Hex(2)HexNAc(2)Kdn(1) (S)
+ dHex(4)Hex(2)HexNAc(2)Kdn(1) (T)
+ dHex(4)Hex(2)HexNAc(3) (S)
+ dHex(4)Hex(2)HexNAc(3) (T)
+ dHex(4)Hex(3)HexNAc(2)NeuAc(1) (S)
+ dHex(4)Hex(3)HexNAc(2)NeuAc(1) (T)
+ dHex(4)Hex(3)HexNAc(3) (S)
+ dHex(4)Hex(3)HexNAc(3) (T)
+ dHex(4)HexNAc(3)Kdn(1) (S)
+ dHex(4)HexNAc(3)Kdn(1) (T)
+ DHP (C)
+ Diacylglycerol (C)
+ DiART6plex (K)
+ DiART6plex (N-term)
+ DiART6plex (Protein N-term)
+ DiART6plex (Y)
+ DiART6plex115 (K)
+ DiART6plex115 (N-term)
+ DiART6plex115 (Protein N-term)
+ DiART6plex115 (Y)
+ DiART6plex116/119 (K)
+ DiART6plex116/119 (N-term)
+ DiART6plex116/119 (Protein N-term)
+ DiART6plex116/119 (Y)
+ DiART6plex117 (K)
+ DiART6plex117 (N-term)
+ DiART6plex117 (Protein N-term)
+ DiART6plex117 (Y)
+ DiART6plex118 (K)
+ DiART6plex118 (N-term)
+ DiART6plex118 (Protein N-term)
+ DiART6plex118 (Y)
+ Dibromo (Y)
+ Dicarbamidomethyl (C)
+ Dicarbamidomethyl (H)
+ Dicarbamidomethyl (K)
+ Dicarbamidomethyl (N-term)
+ Dicarbamidomethyl (R)
+ dichlorination (C)
+ dichlorination (Y)
+ Didehydro (C-term K)
+ Didehydro (S)
+ Didehydro (T)
+ Didehydro (Y)
+ Didehydroretinylidene (K)
+ Diethyl (K)
+ Diethyl (N-term)
+ Diethylphosphate (C)
+ Diethylphosphate (H)
+ Diethylphosphate (K)
+ Diethylphosphate (N-term)
+ Diethylphosphate (S)
+ Diethylphosphate (T)
+ Diethylphosphate (Y)
+ Diethylphosphothione (C)
+ Diethylphosphothione (H)
+ Diethylphosphothione (K)
+ Diethylphosphothione (S)
+ Diethylphosphothione (T)
+ Diethylphosphothione (Y)
+ Difuran (Y)
+ Dihydroxyimidazolidine (R)
+ Diiodo (H)
+ Diiodo (Y)
+ Diironsubcluster (C)
+ Diisopropylphosphate (K)
+ Diisopropylphosphate (N-term)
+ Diisopropylphosphate (S)
+ Diisopropylphosphate (T)
+ Diisopropylphosphate (Y)
+ DiLeu4plex (K)
+ DiLeu4plex (N-term)
+ DiLeu4plex (Y)
+ DiLeu4plex115 (K)
+ DiLeu4plex115 (N-term)
+ DiLeu4plex115 (Y)
+ DiLeu4plex117 (K)
+ DiLeu4plex117 (N-term)
+ DiLeu4plex117 (Y)
+ DiLeu4plex118 (K)
+ DiLeu4plex118 (N-term)
+ DiLeu4plex118 (Y)
+ Dimethyl (K)
+ Dimethyl (N)
+ Dimethyl (N-term)
+ Dimethyl (Protein N-term P)
+ Dimethyl (Protein N-term)
+ Dimethyl (R)
+ Dimethyl:2H(2)13C (K)
+ Dimethyl:2H(2)13C (N)
+ Dimethyl:2H(2)13C (N-term)
+ Dimethyl:2H(2)13C (Protein N-term P)
+ Dimethyl:2H(2)13C (R)
+ Dimethyl:2H(4) (K)
+ Dimethyl:2H(4) (N-term)
+ Dimethyl:2H(4) (Protein N-term)
+ Dimethyl:2H(4) (R)
+ Dimethyl:2H(4)13C(2) (K)
+ Dimethyl:2H(4)13C(2) (N-term)
+ Dimethyl:2H(4)13C(2) (Protein N-term)
+ Dimethyl:2H(4)13C(2) (R)
+ Dimethyl:2H(6) (K)
+ Dimethyl:2H(6) (N-term)
+ Dimethyl:2H(6) (R)
+ Dimethyl:2H(6)13C(2) (K)
+ Dimethyl:2H(6)13C(2) (N-term)
+ Dimethyl:2H(6)13C(2) (Protein N-term)
+ Dimethyl:2H(6)13C(2) (R)
+ DimethylamineGMBS (C)
+ Dimethylaminoethyl (C)
+ DimethylArsino (C)
+ Dimethylphosphothione (C)
+ Dimethylphosphothione (H)
+ Dimethylphosphothione (K)
+ Dimethylphosphothione (S)
+ Dimethylphosphothione (T)
+ Dimethylphosphothione (Y)
+ DimethylpyrroleAdduct (K)
+ Dioxidation (C)
+ Dioxidation (E)
+ Dioxidation (F)
+ Dioxidation (I)
+ Dioxidation (K)
+ Dioxidation (L)
+ Dioxidation (M)
+ Dioxidation (P)
+ Dioxidation (R)
+ Dioxidation (U)
+ Dioxidation (V)
+ Dioxidation (W)
+ Dioxidation (Y)
+ Diphthamide (H)
+ Dipyridyl (C)
+ Dipyrrolylmethanemethyl (C)
+ DMPO (C)
+ DMPO (H)
+ DMPO (Y)
+ DNCB_hapten (C)
+ DNCB_hapten (H)
+ DNCB_hapten (K)
+ DNCB_hapten (Y)
+ dNIC (K)
+ dNIC (N-term)
+ DNPS (C)
+ DNPS (W)
+ DTT (C)
+ DyLight-maleimide (C)
+ DYn-2 (C)
+ EDEDTIDVFQQQTGG (K)
+ EDT-iodoacetyl-PEO-biotin (S)
+ EDT-iodoacetyl-PEO-biotin (T)
+ EDT-maleimide-PEO-biotin (S)
+ EDT-maleimide-PEO-biotin (T)
+ EEEDVIEVYQEQTGG (K)
+ EGCG1 (C)
+ EGCG2 (C)
+ EHD-diphenylpentanone (C)
+ EHD-diphenylpentanone (M)
+ EQAT (C)
+ EQAT:2H(5) (C)
+ EQIGG (K)
+ ESP (K)
+ ESP (N-term)
+ ESP:2H(10) (K)
+ ESP:2H(10) (N-term)
+ Ethanedithiol (S)
+ Ethanedithiol (T)
+ Ethanolamine (C)
+ Ethanolamine (C-term)
+ Ethanolamine (D)
+ Ethanolamine (E)
+ Ethanolyl (C)
+ Ethanolyl (K)
+ Ethanolyl (R)
+ Ethoxyformyl (H)
+ Ethyl (C-term)
+ Ethyl (D)
+ Ethyl (E)
+ Ethyl (K)
+ Ethyl (N-term)
+ Ethyl (Protein N-term)
+ Ethyl+Deamidated (N)
+ Ethyl+Deamidated (Q)
+ ethylamino (S)
+ ethylamino (T)
+ Ethylphosphate (K)
+ Ethylphosphate (N-term)
+ Ethylphosphate (S)
+ Ethylphosphate (T)
+ Ethylphosphate (Y)
+ ethylsulfonylethyl (C)
+ ethylsulfonylethyl (H)
+ ethylsulfonylethyl (K)
+ ExacTagAmine (K)
+ ExacTagThiol (C)
+ FAD (C)
+ FAD (H)
+ FAD (Y)
+ Farnesyl (C)
+ Fluorescein (C)
+ Fluorescein-tyramine (Y)
+ Fluoro (A)
+ Fluoro (F)
+ Fluoro (W)
+ Fluoro (Y)
+ FMN (S)
+ FMN (T)
+ FMNC (C)
+ FMNH (C)
+ FMNH (H)
+ FNEM (C)
+ Formyl (K)
+ Formyl (N-term)
+ Formyl (Protein N-term)
+ Formyl (S)
+ Formyl (T)
+ Formylasparagine (H)
+ FormylMet (Protein N-term)
+ FP-Biotin (K)
+ FP-Biotin (S)
+ FP-Biotin (T)
+ FP-Biotin (Y)
+ FTC (C)
+ FTC (K)
+ FTC (P)
+ FTC (R)
+ FTC (S)
+ Furan (Y)
+ G-H1 (R)
+ Galactosyl (K)
+ Galactosyl (N-term)
+ GEE (Q)
+ GeranylGeranyl (C)
+ GG (C)
+ GG (K)
+ GG (Protein N-term)
+ GG (S)
+ GG (T)
+ GGQ (K)
+ GIST-Quat (K)
+ GIST-Quat (N-term)
+ GIST-Quat:2H(3) (K)
+ GIST-Quat:2H(3) (N-term)
+ GIST-Quat:2H(6) (K)
+ GIST-Quat:2H(6) (N-term)
+ GIST-Quat:2H(9) (K)
+ GIST-Quat:2H(9) (N-term)
+ Gln->Ala (Q)
+ Gln->Arg (Q)
+ Gln->Asn (Q)
+ Gln->Asp (Q)
+ Gln->Cys (Q)
+ Gln->Glu (Q)
+ Gln->Gly (Q)
+ Gln->His (Q)
+ Gln->Lys (Q)
+ Gln->Met (Q)
+ Gln->Phe (Q)
+ Gln->Pro (Q)
+ Gln->pyro-Glu (N-term Q)
+ Gln->Ser (Q)
+ Gln->Thr (Q)
+ Gln->Trp (Q)
+ Gln->Tyr (Q)
+ Gln->Val (Q)
+ Gln->Xle (Q)
+ Glu (E)
+ Glu (Protein C-term)
+ Glu->Ala (E)
+ Glu->Arg (E)
+ Glu->Asn (E)
+ Glu->Asp (E)
+ Glu->Cys (E)
+ Glu->Gln (E)
+ Glu->Gly (E)
+ Glu->His (E)
+ Glu->Lys (E)
+ Glu->Met (E)
+ Glu->Phe (E)
+ Glu->Pro (E)
+ Glu->pyro-Glu (N-term E)
+ Glu->pyro-Glu+Methyl (N-term E)
+ Glu->pyro-Glu+Methyl (N-term E)
+ Glu->pyro-Glu+Methyl:2H(2)13C (N-term E)
+ Glu->pyro-Glu+Methyl:2H(2)13C(1) (N-term E)
+ Glu->Ser (E)
+ Glu->Thr (E)
+ Glu->Trp (E)
+ Glu->Tyr (E)
+ Glu->Val (E)
+ Glu->Xle (E)
+ glucosone (R)
+ Glucosylgalactosyl (K)
+ Glucuronyl (Protein N-term)
+ Glucuronyl (S)
+ Glucuronyl (T)
+ GluGlu (E)
+ GluGlu (Protein C-term)
+ GluGluGlu (E)
+ GluGluGlu (Protein C-term)
+ GluGluGluGlu (E)
+ GluGluGluGlu (Protein C-term)
+ Gluratylation (K)
+ Glutathione (C)
+ Gly (K)
+ Gly (S)
+ Gly (T)
+ Gly->Ala (G)
+ Gly->Arg (G)
+ Gly->Asn (G)
+ Gly->Asp (G)
+ Gly->Cys (G)
+ Gly->Gln (G)
+ Gly->Glu (G)
+ Gly->His (G)
+ Gly->Lys (G)
+ Gly->Met (G)
+ Gly->Phe (G)
+ Gly->Pro (G)
+ Gly->Ser (G)
+ Gly->Thr (G)
+ Gly->Trp (G)
+ Gly->Tyr (G)
+ Gly->Val (G)
+ Gly->Xle (G)
+ Gly-loss+Amide (C-term G)
+ Glycerophospho (S)
+ GlycerylPE (E)
+ glycidamide (K)
+ glycidamide (N-term)
+ Glycosyl (P)
+ glyoxalAGE (R)
+ GNLLFLACYCIGG (K)
+ GPIanchor (Protein C-term)
+ Guanidinyl (K)
+ Guanidinyl (N-term)
+ Haloxon (C)
+ Haloxon (H)
+ Haloxon (K)
+ Haloxon (S)
+ Haloxon (T)
+ Haloxon (Y)
+ HCysteinyl (C)
+ HCysThiolactone (K)
+ Heme (C)
+ Heme (H)
+ Hep (K)
+ Hep (N)
+ Hep (Q)
+ Hep (R)
+ Hep (S)
+ Hep (T)
+ Hex (C)
+ Hex (K)
+ Hex (N)
+ Hex (N-term)
+ Hex (R)
+ Hex (S)
+ Hex (T)
+ Hex (W)
+ Hex (Y)
+ Hex(1)HexA(1) (S)
+ Hex(1)HexA(1) (T)
+ Hex(1)HexA(1)HexNAc(1) (S)
+ Hex(1)HexA(1)HexNAc(1) (T)
+ Hex(1)HexA(1)HexNAc(2) (S)
+ Hex(1)HexA(1)HexNAc(2) (T)
+ Hex(1)HexNAc(1) (N)
+ Hex(1)HexNAc(1) (S)
+ Hex(1)HexNAc(1) (T)
+ Hex(1)HexNAc(1)dHex(1) (N)
+ Hex(1)HexNAc(1)dHex(1) (S)
+ Hex(1)HexNAc(1)dHex(1) (T)
+ Hex(1)HexNAc(1)dHex(1)Me(1) (S)
+ Hex(1)HexNAc(1)dHex(1)Me(1) (T)
+ Hex(1)HexNAc(1)dHex(1)Me(2) (S)
+ Hex(1)HexNAc(1)dHex(1)Me(2) (T)
+ Hex(1)HexNAc(1)Kdn(1)Sulf(1) (S)
+ Hex(1)HexNAc(1)Kdn(1)Sulf(1) (T)
+ Hex(1)HexNAc(1)NeuAc(1) (N)
+ Hex(1)HexNAc(1)NeuAc(1) (S)
+ Hex(1)HexNAc(1)NeuAc(1) (T)
+ Hex(1)HexNAc(1)NeuAc(1)Ac(1) (S)
+ Hex(1)HexNAc(1)NeuAc(1)Ac(1) (T)
+ Hex(1)HexNAc(1)NeuAc(1)NeuGc(1) (S)
+ Hex(1)HexNAc(1)NeuAc(1)NeuGc(1) (T)
+ Hex(1)HexNAc(1)NeuAc(1)Sulf(1) (S)
+ Hex(1)HexNAc(1)NeuAc(1)Sulf(1) (T)
+ Hex(1)HexNAc(1)NeuAc(2) (N)
+ Hex(1)HexNAc(1)NeuAc(2) (S)
+ Hex(1)HexNAc(1)NeuAc(2) (T)
+ Hex(1)HexNAc(1)NeuAc(2)Ac(1) (S)
+ Hex(1)HexNAc(1)NeuAc(2)Ac(1) (T)
+ Hex(1)HexNAc(1)NeuAc(2)Ac(2) (S)
+ Hex(1)HexNAc(1)NeuAc(2)Ac(2) (T)
+ Hex(1)HexNAc(1)NeuAc(3) (S)
+ Hex(1)HexNAc(1)NeuAc(3) (T)
+ Hex(1)HexNAc(1)NeuGc(1) (S)
+ Hex(1)HexNAc(1)NeuGc(1) (T)
+ Hex(1)HexNAc(1)NeuGc(2) (S)
+ Hex(1)HexNAc(1)NeuGc(2) (T)
+ Hex(1)HexNAc(1)NeuGc(3) (S)
+ Hex(1)HexNAc(1)NeuGc(3) (T)
+ Hex(1)HexNAc(1)NeuGc(4) (S)
+ Hex(1)HexNAc(1)NeuGc(4) (T)
+ Hex(1)HexNAc(1)NeuGc(5) (S)
+ Hex(1)HexNAc(1)NeuGc(5) (T)
+ Hex(1)HexNAc(1)Phos(1) (S)
+ Hex(1)HexNAc(1)Phos(1) (T)
+ Hex(1)HexNAc(1)Sulf(1) (S)
+ Hex(1)HexNAc(1)Sulf(1) (T)
+ Hex(1)HexNAc(2) (N)
+ Hex(1)HexNAc(2) (S)
+ Hex(1)HexNAc(2) (T)
+ Hex(1)HexNAc(2)dHex(1) (N)
+ Hex(1)HexNAc(2)dHex(1) (S)
+ Hex(1)HexNAc(2)dHex(1) (T)
+ Hex(1)HexNAc(2)dHex(1)Pent(1) (N)
+ Hex(1)HexNAc(2)dHex(2) (N)
+ Hex(1)HexNAc(2)dHex(2) (S)
+ Hex(1)HexNAc(2)dHex(2) (T)
+ Hex(1)HexNAc(2)dHex(2)Sulf(1) (S)
+ Hex(1)HexNAc(2)dHex(2)Sulf(1) (T)
+ Hex(1)HexNAc(2)NeuAc(1) (S)
+ Hex(1)HexNAc(2)NeuAc(1) (T)
+ Hex(1)HexNAc(2)NeuAc(1)Sulf(1) (S)
+ Hex(1)HexNAc(2)NeuAc(1)Sulf(1) (T)
+ Hex(1)HexNAc(2)NeuAc(2) (S)
+ Hex(1)HexNAc(2)NeuAc(2) (T)
+ Hex(1)HexNAc(2)NeuAc(2)Sulf(1) (S)
+ Hex(1)HexNAc(2)NeuAc(2)Sulf(1) (T)
+ Hex(1)HexNAc(2)NeuGc(1) (S)
+ Hex(1)HexNAc(2)NeuGc(1) (T)
+ Hex(1)HexNAc(2)Pent(1) (N)
+ Hex(1)HexNAc(2)Sulf(1) (S)
+ Hex(1)HexNAc(2)Sulf(1) (T)
+ Hex(1)HexNAc(3) (S)
+ Hex(1)HexNAc(3) (T)
+ Hex(1)HexNAc(3)NeuAc(1) (S)
+ Hex(1)HexNAc(3)NeuAc(1) (T)
+ Hex(1)HexNAc(3)NeuAc(2) (S)
+ Hex(1)HexNAc(3)NeuAc(2) (T)
+ Hex(1)HexNAc(3)NeuGc(1) (S)
+ Hex(1)HexNAc(3)NeuGc(1) (T)
+ Hex(1)HexNAc(3)Sulf(1) (S)
+ Hex(1)HexNAc(3)Sulf(1) (T)
+ Hex(1)HexNAc(4)dHex(1)Sulf(1) (S)
+ Hex(1)HexNAc(4)dHex(1)Sulf(1) (T)
+ Hex(1)NeuAc(1) (S)
+ Hex(1)NeuAc(1) (T)
+ Hex(1)NeuAc(1)Pent(1) (S)
+ Hex(1)NeuAc(1)Pent(1) (T)
+ Hex(1)NeuGc(1) (S)
+ Hex(1)NeuGc(1) (T)
+ Hex(1)Pent(1) (S)
+ Hex(1)Pent(1) (T)
+ Hex(1)Pent(2) (S)
+ Hex(1)Pent(2) (T)
+ Hex(1)Pent(2)Me(1) (S)
+ Hex(1)Pent(2)Me(1) (T)
+ Hex(1)Pent(3) (S)
+ Hex(1)Pent(3) (T)
+ Hex(1)Pent(3)Me(1) (S)
+ Hex(1)Pent(3)Me(1) (T)
+ Hex(10)HexNAc(1) (N)
+ Hex(10)Phos(3) (S)
+ Hex(10)Phos(3) (T)
+ Hex(2) (K)
+ Hex(2) (R)
+ Hex(2) (S)
+ Hex(2) (T)
+ Hex(2)HexA(1)HexNAc(1)Sulf(1) (S)
+ Hex(2)HexA(1)HexNAc(1)Sulf(1) (T)
+ Hex(2)HexA(1)NeuAc(1)Pent(1)Sulf(1) (S)
+ Hex(2)HexA(1)NeuAc(1)Pent(1)Sulf(1) (T)
+ Hex(2)HexA(1)Pent(1)Sulf(1) (S)
+ Hex(2)HexA(1)Pent(1)Sulf(1) (T)
+ Hex(2)HexNAc(1) (N)
+ Hex(2)HexNAc(1) (S)
+ Hex(2)HexNAc(1) (T)
+ Hex(2)HexNAc(1)Me(1) (S)
+ Hex(2)HexNAc(1)Me(1) (T)
+ Hex(2)HexNAc(1)NeuGc(1) (S)
+ Hex(2)HexNAc(1)NeuGc(1) (T)
+ Hex(2)HexNAc(1)NeuGc(2) (S)
+ Hex(2)HexNAc(1)NeuGc(2) (T)
+ Hex(2)HexNAc(1)NeuGc(3) (S)
+ Hex(2)HexNAc(1)NeuGc(3) (T)
+ Hex(2)HexNAc(1)NeuGc(4) (S)
+ Hex(2)HexNAc(1)NeuGc(4) (T)
+ Hex(2)HexNAc(1)Pent(1)HexA(1) (S)
+ Hex(2)HexNAc(1)Pent(1)HexA(1) (T)
+ Hex(2)HexNAc(1)Sulf(1) (S)
+ Hex(2)HexNAc(1)Sulf(1) (T)
+ Hex(2)HexNAc(2) (N)
+ Hex(2)HexNAc(2) (S)
+ Hex(2)HexNAc(2) (T)
+ Hex(2)HexNAc(2)dHex(1) (N)
+ Hex(2)HexNAc(2)dHex(1) (S)
+ Hex(2)HexNAc(2)dHex(1) (T)
+ Hex(2)HexNAc(2)NeuAc(1) (N)
+ Hex(2)HexNAc(2)NeuAc(1) (S)
+ Hex(2)HexNAc(2)NeuAc(1) (T)
+ Hex(2)HexNAc(2)NeuAc(1)Sulf(1) (S)
+ Hex(2)HexNAc(2)NeuAc(1)Sulf(1) (T)
+ Hex(2)HexNAc(2)NeuAc(2) (S)
+ Hex(2)HexNAc(2)NeuAc(2) (T)
+ Hex(2)HexNAc(2)NeuAc(2)Sulf(1) (S)
+ Hex(2)HexNAc(2)NeuAc(2)Sulf(1) (T)
+ Hex(2)HexNAc(2)NeuGc(1) (S)
+ Hex(2)HexNAc(2)NeuGc(1) (T)
+ Hex(2)HexNAc(2)Pent(1) (N)
+ Hex(2)HexNAc(2)Sulf(1) (S)
+ Hex(2)HexNAc(2)Sulf(1) (T)
+ Hex(2)HexNAc(3) (N)
+ Hex(2)HexNAc(3) (S)
+ Hex(2)HexNAc(3) (T)
+ Hex(2)HexNAc(3)NeuAc(1)NeuGc(1) (S)
+ Hex(2)HexNAc(3)NeuAc(1)NeuGc(1) (T)
+ Hex(2)HexNAc(3)NeuAc(1)Sulf(1) (S)
+ Hex(2)HexNAc(3)NeuAc(1)Sulf(1) (T)
+ Hex(2)HexNAc(3)NeuAc(2) (S)
+ Hex(2)HexNAc(3)NeuAc(2) (T)
+ Hex(2)HexNAc(3)NeuAc(3) (S)
+ Hex(2)HexNAc(3)NeuAc(3) (T)
+ Hex(2)HexNAc(3)NeuGc(1) (S)
+ Hex(2)HexNAc(3)NeuGc(1) (T)
+ Hex(2)HexNAc(3)NeuGc(2) (S)
+ Hex(2)HexNAc(3)NeuGc(2) (T)
+ Hex(2)HexNAc(3)NeuGc(3) (S)
+ Hex(2)HexNAc(3)NeuGc(3) (T)
+ Hex(2)HexNAc(3)Sulf(1) (S)
+ Hex(2)HexNAc(3)Sulf(1) (T)
+ Hex(2)HexNAc(4) (N)
+ Hex(2)HexNAc(4) (S)
+ Hex(2)HexNAc(4) (T)
+ Hex(2)HexNAc(4)NeuAc(1) (S)
+ Hex(2)HexNAc(4)NeuAc(1) (T)
+ Hex(2)HexNAc(5) (S)
+ Hex(2)HexNAc(5) (T)
+ Hex(2)NeuAc(1) (S)
+ Hex(2)NeuAc(1) (T)
+ Hex(2)Pent(2) (S)
+ Hex(2)Pent(2) (T)
+ Hex(2)Pent(2)Me(1) (S)
+ Hex(2)Pent(2)Me(1) (T)
+ Hex(2)Sulf(1) (S)
+ Hex(2)Sulf(1) (T)
+ Hex(3) (N)
+ Hex(3) (S)
+ Hex(3) (T)
+ Hex(3)HexNAc(1) (N)
+ Hex(3)HexNAc(1) (S)
+ Hex(3)HexNAc(1) (T)
+ Hex(3)HexNAc(1)HexA(1) (S)
+ Hex(3)HexNAc(1)HexA(1) (T)
+ Hex(3)HexNAc(1)Me(1) (S)
+ Hex(3)HexNAc(1)Me(1) (T)
+ Hex(3)HexNAc(1)Pent(1) (N)
+ Hex(3)HexNAc(2) (N)
+ Hex(3)HexNAc(2) (S)
+ Hex(3)HexNAc(2) (T)
+ Hex(3)HexNAc(2)NeuAc(1) (N)
+ Hex(3)HexNAc(2)NeuAc(2) (S)
+ Hex(3)HexNAc(2)NeuAc(2) (T)
+ Hex(3)HexNAc(2)Pent(1) (N)
+ Hex(3)HexNAc(2)Phos(1) (N)
+ Hex(3)HexNAc(3) (N)
+ Hex(3)HexNAc(3) (S)
+ Hex(3)HexNAc(3) (T)
+ Hex(3)HexNAc(3)NeuAc(1) (S)
+ Hex(3)HexNAc(3)NeuAc(1) (T)
+ Hex(3)HexNAc(3)NeuAc(1)Sulf(1) (S)
+ Hex(3)HexNAc(3)NeuAc(1)Sulf(1) (T)
+ Hex(3)HexNAc(3)NeuAc(2) (S)
+ Hex(3)HexNAc(3)NeuAc(2) (T)
+ Hex(3)HexNAc(3)NeuAc(2)Sulf(1) (S)
+ Hex(3)HexNAc(3)NeuAc(2)Sulf(1) (T)
+ Hex(3)HexNAc(3)NeuAc(3) (S)
+ Hex(3)HexNAc(3)NeuAc(3) (T)
+ Hex(3)HexNAc(3)NeuGc(1) (S)
+ Hex(3)HexNAc(3)NeuGc(1) (T)
+ Hex(3)HexNAc(3)NeuGc(1)Sulf(1) (S)
+ Hex(3)HexNAc(3)NeuGc(1)Sulf(1) (T)
+ Hex(3)HexNAc(3)Pent(1) (N)
+ Hex(3)HexNAc(3)Sulf(1) (N)
+ Hex(3)HexNAc(3)Sulf(1) (S)
+ Hex(3)HexNAc(3)Sulf(1) (T)
+ Hex(3)HexNAc(4) (N)
+ Hex(3)HexNAc(4) (S)
+ Hex(3)HexNAc(4) (T)
+ Hex(3)HexNAc(4)NeuAc(1) (N)
+ Hex(3)HexNAc(4)NeuAc(2) (N)
+ Hex(3)HexNAc(4)Pent(1) (N)
+ Hex(3)HexNAc(4)Sulf(1) (N)
+ Hex(3)HexNAc(5) (N)
+ Hex(3)HexNAc(5) (S)
+ Hex(3)HexNAc(5) (T)
+ Hex(3)HexNAc(5)NeuAc(1) (N)
+ Hex(3)HexNAc(5)Sulf(1) (N)
+ Hex(3)HexNAc(6) (N)
+ Hex(3)HexNAc(6) (S)
+ Hex(3)HexNAc(6) (T)
+ Hex(3)HexNAc(6)NeuAc(1) (N)
+ Hex(3)HexNAc(6)Sulf(1) (N)
+ Hex(3)HexNAc(6)Sulf(2) (N)
+ Hex(3)HexNAc(7) (N)
+ Hex(3)HexNAc(7)Sulf(1) (N)
+ Hex(4) (S)
+ Hex(4) (T)
+ Hex(4)HexA(1) (S)
+ Hex(4)HexA(1) (T)
+ Hex(4)HexA(1)HexNAc(1) (S)
+ Hex(4)HexA(1)HexNAc(1) (T)
+ Hex(4)HexNAc(1) (N)
+ Hex(4)HexNAc(1) (S)
+ Hex(4)HexNAc(1) (T)
+ Hex(4)HexNAc(2) (N)
+ Hex(4)HexNAc(2)NeuAc(1) (N)
+ Hex(4)HexNAc(2)NeuAc(1) (S)
+ Hex(4)HexNAc(2)NeuAc(1) (T)
+ Hex(4)HexNAc(2)Pent(1) (N)
+ Hex(4)HexNAc(3) (N)
+ Hex(4)HexNAc(3) (S)
+ Hex(4)HexNAc(3) (T)
+ Hex(4)HexNAc(3)NeuAc(1) (N)
+ Hex(4)HexNAc(3)NeuAc(1) (S)
+ Hex(4)HexNAc(3)NeuAc(1) (T)
+ Hex(4)HexNAc(3)NeuAc(2) (N)
+ Hex(4)HexNAc(3)NeuGc(1) (N)
+ Hex(4)HexNAc(3)Pent(1) (N)
+ Hex(4)HexNAc(4) (N)
+ Hex(4)HexNAc(4) (S)
+ Hex(4)HexNAc(4) (T)
+ Hex(4)HexNAc(4)Me(2)Pent(1) (N)
+ Hex(4)HexNAc(4)NeuAc(1) (N)
+ Hex(4)HexNAc(4)NeuAc(1) (S)
+ Hex(4)HexNAc(4)NeuAc(1) (T)
+ Hex(4)HexNAc(4)NeuAc(1)Sulf(2) (S)
+ Hex(4)HexNAc(4)NeuAc(1)Sulf(2) (T)
+ Hex(4)HexNAc(4)NeuAc(1)Sulf(3) (S)
+ Hex(4)HexNAc(4)NeuAc(1)Sulf(3) (T)
+ Hex(4)HexNAc(4)NeuGc(1) (N)
+ Hex(4)HexNAc(4)NeuGc(1) (S)
+ Hex(4)HexNAc(4)NeuGc(1) (T)
+ Hex(4)HexNAc(4)NeuGc(1)Sulf(2) (S)
+ Hex(4)HexNAc(4)NeuGc(1)Sulf(2) (T)
+ Hex(4)HexNAc(4)Pent(1) (N)
+ Hex(4)HexNAc(4)Sulf(1) (N)
+ Hex(4)HexNAc(4)Sulf(2) (S)
+ Hex(4)HexNAc(4)Sulf(2) (T)
+ Hex(4)HexNAc(5) (N)
+ Hex(4)HexNAc(5)NeuAc(1) (N)
+ Hex(4)HexNAc(5)Sulf(1) (N)
+ Hex(4)HexNAc(6) (N)
+ Hex(4)Phos(1) (S)
+ Hex(4)Phos(1) (T)
+ Hex(5) (S)
+ Hex(5) (T)
+ Hex(5)HexA(1) (S)
+ Hex(5)HexA(1) (T)
+ Hex(5)HexNAc(1) (N)
+ Hex(5)HexNAc(1) (S)
+ Hex(5)HexNAc(1) (T)
+ Hex(5)HexNAc(2) (N)
+ Hex(5)HexNAc(2)Phos(1) (N)
+ Hex(5)HexNAc(3) (N)
+ Hex(5)HexNAc(3)Pent(1) (N)
+ Hex(5)HexNAc(4) (N)
+ Hex(5)HexNAc(4) (S)
+ Hex(5)HexNAc(4) (T)
+ Hex(5)HexNAc(4)Me(2)Pent(1) (N)
+ Hex(5)HexNAc(4)NeuAc(1) (N)
+ Hex(5)HexNAc(4)NeuAc(1)Ac(1) (N)
+ Hex(5)HexNAc(4)NeuAc(1)Ac(2) (N)
+ Hex(5)HexNAc(4)NeuAc(1)Sulf(1) (N)
+ Hex(5)HexNAc(4)NeuAc(2) (N)
+ Hex(5)HexNAc(4)NeuGc(1) (N)
+ Hex(5)HexNAc(4)Sulf(1) (N)
+ Hex(5)HexNAc(5) (N)
+ Hex(5)HexNAc(5) (S)
+ Hex(5)HexNAc(5) (T)
+ Hex(5)Phos(1) (S)
+ Hex(5)Phos(1) (T)
+ Hex(5)Phos(3) (S)
+ Hex(5)Phos(3) (T)
+ Hex(6)HexNAc(1) (N)
+ Hex(6)HexNAc(2) (N)
+ Hex(6)HexNAc(2)Phos(1) (N)
+ Hex(6)HexNAc(3) (N)
+ Hex(6)HexNAc(3)Phos(1) (N)
+ Hex(6)HexNAc(4) (N)
+ Hex(6)HexNAc(4) (S)
+ Hex(6)HexNAc(4) (T)
+ Hex(6)HexNAc(4)Me(3) (N)
+ Hex(6)HexNAc(4)Me(3)Pent(1) (N)
+ Hex(6)HexNAc(5) (N)
+ Hex(6)Phos(1) (S)
+ Hex(6)Phos(1) (T)
+ Hex(6)Phos(3) (S)
+ Hex(6)Phos(3) (T)
+ Hex(7)HexNAc(1) (N)
+ Hex(7)HexNAc(2) (N)
+ Hex(7)HexNAc(2)Phos(1) (N)
+ Hex(7)HexNAc(2)Phos(2) (N)
+ Hex(7)HexNAc(3) (N)
+ Hex(7)HexNAc(3)Phos(1) (N)
+ Hex(7)HexNAc(4) (N)
+ Hex(7)Phos(3) (S)
+ Hex(7)Phos(3) (T)
+ Hex(8)HexNAc(1) (N)
+ Hex(8)HexNAc(2) (N)
+ Hex(8)Phos(3) (S)
+ Hex(8)Phos(3) (T)
+ Hex(9) (N)
+ Hex(9)HexNAc(1) (N)
+ Hex(9)HexNAc(2) (N)
+ Hex(9)Phos(3) (S)
+ Hex(9)Phos(3) (T)
+ HexA(2)HexNAc(3) (S)
+ HexA(2)HexNAc(3) (T)
+ HexN (K)
+ HexN (N)
+ HexN (S)
+ HexN (T)
+ HexN (W)
+ HexNAc (C)
+ HexNAc (N)
+ HexNAc (S)
+ HexNAc (T)
+ HexNAc(1)dHex(1) (N)
+ HexNAc(1)dHex(1) (S)
+ HexNAc(1)dHex(1) (T)
+ HexNAc(1)dHex(2) (N)
+ HexNAc(1)Kdn(2) (S)
+ HexNAc(1)Kdn(2) (T)
+ HexNAc(1)NeuAc(1) (S)
+ HexNAc(1)NeuAc(1) (T)
+ HexNAc(1)NeuGc(1) (S)
+ HexNAc(1)NeuGc(1) (T)
+ HexNAc(1)NeuGc(2) (S)
+ HexNAc(1)NeuGc(2) (T)
+ HexNAc(2) (N)
+ HexNAc(2) (S)
+ HexNAc(2) (T)
+ HexNAc(2)dHex(1) (N)
+ HexNAc(2)dHex(2) (N)
+ HexNAc(2)NeuAc(1) (S)
+ HexNAc(2)NeuAc(1) (T)
+ HexNAc(2)NeuAc(1)Sulf(1) (S)
+ HexNAc(2)NeuAc(1)Sulf(1) (T)
+ HexNAc(2)NeuGc(1) (S)
+ HexNAc(2)NeuGc(1) (T)
+ HexNAc(2)Sulf(1) (S)
+ HexNAc(2)Sulf(1) (T)
+ HexNAc(3) (S)
+ HexNAc(3) (T)
+ HexNAc(3)Sulf(1) (S)
+ HexNAc(3)Sulf(1) (T)
+ HexNAc(4) (S)
+ HexNAc(4) (T)
+ HexNAc(5) (S)
+ HexNAc(5) (T)
+ His->Ala (H)
+ His->Arg (H)
+ His->Asn (H)
+ His->Asp (H)
+ His->Cys (H)
+ His->Gln (H)
+ His->Glu (H)
+ His->Gly (H)
+ His->Lys (H)
+ His->Met (H)
+ His->Phe (H)
+ His->Pro (H)
+ His->Ser (H)
+ His->Thr (H)
+ His->Trp (H)
+ His->Tyr (H)
+ His->Val (H)
+ His->Xle (H)
+ HMVK (C)
+ HN2_mustard (C)
+ HN2_mustard (H)
+ HN2_mustard (K)
+ HN3_mustard (C)
+ HN3_mustard (H)
+ HN3_mustard (K)
+ HNE (A)
+ HNE (C)
+ HNE (H)
+ HNE (K)
+ HNE (L)
+ HNE+Delta:H(2) (C)
+ HNE+Delta:H(2) (H)
+ HNE+Delta:H(2) (K)
+ HNE-BAHAH (C)
+ HNE-BAHAH (H)
+ HNE-BAHAH (K)
+ HNE-Delta:H(2)O (C)
+ HNE-Delta:H(2)O (H)
+ HNE-Delta:H(2)O (K)
+ Homocysteic_acid (M)
+ HPG (R)
+ Hydroxamic_acid (D)
+ Hydroxamic_acid (E)
+ Hydroxycinnamyl (C)
+ Hydroxyfarnesyl (C)
+ Hydroxyheme (E)
+ hydroxyisobutyryl (K)
+ Hydroxymethyl (N)
+ HydroxymethylOP (K)
+ Hydroxytrimethyl (K)
+ Hypusine (K)
+ IASD (C)
+ IBTP (C)
+ ICAT-C (C)
+ ICAT-C:13C(9) (C)
+ ICAT-D (C)
+ ICAT-D:2H(8) (C)
+ ICAT-G (C)
+ ICAT-G:2H(8) (C)
+ ICAT-H (C)
+ ICAT-H:13C(6) (C)
+ ICDID (C)
+ ICDID:2H(6) (C)
+ ICPL (K)
+ ICPL (N-term)
+ ICPL (Protein N-term)
+ ICPL:13C(6) (K)
+ ICPL:13C(6) (N-term)
+ ICPL:13C(6) (Protein N-term)
+ ICPL:13C(6)2H(4) (K)
+ ICPL:13C(6)2H(4) (N-term)
+ ICPL:13C(6)2H(4) (Protein N-term)
+ ICPL:2H(4) (K)
+ ICPL:2H(4) (N-term)
+ ICPL:2H(4) (Protein N-term)
+ IDEnT (C)
+ IED-Biotin (C)
+ IGBP (C)
+ IGBP:13C(2) (C)
+ IMEHex(2)NeuAc(1) (K)
+ IMID (K)
+ IMID:2H(4) (K)
+ Iminobiotin (K)
+ Iminobiotin (N-term)
+ Iodo (H)
+ Iodo (Y)
+ Iodoacetanilide (C)
+ Iodoacetanilide (K)
+ Iodoacetanilide (N-term)
+ Iodoacetanilide:13C(6) (C)
+ Iodoacetanilide:13C(6) (K)
+ Iodoacetanilide:13C(6) (N-term)
+ iodoTMT (C)
+ iodoTMT (D)
+ iodoTMT (E)
+ iodoTMT (H)
+ iodoTMT (K)
+ iodoTMT6plex (C)
+ iodoTMT6plex (D)
+ iodoTMT6plex (E)
+ iodoTMT6plex (H)
+ iodoTMT6plex (K)
+ IodoU-AMP (F)
+ IodoU-AMP (W)
+ IodoU-AMP (Y)
+ ISD_z+2_ion (N-term)
+ Isopropylphospho (S)
+ Isopropylphospho (T)
+ Isopropylphospho (Y)
+ iTRAQ4plex (C)
+ iTRAQ4plex (H)
+ iTRAQ4plex (K)
+ iTRAQ4plex (N-term)
+ iTRAQ4plex (Protein N-term)
+ iTRAQ4plex (S)
+ iTRAQ4plex (T)
+ iTRAQ4plex (Y)
+ iTRAQ4plex114 (C)
+ iTRAQ4plex114 (K)
+ iTRAQ4plex114 (N-term)
+ iTRAQ4plex114 (Y)
+ iTRAQ4plex115 (C)
+ iTRAQ4plex115 (K)
+ iTRAQ4plex115 (N-term)
+ iTRAQ4plex115 (Y)
+ iTRAQ8plex (C)
+ iTRAQ8plex (H)
+ iTRAQ8plex (K)
+ iTRAQ8plex (N-term)
+ iTRAQ8plex (Protein N-term)
+ iTRAQ8plex (S)
+ iTRAQ8plex (T)
+ iTRAQ8plex (Y)
+ iTRAQ8plex:13C(6)15N(2) (C)
+ iTRAQ8plex:13C(6)15N(2) (K)
+ iTRAQ8plex:13C(6)15N(2) (N-term)
+ iTRAQ8plex:13C(6)15N(2) (Y)
+ Label:13C(1)2H(3) (M)
+ Label:13C(1)2H(3)+Oxidation (M)
+ Label:13C(2)15N(2) (K)
+ Label:13C(3) (A)
+ Label:13C(3)15N(1) (A)
+ Label:13C(4) (M)
+ Label:13C(4)+Oxidation (M)
+ Label:13C(4)15N(1) (D)
+ Label:13C(4)15N(2)+GG (K)
+ Label:13C(5) (P)
+ Label:13C(5)15N(1) (E)
+ Label:13C(5)15N(1) (M)
+ Label:13C(5)15N(1) (P)
+ Label:13C(5)15N(1) (V)
+ Label:13C(6) (I)
+ Label:13C(6) (K)
+ Label:13C(6) (L)
+ Label:13C(6) (R)
+ Label:13C(6)+Acetyl (K)
+ Label:13C(6)+Dimethyl (K)
+ Label:13C(6)+GG (K)
+ Label:13C(6)15N(1) (I)
+ Label:13C(6)15N(1) (L)
+ Label:13C(6)15N(2) (K)
+ Label:13C(6)15N(2)+Acetyl (K)
+ Label:13C(6)15N(2)+Dimethyl (K)
+ Label:13C(6)15N(2)+GG (K)
+ Label:13C(6)15N(4) (R)
+ Label:13C(6)15N(4)+Dimethyl (R)
+ Label:13C(6)15N(4)+Dimethyl:2H(6)13C(2) (R)
+ Label:13C(6)15N(4)+Methyl (R)
+ Label:13C(6)15N(4)+Methyl:2H(3)13C(1) (R)
+ Label:13C(9) (F)
+ Label:13C(9) (Y)
+ Label:13C(9)+Phospho (Y)
+ Label:13C(9)15N(1) (F)
+ Label:15N(1) (A)
+ Label:15N(1) (C)
+ Label:15N(1) (D)
+ Label:15N(1) (E)
+ Label:15N(1) (F)
+ Label:15N(1) (G)
+ Label:15N(1) (I)
+ Label:15N(1) (L)
+ Label:15N(1) (M)
+ Label:15N(1) (P)
+ Label:15N(1) (S)
+ Label:15N(1) (T)
+ Label:15N(1) (V)
+ Label:15N(1) (Y)
+ Label:15N(2) (K)
+ Label:15N(2) (N)
+ Label:15N(2) (Q)
+ Label:15N(2) (W)
+ Label:15N(2)2H(9) (K)
+ Label:15N(3) (H)
+ Label:15N(4) (R)
+ Label:18O(1) (C-term)
+ Label:18O(1) (S)
+ Label:18O(1) (T)
+ Label:18O(1) (Y)
+ Label:18O(2) (C-term)
+ Label:2H(10) (L)
+ Label:2H(3) (L)
+ Label:2H(3) (M)
+ Label:2H(3)+Oxidation (M)
+ Label:2H(4) (A)
+ Label:2H(4) (F)
+ Label:2H(4) (K)
+ Label:2H(4) (U)
+ Label:2H(4) (Y)
+ Label:2H(4)+Acetyl (K)
+ Label:2H(4)+GG (K)
+ Label:2H(4)13C(1) (R)
+ Label:2H(6)15N(1) (P)
+ Label:2H(7)15N(4) (R)
+ Label:2H(9)13C(6)15N(2) (K)
+ lapachenole (C)
+ Leu->MetOx (L)
+ LG-anhydrolactam (K)
+ LG-anhydrolactam (N-term)
+ LG-anhyropyrrole (K)
+ LG-anhyropyrrole (N-term)
+ LG-Hlactam-K (K)
+ LG-Hlactam-K (Protein N-term)
+ LG-Hlactam-R (R)
+ LG-lactam-K (K)
+ LG-lactam-K (Protein N-term)
+ LG-lactam-R (R)
+ LG-pyrrole (K)
+ LG-pyrrole (N-term)
+ Lipoyl (K)
+ LRGG (K)
+ LRGG+dimethyl (K)
+ LRGG+methyl (K)
+ Lys (N-term)
+ Lys->Ala (K)
+ Lys->Allysine (K)
+ Lys->AminoadipicAcid (K)
+ Lys->Arg (K)
+ Lys->Asn (K)
+ Lys->Asp (K)
+ Lys->CamCys (K)
+ Lys->Cys (K)
+ Lys->Gln (K)
+ Lys->Glu (K)
+ Lys->Gly (K)
+ Lys->His (K)
+ Lys->Met (K)
+ Lys->MetOx (K)
+ Lys->Phe (K)
+ Lys->Pro (K)
+ Lys->Ser (K)
+ Lys->Thr (K)
+ Lys->Trp (K)
+ Lys->Tyr (K)
+ Lys->Val (K)
+ Lys->Xle (K)
+ Lys-loss (Protein C-term K)
+ Lysbiotinhydrazide (K)
+ maleimide (C)
+ maleimide (K)
+ Maleimide-PEO2-Biotin (C)
+ maleimide3 (C)
+ maleimide3 (K)
+ maleimide5 (C)
+ maleimide5 (K)
+ Malonyl (C)
+ Malonyl (K)
+ Malonyl (S)
+ MDCC (C)
+ MeMePhosphorothioate (S)
+ Menadione (C)
+ Menadione (K)
+ Menadione-HQ (C)
+ Menadione-HQ (K)
+ MercaptoEthanol (S)
+ MercaptoEthanol (T)
+ MesitylOxide (H)
+ MesitylOxide (K)
+ MesitylOxide (Protein N-term)
+ Met->Aha (M)
+ Met->Ala (M)
+ Met->Arg (M)
+ Met->Asn (M)
+ Met->Asp (M)
+ Met->AspSA (M)
+ Met->Cys (M)
+ Met->Gln (M)
+ Met->Glu (M)
+ Met->Gly (M)
+ Met->His (M)
+ Met->Hpg (M)
+ Met->Hse (C-term M)
+ Met->Hsl (C-term M)
+ Met->Lys (M)
+ Met->Phe (M)
+ Met->Pro (M)
+ Met->Ser (M)
+ Met->Thr (M)
+ Met->Trp (M)
+ Met->Tyr (M)
+ Met->Val (M)
+ Met->Xle (M)
+ Met-loss (Protein N-term M)
+ Met-loss+Acetyl (Protein N-term M)
+ Methamidophos-O (C)
+ Methamidophos-O (H)
+ Methamidophos-O (K)
+ Methamidophos-O (S)
+ Methamidophos-O (T)
+ Methamidophos-O (Y)
+ Methamidophos-S (C)
+ Methamidophos-S (H)
+ Methamidophos-S (K)
+ Methamidophos-S (S)
+ Methamidophos-S (T)
+ Methamidophos-S (Y)
+ Methyl (C)
+ Methyl (C-term)
+ Methyl (D)
+ Methyl (E)
+ Methyl (H)
+ Methyl (I)
+ Methyl (K)
+ Methyl (L)
+ Methyl (N)
+ Methyl (N-term)
+ Methyl (Protein N-term)
+ Methyl (Q)
+ Methyl (R)
+ Methyl (S)
+ Methyl (T)
+ Methyl+Acetyl:2H(3) (K)
+ Methyl+Deamidated (N)
+ Methyl+Deamidated (Q)
+ Methyl-PEO12-Maleimide (C)
+ Methyl:2H(2) (K)
+ Methyl:2H(2) (N-term)
+ Methyl:2H(2)13C (C)
+ Methyl:2H(2)13C (C-term)
+ Methyl:2H(2)13C (D)
+ Methyl:2H(2)13C (E)
+ Methyl:2H(2)13C (H)
+ Methyl:2H(2)13C (I)
+ Methyl:2H(2)13C (K)
+ Methyl:2H(2)13C (L)
+ Methyl:2H(2)13C (N)
+ Methyl:2H(2)13C (N-term)
+ Methyl:2H(2)13C (Protein N-term)
+ Methyl:2H(2)13C (Q)
+ Methyl:2H(2)13C (R)
+ Methyl:2H(2)13C (S)
+ Methyl:2H(2)13C (T)
+ Methyl:2H(3) (D)
+ Methyl:2H(3) (E)
+ Methyl:2H(3) (K)
+ Methyl:2H(3) (R)
+ Methyl:2H(3) (X)
+ Methyl:2H(3)+Acetyl:2H(3) (K)
+ Methyl:2H(3)13C(1) (K)
+ Methyl:2H(3)13C(1) (N-term)
+ Methyl:2H(3)13C(1) (R)
+ Methylamine (S)
+ Methylamine (T)
+ Methylmalonylation (S)
+ methylol (K)
+ methylol (W)
+ methylol (Y)
+ Methylphosphonate (S)
+ Methylphosphonate (T)
+ Methylphosphonate (Y)
+ Methylpyrroline (K)
+ methylsulfonylethyl (C)
+ methylsulfonylethyl (H)
+ methylsulfonylethyl (K)
+ Methylthio (C)
+ Methylthio (D)
+ Methylthio (K)
+ Methylthio (N)
+ Methylthio (N-term)
+ MG-H1 (R)
+ Microcin (Protein C-term)
+ MicrocinC7 (Protein C-term)
+ MM-diphenylpentanone (C)
+ Molybdopterin (C)
+ MolybdopterinGD (C)
+ MolybdopterinGD (D)
+ MolybdopterinGD (U)
+ MolybdopterinGD+Delta:S(-1)Se(1) (C)
+ monomethylphosphothione (C)
+ monomethylphosphothione (H)
+ monomethylphosphothione (K)
+ monomethylphosphothione (S)
+ monomethylphosphothione (T)
+ monomethylphosphothione (Y)
+ mTRAQ (H)
+ mTRAQ (K)
+ mTRAQ (N-term)
+ mTRAQ (S)
+ mTRAQ (T)
+ mTRAQ (Y)
+ mTRAQ:13C(3)15N(1) (H)
+ mTRAQ:13C(3)15N(1) (K)
+ mTRAQ:13C(3)15N(1) (N-term)
+ mTRAQ:13C(3)15N(1) (S)
+ mTRAQ:13C(3)15N(1) (T)
+ mTRAQ:13C(3)15N(1) (Y)
+ mTRAQ:13C(6)15N(2) (H)
+ mTRAQ:13C(6)15N(2) (K)
+ mTRAQ:13C(6)15N(2) (N-term)
+ mTRAQ:13C(6)15N(2) (S)
+ mTRAQ:13C(6)15N(2) (T)
+ mTRAQ:13C(6)15N(2) (Y)
+ MTSL (C)
+ MurNAc (A)
+ Myristoleyl (Protein N-term G)
+ Myristoyl (C)
+ Myristoyl (K)
+ Myristoyl (N-term G)
+ Myristoyl+Delta:H(-4) (Protein N-term G)
+ N-dimethylphosphate (S)
+ NA-LNO2 (C)
+ NA-LNO2 (H)
+ NA-OA-NO2 (C)
+ NA-OA-NO2 (H)
+ NBS (W)
+ NBS:13C(6) (W)
+ NDA (K)
+ NDA (N-term)
+ NEIAA (C)
+ NEIAA (Y)
+ NEIAA:2H(5) (C)
+ NEIAA:2H(5) (Y)
+ NEM:2H(5) (C)
+ NEM:2H(5)+H2O (C)
+ NEMsulfur (C)
+ NEMsulfurWater (C)
+ Nethylmaleimide (C)
+ Nethylmaleimide+water (C)
+ Nethylmaleimide+water (K)
+ NeuAc (N)
+ NeuAc (S)
+ NeuAc (T)
+ NeuGc (N)
+ NeuGc (S)
+ NeuGc (T)
+ NHS-fluorescein (K)
+ NHS-LC-Biotin (K)
+ NHS-LC-Biotin (N-term)
+ NIC (K)
+ NIC (N-term)
+ NIPCAM (C)
+ Nitrene (Y)
+ Nitro (F)
+ Nitro (W)
+ Nitro (Y)
+ Nitrosyl (C)
+ Nitrosyl (Y)
+ Nmethylmaleimide (C)
+ Nmethylmaleimide (K)
+ Nmethylmaleimide+water (C)
+ NO_SMX_SEMD (C)
+ NO_SMX_SIMD (C)
+ NO_SMX_SMCT (C)
+ NP40 (N-term)
+ NQIGG (K)
+ O-Dimethylphosphate (S)
+ O-Dimethylphosphate (T)
+ O-Dimethylphosphate (Y)
+ O-Et-N-diMePhospho (S)
+ O-Isopropylmethylphosphonate (S)
+ O-Isopropylmethylphosphonate (T)
+ O-Isopropylmethylphosphonate (Y)
+ O-Methylphosphate (S)
+ O-Methylphosphate (T)
+ O-Methylphosphate (Y)
+ O-pinacolylmethylphosphonate (H)
+ O-pinacolylmethylphosphonate (K)
+ O-pinacolylmethylphosphonate (S)
+ O-pinacolylmethylphosphonate (T)
+ O-pinacolylmethylphosphonate (Y)
+ Octanoyl (C)
+ Octanoyl (S)
+ Octanoyl (T)
+ OxArgBiotin (R)
+ OxArgBiotinRed (R)
+ Oxidation (C)
+ Oxidation (C-term G)
+ Oxidation (D)
+ Oxidation (E)
+ Oxidation (F)
+ Oxidation (H)
+ Oxidation (I)
+ Oxidation (K)
+ Oxidation (L)
+ Oxidation (M)
+ Oxidation (N)
+ Oxidation (P)
+ Oxidation (Q)
+ Oxidation (R)
+ Oxidation (S)
+ Oxidation (T)
+ Oxidation (U)
+ Oxidation (V)
+ Oxidation (W)
+ Oxidation (Y)
+ Oxidation+NEM (C)
+ OxLysBiotin (K)
+ OxLysBiotinRed (K)
+ OxProBiotin (P)
+ OxProBiotinRed (P)
+ Palmitoleyl (C)
+ Palmitoleyl (S)
+ Palmitoleyl (T)
+ Palmitoyl (C)
+ Palmitoyl (K)
+ Palmitoyl (Protein N-term)
+ Palmitoyl (S)
+ Palmitoyl (T)
+ PEITC (C)
+ PEITC (K)
+ PEITC (N-term)
+ Pent(1)HexNAc(1) (S)
+ Pent(1)HexNAc(1) (T)
+ Pent(2) (S)
+ Pent(2) (T)
+ Pentose (S)
+ Pentose (T)
+ Pentylamine (Q)
+ PEO-Iodoacetyl-LC-Biotin (C)
+ PET (S)
+ PET (T)
+ Phe->Ala (F)
+ Phe->Arg (F)
+ Phe->Asn (F)
+ Phe->Asp (F)
+ Phe->CamCys (F)
+ Phe->Cys (F)
+ Phe->Gln (F)
+ Phe->Glu (F)
+ Phe->Gly (F)
+ Phe->His (F)
+ Phe->Lys (F)
+ Phe->Met (F)
+ Phe->Pro (F)
+ Phe->Ser (F)
+ Phe->Thr (F)
+ Phe->Trp (F)
+ Phe->Tyr (F)
+ Phe->Val (F)
+ Phe->Xle (F)
+ Phenylisocyanate (N-term)
+ Phenylisocyanate:2H(5) (N-term)
+ phenylsulfonylethyl (C)
+ Phospho (C)
+ Phospho (D)
+ Phospho (E)
+ Phospho (H)
+ Phospho (K)
+ Phospho (R)
+ Phospho (S)
+ Phospho (T)
+ Phospho (Y)
+ Phosphoadenosine (H)
+ Phosphoadenosine (K)
+ Phosphoadenosine (T)
+ Phosphoadenosine (Y)
+ PhosphoCytidine (S)
+ PhosphoCytidine (T)
+ PhosphoCytidine (Y)
+ Phosphogluconoylation (K)
+ Phosphogluconoylation (N-term)
+ Phosphoguanosine (H)
+ Phosphoguanosine (K)
+ PhosphoHex (S)
+ PhosphoHex (T)
+ PhosphoHex(2) (N)
+ PhosphoHex(2) (S)
+ PhosphoHex(2) (T)
+ PhosphoHexNAc (S)
+ PhosphoHexNAc (T)
+ Phosphopantetheine (S)
+ Phosphopropargyl (S)
+ Phosphopropargyl (T)
+ Phosphopropargyl (Y)
+ phosphoRibosyl (D)
+ phosphoRibosyl (E)
+ phosphoRibosyl (R)
+ PhosphoribosyldephosphoCoA (S)
+ PhosphoUridine (H)
+ PhosphoUridine (Y)
+ Phycocyanobilin (C)
+ Phycoerythrobilin (C)
+ Phytochromobilin (C)
+ Piperidine (K)
+ Piperidine (N-term)
+ Pro->Ala (P)
+ Pro->Arg (P)
+ Pro->Asn (P)
+ Pro->Asp (P)
+ Pro->Cys (P)
+ Pro->Gln (P)
+ Pro->Glu (P)
+ Pro->Gly (P)
+ Pro->HAVA (P)
+ Pro->His (P)
+ Pro->Lys (P)
+ Pro->Met (P)
+ Pro->Phe (P)
+ Pro->pyro-Glu (P)
+ Pro->Pyrrolidinone (P)
+ Pro->Pyrrolidone (P)
+ Pro->Ser (P)
+ Pro->Thr (P)
+ Pro->Trp (P)
+ Pro->Tyr (P)
+ Pro->Val (P)
+ Pro->Xle (P)
+ probiotinhydrazide (P)
+ Propargylamine (C-term)
+ Propargylamine (D)
+ Propargylamine (E)
+ Propionamide (C)
+ Propionamide (K)
+ Propionamide (N-term)
+ Propionamide:2H(3) (C)
+ Propionyl (K)
+ Propionyl (N-term)
+ Propionyl (Protein N-term)
+ Propionyl (S)
+ Propionyl (T)
+ Propionyl:13C(3) (K)
+ Propionyl:13C(3) (N-term)
+ Propiophenone (C)
+ Propiophenone (H)
+ Propiophenone (K)
+ Propiophenone (R)
+ Propiophenone (S)
+ Propiophenone (T)
+ Propiophenone (W)
+ Propyl (C-term)
+ Propyl (D)
+ Propyl (E)
+ Propyl (K)
+ Propyl (N-term)
+ Propyl (Protein C-term)
+ Propyl:2H(6) (K)
+ Propyl:2H(6) (N-term)
+ PropylNAGthiazoline (C)
+ PS_Hapten (C)
+ PS_Hapten (H)
+ PS_Hapten (K)
+ pupylation (K)
+ Puromycin (C-term)
+ PyMIC (N-term)
+ PyridoxalPhosphate (K)
+ PyridoxalPhosphateH2 (K)
+ Pyridylacetyl (K)
+ Pyridylacetyl (N-term)
+ Pyridylethyl (C)
+ Pyro-carbamidomethyl (N-term C)
+ pyrophospho (S)
+ pyrophospho (T)
+ PyruvicAcidIminyl (K)
+ PyruvicAcidIminyl (Protein N-term C)
+ PyruvicAcidIminyl (Protein N-term V)
+ QAT (C)
+ QAT:2H(3) (C)
+ QEQTGG (K)
+ QQQTGG (K)
+ QTGG (K)
+ Quinone (W)
+ Quinone (Y)
+ Retinylidene (K)
+ RNPXL (N-term K)
+ RNPXL (N-term R)
+ RNPXlink1 (C)
+ RNPXlink2 (F)
+ RNPXlink2 (K)
+ RNPXlink2 (L)
+ RNPXlink3 (C)
+ RNPXlink3 (F)
+ RNPXlink4 (C)
+ RNPXlink5 (F)
+ RNPXlink5 (Y)
+ s-GlcNAc (S)
+ s-GlcNAc (T)
+ Saligenin (H)
+ Saligenin (K)
+ Ser->Ala (S)
+ Ser->Arg (S)
+ Ser->Asn (S)
+ Ser->Asp (S)
+ Ser->Cys (S)
+ Ser->Gln (S)
+ Ser->Glu (S)
+ Ser->Gly (S)
+ Ser->His (S)
+ Ser->LacticAcid (Protein N-term S)
+ Ser->Lys (S)
+ Ser->Met (S)
+ Ser->Phe (S)
+ Ser->Pro (S)
+ Ser->Thr (S)
+ Ser->Trp (S)
+ Ser->Tyr (S)
+ Ser->Val (S)
+ Ser->Xle (S)
+ serotonylation (Q)
+ shTMT (K)
+ shTMT (N-term)
+ shTMT (Protein N-term)
+ SMA (K)
+ SMA (N-term)
+ spermidine (Q)
+ spermine (Q)
+ SPITC (K)
+ SPITC (N-term)
+ SPITC:13C(6) (K)
+ SPITC:13C(6) (N-term)
+ Succinyl (K)
+ Succinyl (N-term)
+ Succinyl (Protein N-term)
+ Succinyl:13C(4) (K)
+ Succinyl:13C(4) (N-term)
+ Succinyl:2H(4) (K)
+ Succinyl:2H(4) (N-term)
+ SulfanilicAcid (C-term)
+ SulfanilicAcid (D)
+ SulfanilicAcid (E)
+ SulfanilicAcid:13C(6) (C-term)
+ SulfanilicAcid:13C(6) (D)
+ SulfanilicAcid:13C(6) (E)
+ Sulfide (C)
+ Sulfide (D)
+ Sulfide (W)
+ Sulfo (C)
+ Sulfo (S)
+ Sulfo (T)
+ Sulfo (Y)
+ sulfo+amino (Y)
+ Sulfo-NHS-LC-LC-Biotin (K)
+ Sulfo-NHS-LC-LC-Biotin (N-term)
+ SulfoGMBS (C)
+ SulfurDioxide (C)
+ SUMO2135 (K)
+ SUMO3549 (K)
+ TAMRA-FP (S)
+ TAMRA-FP (Y)
+ Thiadiazole (C)
+ Thiazolidine (C)
+ Thiazolidine (F)
+ Thiazolidine (H)
+ Thiazolidine (K)
+ Thiazolidine (Protein N-term)
+ Thiazolidine (R)
+ Thiazolidine (W)
+ Thiazolidine (Y)
+ thioacylPA (K)
+ Thiophos-S-S-biotin (S)
+ Thiophos-S-S-biotin (T)
+ Thiophos-S-S-biotin (Y)
+ Thiophospho (S)
+ Thiophospho (T)
+ Thiophospho (Y)
+ Thr->Ala (T)
+ Thr->Arg (T)
+ Thr->Asn (T)
+ Thr->Asp (T)
+ Thr->Cys (T)
+ Thr->Gln (T)
+ Thr->Glu (T)
+ Thr->Gly (T)
+ Thr->His (T)
+ Thr->Lys (T)
+ Thr->Met (T)
+ Thr->Phe (T)
+ Thr->Pro (T)
+ Thr->Ser (T)
+ Thr->Trp (T)
+ Thr->Tyr (T)
+ Thr->Val (T)
+ Thr->Xle (T)
+ Thrbiotinhydrazide (T)
+ Thyroxine (Y)
+ TMAB (K)
+ TMAB (N-term)
+ TMAB:2H(9) (K)
+ TMAB:2H(9) (N-term)
+ TMPP-Ac (K)
+ TMPP-Ac (N-term)
+ TMPP-Ac (Y)
+ TMPP-Ac:13C(9) (K)
+ TMPP-Ac:13C(9) (N-term)
+ TMPP-Ac:13C(9) (Y)
+ TMT (H)
+ TMT (K)
+ TMT (N-term)
+ TMT (Protein N-term)
+ TMT (S)
+ TMT (T)
+ TMT2plex (H)
+ TMT2plex (K)
+ TMT2plex (N-term)
+ TMT2plex (Protein N-term)
+ TMT2plex (S)
+ TMT2plex (T)
+ TMT6plex (H)
+ TMT6plex (K)
+ TMT6plex (N-term)
+ TMT6plex (Protein N-term)
+ TMT6plex (S)
+ TMT6plex (T)
+ TMTpro (H)
+ TMTpro (K)
+ TMTpro (N-term)
+ TMTpro (Protein N-term)
+ TMTpro (S)
+ TMTpro (T)
+ TMTpro_zero (H)
+ TMTpro_zero (K)
+ TMTpro_zero (N-term)
+ TMTpro_zero (Protein N-term)
+ TMTpro_zero (S)
+ TMTpro_zero (T)
+ TNBS (K)
+ TNBS (N-term)
+ trifluoro (L)
+ Triiodo (Y)
+ Triiodothyronine (Y)
+ Trimethyl (K)
+ Trimethyl (Protein N-term A)
+ Trimethyl (R)
+ Trimethyl:13C(3)2H(9) (K)
+ Trimethyl:13C(3)2H(9) (R)
+ Trimethyl:2H(9) (K)
+ Trimethyl:2H(9) (R)
+ Trioxidation (C)
+ Trioxidation (F)
+ Trioxidation (W)
+ Trioxidation (Y)
+ Tripalmitate (Protein N-term C)
+ Tris (N)
+ Triton (C-term)
+ Triton (N-term)
+ Trp->Ala (W)
+ Trp->Arg (W)
+ Trp->Asn (W)
+ Trp->Asp (W)
+ Trp->Cys (W)
+ Trp->Gln (W)
+ Trp->Glu (W)
+ Trp->Gly (W)
+ Trp->His (W)
+ Trp->Hydroxykynurenin (W)
+ Trp->Kynurenin (W)
+ Trp->Lys (W)
+ Trp->Met (W)
+ Trp->Oxolactone (W)
+ Trp->Phe (W)
+ Trp->Pro (W)
+ Trp->Ser (W)
+ Trp->Thr (W)
+ Trp->Tyr (W)
+ Trp->Val (W)
+ Trp->Xle (W)
+ Tween20 (N-term)
+ Tween80 (C-term)
+ Tyr->Ala (Y)
+ Tyr->Arg (Y)
+ Tyr->Asn (Y)
+ Tyr->Asp (Y)
+ Tyr->Cys (Y)
+ Tyr->Dha (Y)
+ Tyr->Gln (Y)
+ Tyr->Glu (Y)
+ Tyr->Gly (Y)
+ Tyr->His (Y)
+ Tyr->Lys (Y)
+ Tyr->Met (Y)
+ Tyr->Phe (Y)
+ Tyr->Pro (Y)
+ Tyr->Ser (Y)
+ Tyr->Thr (Y)
+ Tyr->Trp (Y)
+ Tyr->Val (Y)
+ Tyr->Xle (Y)
+ Ub-amide (C)
+ Ub-Br2 (C)
+ Ub-fluorescein (C)
+ Ub-VME (C)
+ UgiJoullie (D)
+ UgiJoullie (E)
+ UgiJoullieProGly (D)
+ UgiJoullieProGly (E)
+ UgiJoullieProGlyProGly (D)
+ UgiJoullieProGlyProGly (E)
+ Unknown:162 (C-term)
+ Unknown:162 (D)
+ Unknown:162 (E)
+ Unknown:162 (N-term)
+ Unknown:177 (C-term)
+ Unknown:177 (D)
+ Unknown:177 (E)
+ Unknown:177 (N-term)
+ Unknown:210 (C-term)
+ Unknown:210 (D)
+ Unknown:210 (E)
+ Unknown:210 (N-term)
+ Unknown:216 (C-term)
+ Unknown:216 (D)
+ Unknown:216 (E)
+ Unknown:216 (N-term)
+ Unknown:234 (C-term)
+ Unknown:234 (D)
+ Unknown:234 (E)
+ Unknown:234 (N-term)
+ Unknown:248 (C-term)
+ Unknown:248 (D)
+ Unknown:248 (E)
+ Unknown:248 (N-term)
+ Unknown:250 (C-term)
+ Unknown:250 (D)
+ Unknown:250 (E)
+ Unknown:250 (N-term)
+ Unknown:302 (C-term)
+ Unknown:302 (D)
+ Unknown:302 (E)
+ Unknown:302 (N-term)
+ Unknown:306 (C-term)
+ Unknown:306 (D)
+ Unknown:306 (E)
+ Unknown:306 (N-term)
+ Unknown:420 (C-term)
+ Unknown:420 (N-term)
+ Val->Ala (V)
+ Val->Arg (V)
+ Val->Asn (V)
+ Val->Asp (V)
+ Val->Cys (V)
+ Val->Gln (V)
+ Val->Glu (V)
+ Val->Gly (V)
+ Val->His (V)
+ Val->Lys (V)
+ Val->Met (V)
+ Val->Phe (V)
+ Val->Pro (V)
+ Val->Ser (V)
+ Val->Thr (V)
+ Val->Trp (V)
+ Val->Tyr (V)
+ Val->Xle (V)
+ VFQQQTGG (K)
+ VIEVYQEQTGG (K)
+ Withaferin (C)
+ Xle->Ala (I)
+ Xle->Ala (L)
+ Xle->Arg (I)
+ Xle->Arg (L)
+ Xle->Asn (I)
+ Xle->Asn (L)
+ Xle->Asp (I)
+ Xle->Asp (L)
+ Xle->Cys (I)
+ Xle->Cys (L)
+ Xle->Gln (I)
+ Xle->Gln (L)
+ Xle->Glu (I)
+ Xle->Glu (L)
+ Xle->Gly (I)
+ Xle->Gly (L)
+ Xle->His (I)
+ Xle->His (L)
+ Xle->Lys (I)
+ Xle->Lys (L)
+ Xle->Met (I)
+ Xle->Met (L)
+ Xle->Phe (I)
+ Xle->Phe (L)
+ Xle->Pro (I)
+ Xle->Pro (L)
+ Xle->Ser (I)
+ Xle->Ser (L)
+ Xle->Thr (I)
+ Xle->Thr (L)
+ Xle->Trp (I)
+ Xle->Trp (L)
+ Xle->Tyr (I)
+ Xle->Tyr (L)
+ Xle->Val (I)
+ Xle->Val (L)
+ Xlink:B10621 (C)
+ Xlink:BMOE (C)
+ Xlink:BS2G[113] (K)
+ Xlink:BS2G[113] (Protein N-term)
+ Xlink:BS2G[114] (K)
+ Xlink:BS2G[114] (Protein N-term)
+ Xlink:BS2G[217] (K)
+ Xlink:BS2G[217] (Protein N-term)
+ Xlink:BS2G[96] (K)
+ Xlink:BS2G[96] (Protein N-term)
+ Xlink:BuUrBu[111] (K)
+ Xlink:BuUrBu[111] (Protein N-term)
+ Xlink:BuUrBu[196] (K)
+ Xlink:BuUrBu[196] (Protein N-term)
+ Xlink:BuUrBu[213] (K)
+ Xlink:BuUrBu[213] (Protein N-term)
+ Xlink:BuUrBu[214] (K)
+ Xlink:BuUrBu[214] (Protein N-term)
+ Xlink:BuUrBu[317] (K)
+ Xlink:BuUrBu[317] (Protein N-term)
+ Xlink:BuUrBu[85] (K)
+ Xlink:BuUrBu[85] (Protein N-term)
+ Xlink:DFDNB (K)
+ Xlink:DFDNB (N)
+ Xlink:DFDNB (Q)
+ Xlink:DFDNB (R)
+ Xlink:DMP[122] (K)
+ Xlink:DMP[122] (Protein N-term)
+ Xlink:DMP[139] (K)
+ Xlink:DMP[139] (Protein N-term)
+ Xlink:DMP[140] (K)
+ Xlink:DMP[140] (Protein N-term)
+ Xlink:DMP[154] (K)
+ Xlink:DMP[154] (Protein N-term)
+ Xlink:DSS[138] (K)
+ Xlink:DSS[138] (Protein N-term)
+ Xlink:DSS[155] (K)
+ Xlink:DSS[155] (Protein N-term)
+ Xlink:DSS[156] (K)
+ Xlink:DSS[156] (Protein N-term)
+ Xlink:DSS[259] (K)
+ Xlink:DSS[259] (Protein N-term)
+ Xlink:DSSO[104] (K)
+ Xlink:DSSO[104] (Protein N-term)
+ Xlink:DSSO[158] (K)
+ Xlink:DSSO[158] (Protein N-term)
+ Xlink:DSSO[175] (K)
+ Xlink:DSSO[175] (Protein N-term)
+ Xlink:DSSO[176] (K)
+ Xlink:DSSO[176] (Protein N-term)
+ Xlink:DSSO[279] (K)
+ Xlink:DSSO[279] (Protein N-term)
+ Xlink:DSSO[54] (K)
+ Xlink:DSSO[54] (Protein N-term)
+ Xlink:DSSO[86] (K)
+ Xlink:DSSO[86] (Protein N-term)
+ Xlink:DST[114] (K)
+ Xlink:DST[114] (Protein N-term)
+ Xlink:DST[132] (K)
+ Xlink:DST[132] (Protein N-term)
+ Xlink:DST[56] (K)
+ Xlink:DST[56] (Protein N-term)
+ Xlink:DTBP[172] (K)
+ Xlink:DTBP[172] (Protein N-term)
+ Xlink:DTBP[87] (K)
+ Xlink:DTBP[87] (Protein N-term)
+ Xlink:DTSSP[174] (K)
+ Xlink:DTSSP[174] (Protein N-term)
+ Xlink:DTSSP[192] (K)
+ Xlink:DTSSP[192] (Protein N-term)
+ Xlink:DTSSP[88] (K)
+ Xlink:DTSSP[88] (Protein N-term)
+ Xlink:EGS[115] (K)
+ Xlink:EGS[115] (Protein N-term)
+ Xlink:EGS[226] (K)
+ Xlink:EGS[226] (Protein N-term)
+ Xlink:EGS[244] (K)
+ Xlink:EGS[244] (Protein N-term)
+ Xlink:SMCC[219] (C)
+ Xlink:SMCC[219] (K)
+ Xlink:SMCC[219] (Protein N-term)
+ Xlink:SMCC[237] (C)
+ Xlink:SMCC[237] (K)
+ Xlink:SMCC[237] (Protein N-term)
+ Xlink:SMCC[321] (C)
+ ZGB (K)
+ ZGB (N-term)
+ ZQG (K)
+
+
+
+ none
+ N15
+
+
+
+
+
+
+
+
+
+ Output used ctd (ini) configuration file
+
+
+
+
+
+ OPTIONAL_OUTPUTS is not None and "ctd_out_FLAG" in OPTIONAL_OUTPUTS
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r e030fdaaf631 filetypes.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/filetypes.txt Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,85 @@
+# CTD type # Galaxy type
+# the following lines need to be at the top in order to ensure
+# correct translation Galaxy->CTD type for the ambiguous cases
+# (should only be relevant for the autogenerated tests [which
+# do not set the ftype of the inputs])
+txt txt
+tsv tabular
+
+##analysisXML
+# XTandemAdapter output is named xml in OMS (which is to unspecific) and bioml in Galaxy .. so this is renamed via hardcoded parameters
+bioml xml
+consensusXML consensusxml
+# TODO csv is problematic, since csv often actually means tsv .. but not always
+csv csv
+##dat
+dta dta
+dta2d dta2d
+edta edta
+fa fasta
+fas fasta
+fasta fasta
+FASTA fasta
+featureXML featurexml
+featurexml featurexml
+# fid
+html html
+HTML html
+idXML idxml
+##ini txt
+json json
+kroenik kroenik
+mascotXML mascotxml
+mgf mgf
+mrm mrm
+ms sirius.ms
+ms2 ms2
+msp msp
+mzData mzdata
+mzid mzid
+# important to have mzML first, since LuciphorAdapter is case sensitive https://github.com/OpenMS/OpenMS/issues/4444
+mzML mzml
+mzml mzml
+mzq mzq
+mzTab mztab
+mzXML mzxml
+novor txt
+obo obo
+# I guess this is the idXML output of omssa
+omssaXML idxml
+osw osw
+OSW osw
+params txt
+paramXML paramxml
+fasta peff
+peplist peplist
+# TODO pep.xml should be removed with OMS 2.6 https://github.com/OpenMS/OpenMS/pull/4541 .. but still in the tests
+pep.xml pepxml
+pepXML pepxml
+png png
+PNG png
+protXML protxml
+psms psms
+# TODO implement or use
+# psq
+pqp pqp
+qcML qcml
+spec.xml spec.xml
+splib splib
+sqMass sqmass
+tandem.xml tandem
+trafoXML trafoxml
+traML traml
+TraML traml
+tab tabular
+## MOVED TO TOP txt txt
+raw thermo.raw
+## xls: SpectraSTSearchAdapter https://github.com/OpenMS/OpenMS/pull/4419
+xls tsv
+XML xml
+xml xml
+xquest.xml xquest.xml
+xsd xml
+
+# TODO needs to be implemented, needs to be below xml in order that Galaxy->OMS mapping gives xml
+# cachedMzML xml
diff -r 000000000000 -r e030fdaaf631 fill_ctd.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fill_ctd.py Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,196 @@
+import collections
+import json
+import operator
+import os
+import re
+import subprocess
+import sys
+from functools import reduce # forward compatibility for Python 3
+
+from CTDopts.CTDopts import (
+ _Choices,
+ _InFile,
+ _Null,
+ _NumericRange,
+ CTDModel
+)
+
+
+def getFromDict(dataDict, mapList):
+ return reduce(operator.getitem, mapList, dataDict)
+
+
+def setInDict(dataDict, mapList, value):
+ getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value
+
+
+def mergeDicts(d, e):
+ """
+ insert values from the dict e into dict d
+ no values of d are overwritten
+ """
+ for k, v in e.items():
+ if (k in d and isinstance(d[k], dict) and isinstance(e[k], collections.abc.Mapping)):
+ mergeDicts(d[k], e[k])
+ elif k not in d and not isinstance(e[k], collections.abc.Mapping):
+ d[k] = e[k]
+ else:
+ sys.stderr.write("fill_ctd.py: could not merge key %s for %s in %s" % (k, d, e))
+ sys.exit(1)
+
+
+def _json_object_hook_noenvlookup(d):
+ return _json_object_hook(d, envlookup=False)
+
+
+def _json_object_hook(d, envlookup=True):
+ """
+ wee helper to transform the json written by galaxy
+ while loading
+ - True/False (bool objects) -> "true"/"false" (lowercase string)
+ - data inputs with multiple and optional true give [None] if no file is given -> []
+ - None -> "" (empty string)
+ - replace bash expressions (if envlookup is True):
+ - environment variables (need to consist capital letters and _) by their value
+ - expressions
+ """
+ for k in d.keys():
+ # if type(d[k]) is bool:
+ # d[k] = str(d[k]).lower()
+ # else
+ if type(d[k]) is list and len(d[k]) == 1 and d[k][0] is None:
+ d[k] = []
+ elif d[k] is None:
+ d[k] = ""
+ elif envlookup and type(d[k]) is str and d[k].startswith("$"):
+ m = re.fullmatch(r"\$([A-Z_]+)", d[k])
+ if m:
+ d[k] = os.environ.get(m.group(1), "")
+ continue
+ m = re.fullmatch(r"\$(\{[A-Z_]+):-(.*)\}", d[k])
+ if m:
+ d[k] = os.environ.get(m.group(1), m.group(2))
+ continue
+
+ try:
+ p = subprocess.run("echo %s" % d[k], shell=True, check=True, stdout=subprocess.PIPE, encoding="utf8")
+ d[k] = p.stdout.strip()
+ except subprocess.CalledProcessError:
+ sys.stderr.write("fill_ctd error: Could not evaluate %s" % d[k])
+ continue
+ return d
+
+
+def qstring2list(qs):
+ """
+ transform a space separated string that is quoted by " into a list
+ """
+ lst = list()
+ qs = qs.split(" ")
+ quoted = False
+ for p in qs:
+ if p == "":
+ continue
+ if p.startswith('"') and p.endswith('"'):
+ lst.append(p[1:-1])
+ elif p.startswith('"'):
+ quoted = True
+ lst.append(p[1:] + " ")
+ elif p.endswith('"'):
+ quoted = False
+ lst[-1] += p[:-1]
+ else:
+ if quoted:
+ lst[-1] += p + " "
+ else:
+ lst.append(p)
+ return lst
+
+
+def fix_underscores(args):
+ if type(args) is dict:
+ for k in list(args.keys()):
+ v = args[k]
+ if type(v) is dict:
+ fix_underscores(args[k])
+ if k.startswith("_"):
+ args[k[1:]] = v
+ del args[k]
+ elif type(args) is list:
+ for i, v in enumerate(args):
+ if type(v) is dict:
+ fix_underscores(args[i])
+
+
+input_ctd = sys.argv[1]
+
+# load user specified parameters from json
+with open(sys.argv[2]) as fh:
+ args = json.load(fh, object_hook=_json_object_hook_noenvlookup)
+
+# load hardcoded parameters from json
+with open(sys.argv[3]) as fh:
+ hc_args = json.load(fh, object_hook=_json_object_hook)
+
+# insert the hc_args into the args
+mergeDicts(args, hc_args)
+
+if "adv_opts_cond" in args:
+ args.update(args["adv_opts_cond"])
+ del args["adv_opts_cond"]
+
+# IDMapper has in and spectra:in params, in is used in out as format_source",
+# which does not work in Galaxy: https://github.com/galaxyproject/galaxy/pull/9493"
+# therefore hardcoded params change the name of spectra:in to spectra:_in
+# which is corrected here again
+# TODO remove once PR is in and adapt profile accordingly
+fix_underscores(args)
+
+model = CTDModel(from_file=input_ctd)
+
+# transform values from json that correspond to
+# - old style booleans (string + restrictions) -> transformed to a str
+# - new style booleans that get a string (happens for hidden parameters [-test])
+# are transformed to a bool
+# - unrestricted ITEMLIST which are represented as strings
+# ("=quoted and space separated) in Galaxy -> transform to lists
+# - optional data input parameters that have defaults and for which no
+# value is given -> overwritte with the default
+for p in model.get_parameters():
+
+ # check if the parameter is in the arguments from the galaxy tool
+ # (from the json file(s)), since advanced parameters are absent
+ # if the conditional is set to basic parameters
+ try:
+ getFromDict(args, p.get_lineage(name_only=True))
+ except KeyError:
+ # few tools use dashes in parameters which are automatically replaced
+ # by underscores by Galaxy. in these cases the dictionary needs to be
+ # updated (better: then dash and the underscore variant are in the dict)
+ # TODO might be removed later https://github.com/OpenMS/OpenMS/pull/4529
+ try:
+ lineage = [_.replace("-", "_") for _ in p.get_lineage(name_only=True)]
+ val = getFromDict(args, lineage)
+ except KeyError:
+ continue
+ else:
+ setInDict(args, p.get_lineage(name_only=True), val)
+
+ if p.type is str and type(p.restrictions) is _Choices and set(p.restrictions.choices) == set(["true", "false"]):
+ v = getFromDict(args, p.get_lineage(name_only=True))
+ setInDict(args, p.get_lineage(name_only=True), str(v).lower())
+ elif p.type is bool:
+ v = getFromDict(args, p.get_lineage(name_only=True))
+ if isinstance(v, str):
+ v = (v.lower() == "true")
+ setInDict(args, p.get_lineage(name_only=True), v)
+ elif p.is_list and (p.restrictions is None or type(p.restrictions) is _NumericRange):
+ v = getFromDict(args, p.get_lineage(name_only=True))
+ if type(v) is str:
+ setInDict(args, p.get_lineage(name_only=True), qstring2list(v))
+ elif p.type is _InFile and not (p.default is None or type(p.default) is _Null):
+ v = getFromDict(args, p.get_lineage(name_only=True))
+ if v in [[], ""]:
+ setInDict(args, p.get_lineage(name_only=True), p.default)
+
+model.write_ctd(input_ctd, arg_dict=args)
diff -r 000000000000 -r e030fdaaf631 fill_ctd_clargs.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fill_ctd_clargs.py Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+from argparse import ArgumentParser
+from io import StringIO
+
+from CTDopts.CTDopts import (
+ CTDModel,
+ ModelTypeError,
+ Parameters
+)
+
+if __name__ == "__main__":
+ # note add_help=False since otherwise arguments starting with -h will
+ # trigger an error (despite allow_abbreviate)
+ parser = ArgumentParser(prog="fill_ctd_clargs",
+ description="fill command line arguments"
+ "into a CTD file and write the CTD file to",
+ add_help=False, allow_abbrev=False)
+ parser.add_argument("--ctd", dest="ctd", help="input ctd file",
+ metavar='CTD', default=None, required=True)
+ args, cliargs = parser.parse_known_args()
+ # load CTDModel
+ model = None
+ try:
+ model = CTDModel(from_file=args.ctd)
+ except ModelTypeError:
+ pass
+ try:
+ model = Parameters(from_file=args.ctd)
+ except ModelTypeError:
+ pass
+ assert model is not None, "Could not parse %s, seems to be no CTD/PARAMS" % (args.ctd)
+
+ # get a dictionary of the ctd arguments where the values of the parameters
+ # given on the command line are overwritten
+ margs = model.parse_cl_args(cl_args=cliargs, ignore_required=True)
+
+ # write the ctd with the values taken from the dictionary
+ out = StringIO()
+ ctd_tree = model.write_ctd(out, margs)
+ print(out.getvalue())
diff -r 000000000000 -r e030fdaaf631 generate-foo.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/generate-foo.sh Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,222 @@
+#!/usr/bin/env bash
+
+# parse test definitions from OpenMS sources for a tool with a given id
+function get_tests2 {
+ id=$1
+ >&2 echo "generate tests for $id"
+ echo ''
+
+ # get the tests from the CMakeLists.txt
+ # 1st remove some tests
+ # - OpenSwathMzMLFileCacher with -convert_back argumen https://github.com/OpenMS/OpenMS/issues/4399
+ # - IDRipper PATH gets empty causing problems. TODO But overall the option needs to be handled differentlt
+ # - several tools with duplicated input (leads to conflict when linking)
+ # - TOFCalibration inputs we extension (also in prepare_test_data) https://github.com/OpenMS/OpenMS/pull/4525
+ # - MaRaCluster with -consensus_out (parameter blacklister: https://github.com/OpenMS/OpenMS/issues/4456)
+ # - FileMerger with mixed dta dta2d input (ftype can not be specified in the test, dta can not be sniffed)
+ # - some input files are originally in a subdir (degenerated cases/), but not in test-data
+ # - SeedListGenerator: https://github.com/OpenMS/OpenMS/issues/4404
+ # - OpenSwathAnalyzer 9/10: cachedMzML (not supported yet)
+ # - FeatureFinderIdentification name clash of two tests https://github.com/OpenMS/OpenMS/pull/5002
+ # - TODO SiriusAdapter https://github.com/OpenMS/OpenMS/pull/5010
+ CMAKE=$(cat $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake |
+ sed 's@${DATA_DIR_SHARE}/@@g' |
+ grep -v 'OpenSwathMzMLFileCacher .*-convert_back' |
+ sed 's/${TMP_RIP_PATH}/""/' |
+ grep -v "MaRaClusterAdapter.*-consensus_out"|
+ grep -v "FileMerger_1_input1.dta2d.*FileMerger_1_input2.dta " |
+ sed 's@degenerate_cases/@@g' |
+ grep -v 'TOPP_SeedListGenerator_3"' |
+ egrep -v 'TOPP_OpenSwathAnalyzer_test_3"|TOPP_OpenSwathAnalyzer_test_4"' |
+ egrep -v '"TOPP_FeatureFinderIdentification_4"' |
+ sed 's/\("TOPP_SiriusAdapter_4".*\)-sirius:database all\(.*\)/\1-sirius:database pubchem\2/')
+
+
+# grep -v 'FileFilter.*-spectra:select_polarity ""' |
+# grep -v 'MassTraceExtractor_2.ini ' |
+# grep -v "FileMerger_6_input2.mzML.*FileMerger_6_input2.mzML" |
+# grep -v "IDMerger_1_input1.idXML.*IDMerger_1_input1.idXML" |
+# grep -v "degenerated_empty.idXML.*degenerated_empty.idXML" |
+# grep -v "FeatureLinkerUnlabeledKD_1_output.consensusXML.*FeatureLinkerUnlabeledKD_1_output.consensusXML" |
+# grep -v "FeatureLinkerUnlabeledQT_1_output.consensusXML.*FeatureLinkerUnlabeledQT_1_output.consensusXML" |
+
+ # 1st part is a dirty hack to join lines containing a single function call, e.g.
+ # addtest(....
+ # ....)
+ echo "$CMAKE" | sed 's/#.*//; s/^\s*//; s/\s*$//' | grep -v "^#" | grep -v "^$" | awk '{printf("%s@NEWLINE@", $0)}' | sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' |
+ grep -iE "add_test\(\"(TOPP|UTILS)_.*/$id " | egrep -v "_prepare\"|_convert|WRITEINI|WRITECTD|INVALIDVALUE" | while read -r line
+ do
+ line=$(echo "$line" | sed 's/add_test("\([^"]\+\)"/\1/; s/)$//; s/\${TOPP_BIN_PATH}\///g;s/\${DATA_DIR_TOPP}\///g; s#THIRDPARTY/##g')
+ # >&2 echo $line
+ test_id=$(echo "$line" | cut -d" " -f 1)
+ tool_id=$(echo "$line" | cut -d" " -f 2)
+ if [[ $test_id =~ _out_?[0-9]? ]]; then
+ >&2 echo " skip $test_id $line"
+ continue
+ fi
+ if [[ ${id,,} != ${tool_id,,} ]]; then
+ >&2 echo " skip $test_id ($id != $tool_id) $line"
+ continue
+ fi
+
+ #remove tests with set_tests_properties(....PROPERTIES WILL_FAIL 1)
+ if grep -lq "$test_id"'\".* PROPERTIES WILL_FAIL 1' $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake; then
+ >&2 echo " skip failing "$test_id
+ continue
+ fi
+ tes=" \n"
+ line=$(fix_tmp_files "$line")
+ line=$(unique_files "$line")
+ # >&2 echo $line
+ #if there is an ini file then we use this to generate the test
+ #otherwise the ctd file is used
+ #other command line parameters are inserted later into this xml
+ if grep -lq "\-ini" <<<"$line"; then
+ ini=$(echo $line | sed 's/.*-ini \([^ ]\+\).*/\1/')
+ ini="test-data/$ini"
+ else
+ ini="ctd/$tool_id.ctd"
+ fi
+ cli=$(echo $line |cut -d" " -f3- | sed 's/-ini [^ ]\+//')
+
+ ctdtmp=$(mktemp)
+ #echo python3 fill_ctd_clargs.py --ctd $ini $cli
+ # using eval: otherwise for some reason quoted values are not used properly ('A B' -> ["'A", "B'"])
+ # >&2 echo "python3 fill_ctd_clargs.py --ctd $ini $cli"
+ eval "python3 fill_ctd_clargs.py --ctd $ini $cli" > "$ctdtmp"
+ # echo $ctdtmp
+ # >&2 cat $ctdtmp
+ testtmp=$(mktemp)
+ python3 $CTDCONVERTER/convert.py galaxy -i $ctdtmp -o $testtmp -s tools_blacklist.txt -f "$FILETYPES" -m macros.xml -t tool.conf -p hardcoded_params.json --tool-version $VERSION --test-only --test-unsniffable csv tsv txt dta dta2d edta mrm splib > /dev/null
+ cat $testtmp | grep -v ' /dev/null
+
+ #rm $testtmp
+ done
+ echo ' '
+}
+
+#some tests use the same file twice which does not work in planemo tests
+#hence we create symlinks for each file used twice
+function unique_files {
+ line=$@
+ for arg in $@
+ do
+ if [[ ! -f "test-data/$arg" ]]; then
+ continue
+ fi
+ cnt=$(grep -c $arg <<< $(echo "$line" | tr ' ' '\n'))
+ while [[ $cnt -gt 1 ]]; do
+ new_arg=$(echo $arg | sed "s/\(.*\)\./\1_$cnt./")
+ ln -fs $arg test-data/$new_arg
+ line=$(echo $line | sed "s/\($arg.*\)$arg/\1$new_arg/")
+ cnt=$(grep -c $arg <<< $(echo "$line" | tr ' ' '\n'))
+ done
+ done
+
+ echo $line
+}
+
+# options of out_type selects need to be fixed to Galaxy data types
+function fix_out_type {
+ grep "^$1" "$2" | awk '{print $2}'
+}
+
+#OpenMS tests output to tmp files and compare with FuzzyDiff to the expected file.
+#problem: the extension of the tmp files is unusable for test generation.
+#unfortunately the extensions used in the DIFF lines are not always usable for the CLI
+#(e.g. for prepare_test_data, e.g. CLI expects csv but test file is txt)
+#this function replaces the tmp file by the expected file.
+function fix_tmp_files {
+# >&2 echo "FIX $line"
+ ret=""
+ for a in $@; do
+ if [[ ! $a =~ .tmp$ ]]; then
+ ret="$ret $a"
+ continue
+ fi
+# >&2 echo " a "$a
+ g=$(cat $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake | awk '{printf("%s@NEWLINE@", $0)}' | sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' | grep '\${DIFF}.*'"$a")
+# >&2 echo " g "$g
+ in1=$(sed 's/.*-in1 \([^ ]\+\).*/\1/' <<<$g)
+ # >&2 echo " in1 "$in1
+ if [[ "$a" != "$in1" ]]; then
+ ret="$ret $a"
+ continue
+ fi
+ in2=$(sed 's/.*-in2 \([^ ]\+\).*/\1/' <<<$g)
+ in2=$(basename $in2 | sed 's/)$//')
+ # >&2 echo " in2 "$in2
+ if [[ -f "test-data/$in2" ]]; then
+ ln -fs "$in1" "test-data/$in2"
+ ret="$ret $in2"
+ else
+ ret="$ret $a"
+ fi
+ done
+# >&2 echo "--> $ret"
+ echo "$ret"
+}
+
+function link_tmp_files {
+ # note this also considers commented lines (starting with a #)
+ # because of tests where the diff command is commented and we
+ # still want to use the extension of these files
+ cat $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake | sed 's/^\s*//; s/\s*$//' | grep -v "^$" | awk '{printf("%s@NEWLINE@", $0)}' | sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' | grep "\${DIFF}" | while read -r line
+ do
+ in1=$(sed 's/.*-in1 \([^ ]\+\).*/\1/' <<<$line)
+ in1=$(basename $in1 | sed 's/)$//')
+ in2=$(sed 's/.*-in2 \([^ ]\+\).*/\1/' <<<$line)
+ in2=$(basename $in2 | sed 's/)$//')
+ if [[ "$in1" == "$in2" ]]; then
+ >&2 echo "not linking equal $in1 $in2"
+ continue
+ fi
+ ln -f -s $in1 test-data/$in2
+ done
+ for i in test-data/*.tmp
+ do
+ if [ ! -e test-data/$(basename $i .tmp) ]; then
+ ln -s $(basename $i) test-data/$(basename $i .tmp)
+ #ln -s $(basename $i) test-data/$(basename $i .tmp)
+ else
+ ln -fs $(basename $i) test-data/$(basename $i .tmp)
+ fi
+ done
+}
+
+
+
+# parse data preparation calls from OpenMS sources for a tool with a given id
+function prepare_test_data {
+# id=$1
+# | egrep -i "$id\_.*[0-9]+(_prepare\"|_convert)?"
+
+# TODO SiriusAdapter https://github.com/OpenMS/OpenMS/pull/5010
+ cat $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake | sed 's/#.*$//'| sed 's/^\s*//; s/\s*$//' | grep -v "^$" | awk '{printf("%s@NEWLINE@", $0)}' | sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' |
+ sed 's/degenerate_cases\///' |
+ egrep -v "WRITEINI|WRITECTD|INVALIDVALUE|DIFF" |
+ grep add_test |
+ egrep "TOPP|UTILS" |
+ sed 's@${DATA_DIR_SHARE}/@@g;'|
+ sed 's@${TMP_RIP_PATH}@dummy2.tmp@g'|
+ sed 's@TOFCalibration_ref_masses @TOFCalibration_ref_masses.txt @g; s@TOFCalibration_const @TOFCalibration_const.csv @'|
+ sed 's/\("TOPP_SiriusAdapter_4".*\)-sirius:database all\(.*\)/\1-sirius:database pubchem\2/' |
+ while read line
+ do
+ test_id=$(echo "$line" | sed 's/add_test(//; s/"//g; s/)[^)]*$//; s/\${TOPP_BIN_PATH}\///g;s/\${DATA_DIR_TOPP}\///g; s#THIRDPARTY/##g' | cut -d" " -f1)
+
+ if grep -lq "$test_id"'\".* PROPERTIES WILL_FAIL 1' $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake; then
+ >&2 echo " skip failing "$test_id
+ continue
+ fi
+
+ line=$(echo "$line" | sed 's/add_test("//; s/)[^)]*$//; s/\${TOPP_BIN_PATH}\///g;s/\${DATA_DIR_TOPP}\///g; s#THIRDPARTY/##g' | cut -d" " -f2-)
+ # line="$(fix_tmp_files $line)"
+ echo 'echo executing "'$test_id'"'
+ echo "$line > $test_id.stdout 2> $test_id.stderr"
+ echo "if [[ \"\$?\" -ne \"0\" ]]; then >&2 echo '$test_id failed'; >&2 echo -e \"stderr:\n\$(cat $test_id.stderr | sed 's/^/ /')\"; echo -e \"stdout:\n\$(cat $test_id.stdout)\";fi"
+ done
+}
diff -r 000000000000 -r e030fdaaf631 generate.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/generate.sh Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,76 @@
+#!/usr/bin/env bash
+
+VERSION=2.6
+FILETYPES="filetypes.txt"
+PROFILE="20.05"
+## FILETYPES_RE=$(grep -v "^#" $FILETYPES | grep -v "^$" | cut -f 1 -d" " | tr '\n' '|' | sed 's/|$//'| sed 's/|/\\|/g')
+
+export tmp=$(mktemp -d)
+export CTDCONVERTER="$tmp/CTDConverter"
+
+###############################################################################
+## reset old data
+###############################################################################
+# rm $(ls *xml |grep -v macros)
+# rm -rf ctd
+# mkdir -p ctd
+# echo "" > prepare_test_data.sh
+
+###############################################################################
+## generate tests
+## also creates
+## - conda environment (for executing the binaries) and
+## - the git clone of OpenMS (for generating the tests)
+## - ctd files
+###############################################################################
+bash ./test-data.sh ./macros_autotest.xml
+
+###############################################################################
+## get the
+## - conda package (for easy access and listing of the OpenMS binaries),
+###############################################################################
+# if [ ! -d $OPENMSPKG ]; then
+# mkdir $OPENMSPKG/
+# wget -P $OPENMSPKG/ "$CONDAPKG"
+# tar -xf $OPENMSPKG/"$(basename $CONDAPKG)" -C OpenMS$VERSION-pkg/
+# rm $OPENMSPKG/"$(basename $CONDAPKG)"
+# fi
+
+###############################################################################
+## Get python libaries for CTD -> Galaxy conversion
+## TODO fix to main repo OR conda packkage if PRs are merged
+###############################################################################
+# if [ ! -d CTDopts ]; then
+# # git clone https://github.com/genericworkflownodes/CTDopts CTDopts
+# git clone -b topic/no-1-2x https://github.com/bernt-matthias/CTDopts CTDopts
+# fi
+if [ ! -d $CTDCONVERTER ]; then
+ #git clone https://github.com/WorkflowConversion/CTDConverter.git CTDConverter
+ git clone -b topic/cdata https://github.com/bernt-matthias/CTDConverter.git $CTDCONVERTER
+fi
+# export PYTHONPATH=$(pwd)/CTDopts
+###############################################################################
+## conversion ctd->xml
+###############################################################################
+
+find . -maxdepth 0 -name "[A-Z]*xml" -delete
+source $(dirname $(which conda))/../etc/profile.d/conda.sh
+conda activate $tmp/OpenMS$VERSION-env
+python $CTDCONVERTER/convert.py galaxy -i ctd/*ctd -o ./ -s tools_blacklist.txt -f "$FILETYPES" -m macros.xml -t tool.conf -p hardcoded_params.json --test-macros macros_autotest.xml --test-macros-prefix autotest_ --test-macros macros_test.xml --test-macros-prefix manutest_ --tool-version $VERSION --tool-profile $PROFILE > convert.out 2> convert.err
+if [[ "$?" -ne "0" ]]; then >&2 echo 'CTD -> XML conversion failed'; >&2 echo -e "stderr:\n$(cat convert.err)"; fi
+conda deactivate
+
+patch PepNovoAdapter.xml < PepNovoAdapter.patch
+patch OMSSAAdapter.xml < OMSSAAdapter.patch
+
+# https://github.com/OpenMS/OpenMS/pull/4984
+sed -i -e 's@http://www.openms.de/documentation/@http://www.openms.de/doxygen/release/2.6.0/html/@' ./*xml
+# https://github.com/OpenMS/OpenMS/pull/4984#issuecomment-702641976
+patch -p0 <404-urls.patch
+
+# #-b version log debug test in_type executable pepnovo_executable param_model_directory rt_concat_trafo_out param_id_pool
+
+# for i in A-E F-H I-L M-N O-P Q-Z
+# do
+# planemo t [$i]*xml --galaxy_branch release_20.05 --galaxy_python_version 3.7 --test_output $i.html --test_output_json $i.json &
+# done
diff -r 000000000000 -r e030fdaaf631 hardcoded_params.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hardcoded_params.json Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,236 @@
+{
+ "#": "blacklist parameters",
+
+ "version": [{"value": "@"}],
+ "debug": [{"value": "@"}],
+ "algorithm:debug": [{"value": "@"}],
+ "java_memory": [{"value": "@"}],
+ "java_permgen": [{"value": "@"}],
+ "#": "type of input is always determined from the file extension ",
+ "in_type": [{"value": "@"}],
+
+ "#": "tool specific blacklist parameters",
+
+ "convert_back": [{"value": "@", "tools": ["OpenSwathMzMLFileCacher"]}],
+ "NET_executable": [{
+ "value": "@",
+ "tools": ["FileConverter"]
+ }],
+
+
+ "params_file": [{"value": "@", "tools": ["SpectraSTSearchAdapter"]}],
+
+ "#": "TODO not usable in 2.5 https://github.com/OpenMS/OpenMS/issues/4456, corresponding test currently disabled",
+ "consensus_out": [{"value": "@", "tools": ["MaRaClusterAdapter"]}],
+ "#": "TODO would need treatment as prefix-output",
+ "output_directory": [{"value": "@", "tools": ["MaRaClusterAdapter"]}],
+
+ "#": "hardcode parameter values",
+
+ "comet_version": [{
+ "value":"2016.01 rev. 3"
+ }],
+ "comet_executable": [{
+ "value":"comet"
+ }],
+ "crux_executable": [{
+ "value": "crux"
+ }],
+ "fido_executable": [{
+ "value":"Fido"
+ }],
+ "fidocp_executable": [{
+ "value":"FidoChooseParameters"
+ }],
+ "maracluster_executable": [{
+ "value":"/home/berntm/projects/tools-galaxyp/tools/openms/OpenMS2.5.0-git/THIRDPARTY/Linux/64bit/MaRaCluster/maracluster"
+ }],
+ "mascot_directory": [{
+ "value":"TODO"
+ }],
+ "myrimatch_executable": [{
+ "value":"myrimatch"
+ }],
+ "omssa_executable": [{
+ "value":"$(dirname $(realpath $(which omssacl)))/omssacl"
+ }],
+ "ThermoRaw_executable": [{
+ "value": "ThermoRawFileParser.exe",
+ "tools": ["FileConverter"]
+ }],
+ "pepnovo_executable": [{
+ "value":"pepnovo"
+ }],
+ "percolator_executable": [{
+ "value":"percolator"
+ }],
+ "xtandem_executable": [{
+ "value":"xtandem"
+ }],
+ "executable": [
+ {
+ "value":"$(dirname $(realpath $(which luciphor2)))/luciphor2.jar",
+ "tools": ["LuciphorAdapter"]
+ }, {
+ "value":"/home/berntm/Downloads/MSFragger-20171106/MSFragger-20171106.jar",
+ "tools": ["MSFraggerAdapter"]
+ }, {
+ "value":"$(msgf_plus -get_jar_path)",
+ "tools": ["MSGFPlusAdapter"]
+ }, {
+ "value": "/home/berntm/Downloads/novor/lib/novor.jar",
+ "tools": ["NovorAdapter"]
+ }, {
+ "value":"$(which sirius)",
+ "tools": ["SiriusAdapter", "AssayGeneratorMetabo"]
+ }, {
+ "value":"spectrast",
+ "tools": ["SpectraSTSearchAdapter"]
+ }
+ ],
+ "r_executable": [{
+ "value":"R"
+ }],
+ "rscript_executable": [{
+ "value":"Rscript"
+ }],
+ "java_executable": [{
+ "value":"java"
+ }],
+ "log": [{
+ "value":"log.txt"
+ }],
+ "tempDirectory": [{
+ "value":"$TMP_DIR"
+ }],
+ "temp_data_directory": [{
+ "value":"$TMP_DIR"
+ }],
+ "algorithm:Preprocessing:tmp_dir": [{
+ "value":"$TMP_DIR"
+ }],
+ "no_progress": [{
+ "value": true
+ }],
+ "#": "only used in LuciphorAdapter at the moment, inconsistency will be fixed",
+ "num_threads": [{
+ "value":"${GALAXY_SLOTS:-1}"
+ }],
+ "threads": [{
+ "value": "${GALAXY_SLOTS:-1}"
+ }],
+ "sirius:cores": [{
+ "value": "${GALAXY_SLOTS:-1}"
+ }],
+
+ "#": "hardcode the outer loop threads for OpenSwathWorkflow",
+ "outer_loop_threads": [{
+ "value": "1",
+ "tools": ["OpenSwathWorkflow"]
+ }],
+ "separator": [{
+ "value": ",",
+ "tools": ["IDMassAccuracy"]
+ }],
+
+ "#": "don't alow to copy data internally to save computation time for reloading",
+ "copy_data": [{
+ "value": "false",
+ "tools": ["MapAlignerTreeGuided"]
+ }],
+
+ "#": "overwrite/add Galaxy xml attributes of some parameters (names need to start with param_)",
+
+ "#": "test is not a hardcoded value since we need to set it in the tool tests",
+ "test": [{
+ "CTD:type": "text",
+ "XML:type": "hidden"
+ }],
+
+ "#": "overwrite CTD attributes of some parameters (some are not possible, e.g. type)",
+
+ "#": "for some tools the user needs to select the desired output type since detection by extension makes no sense for galaxy tools",
+ "out_type": [{
+ "CTD:required": true,
+ "CTD:advanced": false
+ }],
+
+ "#": "SeedListGenerator with consensusXML input needs a dynamic number of outputs that depends on the content of the input, so we remove this options at the moment because its hard or impossible to implement in Galaxy, https://github.com/OpenMS/OpenMS/issues/4404 .. see also in parameter",
+ "#": "FileInfo, MapStatistics, SequenceCoverageCalculator wo -out just writes to stdout. not wanted here",
+ "#": "MzMLSplitter output prefix https://github.com/OpenMS/OpenMS/issues/4404",
+ "#": "IDRipper: blacklist out (is doing the same as the output-prefix out-path)",
+ "out": [{
+ "CTD:is_list": false,
+ "tools": ["SeedListGenerator"]
+ }, {
+ "CTD:required": true,
+ "tools": ["FileInfo", "MapStatistics", "SequenceCoverageCalculator"]
+ }, {
+ "CTD:type": "output-prefix",
+ "CTD:required": true,
+ "CTD:restrictions": "mzml",
+ "tools": ["MzMLSplitter"]
+ }, {
+ "value": "@",
+ "tools": ["IDRipper"]
+ }],
+
+ "#": "Try to remove xml data type whereever possible",
+ "#": "XTandem Adapter output is called .xml in OMS which is to unspecific -> use Galaxy's bioml",
+ "xml_out": [{
+ "CTD:restrictions": "bioml",
+ "tools": ["XTandemAdapter"]
+ }],
+
+ "#": "IDFileConverter remove xml",
+ "#": "OpenSwathWorkflow make in single file input and all outputs non-optional",
+ "#": "XFDR does not need xml .. redundant with xquest.xml TODO check if list is up to date with each new release",
+ "#": "SeedListGenerator: remove consensusXML https://github.com/OpenMS/OpenMS/issues/4404 .. see also out parameter",
+ "in": [{
+ "CTD:restrictions": "pepXML,protXML,mascotXML,omssaXML,bioml,psms,tsv,idXML,mzid,xquest.xml",
+ "tools": ["IDFileConverter"]
+ }, {
+ "CTD:is_list": false,
+ "tools": ["OpenSwathWorkflow"]
+ }, {
+ "CTD:restrictions": "idXML,mzid,xquest.xml",
+ "tools": ["XFDR"]
+ }, {
+ "CTD:restrictions": "mzML,idXML,featureXML",
+ "tools": ["SeedListGenerator"]
+ }],
+
+ "#": "IDMapper has in and spectra:in params, in is used in out as format_source",
+ "#": "which does not work in Galaxy: https://github.com/galaxyproject/galaxy/pull/9493",
+ "spectra:in": [{
+ "CTD:name": "_in",
+ "tools": ["IDMapper"]
+ }],
+
+ "#": "hardcoding prefix parameters which are not yet available in OMS but in CTDOpts https://github.com/OpenMS/OpenMS/pull/4527",
+ "#": "output-prefix",
+ "out_path": [{
+ "CTD:type": "output-prefix",
+ "CTD:required": true,
+ "CTD:restrictions": "idXML",
+ "tools": ["IDRipper"]
+ }],
+ "outputDirectory": [{
+ "CTD:type": "output-prefix",
+ "CTD:advanced": false,
+ "CTD:required": true,
+ "CTD:restrictions": "mzml",
+ "tools": ["OpenSwathFileSplitter"]
+ }],
+
+ "#": "OpenSwathDIAPreScoring: https://github.com/OpenMS/OpenMS/pull/4443",
+ "#": "SpectraSTSearchAdapter does not need xml .. redundant with pep.xml TODO check if list is up to date with each new release",
+ "output_files": [{
+ "CTD:required": true,
+ "tools": ["OpenSwathDIAPreScoring"]
+ }, {
+ "CTD:restrictions": "txt,tsv,pep.xml,pepXML,html",
+ "tools": ["SpectraSTSearchAdapter"]
+
+ }]
+}
diff -r 000000000000 -r e030fdaaf631 macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,128 @@
+
+
+
+ 2.6
+ 0
+
+
+ openms
+ openms-thirdparty
+
+ blast
+
+
+
+ ctdopts
+
+
+
+
+
+
+
+
+
+
+
+
+ doi:10.1186/1471-2105-9-163
+
+
+
+
+
+ Hide Advanced Options
+ Show Advanced Options
+
+
+
+
+
+
+
+
+
+
+ ^[^$]
+
+ ^ *((?:\"[^\"]*\" +)|(?:[^ \"]+ +))*((?:\"[^\"]*\")|(?:[^ \"]+)) *$
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ^ *[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?( *[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)* *$
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ^ *[+-]?[0-9]+( *[+-]?[0-9]+)* *$
+
+
+
+
+
+
+
+
+
+
+
+
+#def quote(s):
+ #set $s = [ _ for _ in $s.split(" ") if _ != "" ]
+ #set $q = False
+ #for $i, $p in enumerate($s):
+ #if $p == "":
+ #continue
+ #end if
+ #if $p.startswith('"'):
+ #set $q = True
+ #end if
+## #if p.startswith('-'):
+## #set p = "\\" + p
+## #elif p.startswith('"-'):
+## #set p = "\\" + p[1:]
+## #end if
+ #if not $q:
+ #set $s[i] = '"%s"' % p
+ #end if
+ #if $p.endswith('"'):
+ #set $q = False
+ #end if
+ #end for
+ #return " ".join($s)
+#end def
+
+
+
diff -r 000000000000 -r e030fdaaf631 macros_autotest.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros_autotest.xml Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,27205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r e030fdaaf631 macros_discarded_auto.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros_discarded_auto.xml Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,378 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r e030fdaaf631 macros_test.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros_test.xml Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,545 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r e030fdaaf631 prepare_test_data_manual.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/prepare_test_data_manual.sh Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,161 @@
+MSSimulator -test -in DecoyDatabase_1.fasta -out MSsimulator.mzml -algorithm:RandomNumberGenerators:biological reproducible -algorithm:RandomNumberGenerators:technical reproducible > MSSimulator_1.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'MSSimulator_1 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+MSSimulator -test -in DecoyDatabase_1.fasta -out MSsimulator_MALDI.mzml -algorithm:RandomNumberGenerators:biological reproducible -algorithm:RandomNumberGenerators:technical reproducible -algorithm:MSSim:Global:ionization_type MALDI > MSSimulator_2.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'MSSimulator_2 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+ClusterMassTracesByPrecursor -test -in_ms1 ConsensusMapNormalizer_input.consensusXML -in_swath ConsensusMapNormalizer_input.consensusXML -out ClusterMassTracesByPrecursor.mzml > ClusterMassTracesByPrecursor.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'ClusterMassTracesByPrecursor failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+ClusterMassTraces -test -in ConsensusMapNormalizer_input.consensusXML -out ClusterMassTraces.mzml > ClusterMassTraces.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'ClusterMassTraces failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+CVInspector -test -cv_files CHEMISTRY/XLMOD.obo -cv_names XLMOD -mapping_file MAPPING/ms-mapping.xml -html CVInspector.html > CVInspector.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'CVInspector failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+DeMeanderize -test -in MSsimulator_MALDI.mzml -out DeMeanderize.mzml > DeMeanderize.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'DeMeanderize failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+# TODO DigestorMotif
+
+Digestor -test -in random.fa -out Digestor.fasta -out_type fasta > Digestor.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'Digestor failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+EICExtractor -test -in spectra.mzML -pos FileConverter_10_input.edta -out EICExtractor.csv > EICExtractor.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'EICExtractor failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+#TODO ERPairFinder
+
+FeatureFinderIsotopeWavelet -test -in FeatureFinderCentroided_1_input.mzML -out FeatureFinderIsotopeWavelet.featureXML > FeatureFinderIsotopeWavelet.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'FeatureFinderIsotopeWavelet failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+
+FFEval -test -in FeatureFinderCentroided_1_output.featureXML -truth FeatureFinderCentroided_1_output.featureXML -out FFEval.featureXML -out_roc FFEval_roc.csv > FFEval.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'FFEval failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+# TODO? deprecated IDDecoyProbability
+
+IDExtractor -test -in MSGFPlusAdapter_1_out.idXML -best_hits -number_of_peptides 1 -out IDExtractor.idXML > IDExtractor.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'IDExtractor failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+LabeledEval -test -in FeatureLinkerLabeled_1_input.featureXML -truth FeatureLinkerLabeled_1_output.consensusXML> LabeledEval.txt > LabeledEval.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'LabeledEval failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+MapStatistics -test -in SiriusAdapter_3_input.featureXML -out MapStatistics.txt > MapStatistics_1.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'MapStatistics_1 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+MapStatistics -test -in ConsensusXMLFile_1.consensusXML -out MapStatistics2.txt > MapStatistics_2.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'MapStatistics_2 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+MetaboliteAdductDecharger -test -in Decharger_input.featureXML -out_cm MetaboliteAdductDecharger_cm.consensusXML -out_fm MetaboliteAdductDecharger_fm.featureXML -outpairs MetaboliteAdductDecharger_pairs.consensusXML > MetaboliteAdductDecharger.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'MetaboliteAdductDecharger failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+MetaboliteSpectralMatcher -test -in spectra.mzML -database MetaboliteSpectralDB.mzML -out MetaboliteSpectralMatcher.mzTab > MetaboliteSpectralMatcher.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'MetaboliteSpectralMatcher failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+# TODO MRMPairFinder
+
+# generate two inputs for OpenSwathDIAPreScoring
+OpenSwathDIAPreScoring -tr OpenSwathWorkflow_1_input.TraML -swath_files OpenSwathAnalyzer_2_swathfile.mzML -output_files OpenSwathDIAPreScoring.tsv > OpenSwathDIAPreScoring.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'OpenSwathDIAPreScoring failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+# generate two inputs for OpenSwathDIAPreScoring by linking
+ln -s OpenSwathAnalyzer_2_swathfile.mzML OpenSwathDIAPreScoring_in1.mzML
+ln -s OpenSwathAnalyzer_2_swathfile.mzML OpenSwathDIAPreScoring_in2.mzML
+OpenSwathDIAPreScoring -tr OpenSwathWorkflow_1_input.TraML -swath_files OpenSwathDIAPreScoring_in1.mzML OpenSwathDIAPreScoring_in2.mzML -output_files OpenSwathDIAPreScoring_2_1.tsv OpenSwathDIAPreScoring_2_2.tsv > OpenSwathDIAPreScoring.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'OpenSwathDIAPreScoring failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+OpenSwathRewriteToFeatureXML -featureXML OpenSwathFeatureXMLToTSV_input.featureXML -out OpenSwathRewriteToFeatureXML.featureXML > OpenSwathRewriteToFeatureXML.stdout 2> stderr
+# if [[ "$?" -ne "0" ]]; then >&2 echo 'OpenSwathRewriteToFeatureXML failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+# adapted from the commented tests in OpenMS TODO may be removed later https://github.com/OpenMS/OpenMS/issues/4719
+FileConverter -in PepNovo.mzXML -out PepNovo_1.mzML > /dev/null 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'FileConverter failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+PepNovoAdapter -ini PepNovoAdapter_1_parameters.ini -in PepNovo_1.mzML -out PepNovoAdapter_3_output.idXML -model_directory pepnovo_models/ -pepnovo_executable pepnovo > PepNovo_1.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'PhosphoScoring failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+FileConverter -in PepNovo.mzData -out PepNovo_4.mzML > /dev/null 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'FileConverter failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+PepNovoAdapter -ini PepNovoAdapter_1_parameters.ini -in PepNovo_4.mzML -out PepNovoAdapter_4_output.idXML -model_directory pepnovo_models/ -pepnovo_executable pepnovo > PepNovo_1.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'PhosphoScoring failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+#PepNovoAdapter -ini PepNovoAdapter_5_parameters.ini -in PepNovoAdapter_5_output.pepnovo_out -out PepNovoAdapter_5_output.idXML -model_directory pepnovo_models/
+
+# TODO PhosphoScoring
+PhosphoScoring -in spectra.mzML -id MSGFPlusAdapter_1_out1.tmp -out PhosphoScoring.idxml > PhosphoScoring.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'PhosphoScoring failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+PSMFeatureExtractor -test -in MSGFPlusAdapter_1_out.idXML XTandemAdapter_1_out.idXML -multiple_search_engines -skip_db_check -out PSMFeatureExtractor.idxml > PSMFeatureExtractor_1.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'PSMFeatureExtractor_1 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+PSMFeatureExtractor -test -in MSGFPlusAdapter_1_out.idXML XTandemAdapter_1_out.idXML -multiple_search_engines -skip_db_check -out PSMFeatureExtractor.mzid > PSMFeatureExtractor_2.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'PSMFeatureExtractor_2 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+QCCalculator -test -in OpenPepXL_input.mzML -out QCCalculator1.qcML > QCCalculator_1.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'QCCalculator_1 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+QCCalculator -test -in OpenPepXL_input.mzML -id OpenPepXL_output.idXML -consensus OpenPepXL_input.consensusXML -out QCCalculator2.qcML > QCCalculator_2.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'QCCalculator_2 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+QCCalculator -test -in IDMapper_4_input.mzML -id IDMapper_4_input.idXML -feature IDMapper_4_input.featureXML -out QCCalculator3.qcML > QCCalculator_3.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'QCCalculator_3 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+# TODO QCEmbedder
+# TODO QCExporter
+# TODO QCExtractor
+# TODO QCImporter
+
+QCMerger -test -in QCCalculator1.qcML QCCalculator3.qcML -out QCMerger.qcML > QCMerger.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'QCMerger failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+QCShrinker -test -in QCCalculator1.qcML -out QCShrinker.qcML > QCShrinker.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'QCShrinker failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+RNADigestor -test -in random_RNA.fa -out RNADigestor.fasta > RNADigestor.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'RNADigestor failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+RNPxlXICFilter -test -control FileFilter_1_input.mzML -treatment FileFilter_1_input.mzML -out RNPxlXICFilter.mzML > RNPxlXICFilter.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'RNPxlXICFilter failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+RTEvaluation -in PeptideIndexer_1.idXML -out RTEvaluation.tsv > RTEvaluation.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'RTEvaluation failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+SemanticValidator -test -in FileFilter_1_input.mzML -mapping_file MAPPING/ms-mapping.xml > SemanticValidator.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SemanticValidator failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+IDFilter -in PeptideIndexer_1.idXML -best:strict -out SequenceCoverageCalculator_1.idXML > IDFilter.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'IDFilter failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+SequenceCoverageCalculator -test -in_database PeptideIndexer_1.fasta -in_peptides SequenceCoverageCalculator_1.idXML -out SequenceCoverageCalculator.txt > SequenceCoverageCalculator.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SequenceCoverageCalculator failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+# TODO SpecLibCreator
+
+SpectraFilterBernNorm -test -in SpectraFilterSqrtMower_1_input.mzML -out SpectraFilterBernNorm.mzML > SpectraFilterBernNorm.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraFilterBernNorm failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+SpectraFilterMarkerMower -test -in SpectraFilterSqrtMower_1_input.mzML -out SpectraFilterMarkerMower.mzML > SpectraFilterMarkerMower.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraFilterMarkerMower failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+SpectraFilterNLargest -test -in SpectraFilterSqrtMower_1_input.mzML -out SpectraFilterNLargest.mzML > SpectraFilterNLargest.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraFilterNLargest failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+SpectraFilterNormalizer -test -in SpectraFilterSqrtMower_1_input.mzML -out SpectraFilterNormalizer.mzML > SpectraFilterNormalizer.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraFilterNormalizer failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+SpectraFilterParentPeakMower -test -in SpectraFilterSqrtMower_1_input.mzML -out SpectraFilterParentPeakMower.mzML > SpectraFilterParentPeakMower.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraFilterParentPeakMower failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+SpectraFilterScaler -test -in SpectraFilterSqrtMower_1_input.mzML -out SpectraFilterScaler.mzML > SpectraFilterScaler.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraFilterScaler failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+SpectraFilterThresholdMower -test -in SpectraFilterSqrtMower_1_input.mzML -out SpectraFilterThresholdMower.mzML > SpectraFilterThresholdMower.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraFilterThresholdMower failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+SpectraMerger -test -in NovorAdapter_in.mzML -out SpectraMerger_1.mzML > SpectraMerger.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraMerger failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+# TODO SvmTheoreticalSpectrumGeneratorTrainer
+
+TransformationEvaluation -test -in FileInfo_16_input.trafoXML -out TransformationEvaluation.trafoXML > TransformationEvaluation.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'TransformationEvaluation failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
+
+XMLValidator -test -in FileFilter_1_input.mzML > XMLValidator.stdout 2> stderr
+if [[ "$?" -ne "0" ]]; then >&2 echo 'XMLValidator failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/ /')"; fi
diff -r 000000000000 -r e030fdaaf631 readme.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/readme.md Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,153 @@
+Galaxy wrapper for OpenMS
+=========================
+
+OpenMS is an open-source software C++ library for LC/MS data management and analyses.
+It offers an infrastructure for the rapid development of mass spectrometry related software.
+OpenMS is free software available under the three clause BSD license and runs under Windows, MacOSX and Linux.
+
+More informations are available at:
+
+ * https://github.com/OpenMS/OpenMS
+ * https://www.openms.de/
+
+The wrappers for these tools and most of their tests are automatically
+generated using the `generate.sh` script. The generation of the tools is
+based on the CTDConverter (https://github.com/WorkflowConversion/CTDConverter)
+which can be fine tuned via the `hardcoded_params.json` file. This file allows
+to blacklist and hardcode parameters and to modify or set arbitrary
+CTD/XML attributes.
+
+Note that, due to its size, the test data is excluded from this repository. In
+order to generate the test data on call `test-data.sh`.
+
+Manual updates should only be done to
+
+- the `@GALAXY_VERSION@"` token in `macros.xml`
+- and the manually contributed tests in `macros_test.xml` (The goal is that all
+ tools that do not have an automatically generated test are covered here)
+- the `hardcoded_params.json` files
+
+In a few cases patches may be acceptable.
+
+Installation
+============
+
+The Galaxy OpenMS tools can be installed from the toolshed. While most tools
+will work out of the box some need attention since requirements can not be
+fulfilled via Conda:
+
+Not yet in Conda are:
+
+- SpectraST (http://tools.proteomecenter.org/wiki/index.php?title=SpectraST)
+- MaRaCluster (https://github.com/statisticalbiotechnology/maracluster)
+
+Binaries for these tools can easily be obtained via:
+
+```
+VERSION=....
+git git clone -b release/$VERSION.0 https://github.com/OpenMS/OpenMS.git OpenMS$VERSION.0-git
+git submodule init OpenMS$VERSION.0-git
+git submodule update OpenMS$VERSION.0-git
+```
+
+They are located in `OpenMS$VERSION-git/THIRDPARTY/`.
+
+Not in Conda due to licencing restrictions:
+
+- Mascot http://www.matrixscience.com/
+- MSFragger https://github.com/Nesvilab/MSFragger
+- Novor http://www.rapidnovor.org/novor
+
+There are multiple ways to enable the Galaxy tools to use these binaries.
+
+- Just copy them to the `bin` path within Galaxy's conda environment
+- Put them in any other path that that is included in PATH
+- Edit the corresponding tools: In the command line part search for the parameters `-executable`, `-maracluster_executable`, or `-mascot_directory` and edit them appropriately.
+
+Working
+=======
+
+The tools work by:
+
+Preprocessing:
+
+- For each input / output data set parameter a directory is crated (named by
+ the parameter)
+- For input data set parameters the links to the actual location of the data
+ sets are created
+
+Main:
+
+- The galaxy wrapper create two json config files: one containing the
+ parameters and the values chosen by the user and the other the values of
+ hardcoded parameters.
+- With `OpenMSTool -write_ctd ./` a CTD (names OpenMSTool.ctd) file is
+ generated that contains the default values.
+- A call to `fill_ctd.py` fills in the values from the json config files into
+ the CTD file
+- The actual tool is called `OpenMSTool -ini OpenMSTool.ctd` and also all input
+ and output parameters are given on the command line.
+
+Postprocessing:
+
+- output data sets are moved to the final locations
+
+Note: The reason for handling data sets on the command line (and not specifying
+them in the CTD file) is mainly that all files in Galaxy have the extension
+`.dat` and OpenMS tools require an appropriate extension. But this may change
+in the future.
+
+Generating OpenMS wrappers
+==========================
+
+1. remove old test data: `rm -rf $(ls -d test-data/* | egrep -v "random|\.loc")`
+2. `./generate.sh`
+
+Whats happening:
+
+1. The binaries of the OpenMS package can generate a CTD file that describes
+ the parameters. These CTD files are converted to xml Galaxy tool descriptions
+ using the `CTDConverter`.
+
+2. The CI testing framework of OpenMS contains command lines and test data
+ (https://github.com/OpenMS/OpenMS/tree/develop/src/tests/topp). These tests
+ are described in two CMake files.
+
+ - From these CMake files Galaxy tests are auto generated and stored in `macros_autotest.xml`
+ - The command lines are stored in `prepare_test_data.sh` for regeneration of test data
+
+More details can be found in the comments of the shell script.
+
+Open problems
+=============
+
+Some tools stall in CI testing using `--biocontainers` which is why the OpenMS
+tools are currently listed in `.tt_biocontainer_skip`. This is
+
+- AssayGeneratorMetabo and SiriusAdapter (both depend on sirius)
+- OMSSAAdapter
+
+Using `docker -t` seems to solve the problem (see
+https://github.com/galaxyproject/galaxy/issues/10153).
+
+Licence (MIT)
+=============
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff -r 000000000000 -r e030fdaaf631 test-data.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data.sh Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,265 @@
+#!/usr/bin/env bash
+
+VERSION=2.6
+FILETYPES="filetypes.txt"
+CONDAPKG="https://anaconda.org/bioconda/openms/2.6.0/download/linux-64/openms-2.6.0-h4afb90d_0.tar.bz2"
+
+# import the magic
+. ./generate-foo.sh
+
+# install conda
+if [ -z "$tmp" ]; then
+ tmp=$(mktemp -d)
+ created="yes"
+fi
+
+export OPENMSGIT="$tmp/OpenMS$VERSION.0-git"
+export OPENMSPKG="$tmp/OpenMS$VERSION-pkg/"
+export OPENMSENV="$tmp/OpenMS$VERSION-env"
+export CTDCONVERTER="$tmp/CTDConverter"
+
+if [[ -z "$1" ]]; then
+ autotests="/dev/null"
+else
+ autotests="$1"
+fi
+
+if type conda > /dev/null; then
+ true
+else
+ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
+ bash Miniconda3-latest-Linux-x86_64.sh -b -p "$tmp/miniconda"
+ source "$tmp/miniconda/bin/activate"
+fi
+eval "$(conda shell.bash hook)"
+
+
+###############################################################################
+## get
+## - conda environment (for executing the binaries) and
+## - the git clone of OpenMS (for generating the tests)
+###############################################################################
+
+echo "Clone OpenMS $VERSION sources"
+if [[ ! -d $OPENMSGIT ]]; then
+ git clone -b release/$VERSION.0 https://github.com/OpenMS/OpenMS.git $OPENMSGIT
+ cd $OPENMSGIT
+ git submodule init
+ git submodule update
+ cd -
+else
+ cd $OPENMSGIT
+ git pull origin release/$VERSION.0
+ cd -
+fi
+
+echo "Create OpenMS $VERSION conda env"
+# TODO currently add lxml (needed by CTDConverter)
+# TODO for some reason a to recent openjdk is used
+if conda env list | grep "$OPENMSENV"; then
+ true
+else
+ conda create -y --quiet --override-channels --channel iuc --channel conda-forge --channel bioconda --channel defaults -p $OPENMSENV openms=$VERSION openms-thirdparty=$VERSION ctdopts=1.4 lxml
+# chmod -R u-w $OPENMSENV
+fi
+###############################################################################
+## get the
+## - conda package (for easy access and listing of the OpenMS binaries),
+###############################################################################
+echo "Download OpenMS $VERSION package $CONDAPKG"
+
+if [[ ! -d $OPENMSPKG ]]; then
+ mkdir $OPENMSPKG
+ wget -q -P $OPENMSPKG/ "$CONDAPKG"
+ tar -xf $OPENMSPKG/"$(basename $CONDAPKG)" -C $OPENMSPKG/
+ rm $OPENMSPKG/"$(basename $CONDAPKG)"
+fi
+
+###############################################################################
+## Get python libaries for CTD -> Galaxy conversion
+## TODO fix to main repo OR conda packkage if PRs are merged
+###############################################################################
+echo "Clone CTDConverter"
+if [[ ! -d $CTDCONVERTER ]]; then
+ #git clone https://github.com/WorkflowConversion/CTDConverter.git CTDConverter
+ git clone -b topic/cdata https://github.com/bernt-matthias/CTDConverter.git $CTDCONVERTER
+else
+ cd $CTDCONVERTER
+ git pull origin topic/cdata
+ cd -
+fi
+
+###############################################################################
+## copy all the test data files to test-data
+## most of it (outputs) will be overwritten later, but its needed for
+## prepare_test_data
+###############################################################################
+echo "Get test data"
+find test-data -type f,l,d ! -name "*fa" ! -name "*loc" -delete
+
+cp $(find $OPENMSGIT/src/tests/topp/ -type f | grep -Ev "third_party_tests.cmake|CMakeLists.txt|check_ini") test-data/
+cp -r $OPENMSGIT/share/OpenMS/MAPPING/ test-data/
+cp -r $OPENMSGIT/share/OpenMS/CHEMISTRY test-data/
+cp -r $OPENMSGIT/share/OpenMS/examples/ test-data/
+if [[ ! -f test-data/MetaboliteSpectralDB.mzML ]]; then
+ wget -nc https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Tutorials/Data/latest/Example_Data/Metabolomics/databases/MetaboliteSpectralDB.mzML
+ mv MetaboliteSpectralDB.mzML test-data/
+fi
+ln -fs TOFCalibration_ref_masses test-data/TOFCalibration_ref_masses.txt
+ln -fs TOFCalibration_const test-data/TOFCalibration_const.csv
+
+if [ ! -d test-data/pepnovo_models/ ]; then
+ mkdir -p /tmp/pepnovo
+ wget -nc http://proteomics.ucsd.edu/Software/PepNovo/PepNovo.20120423.zip
+ unzip PepNovo.20120423.zip -d /tmp/pepnovo/
+ mv /tmp/pepnovo/Models test-data/pepnovo_models/
+ rm PepNovo.20120423.zip
+ rm -rf /tmp/pepnovo
+fi
+###############################################################################
+## generate ctd files using the binaries in the conda package
+###############################################################################
+echo "Create CTD files"
+conda activate $OPENMSENV
+rm -rf ctd
+mkdir -p ctd
+
+# TODO because of https://github.com/OpenMS/OpenMS/issues/4641
+# this needs to be done from within test-data
+cd test-data
+for i in $OPENMSPKG/bin/*
+do
+ b=$(basename $i)
+ echo $b
+ $b -write_ctd ../ctd/
+ sed -i -e 's/²/^2/' ../ctd/$b.ctd
+done
+cd -
+###############################################################################
+## fix ini files: OpenMS test data contains ini files with outdated ini files.
+## e.g. variables might be in different nodes, outdated variables present, new
+## variables missing, ...
+## OpenMS tools fix this on the fly (so its no problem for the OpenMS tests)
+## but it is for the generation of the tests
+## see https://github.com/OpenMS/OpenMS/issues/4462
+###############################################################################
+echo "Update test INI files"
+for ini in test-data/*ini
+do
+ tool=$(cat $ini | grep 'NODE name="' | head -n 1 | sed 's/.*name="\([^"]\+\)".*/\1/')
+ bin=$(which $tool)
+ if [[ -z $bin ]]; then
+ >&2 echo "missing binary to convert $ini"
+ continue
+ fi
+ cp $ini $ini.backup
+ $bin -ini $ini -write_ini $ini > $ini.stdout 2> $ini.stderr
+ if [[ "$?" -ne "0" ]]; then
+ >&2 echo "could not convert $ini"
+ fi
+done
+
+###############################################################################
+## create script to create results for the tests and run it
+###############################################################################
+echo "Create test shell script"
+
+echo -n "" > prepare_test_data.sh
+echo 'export COMET_BINARY="comet"' >> prepare_test_data.sh
+echo 'export CRUX_BINARY="crux"' >> prepare_test_data.sh
+echo 'export FIDOCHOOSEPARAMS_BINARY="FidoChooseParameters"' >> prepare_test_data.sh
+echo 'export FIDO_BINARY="Fido"' >> prepare_test_data.sh
+echo 'export LUCIPHOR_BINARY="$(dirname $(realpath $(which luciphor2)))/luciphor2.jar"' >> prepare_test_data.sh
+
+echo 'export MARACLUSTER_BINARY="'"$OPENMSGIT"'/THIRDPARTY/Linux/64bit/MaRaCluster/maracluster"'>> prepare_test_data.sh
+echo 'export MSFRAGGER_BINARY="/home/berntm/Downloads/MSFragger-20171106/MSFragger-20171106.jar"'>> prepare_test_data.sh
+echo 'export MSGFPLUS_BINARY="$(msgf_plus -get_jar_path)"' >> prepare_test_data.sh
+echo 'export MYRIMATCH_BINARY="myrimatch"'>> prepare_test_data.sh
+echo 'export NOVOR_BINARY="/home/berntm/Downloads/novor/lib/novor.jar"' >> prepare_test_data.sh
+echo 'export OMSSA_BINARY="$(dirname $(realpath $(which omssacl)))/omssacl"'>> prepare_test_data.sh
+echo 'export PERCOLATOR_BINARY="percolator"'>> prepare_test_data.sh
+echo 'export SIRIUS_BINARY="$(which sirius)"' >> prepare_test_data.sh
+echo 'export SPECTRAST_BINARY="'"$OPENMSGIT"'/THIRDPARTY/Linux/64bit/SpectraST/spectrast"' >> prepare_test_data.sh
+echo 'export XTANDEM_BINARY="xtandem"' >> prepare_test_data.sh
+echo 'export THERMORAWFILEPARSER_BINARY="ThermoRawFileParser.exe"' >> prepare_test_data.sh
+
+prepare_test_data >> prepare_test_data.sh #tmp_test_data.sh
+
+# prepare_test_data > tmp_test_data.sh
+# # remove calls not needed for the tools listed in any .list file
+# echo LIST $LIST
+# if [ ! -z "$LIST" ]; then
+# REX=$(echo $LIST | sed 's/ /\n/g' | sed 's@.*/\([^/]\+\).xml$@\1@' | tr '\n' '|' | sed 's/|$//')
+# else
+# REX=".*"
+# fi
+# echo REX $REX
+# cat tmp_test_data.sh | egrep "($REX)" >> prepare_test_data.sh
+# rm tmp_test_data.sh
+
+echo "Execute test shell script"
+chmod u+x prepare_test_data.sh
+cd ./test-data || exit
+../prepare_test_data.sh
+cd - || exit
+
+
+###############################################################################
+## create/update test data for the manually generated tests
+## - run convert once with the manual tests only and
+## - update test-data (needs to run 2x)
+###############################################################################
+echo "Execute test shell script for manually curated tests"
+chmod u+x prepare_test_data_manual.sh
+
+cd ./test-data || exit
+../prepare_test_data_manual.sh
+cd - || exit
+
+
+###############################################################################
+## auto generate tests
+###############################################################################
+echo "Write test macros to $autotests"
+echo "" > "$autotests"
+for i in $(ls *xml |grep -v macros)
+do
+ b=$(basename "$i" .xml)
+ get_tests2 "$b" >> "$autotests"
+done
+echo " " >> "$autotests"
+
+echo "Create test data links"
+link_tmp_files
+
+# tests for tools using output_prefix parameters can not be auto generated
+# hence we output the tests for manual curation in macros_test.xml
+# and remove them from the autotests
+# -> OpenSwathFileSplitter IDRipper MzMLSplitter
+#
+# Furthermore we remove tests for tools without binaries in conda
+# -> MSFragger MaRaClusterAdapter NovorAdapter
+#
+# not able to specify composite test data
+# -> SpectraSTSearchAdapter
+if [[ ! -z "$1" ]]; then
+ echo "" > macros_discarded_auto.xml
+ for i in OpenSwathFileSplitter IDRipper MzMLSplitter MSFraggerAdapter MaRaClusterAdapter NovorAdapter SpectraSTSearchAdapter
+ do
+ echo "" >> macros_discarded_auto.xml
+ xmlstarlet sel -t -c "/macros/xml[@name='autotest_$i']/test" macros_autotest.xml >> macros_discarded_auto.xml
+ echo " " >> macros_discarded_auto.xml
+ xmlstarlet ed -d "/macros/xml[@name='autotest_$i']/test" macros_autotest.xml > tmp
+ mv tmp macros_autotest.xml
+ done
+ >&2 echo "discarded autogenerated macros for curation in macros_discarded_auto.xml"
+fi
+conda deactivate
+
+## remove broken symlinks in test-data
+find test-data/ -xtype l -delete
+
+# if [ ! -z "$created" ]; then
+# echo "Removing temporary directory"
+# rm -rf "$tmp"
+# fi
diff -r 000000000000 -r e030fdaaf631 tool-data/pepnovo_models.loc.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/pepnovo_models.loc.sample Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,23 @@
+# This is a sample file distributed with Galaxy that enables tools
+# to use pepnovo models
+# The file has three tab separated columns: name, value, and path.
+# The idea is that there are a number of models in a directory:
+# - each model directory has a unique name (columns 2 and 0)
+# - each model can contain a set of models (column 1)
+#
+# The following example works fo the default models from
+# http://proteomics.ucsd.edu/Software/PepNovo.html (just remove the comment
+# chars and replace DIR_TO_PEPNOVO_MODELS)
+
+#default_models CID_IT_TRYP DIR_TO_PEPNOVO_MODELS
+#default_models LTQ_COMP DIR_TO_PEPNOVO_MODELS
+#default_models DBC4_PEAK DIR_TO_PEPNOVO_MODELS
+#default_models CID_IT_TRYP_TAG5 DIR_TO_PEPNOVO_MODELS
+#default_models CID_IT_TRYP_TAG6 DIR_TO_PEPNOVO_MODELS
+#default_models ITDNV_PEAK DIR_TO_PEPNOVO_MODELS
+#default_models CID_IT_TRYP_SCORE DIR_TO_PEPNOVO_MODELS
+#default_models CID_IT_TRYP_TAG3 DIR_TO_PEPNOVO_MODELS
+#default_models CID_IT_TRYP_DNVPART DIR_TO_PEPNOVO_MODELS
+#default_models CID_IT_TRYP_TAG4 DIR_TO_PEPNOVO_MODELS
+#default_models CID_IT_TRYP_DB DIR_TO_PEPNOVO_MODELS
+#default_models CID_IT_TRYP_CSP DIR_TO_PEPNOVO_MODELS
diff -r 000000000000 -r e030fdaaf631 tool_data_table_conf.xml.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_data_table_conf.xml.sample Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,7 @@
+
+
+
+
diff -r 000000000000 -r e030fdaaf631 tool_data_table_conf.xml.test
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_data_table_conf.xml.test Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,7 @@
+
+
+
+
diff -r 000000000000 -r e030fdaaf631 tools_blacklist.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools_blacklist.txt Tue Oct 13 20:26:46 2020 +0000
@@ -0,0 +1,21 @@
+# seems not possible for 2.5 https://github.com/OpenMS/OpenMS/issues/4426
+# DigestorMotif
+
+# deprecated https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/UTILS_IDDecoyProbability.html
+# https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/a16242.html
+IDDecoyProbability
+
+# personal communication with author V. Bafna:
+# "InsPect is no longer maintained as there are many better tools including MS-GF+"
+InspectAdapter
+
+# licence? see https://github.com/bioconda/bioconda-recipes/issues/18953
+#MSFraggerAdapter
+
+# https://github.com/OpenMS/OpenMS/issues/4550#issuecomment-594065727
+ProteomicsLFQ
+
+# https://github.com/OpenMS/OpenMS/issues/4401
+InclusionExclusionListCreator
+RTPredict
+PTPredict