Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // proto state constructor
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   // updated state constructor
0054   State::State(State* state, const std::vector<double>& doubles) : State(state) {
0055     parent_ = state;
0056     // updated track parameter and uncertainties
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     // pick next stub
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   // combinatoric and seed building state constructor
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     // handle trivial state
0103     if (!hitPattern_.test(layer) || hitPattern_.count() > setup_->kfNumSeedStubs())
0104       return nullptr;
0105     // skip layers
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     // handle skipping and min reached
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     // handle part of seed
0128     if (hitPattern_.pmEncode() != layer)
0129       return nullptr;
0130     // handle skip
0131     const int nextLayer = trackPattern_.plEncode(layer + 1, setup_->numLayers());
0132     if (nextLayer == setup_->numLayers())
0133       return nullptr;
0134     // not enough layer left
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   // copy constructor
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 }  // namespace trklet