Skip to content

Commit 093695e

Browse files
author
afurs
committed
[AFIT-112]: FT0's reco update, 3 new event bits
1 parent 3f679a6 commit 093695e

File tree

3 files changed

+97
-23
lines changed

3 files changed

+97
-23
lines changed

DataFormats/Detectors/FIT/FT0/include/DataFormatsFT0/RecPoints.h

Lines changed: 74 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,20 @@
2424
#include "Rtypes.h"
2525
#include <TObject.h>
2626
#include <gsl/span>
27-
27+
#include <string>
28+
#include <utility>
29+
#include <map>
2830
namespace o2
2931
{
3032
namespace ft0
3133
{
3234

3335
struct 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

DataFormats/Detectors/FIT/common/include/DataFormatsFIT/Triggers.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ class Triggers
7070
{
7171
return trgWord | (static_cast<uint64_t>(checkMinBiasFT0(trgWord)) << bitMinBias);
7272
}
73+
static constexpr std::pair<uint8_t, uint8_t> parseDigitTriggerWord(uint8_t digitWord, bool shiftTechBitsToBegin = false)
74+
{
75+
const uint8_t techWordMask = word(bitLaser, bitOutputsAreBlocked, bitDataIsValid);
76+
const uint8_t shiftTechWordPos = shiftTechBitsToBegin ? bitLaser : 0;
77+
return {(digitWord & (~techWordMask)), (digitWord & techWordMask) >> shiftTechWordPos};
78+
}
7379

7480
bool getOrA() const { return (triggersignals & (1 << bitA)) != 0; }
7581
bool getOrC() const { return (triggersignals & (1 << bitC)) != 0; } // only used by FT0/FDD (same bit as OrAOut in FV0)

Detectors/FIT/FT0/reconstruction/src/CollisionTimeRecoTask.cxx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ RP CollisionTimeRecoTask::processDigit(const o2::ft0::Digit& digit,
5858
constexpr int nMCPsA = 4 * Geometry::NCellsA;
5959

6060
int nch{0};
61+
bool isActiveA = false;
62+
bool isActiveC = false;
63+
bool isFlangeEvent = false;
64+
6165
for (const auto& channelData : inChData) {
6266
if (channelData.ChId >= NCHANNELS) {
6367
// Reference channels shouldn't participate in reco at all!
@@ -68,15 +72,23 @@ RP CollisionTimeRecoTask::processDigit(const o2::ft0::Digit& digit,
6872
outChData.emplace_back(channelData.ChId, timeInPS, (float)channelData.QTCAmpl, channelData.ChainQTC);
6973
nch++;
7074
}
75+
const bool isOkForTimeCalc = TimeFilterParam::Instance().checkAll(channelData);
7176
// only signals which satisfy conditions may participate in time calculation
72-
if (TimeFilterParam::Instance().checkAll(channelData)) {
73-
if (channelData.ChId < nMCPsA) {
77+
if (channelData.ChId < nMCPsA) {
78+
// A-side
79+
if (isOkForTimeCalc) {
7480
sideAtime += timeInPS;
7581
ndigitsA++;
76-
} else {
82+
}
83+
isActiveA = true;
84+
} else {
85+
// C-side
86+
if (isOkForTimeCalc) {
7787
sideCtime += timeInPS;
7888
ndigitsC++;
7989
}
90+
isActiveC = true;
91+
isFlangeEvent |= channelData.CFDTime > -450 && channelData.CFDTime < -350;
8092
}
8193
}
8294
std::array<short, 4> mCollisionTime = {RP::sDummyCollissionTime, RP::sDummyCollissionTime, RP::sDummyCollissionTime, RP::sDummyCollissionTime};
@@ -90,7 +102,8 @@ RP CollisionTimeRecoTask::processDigit(const o2::ft0::Digit& digit,
90102
} else {
91103
mCollisionTime[TimeMean] = std::min(mCollisionTime[TimeA], mCollisionTime[TimeC]);
92104
}
93-
return RecPoints{mCollisionTime, firstEntry, nch, digit.mIntRecord, digit.mTriggers};
105+
const uint8_t extraTrgWord = RecPoints::makeExtraTrgWord(isActiveA, isActiveC, isFlangeEvent);
106+
return RecPoints(firstEntry, nch, digit.mIntRecord, mCollisionTime, digit.mTriggers, extraTrgWord);
94107
}
95108
//______________________________________________________
96109
void CollisionTimeRecoTask::FinishTask()

0 commit comments

Comments
 (0)