2424#include " Rtypes.h"
2525#include < TObject.h>
2626#include < gsl/span>
27-
27+ #include < string>
28+ #include < utility>
29+ #include < map>
2830namespace o2
2931{
3032namespace ft0
3133{
3234
3335struct ChannelDataFloat {
3436
35- int ChId = -1 ; // channel Id
36- int ChainQTC = -1 ; // QTC chain
37- float CFDTime = -20000 ; // time in ps, 0 at the LHC clk center
38- float QTCAmpl = -20000 ; // Amplitude mV
37+ int ChId = -1 ; // channel Id
38+ int ChainQTC = -1 ; // QTC chain
39+ float CFDTime = -20000 ; // time in ps, 0 at the LHC clk center
40+ float QTCAmpl = -20000 ; // Amplitude mV
3941
4042 ChannelDataFloat () = default ;
4143 ChannelDataFloat (int iPmt, float time, float charge, int chainQTC)
@@ -56,10 +58,39 @@ class RecPoints
5658{
5759
5860 public:
59- enum : int { TimeMean,
60- TimeA,
61- TimeC,
62- Vertex };
61+ enum ETimeType { kTimeMean ,
62+ kTimeA ,
63+ kTimeC ,
64+ kVertex };
65+
66+ // Enum for trigger nits specified in rec-points and AOD data
67+ enum ETriggerBits { kOrA = 0 , // OrA time-trigger signal
68+ kOrC = 1 , // OrC time-trigger signal
69+ kSemiCentral = 2 , // Semi-central amplitude-trigger signal
70+ kCentral = 3 , // Central amplitude-trigger signal
71+ kVertex = 4 , // Vertex time-trigger signal
72+ kIsActiveSideA = 5 , // Side-A has at least one channel active
73+ kIsActiveSideC = 6 , // Side-C has at least one channel active
74+ kIsFlangeEvent = 7 // Flange event at Side-C, at least one channel has time which corresponds to -82 cm area
75+ };
76+ static const inline std::map<unsigned int , std::string> sMapTriggerBits = {
77+ {ETriggerBits::kOrA , " OrA" },
78+ {ETriggerBits::kOrC , " OrC" },
79+ {ETriggerBits::kSemiCentral , " Semicentral" },
80+ {ETriggerBits::kCentral , " Central" },
81+ {ETriggerBits::kVertex , " Vertex" },
82+ {ETriggerBits::kIsActiveSideA , " IsActiveSideA" },
83+ {ETriggerBits::kIsActiveSideC , " IsActiveSideC" },
84+ {ETriggerBits::kIsFlangeEvent , " IsFlangeEvent" }};
85+
86+ enum ETechnicalBits { kLaser = 0 , // indicates the laser was triggered in this BC
87+ kOutputsAreBlocked = 1 , // indicates that laser-induced pulses should arrive from detector to FEE in this BC (and trigger outputs are blocked)
88+ kDataIsValid = 2 , // data is valid for processing
89+ };
90+ static const inline std::map<unsigned int , std::string> sMapTechnicalBits = {
91+ {ETechnicalBits::kLaser , " Laser" },
92+ {ETechnicalBits::kOutputsAreBlocked , " OutputsAreBlocked" },
93+ {ETechnicalBits::kDataIsValid , " DataIsValid" }};
6394
6495 o2::dataformats::RangeReference<int , int > ref;
6596 o2::InteractionRecord mIntRecord ; // Interaction record (orbit, bc)
@@ -73,39 +104,63 @@ class RecPoints
73104 mIntRecord = iRec;
74105 mTriggers = chTrig;
75106 }
107+ RecPoints (int chDataFirstEntryPos,
108+ int chDataNEntries,
109+ const o2::InteractionRecord& ir,
110+ const std::array<short , 4 >& arrTimes,
111+ const o2::fit::Triggers& digitTriggers,
112+ uint8_t extraTriggerWord) : mIntRecord (ir), mCollisionTime (arrTimes)
113+ {
114+ ref.setFirstEntry (chDataFirstEntryPos);
115+ ref.setEntries (chDataNEntries);
116+ initRecPointTriggers (digitTriggers, extraTriggerWord);
117+ }
118+
76119 ~RecPoints () = default ;
77120
78121 short getCollisionTime (int side) const { return mCollisionTime [side]; }
79- short getCollisionTimeMean () const { return getCollisionTime (TimeMean ); }
80- short getCollisionTimeA () const { return getCollisionTime (TimeA ); }
81- short getCollisionTimeC () const { return getCollisionTime (TimeC ); }
122+ short getCollisionTimeMean () const { return getCollisionTime (kTimeMean ); }
123+ short getCollisionTimeA () const { return getCollisionTime (kTimeA ); }
124+ short getCollisionTimeC () const { return getCollisionTime (kTimeC ); }
82125 bool isValidTime (int side) const { return getCollisionTime (side) < o2::InteractionRecord::DummyTime; }
83126 void setCollisionTime (short time, int side) { mCollisionTime [side] = time; }
84127
85- short getVertex () const { return getCollisionTime (Vertex ); }
86- void setVertex (short vertex) { mCollisionTime [Vertex ] = vertex; }
128+ short getVertex () const { return getCollisionTime (kVertex ); }
129+ void setVertex (short vertex) { mCollisionTime [kVertex ] = vertex; }
87130
88131 o2::fit::Triggers getTrigger () const { return mTriggers ; }
89132 void setTriggers (o2::fit::Triggers trig) { mTriggers = trig; }
90133
91- o2::InteractionRecord getInteractionRecord () const { return mIntRecord ; };
92-
93- // void SetMgrEventTime(Double_t time) { mTimeStamp = time; }
134+ static constexpr uint8_t makeExtraTrgWord (bool isActiveA = true , bool isActiveC = true , bool isFlangeEvent = true )
135+ {
136+ return (static_cast <uint8_t >(isActiveA) << kIsActiveSideA ) |
137+ (static_cast <uint8_t >(isActiveC) << kIsActiveSideC ) |
138+ (static_cast <uint8_t >(isFlangeEvent) << kIsFlangeEvent );
139+ }
94140
141+ o2::InteractionRecord getInteractionRecord () const { return mIntRecord ; };
95142 gsl::span<const ChannelDataFloat> getBunchChannelData (const gsl::span<const ChannelDataFloat> tfdata) const ;
96143 short static constexpr sDummyCollissionTime = 32767 ;
97144
98145 void print () const ;
99146 bool operator ==(const RecPoints&) const = default ;
100147
101148 private:
149+ void initRecPointTriggers (const o2::fit::Triggers& digitTriggers, uint8_t extraTrgWord = 0 )
150+ {
151+ const auto digitTriggerWord = digitTriggers.getTriggersignals ();
152+ const auto trgAndTechWordPair = parseDigitTriggerWord (digitTriggerWord, true );
153+ mTriggers .setTriggers (trgAndTechWordPair.first | extraTrgWord);
154+ mTechWord = trgAndTechWordPair.second ;
155+ }
156+
102157 std::array<short , 4 > mCollisionTime = {sDummyCollissionTime ,
103158 sDummyCollissionTime ,
104159 sDummyCollissionTime ,
105160 sDummyCollissionTime };
106161 o2::fit::Triggers mTriggers ; // pattern of triggers in this BC
107-
108- ClassDefNV (RecPoints, 3 );
162+ uint8_t mTechnicalWord { 0 }; // field for keeping ETechnicalBits
163+ ClassDefNV (RecPoints, 4 );
109164};
110165} // namespace ft0
111166} // namespace o2
0 commit comments