12 using namespace TrTrack;
14 static std::array<unsigned long int, numSpans>
patterns = {3, 5, 6, 7, 0, 0};
21 return trackPtr->TestHitLayerJHasXY(1);
23 return trackPtr->TestHitLayerJHasXY(9);
25 return (trackPtr->TestHitLayerJHasXY(1) && trackPtr->TestHitLayerJHasXY(9));
30 throw std::runtime_error(
"Span not supported");
34 static constexpr std::array<double, 9>
powersOfTen = {1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8};
39 for (
int il = 2; il < 9; il++) {
40 if (!trackPtr->TestHitLayerJ(il))
53 bool TrTrackBaseData::_FitIDExists(
Fit fit,
Span span)
const {
54 auto itr = _fit_ID.find(fit);
55 if (itr ==
end(_fit_ID)) {
59 auto fit_ID_itr = itr->second.find(span);
60 if (fit_ID_itr ==
end(itr->second)) {
64 return (fit_ID_itr->second > 0);
67 Span TrTrackBaseData::_GetBestSpan(
Fit fit)
const {
85 pars.
charge =
static_cast<int>(inner_charge + 0.5f);
88 pars.mass = TrFit::Mproton;
90 pars.mass = TrFit::Mhelium / 2.0f * pars.charge;
93 if (pars.charge ==
static_cast<int>(production_charge + 0.5f))
105 AMSPlane pl_TOI_top(TVector3(0, 0, 195), TVector3(1, 0, 0), TVector3(0, 1, 0));
106 AMSPlane pl_TOI_bot(TVector3(0, 0, -195), TVector3(1, 0, 0), TVector3(0, 1, 0));
107 AMSPlane pl_RICH(TVector3(0, 0, -70), TVector3(1, 0, 0), TVector3(0, 1, 0));
110 AMSPlane pl_TrCenter(TVector3(0, 0, 0), TVector3(1, 0, 0), TVector3(0, 1, 0));
111 std::array<AMSPlane, numFitPositionHeights> pl_TrPlanes{
112 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[0]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
113 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[1]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
114 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[2]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
115 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[3]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
116 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[4]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
117 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[5]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
118 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[6]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
119 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[7]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
120 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[8]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
121 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[9]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
122 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[10]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
123 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[11]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
124 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[12]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
125 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[13]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
126 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[14]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
127 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[15]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
128 AMSPlane(TVector3(0, 0,
fitPositionHeightZ[16]), TVector3(1, 0, 0), TVector3(0, 1, 0)),
132 bool TrTrackBaseData::Fill(TrTrackR *trackPtr, TrTrackFillType type) {
136 if (type == TrTrackFillType::Standalone) {
142 float tmp_inner_charge = trackPtr->GetQ_all(_beta, temp_fit_ID).Mean;
145 if (tmp_inner_charge > 1.5) {
146 auto tmp_inner_charge_YJ = trackPtr->GetQYJ_all(2, _beta, temp_fit_ID).InnerQ;
147 if (tmp_inner_charge_YJ > 8.5)
148 tmp_inner_charge = tmp_inner_charge_YJ;
151 FitCharge = tmp_inner_charge;
153 auto fitPars =
InitTrkReFit(tmp_inner_charge, _isMC, FitCharge);
154 _tmpCharge = fitPars.charge;
160 if (type == TrTrackFillType::Standalone) {
182 if (type == TrTrackFillType::Standalone) {
196 _fit_ID[fit][span] = trackPtr->iTrTrackPar(
fitAlgoCode[fit],
static_cast<int>(
patterns[span]),
197 30 + fitPars.refit, fitPars.mass, _tmpCharge);
198 if (_fit_ID[fit][span] > 0) {
200 trackPtr->Interpolate(pl_TrCenter, rigidity, _fit_ID[fit][span]);
201 Rigidity[fit][span] =
static_cast<float>(rigidity);
203 static_cast<float>(trackPtr->GetChisqX(_fit_ID[fit][span]) / trackPtr->GetNdofX(_fit_ID[fit][span]));
205 static_cast<float>(trackPtr->GetChisqY(_fit_ID[fit][span]) / trackPtr->GetNdofY(_fit_ID[fit][span]));
211 trackPtr->RecalcHitCoordinates(0,
false,
false, _tmpCharge);
215 if (type == TrTrackFillType::Standalone) {
220 auto stdCharge = trackPtr->GetQ_all(_beta, base_fit_ID);
221 auto stdChargeInner = trackPtr->GetInnerQ_all(_beta, base_fit_ID);
223 auto hlCharge = trackPtr->GetQH_all(2, _beta, base_fit_ID);
224 auto hlChargeInner = trackPtr->GetInnerQH_all(2, _beta, base_fit_ID);
226 auto yj_opt = TrChargeYJ::DefaultCorOpt | TrChargeYJ::kPow;
229 if (_tmpCharge < 2.5) {
230 yj_opt |= TrChargeYJ::kSingle;
233 auto yjCharge = trackPtr->GetQYJ_all(2, _beta, base_fit_ID);
250 for (
int ijl = 0; ijl < 9; ijl++) {
252 if (!trackPtr->GetHitLJ(ijl + 1)) {
256 if (trackPtr->GetHitLJ(ijl + 1)->OnlyY()) {
263 AMSPlaneM plm = trackPtr->GetHitCooLJN(ijl + 1);
264 TVector3 mglob = plm.getMGlobal();
265 if (trackPtr->GetHitLJ(ijl + 1)->GetXCluster())
266 TrTrackHitPos[ijl][0] =
static_cast<float>(mglob.x());
267 if (trackPtr->GetHitLJ(ijl + 1)->GetYCluster())
268 TrTrackHitPos[ijl][1] =
static_cast<float>(mglob.y());
269 if (trackPtr->GetHitLJ(ijl + 1))
270 TrTrackHitPos[ijl][2] =
static_cast<float>(mglob.z());
273 if (type == TrTrackFillType::SecondTrack) {
278 for (
int ijl = 0; ijl < 9; ijl++) {
282 if (trackPtr->GetHitLJ(ijl + 1)) {
283 LayerChargeStatus[ijl] = trackPtr->GetHitLJ(ijl + 1)->GetQStatus();
285 LayerChargeXY[ijl][
ChargeRecoType::STD] = trackPtr->GetHitLJ(ijl + 1)->GetQ(2, _beta, Rigidity[fit][span]);
286 LayerChargeXY[ijl][
ChargeRecoType::HL] = trackPtr->GetLayerJQH(ijl + 1, 2, _beta, _fit_ID[fit][span]);
287 LayerChargeXY[ijl][
ChargeRecoType::YJ] = trackPtr->GetLayerQYJ(ijl + 1, 2, _beta, _fit_ID[fit][span]);
296 plm_res = trackPtr->GetHitCooLJN(fitPos + 1);
297 mglob = plm_res.getMGlobal();
300 if (type == TrTrackFillType::Standalone) {
318 if (type == TrTrackFillType::Standalone) {
331 if (FitIDExists(fit, span)) {
332 int fit_ID = _fit_ID.at(fit).at(span);
339 trackPtr->Interpolate(pl_TrPlanes[fitPos], rigidity, fit_ID);
340 TVector3 pglob_fitpos = pl_TrPlanes[fitPos].getP();
341 TrTrackFitPos[fitPos][fit][span][
Side::X] =
static_cast<float>(pglob_fitpos.x());
342 TrTrackFitPos[fitPos][fit][span][
Side::Y] =
static_cast<float>(pglob_fitpos.y());
351 bool TrTrackPlusData::Fill(TrTrackR *trackPtr) {
352 const auto &_beta = trkBase->_beta;
353 const auto &_tmpCharge = trkBase->_tmpCharge;
355 if (trkBase->InnerCharge.empty())
358 auto *pev = AMSEventR::Head();
360 int refit = ((trkBase->_isMC) || (_tmpCharge != trackPtr->GetAdvancedFitCharge())) ? 3 : 1;
361 float fitMass = (_tmpCharge >= 2) ? TrFit::Mhelium / 2 * _tmpCharge : TrFit::Mproton;
363 auto getPartialPattern = [](TrTrackR *track,
unsigned int jLayer) {
364 unsigned int pattern = 0;
365 for (
unsigned int ijl = 1; ijl < 10; ijl++) {
366 if (track->TestHitLayerJ(ijl) && ijl != jLayer)
372 for (
unsigned int ijl = 2; ijl < 9; ijl++) {
373 TrackFeetDistance[ijl - 1] = pev->GetTkFeetDist(ijl, trackPtr);
390 if (trkBase->FitIDExists(fit, span)) {
392 trackPtr->iTrTrackPar(
fitAlgoCode[fit],
static_cast<int>(
patterns[span]), 30 + refit, fitMass, _tmpCharge);
393 if (_fit_ID[fit][span] < 0)
396 AMSPlane &pl_TOI = _beta < 0 ? pl_TOI_bot : pl_TOI_top;
400 trackPtr->Interpolate(pl_TOI, rigidity, _fit_ID[fit][span], fitMass, _tmpCharge, 1, (_beta > 0) ? 1 : -1);
404 RigidityTOI[fit][span] =
static_cast<float>(rigidity * (_beta > 0 ? 1.0f : -1.0f));
406 trackPtr->Interpolate(pl_RICH, rigidity, _fit_ID[fit][span], fitMass, _tmpCharge, 1);
407 RigidityRICH[fit][span] =
static_cast<float>(rigidity);
409 const TrTrackPar &trackPar = trackPtr->gTrTrackPar(_fit_ID[fit][span]);
410 InvRigErr[fit][span] =
static_cast<float>(trackPar.ErrRinv);
413 trackPtr->Interpolate(pl_TOI, rigidity, _fit_ID[fit][span], fitMass, _tmpCharge, 1, (_beta > 0) ? 1 : -1);
414 Theta[fit][span] =
static_cast<float>(pl_TOI.getD().Theta());
415 Phi[fit][span] =
static_cast<float>(pl_TOI.getD().Phi());
421 trackPtr->RecalcHitCoordinates(0,
false,
false, _tmpCharge);
425 for (
unsigned int ijl = 1; ijl < 10; ijl++) {
426 if (!trackPtr->TestHitLayerJ(ijl))
428 auto partialPattern = getPartialPattern(trackPtr, ijl);
431 int pfit_ID = trackPtr->iTrTrackPar(
fitAlgoCode[fit], partialPattern, 30 + refit, fitMass, _tmpCharge);
436 const TrTrackPar &partialTrackPar = trackPtr->gTrTrackPar(pfit_ID);
437 PartialRigidity[ijl - 1][fit] = partialTrackPar.Rigidity;
438 PartialInvRigErr[ijl - 1][fit] = partialTrackPar.ErrRinv;
439 PartialTrChiSq[ijl - 1][fit][
Side::X] =
static_cast<float>(partialTrackPar.ChisqX / partialTrackPar.NdofX);
440 PartialTrChiSq[ijl - 1][fit][
Side::Y] =
static_cast<float>(partialTrackPar.ChisqY / partialTrackPar.NdofY);
444 trackPtr->Interpolate(pl_TrPlanes[ijl - 1], rigidity, pfit_ID);
445 TVector3 pglob_fitpos = pl_TrPlanes[ijl - 1].getP();
446 PartialTrTrackFitPos[ijl - 1][fit][
Side::X] =
static_cast<float>(pglob_fitpos.x());
447 PartialTrTrackFitPos[ijl - 1][fit][
Side::Y] =
static_cast<float>(pglob_fitpos.y());
451 AMSPlaneM plm_res = trackPtr->GetHitCooLJN(ijl + 1);
452 TVector3 mglob = plm_res.getMGlobal();
453 trackPtr->Interpolate(plm_res, rigidity, pfit_ID);
454 TVector3 pglob_res = plm_res.getP();
455 PartialTrTrackResidual[ijl - 1][fit][
Side::X] =
static_cast<float>(mglob.x() - pglob_res.x());
456 PartialTrTrackResidual[ijl - 1][fit][
Side::Y] =
static_cast<float>(mglob.y() - pglob_res.y());
460 trackPtr->RecalcHitCoordinates(0, 0, 0, _tmpCharge);
464 auto dir_span = trkBase->GetBestSpan(dir_fit);
465 if (trkBase->FitIDExists(dir_fit, dir_span)) {
466 const AMSDir trk_dir{Theta[dir_fit][dir_span], Phi[dir_fit][dir_span]};
470 AMSEventR::Head()->GetStoermerCutoff(tmp, -1, trk_dir);
471 DirectionalStoermerCutoff[0] = tmp;
472 AMSEventR::Head()->GetStoermerCutoff(tmp, 1, trk_dir);
473 DirectionalStoermerCutoff[1] = tmp;
479 if (trkBase->FitIDExists(base_fit, base_span)) {
480 int base_fit_ID = _fit_ID.at(base_fit).at(base_span);
482 for (
int ijl = 0; ijl < 9; ijl++) {
483 if (trackPtr->GetHitLJ(ijl + 1)) {
484 float rigidity = (base_fit_ID > 0) ? trkBase->Rigidity.at(base_fit).at(base_span) : 0;
486 if (!trackPtr->GetHitLJ(ijl + 1)->OnlyY()) {
492 if (trackPtr->GetHitLJ(ijl + 1)->GetXCluster())
493 LayerEdep[ijl][
Side::X] = trackPtr->GetHitLJ(ijl + 1)->GetXCluster()->GetEdep();
494 if (trackPtr->GetHitLJ(ijl + 1)->GetYCluster())
495 LayerEdep[ijl][
Side::Y] = trackPtr->GetHitLJ(ijl + 1)->GetYCluster()->GetEdep();
509 plm_res = trackPtr->GetHitCooLJN(fitPos + 1);
510 mglob = plm_res.getMGlobal();
514 if (trkBase->FitIDExists(fit, span)) {
515 int fit_ID = _fit_ID.at(fit).at(span);
521 trackPtr->Interpolate(pl_TrPlanes[fitPos], rigidity, fit_ID);
522 TVector3 pglob_fitpos = pl_TrPlanes[fitPos].getP();
527 if (!trackPtr->TestHitLayerJ(fitPos + 1))
529 trackPtr->Interpolate(plm_res, rigidity, fit_ID);
530 TVector3 pglob_res = plm_res.getP();
531 if (!trackPtr->GetHitLJ(fitPos + 1)->OnlyY()) {
532 TrTrackResidual[fitPos][fit][span][
Side::X] =
static_cast<float>(mglob.x() - pglob_res.x());
534 TrTrackResidual[fitPos][fit][span][
Side::Y] =
static_cast<float>(mglob.y() - pglob_res.y());
541 static constexpr std::array<float, 5> window = {0.1, 1., 2., 5., 10.};
544 for (
int jLayer = 1; jLayer <= 9; jLayer++) {
546 ClusterSignalRatio[jLayer - 1] = pev->GetTrackerRawSignalRatio(jLayer, 10);
549 TrClusterR *trackClusterPtrX = trackPtr->GetHitLJ(jLayer) ? trackPtr->GetHitLJ(jLayer)->GetXCluster() :
nullptr;
550 TrClusterR *trackClusterPtrY = trackPtr->GetHitLJ(jLayer) ? trackPtr->GetHitLJ(jLayer)->GetYCluster() :
nullptr;
555 TVector3 pglob = pl_TrPlanes[jLayer - 1].getP();
556 AMSPoint fitcoo = AMSPoint(pglob.x(), pglob.y(), pglob.z());
559 static constexpr
float noiseThreshold = 0;
561 for (
int icl = 0; icl < pev->nTrCluster(); icl++) {
562 auto *cluster = pev->pTrCluster(icl);
564 if (!cluster || cluster->GetLayerJ() != jLayer)
567 float edep = 1000 * cluster->GetEdep();
568 if (cluster == trackClusterPtrX) {
573 if (cluster == trackClusterPtrY) {
579 if (edep < noiseThreshold)
583 float clusterDistanceToTrack = std::numeric_limits<float>::max();
584 for (
int im = 0; im < cluster->GetMultiplicity(); im++) {
585 AMSPlaneM pl_mult = cluster->GetGCoordN(im);
586 TVector3 mglob_mult = pl_mult.getMGlobal();
588 clusterDistanceToTrack =
589 std::min(clusterDistanceToTrack,
590 fabs(
static_cast<float>(fitcoo[cluster->GetSide()] - mglob_mult[cluster->GetSide()])));
597 if (edep > MaxClusterEdep[jLayer - 1][side]) {
598 MaxClusterEdep[jLayer - 1][side] = edep;
599 MaxClusterDistance[jLayer - 1][side] = clusterDistanceToTrack;
603 for (
unsigned int iw = 0; iw < window.size(); iw++) {
604 if (std::fabs(clusterDistanceToTrack) < window[iw]) {
614 bool TrTrackBaseData::FillElectronVars(TrTrackR *trackPtr,
float zEcalCOG,
bool refitKalman) {
621 _fit_ID[fit][span] = trackPtr->iTrTrackPar(
fitAlgoCode[fit],
static_cast<int>(
patterns[span]), 32,
622 static_cast<float>(TrFit::Melectron), 1);
624 if (_fit_ID[fit][span] > 0) {
626 trackPtr->Interpolate(pl_TrCenter, rigidity, _fit_ID[fit][span], TrFit::Melectron, 1);
627 Rigidity[fit][span] =
static_cast<float>(rigidity);
629 static_cast<float>(trackPtr->GetChisqX(_fit_ID[fit][span]) / trackPtr->GetNdofX(_fit_ID[fit][span]));
631 static_cast<float>(trackPtr->GetChisqY(_fit_ID[fit][span]) / trackPtr->GetNdofY(_fit_ID[fit][span]));
637 if (zEcalCOG < std::numeric_limits<float>::max()) {
640 if (FitIDExists(fit, span)) {
641 int fit_ID = _fit_ID.at(fit).at(span);
643 AMSPlane plm(TVector3(0, 0, zEcalCOG), TVector3(1, 0, 0), TVector3(0, 1, 0));
644 trackPtr->Interpolate(plm, rigidity, fit_ID);
645 TVector3 pglob = plm.getP();
656 bool TrTrackPlusData::FillElectronVars(TrTrackR *trackPtr,
bool refitKalman) {
657 const auto &base_fit_ID = trkBase->_fit_ID;
658 const auto &_beta = trkBase->_beta;
663 if (trkBase->FitIDExists(fit, span) && refitKalman) {
664 AMSPlane &pl_TOI = _beta < 0 ? pl_TOI_bot : pl_TOI_top;
665 int fit_ID = base_fit_ID.at(fit).at(span);
668 float zpl = (_beta > 0) ? 195 : -195;
669 trackPtr->Interpolate(pl_TOI, rigidity, fit_ID, TrFit::Melectron, 1, 1, (_beta > 0) ? 1 : -1);
670 RigidityTOI[fit][span] =
static_cast<float>(rigidity);
672 AMSPlane pl_RICH(TVector3(0, 0, -70), TVector3(1, 0, 0), TVector3(0, 1, 0));
673 trackPtr->Interpolate(pl_RICH, rigidity, fit_ID, TrFit::Melectron, 1, 1);
674 RigidityRICH[fit][span] =
static_cast<float>(rigidity);
676 Theta[fit][span] =
static_cast<float>(pl_TOI.getD().Theta());
677 Phi[fit][span] =
static_cast<float>(pl_TOI.getD().Phi());
679 const TrTrackPar &trackPar = trackPtr->gTrTrackPar(fit_ID);
680 InvRigErr[fit][span] =
static_cast<float>(trackPar.ErrRinv);