Skip to content

Commit 1e61c36

Browse files
martenoledavidrohr
authored andcommitted
TRD tracker can use transformed trklts directly
- calibration can be added to TrackletTransformer - GPUTRDSpacePointInternal does not need fields for labels (is stored in separate array), covariance matrix (is calculated on-the-fly anyway since it depends on the track inclincation) and ID (tracklets and space points are kept in order now. for the sorting by HCId we fill an index array)
1 parent 9012f7a commit 1e61c36

14 files changed

+168
-120
lines changed

Detectors/TRD/workflow/include/TRDWorkflow/TRDGlobalTrackingSpec.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace trd
2828
class TRDGlobalTracking : public o2::framework::Task
2929
{
3030
public:
31-
TRDGlobalTracking(bool useMC) : mUseMC(useMC) {}
31+
TRDGlobalTracking(bool useMC, bool useTrkltTransf) : mUseMC(useMC), mUseTrackletTransform(useTrkltTransf) {}
3232
~TRDGlobalTracking() override = default;
3333
void init(o2::framework::InitContext& ic) final;
3434
void run(o2::framework::ProcessingContext& pc) final;
@@ -40,11 +40,12 @@ class TRDGlobalTracking : public o2::framework::Task
4040
o2::gpu::GPUChainTracking* mChainTracking{nullptr}; ///< TRD tracker is run in the tracking chain
4141
std::unique_ptr<GeometryFlat> mFlatGeo{nullptr}; ///< flat TRD geometry
4242
bool mUseMC{false}; ///< MC flag
43+
bool mUseTrackletTransform{false}; ///< if true, output from TrackletTransformer is used instead of uncalibrated Tracklet64 directly
4344
TStopwatch mTimer;
4445
};
4546

4647
/// create a processor spec
47-
framework::DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC);
48+
framework::DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, bool useTrkltTransf);
4849

4950
} // namespace trd
5051
} // namespace o2

Detectors/TRD/workflow/include/TRDWorkflow/TRDTrackingWorkflow.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace o2
2020
namespace trd
2121
{
2222

23-
framework::WorkflowSpec getTRDTrackingWorkflow(bool disableRootInp, bool disableRootOut);
23+
framework::WorkflowSpec getTRDTrackingWorkflow(bool disableRootInp, bool disableRootOut, bool useTrackletTransformer);
2424

2525
} // namespace trd
2626
} // namespace o2

Detectors/TRD/workflow/include/TRDWorkflow/TRDTrackletReaderSpec.h

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "Framework/DataProcessorSpec.h"
2020
#include "Framework/Task.h"
2121
#include "DataFormatsTRD/Tracklet64.h"
22+
#include "DataFormatsTRD/CalibratedTracklet.h"
2223
#include "DataFormatsTRD/TriggerRecord.h"
2324
#include "SimulationDataFormat/MCCompLabel.h"
2425

@@ -30,26 +31,31 @@ namespace trd
3031
class TRDTrackletReader : public o2::framework::Task
3132
{
3233
public:
33-
TRDTrackletReader(bool useMC) : mUseMC(useMC) {}
34+
TRDTrackletReader(bool useMC, bool useTrkltTransf) : mUseMC(useMC), mUseTrackletTransform(useTrkltTransf) {}
3435
~TRDTrackletReader() override = default;
3536
void init(o2::framework::InitContext& ic) final;
3637
void run(o2::framework::ProcessingContext& pc) final;
3738

3839
private:
39-
void connectTree(const std::string& filename);
40+
void connectTree();
41+
void connectTreeCTracklet();
4042
bool mUseMC{false};
41-
std::unique_ptr<TFile> mFile;
42-
std::unique_ptr<TTree> mTree;
43-
std::string mInFileName{"trdtracklets.root"};
44-
std::string mInTreeName{"o2sim"};
43+
bool mUseTrackletTransform{false};
44+
std::unique_ptr<TFile> mFileTrklt;
45+
std::unique_ptr<TTree> mTreeTrklt;
46+
std::unique_ptr<TFile> mFileCTrklt;
47+
std::unique_ptr<TTree> mTreeCTrklt;
48+
std::string mInFileNameTrklt{"trdtracklets.root"};
49+
std::string mInTreeNameTrklt{"o2sim"};
50+
std::vector<o2::trd::CalibratedTracklet> mTrackletsCal, *mTrackletsCalPtr = &mTrackletsCal;
4551
std::vector<o2::trd::Tracklet64> mTracklets, *mTrackletsPtr = &mTracklets;
4652
std::vector<o2::trd::TriggerRecord> mTriggerRecords, *mTriggerRecordsPtr = &mTriggerRecords;
4753
std::vector<o2::MCCompLabel> mLabels, *mLabelsPtr = &mLabels;
4854
};
4955

