File indexing completed on 2023-03-17 11:13:42
0001 #include "L1Trigger/TrackFindingTMTT/interface/Make3Dtracks.h"
0002 #include "L1Trigger/TrackFindingTMTT/interface/L1track2D.h"
0003 #include "L1Trigger/TrackFindingTMTT/interface/Settings.h"
0004
0005 #include <iostream>
0006 #include <unordered_set>
0007
0008 using namespace std;
0009
0010 namespace tmtt {
0011
0012 class Settings;
0013
0014
0015
0016 Make3Dtracks::Make3Dtracks(const Settings* settings,
0017 unsigned int iPhiSec,
0018 unsigned int iEtaReg,
0019 float etaMinSector,
0020 float etaMaxSector,
0021 float phiCentreSector)
0022 :
0023 settings_(settings),
0024 iPhiSec_(iPhiSec),
0025 iEtaReg_(iEtaReg),
0026 etaMinSector_(etaMinSector),
0027 etaMaxSector_(etaMaxSector),
0028 phiCentreSector_(phiCentreSector),
0029
0030
0031 runRZfilter_(not settings->useRZfilter().empty()) {
0032
0033 if (runRZfilter_)
0034 rzFilter_ =
0035 std::make_unique<TrkRZfilter>(settings_, iPhiSec_, iEtaReg_, etaMinSector_, etaMaxSector_, phiCentreSector_);
0036 }
0037
0038
0039
0040
0041 void Make3Dtracks::makeUnfilteredTrks(const list<L1track2D>& vecTracksRphi) {
0042 vecTracks3D_unfiltered_.clear();
0043
0044 for (const L1track2D& trkRphi : vecTracksRphi) {
0045 const vector<Stub*>& stubsOnTrkRphi = trkRphi.stubs();
0046
0047 float qOverPt = trkRphi.helix2D().first;
0048 float phi0 = trkRphi.helix2D().second;
0049
0050 if (settings_->enableDigitize()) {
0051
0052
0053 const float small = 0.1;
0054 const unsigned int nHelixBits = 18;
0055 qOverPt += (2. / settings_->invPtToInvR()) * small * settings_->kf_oneOver2rRange() / pow(2., nHelixBits);
0056 phi0 += small * settings_->kf_phi0Range() / pow(2., nHelixBits);
0057 }
0058 pair<float, float> helixRphi(qOverPt, phi0);
0059
0060
0061 float z0 = 0.;
0062 float tan_lambda = 0.5 * (1 / tan(2 * atan(exp(-etaMinSector_))) + 1 / tan(2 * atan(exp(-etaMaxSector_))));
0063
0064 pair<float, float> helixRz(z0, tan_lambda);
0065
0066
0067 L1track3D trk3D(settings_,
0068 stubsOnTrkRphi,
0069 trkRphi.cellLocationHT(),
0070 helixRphi,
0071 helixRz,
0072 iPhiSec_,
0073 iEtaReg_,
0074 trkRphi.optoLinkID(),
0075 trkRphi.mergedHTcell());
0076
0077
0078
0079 bool cheat_keep = true;
0080 if (settings_->trackFitCheat())
0081 cheat_keep = trk3D.cheat();
0082
0083
0084 if (cheat_keep)
0085 vecTracks3D_unfiltered_.push_back(trk3D);
0086 }
0087 }
0088
0089
0090
0091
0092 void Make3Dtracks::makeRZfilteredTrks(const list<L1track2D>& vecTracksRphi) {
0093 vecTracks3D_rzFiltered_ = rzFilter_->filterTracks(vecTracksRphi);
0094
0095
0096
0097 if (settings_->trackFitCheat()) {
0098 list<L1track3D> vecTracks3D_tmp;
0099 for (const L1track3D& trk : vecTracks3D_rzFiltered_) {
0100 L1track3D trk_tmp = trk;
0101 bool cheat_keep = trk_tmp.cheat();
0102 if (cheat_keep)
0103 vecTracks3D_tmp.push_back(trk_tmp);
0104 }
0105 vecTracks3D_rzFiltered_ = vecTracks3D_tmp;
0106 }
0107 }
0108
0109
0110
0111
0112
0113 vector<const L1track3D*> Make3Dtracks::assocTrackCands3D(const TP& tp, bool rzFiltered) const {
0114 const list<L1track3D>& allTracks3D = (rzFiltered) ? vecTracks3D_rzFiltered_ : vecTracks3D_unfiltered_;
0115
0116 vector<const L1track3D*> assocRecoTrk;
0117
0118
0119 for (const L1track3D& trk : allTracks3D) {
0120 if (trk.matchedTP() != nullptr) {
0121 if (trk.matchedTP()->index() == tp.index())
0122 assocRecoTrk.push_back(&trk);
0123 }
0124 }
0125
0126 return assocRecoTrk;
0127 }
0128
0129 }