File indexing completed on 2025-06-03 00:12:24
0001 #include "L1Trigger/TrackFindingTracklet/interface/State.h"
0002
0003 #include <cmath>
0004 #include <vector>
0005 #include <deque>
0006 #include <algorithm>
0007 #include <iterator>
0008
0009 namespace trklet {
0010
0011
0012 State::Stub::Stub(KalmanFilterFormats* kff, const tt::FrameStub& frame) : stubDR_(frame, kff->dataFormats()) {
0013 const tt::Setup* setup = kff->setup();
0014 H12_ = kff->format(VariableKF::H12).digi(stubDR_.r() + setup->chosenRofPhi() - setup->chosenRofZ());
0015 H04_ = stubDR_.r() + setup->chosenRofPhi();
0016 v0_ = kff->format(VariableKF::v0).digi(pow(2. * stubDR_.dPhi(), 2));
0017 v1_ = kff->format(VariableKF::v1).digi(pow(2. * stubDR_.dZ(), 2));
0018 }
0019
0020
0021 State::State(KalmanFilterFormats* kff, TrackDR* track, const std::vector<Stub*>& stubs, int trackId)
0022 : kff_(kff),
0023 setup_(kff->setup()),
0024 track_(track),
0025 stubs_(stubs),
0026 trackId_(trackId),
0027 parent_(nullptr),
0028 stub_(nullptr),
0029 hitPattern_(0, setup_->numLayers()),
0030 trackPattern_(0, setup_->numLayers()),
0031 x0_(0.),
0032 x1_(0.),
0033 x2_(0.),
0034 x3_(0.),
0035 x4_(0.),
0036 C00_(9.e9),
0037 C01_(0.),
0038 C11_(9.e9),
0039 C22_(9.e9),
0040 C23_(0.),
0041 C33_(9.e9),
0042 C44_(pow(setup_->maxD0(), 2)),
0043 C40_(0.),
0044 C41_(0.) {
0045 int layer(0);
0046 for (Stub* stub : stubs_)
0047 trackPattern_[layer++] = (bool)stub;
0048 layer = trackPattern_.plEncode();
0049 stub_ = stubs_[layer];
0050 hitPattern_.set(layer);
0051 }
0052
0053
0054 State::State(State* state, const std::vector<double>& doubles) : State(state) {
0055 parent_ = state;
0056
0057 x0_ = doubles[0];
0058 x1_ = doubles[1];
0059 x2_ = doubles[2];
0060 x3_ = doubles[3];
0061 x4_ = doubles[4];
0062 C00_ = doubles[5];
0063 C11_ = doubles[6];
0064 C22_ = doubles[7];
0065 C33_ = doubles[8];
0066 C01_ = doubles[9];
0067 C23_ = doubles[10];
0068 C44_ = doubles[11];
0069 C40_ = doubles[12];
0070 C41_ = doubles[13];
0071
0072 const int layer = this->layer();
0073 stub_ = nullptr;
0074 if (hitPattern_.count() >= setup_->kfMinLayers() || hitPattern_.count() == setup_->kfMaxLayers())
0075 return;
0076 const int nextLayer = trackPattern_.plEncode(layer + 1, setup_->numLayers());
0077 if (nextLayer == setup_->numLayers())
0078 return;
0079 stub_ = stubs_[nextLayer];
0080 hitPattern_.set(nextLayer);
0081 }
0082
0083
0084 State::State(State* state, State* parent, int layer) : State(state) {
0085 parent_ = parent;
0086 hitPattern_ = parent ? parent->hitPattern() : TTBV(0, setup_->numLayers());
0087 stub_ = stubs_[layer];
0088 hitPattern_.set(layer);
0089 }
0090
0091
0092 State* State::update(std::deque<State>& states, int layer) {
0093 if (!hitPattern_.test(layer) || hitPattern_.count() > setup_->kfNumSeedStubs())
0094 return this;
0095 const int nextLayer = trackPattern_.plEncode(layer + 1, setup_->numLayers());
0096 states.emplace_back(this, this, nextLayer);
0097 return &states.back();
0098 }
0099
0100
0101 State* State::combSeed(std::deque<State>& states, int layer) {
0102
0103 if (!hitPattern_.test(layer) || hitPattern_.count() > setup_->kfNumSeedStubs())
0104 return nullptr;
0105
0106 const int nextLayer = trackPattern_.plEncode(layer + 1, setup_->numLayers());
0107 const int maxSeedStubs = hitPattern_.count(0, layer) + trackPattern_.count(nextLayer, setup_->kfMaxSeedingLayer());
0108 if (maxSeedStubs < setup_->kfNumSeedStubs())
0109 return nullptr;
0110 const int maxStubs = maxSeedStubs + trackPattern_.count(setup_->kfMaxSeedingLayer(), setup_->numLayers());
0111 if (maxStubs < setup_->kfMinLayers())
0112 return nullptr;
0113 states.emplace_back(this, parent_, nextLayer);
0114 return &states.back();
0115 }
0116
0117
0118 State* State::comb(std::deque<State>& states, int layer) {
0119
0120 if (!hitPattern_.test(layer)) {
0121 if (!stub_ && trackPattern_[layer] && hitPattern_.count() < setup_->kfMaxLayers()) {
0122 states.emplace_back(this, parent_, layer);
0123 return &states.back();
0124 }
0125 return nullptr;
0126 }
0127
0128 if (hitPattern_.pmEncode() != layer)
0129 return nullptr;
0130
0131 const int nextLayer = trackPattern_.plEncode(layer + 1, setup_->numLayers());
0132 if (nextLayer == setup_->numLayers())
0133 return nullptr;
0134
0135 if (hitPattern_.count() - 1 + trackPattern_.count(nextLayer, setup_->numLayers()) < setup_->kfMinLayers())
0136 return nullptr;
0137 states.emplace_back(this, parent_, nextLayer);
0138 return &states.back();
0139 }
0140
0141
0142 State::State(State* state)
0143 : kff_(state->kff_),
0144 setup_(state->setup_),
0145 track_(state->track_),
0146 stubs_(state->stubs_),
0147 trackId_(state->trackId_),
0148 parent_(state->parent_),
0149 stub_(state->stub_),
0150 hitPattern_(state->hitPattern_),
0151 trackPattern_(state->trackPattern_),
0152 x0_(state->x0_),
0153 x1_(state->x1_),
0154 x2_(state->x2_),
0155 x3_(state->x3_),
0156 x4_(state->x4_),
0157 C00_(state->C00_),
0158 C01_(state->C01_),
0159 C11_(state->C11_),
0160 C22_(state->C22_),
0161 C23_(state->C23_),
0162 C33_(state->C33_),
0163 C44_(state->C44_),
0164 C40_(state->C40_),
0165 C41_(state->C41_) {}
0166
0167 }