Skip to content

Commit d8ef9c5

Browse files
committed
TRD: QC: write out corrected charges
Utilize the krypton calibration introduce in PR #9800 by @jcrkovsk for charge corrections. This can later be extent for gain corrections. Signed-off-by: Felix Schlepper <f3sch.git@outlook.com>
1 parent dd18d2a commit d8ef9c5

3 files changed

Lines changed: 50 additions & 24 deletions

File tree

Detectors/TRD/qc/include/TRDQC/Tracking.h

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,19 @@
1818

1919
#include "DataFormatsTRD/TrackTRD.h"
2020
#include "DataFormatsTRD/Tracklet64.h"
21+
#include "TRDBase/PadCalibrationsAliases.h"
2122
#include "DataFormatsTRD/CalibratedTracklet.h"
2223
#include "DataFormatsTRD/Constants.h"
2324
#include "ReconstructionDataFormats/TrackTPCITS.h"
2425
#include "ReconstructionDataFormats/GlobalTrackID.h"
2526
#include "DataFormatsTPC/TrackTPC.h"
2627
#include "DetectorsBase/Propagator.h"
2728
#include "TRDBase/RecoParam.h"
28-
#include "TH1.h"
29+
#include "Framework/ProcessingContext.h"
30+
#include "Framework/InputRecord.h"
2931

3032
#include "Rtypes.h"
33+
#include "TH1.h"
3134

3235
#include <gsl/span>
3336
#include <bitset>
@@ -83,12 +86,14 @@ struct TrackQC {
8386
std::array<int, constants::NLAYER> trackletPositionSigned{}; ///< the raw position from Tracklet64 (signed integer)
8487
std::array<int, constants::NLAYER> trackletDet{}; ///< the chamber of the tracklet
8588
// some tracklet details to identify its global MCM number to check if it is from noisy MCM
86-
std::array<int, constants::NLAYER> trackletHCId{}; ///< the half-chamber ID of the tracklet
87-
std::array<int, constants::NLAYER> trackletRob{}; ///< the ROB number of the tracklet
88-
std::array<int, constants::NLAYER> trackletMcm{}; ///< the MCM number of the tracklet
89-
std::array<float, constants::NLAYER> trackletChi2{}; ///< estimated chi2 for the update of the track with the given tracklet
90-
std::array<std::array<int, constants::NCHARGES>, constants::NLAYER> trackletCharges{}; ///< charges of tracklets
91-
ClassDefNV(TrackQC, 4);
89+
std::array<int, constants::NLAYER> trackletHCId{}; ///< the half-chamber ID of the tracklet
90+
std::array<int, constants::NLAYER> trackletRob{}; ///< the ROB number of the tracklet
91+
std::array<int, constants::NLAYER> trackletMcm{}; ///< the MCM number of the tracklet
92+
std::array<float, constants::NLAYER> trackletChi2{}; ///< estimated chi2 for the update of the track with the given tracklet
93+
std::array<std::array<int, constants::NCHARGES>, constants::NLAYER> trackletCharges{}; ///< charges of tracklets
94+
std::array<std::array<float, constants::NCHARGES>, constants::NLAYER> trackletCorCharges{}; ///< corrected charges of tracklets
95+
96+
ClassDefNV(TrackQC, 5);
9297
};
9398

9499
class Tracking
@@ -104,7 +109,7 @@ class Tracking
104109
void init();
105110

106111
/// Initialize the input arrays
107-
void setInput(const o2::globaltracking::RecoContainer& input);
112+
void setInput(const o2::globaltracking::RecoContainer& input, o2::framework::ProcessingContext& pc);
108113

