29 KFbase::KFbase(
const Settings *settings,
const uint nHelixPar,
const string &fitterName,
const uint nMeas)
30 : TrackFitGeneric(settings, fitterName) {
31 nHelixPar_ = nHelixPar;
44 vector<Stub *> stubs = l1track3D.
stubs();
46 auto orderByLayer = [](
const Stub *
a,
const Stub *
b) {
return bool(
a->layerId() <
b->layerId()); };
47 sort(stubs.begin(), stubs.end(), orderByLayer);
50 const TP *tpa(
nullptr);
58 PrintL1trk() <<
"===============================================================================";
59 std::stringstream
text;
61 text <<
"Input track cand: [phiSec,etaReg]=[" << l1track3D.
iPhiSec() <<
"," << l1track3D.
iEtaReg() <<
"]";
63 <<
") q/pt=" << l1track3D.
qOverPt() <<
" tanL=" << l1track3D.
tanLambda() <<
" z0=" << l1track3D.
z0()
64 <<
" phi0=" << l1track3D.
phi0() <<
" nStubs=" << l1track3D.
numStubs() <<
" d0=" << l1track3D.
d0();
78 if (
cand !=
nullptr) {
103 double chi2rphi_bcon = 0.;
109 bool accepted =
true;
110 if (chi2scaled > kfLayerVsChiSqCut[
cand->nStubLayers()])
113 fitTrk.setBeamConstr(trackPars_bcon[
QOVERPT], trackPars_bcon[
PHI0], chi2rphi_bcon, accepted);
122 fitTrk.digitizeTrack(
"KF4ParamsComb");
124 if (!fitTrk.consistentSector()) {
126 PrintL1trk() <<
"Track rejected by sector consistency test";
137 bool goodTrack = (tpa && tpa->useForAlgEff());
139 int tpin = tpa->index();
140 PrintL1trk() <<
"TRACK LOST: eta=" << l1track3D.
iEtaReg() <<
" pt=" << l1track3D.
pt() <<
" tp=" << tpin;
142 for (
auto stub : stubs) {
144 this->
kalmanLayer(l1track3D.
iEtaReg(), stub->layerIdReduced(), stub->barrel(), stub->r(), stub->z());
145 std::stringstream
text;
147 text <<
" Stub: lay_red=" << stub->layerIdReduced() <<
" KFlay=" << kalmanLay <<
" r=" << stub->r()
148 <<
" z=" << stub->z() <<
" assoc TPs =";
149 for (
const TP *tp_i : stub->assocTPs())
150 text <<
" " << tp_i->index();
152 if (stub->assocTPs().empty())
161 if (tpa && tpa->useForAlgEff()) {
162 PrintL1trk() <<
"TP for eff. missed addr. index : " << tpa <<
" " << tpa->index();
177 map<unsigned int, const KalmanState *, std::greater<unsigned int>>
178 best_state_by_nstubs;
181 TVectorD x0 =
seedX(l1track3D);
182 TMatrixD pxx0 =
seedC(l1track3D);
186 const KalmanState *state0 =
mkState(l1track3D, 0, -1,
nullptr, x0, pxx0, K, dcov,
nullptr, 0, 0);
189 vector<const KalmanState *> new_states;
190 vector<const KalmanState *> prev_states;
191 prev_states.push_back(state0);
198 int etaReg = l1track3D.
iEtaReg();
199 map<int, vector<Stub *>> layerStubs;
201 for (
auto stub : stubs) {
203 int kalmanLay = this->
kalmanLayer(etaReg, stub->layerIdReduced(), stub->barrel(), stub->r(), stub->z());
207 layerStubs[kalmanLay].push_back(stub);
210 layerStubs[kalmanLay].back() = stub;
216 constexpr
unsigned int nTypicalLayers = 6;
220 int combinations_per_iteration = 0;
223 unsigned int kalmanMaxSkipLayers =
227 vector<const KalmanState *>::const_iterator i_state = prev_states.begin();
228 for (; i_state != prev_states.end(); i_state++) {
231 unsigned int layer = the_state->
nextLayer();
238 unsigned nSkippedDeadLayers = 0;
239 unsigned nSkippedAmbiguousLayers = 0;
240 while (kfDeadLayers.find(layer) != kfDeadLayers.end() && layerStubs[layer].empty()) {
242 ++nSkippedDeadLayers;
246 ++nSkippedAmbiguousLayers;
250 vector<const KalmanState *> next_states;
251 vector<const KalmanState *> next_states_skipped;
255 vector<Stub *> thislay_stubs = layerStubs[layer];
259 vector<Stub *> nextlay_stubs;
263 unsigned nSkippedDeadLayers_nextStubs = 0;
264 unsigned nSkippedAmbiguousLayers_nextStubs = 0;
265 if (nSkipped < kalmanMaxSkipLayers) {
266 if (kfDeadLayers.find(layer + 1) != kfDeadLayers.end() && layerStubs[layer + 1].empty()) {
267 nextlay_stubs = layerStubs[layer + 2];
268 nSkippedDeadLayers_nextStubs++;
270 nextlay_stubs = layerStubs[layer + 2];
271 nSkippedAmbiguousLayers_nextStubs++;
273 nextlay_stubs = layerStubs[layer + 1];
280 nextlay_stubs.empty())
282 <<
" : #thislay_stubs=" << thislay_stubs.size() <<
" #nextlay_stubs=" << nextlay_stubs.size()
283 <<
" layer=" << layer <<
" eta=" << l1track3D.
iEtaReg();
286 nSkipped += nSkippedDeadLayers;
287 nSkipped += nSkippedAmbiguousLayers;
293 vector<Stub *> temp_thislaystubs;
294 vector<Stub *> temp_nextlaystubs;
295 for (
auto stub : thislay_stubs) {
296 if (stub->psModule())
297 temp_thislaystubs.push_back(stub);
299 for (
auto stub : nextlay_stubs) {
300 if (stub->psModule())
301 temp_nextlaystubs.push_back(stub);
303 thislay_stubs = temp_thislaystubs;
304 nextlay_stubs = temp_nextlaystubs;
307 combinations_per_iteration += thislay_stubs.size() + nextlay_stubs.size();
310 for (
unsigned i = 0;
i < thislay_stubs.size();
i++) {
311 Stub *stub = thislay_stubs[
i];
318 next_states.push_back(new_state);
322 for (
unsigned i = 0;
i < nextlay_stubs.size();
i++) {
323 Stub *stub = nextlay_stubs[
i];
326 kalmanUpdate(nSkipped + 1 + nSkippedDeadLayers_nextStubs + nSkippedAmbiguousLayers_nextStubs,
327 layer + 1 + nSkippedDeadLayers_nextStubs + nSkippedAmbiguousLayers_nextStubs,
333 next_states_skipped.push_back(new_state);
338 return bool(
a->chi2scaled() <
b->chi2scaled());
340 sort(next_states.begin(), next_states.end(), orderByChi2);
341 sort(next_states_skipped.begin(), next_states_skipped.end(), orderByChi2);
343 new_states.insert(new_states.end(), next_states.begin(), next_states.end());
344 new_states.insert(new_states.end(), next_states_skipped.begin(), next_states_skipped.end());
351 return bool((
a->chi2scaled()) * (
a->nSkippedLayers() + 1) < (
b->chi2scaled()) * (
b->nSkippedLayers() + 1));
353 sort(new_states.begin(), new_states.end(), orderByMinSkipChi2);
358 best_state_by_nstubs[nStubs] = new_states[0];
367 prev_states = new_states;
372 if (not best_state_by_nstubs.empty()) {
374 finished_state = best_state_by_nstubs.begin()->second;
376 std::stringstream
text;
378 text <<
"Track found! final state selection: nLay=" << finished_state->
nStubLayers()
380 <<
" phiSec=" << l1track3D.
iPhiSec() <<
" etaReg=" << l1track3D.
iEtaReg() <<
" HT(m,c)=(" 383 text <<
" q/pt=" << y[
QOVERPT] <<
" tanL=" << y[
T] <<
" z0=" << y[
Z0] <<
" phi0=" << y[
PHI0];
386 text <<
" chosen from states:";
387 for (
const auto &
p : best_state_by_nstubs)
388 text <<
" " <<
p.second->chi2() <<
"/" <<
p.second->nStubLayers();
397 return finished_state;
414 TVectorD vecX =
state->vectorX();
415 TMatrixD matC =
state->matrixC();
418 PrintL1trk() <<
"STATE BARREL TO ENDCAP BEFORE ";
419 PrintL1trk() <<
"state : " << vecX[0] <<
" " << vecX[1] <<
" " << vecX[2] <<
" " << vecX[3];
424 PrintL1trk() <<
"STATE BARREL TO ENDCAP AFTER ";
425 PrintL1trk() <<
"state : " << vecX[0] <<
" " << vecX[1] <<
" " << vecX[2] <<
" " << vecX[3];
432 TMatrixD matFtrans(TMatrixD::kTransposed, matF);
439 TVectorD vecXref = matF * vecX;
468 TMatrixD matCref = matF * matC * matFtrans + matScat;
480 TMatrixD matRinv =
matrixRinv(matH, matCref, matV);
499 double new_chi2rphi = 0, new_chi2rz = 0;
504 PrintL1trk() <<
"adjusted x = " << new_vecX[0] <<
", " << new_vecX[1] <<
", " << new_vecX[2] <<
", " 507 PrintL1trk() <<
"adjusted x = " << new_vecX[0] <<
", " << new_vecX[1] <<
", " << new_vecX[2] <<
", " 508 << new_vecX[3] <<
", " << new_vecX[4];
511 PrintL1trk() <<
"adjust chi2rphi=" << new_chi2rphi <<
" chi2rz=" << new_chi2rz;
515 state->candidate(), nSkipped, layer,
state, new_vecX, new_matC, matK, matV, stub, new_chi2rphi, new_chi2rz);
526 const TVectorD &vecX,
527 const TMatrixD &matC,
528 const TMatrixD &matK,
529 const TMatrixD &matV,
533 auto new_state = std::make_unique<const KalmanState>(
534 settings_, candidate, nSkipped, layer, last_state, vecX, matC, matK, matV, stub, chi2rphi, chi2rz);
544 TMatrixD matHtrans(TMatrixD::kTransposed, matH);
545 return matH * matC * matHtrans;
550 TMatrixD
KFbase::matrixRinv(
const TMatrixD &matH,
const TMatrixD &matCref,
const TMatrixD &matV)
const {
552 TMatrixD matR = matV + matHCHt;
553 TMatrixD matRinv(2, 2);
554 if (matR.Determinant() > 0) {
555 matRinv = TMatrixD(TMatrixD::kInverted, matR);
559 const double big = 9.9e9;
560 matRinv =
big * unitMatrix;
574 TMatrixD matHtrans(TMatrixD::kTransposed, matH);
575 TMatrixD matCrefht = matCref * matHtrans;
576 TMatrixD matK = matCrefht * matRinv;
585 TVectorD hx =
h * vecX;
596 float tanL = vecX[
T];
602 double corr = stub->
r() * inv2R;
607 deltaS = (1. / 6.) * (stub->
r()) *
pow(
corr, 2);
618 float rShift = (stub->
z() - z0) / tanL - stub->
r();
646 const TMatrixD &matCref,
647 const TVectorD &vecXref,
648 const TMatrixD &matH,
649 const TVectorD &
delta,
651 TMatrixD &new_matC)
const {
652 new_vecX = vecXref + matK *
delta;
654 TMatrixD
tmp = unitMatrix - matK * matH;
655 new_matC =
tmp * matCref;
661 const TMatrixD &matRinv,
662 const TVectorD &
delta,
664 double &chi2rz)
const {
670 PrintL1trk() <<
"delta(chi2rphi)=" << delChi2rphi <<
" delta(chi2rz)= " << delChi2rz;
672 chi2rphi =
state->chi2rphi() + delChi2rphi;
673 chi2rz =
state->chi2rz() + delChi2rz;
684 unsigned int iEtaReg,
unsigned int layerIDreduced,
bool barrel,
float r,
float z)
const {
687 <<
"ERROR KFbase::getKalmanLayer hardwired value of nEta_ differs from NumEtaRegions cfg param";
689 unsigned int kfEtaReg;
696 unsigned int kalmanLay =
703 if (layerIDreduced > 2) {
755 {
false,
false,
false,
false,
false,
false,
false},
756 {
false,
false,
false,
false,
false,
false,
false},
757 {
false,
false,
false,
false,
false,
false,
false},
758 {
false,
false,
false,
false,
false,
false,
false},
759 {
false,
false,
false,
false,
false,
false,
false},
760 {
false,
false,
true,
false,
false,
false,
false},
761 {
true,
true,
false,
false,
false,
false,
false},
762 {
true,
false,
false,
false,
false,
false,
false},
765 unsigned int kfEtaReg;
772 bool ambiguous =
false;
774 ambiguous = ambiguityMap[kfEtaReg][kfLayer];
789 set<pair<unsigned, bool>> deadGPlayers;
795 deadGPlayers.insert(pair<unsigned, bool>(4,
true));
798 if (iEtaReg_ <= 7 && iPhiSec_ >= 1 &&
iPhiSec_ <= 5) {
799 deadGPlayers.insert(pair<unsigned, bool>(1,
true));
803 if (iEtaReg_ <= 7 && iPhiSec_ >= 1 &&
iPhiSec_ <= 5) {
804 deadGPlayers.insert(pair<unsigned, bool>(1,
true));
807 deadGPlayers.insert(pair<unsigned, bool>(2,
true));
811 if (iEtaReg_ <= 7 && iPhiSec_ >= 1 &&
iPhiSec_ <= 5) {
812 deadGPlayers.insert(pair<unsigned, bool>(1,
true));
814 if (iEtaReg_ <= 3 && iPhiSec_ >= 1 &&
iPhiSec_ <= 5) {
815 deadGPlayers.insert(pair<unsigned, bool>(3,
false));
821 set<unsigned> kfDeadLayers;
822 for (
const auto &
p : deadGPlayers) {
823 unsigned int layer =
p.first;
828 kfDeadLayers.insert(kalmanLay);
843 TVectorD tpParams(5);
844 bool useForAlgEff(
false);
846 useForAlgEff =
tp->useForAlgEff();
848 tpParams[
PHI0] =
tp->phi0();
849 tpParams[
Z0] =
tp->z0();
850 tpParams[
T] =
tp->tanLambda();
851 tpParams[
D0] =
tp->d0();
853 std::stringstream
text;
856 text <<
" TP index = " <<
tp->index() <<
" useForAlgEff = " << useForAlgEff <<
" ";
857 const string helixNames[5] = {
"qOverPt",
"phi0",
"z0",
"tanL",
"d0"};
858 for (
int i = 0;
i < tpParams.GetNrows();
i++) {
859 text << helixNames[
i] <<
":" << tpParams[
i] <<
", ";
871 std::stringstream
text;
874 text <<
"stub layers = []\n";
876 text <<
"stub layers = [ ";
877 for (
unsigned i = 0;
i < stubs.size();
i++) {
878 text << stubs[
i]->layerId();
879 if (
i != stubs.size() - 1)
883 text <<
"KF stub layers = [ ";
884 for (
unsigned j = 0;
j < stubs.size();
j++) {
885 unsigned int kalmanLay =
886 this->
kalmanLayer(iEtaReg, stubs[
j]->layerIdReduced(), stubs[
j]->
barrel(), stubs[
j]->r(), stubs[
j]->z());
888 if (
j != stubs.size() - 1)
899 std::stringstream
text;
902 text <<
"index=" << stub->
index() <<
" ";
904 text <<
"r=" << stub->
r() <<
" ";
905 text <<
"phi=" << stub->
phi() <<
" ";
906 text <<
"z=" << stub->
z() <<
" ";
910 std::set<const TP *> tps = stub->
assocTPs();
912 text <<
tp->index() <<
",";
919 for (
auto &stub : stubs) {
unsigned int kalmanMaxStubsPerLayer() const
unsigned int iEtaReg() const override
constexpr double deltaPhi(double phi1, double phi2)
bool kalmanHOhelixExp() const
static constexpr std::pair< unsigned, unsigned > layerMap_[nEta_/2][nGPlayer_+1]
unsigned int layerId() const
float phi0() const override
unsigned nextLayer() const
bool enableDigitize() const
unsigned nSkippedLayers() const
unsigned int kalmanHOalpha() const
const Settings * settings() const
float qOverPt() const override
double bApprox_intercept() const
void printStubLayers(const std::vector< Stub *> &stubs, unsigned int iEtaReg) const
void adjustState(const TMatrixD &K, const TMatrixD &pxcov, const TVectorD &x, const TMatrixD &h, const TVectorD &delta, TVectorD &new_x, TMatrixD &new_xcov) const
void printTP(const TP *tp) const
virtual unsigned int kalmanLayer(unsigned int iEtaReg, unsigned int layerIDreduced, bool barrel, float r, float z) const
const TP * matchedTP() const override
void printStubs(const std::vector< Stub *> &stubs) const
unsigned int killScenario() const
L1fittedTrack fit(const L1track3D &l1track3D) override
bool kalmanRemove2PScut() const
std::set< unsigned > kalmanDeadLayers(bool &remove2PSCut) const
float approxB(float z, float r) const
static const unsigned int nEta_
const std::vector< Stub * > & stubs() const override
unsigned int kalmanMaxStubsEasy() const
std::pair< unsigned int, unsigned int > cellLocationHT() const override
unsigned int numEtaRegions() const
virtual TVectorD trackParams(const KalmanState *state) const =0
unsigned int index() const
unsigned nStubLayers() const
unsigned kalmanDebugLevel() const
unsigned int iPhiSec() const override
const KalmanState * mkState(const L1track3D &candidate, unsigned nSkipped, unsigned layer, const KalmanState *last_state, const TVectorD &x, const TMatrixD &pxx, const TMatrixD &K, const TMatrixD &dcov, Stub *stub, double chi2rphi, double chi2rz)
virtual const KalmanState * kalmanUpdate(unsigned nSkipped, unsigned layer, Stub *stub, const KalmanState *state, const TP *tp)
bool goodTrack(const reco::Track *pTrack, math::XYZPoint leadPV, trackSelectionParameters parameters, bool debug=false)
bool kalmanAddBeamConstr() const
static const unsigned int nKFlayer_
virtual bool kalmanAmbiguousLayer(unsigned int iEtaReg, unsigned int kfLayer)
virtual TMatrixD matrixV(const Stub *stub, const KalmanState *state) const =0
static constexpr unsigned int invalidKFlayer_
Abs< T >::type abs(const T &t)
virtual TVectorD seedX(const L1track3D &l1track3D) const =0
const KalmanState * doKF(const L1track3D &l1track3D, const std::vector< Stub *> &stubs, const TP *tpa)
const Settings * settings_
void printStub(const Stub *stub) const
double bApprox_gradient() const
unsigned int kalmanMinNumStubs() const
virtual TMatrixD seedC(const L1track3D &l1track3D) const =0
std::vector< DeviationSensor2D * > vd
unsigned int kalmanMaxSkipLayersEasy() const
virtual TMatrixD matrixH(const Stub *stub) const =0
TMatrixD matrixHCHt(const TMatrixD &h, const TMatrixD &c) const
virtual TVectorD trackParams_BeamConstr(const KalmanState *state, double &chi2rphi_bcon) const =0
virtual TVectorD residual(const Stub *stub, const TVectorD &x, double candQoverPt) const
unsigned int kalmanMaxNumStubs() const
static constexpr float d0
void setInfoKF(unsigned int nSkippedLayers, unsigned int numUpdateCalls)
TMatrixD matrixRinv(const TMatrixD &matH, const TMatrixD &matCref, const TMatrixD &matV) const
TMatrixD getKalmanGainMatrix(const TMatrixD &h, const TMatrixD &pxcov, const TMatrixD &covRinv) const
=== This is the base class for the linearised chi-squared track fit algorithms.
unsigned int kalmanMaxSkipLayersHard() const
const std::set< const TP * > & assocTPs() const
virtual bool isGoodState(const KalmanState &state) const =0
unsigned int numUpdateCalls_
unsigned int numStubs() const override
unsigned int kalmanHOprojZcorr() const
unsigned int kalmanChi2RphiScale() const
virtual TVectorD vectorM(const Stub *stub) const =0
const std::vector< double > & kfLayerVsChiSq5() const
std::vector< std::unique_ptr< const KalmanState > > listAllStates_
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
unsigned int hitPattern() const
virtual TMatrixD matrixF(const Stub *stub=nullptr, const KalmanState *state=nullptr) const =0
Power< A, B >::type pow(const A &a, const B &b)
bool kfUseMaybeLayers() const
virtual void adjustChi2(const KalmanState *state, const TMatrixD &covRinv, const TVectorD &delta, double &chi2rphi, double &chi2rz) const
double invPtToInvR() const