25#include <fairlogger/Logger.h>
32 mAngResHistos.
reset();
33 mGainCalibHistos.clear();
57 LOG(alarm) <<
"No Local gain map available. Please upload valid object to CCDB.";
60 int nTracksSuccessTPCTRD =
filldEdx(mTracksInTPCTRD,
true);
61 int nTracksSuccessITSTPCTRD =
filldEdx(mTracksInITSTPCTRD,
false);
63 LOGP(info,
"Gain Calibration: Successfully processed {} tracks ({} from ITS-TPC-TRD and {} from TPC-TRD) and collected {} data points",
64 nTracksSuccessITSTPCTRD + nTracksSuccessTPCTRD, nTracksSuccessITSTPCTRD, nTracksSuccessTPCTRD, mGainCalibHistos.size());
69 if (mTrackletsRaw.size() != mTrackletsCalib.size()) {
70 LOG(error) <<
"TRD raw tracklet container size differs from calibrated tracklet container size";
75 LOG(alarm) <<
"No MCM noise map available. Please upload valid object to CCDB.";
78 LOGF(info,
"As input tracks are available: %lu ITS-TPC-TRD tracks and %lu TPC-TRD tracks", mTracksInITSTPCTRD.size(), mTracksInTPCTRD.size());
83 LOGF(info,
"Successfully processed %i tracks (%i from ITS-TPC-TRD and %i from TPC-TRD) and collected %lu angular residuals",
84 nTracksSuccessITSTPCTRD + nTracksSuccessTPCTRD, nTracksSuccessITSTPCTRD, nTracksSuccessTPCTRD, mAngResHistos.
getNEntries());
91 int nTracksSuccess = 0;
92 for (
const auto& trkIn : tracks) {
94 if (trkIn.getNtracklets() <
params.nTrackletsMinGainCalib) {
98 if (trkIn.getP() <
params.pMin || trkIn.getP() >
params.pMax) {
102 auto id = trkIn.getRefGlobalTrackId();
105 dEdxTPC = mTracksTPC[
id].getdEdx().dEdxTotTPC;
107 dEdxTPC = mTracksTPC[mTracksITSTPC[
id].getRefTPC()].getdEdx().dEdxTotTPC;
109 if (dEdxTPC < params.dEdxTPCMin || dEdxTPC >
params.dEdxTPCMax) {
113 if (std::isnan(trkIn.getSnp())) {
114 LOG(alarm) <<
"Track with invalid parameters found: " << trkIn.getRefGlobalTrackId();
118 for (
int iLayer =
NLAYER - 1; iLayer >= 0; --iLayer) {
119 if (trkIn.getTrackletIndex(iLayer) == -1) {
128 if (trkIn.getIsCrossingNeighbor(iLayer)) {
132 int trkltId = trkIn.getTrackletIndex(iLayer);
133 int trkltDet = mTrackletsRaw[trkltId].getDetector();
136 const auto& tracklet = mTrackletsRaw[trkltId];
138 auto q0 = tracklet.getQ0();
139 auto q1 = tracklet.getQ1();
140 auto q2 = tracklet.getQ2();
141 if (q0 == 0 || q1 == 0 || q2 == 0 || q0 >= 127 || q1 >= 127 || q2 >= 62) {
146 const auto& trackletCalib = mTrackletsCalib[trkltId];
147 float tgl = trkIn.getTgl();
157 float trkLength = sqrt(1 + snp * snp / (1 - snp * snp) + tgl * tgl);
158 if (TMath::Abs(trkLength) < 1) {
159 LOGP(warn,
"Invalid track length {} for angles snp {} and tgl {}", trkLength, snp, tgl);
163 float localGainCorr = 1.;
165 localGainCorr = mLocalGain->
getValue(trkltDet, tracklet.getPadCol(mApplyShift), tracklet.getPadRow());
167 if (TMath::Abs(localGainCorr) < 0.0001f) {
168 LOGP(warn,
"Invalid localGainCorr {} for det {}, pad col {}, pad row {}", localGainCorr, trkltDet, tracklet.getPadCol(mApplyShift), tracklet.getPadRow());
172 unsigned int dEdx = (q0 + q1 + q2) / trkLength / localGainCorr;
177 mGainCalibHistos.push_back(chamberOffset + dEdx);
183 return nTracksSuccess;
189 int nTracksSuccess = 0;
190 for (
const auto& trkIn : tracks) {
191 if (trkIn.getNtracklets() <
params.nTrackletsMin) {
195 auto trkWork = trkIn;
196 bool trackFailed =
false;
198 trkWork.setChi2(0.f);
199 trkWork.resetCovariance(20);
201 if (std::isnan(trkWork.getSnp())) {
202 LOG(alarm) <<
"Track with invalid parameters found: " << trkWork.getRefGlobalTrackId();
208 for (
int iLayer =
NLAYER - 1; iLayer >= 0; --iLayer) {
209 if (trkWork.getTrackletIndex(iLayer) == -1) {
212 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
227 for (
int iLayer = currLayer + 1; iLayer <
NLAYER; ++iLayer) {
228 if (trkWork.getTrackletIndex(iLayer) == -1) {
231 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
246 for (
int iLayer = currLayer; iLayer >= 0; --iLayer) {
247 if (trkWork.getTrackletIndex(iLayer) == -1) {
250 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
259 if (trkWork.getReducedChi2() >
params.chi2RedMax) {
264 float trkAngle = o2::math_utils::asin(trkWork.getSnp()) * TMath::RadToDeg();
265 float trkltAngle = o2::math_utils::atan(mTrackletsCalib[trkWork.getTrackletIndex(iLayer)].getDy() / Geometry::cdrHght()) * TMath::RadToDeg();
266 float angleDeviation = trkltAngle - trkAngle;
267 if (mAngResHistos.
addEntry(angleDeviation, trkAngle, mTrackletsRaw[trkWork.getTrackletIndex(iLayer)].getDetector())) {
276 return nTracksSuccess;
287 int trkltId = trk.getTrackletIndex(iLayer);
288 int trkltDet = mTrackletsRaw[trkltId].getDetector();
293 LOGF(
debug,
"Track could not be rotated in tracklet coordinate system");
298 if (!propagator->PropagateToXBxByBz(trk, mTrackletsCalib[trkltId].getX(), mMaxSnp, mMaxStep, mMatCorr)) {
299 LOGF(
debug,
"Track propagation failed in layer %i (pt=%f, xTrk=%f, xToGo=%f)", iLayer, trk.getPt(), trk.getX(), mTrackletsCalib[trkltId].getX());
309 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
310 float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trk.getZ());
311 float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trk.getTgl();
312 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
313 if (!((trk.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trk.getZ()) < padLength))) {
317 std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp, zPosCorrUp};
318 std::array<float, 3> trkltCovUp;
319 mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp);
321 if (!trk.update(trkltPosUp, trkltCovUp)) {
322 LOGF(info,
"Failed to update track with space point in layer %i", iLayer);
Definition of the GeometryManager class.
Definition of the Names Generator class.
Provides information required for TRD calibration which is based on the global tracking.
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
static const TRDCalibParams & Instance()
void init(float bz, const GPUSettingsRec *rec=nullptr)
Load parameterization for given magnetic field.
size_t getNEntries() const
bool addEntry(float deltaAlpha, float impactAngle, int chamberId)
static Geometry * instance()
bool isTrackletFromNoisyMCM(const Tracklet64 &trklt) const
T getValue(int roc, int col, int row) const
void setInput(const o2::globaltracking::RecoContainer &input)
Initialize the input arrays.
int doTrdOnlyTrackFits(gsl::span< const TrackTRD > &tracks)
3-way fit to TRD tracklets
int filldEdx(gsl::span< const TrackTRD > &tracks, bool isTPCTRD)
Collect tracklet charges for given track.
void reset()
Reset the output.
void calculateGainCalibObjs()
void init()
Load geometry and apply magnetic field setting.
void calculateAngResHistos()
Main processing function for creating angular residual histograms for vDrift and ExB calibration.
bool propagateAndUpdate(TrackTRD &trk, int iLayer, bool doUpdate) const
Extrapolate track parameters to given layer and if requested perform update with tracklet.
GLenum const GLfloat * params
int angle2Sector(float phi)
float sector2Angle(int sect)
constexpr int NLAYER
the number of layers
constexpr int NSTACK
the number of stacks per sector
constexpr int NBINSGAINCALIB
number of bins in the charge (Q0+Q1+Q2) histogram for gain calibration
gsl::span< const o2::trd::CalibratedTracklet > getTRDCalibratedTracklets() const
auto getTPCITSTracks() const
auto getTPCTRDTracks() const
auto getTPCTracks() const
auto getITSTPCTRDTracks() const
gsl::span< const o2::trd::Tracklet64 > getTRDTracklets() const
GPUSettingsO2 ReadConfigurableParam()
GPUSettingsRec configReconstruction
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"