109114
/// Main processing function
110115
void run();
@@ -123,8 +128,10 @@ class Tracking
123128
float mMaxStep{o2::base::Propagator::MAX_STEP}; ///< maximum step for propagation
124129
MatCorrType mMatCorr{MatCorrType::USEMatCorrNONE}; ///< if material correction should be done
125130
RecoParam mRecoParam; ///< parameters required for TRD reconstruction
131+
126132
// QA results
127133
std::vector<TrackQC> mTrackQC;
134+
128135
// input from DPL
129136
gsl::span<const o2::dataformats::TrackTPCITS> mTracksITSTPC; ///< ITS-TPC seeding tracks
130137
gsl::span<const o2::tpc::TrackTPC> mTracksTPC; ///< TPC seeding tracks
@@ -133,7 +140,11 @@ class Tracking
133140
gsl::span<const Tracklet64> mTrackletsRaw; ///< array of raw tracklets needed for TRD refit
134141
gsl::span<const CalibratedTracklet> mTrackletsCalib; ///< array of calibrated tracklets needed for TRD refit
135142

136-
ClassDefNV(Tracking, 1);
143+
// corrections from ccdb, some need to be loaded only once hence an init flag
144+
bool mCCDBInit{false}; ///< init flag for ccdb objects that do not require updates
145+
o2::trd::LocalGainFactor mLocalGain; ///< local gain factors from krypton calibration
146+
147+
ClassDefNV(Tracking, 2);
137148
};
138149

139150
} // namespace trd

Detectors/TRD/qc/src/Tracking.cxx

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "DetectorsBase/GeometryManager.h"
1919
#include "TRDBase/Geometry.h"
2020
#include "TRDBase/PadPlane.h"
21+
#include "Framework/ProcessingContext.h"
2122
#include <fairlogger/Logger.h>
2223

2324
using namespace o2::trd;
@@ -28,7 +29,7 @@ void Tracking::init()
2829
mRecoParam.setBfield(o2::base::Propagator::Instance()->getNominalBz());
2930
}
3031

31-
void Tracking::setInput(const o2::globaltracking::RecoContainer& input)
32+
void Tracking::setInput(const o2::globaltracking::RecoContainer& input, o2::framework::ProcessingContext& pc)
3233
{
3334
// mRecoCont = &input;
3435
mTracksTPC = input.getTPCTracks();
@@ -37,6 +38,11 @@ void Tracking::setInput(const o2::globaltracking::RecoContainer& input)
3738
mTracksTPCTRD = input.getTPCTRDTracks<TrackTRD>();
3839
mTrackletsRaw = input.getTRDTracklets();
3940
mTrackletsCalib = input.getTRDCalibratedTracklets();
41+
42+
if (!mCCDBInit) {
43+
mCCDBInit = true;
44+
mLocalGain = *(pc.inputs().get<o2::trd::LocalGainFactor*>("localgainfactors"));
45+
}
4046
}
4147

4248
void Tracking::run()
@@ -77,7 +83,8 @@ void Tracking::checkTrack(const TrackTRD& trkTrd, bool isTPCTRD)
7783
if (trkltId < 0) {
7884
continue;
7985
}
80-
int trkltDet = mTrackletsRaw[trkltId].getDetector();
86+
const auto& tracklet = mTrackletsRaw[trkltId];
87+
int trkltDet = tracklet.getDetector();
8188
int trkltSec = trkltDet / (NLAYER * NSTACK);
8289
if (trkltSec != o2::math_utils::angle2Sector(trk.getAlpha())) {
8390
if (!trk.rotate(o2::math_utils::sector2Angle(trkltSec))) {
@@ -94,14 +101,14 @@ void Tracking::checkTrack(const TrackTRD& trkTrd, bool isTPCTRD)
94101
float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle()); // tilt is signed! and returned in degrees
95102
float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trk.getZ());
96103
float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trk.getTgl();
97-
float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
104+
float padLength = pad->getRowSize(tracklet.getPadRow());
98105
if (!((trk.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trk.getZ()) < padLength))) {
99106
tiltCorrUp = 0.f;
100107
}
101108

102109
std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp, zPosCorrUp};
103110
std::array<float, 3> trkltCovUp;
104-
mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp);
111+
mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(tracklet.getPadRow()), trkltCovUp);
105112
auto chi2trklt = trk.getPredictedChi2(trkltPosUp, trkltCovUp);
106113