5056
/// create a processor spec
5157
/// read TRD tracklets from a root file
52-
framework::DataProcessorSpec getTRDTrackletReaderSpec(bool useMC);
58+
framework::DataProcessorSpec getTRDTrackletReaderSpec(bool useMC, bool useCalibratedTracklets);
5359

5460
} // namespace trd
5561
} // namespace o2

Detectors/TRD/workflow/src/TRDGlobalTrackingSpec.cxx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "DetectorsBase/Propagator.h"
2121
#include "ReconstructionDataFormats/TrackTPCITS.h"
2222
#include "DataFormatsTRD/Tracklet64.h"
23+
#include "DataFormatsTRD/CalibratedTracklet.h"
2324
#include "DataFormatsTRD/TriggerRecord.h"
2425

2526
// GPU header
@@ -43,6 +44,7 @@ namespace trd
4344

4445
void TRDGlobalTracking::init(InitContext& ic)
4546
{
47+
4648
//-------- init geometry and field --------//
4749
o2::base::GeometryManager::loadGeometry();
4850
o2::base::Propagator::initFieldFromGRP(o2::base::NameConf::getGRPFileName());
@@ -65,6 +67,7 @@ void TRDGlobalTracking::init(InitContext& ic)
6567
mTracker->SetNCandidates(mRec->GetProcessingSettings().trdNCandidates); // must be set before initialization
6668
mTracker->SetProcessPerTimeFrame();
6769
mTracker->SetNMaxCollisions(mRec->GetProcessingSettings().trdNMaxCollisions);
70+
mTracker->SetTrkltTransformNeeded(!mUseTrackletTransform);
6871

6972
mRec->RegisterGPUProcessor(mTracker, false);
7073
mChainTracking->SetTRDGeometry(std::move(mFlatGeo));
@@ -90,6 +93,21 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
9093
int nTracklets = trackletsTRD.size();
9194
LOGF(INFO, "There are %i tracklets in total from %i trigger records", nTracklets, nCollisions);
9295

96+
const gsl::span<const CalibratedTracklet>* cTrkltsPtr = nullptr;
97+
using cTrkltType = std::decay_t<decltype(pc.inputs().get<gsl::span<CalibratedTracklet>>(""))>;
98+
std::optional<cTrkltType> cTrklts;
99+
int nTrackletsCal = 0;
100+
101+
if (mUseTrackletTransform) {
102+
cTrklts.emplace(pc.inputs().get<gsl::span<CalibratedTracklet>>("trdctracklets")); // MC labels associated to the input digits
103+
cTrkltsPtr = &cTrklts.value();
104+
nTrackletsCal = cTrkltsPtr->size();
105+
LOGF(INFO, "Got %i calibrated tracklets as input", nTrackletsCal);
106+
if (nTracklets != nTrackletsCal) {
107+
LOGF(ERROR, "Number of calibrated tracklets (%i) differs from the number of uncalibrated tracklets (%i)", nTrackletsCal, nTracklets);
108+
}
109+
}
110+
93111
std::vector<float> trdTriggerTimes;
94112
std::vector<int> trdTriggerIndices;
95113

@@ -141,10 +159,13 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
141159
for (int iTrklt = 0; iTrklt < nTracklets; ++iTrklt) {
142160
auto trklt = trackletsTRD[iTrklt];
143161
GPUTRDTrackletWord trkltLoad(trklt.getTrackletWord());
144-
trkltLoad.SetId(iTrklt);
145162
if (mTracker->LoadTracklet(trkltLoad) > 0) {
146163
LOG(WARNING) << "Could not load tracklet " << iTrklt;
147164
}
165+
if (mUseTrackletTransform) {
166+
const CalibratedTracklet cTrklt = (cTrkltsPtr->data())[iTrklt];
167+
mTracker->SetInternalSpacePoint(iTrklt, cTrklt.getX(), cTrklt.getY(), cTrklt.getZ(), cTrklt.getDy());
168+
}
148169
}
149170
mTracker->SetTriggerRecordTimes(&(trdTriggerTimes[0]));
150171
mTracker->SetTriggerRecordIndices(&(trdTriggerIndices[0]));
@@ -166,11 +187,14 @@ void TRDGlobalTracking::endOfStream(EndOfStreamContext& ec)
166187
mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
167188
}
168189

