192 for (
const auto& track :
m_tracks) {
193 std::shared_ptr<CDCDedxTrack> dedxTrack = std::make_shared<CDCDedxTrack>();
194 dedxTrack->m_track = mtrack++;
200 B2WARNING(
"No related fit for track ...");
214 dedxTrack->m_pdg = mcpart->
getPDG();
215 dedxTrack->m_mcmass = mcpart->
getMass();
217 dedxTrack->m_motherPDG = mother ? mother->
getPDG() : 0;
219 const ROOT::Math::XYZVector trueMomentum = mcpart->
getMomentum();
220 dedxTrack->m_pTrue = trueMomentum.R();
221 dedxTrack->m_cosThetaTrue = cos(trueMomentum.Theta());
224 dedxTrack->m_pdg = -999;
228 const ROOT::Math::XYZVector& trackMom = fitResult->
getMomentum();
229 dedxTrack->m_p = trackMom.R();
230 bool nomom = (dedxTrack->m_p != dedxTrack->m_p);
231 double costh = std::cos(std::atan(1 / fitResult->
getCotTheta()));
234 costh = cos(trackMom.Theta());
237 dedxTrack->m_cosTheta = costh;
238 dedxTrack->m_charge = charge;
240 double injring = -1.0, injtime = -1.0;
242 if (m_TTDInfo.
isValid() && m_TTDInfo->hasInjection()) {
243 injring = m_TTDInfo->isHER();
244 injtime = m_TTDInfo->getTimeSinceLastInjectionInMicroSeconds();
246 dedxTrack->m_injring = injring;
247 dedxTrack->m_injtime = injtime;
252 B2WARNING(
"No related track for this fit...");
258 B2ERROR(
"GFTrack is pruned, please run CDCDedxPID only on unpruned tracks! Skipping this track.");
272 if ((abs(costh + 0.860) < 0.010) || (abs(costh - 0.955) <= 0.005))isEdge =
true;
275 bool isvalidTime =
true;
276 if (injtime < 0 || injring < 0)isvalidTime =
false;
281 double layerdE = 0.0;
282 double layerdx = 0.0;
284 int nhitscombined = 0;
285 int wirelongesthit = 0;
286 double longesthit = 0;
291 const std::vector< genfit::AbsTrackRep* >& gftrackRepresentations = recoTrack->
getRepresentations();
293 for (std::vector< genfit::TrackPoint* >::const_iterator tp = gftrackPoints.begin();
294 tp != gftrackPoints.end(); ++tp) {
297 genfit::AbsMeasurement* aAbsMeasurementPtr = (*tp)->getRawMeasurement(0);
299 if (!cdcRecoHit)
continue;
301 if (!cdcHit)
continue;
305 const genfit::AbsFitterInfo* fi = (*tp)->getFitterInfo();
307 B2DEBUG(29,
"No fitter info, skipping...");
318 int foundByTrackFinder = 0;
323 double weightPionHypo = 0;
324 double weightProtHypo = 0;
325 double weightKaonHypo = 0;
327 for (std::vector<genfit::AbsTrackRep* >::const_iterator trep = gftrackRepresentations.begin();
328 trep != gftrackRepresentations.end(); ++trep) {
329 const int pdgCode = TMath::Abs((*trep)->getPDG());
334 const genfit::KalmanFitterInfo* kalmanFitterInfo = (*tp)->getKalmanFitterInfo(*trep);
335 if (kalmanFitterInfo == NULL) {
341 std::vector<double> weights = kalmanFitterInfo->getWeights();
342 const double maxWeight = weights[0] > weights[1] ? weights[0] : weights[1];
343 if (pdgCode ==
Const::pion.getPDGCode()) weightPionHypo = maxWeight;
344 else if (pdgCode ==
Const::kaon.getPDGCode()) weightKaonHypo = maxWeight;
345 else if (pdgCode ==
Const::proton.getPDGCode()) weightProtHypo = maxWeight;
350 int currentLayer = (superlayer == 0) ? layer : (8 + (superlayer - 1) * 6 + layer);
351 int nextLayer = currentLayer;
354 const int iwire = (superlayer == 0) ? 160 * layer + wire :
m_nLayerWires[superlayer - 1] + (160 + 32 *
355 (superlayer - 1)) * layer + wire;
358 const bool lastHit = (tp + 1 == gftrackPoints.end());
359 bool lastHitInCurrentLayer = lastHit;
362 genfit::AbsMeasurement* aAbsMeasurementPtrNext = (*(tp + 1))->getRawMeasurement(0);
365 if (!nextcdcRecoHit || !(cdcRecoHit->
getCDCHit()) || !((*(tp + 1))->getFitterInfo())) {
369 const int nextILayer = nextcdcHit->
getILayer();
371 nextLayer = (nextSuperlayer == 0) ? nextILayer : (8 + (nextSuperlayer - 1) * 6 + nextILayer);
372 lastHitInCurrentLayer = (nextLayer != currentLayer);
376 const ROOT::Math::XYZVector& wirePosF = cdcgeo.
wireForwardPosition(wireID, CDCGeometryPar::c_Aligned);
384 double topHeight = outer - wirePosF.Rho();
385 double bottomHeight = wirePosF.Rho() - inner;
386 double cellHeight = topHeight + bottomHeight;
387 double topHalfWidth = M_PI * outer / nWires;
388 double bottomHalfWidth = M_PI * inner / nWires;
389 double cellHalfWidth = M_PI * wirePosF.Rho() / nWires;
400 const genfit::MeasuredStateOnPlane& mop = fi->getFittedState();
403 ROOT::Math::XYZVector fittedPoca = ROOT::Math::XYZVector(mop.getPos());
404 const ROOT::Math::XYZVector& pocaMom = ROOT::Math::XYZVector(mop.getMom());
405 if (tp == gftrackPoints.begin() || cdcMom == 0) {
406 cdcMom = pocaMom.R();
407 dedxTrack->m_pCDC = cdcMom;
410 dedxTrack->m_p = cdcMom;
419 ROOT::Math::XYZVector pocaOnWire = ROOT::Math::XYZVector(mop.getPlane()->getO());
422 ROOT::Math::XYZVector B2WireDoca = fittedPoca - pocaOnWire;
425 double doca = B2WireDoca.Rho();
426 double phidiff = fittedPoca.Phi() - pocaOnWire.Phi();
429 if (phidiff > -3.1416 && (phidiff < 0 || phidiff > 3.1416)) doca *= -1;
432 const double px = pocaMom.X();
433 const double py = pocaMom.Y();
434 const double wx = pocaOnWire.X();
435 const double wy = pocaOnWire.Y();
436 const double cross = wx * py - wy * px;
437 const double dot = wx * px + wy * py;
438 double entAng = atan2(cross,
dot);
441 double cellR = 2 * cellHalfWidth / cellHeight;
443 if (std::abs(2 *
atan(1) - std::abs(entAng)) < 0.01)tana = 100 * (entAng / std::abs(entAng));
444 else tana = std::tan(entAng);
445 double docaRS = doca * std::sqrt((1 + cellR * cellR * tana * tana) / (1 + tana * tana));
446 double entAngRS = std::atan(tana / cellR);
451 && numMCParticles == 0) ?
m_DBNonlADC->getCorrectedADC(adcbaseCount, currentLayer) : adcbaseCount;
453 double hitCharge = translator.
getCharge(adcCount, wireID,
false, pocaOnWire.Z(), pocaMom.Phi());
457 double dadcCount = 1.0 * adcCount;
458 if (dedxTrack->m_scale != 0) dadcCount /= dedxTrack->m_scale;
461 double driftDRealistic = realistictdc.
getDriftLength(driftT, wireID, 0,
true, pocaOnWire.Z(), pocaMom.Phi(), pocaMom.Theta());
462 double driftDRealisticRes = realistictdc.
getDriftLengthResolution(driftDRealistic, wireID,
true, pocaOnWire.Z(), pocaMom.Phi(),
466 double celldx = c.dx(doca, entAng);
475 double normDocaRS = docaRS / cellHalfWidth;
477 && numMCParticles == 0) ?
m_DB2DCell->getMean(currentLayer, normDocaRS, entAngRS) : 1.0;
485 double correction = dedxTrack->m_runGain * cosCor * dedxTrack->m_cosEdgeCor * dedxTrack->m_timeGain * wiregain *
491 if (correction != 0) dadcCount = dadcCount / correction;
494 double cellDedx = (dadcCount / celldx);
497 if (nomom) cellDedx *= std::sin(std::atan(1 / fitResult->
getCotTheta()));
498 else cellDedx *= std::sin(trackMom.Theta());
500 dedxTrack->addHit(wire, iwire, currentLayer, doca, docaRS, entAng, entAngRS,
501 adcCount, adcbaseCount, hitCharge, celldx, cellDedx, cellHeight, cellHalfWidth, driftT,
502 driftDRealistic, driftDRealisticRes, cosCor, wiregain, twodcor, onedcor,
503 foundByTrackFinder, weightPionHypo, weightKaonHypo, weightProtHypo);
508 if (correction != 0) {
510 layerdE += dadcCount;
513 if (celldx > longesthit) {
515 wirelongesthit = iwire;
520 }
catch (genfit::Exception&) {
521 B2WARNING(
"Track: " << mtrack <<
": genfit::MeasuredStateOnPlane exception...");
526 if (lastHitInCurrentLayer) {
528 double totalDistance;
529 if (nomom) totalDistance = layerdx / std::sin(std::atan(1 / fitResult->
getCotTheta()));
530 else totalDistance = layerdx / std::sin(trackMom.Theta());
531 double layerDedx = layerdE / totalDistance;
535 dedxTrack->addDedx(nhitscombined, wirelongesthit, currentLayer, totalDistance, layerDedx);
539 saveLookupLogl(dedxTrack->m_cdcLogl, dedxTrack->m_pCDC, layerDedx);
556 if (dedxTrack->m_lDedx.empty()) {
557 B2DEBUG(29,
"Found track with no hits, ignoring.");
561 const int numDedx = dedxTrack->m_lDedx.size();
565 dedxTrack->m_lNHitsUsed = highEdgeTrunc - lowEdgeTrunc;
575 &(dedxTrack->m_dedxAvgTruncatedNoSat),
576 &(dedxTrack->m_dedxAvgTruncatedErr),
580 if (numMCParticles == 0)
581 dedxTrack->m_dedxAvgTruncated =
D2I(costh,
I2D(costh, 1.00) / 1.00 * dedxTrack->m_dedxAvgTruncatedNoSat);
582 else dedxTrack->m_dedxAvgTruncated = dedxTrack->m_dedxAvgTruncatedNoSat;
586 if (numMCParticles != 0 && dedxTrack->m_mcmass > 0 && dedxTrack->m_pTrue != 0) {
588 double mean =
getMean(dedxTrack->m_pCDC / dedxTrack->m_mcmass);
589 double sigma =
getSigma(mean, dedxTrack->m_lNHitsUsed,
590 dedxTrack->m_cosTheta, dedxTrack->m_timeReso);
591 dedxTrack->m_simDedx = gRandom->Gaus(mean, sigma);
592 while (dedxTrack->m_simDedx < 0)
593 dedxTrack->m_simDedx = gRandom->Gaus(mean, sigma);
595 dedxTrack->m_dedxAvgTruncated = dedxTrack->m_simDedx;
599 saveChiValue(dedxTrack->m_cdcChi, dedxTrack->m_predmean, dedxTrack->m_predres, dedxTrack->m_pCDC, dedxTrack->m_dedxAvgTruncated,
600 dedxTrack->m_cosTheta, dedxTrack->m_lNHitsUsed, dedxTrack->m_timeReso);
602 saveLookupLogl(dedxTrack->m_cdcLogl, dedxTrack->m_pCDC, dedxTrack->m_dedxAvgTruncated);
610 pidvalues[pdgIter.getIndex()] = -0.5 * dedxTrack->m_cdcChi[pdgIter.getIndex()] * dedxTrack->m_cdcChi[pdgIter.getIndex()];
614 pidvalues[pdgIter.getIndex()] = dedxTrack->m_cdcLogl[pdgIter.getIndex()];
619 track.addRelationTo(likelihoodObj);
623 track.addRelationTo(newCDCDedxTrack);