107114
qcStruct.trackX[iLayer] = trk.getX();
@@ -117,19 +124,25 @@ void Tracking::checkTrack(const TrackTRD& trkTrd, bool isTPCTRD)
117124
qcStruct.trackletY[iLayer] = trkltPosUp[0];
118125
qcStruct.trackletZ[iLayer] = trkltPosUp[1];
119126
qcStruct.trackletDy[iLayer] = mTrackletsCalib[trkltId].getDy();
120-
qcStruct.trackletSlope[iLayer] = mTrackletsRaw[trkltId].getSlope();
121-
qcStruct.trackletSlopeSigned[iLayer] = mTrackletsRaw[trkltId].getSlopeBinSigned();
122-
qcStruct.trackletPosition[iLayer] = mTrackletsRaw[trkltId].getPosition();
123-
qcStruct.trackletPositionSigned[iLayer] = mTrackletsRaw[trkltId].getPositionBinSigned();
127+
qcStruct.trackletSlope[iLayer] = tracklet.getSlope();
128+
qcStruct.trackletSlopeSigned[iLayer] = tracklet.getSlopeBinSigned();
129+
qcStruct.trackletPosition[iLayer] = tracklet.getPosition();
130+
qcStruct.trackletPositionSigned[iLayer] = tracklet.getPositionBinSigned();
124131
qcStruct.trackletDet[iLayer] = trkltDet;
125-
qcStruct.trackletHCId[iLayer] = mTrackletsRaw[trkltId].getHCID();
126-
qcStruct.trackletRob[iLayer] = mTrackletsRaw[trkltId].getROB();
127-
qcStruct.trackletMcm[iLayer] = mTrackletsRaw[trkltId].getMCM();
132+
qcStruct.trackletHCId[iLayer] = tracklet.getHCID();
133+
qcStruct.trackletRob[iLayer] = tracklet.getROB();
134+
qcStruct.trackletMcm[iLayer] = tracklet.getMCM();
128135
qcStruct.trackletChi2[iLayer] = chi2trklt;
129136
qcStruct.trackletCharges[iLayer] = {
130-
mTrackletsRaw[trkltId].getQ0(),
131-
mTrackletsRaw[trkltId].getQ1(),
132-
mTrackletsRaw[trkltId].getQ2(),
137+
tracklet.getQ0(),
138+
tracklet.getQ1(),
139+
tracklet.getQ2(),
140+
};
141+
auto correction = mLocalGain.getValue(tracklet.getHCID() / 2, tracklet.getPadCol(), tracklet.getPadRow());
142+
qcStruct.trackletCorCharges[iLayer] = {
143+
static_cast<float>(tracklet.getQ0()) * correction,
144+
static_cast<float>(tracklet.getQ1()) * correction,
145+
static_cast<float>(tracklet.getQ2()) * correction,
133146
};
134147
}
135148
mTrackQC.push_back(qcStruct);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "Framework/DataProcessorSpec.h"
2424
#include "Framework/Task.h"
2525
#include "Framework/ConfigParamRegistry.h"
26+
#include "Framework/CCDBParamSpec.h"
2627
#include "DPLUtils/MakeRootTreeWriterSpec.h"
2728
#include "DetectorsBase/GeometryManager.h"
2829
#include "DetectorsBase/Propagator.h"
@@ -54,7 +55,7 @@ class TRDGlobalTrackingQC : public Task
5455
recoData.collectData(pc, *mDataRequest.get());
5556
updateTimeDependentParams(pc); // Make sure this is called after recoData.collectData, which may load some conditions
5657
mQC.reset();
57-
mQC.setInput(recoData);
58+
mQC.setInput(recoData, pc);
5859
mQC.run();
5960
pc.outputs().snapshot(Output{"TRD", "TRACKINGQC", 0, Lifetime::Timeframe}, mQC.getTrackQC());
6061
}
@@ -100,6 +101,7 @@ DataProcessorSpec getTRDGlobalTrackingQCSpec(o2::dataformats::GlobalTrackID::mas
100101

101102
dataRequest->requestTracks(src, false);
102103
dataRequest->requestClusters(srcClu, false);
104+
dataRequest->inputs.emplace_back("localgainfactors", "TRD", "LOCALGAINFACTORS", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/LocalGainFactor"));
103105
auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
104106
false, // GRPECS=true
105107
false, // GRPLHCIF

0 commit comments

Comments
 (0)