169-
DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC)
190+
DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, bool useTrkltTransf)
170191
{
171192
std::vector<InputSpec> inputs;
172193
std::vector<OutputSpec> outputs;
173194
inputs.emplace_back("tpcitstrack", "GLO", "TPCITS", 0, Lifetime::Timeframe);
195+
if (useTrkltTransf) {
196+
inputs.emplace_back("trdctracklets", o2::header::gDataOriginTRD, "CTRACKLETS", 0, Lifetime::Timeframe);
197+
}
174198
inputs.emplace_back("trdtracklets", o2::header::gDataOriginTRD, "TRACKLETS", 0, Lifetime::Timeframe);
175199
inputs.emplace_back("trdtriggerrec", o2::header::gDataOriginTRD, "TRKTRGRD", 0, Lifetime::Timeframe);
176200

@@ -184,7 +208,7 @@ DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC)
184208
"trd-globaltracking",
185209
inputs,
186210
outputs,
187-
AlgorithmSpec{adaptFromTask<TRDGlobalTracking>(useMC)},
211+
AlgorithmSpec{adaptFromTask<TRDGlobalTracking>(useMC, useTrkltTransf)},
188212
Options{}};
189213
}
190214

Detectors/TRD/workflow/src/TRDTrackingWorkflow.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ namespace o2
2323
namespace trd
2424
{
2525

26-
framework::WorkflowSpec getTRDTrackingWorkflow(bool disableRootInp, bool disableRootOut)
26+
framework::WorkflowSpec getTRDTrackingWorkflow(bool disableRootInp, bool disableRootOut, bool useTrkltTransf)
2727
{
2828
framework::WorkflowSpec specs;
2929
bool useMC = false;
3030
if (!disableRootInp) {
3131
specs.emplace_back(o2::globaltracking::getTrackTPCITSReaderSpec(useMC));
32-
specs.emplace_back(o2::trd::getTRDTrackletReaderSpec(useMC));
32+
specs.emplace_back(o2::trd::getTRDTrackletReaderSpec(useMC, useTrkltTransf));
3333
}
3434

35-
specs.emplace_back(o2::trd::getTRDGlobalTrackingSpec(useMC));
35+
specs.emplace_back(o2::trd::getTRDGlobalTrackingSpec(useMC, useTrkltTransf));
3636

3737
if (!disableRootOut) {
3838
specs.emplace_back(o2::trd::getTRDTrackWriterSpec(useMC));

Detectors/TRD/workflow/src/TRDTrackletReaderSpec.cxx

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,49 +28,72 @@ void TRDTrackletReader::init(InitContext& ic)
2828
{
2929
// get the option from the init context
3030
LOG(INFO) << "Init TRD tracklet reader!";
31-
mInFileName = ic.options().get<std::string>("trd-tracklet-infile");
32-
mInTreeName = ic.options().get<std::string>("treename");
33-
connectTree(mInFileName);
31+
mInFileNameTrklt = ic.options().get<std::string>("trd-tracklet-infile");
32+
mInTreeNameTrklt = ic.options().get<std::string>("treename");
33+
connectTree();
34+
if (mUseTrackletTransform) {
35+
connectTreeCTracklet();
36+
}
37+
}
38+
39+
void TRDTrackletReader::connectTreeCTracklet()
40+
{
41+
mTreeCTrklt.reset(nullptr); // in case it was already loaded
42+
mFileCTrklt.reset(TFile::Open("trdcalibratedtracklets.root"));
43+
assert(mFileCTrklt && !mFileCTrklt->IsZombie());
44+
mTreeCTrklt.reset((TTree*)mFileCTrklt->Get("ctracklets"));
45+
assert(mTreeCTrklt);
46+
mTreeCTrklt->SetBranchAddress("CTracklets", &mTrackletsCalPtr);
47+
LOG(INFO) << "Loaded tree from trdcalibratedtracklets.root with " << mTreeCTrklt->GetEntries() << " entries";
3448
}
3549

36-
void TRDTrackletReader::connectTree(const std::string& filename)
50+
void TRDTrackletReader::connectTree()
3751
{
38-
mTree.reset(nullptr); // in case it was already loaded
39-
mFile.reset(TFile::Open(filename.c_str()));
40-
assert(mFile && !mFile->IsZombie());
41-
mTree.reset((TTree*)mFile->Get(mInTreeName.c_str()));
42-
assert(mTree);
43-
mTree->SetBranchAddress("Tracklet", &mTrackletsPtr);
44-
mTree->SetBranchAddress("TrackTrg", &mTriggerRecordsPtr);
52+
mTreeTrklt.reset(nullptr); // in case it was already loaded
53+
mFileTrklt.reset(TFile::Open(mInFileNameTrklt.c_str()));
54+
assert(mFileTrklt && !mFileTrklt->IsZombie());
55+
mTreeTrklt.reset((TTree*)mFileTrklt->Get(mInTreeNameTrklt.c_str()));
56+
assert(mTreeTrklt);
57+
mTreeTrklt->SetBranchAddress("Tracklet", &mTrackletsPtr);
58+
mTreeTrklt->SetBranchAddress("TrackTrg", &mTriggerRecordsPtr);
4559
if (mUseMC) {
4660
LOG(FATAL) << "MC information not yet included for TRD tracklets";
4761
}
48-
LOG(INFO) << "Loaded tree from " << filename << " with " << mTree->GetEntries() << " entries";
62+
LOG(INFO) << "Loaded tree from " << mInFileNameTrklt << " with " << mTreeTrklt->GetEntries() << " entries";
4963
}
5064

5165
void TRDTrackletReader::run(ProcessingContext& pc)
5266
{
53-
auto currEntry = mTree->GetReadEntry() + 1;
54-
assert(currEntry < mTree->GetEntries()); // this should not happen
55-
mTree->GetEntry(currEntry);
67+
auto currEntry = mTreeTrklt->GetReadEntry() + 1;
68+
assert(currEntry < mTreeTrklt->GetEntries()); // this should not happen
69+
mTreeTrklt->GetEntry(currEntry);
5670
LOG(INFO) << "Pushing " << mTriggerRecords.size() << " TRD trigger records at entry " << currEntry;
57-
LOG(INFO) << "Pushing " << mTracklets.size() << " TRD tracklets for these trigger records";
58-
71+
LOG(INFO) << "Pushing " << mTracklets.size() << " uncalibrated TRD tracklets for these trigger records";
5972
pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "TRACKLETS", 0, Lifetime::Timeframe}, mTracklets);
73+
if (mUseTrackletTransform) {
74+
assert(mTreeTrklt->GetEntries() == mTreeCTrklt->GetEntries());
75+
mTreeCTrklt->GetEntry(currEntry);
76+
LOG(INFO) << "Pushing " << mTrackletsCal.size() << " calibrated TRD tracklets for these trigger records";
77+
pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "CTRACKLETS", 0, Lifetime::Timeframe}, mTrackletsCal);
78+
}
79+
6080
pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "TRKTRGRD", 0, Lifetime::Timeframe}, mTriggerRecords);
6181
if (mUseMC) {
6282
LOG(FATAL) << "MC information not yet included for TRD tracklets";
6383
}
6484

