24#include <fairlogger/Logger.h>
31 mAngResHistos.
reset();
32 mGainCalibHistos.clear();
54 LOG(alarm) <<
"No Local gain map available. Please upload valid object to CCDB.";
57 int nTracksSuccessTPCTRD =
filldEdx(mTracksInTPCTRD,
true);
58 int nTracksSuccessITSTPCTRD =
filldEdx(mTracksInITSTPCTRD,
false);
60 LOGP(info,
"Gain Calibration: Successfully processed {} tracks ({} from ITS-TPC-TRD and {} from TPC-TRD) and collected {} data points",
61 nTracksSuccessITSTPCTRD + nTracksSuccessTPCTRD, nTracksSuccessITSTPCTRD, nTracksSuccessTPCTRD, mGainCalibHistos.size());
66 if (mTrackletsRaw.size() != mTrackletsCalib.size()) {
67 LOG(error) <<
"TRD raw tracklet container size differs from calibrated tracklet container size";
72 LOG(alarm) <<
"No MCM noise map available. Please upload valid object to CCDB.";
75 LOGF(info,
"As input tracks are available: %lu ITS-TPC-TRD tracks and %lu TPC-TRD tracks", mTracksInITSTPCTRD.size(), mTracksInTPCTRD.size());
80 LOGF(info,
"Successfully processed %i tracks (%i from ITS-TPC-TRD and %i from TPC-TRD) and collected %lu angular residuals",
81 nTracksSuccessITSTPCTRD + nTracksSuccessTPCTRD, nTracksSuccessITSTPCTRD, nTracksSuccessTPCTRD, mAngResHistos.
getNEntries());
88 int nTracksSuccess = 0;
89 for (
const auto& trkIn : tracks) {
91 if (trkIn.getNtracklets() <
params.nTrackletsMinGainCalib) {
95 if (trkIn.getP() <
params.pMin || trkIn.getP() >
params.pMax) {
99 auto id = trkIn.getRefGlobalTrackId();
102 dEdxTPC = mTracksTPC[
id].getdEdx().dEdxTotTPC;
104 dEdxTPC = mTracksTPC[mTracksITSTPC[
id].getRefTPC()].getdEdx().dEdxTotTPC;
106 if (dEdxTPC < params.dEdxTPCMin || dEdxTPC >
params.dEdxTPCMax) {
110 if (std::isnan(trkIn.getSnp())) {
111 LOG(alarm) <<
"Track with invalid parameters found: " << trkIn.getRefGlobalTrackId();
115 for (
int iLayer =
NLAYER - 1; iLayer >= 0; --iLayer) {
116 if (trkIn.getTrackletIndex(iLayer) == -1) {
125 if (trkIn.getIsCrossingNeighbor(iLayer)) {
129 int trkltId = trkIn.getTrackletIndex(iLayer);
130 int trkltDet = mTrackletsRaw[trkltId].getDetector();
133 const auto& tracklet = mTrackletsRaw[trkltId];
135 auto q0 = tracklet.getQ0();
136 auto q1 = tracklet.getQ1();
137 auto q2 = tracklet.getQ2();
138 if (q0 == 0 || q1 == 0 || q2 == 0 || q0 >= 127 || q1 >= 127 || q2 >= 62) {
143 const auto& trackletCalib = mTrackletsCalib[trkltId];
144 float tgl = trkIn.getTgl();
154 float trkLength = sqrt(1 + snp * snp / (1 - snp * snp) + tgl * tgl);
155 if (TMath::Abs(trkLength) < 1) {
156 LOGP(warn,
"Invalid track length {} for angles snp {} and tgl {}", trkLength, snp, tgl);
160 float localGainCorr = 1.;
162 localGainCorr = mLocalGain->
getValue(trkltDet, tracklet.getPadCol(mApplyShift), tracklet.getPadRow());
164 if (TMath::Abs(localGainCorr) < 0.0001f) {
165 LOGP(warn,
"Invalid localGainCorr {} for det {}, pad col {}, pad row {}", localGainCorr, trkltDet, tracklet.getPadCol(mApplyShift), tracklet.getPadRow());
169 unsigned int dEdx = (q0 + q1 + q2) / trkLength / localGainCorr;
174 mGainCalibHistos.push_back(chamberOffset + dEdx);
180 return nTracksSuccess;
186 int nTracksSuccess = 0;
187 for (
const auto& trkIn : tracks) {
188 if (trkIn.getNtracklets() <
params.nTrackletsMin) {
192 auto trkWork = trkIn;
193 bool trackFailed =
false;
195 trkWork.setChi2(0.f);
196 trkWork.resetCovariance(20);
198 if (std::isnan(trkWork.getSnp())) {
199 LOG(alarm) <<
"Track with invalid parameters found: " << trkWork.getRefGlobalTrackId();
205 for (
int iLayer =
NLAYER - 1; iLayer >= 0; --iLayer) {
206 if (trkWork.getTrackletIndex(iLayer) == -1) {
209 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
224 for (
int iLayer = currLayer + 1; iLayer <
NLAYER; ++iLayer) {
225 if (trkWork.getTrackletIndex(iLayer) == -1) {
228 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
243 for (
int iLayer = currLayer; iLayer >= 0; --iLayer) {
244 if (trkWork.getTrackletIndex(iLayer) == -1) {
247 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
256 if (trkWork.getReducedChi2() >
params.chi2RedMax) {
261 float trkAngle = o2::math_utils::asin(trkWork.getSnp()) * TMath::RadToDeg();
262 float trkltAngle = o2::math_utils::atan(mTrackletsCalib[trkWork.getTrackletIndex(iLayer)].getDy() / Geometry::cdrHght()) * TMath::RadToDeg();
263 float angleDeviation = trkltAngle - trkAngle;
264 if (mAngResHistos.
addEntry(angleDeviation, trkAngle, mTrackletsRaw[trkWork.getTrackletIndex(iLayer)].getDetector())) {
273 return nTracksSuccess;
284 int trkltId = trk.getTrackletIndex(iLayer);
285 int trkltDet = mTrackletsRaw[trkltId].getDetector();
290 LOGF(
debug,
"Track could not be rotated in tracklet coordinate system");
295 if (!propagator->PropagateToXBxByBz(trk, mTrackletsCalib[trkltId].getX(), mMaxSnp, mMaxStep, mMatCorr)) {
296 LOGF(
debug,
"Track propagation failed in layer %i (pt=%f, xTrk=%f, xToGo=%f)", iLayer, trk.getPt(), trk.getX(), mTrackletsCalib[trkltId].getX());
306 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
307 float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trk.getZ());
308 float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.
getZCorrCoeffNRC() * trk.getTgl();
309 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
310 if (!((trk.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trk.getZ()) < padLength))) {
314 std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp, zPosCorrUp};
315 std::array<float, 3> trkltCovUp;
316 mRecoParam.
recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp);
318 if (!trk.update(trkltPosUp, trkltCovUp)) {
319 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()
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 recalcTrkltCov(const float tilt, const float snp, const float rowSize, std::array< float, 3 > &cov) const
Recalculate tracklet covariance based on phi angle of related track.
float getZCorrCoeffNRC() const
Get tracklet z correction coefficient for track-eta based corraction.
void setBfield(float bz)
Load parameterization for given magnetic field.
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
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"