mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-06-29 16:20:46 +00:00
Add a new command obitagpcr able to tag reads according to their corresponding pcr samples
Former-commit-id: 1f34bf0a27d55afc3556efd64f6ccee6d2329aff
This commit is contained in:
55
cmd/obitools/obitagpcr/main.go
Normal file
55
cmd/obitools/obitagpcr/main.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obiiter"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obioptions"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obiconvert"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obipairing"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obitagpcr"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
// go tool pprof -http=":8000" ./obipairing ./cpu.pprof
|
||||||
|
// f, err := os.Create("cpu.pprof")
|
||||||
|
// if err != nil {
|
||||||
|
// log.Fatal(err)
|
||||||
|
// }
|
||||||
|
// pprof.StartCPUProfile(f)
|
||||||
|
// defer pprof.StopCPUProfile()
|
||||||
|
|
||||||
|
// go tool trace cpu.trace
|
||||||
|
// ftrace, err := os.Create("cpu.trace")
|
||||||
|
// if err != nil {
|
||||||
|
// log.Fatal(err)
|
||||||
|
// }
|
||||||
|
// trace.Start(ftrace)
|
||||||
|
// defer trace.Stop()
|
||||||
|
|
||||||
|
obioptions.SetWorkerPerCore(1)
|
||||||
|
|
||||||
|
optionParser := obioptions.GenerateOptionParser(obitagpcr.OptionSet)
|
||||||
|
|
||||||
|
optionParser(os.Args)
|
||||||
|
pairs, err := obipairing.CLIPairedSequence()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Cannot open file (%v)", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
paired := obitagpcr.IPCRTagPESequencesBatch(pairs,
|
||||||
|
obipairing.CLIGapPenality(),
|
||||||
|
obipairing.CLIDelta(),
|
||||||
|
obipairing.CLIMinOverlap(),
|
||||||
|
obipairing.CLIMinIdentity(),
|
||||||
|
obipairing.CLIWithStats())
|
||||||
|
|
||||||
|
obiconvert.CLIWriteBioSequences(paired, true)
|
||||||
|
|
||||||
|
obiiter.WaitForLastPipe()
|
||||||
|
}
|
28
pkg/obitools/obitagpcr/options.go
Normal file
28
pkg/obitools/obitagpcr/options.go
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package obitagpcr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obimultiplex"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obipairing"
|
||||||
|
"github.com/DavidGamba/go-getoptions"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _reorientate = false
|
||||||
|
|
||||||
|
func TagPCROptionSet(options *getoptions.GetOpt) {
|
||||||
|
options.BoolVar(&_reorientate, "reference-db", _reorientate,
|
||||||
|
options.Description("Reverse complemente reads if needed to store all the sequences in "+
|
||||||
|
"the same orientation respectively to forward and reverse primers"))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// OptionSet adds to the basic option set every options declared for
|
||||||
|
// the obiuniq command
|
||||||
|
func OptionSet(options *getoptions.GetOpt) {
|
||||||
|
obipairing.OptionSet(options)
|
||||||
|
obimultiplex.MultiplexOptionSet(options)
|
||||||
|
TagPCROptionSet(options)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CLIReorientate() bool {
|
||||||
|
return _reorientate
|
||||||
|
}
|
190
pkg/obitools/obitagpcr/pcrtag.go
Normal file
190
pkg/obitools/obitagpcr/pcrtag.go
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
package obitagpcr
|
||||||
|
|
||||||
|
import (
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obialign"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obiiter"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obioptions"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obiseq"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obiconvert"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obimultiplex"
|
||||||
|
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obipairing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func IPCRTagPESequencesBatch(iterator obiiter.IBioSequence,
|
||||||
|
gap float64, delta, minOverlap int,
|
||||||
|
minIdentity float64,
|
||||||
|
withStats bool) obiiter.IBioSequence {
|
||||||
|
|
||||||
|
if !iterator.IsPaired() {
|
||||||
|
log.Fatalln("Sequence data must be paired")
|
||||||
|
}
|
||||||
|
|
||||||
|
nworkers := obioptions.CLIParallelWorkers()
|
||||||
|
|
||||||
|
ngsfilter, err := obimultiplex.CLINGSFIlter()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ngsfilter.Compile(obimultiplex.CLIAllowedMismatch(),
|
||||||
|
obimultiplex.CLIAllowsIndel())
|
||||||
|
|
||||||
|
newIter := obiiter.MakeIBioSequence()
|
||||||
|
newIter.MarkAsPaired()
|
||||||
|
newIter.Add(nworkers)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
newIter.WaitAndClose()
|
||||||
|
log.Printf("End of the sequence PCR Taging")
|
||||||
|
}()
|
||||||
|
|
||||||
|
f := func(iterator obiiter.IBioSequence, wid int) {
|
||||||
|
arena := obialign.MakePEAlignArena(150, 150)
|
||||||
|
var err error
|
||||||
|
|
||||||
|
for iterator.Next() {
|
||||||
|
batch := iterator.Get()
|
||||||
|
for i, A := range batch.Slice() {
|
||||||
|
B := A.PairedWith()
|
||||||
|
consensus := obipairing.AssemblePESequences(
|
||||||
|
A.Copy(), B.ReverseComplement(false),
|
||||||
|
gap, delta, minOverlap, minIdentity, withStats, true, arena,
|
||||||
|
)
|
||||||
|
|
||||||
|
consensus, err = ngsfilter.ExtractBarcode(consensus, true)
|
||||||
|
|
||||||
|
// log.Println("@@ ",wid," Error : ",err)
|
||||||
|
// log.Println("@@ ",wid," SEQA : ",*A)
|
||||||
|
// log.Println("@@ ",wid," SEQB : ",*B)
|
||||||
|
// log.Println("@@ ",wid," consensus : ",*consensus)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
annot := consensus.Annotations()
|
||||||
|
direction := annot["direction"].(string)
|
||||||
|
|
||||||
|
forward_match := annot["forward_match"].(string)
|
||||||
|
forward_mismatches := annot["forward_mismatches"].(int)
|
||||||
|
forward_tag := annot["forward_tag"].(string)
|
||||||
|
|
||||||
|
reverse_match := annot["reverse_match"].(string)
|
||||||
|
reverse_mismatches := annot["reverse_mismatches"].(int)
|
||||||
|
reverse_tag := annot["reverse_tag"].(string)
|
||||||
|
|
||||||
|
sample := annot["sample"].(string)
|
||||||
|
experiment := annot["experiment"].(string)
|
||||||
|
|
||||||
|
aanot := A.Annotations()
|
||||||
|
aanot["direction"] = direction
|
||||||
|
|
||||||
|
aanot["forward_match"] = forward_match
|
||||||
|
aanot["forward_mismatches"] = forward_mismatches
|
||||||
|
aanot["forward_tag"] = forward_tag
|
||||||
|
|
||||||
|
aanot["reverse_match"] = reverse_match
|
||||||
|
aanot["reverse_mismatches"] = reverse_mismatches
|
||||||
|
aanot["reverse_tag"] = reverse_tag
|
||||||
|
|
||||||
|
aanot["sample"] = sample
|
||||||
|
aanot["experiment"] = experiment
|
||||||
|
|
||||||
|
banot := B.Annotations()
|
||||||
|
banot["direction"] = direction
|
||||||
|
|
||||||
|
banot["forward_match"] = forward_match
|
||||||
|
banot["forward_mismatches"] = forward_mismatches
|
||||||
|
banot["forward_tag"] = forward_tag
|
||||||
|
|
||||||
|
banot["reverse_match"] = reverse_match
|
||||||
|
banot["reverse_mismatches"] = reverse_mismatches
|
||||||
|
banot["reverse_tag"] = reverse_tag
|
||||||
|
|
||||||
|
banot["sample"] = sample
|
||||||
|
banot["experiment"] = experiment
|
||||||
|
|
||||||
|
if CLIReorientate() && direction == "reverse" {
|
||||||
|
B.ReverseComplement(true)
|
||||||
|
A.ReverseComplement(true)
|
||||||
|
B.PairTo(A)
|
||||||
|
batch.Slice()[i] = B
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
demultiplex_error := consensus.Annotations()["demultiplex_error"]
|
||||||
|
if demultiplex_error!=nil {
|
||||||
|
A.Annotations()["demultiplex_error"] = demultiplex_error.(string)
|
||||||
|
B.Annotations()["demultiplex_error"] = demultiplex_error.(string)
|
||||||
|
} else {
|
||||||
|
log.Panicln("@@ ",wid,"Error : ",err,*consensus)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
newIter.Push(batch)
|
||||||
|
}
|
||||||
|
newIter.Done()
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Start of the sequence Pairing using %d workers\n", nworkers)
|
||||||
|
|
||||||
|
for i := 1; i < nworkers; i++ {
|
||||||
|
go f(iterator.Split(), i)
|
||||||
|
}
|
||||||
|
go f(iterator, 0)
|
||||||
|
|
||||||
|
iout := newIter
|
||||||
|
|
||||||
|
if !obimultiplex.CLIConservedErrors() {
|
||||||
|
log.Println("Discards unassigned sequences")
|
||||||
|
iout = iout.Rebatch(obioptions.CLIBatchSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var unidentified obiiter.IBioSequence
|
||||||
|
if obimultiplex.CLIUnidentifiedFileName() != "" {
|
||||||
|
log.Printf("Unassigned sequences saved in file: %s\n", obimultiplex.CLIUnidentifiedFileName())
|
||||||
|
unidentified, iout = iout.DivideOn(obiseq.HasAttribute("demultiplex_error"),
|
||||||
|
obioptions.CLIBatchSize())
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
_, err := obiconvert.CLIWriteBioSequences(unidentified,
|
||||||
|
true,
|
||||||
|
obimultiplex.CLIUnidentifiedFileName())
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("%v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
}
|
||||||
|
log.Printf("Sequence demultiplexing using %d workers\n", nworkers)
|
||||||
|
|
||||||
|
return iout
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// if match.IsDirect {
|
||||||
|
// annot["direction"] = "direct"
|
||||||
|
// } else {
|
||||||
|
// annot["direction"] = "reverse"
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if match.ForwardMatch != "" {
|
||||||
|
// annot["forward_match"] = match.ForwardMatch
|
||||||
|
// annot["forward_mismatches"] = match.ForwardMismatches
|
||||||
|
// annot["forward_tag"] = match.ForwardTag
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if match.ReverseMatch != "" {
|
||||||
|
// annot["reverse_match"] = match.ReverseMatch
|
||||||
|
// annot["reverse_mismatches"] = match.ReverseMismatches
|
||||||
|
// annot["reverse_tag"] = match.ReverseTag
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if match.Error == nil {
|
||||||
|
// if match.Pcr != nil {
|
||||||
|
// annot["sample"] = match.Pcr.Sample
|
||||||
|
// annot["experiment"] = match.Pcr.Experiment
|
||||||
|
// for k, val := range match.Pcr.Annotations {
|
||||||
|
// annot[k] = val
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// annot["demultiplex_error"]
|
Reference in New Issue
Block a user