65-
if (mTree->GetReadEntry() + 1 >= mTree->GetEntries()) {
85+
if (mTreeTrklt->GetReadEntry() + 1 >= mTreeTrklt->GetEntries()) {
6686
pc.services().get<ControlService>().endOfStream();
6787
pc.services().get<ControlService>().readyToQuit(QuitRequest::Me);
6888
}
6989
}
7090

71-
DataProcessorSpec getTRDTrackletReaderSpec(bool useMC)
91+
DataProcessorSpec getTRDTrackletReaderSpec(bool useMC, bool useCalibratedTracklets)
7292
{
7393
std::vector<OutputSpec> outputs;
94+
if (useCalibratedTracklets) {
95+
outputs.emplace_back(o2::header::gDataOriginTRD, "CTRACKLETS", 0, Lifetime::Timeframe);
96+
}
7497
outputs.emplace_back(o2::header::gDataOriginTRD, "TRACKLETS", 0, Lifetime::Timeframe);
7598
outputs.emplace_back(o2::header::gDataOriginTRD, "TRKTRGRD", 0, Lifetime::Timeframe);
7699
if (useMC) {
@@ -81,7 +104,7 @@ DataProcessorSpec getTRDTrackletReaderSpec(bool useMC)
81104
"TRDTrackletReader",
82105
Inputs{},
83106
outputs,
84-
AlgorithmSpec{adaptFromTask<TRDTrackletReader>(useMC)},
107+
AlgorithmSpec{adaptFromTask<TRDTrackletReader>(useMC, useCalibratedTracklets)},
85108
Options{
86109
{"trd-tracklet-infile", VariantType::String, "trdtracklets.root", {"Name of the input file"}},
87110
{"treename", VariantType::String, "o2sim", {"Name of top-level TTree"}},

Detectors/TRD/workflow/src/TRDTrackletTransformerWorkflow.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext)
3535
WorkflowSpec spec;
3636

3737
if (rootIn) {
38-
spec.emplace_back(o2::trd::getTRDTrackletReaderSpec(0));
38+
spec.emplace_back(o2::trd::getTRDTrackletReaderSpec(false, false));
3939
}
4040

4141
spec.emplace_back(o2::trd::getTRDTrackletTransformerSpec());

Detectors/TRD/workflow/src/trd-tracking-workflow.cxx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ using namespace o2::framework;
2020
void customize(std::vector<o2::framework::ConfigParamSpec>& workflowOptions)
2121
{
2222
// option allowing to set parameters
23+
workflowOptions.push_back(ConfigParamSpec{"disable-mc", o2::framework::VariantType::Bool, false, {"Disable MC labels"}});
24+
workflowOptions.push_back(ConfigParamSpec{"use-tracklet-transformer", VariantType::Bool, false, {"Use calibrated tracklets instead raw Tracklet64"}});
2325
workflowOptions.push_back(ConfigParamSpec{
2426
"disable-root-input", o2::framework::VariantType::Bool, false, {"disable root-files input readers"}});
2527
workflowOptions.push_back(ConfigParamSpec{
@@ -40,5 +42,6 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext)
4042
o2::conf::ConfigurableParam::writeINI("o2trdtracking-workflow_configuration.ini");
4143
auto disableRootInp = configcontext.options().get<bool>("disable-root-input");
4244
auto disableRootOut = configcontext.options().get<bool>("disable-root-output");
43-
return std::move(o2::trd::getTRDTrackingWorkflow(disableRootInp, disableRootOut));
45+
auto useTrackletTransformer = configcontext.options().get<bool>("use-tracklet-transformer");
46+
return std::move(o2::trd::getTRDTrackingWorkflow(disableRootInp, disableRootOut, useTrackletTransformer));
4447
}

0 commit comments

Comments
 (0)