196 for (
const auto& track :
m_tracks) {
197 std::shared_ptr<CDCDedxTrack> dedxTrack = std::make_shared<CDCDedxTrack>();
198 dedxTrack->m_track = mtrack++;
204 B2WARNING(
"No related fit for track ...");
218 dedxTrack->m_pdg = mcpart->
getPDG();
219 dedxTrack->m_mcmass = mcpart->
getMass();
221 dedxTrack->m_motherPDG = mother ? mother->
getPDG() : 0;
223 const ROOT::Math::XYZVector trueMomentum = mcpart->
getMomentum();
224 dedxTrack->m_pTrue = trueMomentum.R();
225 dedxTrack->m_cosThetaTrue = cos(trueMomentum.Theta());
228 dedxTrack->m_pdg = -999;
232 const ROOT::Math::XYZVector& trackMom = fitResult->
getMomentum();
233 dedxTrack->m_p = trackMom.R();
234 bool nomom = (dedxTrack->m_p != dedxTrack->m_p);
235 double costh = std::cos(std::atan(1 / fitResult->
getCotTheta()));
238 costh = cos(trackMom.Theta());
241 dedxTrack->m_cosTheta = costh;
242 dedxTrack->m_charge = charge;
244 double injring = -1.0, injtime = -1.0;
246 if (m_TTDInfo.
isValid() && m_TTDInfo->hasInjection()) {
247 injring = m_TTDInfo->isHER();
248 injtime = m_TTDInfo->getTimeSinceLastInjectionInMicroSeconds();
250 dedxTrack->m_injring = injring;
251 dedxTrack->m_injtime = injtime;
256 B2WARNING(
"No related track for this fit...");
262 B2ERROR(
"GFTrack is pruned, please run CDCDedxPID only on unpruned tracks! Skipping this track.");
279 if ((abs(costh + 0.860) < 0.010) || (abs(costh - 0.955) <= 0.005))isEdge =
true;
282 bool isvalidTime =
true;
283 if (injtime < 0 || injring < 0)isvalidTime =
false;
288 double layerdE = 0.0;
289 double layerdx = 0.0;
291 int nhitscombined = 0;
292 int wirelongesthit = 0;
293 double longesthit = 0;
298 const std::vector< genfit::AbsTrackRep* >& gftrackRepresentations = recoTrack->
getRepresentations();
300 for (std::vector< genfit::TrackPoint* >::const_iterator tp = gftrackPoints.begin();
301 tp != gftrackPoints.end(); ++tp) {
304 genfit::AbsMeasurement* aAbsMeasurementPtr = (*tp)->getRawMeasurement(0);
306 if (!cdcRecoHit)
continue;
308 if (!cdcHit)
continue;
312 const genfit::AbsFitterInfo* fi = (*tp)->getFitterInfo();
314 B2DEBUG(29,
"No fitter info, skipping...");
325 int foundByTrackFinder = 0;
330 double weightPionHypo = 0;
331 double weightProtHypo = 0;
332 double weightKaonHypo = 0;
334 for (std::vector<genfit::AbsTrackRep* >::const_iterator trep = gftrackRepresentations.begin();
335 trep != gftrackRepresentations.end(); ++trep) {
336 const int pdgCode = TMath::Abs((*trep)->getPDG());
341 const genfit::KalmanFitterInfo* kalmanFitterInfo = (*tp)->getKalmanFitterInfo(*trep);
342 if (kalmanFitterInfo == NULL) {
348 std::vector<double> weights = kalmanFitterInfo->getWeights();
349 const double maxWeight = weights[0] > weights[1] ? weights[0] : weights[1];
350 if (pdgCode ==
Const::pion.getPDGCode()) weightPionHypo = maxWeight;
351 else if (pdgCode ==
Const::kaon.getPDGCode()) weightKaonHypo = maxWeight;
352 else if (pdgCode ==
Const::proton.getPDGCode()) weightProtHypo = maxWeight;
357 int currentLayer = (superlayer == 0) ? layer : (8 + (superlayer - 1) * 6 + layer);
358 int nextLayer = currentLayer;
361 const int iwire = (superlayer == 0) ? 160 * layer + wire :
m_nLayerWires[superlayer - 1] + (160 + 32 *
362 (superlayer - 1)) * layer + wire;
365 const bool lastHit = (tp + 1 == gftrackPoints.end());
366 bool lastHitInCurrentLayer = lastHit;
369 genfit::AbsMeasurement* aAbsMeasurementPtrNext = (*(tp + 1))->getRawMeasurement(0);
372 if (!nextcdcRecoHit || !(cdcRecoHit->
getCDCHit()) || !((*(tp + 1))->getFitterInfo())) {
376 const int nextILayer = nextcdcHit->
getILayer();
378 nextLayer = (nextSuperlayer == 0) ? nextILayer : (8 + (nextSuperlayer - 1) * 6 + nextILayer);
379 lastHitInCurrentLayer = (nextLayer != currentLayer);
383 const ROOT::Math::XYZVector& wirePosF = cdcgeo.
wireForwardPosition(wireID, CDCGeometryPar::c_Aligned);
391 double topHeight = outer - wirePosF.Rho();
392 double bottomHeight = wirePosF.Rho() - inner;
393 double cellHeight = topHeight + bottomHeight;
394 double topHalfWidth = M_PI * outer / nWires;
395 double bottomHalfWidth = M_PI * inner / nWires;
396 double cellHalfWidth = M_PI * wirePosF.Rho() / nWires;
407 const genfit::MeasuredStateOnPlane& mop = fi->getFittedState();
410 ROOT::Math::XYZVector fittedPoca = ROOT::Math::XYZVector(mop.getPos());
411 const ROOT::Math::XYZVector& pocaMom = ROOT::Math::XYZVector(mop.getMom());
412 if (tp == gftrackPoints.begin() || cdcMom == 0) {
413 cdcMom = pocaMom.R();
414 dedxTrack->m_pCDC = cdcMom;
417 dedxTrack->m_p = cdcMom;
426 ROOT::Math::XYZVector pocaOnWire = ROOT::Math::XYZVector(mop.getPlane()->getO());
429 ROOT::Math::XYZVector B2WireDoca = fittedPoca - pocaOnWire;
432 double doca = B2WireDoca.Rho();
433 double phidiff = fittedPoca.Phi() - pocaOnWire.Phi();
436 if (phidiff > -3.1416 && (phidiff < 0 || phidiff > 3.1416)) doca *= -1;
439 const double px = pocaMom.X();
440 const double py = pocaMom.Y();
441 const double wx = pocaOnWire.X();
442 const double wy = pocaOnWire.Y();
443 const double cross = wx * py - wy * px;
444 const double dot = wx * px + wy * py;
445 double entAng = atan2(cross,
dot);
448 double cellR = 2 * cellHalfWidth / cellHeight;
450 if (std::abs(2 *
atan(1) - std::abs(entAng)) < 0.01)tana = 100 * (entAng / std::abs(entAng));
451 else tana = std::tan(entAng);
452 double docaRS = doca * std::sqrt((1 + cellR * cellR * tana * tana) / (1 + tana * tana));
453 double entAngRS = std::atan(tana / cellR);
458 && numMCParticles == 0) ?
m_DBNonlADC->getCorrectedADC(adcbaseCount, currentLayer) : adcbaseCount;
460 double hitCharge = translator.
getCharge(adcCount, wireID,
false, pocaOnWire.Z(), pocaMom.Phi());
464 double dadcCount = 1.0 * adcCount;
465 if (dedxTrack->m_scale != 0) dadcCount /= dedxTrack->m_scale;
468 double driftDRealistic = realistictdc.
getDriftLength(driftT, wireID, 0,
true, pocaOnWire.Z(), pocaMom.Phi(), pocaMom.Theta());
469 double driftDRealisticRes = realistictdc.
getDriftLengthResolution(driftDRealistic, wireID,
true, pocaOnWire.Z(), pocaMom.Phi(),
473 double celldx = c.dx(doca, entAng);
479 double normDocaRS = docaRS / cellHalfWidth;
481 && numMCParticles == 0) ?
m_DB2DCell->getMean(currentLayer, normDocaRS, entAngRS) : 1.0;
489 double correction = dedxTrack->m_runGain * dedxTrack->m_cosCor * dedxTrack->m_cosEdgeCor * dedxTrack->m_timeGain * wiregain *
495 if (correction != 0) dadcCount = dadcCount / correction;
498 double cellDedx = (dadcCount / celldx);
501 if (nomom) cellDedx *= std::sin(std::atan(1 / fitResult->
getCotTheta()));
502 else cellDedx *= std::sin(trackMom.Theta());
505 dedxTrack->addHit(wire, iwire, currentLayer, doca, docaRS, entAng, entAngRS,
506 adcCount, adcbaseCount, hitCharge, celldx, cellDedx, cellHeight, cellHalfWidth, driftT,
507 driftDRealistic, driftDRealisticRes, wiregain, twodcor, onedcor,
508 foundByTrackFinder, weightPionHypo, weightKaonHypo, weightProtHypo);
513 if (correction != 0) {
515 layerdE += dadcCount;
518 if (celldx > longesthit) {
520 wirelongesthit = iwire;
525 }
catch (genfit::Exception&) {
526 B2WARNING(
"Track: " << mtrack <<
": genfit::MeasuredStateOnPlane exception...");
531 if (lastHitInCurrentLayer) {
533 double totalDistance;
534 if (nomom) totalDistance = layerdx / std::sin(std::atan(1 / fitResult->
getCotTheta()));
535 else totalDistance = layerdx / std::sin(trackMom.Theta());
536 double layerDedx = layerdE / totalDistance;
540 dedxTrack->addDedx(nhitscombined, wirelongesthit, currentLayer, totalDistance, layerDedx);
544 saveLookupLogl(dedxTrack->m_cdcLogl, dedxTrack->m_pCDC, layerDedx);
561 if (dedxTrack->m_lDedx.empty()) {
562 B2DEBUG(29,
"Found track with no hits, ignoring.");
566 const int numDedx = dedxTrack->m_lDedx.size();
570 dedxTrack->m_lNHitsUsed = highEdgeTrunc - lowEdgeTrunc;
580 &(dedxTrack->m_dedxAvgTruncatedNoSat),
581 &(dedxTrack->m_dedxAvgTruncatedErr),
585 if (numMCParticles == 0)
586 dedxTrack->m_dedxAvgTruncated =
D2I(costh,
I2D(costh, 1.00) / 1.00 * dedxTrack->m_dedxAvgTruncatedNoSat);
587 else dedxTrack->m_dedxAvgTruncated = dedxTrack->m_dedxAvgTruncatedNoSat;
591 if (numMCParticles != 0 && dedxTrack->m_mcmass > 0 && dedxTrack->m_pTrue != 0) {
593 double mean =
getMean(dedxTrack->m_pCDC / dedxTrack->m_mcmass);
594 double sigma =
getSigma(mean, dedxTrack->m_lNHitsUsed,
595 dedxTrack->m_cosTheta, dedxTrack->m_timeReso);
596 dedxTrack->m_simDedx = gRandom->Gaus(mean, sigma);
597 while (dedxTrack->m_simDedx < 0)
598 dedxTrack->m_simDedx = gRandom->Gaus(mean, sigma);
600 dedxTrack->m_dedxAvgTruncated = dedxTrack->m_simDedx;
604 saveChiValue(dedxTrack->m_cdcChi, dedxTrack->m_predmean, dedxTrack->m_predres, dedxTrack->m_pCDC, dedxTrack->m_dedxAvgTruncated,
605 dedxTrack->m_cosTheta, dedxTrack->m_lNHitsUsed, dedxTrack->m_timeReso);
607 saveLookupLogl(dedxTrack->m_cdcLogl, dedxTrack->m_pCDC, dedxTrack->m_dedxAvgTruncated);
615 pidvalues[pdgIter.getIndex()] = -0.5 * dedxTrack->m_cdcChi[pdgIter.getIndex()] * dedxTrack->m_cdcChi[pdgIter.getIndex()];
619 pidvalues[pdgIter.getIndex()] = dedxTrack->m_cdcLogl[pdgIter.getIndex()];
624 track.addRelationTo(likelihoodObj);
629 track.addRelationTo(newCDCDedxTrack);