29#include <fairlogger/Logger.h>
36 mAngResHistos.
reset();
37 mGainCalibHistos.clear();
59 LOG(alarm) <<
"No Local gain map available. Please upload valid object to CCDB.";
62 int nTracksSuccessTPCTRD =
filldEdx(mTracksInTPCTRD,
true);
63 int nTracksSuccessITSTPCTRD =
filldEdx(mTracksInITSTPCTRD,
false);
65 LOGP(info,
"Gain Calibration: Successfully processed {} tracks ({} from ITS-TPC-TRD and {} from TPC-TRD) and collected {} data points",
66 nTracksSuccessITSTPCTRD + nTracksSuccessTPCTRD, nTracksSuccessITSTPCTRD, nTracksSuccessTPCTRD, mGainCalibHistos.size());
71 if (mTrackletsRaw.size() != mTrackletsCalib.size()) {
72 LOG(error) <<
"TRD raw tracklet container size differs from calibrated tracklet container size";
77 LOG(alarm) <<
"No MCM noise map available. Please upload valid object to CCDB.";
80 LOGF(info,
"As input tracks are available: %lu ITS-TPC-TRD tracks and %lu TPC-TRD tracks", mTracksInITSTPCTRD.size(), mTracksInTPCTRD.size());
86 LOGF(info,
"Successfully processed %i tracks (%i from ITS-TPC-TRD and %i from TPC-TRD) and collected %lu angular residuals",
87 nTracksSuccessITSTPCTRD + nTracksSuccessTPCTRD, nTracksSuccessITSTPCTRD, nTracksSuccessTPCTRD, mAngResHistos.
getNEntries());
94 int nTracksSuccess = 0;
95 for (
const auto& trkIn :
tracks) {
97 if (trkIn.getNtracklets() <
params.nTrackletsMinGainCalib) {
101 if (trkIn.getP() <
params.pMin || trkIn.getP() >
params.pMax) {
105 auto id = trkIn.getRefGlobalTrackId();
108 dEdxTPC = mTracksTPC[
id].getdEdx().dEdxTotTPC;
110 dEdxTPC = mTracksTPC[mTracksITSTPC[
id].getRefTPC()].getdEdx().dEdxTotTPC;
112 if (dEdxTPC < params.dEdxTPCMin || dEdxTPC >
params.dEdxTPCMax) {
116 if (std::isnan(trkIn.getSnp())) {
117 LOG(alarm) <<
"Track with invalid parameters found: " << trkIn.getRefGlobalTrackId();
121 for (
int iLayer = NLAYER - 1; iLayer >= 0; --iLayer) {
122 if (trkIn.getTrackletIndex(iLayer) == -1) {
131 if (trkIn.getIsCrossingNeighbor(iLayer)) {
135 int trkltId = trkIn.getTrackletIndex(iLayer);
136 int trkltDet = mTrackletsRaw[trkltId].getDetector();
137 int trkltSec = trkltDet / (NLAYER * NSTACK);
139 const auto& tracklet = mTrackletsRaw[trkltId];
141 auto q0 = tracklet.getQ0();
142 auto q1 = tracklet.getQ1();
143 auto q2 = tracklet.getQ2();
144 if (q0 == 0 || q1 == 0 || q2 == 0 || q0 >= 127 || q1 >= 127 || q2 >= 62) {
149 const auto& trackletCalib = mTrackletsCalib[trkltId];
150 float tgl = trkIn.getTgl();
153 if (std::abs(snp) > 1.) {
160 float trkLength = sqrt(1 + snp * snp / (1 - snp * snp) + tgl * tgl);
161 if (TMath::Abs(trkLength) < 1) {
162 LOGP(warn,
"Invalid track length {} for angles snp {} and tgl {}", trkLength, snp, tgl);
166 float localGainCorr = 1.;
168 localGainCorr = mLocalGain->
getValue(trkltDet, tracklet.getPadCol(mApplyShift), tracklet.getPadRow());
170 if (TMath::Abs(localGainCorr) < 0.0001f) {
171 LOGP(warn,
"Invalid localGainCorr {} for det {}, pad col {}, pad row {}", localGainCorr, trkltDet, tracklet.getPadCol(mApplyShift), tracklet.getPadRow());
175 unsigned int dEdx = (q0 + q1 + q2) / trkLength / localGainCorr;
176 if (dEdx >= NBINSGAINCALIB) {
179 int chamberOffset = trkltDet * NBINSGAINCALIB;
180 mGainCalibHistos.push_back(chamberOffset + dEdx);
186 return nTracksSuccess;
192 int nTracksSuccess = 0;
193 for (
const auto& trkIn :
tracks) {
194 if (trkIn.getNtracklets() <
params.nTrackletsMin) {
196 if (trkIn.getNtracklets() <
params.nTrackletsMinLoose || !((trkIn.getTrackletIndex(0) >= 0 && (trkIn.getTrackletIndex(NLAYER - 1) >= 0 || trkIn.getTrackletIndex(NLAYER - 2) >= 0))) || (trkIn.getTrackletIndex(1) >= 0 && trkIn.getTrackletIndex(NLAYER - 1) >= 0)) {
201 if (trkIn.getPt() <
params.minPtCalib) {
206 auto trkWork = trkIn;
207 bool trackFailed =
false;
209 trkWork.setChi2(0.f);
210 trkWork.resetCovariance(20);
212 if (std::isnan(trkWork.getSnp())) {
213 LOG(alarm) <<
"Track with invalid parameters found: " << trkWork.getRefGlobalTrackId();
224 int currLayer = NLAYER;
225 for (
int iLayer = NLAYER - 1; iLayer >= 0; --iLayer) {
226 if (trkWork.getTrackletIndex(iLayer) == -1) {
229 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
244 for (
int iLayer = currLayer + 1; iLayer < NLAYER; ++iLayer) {
245 if (trkWork.getTrackletIndex(iLayer) == -1) {
248 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
263 for (
int iLayer = currLayer; iLayer >= 0; --iLayer) {
264 if (trkWork.getTrackletIndex(iLayer) == -1) {
267 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
276 if (trkWork.getReducedChi2() >
params.chi2RedMax) {
281 float trkAngle = o2::math_utils::asin(trkWork.getSnp()) * TMath::RadToDeg();
282 int trkltId = trkWork.getTrackletIndex(iLayer);
285 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
286 float tiltCorrUp = tilt * trkWork.getTgl() * Geometry::cdrHght();
287 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
288 if (!((trkWork.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trkWork.getZ()) < padLength))) {
294 float trkltAngle = o2::math_utils::atan(trkltDy / Geometry::cdrHght()) * TMath::RadToDeg();
295 float angleDeviation = trkltAngle - trkAngle;
296 if (mAngResHistos.
addEntry(angleDeviation, trkAngle, mTrackletsRaw[trkltId].getDetector())) {
305 return nTracksSuccess;
316 int trkltId = trk.getTrackletIndex(iLayer);
317 int trkltDet = mTrackletsRaw[trkltId].getDetector();
318 int trkltSec = trkltDet / (NLAYER * NSTACK);
322 LOGF(
debug,
"Track could not be rotated in tracklet coordinate system");
327 if (!propagator->PropagateToXBxByBz(trk, mTrackletsCalib[trkltId].getX(), mMaxSnp, mMaxStep, mMatCorr)) {
328 LOGF(
debug,
"Track propagation failed in layer %i (pt=%f, xTrk=%f, xToGo=%f)", iLayer, trk.getPt(), trk.getX(), mTrackletsCalib[trkltId].getX());
338 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
339 float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trk.getZ());
340 float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trk.getTgl();
341 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
342 if (!((trk.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trk.getZ()) < padLength))) {
346 std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp, zPosCorrUp};
347 std::array<float, 3> trkltCovUp;
348 mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp);
350 if (!trk.update(trkltPosUp, trkltCovUp)) {
351 LOGF(info,
"Failed to update track with space point in layer %i", iLayer);
Definition of the GeometryManager class.
Some ALICE geometry constants of common interest.
std::vector< o2::its::TrackITS > tracks
Definition of the Names Generator class.
Provides information required for TRD calibration which is based on the global tracking.
Result of refitting TPC-ITS matched track.
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
constexpr float XTPCOuterRef
reference radius to propagate outer TPC track
int angle2Sector(float phi)
float sector2Angle(int sect)
constexpr double VDRIFTDEFAULT
default value for vDrift
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
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"