go-hep.org/x/hep@v0.38.1/fads/hepmcreader.go (about) 1 // Copyright ©2017 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package fads 6 7 import ( 8 "bufio" 9 "fmt" 10 "io" 11 "os" 12 "reflect" 13 "sort" 14 15 "go-hep.org/x/hep/fmom" 16 "go-hep.org/x/hep/fwk" 17 "go-hep.org/x/hep/hepmc" 18 "go-hep.org/x/hep/heppdt" 19 ) 20 21 type HepMcStreamer struct { 22 Name string // input filename 23 r io.ReadCloser 24 dec *hepmc.Decoder 25 26 mcevt string // hepmc event key 27 } 28 29 func (s *HepMcStreamer) Connect(ports []fwk.Port) error { 30 var err error 31 s.r, err = os.Open(s.Name) 32 if err != nil { 33 return err 34 } 35 36 s.dec = hepmc.NewDecoder(bufio.NewReader(s.r)) 37 38 port := ports[0] 39 if port.Type != reflect.TypeOf(hepmc.Event{}) { 40 err = fmt.Errorf("fads: invalid port. expected type=hepmc.Event. got=%v", port.Type) 41 return err 42 } 43 44 s.mcevt = port.Name 45 46 return err 47 } 48 49 func (s *HepMcStreamer) Read(ctx fwk.Context) error { 50 var err error 51 52 var evt hepmc.Event 53 err = s.dec.Decode(&evt) 54 if err != nil { 55 return err 56 } 57 58 store := ctx.Store() 59 err = store.Put(s.mcevt, evt) 60 return err 61 } 62 63 func (s *HepMcStreamer) Disconnect() error { 64 return s.r.Close() 65 } 66 67 type HepMcReader struct { 68 fwk.TaskBase 69 70 mcevt string // original HepMC event 71 allparts string // all particles 72 stableparts string // all stable particles 73 partons string // all partons 74 } 75 76 func (tsk *HepMcReader) Configure(ctx fwk.Context) error { 77 var err error 78 79 err = tsk.DeclInPort(tsk.mcevt, reflect.TypeOf(hepmc.Event{})) 80 if err != nil { 81 return err 82 } 83 84 err = tsk.DeclOutPort(tsk.allparts, reflect.TypeOf([]Candidate{})) 85 if err != nil { 86 return err 87 } 88 89 err = tsk.DeclOutPort(tsk.stableparts, reflect.TypeOf([]Candidate{})) 90 if err != nil { 91 return err 92 } 93 94 err = tsk.DeclOutPort(tsk.partons, reflect.TypeOf([]Candidate{})) 95 if err != nil { 96 return err 97 } 98 99 return err 100 } 101 102 func (tsk *HepMcReader) StartTask(ctx fwk.Context) error { 103 var err error 104 return err 105 } 106 107 func (tsk *HepMcReader) StopTask(ctx fwk.Context) error { 108 var err error 109 return err 110 } 111 112 func (tsk *HepMcReader) Process(ctx fwk.Context) error { 113 var err error 114 store := ctx.Store() 115 msg := ctx.Msg() 116 117 v, err := store.Get(tsk.mcevt) 118 if err != nil { 119 return err 120 } 121 evt := v.(hepmc.Event) 122 123 msg.Debugf( 124 "event number: %d, #parts=%d #vtx=%d\n", 125 evt.EventNumber, 126 len(evt.Particles), len(evt.Vertices), 127 ) 128 129 allparts := make([]Candidate, 0, len(evt.Particles)/2) 130 stableparts := make([]Candidate, 0) 131 partons := make([]Candidate, 0) 132 133 for _, p := range evt.Particles { 134 allparts = append(allparts, Candidate{ 135 Pid: int32(p.PdgID), 136 Status: int32(p.Status), 137 M2: 1, 138 D2: 1, 139 CandCharge: -999, 140 CandMass: -999.9, 141 Mom: fmom.PxPyPzE(p.Momentum), 142 }) 143 c := &allparts[len(allparts)-1] 144 pdg := heppdt.ParticleByID(heppdt.PID(p.PdgID)) 145 if pdg != nil { 146 c.CandCharge = int32(pdg.Charge) 147 c.CandMass = pdg.Mass 148 } 149 150 // FIXME(sbinet) 151 if vtx := p.ProdVertex; vtx != nil { 152 c.M1 = 1 153 c.Pos = fmom.PxPyPzE(vtx.Position) 154 } 155 156 if pdg == nil { 157 continue 158 } 159 160 pdgcode := p.PdgID 161 if pdgcode < 0 { 162 pdgcode = -pdgcode 163 } 164 165 switch { 166 case p.Status == 1: // && pdg.IsStable(): 167 width := pdg.Resonance.Width.Value 168 if width <= 1e-10 { 169 stableparts = append(stableparts, *c) 170 } 171 172 case pdgcode <= 5 || pdgcode == 21 || pdgcode == 15: 173 partons = append(partons, *c) 174 } 175 176 } 177 178 sort.Sort(ByPt(allparts)) 179 err = store.Put(tsk.allparts, allparts) 180 if err != nil { 181 return err 182 } 183 184 sort.Sort(ByPt(stableparts)) 185 err = store.Put(tsk.stableparts, stableparts) 186 if err != nil { 187 return err 188 } 189 190 sort.Sort(ByPt(partons)) 191 err = store.Put(tsk.partons, partons) 192 if err != nil { 193 return err 194 } 195 196 msg.Debugf("allparts: %d\nstables: %d\npartons: %d\n", 197 len(allparts), 198 len(stableparts), 199 len(partons), 200 ) 201 202 return err 203 } 204 205 func init() { 206 fwk.Register(reflect.TypeOf(HepMcReader{}), 207 func(typ, name string, mgr fwk.App) (fwk.Component, error) { 208 var err error 209 210 tsk := &HepMcReader{ 211 TaskBase: fwk.NewTask(typ, name, mgr), 212 mcevt: "/fads/McEvent", 213 allparts: "/fads/AllParticles", 214 stableparts: "/fads/StableParticles", 215 partons: "/fads/Partons", 216 } 217 218 err = tsk.DeclProp("Input", &tsk.mcevt) 219 if err != nil { 220 return nil, err 221 } 222 223 return tsk, err 224 }, 225 ) 226 }