From ae5e340c8bfdc4af93e2d43b1fee6b4a00b963e8 Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Mon, 8 Nov 2021 15:43:29 -0500 Subject: [PATCH 01/10] adding ionmobility tag to report --- Changelog | 8 +++----- cmd/report.go | 1 + lib/met/met.go | 1 + lib/rep/psm.go | 5 ++--- lib/rep/rep.go | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Changelog b/Changelog index 3bfca9b2..74f50019 100644 --- a/Changelog +++ b/Changelog @@ -1,10 +1,8 @@ ### Added -- Support for TMTPro (18-plex) + ### Changed -- Decoys have NextAA and PrevAA -- Improved the filtering process + ### Fixed -- Fixed an issue with the labelling of the TMT-6 channels -- Minor bugs and issues +- Fixed an issue with the ion mobility column not showing in empty PSM tables. diff --git a/cmd/report.go b/cmd/report.go index 1226a2c9..f339013b 100644 --- a/cmd/report.go +++ b/cmd/report.go @@ -43,6 +43,7 @@ func init() { reportCmd.Flags().BoolVarP(&m.Report.Decoys, "decoys", "", false, "add decoy observations to reports") reportCmd.Flags().BoolVarP(&m.Report.MSstats, "msstats", "", false, "create an output compatible with MSstats") reportCmd.Flags().BoolVarP(&m.Report.MZID, "mzid", "", false, "create a mzID output") + reportCmd.Flags().BoolVarP(&m.Report.IonMob, "ionmobility", "", false, "forces the printing of the ion mobility column") } RootCmd.AddCommand(reportCmd) diff --git a/lib/met/met.go b/lib/met/met.go index 9d8092a3..35e2247f 100644 --- a/lib/met/met.go +++ b/lib/met/met.go @@ -415,6 +415,7 @@ type Report struct { Decoys bool `yaml:"withDecoys"` MSstats bool `yaml:"msstats"` MZID bool `yaml:"mzID"` + IonMob bool `yaml:"ionmobility"` } // TMTIntegrator options and parameters diff --git a/lib/rep/psm.go b/lib/rep/psm.go index 9b716d0e..87b1738c 100644 --- a/lib/rep/psm.go +++ b/lib/rep/psm.go @@ -133,13 +133,12 @@ func (evi *Evidence) AssemblePSMReport(pep id.PepIDList, decoyTag string) { } // MetaPSMReport report all psms from study that passed the FDR filter -func (evi Evidence) MetaPSMReport(workspace, brand string, channels int, hasDecoys, isComet, hasLoc, hasLabels bool) { +func (evi Evidence) MetaPSMReport(workspace, brand string, channels int, hasDecoys, isComet, hasLoc, hasIonMob, hasLabels bool) { var header string var modMap = make(map[string]string) var modList []string var hasCompVolt bool - var hasIonMob bool var hasPurity bool output := fmt.Sprintf("%s%spsm.tsv", workspace, string(filepath.Separator)) @@ -179,7 +178,7 @@ func (evi Evidence) MetaPSMReport(workspace, brand string, channels int, hasDeco hasCompVolt = true } - if evi.PSM[i].IonMobility > 0 { + if !hasIonMob && evi.PSM[i].IonMobility > 0 { hasIonMob = true } diff --git a/lib/rep/rep.go b/lib/rep/rep.go index b8016537..7d040ade 100644 --- a/lib/rep/rep.go +++ b/lib/rep/rep.go @@ -441,7 +441,7 @@ func Run(m met.Data) { logrus.Info("Creating reports") // PSM - repo.MetaPSMReport(m.Home, isoBrand, isoChannels, m.Report.Decoys, isComet, hasLoc, hasLabels) + repo.MetaPSMReport(m.Home, isoBrand, isoChannels, m.Report.Decoys, isComet, hasLoc, m.Report.IonMob, hasLabels) // Ion repo.MetaIonReport(m.Home, isoBrand, isoChannels, m.Report.Decoys, hasLabels) From 3b867b1300c486d8cb053797168b22e4e0a54ecf Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Thu, 11 Nov 2021 10:11:22 -0500 Subject: [PATCH 02/10] fixing the razorMap group sorting - char --- Changelog | 1 + lib/fil/fdr.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changelog b/Changelog index 74f50019..f2089709 100644 --- a/Changelog +++ b/Changelog @@ -6,3 +6,4 @@ ### Fixed - Fixed an issue with the ion mobility column not showing in empty PSM tables. +- Fixed an issue where high-scoring peptides mapping to complicated razor cases where not showing in the reports. diff --git a/lib/fil/fdr.go b/lib/fil/fdr.go index 3dbe23df..65411576 100644 --- a/lib/fil/fdr.go +++ b/lib/fil/fdr.go @@ -363,13 +363,13 @@ func RazorFilter(p id.ProtXML) id.ProtXML { var idList []string for protein, id := range r[k].MappedproteinsSID { - id = fmt.Sprintf("%s_%s", id, protein) + id = fmt.Sprintf("%s#%s", id, protein) idList = append(idList, id) } sort.Strings(idList) - id := strings.Split(idList[0], "_") + id := strings.Split(idList[0], "#") razorPair[k] = id[1] } From 93b3752433d68a7fc76f46620f03f6863f174a85 Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Thu, 11 Nov 2021 15:53:13 -0500 Subject: [PATCH 03/10] updating the parameter file --- lib/pip/bindata.go.zip | Bin 12980 -> 13526 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/pip/bindata.go.zip b/lib/pip/bindata.go.zip index f91d76d08ba52b552ae8c18ba4a8f2546bc843c4..b93a65e1f703e4b5d20a6cbee3c3317a256575a0 100644 GIT binary patch literal 13526 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 Fe*w_R2220| literal 12980 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 From 157ed0d354725957963982a47c0457871b03127c Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Thu, 11 Nov 2021 16:35:57 -0500 Subject: [PATCH 04/10] adding a clear message to razor reading --- cmd/msfragger.go | 2 +- lib/fil/fil.go | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cmd/msfragger.go b/cmd/msfragger.go index 79b7b4cb..aa327824 100644 --- a/cmd/msfragger.go +++ b/cmd/msfragger.go @@ -73,7 +73,7 @@ func init() { msfraggerCmd.Flags().StringVarP(&m.MSFragger.SearchEnzymeCut2, "search_enzyme_cut_2", "", "", "Second enzyme's cutting amino acid.") msfraggerCmd.Flags().StringVarP(&m.MSFragger.SearchEnzymeNocut2, "search_enzyme_nocut_2", "", "", "Second enzyme's protecting amino acid.") msfraggerCmd.Flags().IntVarP(&m.MSFragger.AllowedMissedCleavage2, "allowed_missed_cleavage_2", "", 2, "Second enzyme's allowed number of missed cleavages per peptide. Maximum value is 5.") - msfraggerCmd.Flags().StringVarP(&m.MSFragger.SearchEnzymeSense2, "search_enzyme_sense_2", "", "", "Second enzyme's cutting terminal.") + msfraggerCmd.Flags().StringVarP(&m.MSFragger.SearchEnzymeSense2, "search_enzyme_sense_2", "", "C", "Second enzyme's cutting terminal.") msfraggerCmd.Flags().IntVarP(&m.MSFragger.NumEnzymeTermini, "num_enzyme_termini", "", 2, "2 for enzymatic, 1 for semi-enzymatic, 0 for nonspecific digestion") msfraggerCmd.Flags().IntVarP(&m.MSFragger.ClipNTermM, "clip_nTerm_M", "", 1, "") msfraggerCmd.Flags().StringVarP(&m.MSFragger.VariableMod01, "variable_mod_01", "", "", "") diff --git a/lib/fil/fil.go b/lib/fil/fil.go index 7fd256b9..c3cf3c58 100644 --- a/lib/fil/fil.go +++ b/lib/fil/fil.go @@ -33,13 +33,23 @@ func Run(f met.Data) met.Data { f.Filter.Razor = true - if _, err := os.Stat(f.Filter.RazorBin); os.IsNotExist(err) { - logrus.Warn("razor peptides not found: ", f.Filter.RazorBin, ". Skipping razor assignment") - f.Filter.RazorBin = "" - } else { + if _, err := os.Stat(f.Filter.RazorBin); err == nil { + rdest := fmt.Sprintf("%s%s.meta%srazor.bin", f.Home, string(filepath.Separator), string(filepath.Separator)) sys.CopyFile(f.Filter.RazorBin, rdest) + + var rm RazorMap = make(map[string]RazorCandidate) + rm.Restore() + logrus.Info("Fetching razor assignment from: ", f.Filter.RazorBin, ": ", len(rm), " razor groups imported.") + _ = rm + + } else if errors.Is(err, os.ErrNotExist) { + + logrus.Warn("razor peptides not found: ", f.Filter.RazorBin, ". Calculating a new assignment") + f.Filter.RazorBin = "" + } + } // get the database tag from database command From 091d3e1db62b2c330194febfef9ad3b2e7f9c0a8 Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Fri, 12 Nov 2021 10:42:57 -0500 Subject: [PATCH 05/10] prevents the filter from serializing the razor --- lib/fil/fdr.go | 259 ++++++++++++++++++++++++----------------------- lib/fil/fil.go | 4 +- lib/fil/razor.go | 6 +- 3 files changed, 137 insertions(+), 132 deletions(-) diff --git a/lib/fil/fdr.go b/lib/fil/fdr.go index 65411576..0c5768a7 100644 --- a/lib/fil/fdr.go +++ b/lib/fil/fdr.go @@ -213,178 +213,185 @@ func RazorFilter(p id.ProtXML) id.ProtXML { var r RazorMap = make(map[string]RazorCandidate) var rList []string - // for each peptide sequence, collapse all parent protein peptides from ions originated from the same sequence - for _, i := range p.Groups { - for _, j := range i.Proteins { - for _, k := range j.PeptideIons { - - v, ok := r[k.PeptideSequence] - if !ok { - - var rc RazorCandidate - rc.Sequence = k.PeptideSequence - rc.MappedProteinsW = make(map[string]float64) - rc.MappedProteinsGW = make(map[string]float64) - rc.MappedProteinsTNP = make(map[string]int) - rc.MappedproteinsSID = make(map[string]string) - - rc.MappedProteinsW[j.ProteinName] = k.Weight - rc.MappedProteinsGW[j.ProteinName] = k.GroupWeight - rc.MappedProteinsTNP[j.ProteinName] = j.TotalNumberPeptides - rc.MappedproteinsSID[j.ProteinName] = j.GroupSiblingID - - for _, i := range j.IndistinguishableProtein { - rc.MappedProteinsW[i] = -1 - rc.MappedProteinsGW[i] = -1 - rc.MappedProteinsTNP[i] = -1 - rc.MappedproteinsSID[i] = "zzz" - } + // perform a test load of the razor assingment, if there's a file, then the assignment is skipped, and the current file used. + r.Restore(true) + if len(r) == 0 { + + // for each peptide sequence, collapse all parent protein peptides from ions originated from the same sequence + for _, i := range p.Groups { + for _, j := range i.Proteins { + for _, k := range j.PeptideIons { + + v, ok := r[k.PeptideSequence] + if !ok { + + var rc RazorCandidate + rc.Sequence = k.PeptideSequence + rc.MappedProteinsW = make(map[string]float64) + rc.MappedProteinsGW = make(map[string]float64) + rc.MappedProteinsTNP = make(map[string]int) + rc.MappedproteinsSID = make(map[string]string) + + rc.MappedProteinsW[j.ProteinName] = k.Weight + rc.MappedProteinsGW[j.ProteinName] = k.GroupWeight + rc.MappedProteinsTNP[j.ProteinName] = j.TotalNumberPeptides + rc.MappedproteinsSID[j.ProteinName] = j.GroupSiblingID + + for _, i := range j.IndistinguishableProtein { + rc.MappedProteinsW[i] = -1 + rc.MappedProteinsGW[i] = -1 + rc.MappedProteinsTNP[i] = -1 + rc.MappedproteinsSID[i] = "zzz" + } - for _, i := range k.PeptideParentProtein { - rc.MappedProteinsW[i] = -1 - rc.MappedProteinsGW[i] = -1 - rc.MappedProteinsTNP[i] = -1 - rc.MappedproteinsSID[i] = "zzz" - } + for _, i := range k.PeptideParentProtein { + rc.MappedProteinsW[i] = -1 + rc.MappedProteinsGW[i] = -1 + rc.MappedProteinsTNP[i] = -1 + rc.MappedproteinsSID[i] = "zzz" + } - r[k.PeptideSequence] = rc + r[k.PeptideSequence] = rc - } else { - var c = v + } else { + var c = v - // doing like this will allow proteins that map to shared peptidesto be considered - c.MappedProteinsW[j.ProteinName] = k.Weight - c.MappedProteinsGW[j.ProteinName] = k.GroupWeight - c.MappedProteinsTNP[j.ProteinName] = j.TotalNumberPeptides - c.MappedproteinsSID[j.ProteinName] = j.GroupSiblingID - r[k.PeptideSequence] = c + // doing like this will allow proteins that map to shared peptidesto be considered + c.MappedProteinsW[j.ProteinName] = k.Weight + c.MappedProteinsGW[j.ProteinName] = k.GroupWeight + c.MappedProteinsTNP[j.ProteinName] = j.TotalNumberPeptides + c.MappedproteinsSID[j.ProteinName] = j.GroupSiblingID + r[k.PeptideSequence] = c - } + } + } } } - } - - // this will make the assignment more deterministic - for k := range r { - rList = append(rList, k) - } - sort.Strings(rList) - - var razorPair = make(map[string]string) - // get the best protein candidate for each peptide sequence and make the razor pair - for _, k := range rList { - // 1st pass: mark all cases with weight > 0.5 - for pt, w := range r[k].MappedProteinsW { - if w > 0.5 { - razorPair[k] = pt - } + // this will make the assignment more deterministic + for k := range r { + rList = append(rList, k) } - } - - // 2nd pass: mark all cases with highest group weight in the list - for _, k := range rList { - - _, ok := razorPair[k] - if !ok { + sort.Strings(rList) - var topPT string - var topCount int - var topGW float64 - var topTNP int - var topGWMap = make(map[float64]uint8) - var topTNPMap = make(map[int]uint8) + var razorPair = make(map[string]string) - if len(r[k].MappedProteinsGW) == 1 { - - for pt := range r[k].MappedProteinsGW { + // get the best protein candidate for each peptide sequence and make the razor pair + for _, k := range rList { + // 1st pass: mark all cases with weight > 0.5 + for pt, w := range r[k].MappedProteinsW { + if w > 0.5 { razorPair[k] = pt } + } + } - } else if len(r[k].MappedProteinsGW) > 1 { - - for pt, tnp := range r[k].MappedProteinsGW { - if tnp >= topGW { - topGW = tnp - topPT = pt - topGWMap[topGW]++ - } - } + // 2nd pass: mark all cases with highest group weight in the list + for _, k := range rList { - var tie bool - if topGWMap[topGW] >= 2 { - tie = true - } + _, ok := razorPair[k] + if !ok { - if !tie { - razorPair[k] = topPT + var topPT string + var topCount int + var topGW float64 + var topTNP int + var topGWMap = make(map[float64]uint8) + var topTNPMap = make(map[int]uint8) - } else { + if len(r[k].MappedProteinsGW) == 1 { - var tnpList []string - for pt := range r[k].MappedProteinsTNP { - tnpList = append(tnpList, pt) + for pt := range r[k].MappedProteinsGW { + razorPair[k] = pt } - sort.Strings(tnpList) + } else if len(r[k].MappedProteinsGW) > 1 { - for _, pt := range tnpList { - if r[k].MappedProteinsTNP[pt] >= topTNP { - topTNP = r[k].MappedProteinsTNP[pt] + for pt, tnp := range r[k].MappedProteinsGW { + if tnp >= topGW { + topGW = tnp topPT = pt - topTNPMap[topTNP]++ + topGWMap[topGW]++ } } var tie bool - if topTNPMap[topTNP] >= 2 { + if topGWMap[topGW] >= 2 { tie = true } if !tie { + razorPair[k] = topPT - var mplist []string + } else { + + var tnpList []string for pt := range r[k].MappedProteinsTNP { - mplist = append(mplist, pt) + tnpList = append(tnpList, pt) } - sort.Strings(mplist) - for _, pt := range mplist { - if r[k].MappedProteinsTNP[pt] >= topCount { - topCount = r[k].MappedProteinsTNP[pt] + sort.Strings(tnpList) + + for _, pt := range tnpList { + if r[k].MappedProteinsTNP[pt] >= topTNP { + topTNP = r[k].MappedProteinsTNP[pt] topPT = pt + topTNPMap[topTNP]++ } } - razorPair[k] = topPT + var tie bool + if topTNPMap[topTNP] >= 2 { + tie = true + } - } else { + if !tie { - var idList []string - for protein, id := range r[k].MappedproteinsSID { - id = fmt.Sprintf("%s#%s", id, protein) - idList = append(idList, id) - } + var mplist []string + for pt := range r[k].MappedProteinsTNP { + mplist = append(mplist, pt) + } + sort.Strings(mplist) - sort.Strings(idList) + for _, pt := range mplist { + if r[k].MappedProteinsTNP[pt] >= topCount { + topCount = r[k].MappedProteinsTNP[pt] + topPT = pt + } + } - id := strings.Split(idList[0], "#") - razorPair[k] = id[1] - } + razorPair[k] = topPT + } else { + + var idList []string + for protein, id := range r[k].MappedproteinsSID { + id = fmt.Sprintf("%s#%s", id, protein) + idList = append(idList, id) + } + + sort.Strings(idList) + + id := strings.Split(idList[0], "#") + razorPair[k] = id[1] + } + + } } } } - } - for _, k := range rList { - pt, ok := razorPair[k] - if ok { - razor := r[k] - razor.MappedProtein = pt - r[k] = razor + for _, k := range rList { + pt, ok := razorPair[k] + if ok { + razor := r[k] + razor.MappedProtein = pt + r[k] = razor + } } + + r.Serialize() } for i := range p.Groups { @@ -417,8 +424,6 @@ func RazorFilter(p id.ProtXML) id.ProtXML { } } - r.Serialize() - return p } @@ -659,7 +664,7 @@ func twoDFDRFilter(pep id.PepIDList, pro id.ProtIDList, psm, peptide, ion float6 func correctRazorAssignment(list id.PepIDList) id.PepIDList { var rm RazorMap = make(map[string]RazorCandidate) - rm.Restore() + rm.Restore(false) for i := range list { v, ok := rm[list[i].Peptide] @@ -675,7 +680,7 @@ func correctRazorAssignment(list id.PepIDList) id.PepIDList { } } - rm.Serialize() + //rm.Serialize() return list } diff --git a/lib/fil/fil.go b/lib/fil/fil.go index c3cf3c58..56b88d2f 100644 --- a/lib/fil/fil.go +++ b/lib/fil/fil.go @@ -39,7 +39,7 @@ func Run(f met.Data) met.Data { sys.CopyFile(f.Filter.RazorBin, rdest) var rm RazorMap = make(map[string]RazorCandidate) - rm.Restore() + rm.Restore(false) logrus.Info("Fetching razor assignment from: ", f.Filter.RazorBin, ": ", len(rm), " razor groups imported.") _ = rm @@ -187,7 +187,7 @@ func Run(f met.Data) met.Data { if f.Filter.Razor { var razor RazorMap = make(map[string]RazorCandidate) - razor.Restore() + razor.Restore(false) for i := range e.PSM { diff --git a/lib/fil/razor.go b/lib/fil/razor.go index 75e49091..ecf5d07b 100644 --- a/lib/fil/razor.go +++ b/lib/fil/razor.go @@ -37,15 +37,15 @@ func (p *RazorMap) Serialize() { } // Restore reads razor bin files and restore the data sctructure -func (p *RazorMap) Restore() { +func (p *RazorMap) Restore(silent bool) { b, e := ioutil.ReadFile(sys.RazorBin()) - if e != nil { + if e != nil && !silent { msg.ReadFile(e, "warning") } e = msgpack.Unmarshal(b, &p) - if e != nil { + if e != nil && !silent { msg.DecodeMsgPck(e, "warning") } From 4c135dce1efbdcab4c7ab2ac214e2de6872fbc5b Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Tue, 16 Nov 2021 13:19:48 -0500 Subject: [PATCH 06/10] updating the protein header matching --- .goreleaser.yml | 66 +------------------------------------------------ lib/aba/pro.go | 3 ++- lib/dat/db.go | 12 ++++++--- 3 files changed, 12 insertions(+), 69 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 8d2c7622..c36e46d7 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -111,68 +111,4 @@ release: # If set to auto, the release will not be pushed to the docker repository # in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1 # Defaults to false. - # skip_push: true - - -snapcrafts: - # You can change the name of the package. - # Default: `{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}` - - name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}" - - # Wether to publish the snap to the snapcraft store. - # Remember you need to `snapcraft login` first. - # Defaults to false. - publish: true - - # Single-line elevator pitch for your amazing snap. - # 79 char long at most. - summary: A complete toolkit for shotgun proteomics data analysis. - - # This the description of your snap. You have a paragraph or two to tell the - # most important story about your snap. Keep it under 100 words though, - # we live in tweetspace and your description wants to look good in the snap - # store. - description: - Philosopher is a software designed for proteome bioinformatics analysis. - - # A guardrail to prevent you from releasing a snap to all your users before - # it is ready. - # `devel` will let you release only to the `edge` and `beta` channels in the - # store. `stable` will let you release also to the `candidate` and `stable` - # channels. More info about channels here: - # https://snapcraft.io/docs/reference/channels - grade: stable - - # Snaps can be setup to follow three different confinement policies: - # `strict`, `devmode` and `classic`. A strict confinement where the snap - # can only read and write in its own namespace is recommended. Extra - # permissions for strict snaps can be declared as `plugs` for the app, which - # are explained later. More info about confinement here: - # https://snapcraft.io/docs/reference/confinement - confinement: strict - - # Your app's license, based on SPDX license expressions: https://spdx.org/licenses - # Default is empty. - license: GPL-3.0 - - # A snap of type base to be used as the execution environment for this snap. - # Valid values are: - # * bare - Empty base snap; - # * core - Ubuntu Core 16; - # * core18 - Ubuntu Core 18. - # Default is empty. - #base: core18 - - # Each binary built by GoReleaser is an app inside the snap. In this section - # you can declare extra details for those binaries. It is optional. - apps: - - # The name of the app must be the same name as the binary built or the snapcraft name. - philosopher: - - # If your app requires extra permissions to work outside of its default - # confined space, declare them here. - # You can read the documentation about the available plugs and the - # things they allow: - # https://snapcraft.io/docs/reference/interfaces. - plugs: ["home", "network"] + # skip_push: true \ No newline at end of file diff --git a/lib/aba/pro.go b/lib/aba/pro.go index 2f485b62..b7f2708a 100644 --- a/lib/aba/pro.go +++ b/lib/aba/pro.go @@ -214,7 +214,8 @@ func processProteinCombinedFile(a met.Abacus, database dat.Base) rep.CombinedPro for i := range list { for _, j := range database.Records { - if strings.Contains(j.OriginalHeader, list[i].ProteinName) && !strings.Contains(j.OriginalHeader, a.Tag) { + if strings.Contains(j.OriginalHeader, list[i].ProteinName) && strings.HasPrefix(j.OriginalHeader, list[i].ProteinID) && !strings.Contains(j.OriginalHeader, a.Tag) { + //if strings.Contains(j.OriginalHeader, list[i].ProteinName) && !strings.Contains(j.OriginalHeader, a.Tag) { list[i].ProteinName = j.PartHeader list[i].ProteinID = j.ID list[i].EntryName = j.EntryName diff --git a/lib/dat/db.go b/lib/dat/db.go index 8b898e88..85df6230 100644 --- a/lib/dat/db.go +++ b/lib/dat/db.go @@ -395,8 +395,15 @@ func ProcessGeneric(k, v, decoyTag string) Record { idm := idReg.FindStringSubmatch(k) e.ID = idm[1] - e.Description = "" - e.EntryName = "" + part := strings.Split(k, " ") + + if len(part) > 1 { + e.Description = part[1] + } else { + e.Description = k + } + + e.EntryName = k e.GeneNames = "" e.Organism = "" e.SequenceVersion = "" @@ -405,7 +412,6 @@ func ProcessGeneric(k, v, decoyTag string) Record { e.Length = len(v) e.OriginalHeader = k - part := strings.Split(k, " ") e.PartHeader = part[0] if strings.HasPrefix(k, decoyTag) { From a87d8bf32d9c2375524f25197194127264d78638 Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Wed, 17 Nov 2021 09:47:33 -0500 Subject: [PATCH 07/10] adjusting the pipeline for 2D filtering --- lib/fil/fil.go | 3 ++- lib/pip/pip.go | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/fil/fil.go b/lib/fil/fil.go index 56b88d2f..39d4d0f5 100644 --- a/lib/fil/fil.go +++ b/lib/fil/fil.go @@ -125,7 +125,8 @@ func Run(f met.Data) met.Data { msg.Custom(errors.New("database annotation not found, interrupting the processing"), "fatal") } - if f.Filter.TwoD || f.Filter.Razor { + //if f.Filter.TwoD || f.Filter.Razor { + if f.Filter.Razor { var psm id.PepIDList psm.Restore("psm") psm = correctRazorAssignment(psm) diff --git a/lib/pip/pip.go b/lib/pip/pip.go index 00b5beb7..721246f6 100644 --- a/lib/pip/pip.go +++ b/lib/pip/pip.go @@ -512,8 +512,10 @@ func CombinedProteinList(meta met.Data, p Directives, dir string, data []string) dest := fmt.Sprintf("%s%s.meta%spro.bin", i, string(filepath.Separator), string(filepath.Separator)) sys.CopyFile(proBin, dest) - rdest := fmt.Sprintf("%s%s.meta%srazor.bin", i, string(filepath.Separator), string(filepath.Separator)) - sys.CopyFile(sys.RazorBin(), rdest) + if p.Abacus.Razor { + rdest := fmt.Sprintf("%s%s.meta%srazor.bin", i, string(filepath.Separator), string(filepath.Separator)) + sys.CopyFile(sys.RazorBin(), rdest) + } } e := os.RemoveAll(path.Dir(proBin)) From 172b01db2f77cf97136f1601e4248cb29a0e32ad Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Wed, 17 Nov 2021 14:47:57 -0500 Subject: [PATCH 08/10] adding extra checking for duplicate non-compliant headers --- lib/fil/fil.go | 19 +++++++++---------- lib/id/pro.go | 2 ++ lib/rep/protein.go | 5 ++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/fil/fil.go b/lib/fil/fil.go index 39d4d0f5..ec59f28b 100644 --- a/lib/fil/fil.go +++ b/lib/fil/fil.go @@ -9,12 +9,10 @@ import ( "strings" "philosopher/lib/cla" - "philosopher/lib/dat" "philosopher/lib/id" "philosopher/lib/inf" "philosopher/lib/met" "philosopher/lib/mod" - "philosopher/lib/msg" "philosopher/lib/rep" "philosopher/lib/sys" @@ -80,6 +78,7 @@ func Run(f met.Data) met.Data { } else if len(f.Filter.Pox) > 0 && !strings.EqualFold(f.Filter.Pox, "combined") { protXML := ReadProtXMLInput(f.Filter.Pox, f.Filter.Tag, f.Filter.Weight) + ProcessProteinIdentifications(protXML, f.Filter.PtFDR, f.Filter.PepFDR, f.Filter.ProtProb, f.Filter.Picked, f.Filter.Razor, false, f.Filter.Tag) pro.Restore() @@ -119,14 +118,13 @@ func Run(f met.Data) met.Data { } - var dtb dat.Base - dtb.Restore() - if len(dtb.Records) < 1 { - msg.Custom(errors.New("database annotation not found, interrupting the processing"), "fatal") - } + // var dtb dat.Base + // dtb.Restore() + // if len(dtb.Records) < 1 { + // msg.Custom(errors.New("database annotation not found, interrupting the processing"), "fatal") + // } - //if f.Filter.TwoD || f.Filter.Razor { - if f.Filter.Razor { + if f.Filter.Razor || len(f.Filter.RazorBin) > 0 { var psm id.PepIDList psm.Restore("psm") psm = correctRazorAssignment(psm) @@ -185,7 +183,7 @@ func Run(f met.Data) met.Data { e.UpdatePeptideModCount() } - if f.Filter.Razor { + if f.Filter.Razor || len(f.Filter.RazorBin) > 0 { var razor RazorMap = make(map[string]RazorCandidate) razor.Restore(false) @@ -236,6 +234,7 @@ func Run(f met.Data) met.Data { logrus.Info("Processing protein inference") pro.Restore() + e.AssembleProteinReport(pro, f.Filter.Weight, f.Filter.Tag) pro = nil diff --git a/lib/id/pro.go b/lib/id/pro.go index 8f7e7abc..8146ef74 100644 --- a/lib/id/pro.go +++ b/lib/id/pro.go @@ -41,6 +41,7 @@ type ProteinIdentification struct { GroupNumber uint32 GroupSiblingID string ProteinName string + Description string UniqueStrippedPeptides []string Length string PercentCoverage float32 @@ -130,6 +131,7 @@ func (p *ProtXML) Read(f string) { ptid.GroupProbability = i.Probability ptid.Probability = i.Probability ptid.ProteinName = string(j.ProteinName) + ptid.Description = string(j.Annotation.ProteinDescription) ptid.Probability = j.Probability ptid.PercentCoverage = j.PercentCoverage ptid.PctSpectrumIDs = j.PctSpectrumIDs diff --git a/lib/rep/protein.go b/lib/rep/protein.go index 04b04edf..abe930d2 100644 --- a/lib/rep/protein.go +++ b/lib/rep/protein.go @@ -43,6 +43,7 @@ func (evi *Evidence) AssembleProteinReport(pro id.ProtIDList, weight float64, de rep.Modifications.Index = make(map[string]mod.Modification) rep.ProteinName = i.ProteinName + rep.Description = i.Description rep.ProteinGroup = i.GroupNumber rep.ProteinSubGroup = i.GroupSiblingID rep.Length, _ = strconv.Atoi(i.Length) @@ -185,10 +186,8 @@ func (evi *Evidence) AssembleProteinReport(pro id.ProtIDList, weight float64, de // fix the name sand headers and pull database information into protein report for i := range list { for _, j := range dtb.Records { - //if strings.Contains(j.OriginalHeader, list[i].ProteinName) { - if strings.HasPrefix(j.OriginalHeader, list[i].ProteinName) { - //fmt.Println("A:", j.OriginalHeader, "\t", "B:", list[i].ProteinName) + if strings.Contains(j.OriginalHeader, list[i].ProteinName) && strings.Contains(j.OriginalHeader, list[i].Description) { if (j.IsDecoy && list[i].IsDecoy) || (!j.IsDecoy && !list[i].IsDecoy) { From fa28d41a20f246564f9cc447cb09fccc53481b61 Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Wed, 17 Nov 2021 14:49:49 -0500 Subject: [PATCH 09/10] updated parameter file --- lib/pip/bindata.go.zip | Bin 13526 -> 13619 bytes philosopher.yml | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pip/bindata.go.zip b/lib/pip/bindata.go.zip index b93a65e1f703e4b5d20a6cbee3c3317a256575a0..de44fd67864129eae8f0add9a308c41a3f51e47d 100644 GIT binary patch literal 13619 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 NFKPb|jXHJee*hQUyix!F literal 13526 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 Fe*w_R2220| diff --git a/philosopher.yml b/philosopher.yml index a8dfb268..69298a2e 100644 --- a/philosopher.yml +++ b/philosopher.yml @@ -1,5 +1,5 @@ # Philosopher pipeline configuration file -# Version 4.0.1 +# Version 4.1.1 # # The pipeline mode automates the processing done by Philosopher and other tools. First, check # the steps you want to execute in the commands section and change them to @@ -74,7 +74,7 @@ Database Search: # MSFragger-3.4 & Comet v201901 search_enzyme_cut_2: # Second enzyme's cutting amino acid. search_enzyme_nocut_2: # Second enzyme's protecting amino acid. allowed_missed_cleavage_2: # Second enzyme's allowed number of missed cleavages per peptide. Maximum value is 5. - search_enzyme_sense_2: # Second enzyme's cutting terminal. + search_enzyme_sense_2: C # Second enzyme's cutting terminal. num_enzyme_termini: 2 # 2 for enzymatic, 1 for semi-enzymatic, 0 for nonspecific digestion clip_nTerm_M: 1 # specifies the trimming of a protein N-terminal methionine as a variable modification (0 or 1) variable_mod_01: 15.99490 M 3 # variable modification From c83df16e32b0ac23bdd7f4b4de3abffa60684cf2 Mon Sep 17 00:00:00 2001 From: Felipe da Veiga Leprevost Date: Wed, 17 Nov 2021 14:51:48 -0500 Subject: [PATCH 10/10] update database test --- lib/dat/dat_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dat/dat_test.go b/lib/dat/dat_test.go index 18b7826a..6c2c4430 100644 --- a/lib/dat/dat_test.go +++ b/lib/dat/dat_test.go @@ -73,8 +73,8 @@ func TestBase_ProcessDB(t *testing.T) { } d.ProcessDB(tt.args.file, tt.args.decoyTag) - if len(d.Records) != 20371 { - t.Errorf("Number of FASTA entries is incorrect, got %d, want %d", len(d.Records), 20371) + if len(d.Records) != 20360 { + t.Errorf("Number of FASTA entries is incorrect, got %d, want %d", len(d.Records), 20360) } }) }