177 std::vector<o2::InteractionTimeRecord> intRecs;
181 throw std::invalid_argument(
"initialization of MCKinematicsReader failed");
187 if (mTPCTracksArray.size()) {
188 LOGP(info,
"Found {} TPC tracks", mTPCTracksArray.size());
189 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());
190 mTPCRefitter->setTrackReferenceX(900);
194 std::vector<short> clSector, clRow;
195 std::vector<float> clX, clY, clZ;
197 auto dumpClusters = [
this] {
199 const auto* corrMap = this->mTPCCorrMapsLoader.getCorrMap();
200 for (
int sector = 0; sector < 36; sector++) {
201 float alp = ((sector % 18) * 20 + 10) * TMath::DegToRad();
202 float sn = TMath::Sin(alp), cs = TMath::Cos(alp);
204 for (
int ic = 0; ic < this->mTPCClusterIdxStruct->
nClusters[sector][
row]; ic++) {
205 const auto cl = this->mTPCClusterIdxStruct->
clusters[sector][
row][ic];
206 float x,
y,
z, xG, yG;
207 corrMap->TransformIdeal(sector,
row, cl.getPad(), cl.getTime(),
x,
y,
z, 0);
209 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);
210 (*mDBGOutCl) <<
"tpccl"
211 <<
"tf=" <<
tf <<
"sect=" << sector <<
"row=" <<
row <<
"pad=" << cl.getPad() <<
"time=" << cl.getTime() <<
"qmax=" << cl.getQmax() <<
"qtot=" << cl.getQtot()
212 <<
"sigT=" << cl.getSigmaTime() <<
"sigP=" << cl.getSigmaPad()
213 <<
"flags=" << cl.getFlags()
214 <<
"x=" <<
x <<
"y=" <<
y <<
"z=" <<
z <<
"xg=" << xG <<
"yg=" << yG
226 for (
size_t itr = 0; itr < mTPCTracksArray.size(); itr++) {
227 auto tr = mTPCTracksArray[itr];
229 if (tr.hasBothSidesClusters()) {
232 side = tr.hasASideClustersOnly() ? 1 : -1;
237 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);
239 LOGP(warn,
"Refit failed ({}) with time={}: track#{}[{}]",
retVal, t,
counter, trc.asString());
246 if (!trc.rotate(tr.getAlpha())) {
247 LOGP(warn,
"Rotation to original track alpha {} failed, track#{}[{}]", tr.getAlpha(),
counter, trc.asString());
250 float xtgt = this->mXRef;
255 if (!prop->PropagateToXBxByBz(trc, xtgt)) {
256 LOGP(warn,
"Propagation to X={} failed, track#{}[{}]", xtgt,
counter, trc.asString());
262 auto prepClus = [
this, &tr, &clSector, &clRow, &clX, &clY, &clZ](
float t) {
268 int count = tr.getNClusters();
270 for (
int ic =
count; ic--;) {
272 cl = &tr.getCluster(this->mTPCTrackClusIdx, ic, *this->mTPCClusterIdxStruct, sector,
row);
273 clSector.push_back(sector);
274 clRow.push_back(
row);
276 mTPCCorrMapsLoader.Transform(sector,
row, cl->getPad(), cl->getTime(),
x,
y,
z, t);
285 auto trf = tr.getOuterParam();
286 if (!trackRefit(trf, tr.getTime0()) || !trackProp(trf)) {
291 if (!trackProp(tr)) {
295 prepClus(tr.getTime0());
298 (*mDBGOut) <<
"tpcIni"
301 <<
"iniTrackRef=" << trf
303 <<
"time=" << tr.getTime0()
304 <<
"clSector=" << clSector
316 auto lbl = mTPCTrkLabels[itr];
317 if (!lbl.isValid() || !(mcTrack = mcReader.
getTrack(lbl))) {
320 long bc = intRecs[lbl.getEventID()].toLong();
321 float bcTB =
bc / 8. + tpcTBBias;
325 TParticlePDG* pPDG = TDatabasePDG::Instance()->GetParticle(mcTrack->
GetPdgCode());
332 if (!mctrO2.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(mctrO2, tr.getX())) {
337 auto trfm = tr.getOuterParam();
339 if (!trackRefit(trfm, bcTB) || !trfm.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(trfm, tr.getX())) {
340 LOGP(warn,
"Failed to propagate MC-time refitted track#{} [{}] to X/alpha of original track [{}]",
counter, trfm.asString(), tr.asString());
344 dz = (tr.getTime0() - bcTB) * vdriftTB;
345 if (tr.hasCSideClustersOnly()) {
350 (*mDBGOut) <<
"tpcMC"
352 <<
"movTrackRef=" << trfm
353 <<
"mcTrack=" << mctrO2
355 <<
"imposedTB=" << bcTB
365 float tmin = tr.getTime0() - tr.getDeltaTBwd();
366 float tmax = tr.getTime0() + tr.getDeltaTFwd();
367 for (
int it = 0; it < mNMoves; it++) {
368 float tb = tmin + it * (tmax - tmin) / (mNMoves - 1);
369 auto trfm = tr.getOuterParam();
371 if (!trackRefit(trfm, tb) || !trfm.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(trfm, tr.getX())) {
372 LOGP(warn,
"Failed to propagate time={} refitted track#{} [{}] to X/alpha of original track [{}]", tb,
counter, trfm.asString(), tr.asString());
376 dz = (tr.getTime0() - tb) * vdriftTB;
377 if (tr.hasCSideClustersOnly()) {
381 int mnm = mNMoves - 1;
383 (*mDBGOut) <<
"tpcMov"
387 <<
"movTrackRef=" << trfm;
389 (*mDBGOut) <<
"tpcMov"
390 <<
"iniTrackRef=" << trf <<
"time=" << tr.getTime0();
392 (*mDBGOut) <<
"tpcMov"
394 <<
"imposedTB=" << tb
ServiceRegistryRef services()
The services registry associated with this processing context.