25#include <fairlogger/Logger.h>
32 mAngResHistos.
reset();
33 mGainCalibHistos.clear();
55 LOG(alarm) <<
"No Local gain map available. Please upload valid object to CCDB.";
58 int nTracksSuccessTPCTRD =
filldEdx(mTracksInTPCTRD,
true);
59 int nTracksSuccessITSTPCTRD =
filldEdx(mTracksInITSTPCTRD,
false);
61 LOGP(info,
"Gain Calibration: Successfully processed {} tracks ({} from ITS-TPC-TRD and {} from TPC-TRD) and collected {} data points",
62 nTracksSuccessITSTPCTRD + nTracksSuccessTPCTRD, nTracksSuccessITSTPCTRD, nTracksSuccessTPCTRD, mGainCalibHistos.size());
67 if (mTrackletsRaw.size() != mTrackletsCalib.size()) {
68 LOG(error) <<
"TRD raw tracklet container size differs from calibrated tracklet container size";
73 LOG(alarm) <<
"No MCM noise map available. Please upload valid object to CCDB.";
76 LOGF(info,
"As input tracks are available: %lu ITS-TPC-TRD tracks and %lu TPC-TRD tracks", mTracksInITSTPCTRD.size(), mTracksInTPCTRD.size());
81 LOGF(info,
"Successfully processed %i tracks (%i from ITS-TPC-TRD and %i from TPC-TRD) and collected %lu angular residuals",
82 nTracksSuccessITSTPCTRD + nTracksSuccessTPCTRD, nTracksSuccessITSTPCTRD, nTracksSuccessTPCTRD, mAngResHistos.
getNEntries());
89 int nTracksSuccess = 0;
90 for (
const auto& trkIn : tracks) {
92 if (trkIn.getNtracklets() <
params.nTrackletsMinGainCalib) {
96 if (trkIn.getP() <
params.pMin || trkIn.getP() >
params.pMax) {
100 auto id = trkIn.getRefGlobalTrackId();
103 dEdxTPC = mTracksTPC[
id].getdEdx().dEdxTotTPC;
105 dEdxTPC = mTracksTPC[mTracksITSTPC[
id].getRefTPC()].getdEdx().dEdxTotTPC;
107 if (dEdxTPC < params.dEdxTPCMin || dEdxTPC >
params.dEdxTPCMax) {
111 if (std::isnan(trkIn.getSnp())) {
112 LOG(alarm) <<
"Track with invalid parameters found: " << trkIn.getRefGlobalTrackId();
116 for (
int iLayer =
NLAYER - 1; iLayer >= 0; --iLayer) {
117 if (trkIn.getTrackletIndex(iLayer) == -1) {
126 if (trkIn.getIsCrossingNeighbor(iLayer)) {
130 int trkltId = trkIn.getTrackletIndex(iLayer);
131 int trkltDet = mTrackletsRaw[trkltId].getDetector();
134 const auto& tracklet = mTrackletsRaw[trkltId];
136 auto q0 = tracklet.getQ0();
137 auto q1 = tracklet.getQ1();
138 auto q2 = tracklet.getQ2();
139 if (q0 == 0 || q1 == 0 || q2 == 0 || q0 >= 127 || q1 >= 127 || q2 >= 62) {
144 const auto& trackletCalib = mTrackletsCalib[trkltId];
145 float tgl = trkIn.getTgl();
155 float trkLength = sqrt(1 + snp * snp / (1 - snp * snp) + tgl * tgl);
156 if (TMath::Abs(trkLength) < 1) {
157 LOGP(warn,
"Invalid track length {} for angles snp {} and tgl {}", trkLength, snp, tgl);
161 float localGainCorr = 1.;
163 localGainCorr = mLocalGain->
getValue(trkltDet, tracklet.getPadCol(mApplyShift), tracklet.getPadRow());
165 if (TMath::Abs(localGainCorr) < 0.0001f) {
166 LOGP(warn,
"Invalid localGainCorr {} for det {}, pad col {}, pad row {}", localGainCorr, trkltDet, tracklet.getPadCol(mApplyShift), tracklet.getPadRow());
170 unsigned int dEdx = (q0 + q1 + q2) / trkLength / localGainCorr;
175 mGainCalibHistos.push_back(chamberOffset + dEdx);
181 return nTracksSuccess;
187 int nTracksSuccess = 0;
188 for (
const auto& trkIn : tracks) {
189 if (trkIn.getNtracklets() <
params.nTrackletsMin) {
191 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)) {
196 auto trkWork = trkIn;
197 bool trackFailed =
false;
199 trkWork.setChi2(0.f);
200 trkWork.resetCovariance(20);
202 if (std::isnan(trkWork.getSnp())) {
203 LOG(alarm) <<
"Track with invalid parameters found: " << trkWork.getRefGlobalTrackId();
209 for (
int iLayer =
NLAYER - 1; iLayer >= 0; --iLayer) {
210 if (trkWork.getTrackletIndex(iLayer) == -1) {
213 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
228 for (
int iLayer = currLayer + 1; iLayer <
NLAYER; ++iLayer) {
229 if (trkWork.getTrackletIndex(iLayer) == -1) {
232 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
247 for (
int iLayer = currLayer; iLayer >= 0; --iLayer) {
248 if (trkWork.getTrackletIndex(iLayer) == -1) {
251 if (mNoiseCalib && mNoiseCalib->
isTrackletFromNoisyMCM(mTrackletsRaw[trkWork.getTrackletIndex(iLayer)])) {
260 if (trkWork.getReducedChi2() >
params.chi2RedMax) {
265 float trkAngle = o2::math_utils::asin(trkWork.getSnp()) * TMath::RadToDeg();
266 int trkltId = trkWork.getTrackletIndex(iLayer);
269 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
270 float tiltCorrUp = tilt * trkWork.getTgl() * Geometry::cdrHght();
271 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
272 if (!((trkWork.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trkWork.getZ()) < padLength))) {
277 float trkltAngle = o2::math_utils::atan(trkltDy / Geometry::cdrHght()) * TMath::RadToDeg();
278 float angleDeviation = trkltAngle - trkAngle;
279 if (mAngResHistos.
addEntry(angleDeviation, trkAngle, mTrackletsRaw[trkltId].getDetector())) {
288 return nTracksSuccess;
299 int trkltId = trk.getTrackletIndex(iLayer);
300 int trkltDet = mTrackletsRaw[trkltId].getDetector();
305 LOGF(
debug,
"Track could not be rotated in tracklet coordinate system");
310 if (!propagator->PropagateToXBxByBz(trk, mTrackletsCalib[trkltId].getX(), mMaxSnp, mMaxStep, mMatCorr)) {
311 LOGF(
debug,
"Track propagation failed in layer %i (pt=%f, xTrk=%f, xToGo=%f)", iLayer, trk.getPt(), trk.getX(), mTrackletsCalib[trkltId].getX());
321 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
322 float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trk.getZ());
323 float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trk.getTgl();
324 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
325 if (!((trk.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trk.getZ()) < padLength))) {
329 std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp, zPosCorrUp};
330 std::array<float, 3> trkltCovUp;
331 mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp);
333 if (!trk.update(trkltPosUp, trkltCovUp)) {
334 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
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"