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) {
193 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)) {
198 auto trkWork = trkIn;
199 bool trackFailed =
false;
201 trkWork.setChi2(0.f);
202 trkWork.resetCovariance(20);
204 if (std::isnan(trkWork.getSnp())) {
205 LOG(alarm) <<
"Track with invalid parameters found: " << trkWork.getRefGlobalTrackId();
211 for (
int iLayer =
NLAYER - 1; iLayer >= 0; --iLayer) {
212 if (trkWork.getTrackletIndex(iLayer) == -1) {
215 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
230 for (
int iLayer = currLayer + 1; iLayer <
NLAYER; ++iLayer) {
231 if (trkWork.getTrackletIndex(iLayer) == -1) {
234 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
249 for (
int iLayer = currLayer; iLayer >= 0; --iLayer) {
250 if (trkWork.getTrackletIndex(iLayer) == -1) {
253 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
262 if (trkWork.getReducedChi2() >
params.chi2RedMax) {
267 float trkAngle = o2::math_utils::asin(trkWork.getSnp()) * TMath::RadToDeg();
268 int trkltId = trkWork.getTrackletIndex(iLayer);
271 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
272 float tiltCorrUp = tilt * trkWork.getTgl() * Geometry::cdrHght();
273 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
274 if (!((trkWork.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trkWork.getZ()) < padLength))) {
279 float trkltAngle = o2::math_utils::atan(trkltDy / Geometry::cdrHght()) * TMath::RadToDeg();
280 float angleDeviation = trkltAngle - trkAngle;
281 if (mAngResHistos.
addEntry(angleDeviation, trkAngle, mTrackletsRaw[trkltId].getDetector())) {
290 return nTracksSuccess;
301 int trkltId = trk.getTrackletIndex(iLayer);
302 int trkltDet = mTrackletsRaw[trkltId].getDetector();
307 LOGF(
debug,
"Track could not be rotated in tracklet coordinate system");
312 if (!propagator->PropagateToXBxByBz(trk, mTrackletsCalib[trkltId].getX(), mMaxSnp, mMaxStep, mMatCorr)) {
313 LOGF(
debug,
"Track propagation failed in layer %i (pt=%f, xTrk=%f, xToGo=%f)", iLayer, trk.getPt(), trk.getX(), mTrackletsCalib[trkltId].getX());
323 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
324 float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trk.getZ());
325 float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trk.getTgl();
326 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
327 if (!((trk.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trk.getZ()) < padLength))) {
331 std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp, zPosCorrUp};
332 std::array<float, 3> trkltCovUp;
333 mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp);
335 if (!trk.update(trkltPosUp, trkltCovUp)) {
336 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 double VDRIFTDEFAULT
default value for vDrift
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"