-
Notifications
You must be signed in to change notification settings - Fork 35
/
rawcalohit.go
115 lines (103 loc) · 3.1 KB
/
rawcalohit.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Copyright ©2017 The go-hep Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package lcio
import (
"fmt"
"strings"
"go-hep.org/x/hep/sio"
)
// RawCalorimeterHitContainer is a collection of raw calorimeter hits.
type RawCalorimeterHitContainer struct {
Flags Flags
Params Params
Hits []RawCalorimeterHit
}
func (hits RawCalorimeterHitContainer) String() string {
o := new(strings.Builder)
fmt.Fprintf(o, "%[1]s print out of RawCalorimeterHit collection %[1]s\n\n", strings.Repeat("-", 15))
fmt.Fprintf(o, " flag: 0x%x\n%v", hits.Flags, hits.Params)
fmt.Fprintf(o, " LCIO::RCHBIT_ID1 : %v\n", hits.Flags.Test(BitsRChID1))
fmt.Fprintf(o, " LCIO::RCHBIT_TIME : %v\n", hits.Flags.Test(BitsRChTime))
fmt.Fprintf(o, " LCIO::RCHBIT_NO_PTR : %v\n", hits.Flags.Test(BitsRChNoPtr))
fmt.Fprintf(o, "\n")
dec := NewCellIDDecoderFrom(hits.Params)
const (
head = " [ id ] | cellId0 ( M, S, I, J, K) |cellId1 | amplitude | time \n"
tail = "------------|---------------------------|--------|-----------|---------\n"
)
o.WriteString(head)
o.WriteString(tail)
for i := range hits.Hits {
hit := &hits.Hits[i]
fmt.Fprintf(o, "[%09d] |%08d%19s|%08d|%10d |%8d\n", ID(hit), hit.CellID0, "", hit.CellID1, hit.Amplitude, hit.TimeStamp)
if dec != nil {
fmt.Fprintf(o, " id-fields: (%s)", dec.ValueString(hit))
} else {
fmt.Fprintf(o, " id-fields: --- unknown/default ---- ")
}
fmt.Fprintf(o, "\n")
}
o.WriteString(tail)
return o.String()
}
func (*RawCalorimeterHitContainer) VersionSio() uint32 {
return Version
}
func (hits *RawCalorimeterHitContainer) MarshalSio(w sio.Writer) error {
enc := sio.NewEncoder(w)
enc.Encode(&hits.Flags)
enc.Encode(&hits.Params)
enc.Encode(int32(len(hits.Hits)))
for i := range hits.Hits {
hit := &hits.Hits[i]
enc.Encode(&hit.CellID0)
if hits.Flags.Test(BitsRChID1) {
enc.Encode(&hit.CellID1)
}
enc.Encode(&hit.Amplitude)
if hits.Flags.Test(BitsRChTime) {
enc.Encode(&hit.TimeStamp)
}
if !hits.Flags.Test(BitsRChNoPtr) {
enc.Tag(hit)
}
}
return enc.Err()
}
func (hits *RawCalorimeterHitContainer) UnmarshalSio(r sio.Reader) error {
dec := sio.NewDecoder(r)
dec.Decode(&hits.Flags)
dec.Decode(&hits.Params)
var n int32
dec.Decode(&n)
hits.Hits = make([]RawCalorimeterHit, int(n))
for i := range hits.Hits {
hit := &hits.Hits[i]
dec.Decode(&hit.CellID0)
if r.VersionSio() == 8 || hits.Flags.Test(BitsRChID1) {
dec.Decode(&hit.CellID1)
}
dec.Decode(&hit.Amplitude)
if hits.Flags.Test(BitsRChTime) {
dec.Decode(&hit.TimeStamp)
}
if !hits.Flags.Test(BitsRChNoPtr) {
dec.Tag(hit)
}
}
return dec.Err()
}
type RawCalorimeterHit struct {
CellID0 int32
CellID1 int32
Amplitude int32
TimeStamp int32
}
func (hit *RawCalorimeterHit) GetCellID0() int32 { return hit.CellID0 }
func (hit *RawCalorimeterHit) GetCellID1() int32 { return hit.CellID1 }
var (
_ sio.Versioner = (*RawCalorimeterHitContainer)(nil)
_ sio.Codec = (*RawCalorimeterHitContainer)(nil)
_ Hit = (*RawCalorimeterHit)(nil)
)