178 std::vector<o2::InteractionTimeRecord> intRecs;
182 throw std::invalid_argument(
"initialization of MCKinematicsReader failed");
188 if (mTPCTracksArray.size()) {
189 LOGP(info,
"Found {} TPC tracks", mTPCTracksArray.size());
190 mTPCRefitter = std::make_unique<o2::gpu::GPUO2InterfaceRefit>(mTPCClusterIdxStruct, &mTPCCorrMapsLoader, prop->getNominalBz(), mTPCTrackClusIdx.data(), 0, mTPCRefitterShMap.data(), mTPCRefitterOccMap.data(), mTPCRefitterOccMap.size(),
nullptr,
o2::base::Propagator::Instance());
191 mTPCRefitter->setTrackReferenceX(900);
195 std::vector<short> clSector, clRow;
196 std::vector<float> clX, clY, clZ;
198 auto dumpClusters = [
this] {
200 const auto* corrMap = this->mTPCCorrMapsLoader.getCorrMap();
201 for (
int sector = 0; sector < 36; sector++) {
202 float alp = ((sector % 18) * 20 + 10) * TMath::DegToRad();
203 float sn = TMath::Sin(alp), cs = TMath::Cos(alp);
205 for (
int ic = 0; ic < this->mTPCClusterIdxStruct->
nClusters[sector][
row]; ic++) {
206 const auto cl = this->mTPCClusterIdxStruct->
clusters[sector][
row][ic];
207 float x,
y,
z, xG, yG;
208 corrMap->TransformIdeal(sector,
row, cl.getPad(), cl.getTime(),
x,
y,
z, 0);
210 LOGP(
debug,
"tf:{} s:{} r:{} p:{} t:{} qm:{} qt:{} f:{} x:{} y:{} z:{}",
tf, sector,
row, cl.getPad(), cl.getTime(), cl.getQmax(), cl.getQtot(), cl.getFlags(),
x,
y,
z);
211 (*mDBGOutCl) <<
"tpccl"
212 <<
"tf=" <<
tf <<
"sect=" << sector <<
"row=" <<
row <<
"pad=" << cl.getPad() <<
"time=" << cl.getTime() <<
"qmax=" << cl.getQmax() <<
"qtot=" << cl.getQtot()
213 <<
"sigT=" << cl.getSigmaTime() <<
"sigP=" << cl.getSigmaPad()
214 <<
"flags=" << cl.getFlags()
215 <<
"x=" <<
x <<
"y=" <<
y <<
"z=" <<
z <<
"xg=" << xG <<
"yg=" << yG
227 for (
size_t itr = 0; itr < mTPCTracksArray.size(); itr++) {
228 auto tr = mTPCTracksArray[itr];
230 if (tr.hasBothSidesClusters()) {
233 side = tr.hasASideClustersOnly() ? 1 : -1;
238 int retVal = mUseGPUModel ? this->mTPCRefitter->RefitTrackAsGPU(trc, this->mTPCTracksArray[itr].getClusterRef(), t, &chi2Out,
false,
true) : this->mTPCRefitter->RefitTrackAsTrackParCov(trc, this->mTPCTracksArray[itr].getClusterRef(), t, &chi2Out,
false,
true);
240 LOGP(warn,
"Refit failed ({}) with time={}: track#{}[{}]",
retVal, t,
counter, trc.asString());
247 if (!trc.rotate(tr.getAlpha())) {
248 LOGP(warn,
"Rotation to original track alpha {} failed, track#{}[{}]", tr.getAlpha(),
counter, trc.asString());
251 float xtgt = this->mXRef;
256 if (!prop->PropagateToXBxByBz(trc, xtgt)) {
257 LOGP(warn,
"Propagation to X={} failed, track#{}[{}]", xtgt,
counter, trc.asString());
263 auto prepClus = [
this, &tr, &clSector, &clRow, &clX, &clY, &clZ](
float t) {
269 int count = tr.getNClusters();
271 for (
int ic =
count; ic--;) {
273 cl = &tr.getCluster(this->mTPCTrackClusIdx, ic, *this->mTPCClusterIdxStruct, sector,
row);
274 clSector.push_back(sector);
275 clRow.push_back(
row);
277 mTPCCorrMapsLoader.Transform(sector,
row, cl->getPad(), cl->getTime(),
x,
y,
z, t);
286 auto trf = tr.getOuterParam();
287 if (!trackRefit(trf, tr.getTime0()) || !trackProp(trf)) {
292 if (!trackProp(tr)) {
296 prepClus(tr.getTime0());
299 (*mDBGOut) <<
"tpcIni"
302 <<
"iniTrackRef=" << trf
304 <<
"time=" << tr.getTime0()
305 <<
"clSector=" << clSector
317 auto lbl = mTPCTrkLabels[itr];
318 if (!lbl.isValid() || !(mcTrack = mcReader.
getTrack(lbl))) {
321 long bc = intRecs[lbl.getEventID()].toLong();
322 float bcTB =
bc / 8. + tpcTBBias;
326 TParticlePDG* pPDG = TDatabasePDG::Instance()->GetParticle(mcTrack->
GetPdgCode());
333 if (!mctrO2.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(mctrO2, tr.getX())) {
338 auto trfm = tr.getOuterParam();
340 if (!trackRefit(trfm, bcTB) || !trfm.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(trfm, tr.getX())) {
341 LOGP(warn,
"Failed to propagate MC-time refitted track#{} [{}] to X/alpha of original track [{}]",
counter, trfm.asString(), tr.asString());
345 dz = (tr.getTime0() - bcTB) * vdriftTB;
346 if (tr.hasCSideClustersOnly()) {
351 (*mDBGOut) <<
"tpcMC"
353 <<
"movTrackRef=" << trfm
354 <<
"mcTrack=" << mctrO2
356 <<
"imposedTB=" << bcTB
366 float tmin = tr.getTime0() - tr.getDeltaTBwd();
367 float tmax = tr.getTime0() + tr.getDeltaTFwd();
368 for (
int it = 0; it < mNMoves; it++) {
369 float tb = tmin + it * (tmax - tmin) / (mNMoves - 1);
370 auto trfm = tr.getOuterParam();
372 if (!trackRefit(trfm, tb) || !trfm.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(trfm, tr.getX())) {
373 LOGP(warn,
"Failed to propagate time={} refitted track#{} [{}] to X/alpha of original track [{}]", tb,
counter, trfm.asString(), tr.asString());
377 dz = (tr.getTime0() - tb) * vdriftTB;
378 if (tr.hasCSideClustersOnly()) {
382 int mnm = mNMoves - 1;
384 (*mDBGOut) <<
"tpcMov"
388 <<
"movTrackRef=" << trfm;
390 (*mDBGOut) <<
"tpcMov"
391 <<
"iniTrackRef=" << trf <<
"time=" << tr.getTime0();
393 (*mDBGOut) <<
"tpcMov"
395 <<
"imposedTB=" << tb
ServiceRegistryRef services()
The services registry associated with this processing context.