11 using namespace TrTrack;
14 float rigidityCorrection = 1;
17 float mfcor[2] = {0, 0};
18 retv = MagnetVarp::btempcor(fact, 0, 1);
21 retv = MagnetVarp::btempcor(fact, 0, 2);
24 if (mfcor[0] && mfcor[1])
25 rigidityCorrection = (mfcor[0] + mfcor[1]) / 2;
27 rigidityCorrection = mfcor[0];
29 rigidityCorrection = mfcor[1];
31 return rigidityCorrection == 0 ? 1 : rigidityCorrection;
34 static std::array<unsigned long int, numSpans>
patterns = {3, 5, 6, 7, 0, 0, 3};
41 return trackPtr->TestHitLayerJHasXY(1);
43 return trackPtr->TestHitLayerJHasXY(9);
45 return (trackPtr->TestHitLayerJHasXY(1) && trackPtr->TestHitLayerJHasXY(9));
51 throw std::runtime_error(
"Span not supported");
55 static constexpr std::array<double, 9>
powersOfTen = {1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8};
60 for (
int il = 2; il < 9; il++) {
61 if (!trackPtr->TestHitLayerJ(il))
74 bool TrTrackBaseData::_FitIDExists(
Fit fit,
Span span)
const {
75 auto itr = _fit_ID.find(fit);
76 if (itr ==
end(_fit_ID)) {
80 auto fit_ID_itr = itr->second.find(span);
81 if (fit_ID_itr ==
end(itr->second)) {
85 return (fit_ID_itr->second > 0);
88 Span TrTrackBaseData::_GetBestSpan(
Fit fit)
const {
97 void TrTrackBaseData::Fill(TrTrackR *trackPtr) {
99 static const int refit = _isMC ? 3 : 1;
101 const float tmpCharge = floor(trackPtr->GetInnerQ_all(_beta).Mean + 0.5);
102 const float fitMass = tmpCharge > 1 ?
static_cast<float>(0.5 * TrFit::Mhelium * tmpCharge) : TrTrackR::DefaultMass;
116 trackPtr->iTrTrackPar(
fitAlgoCode[fit], static_cast<int>(
patterns[span]), 20 + refit, fitMass, tmpCharge);
118 if (_fit_ID[fit][span] > 0) {
119 RigidityCorr[fit][span] =
120 static_cast<float>(_isMC ? trackPtr->GetRigidity(_fit_ID[fit][span], 1)
121 : trackPtr->GetCorrectedRigidity(_fit_ID[fit][span], 3, 1));
123 static_cast<float>(trackPtr->GetChisqX(_fit_ID[fit][span]) / trackPtr->GetNdofX(_fit_ID[fit][span]));
125 static_cast<float>(trackPtr->GetChisqY(_fit_ID[fit][span]) / trackPtr->GetNdofY(_fit_ID[fit][span]));
141 for (
int ijl = 0; ijl < 9; ijl++) {
162 if (trackPtr->GetHitLJ(ijl + 1)) {
163 LayerChargeStatus[ijl] = trackPtr->GetHitLJ(ijl + 1)->GetQStatus();
165 float rigidity = (_fit_ID[fit][span] > 0)
166 ? RigidityCorr[fit][span]
169 LayerChargeXY[ijl][
ChargeRecoType::STD] = trackPtr->GetHitLJ(ijl + 1)->GetQ(2, _beta, rigidity);
170 LayerChargeXY[ijl][
ChargeRecoType::HL] = trackPtr->GetLayerJQH(ijl + 1, 2, _beta, _fit_ID[fit][span]);
171 LayerChargeXY[ijl][
ChargeRecoType::YJ] = trackPtr->GetLayerQYJ(ijl + 1, 2, _beta, _fit_ID[fit][span]);
176 void TrTrackPlusData::Fill(TrTrackR *trackPtr) {
177 const auto &_beta = trkBase->_beta;
178 const int refit = trkBase->_isMC ? 3 : 1;
179 static unsigned int prescaleCounter = 0;
180 static float prescaleRigidityThreshold = -1;
182 if (trkBase->InnerCharge.empty())
185 auto *pev = AMSEventR::Head();
188 const float fitMass = tmpCharge > 1 ?
static_cast<float>(0.5 * TrFit::Mhelium * tmpCharge) : TrTrackR::DefaultMass;
190 auto getPartialPattern = [](TrTrackR *track,
unsigned int jLayer) {
191 unsigned int pattern = 0;
192 for (
unsigned int ijl = 2; ijl < 9; ijl++) {
193 if (track->TestHitLayerJ(ijl) && ijl != jLayer)
199 for (
unsigned int ijl = 2; ijl < 9; ijl++) {
200 TrackFeetDistance[ijl - 1] = pev->GetTkFeetDist(ijl, trackPtr);
204 for (
auto fit : fitTypes) {
209 for (
auto span : spanTypes) {
210 if (trkBase->FitIDExists(fit, span)) {
212 trackPtr->iTrTrackPar(
fitAlgoCode[fit], static_cast<int>(
patterns[span]), 20 + refit, fitMass, tmpCharge);
213 if (_fit_ID[fit][span] < 0)
215 Rigidity[fit][span] =
static_cast<float>(trackPtr->GetRigidity(_fit_ID[fit][span], 1));
217 RigidityTOI[fit][span] =
218 static_cast<float>(trkBase->_isMC ? trackPtr->GetRigidity(_fit_ID[fit][span], 0)
219 : trackPtr->GetCorrectedRigidity(_fit_ID[fit][span], 3, 0));
222 const TrTrackPar &trackPar = trackPtr->gTrTrackPar(_fit_ID[fit][span]);
223 InvRigErr[fit][span] =
static_cast<float>(trackPar.ErrRinv / (!trackPar.BcorrFlag ?
RigidityCorrection() : 1));
230 bool bypassPrescaling =
231 _beta > 0 && trkBase->RigidityCorr.at(fit).at(
Span::InnerOnly) < prescaleRigidityThreshold;
233 if (!prescaleCounter || bypassPrescaling) {
234 for (
unsigned int ijl = 2; ijl < 9; ijl++) {
235 if (trackPtr->TestHitLayerJ(ijl))
237 auto partialPattern = getPartialPattern(trackPtr, ijl);
239 int pfit_ID = trackPtr->iTrTrackPar(
fitAlgoCode[fit], partialPattern, 20 + refit, fitMass, tmpCharge);
243 const TrTrackPar &partialTrackPar = trackPtr->gTrTrackPar(pfit_ID);
244 PartialRigidity[ijl - 1][fit] =
246 PartialInvRigErr[ijl - 1][fit] =
248 PartialTrChiSq[ijl - 1][fit][
Side::X] =
static_cast<float>(partialTrackPar.ChisqX / partialTrackPar.NdofX);
249 PartialTrChiSq[ijl - 1][fit][
Side::Y] =
static_cast<float>(partialTrackPar.ChisqY / partialTrackPar.NdofY);
255 prescaleCounter = ++prescaleCounter % 100;
267 for (
int ijl = 0; ijl < 9; ijl++) {
289 if (trkBase->FitIDExists(fit, span))
290 fit_ID = _fit_ID.at(fit).at(span);
292 if (trackPtr->GetHitLJ(ijl + 1)) {
294 (_fit_ID[fit][span] > 0)
295 ? trkBase->RigidityCorr.at(fit).at(span)
302 if (trackPtr->GetHitLJ(ijl + 1)->GetXCluster())
303 LayerEdep[ijl][
Side::X] = trackPtr->GetHitLJ(ijl + 1)->GetXCluster()->GetEdep();
304 if (trackPtr->GetHitLJ(ijl + 1)->GetYCluster())
305 LayerEdep[ijl][
Side::Y] = trackPtr->GetHitLJ(ijl + 1)->GetYCluster()->GetEdep();
314 for (
int ijl = 0; ijl < 9; ijl++) {
315 if (trackPtr->GetHitLJ(ijl + 1) && trackPtr->GetHitLJ(ijl + 1)->GetXCluster())
316 TrTrackHitPos[ijl][
Side::X] = static_cast<float>(trackPtr->GetHitCooLJ(ijl + 1).x());
317 if (trackPtr->GetHitLJ(ijl + 1) && trackPtr->GetHitLJ(ijl + 1)->GetYCluster())
318 TrTrackHitPos[ijl][
Side::Y] = static_cast<float>(trackPtr->GetHitCooLJ(ijl + 1).y());
323 for (
auto fit : fitTypes) {
324 for (
auto span : spanTypes) {
325 if (trkBase->FitIDExists(fit, span)) {
326 int fit_ID = _fit_ID.at(fit).at(span);
332 TrTrackFitPos[fitPos][fit][span][
Side::X] =
static_cast<float>(trackPos.x());
333 TrTrackFitPos[fitPos][fit][span][
Side::Y] =
static_cast<float>(trackPos.y());
341 Theta =
static_cast<float>(trackPtr->GetTheta(_fit_ID.at(
Fit::Choutko).at(bestspan)));
342 Phi =
static_cast<float>(trackPtr->GetPhi(_fit_ID.at(
Fit::Choutko).at(bestspan)));
345 for (
auto fit : fitTypes) {
346 for (
auto span : spanTypes) {
347 if (trkBase->FitIDExists(fit, span)) {
348 int fit_ID = _fit_ID.at(fit).at(span);
351 for (
int ijl = 0; ijl < 9; ijl++) {
352 if (trackPtr->GetHitLJ(ijl + 1)) {
353 AMSPoint point = trackPtr->GetResidualJ(ijl + 1, fit_ID);
354 TrTrackResidual[ijl][fit][span][
Side::X] =
static_cast<float>(point.x());
355 TrTrackResidual[ijl][fit][span][
Side::Y] =
static_cast<float>(point.y());
362 static constexpr std::array<float, 5> window = {0.1, 1., 2., 5., 10.};
365 for (
int jLayer = 1; jLayer <= 9; jLayer++) {
366 ClusterSignalRatio[jLayer - 1] = pev->GetTrackerRawSignalRatio(jLayer, 10);
369 TrClusterR *trackClusterPtrX = trackPtr->GetHitLJ(jLayer) ? trackPtr->GetHitLJ(jLayer)->GetXCluster() :
nullptr;
370 TrClusterR *trackClusterPtrY = trackPtr->GetHitLJ(jLayer) ? trackPtr->GetHitLJ(jLayer)->GetYCluster() :
nullptr;
378 static constexpr
float noiseThreshold = 0;
380 for (
int icl = 0; icl < pev->nTrCluster(); icl++) {
381 auto *cluster = pev->pTrCluster(icl);
383 if (!cluster || cluster->GetLayerJ() != jLayer)
386 float edep = 1000 * cluster->GetEdep();
387 if (cluster == trackClusterPtrX) {
392 if (cluster == trackClusterPtrY) {
398 if (edep < noiseThreshold)
402 float clusterDistanceToTrack = std::numeric_limits<float>::max();
403 for (
int im = 0; im < cluster->GetMultiplicity(); im++) {
404 float coo = cluster->GetGCoord(im);
406 clusterDistanceToTrack =
407 std::min(clusterDistanceToTrack, fabs(static_cast<float>(fitcoo[cluster->GetSide()] - coo)));
414 if (edep > MaxClusterEdep[jLayer - 1][side]) {
415 MaxClusterEdep[jLayer - 1][side] = edep;
416 MaxClusterDistance[jLayer - 1][side] = clusterDistanceToTrack;
420 for (
unsigned int iw = 0; iw < window.size(); iw++) {
421 if (std::fabs(clusterDistanceToTrack) < window[iw]) {
430 void TrTrackBaseData::FillElectronVars(TrTrackR *trackPtr,
bool refitKalman) {
437 _fit_ID[fit][span] = trackPtr->iTrTrackPar(
fitAlgoCode[fit], static_cast<int>(
patterns[span]), 22,
438 static_cast<float>(TrFit::Melectron), 1);
440 if (_fit_ID[fit][span] > 0) {
441 RigidityCorr[fit][span] =
442 static_cast<float>(_isMC ? trackPtr->GetRigidity(_fit_ID[fit][span], 1)
443 : trackPtr->GetCorrectedRigidity(_fit_ID[fit][span], 3, 1));
445 static_cast<float>(trackPtr->GetChisqX(_fit_ID[fit][span]) / trackPtr->GetNdofX(_fit_ID[fit][span]));
447 static_cast<float>(trackPtr->GetChisqY(_fit_ID[fit][span]) / trackPtr->GetNdofY(_fit_ID[fit][span]));
452 void TrTrackPlusData::FillElectronVars(TrTrackR *trackPtr,
float zEcalCOG,
bool refitKalman) {
453 const auto &base_fit_ID = trkBase->_fit_ID;
459 if (trkBase->FitIDExists(fit, span) && refitKalman) {
460 int fit_ID = base_fit_ID.at(fit).at(span);
461 Rigidity[fit][span] =
static_cast<float>(trackPtr->GetRigidity(fit_ID, 1));
462 RigidityTOI[fit][span] =
static_cast<float>(trkBase->_isMC ? trackPtr->GetRigidity(fit_ID, 0)
463 : trackPtr->GetCorrectedRigidity(fit_ID, 3, 0));
464 const TrTrackPar &trackPar = trackPtr->gTrTrackPar(fit_ID);
465 InvRigErr[fit][span] =
static_cast<float>(trackPar.ErrRinv / (!trackPar.BcorrFlag ?
RigidityCorrection() : 1));
469 if (zEcalCOG < std::numeric_limits<float>::max()) {
470 for (
auto fit : fitTypes) {
471 for (
auto span : spanTypes) {
472 if (trkBase->FitIDExists(fit, span)) {
473 int fit_ID = base_fit_ID.at(fit).at(span);
476 trackPtr->Interpolate(zEcalCOG, trackPos, trackDir, fit_ID);
Track constructed with the upper part of the inner tracker (layers 2 to 6)
static bool TrackHasExtHits(TrTrackR *trackPtr, Span span)
Track constructed with the upper part of the inner tracker (layers 3 to 8)
static double RigidityCorrection()
constexpr std::array< Span, numSpans > spanTypes
constexpr std::array< float, numFitPositionHeights > fitPositionHeightZ
void ComputePatterns(TrTrackR *trackPtr)
constexpr std::array< Fit, numFits > fitTypes
Track constructed with inner tracker + layer9 hits.
GenFit kalman filter track fit.
TrTrack container class description.
std::array< int, numFits > fitAlgoCode
SingleTreeChain::EventItr end(SingleTreeChain &chain)
Track constructed without correcting for multiple scattering.
GenFit kalman filter track fit assuming electron mass.
static constexpr std::array< double, 9 > powersOfTen
static std::array< unsigned long int, numSpans > patterns
Standard tracker charge reconstruction.
constexpr std::array< FitPositionHeight, numFitPositionHeights > fitPositionHeights