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);