go-hep.org/x/hep@v0.38.1/lcio/track.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 lcio 6 7 import ( 8 "fmt" 9 "strings" 10 11 "go-hep.org/x/hep/sio" 12 ) 13 14 // TrackContainer is a collection of tracks. 15 type TrackContainer struct { 16 Flags Flags 17 Params Params 18 Tracks []Track 19 } 20 21 type Track struct { 22 Type int32 // type of track (e.g TPC, VTX, SIT) 23 States []TrackState 24 Chi2 float32 // chi^2 of fit 25 NdF int32 // ndf of fit 26 DEdx float32 // dEdx 27 DEdxErr float32 // error of dEdx 28 Radius float32 // radius of innermost hit used in track fit 29 SubDetHits []int32 // number of hits in particular sub-detectors 30 Tracks []*Track // tracks that have been combined into this track 31 Hits []*TrackerHit 32 } 33 34 func (trk *Track) D0() float64 { 35 if len(trk.States) <= 0 { 36 return 0 37 } 38 return float64(trk.States[0].D0) 39 } 40 41 func (trk *Track) Phi() float64 { 42 if len(trk.States) <= 0 { 43 return 0 44 } 45 return float64(trk.States[0].Phi) 46 } 47 48 func (trk *Track) Omega() float64 { 49 if len(trk.States) <= 0 { 50 return 0 51 } 52 return float64(trk.States[0].Omega) 53 } 54 55 func (trk *Track) Z0() float64 { 56 if len(trk.States) <= 0 { 57 return 0 58 } 59 return float64(trk.States[0].Z0) 60 } 61 62 func (trk *Track) TanL() float64 { 63 if len(trk.States) <= 0 { 64 return 0 65 } 66 return float64(trk.States[0].TanL) 67 } 68 69 type TrackState struct { 70 Loc int32 // location of the track state 71 D0 float32 // impact parameter in r-phi 72 Phi float32 // phi of track in r-phi 73 Omega float32 // curvature signed with charge 74 Z0 float32 // impact parameter in r-z 75 TanL float32 // tangent of dip angle in r-z 76 Cov [15]float32 // covariance matrix 77 Ref [3]float32 // reference point (x,y,z) 78 } 79 80 func (trks *TrackContainer) String() string { 81 o := new(strings.Builder) 82 fmt.Fprintf(o, "%[1]s print out of Track collection %[1]s\n\n", strings.Repeat("-", 15)) 83 fmt.Fprintf(o, " flag: 0x%x\n%v", trks.Flags, trks.Params) 84 fmt.Fprintf(o, " LCIO::TRBIT_HITS : %v\n", trks.Flags.Test(BitsClHits)) 85 86 fmt.Fprintf(o, "\n") 87 88 const ( 89 head = " [ id ] | type | d0 | phi | omega | z0 | tan lambda| reference point(x,y,z) | dEdx | dEdxErr | chi2 | ndf \n" 90 tail = "------------|----------|----------|----------|----------|-----------|-----------|---------------------------------|----------|----------|-------- \n" 91 ) 92 o.WriteString(head) 93 o.WriteString(tail) 94 for i := range trks.Tracks { 95 trk := &trks.Tracks[i] 96 var ref [3]float32 97 if len(trk.States) > 0 { 98 ref = trk.States[0].Ref 99 } 100 fmt.Fprintf(o, 101 "[%09d] | %08d |%+.2e |%+.2e |%+.2e |%+.3e |%+.3e |(%+.2e, %+.2e, %+.2e)|%+.2e |%+.2e |%+.2e |%5d\n", 102 ID(trk), 103 trk.Type, trk.D0(), trk.Phi(), trk.Omega(), trk.Z0(), trk.TanL(), 104 ref[0], ref[1], ref[2], 105 trk.DEdx, trk.DEdxErr, trk.Chi2, trk.NdF, 106 ) 107 } 108 109 return o.String() 110 } 111 112 func (*TrackContainer) VersionSio() uint32 { 113 return Version 114 } 115 116 func (trks *TrackContainer) MarshalSio(w sio.Writer) error { 117 enc := sio.NewEncoder(w) 118 enc.Encode(&trks.Flags) 119 enc.Encode(&trks.Params) 120 enc.Encode(int32(len(trks.Tracks))) 121 for i := range trks.Tracks { 122 trk := &trks.Tracks[i] 123 enc.Encode(&trk.Type) 124 enc.Encode(int32(len(trk.States))) 125 for i := range trk.States { 126 state := &trk.States[i] 127 enc.Encode(&state.Loc) 128 enc.Encode(&state.D0) 129 enc.Encode(&state.Phi) 130 enc.Encode(&state.Omega) 131 enc.Encode(&state.Z0) 132 enc.Encode(&state.TanL) 133 enc.Encode(&state.Cov) 134 enc.Encode(&state.Ref) 135 } 136 enc.Encode(&trk.Chi2) 137 enc.Encode(&trk.NdF) 138 enc.Encode(&trk.DEdx) 139 enc.Encode(&trk.DEdxErr) 140 enc.Encode(&trk.Radius) 141 enc.Encode(&trk.SubDetHits) 142 143 enc.Encode(int32(len(trk.Tracks))) 144 for i := range trk.Tracks { 145 enc.Pointer(&trk.Tracks[i]) 146 } 147 148 if trks.Flags.Test(BitsTrHits) { 149 enc.Encode(int32(len(trk.Hits))) 150 for i := range trk.Hits { 151 enc.Pointer(&trk.Hits[i]) 152 } 153 } 154 enc.Tag(trk) 155 } 156 return enc.Err() 157 } 158 159 func (trks *TrackContainer) UnmarshalSio(r sio.Reader) error { 160 dec := sio.NewDecoder(r) 161 dec.Decode(&trks.Flags) 162 dec.Decode(&trks.Params) 163 var n int32 164 dec.Decode(&n) 165 trks.Tracks = make([]Track, int(n)) 166 for i := range trks.Tracks { 167 trk := &trks.Tracks[i] 168 dec.Decode(&trk.Type) 169 var n int32 = 1 // set to 1 by default for bwd compat 170 if r.VersionSio() >= 2000 { 171 dec.Decode(&n) 172 } 173 trk.States = make([]TrackState, int(n)) 174 for i := range trk.States { 175 state := &trk.States[i] 176 if r.VersionSio() >= 2000 { 177 dec.Decode(&state.Loc) 178 } 179 dec.Decode(&state.D0) 180 dec.Decode(&state.Phi) 181 dec.Decode(&state.Omega) 182 dec.Decode(&state.Z0) 183 dec.Decode(&state.TanL) 184 dec.Decode(&state.Cov) 185 dec.Decode(&state.Ref) 186 } 187 dec.Decode(&trk.Chi2) 188 dec.Decode(&trk.NdF) 189 dec.Decode(&trk.DEdx) 190 dec.Decode(&trk.DEdxErr) 191 dec.Decode(&trk.Radius) 192 dec.Decode(&trk.SubDetHits) 193 194 dec.Decode(&n) 195 trk.Tracks = make([]*Track, int(n)) 196 for i := range trk.Tracks { 197 dec.Pointer(&trk.Tracks[i]) 198 } 199 200 if trks.Flags.Test(BitsTrHits) { 201 dec.Decode(&n) 202 trk.Hits = make([]*TrackerHit, int(n)) 203 for i := range trk.Hits { 204 dec.Pointer(&trk.Hits[i]) 205 } 206 } 207 dec.Tag(trk) 208 } 209 return dec.Err() 210 } 211 212 var ( 213 _ sio.Versioner = (*TrackContainer)(nil) 214 _ sio.Codec = (*TrackContainer)(nil) 215 )