191 for (
const auto& track :
m_tracks) {
192 std::shared_ptr<CDCDedxTrack> dedxTrack = std::make_shared<CDCDedxTrack>();
193 dedxTrack->m_track = mtrack++;
199 B2WARNING(
"No related fit for track ...");
213 dedxTrack->m_pdg = mcpart->
getPDG();
214 dedxTrack->m_mcmass = mcpart->
getMass();
216 dedxTrack->m_motherPDG = mother ? mother->
getPDG() : 0;
218 const ROOT::Math::XYZVector trueMomentum = mcpart->
getMomentum();
219 dedxTrack->m_pTrue = trueMomentum.R();
220 dedxTrack->m_cosThetaTrue = cos(trueMomentum.Theta());
223 dedxTrack->m_pdg = -999;
227 const ROOT::Math::XYZVector& trackMom = fitResult->
getMomentum();
228 dedxTrack->m_p = trackMom.R();
229 bool nomom = (dedxTrack->m_p != dedxTrack->m_p);
230 double costh = std::cos(std::atan(1 / fitResult->
getCotTheta()));
233 costh = cos(trackMom.Theta());
236 dedxTrack->m_cosTheta = costh;
237 dedxTrack->m_charge = charge;
239 double injring = -1.0, injtime = -1.0;
241 if (m_TTDInfo.
isValid() && m_TTDInfo->hasInjection()) {
242 injring = m_TTDInfo->isHER();
243 injtime = m_TTDInfo->getTimeSinceLastInjectionInMicroSeconds();
245 dedxTrack->m_injring = injring;
246 dedxTrack->m_injtime = injtime;
251 B2WARNING(
"No related track for this fit...");
257 B2ERROR(
"GFTrack is pruned, please run CDCDedxPID only on unpruned tracks! Skipping this track.");
274 if ((abs(costh + 0.860) < 0.010) || (abs(costh - 0.955) <= 0.005))isEdge =
true;
277 bool isvalidTime =
true;
278 if (injtime < 0 || injring < 0)isvalidTime =
false;
283 double layerdE = 0.0;
284 double layerdx = 0.0;
286 int nhitscombined = 0;
287 int wirelongesthit = 0;
288 double longesthit = 0;
293 const std::vector< genfit::AbsTrackRep* >& gftrackRepresentations = recoTrack->
getRepresentations();
295 for (std::vector< genfit::TrackPoint* >::const_iterator tp = gftrackPoints.begin();
296 tp != gftrackPoints.end(); ++tp) {
299 genfit::AbsMeasurement* aAbsMeasurementPtr = (*tp)->getRawMeasurement(0);
301 if (!cdcRecoHit)
continue;
303 if (!cdcHit)
continue;
307 const genfit::AbsFitterInfo* fi = (*tp)->getFitterInfo();
309 B2DEBUG(29,
"No fitter info, skipping...");
320 int foundByTrackFinder = 0;
325 double weightPionHypo = 0;
326 double weightProtHypo = 0;
327 double weightKaonHypo = 0;
329 for (std::vector<genfit::AbsTrackRep* >::const_iterator trep = gftrackRepresentations.begin();
330 trep != gftrackRepresentations.end(); ++trep) {
331 const int pdgCode = TMath::Abs((*trep)->getPDG());
336 const genfit::KalmanFitterInfo* kalmanFitterInfo = (*tp)->getKalmanFitterInfo(*trep);
337 if (kalmanFitterInfo == NULL) {
343 std::vector<double> weights = kalmanFitterInfo->getWeights();
344 const double maxWeight = weights[0] > weights[1] ? weights[0] : weights[1];
345 if (pdgCode ==
Const::pion.getPDGCode()) weightPionHypo = maxWeight;
346 else if (pdgCode ==
Const::kaon.getPDGCode()) weightKaonHypo = maxWeight;
347 else if (pdgCode ==
Const::proton.getPDGCode()) weightProtHypo = maxWeight;
352 int currentLayer = (superlayer == 0) ? layer : (8 + (superlayer - 1) * 6 + layer);
353 int nextLayer = currentLayer;
356 const int iwire = (superlayer == 0) ? 160 * layer + wire :
m_nLayerWires[superlayer - 1] + (160 + 32 *
357 (superlayer - 1)) * layer + wire;
360 const bool lastHit = (tp + 1 == gftrackPoints.end());
361 bool lastHitInCurrentLayer = lastHit;
364 genfit::AbsMeasurement* aAbsMeasurementPtrNext = (*(tp + 1))->getRawMeasurement(0);
367 if (!nextcdcRecoHit || !(cdcRecoHit->
getCDCHit()) || !((*(tp + 1))->getFitterInfo())) {
371 const int nextILayer = nextcdcHit->
getILayer();
373 nextLayer = (nextSuperlayer == 0) ? nextILayer : (8 + (nextSuperlayer - 1) * 6 + nextILayer);
374 lastHitInCurrentLayer = (nextLayer != currentLayer);
378 const ROOT::Math::XYZVector& wirePosF = cdcgeo.
wireForwardPosition(wireID, CDCGeometryPar::c_Aligned);
386 double topHeight = outer - wirePosF.Rho();
387 double bottomHeight = wirePosF.Rho() - inner;
388 double cellHeight = topHeight + bottomHeight;
389 double topHalfWidth = M_PI * outer / nWires;
390 double bottomHalfWidth = M_PI * inner / nWires;
391 double cellHalfWidth = M_PI * wirePosF.Rho() / nWires;
402 const genfit::MeasuredStateOnPlane& mop = fi->getFittedState();
405 ROOT::Math::XYZVector fittedPoca = ROOT::Math::XYZVector(mop.getPos());
406 const ROOT::Math::XYZVector& pocaMom = ROOT::Math::XYZVector(mop.getMom());
407 if (tp == gftrackPoints.begin() || cdcMom == 0) {
408 cdcMom = pocaMom.R();
409 dedxTrack->m_pCDC = cdcMom;
412 dedxTrack->m_p = cdcMom;
421 ROOT::Math::XYZVector pocaOnWire = ROOT::Math::XYZVector(mop.getPlane()->getO());
424 ROOT::Math::XYZVector B2WireDoca = fittedPoca - pocaOnWire;
427 double doca = B2WireDoca.Rho();
428 double phidiff = fittedPoca.Phi() - pocaOnWire.Phi();
431 if (phidiff > -3.1416 && (phidiff < 0 || phidiff > 3.1416)) doca *= -1;
434 const double px = pocaMom.X();
435 const double py = pocaMom.Y();
436 const double wx = pocaOnWire.X();
437 const double wy = pocaOnWire.Y();
438 const double cross = wx * py - wy * px;
439 const double dot = wx * px + wy * py;
440 double entAng = atan2(cross,
dot);
443 double cellR = 2 * cellHalfWidth / cellHeight;
445 if (std::abs(2 *
atan(1) - std::abs(entAng)) < 0.01)tana = 100 * (entAng / std::abs(entAng));
446 else tana = std::tan(entAng);
447 double docaRS = doca * std::sqrt((1 + cellR * cellR * tana * tana) / (1 + tana * tana));
448 double entAngRS = std::atan(tana / cellR);
453 && numMCParticles == 0) ?
m_DBNonlADC->getCorrectedADC(adcbaseCount, currentLayer) : adcbaseCount;
455 double hitCharge = translator.
getCharge(adcCount, wireID,
false, pocaOnWire.Z(), pocaMom.Phi());
459 double dadcCount = 1.0 * adcCount;
460 if (dedxTrack->m_scale != 0) dadcCount /= dedxTrack->m_scale;
463 double driftDRealistic = realistictdc.
getDriftLength(driftT, wireID, 0,
true, pocaOnWire.Z(), pocaMom.Phi(), pocaMom.Theta());
464 double driftDRealisticRes = realistictdc.
getDriftLengthResolution(driftDRealistic, wireID,
true, pocaOnWire.Z(), pocaMom.Phi(),
468 double celldx = c.dx(doca, entAng);
474 double normDocaRS = docaRS / cellHalfWidth;
476 && numMCParticles == 0) ?
m_DB2DCell->getMean(currentLayer, normDocaRS, entAngRS) : 1.0;
484 double correction = dedxTrack->m_runGain * dedxTrack->m_cosCor * dedxTrack->m_cosEdgeCor * dedxTrack->m_timeGain * wiregain *
490 if (correction != 0) dadcCount = dadcCount / correction;
493 double cellDedx = (dadcCount / celldx);
496 if (nomom) cellDedx *= std::sin(std::atan(1 / fitResult->
getCotTheta()));
497 else cellDedx *= std::sin(trackMom.Theta());
499 dedxTrack->addHit(wire, iwire, currentLayer, doca, docaRS, entAng, entAngRS,
500 adcCount, adcbaseCount, hitCharge, celldx, cellDedx, cellHeight, cellHalfWidth, driftT,
501 driftDRealistic, driftDRealisticRes, wiregain, twodcor, onedcor,
502 foundByTrackFinder, weightPionHypo, weightKaonHypo, weightProtHypo);
507 if (correction != 0) {
509 layerdE += dadcCount;
512 if (celldx > longesthit) {
514 wirelongesthit = iwire;
519 }
catch (genfit::Exception&) {
520 B2WARNING(
"Track: " << mtrack <<
": genfit::MeasuredStateOnPlane exception...");
525 if (lastHitInCurrentLayer) {
527 double totalDistance;
528 if (nomom) totalDistance = layerdx / std::sin(std::atan(1 / fitResult->
getCotTheta()));
529 else totalDistance = layerdx / std::sin(trackMom.Theta());
530 double layerDedx = layerdE / totalDistance;
534 dedxTrack->addDedx(nhitscombined, wirelongesthit, currentLayer, totalDistance, layerDedx);
538 saveLookupLogl(dedxTrack->m_cdcLogl, dedxTrack->m_pCDC, layerDedx);
555 if (dedxTrack->m_lDedx.empty()) {
556 B2DEBUG(29,
"Found track with no hits, ignoring.");
560 const int numDedx = dedxTrack->m_lDedx.size();
564 dedxTrack->m_lNHitsUsed = highEdgeTrunc - lowEdgeTrunc;
574 &(dedxTrack->m_dedxAvgTruncatedNoSat),
575 &(dedxTrack->m_dedxAvgTruncatedErr),
579 if (numMCParticles == 0)
580 dedxTrack->m_dedxAvgTruncated =
D2I(costh,
I2D(costh, 1.00) / 1.00 * dedxTrack->m_dedxAvgTruncatedNoSat);
581 else dedxTrack->m_dedxAvgTruncated = dedxTrack->m_dedxAvgTruncatedNoSat;
585 if (numMCParticles != 0 && dedxTrack->m_mcmass > 0 && dedxTrack->m_pTrue != 0) {
587 double mean =
getMean(dedxTrack->m_pCDC / dedxTrack->m_mcmass);
588 double sigma =
getSigma(mean, dedxTrack->m_lNHitsUsed,
589 dedxTrack->m_cosTheta, dedxTrack->m_timeReso);
590 dedxTrack->m_simDedx = gRandom->Gaus(mean, sigma);
591 while (dedxTrack->m_simDedx < 0)
592 dedxTrack->m_simDedx = gRandom->Gaus(mean, sigma);
594 dedxTrack->m_dedxAvgTruncated = dedxTrack->m_simDedx;
598 saveChiValue(dedxTrack->m_cdcChi, dedxTrack->m_predmean, dedxTrack->m_predres, dedxTrack->m_pCDC, dedxTrack->m_dedxAvgTruncated,
599 dedxTrack->m_cosTheta, dedxTrack->m_lNHitsUsed, dedxTrack->m_timeReso);
601 saveLookupLogl(dedxTrack->m_cdcLogl, dedxTrack->m_pCDC, dedxTrack->m_dedxAvgTruncated);
609 pidvalues[pdgIter.getIndex()] = -0.5 * dedxTrack->m_cdcChi[pdgIter.getIndex()] * dedxTrack->m_cdcChi[pdgIter.getIndex()];
613 pidvalues[pdgIter.getIndex()] = dedxTrack->m_cdcLogl[pdgIter.getIndex()];
618 track.addRelationTo(likelihoodObj);
622 track.addRelationTo(newCDCDedxTrack);