Skip to content

Commit 7da3793

Browse files
committed
Merge branch 'dev' into onnx_gpu_implementation
2 parents 1dcb1da + e562336 commit 7da3793

File tree

109 files changed

+1621
-2524
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+1621
-2524
lines changed

.github/workflows/clean-test.yml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ name: Clean PR checks
1919
# Warning: the check_* keys are magic and must consist of the string
2020
# "check_" followed by the applicable check name exactly. The
2121
# "description" field is only the human-readable label for the input.
22-
'check_build/O2/o2':
23-
description: build/O2/o2
24-
type: boolean
25-
default: true
2622
'check_build/AliceO2/O2/o2/macOS':
2723
description: build/AliceO2/O2/o2/macOS
2824
type: boolean
@@ -31,14 +27,10 @@ name: Clean PR checks
3127
description: build/AliceO2/O2/o2/macOS-arm
3228
type: boolean
3329
default: true
34-
'check_build/O2/fullCI':
30+
'check_build/O2/fullCI_slc9':
3531
description: build/O2/fullCI
3632
type: boolean
3733
default: true
38-
'check_build/O2/o2-cs8':
39-
description: build/O2/o2-cs8
40-
type: boolean
41-
default: true
4234
'check_build/O2/o2-dataflow-cs8':
4335
description: build/O2/o2-dataflow-cs8
4436
type: boolean

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+
kTimeVertex };
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), mTriggers(digitTriggers)
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(kTimeVertex); }
129+
void setVertex(short vertex) { mCollisionTime[kTimeVertex] = vertex; }
87130

88131
o2::fit::Triggers getTrigger() const { return mTriggers; }
89132
void setTriggers(o2::fit::Triggers trig) { mTriggers = trig; }
133+
uint8_t getTechnicalWord() const { return mTechnicalWord; }
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+
}
90140

91141
o2::InteractionRecord getInteractionRecord() const { return mIntRecord; };
92-
93-
// void SetMgrEventTime(Double_t time) { mTimeStamp = time; }
94-
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 = o2::fit::Triggers::parseDigitTriggerWord(digitTriggerWord, true);
153+
mTriggers.setTriggers(trgAndTechWordPair.first | extraTrgWord);
154+
mTechnicalWord = 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: 10 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)
@@ -104,6 +110,10 @@ class Triggers
104110
timeA = atimeA;
105111
timeC = atimeC;
106112
}
113+
void setTriggers(uint8_t trgsig)
114+
{
115+
triggersignals = trgsig;
116+
}
107117

108118
void setTriggers(Bool_t isA, Bool_t isC, Bool_t isVrtx, Bool_t isCnt, Bool_t isSCnt, uint8_t chanA, uint8_t chanC, int32_t aamplA,
109119
int32_t aamplC, int16_t atimeA, int16_t atimeC, Bool_t isLaser, Bool_t isOutputsAreBlocked, Bool_t isDataValid)

Detectors/FIT/FT0/macros/FT0Misaligner.C

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,30 @@
1+
// Copyright 2021-2025 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
/// \file FT0Misaligner.C
13+
/// \brief ROOT macro for creating an FT0 geometry alignment object. Based on ITSMisaligner.C
14+
///
15+
/// \author Andreas Molander andreas.molander@cern.ch, Alla Maevskaya
16+
117
#if !defined(__CLING__) || defined(__ROOTCLING__)
2-
//#define ENABLE_UPGRADES
18+
19+
#include "CCDB/CcdbApi.h"
320
#include "DetectorsCommonDataFormats/DetID.h"
421
#include "DetectorsCommonDataFormats/DetectorNameConf.h"
522
#include "DetectorsCommonDataFormats/AlignParam.h"
6-
#include "DetectorsBase/GeometryManager.h"
7-
#include "CCDB/CcdbApi.h"
8-
#include "FT0Base/Geometry.h"
9-
#include <TRandom.h>
23+
1024
#include <TFile.h>
1125
#include <vector>
1226
#include <fmt/format.h>
27+
1328
#endif
1429

1530
using AlgPar = std::array<double, 6>;
@@ -23,19 +38,15 @@ void FT0Misaligner(const std::string& ccdbHost = "http://ccdb-test.cern.ch:8080"
2338
const std::string& fileName = "FT0Alignment.root")
2439
{
2540
std::vector<o2::detectors::AlignParam> params;
26-
o2::base::GeometryManager::loadGeometry("", false);
27-
// auto geom = o2::ft0::Geometry::Instance();
2841
AlgPar pars;
2942
bool glo = true;
3043

3144
o2::detectors::DetID detFT0("FT0");
3245

33-
// FT0 detector
34-
//set A side
3546
std::string symNameA = "FT0A";
3647
pars = generateMisalignment(xA, yA, zA, psiA, thetaA, phiA);
3748
params.emplace_back(symNameA.c_str(), -1, pars[0], pars[1], pars[2], pars[3], pars[4], pars[5], glo);
38-
//set C side
49+
3950
std::string symNameC = "FT0C";
4051
pars = generateMisalignment(xC, yC, zC, psiC, thetaC, phiC);
4152
params.emplace_back(symNameC.c_str(), -1, pars[0], pars[1], pars[2], pars[3], pars[4], pars[5], glo);
@@ -57,14 +68,15 @@ void FT0Misaligner(const std::string& ccdbHost = "http://ccdb-test.cern.ch:8080"
5768
algFile.Close();
5869
}
5970
}
71+
6072
AlgPar generateMisalignment(double x, double y, double z, double psi, double theta, double phi)
6173
{
6274
AlgPar pars;
63-
pars[0] = gRandom->Gaus(0, x);
64-
pars[1] = gRandom->Gaus(0, y);
65-
pars[2] = gRandom->Gaus(0, z);
66-
pars[3] = gRandom->Gaus(0, psi);
67-
pars[4] = gRandom->Gaus(0, theta);
68-
pars[5] = gRandom->Gaus(0, phi);
75+
pars[0] = x;
76+
pars[1] = y;
77+
pars[2] = z;
78+
pars[3] = psi;
79+
pars[4] = theta;
80+
pars[5] = phi;
6981
return std::move(pars);
7082
}

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 < -350 && channelData.CFDTime > -450;
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()

Detectors/FIT/FV0/base/include/FV0Base/Geometry.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,16 @@ class Geometry
133133
return o2::base::GeometryManager::getPNEntry(getDetID(), index);
134134
}
135135

136+
static std::string getDetectorRightSymName()
137+
{
138+
return sDetectorRightName + "_0";
139+
}
140+
141+
static std::string getDetectorLeftSymName()
142+
{
143+
return sDetectorLeftName + "_1";
144+
}
145+
136146
/// Get the density of the PMTs.
137147
static constexpr float getPmtDensity()
138148
{
@@ -143,6 +153,8 @@ class Geometry
143153
explicit Geometry(EGeoType initType);
144154

145155
inline static const std::string sDetectorName = "FV0";
156+
inline static const std::string sDetectorRightName = sDetectorName + "RIGHT";
157+
inline static const std::string sDetectorLeftName = sDetectorName + "LEFT";
146158

147159
// General geometry constants
148160
static constexpr float sEpsilon = 0.01; ///< Used to make one spatial dimension infinitesimally larger than other

0 commit comments

Comments
 (0)