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  )