Project
Loading...
Searching...
No Matches
TRDGlobalTrackingQCSpec.h
Go to the documentation of this file.
1// Copyright 2019-2020 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#ifndef O2_TRD_GLOBALTRACKINGQCSPEC_H
13#define O2_TRD_GLOBALTRACKINGQCSPEC_H
14
18
19// input TRD tracks, TRD tracklets, TRD calibrated tracklets, ITS-TPC tracks, TPC tracks
20// output QC histograms
21
22#include "Headers/DataHeader.h"
24#include "Framework/Task.h"
35#include "TRDQC/Tracking.h"
36#include <cstring>
37
39
40using namespace o2::framework;
41using namespace o2::globaltracking;
43
44namespace o2
45{
46namespace trd
47{
48
50{
51 public:
52 TRDGlobalTrackingQC(std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, bool tpcAvailable, o2::dataformats::GlobalTrackID::mask_t src) : mDataRequest(dr), mGGCCDBRequest(gr), mTPCavailable(tpcAvailable), mTrkMask(src) {}
53 ~TRDGlobalTrackingQC() override = default;
54 void init(InitContext& ic) final
55 {
57 if (!mTPCavailable) {
58 mQC.disablePID();
59 }
60 if (getenv("ALIEN_JDL_LPMPRODUCTIONTYPE") && std::strcmp(getenv("ALIEN_JDL_LPMPRODUCTIONTYPE"), "MC") == 0) {
61 // apply artificial pad shift in case non-ideal alignment is used to compensate for shift in current alignment from real data
62 mQC.setApplyShift(false);
63 }
64 }
65 void run(ProcessingContext& pc) final
66 {
67 RecoContainer recoData;
68 recoData.collectData(pc, *mDataRequest.get());
69 updateTimeDependentParams(pc); // Make sure this is called after recoData.collectData, which may load some conditions
70 mQC.reset();
71 mQC.setInput(recoData);
72 std::vector<int> triggeredBCFT0;
73 if (mTrkMask[GTrackID::FT0]) { // pile-up tagging was requested
74 auto ft0recPoints = recoData.getFT0RecPoints();
75 uint32_t firstOrbit = 0;
76 for (size_t ft0id = 0; ft0id < ft0recPoints.size(); ft0id++) {
77 const auto& f0rec = ft0recPoints[ft0id];
78 if (ft0id == 0) {
79 firstOrbit = f0rec.getInteractionRecord().orbit;
80 mQC.setFirstOrbit(firstOrbit);
81 }
82 if (o2::ft0::InteractionTag::Instance().isSelected(f0rec)) {
83 triggeredBCFT0.push_back(f0rec.getInteractionRecord().differenceInBC({0, firstOrbit}));
84 }
85 }
86 }
87 mQC.setTriggeredBCFT0(triggeredBCFT0);
88 mQC.run();
89 pc.outputs().snapshot(Output{"TRD", "TRACKINGQC", 0}, mQC.getTrackQC());
90 }
92 void finaliseCCDB(framework::ConcreteDataMatcher& matcher, void* obj) final
93 {
95 return;
96 }
97 }
98
99 private:
100 void updateTimeDependentParams(framework::ProcessingContext& pc)
101 {
103 static bool initOnceDone = false;
104 if (!initOnceDone) { // these params need to be queried only once
105 initOnceDone = true;
106
107 mQC.init();
108
109 // Local pad gain calibration from krypton run
110 auto localGain = *(pc.inputs().get<o2::trd::LocalGainFactor*>("localgainfactors"));
111 mQC.setLocalGainFactors(localGain);
112 }
113 }
114
116 std::shared_ptr<DataRequest> mDataRequest;
117 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
118 bool mTPCavailable{false};
119 Tracking mQC;
120};
121
123{
124 std::vector<OutputSpec> outputs;
125 outputs.emplace_back("TRD", "TRACKINGQC", 0, Lifetime::Timeframe);
126 auto dataRequest = std::make_shared<DataRequest>();
127 bool isTPCavailable = false;
128
129 if (GTrackID::includesSource(GTrackID::Source::ITSTPC, src)) {
130 LOGF(debug, "Found ITS-TPC tracks as input, loading ITS-TPC-TRD");
131 src |= GTrackID::getSourcesMask("ITS-TPC-TRD");
132 }
133 if (GTrackID::includesSource(GTrackID::Source::TPC, src)) {
134 LOGF(debug, "Found TPC tracks as input, loading TPC-TRD");
135 src |= GTrackID::getSourcesMask("TPC-TRD");
136 isTPCavailable = true;
137 }
138 GTrackID::mask_t srcClu = GTrackID::getSourcesMask("TRD"); // we don't need all clusters, only TRD tracklets
139
140 dataRequest->requestTracks(src, false);
141 dataRequest->requestClusters(srcClu, false);
142 dataRequest->inputs.emplace_back("localgainfactors", "TRD", "LOCALGAINFACTORS", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/LocalGainFactor"));
143 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
144 false, // GRPECS=true
145 false, // GRPLHCIF
146 true, // GRPMagField
147 true, // askMatLUT
149 dataRequest->inputs,
150 true);
151 return DataProcessorSpec{
152 "trd-tracking-qc",
153 dataRequest->inputs,
154 outputs,
155 AlgorithmSpec{adaptFromTask<TRDGlobalTrackingQC>(dataRequest, ggRequest, isTPCavailable, src)},
156 Options{}};
157}
158
159template <typename T>
161
163{
164 return framework::MakeRootTreeWriterSpec("trd-tracking-qc-writer",
165 "trdQC.root",
166 "qc",
167 BranchDefinition<std::vector<TrackQC>>{InputSpec{"trackingqc", "TRD", "TRACKINGQC"}, "trackQC"})();
168};
169
170} // namespace trd
171} // namespace o2
172
173#endif // O2_TRD_GLOBALTRACKINGQCSPEC_H
Wrapper container for different reconstructed object types.
Definition of the GeometryManager class.
std::ostringstream debug
Definition of the FIT RecPoints class.
Helper for geometry and GRP related CCDB requests.
Header of the General Run Parameters object.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Configurable generator for RootTreeWriter processor spec.
Check the performance of the TRD in global tracking.
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
static mask_t getSourcesMask(const std::string_view srcList)
decltype(auto) get(R binding, int part=0) const
Generate a processor spec for the RootTreeWriter utility.
InputRecord & inputs()
The inputs associated with this processing context.
~TRDGlobalTrackingQC() override=default
TRDGlobalTrackingQC(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, bool tpcAvailable, o2::dataformats::GlobalTrackID::mask_t src)
void run(ProcessingContext &pc) final
void finaliseCCDB(framework::ConcreteDataMatcher &matcher, void *obj) final
void endOfStream(framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void init(InitContext &ic) final
void setInput(const o2::globaltracking::RecoContainer &input)
Initialize the input arrays.
Definition Tracking.cxx:32
void run()
Main processing function.
Definition Tracking.cxx:44
std::vector< TrackQC > & getTrackQC()
Definition Tracking.h:99
void disablePID()
Disable TPC dEdx information.
Definition Tracking.h:96
void setTriggeredBCFT0(std::vector< int > t)
Definition Tracking.h:108
void reset()
Reset the output vector.
Definition Tracking.h:90
void setLocalGainFactors(const o2::trd::LocalGainFactor &localGain)
Definition Tracking.h:102
void init()
Load geometry and apply magnetic field setting.
Definition Tracking.cxx:27
void setApplyShift(bool f)
Definition Tracking.h:84
void setFirstOrbit(uint32_t o)
Definition Tracking.h:109
GLenum src
Definition glcorearb.h:1767
Defining ITS Vertex explicitly as messageable.
Definition Cartesian.h:288
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
DataProcessorSpec getTRDTrackingQCWriterSpec()
DataProcessorSpec getTRDGlobalTrackingQCSpec(o2::dataformats::GlobalTrackID::mask_t src)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)