File indexing completed on 2023-10-25 09:56:12
0001 #include "L1Trigger/TrackerTFP/interface/State.h"
0002
0003 using namespace std;
0004 using namespace tt;
0005
0006 namespace trackerTFP {
0007
0008
0009 State::State(State* state)
0010 : dataFormats_(state->dataFormats_),
0011 setup_(state->setup_),
0012 track_(state->track_),
0013 trackId_(state->trackId_),
0014 parent_(state->parent_),
0015 stub_(state->stub_),
0016 layerMap_(state->layerMap_),
0017 hitPattern_(state->hitPattern_),
0018 x0_(state->x0_),
0019 x1_(state->x1_),
0020 x2_(state->x2_),
0021 x3_(state->x3_),
0022 C00_(state->C00_),
0023 C01_(state->C01_),
0024 C11_(state->C11_),
0025 C22_(state->C22_),
0026 C23_(state->C23_),
0027 C33_(state->C33_),
0028 numSkippedLayers_(state->numSkippedLayers_),
0029 numConsistentLayers_(state->numConsistentLayers_) {}
0030
0031
0032 State::State(const DataFormats* dataFormats, TrackKFin* track, int trackId)
0033 : dataFormats_(dataFormats),
0034 setup_(dataFormats->setup()),
0035 track_(track),
0036 trackId_(trackId),
0037 parent_(nullptr),
0038 stub_(nullptr),
0039 layerMap_(setup_->numLayers()),
0040 hitPattern_(0, setup_->numLayers()),
0041 numSkippedLayers_(0),
0042 numConsistentLayers_(0) {
0043
0044 x0_ = 0.;
0045 x1_ = 0.;
0046 x2_ = 0.;
0047 x3_ = 0.;
0048
0049 C00_ = pow(dataFormats_->base(Variable::inv2R, Process::kfin), 2);
0050 C11_ = pow(dataFormats_->base(Variable::phiT, Process::kfin), 2);
0051 C22_ = pow(dataFormats_->base(Variable::cot, Process::kfin), 2);
0052 C33_ = pow(dataFormats_->base(Variable::zT, Process::kfin), 2);
0053 C01_ = 0.;
0054 C23_ = 0.;
0055
0056 stub_ = track->layerStub(track->hitPattern().plEncode());
0057 }
0058
0059
0060 State::State(State* state, StubKFin* stub) : State(state) {
0061 parent_ = state->parent();
0062 stub_ = stub;
0063 }
0064
0065
0066 State::State(State* state, const std::vector<double>& doubles) : State(state) {
0067 parent_ = state;
0068
0069 x0_ = doubles[0];
0070 x1_ = doubles[1];
0071 x2_ = doubles[2];
0072 x3_ = doubles[3];
0073 C00_ = doubles[4];
0074 C11_ = doubles[5];
0075 C22_ = doubles[6];
0076 C33_ = doubles[7];
0077 C01_ = doubles[8];
0078 C23_ = doubles[9];
0079
0080 const int layer = stub_->layer();
0081 hitPattern_.set(layer);
0082 const vector<StubKFin*>& stubs = track_->layerStubs(layer);
0083 layerMap_[layer] = distance(stubs.begin(), find(stubs.begin(), stubs.end(), stub_));
0084
0085 stub_ = nullptr;
0086 if (hitPattern_.count() == setup_->kfMaxLayers())
0087 return;
0088 for (int nextLayer = layer + 1; nextLayer < setup_->numLayers(); nextLayer++) {
0089 if (track_->hitPattern(nextLayer)) {
0090 stub_ = track_->layerStub(nextLayer);
0091 break;
0092 }
0093 }
0094 }
0095
0096
0097 void State::fill(vector<StubKF>& stubs) const {
0098 stubs.reserve(hitPattern_.count());
0099 State* s = parent_;
0100 while (s) {
0101 stubs.emplace_back(*(s->stub()), x0_, x1_, x2_, x3_);
0102 s = s->parent();
0103 }
0104 }
0105
0106
0107 void State::finish() {
0108 auto consistent = [this](int sum, const StubKF& stub) {
0109 static const DataFormat& phi = dataFormats_->format(Variable::phi, Process::kf);
0110 static const DataFormat& z = dataFormats_->format(Variable::z, Process::kf);
0111
0112 const bool inRange0 = 2. * abs(stub.phi()) - stub.dPhi() < phi.base();
0113 const bool inRange1 = 2. * abs(stub.z()) - stub.dZ() < z.base();
0114 return sum + (inRange0 && inRange1 ? 1 : 0);
0115 };
0116 vector<StubKF> stubs;
0117 fill(stubs);
0118 numConsistentLayers_ = accumulate(stubs.begin(), stubs.end(), 0, consistent);
0119 TTBV pattern = hitPattern_;
0120 pattern |= maybePattern();
0121
0122 numSkippedLayers_ = pattern.count(0, hitPattern_.pmEncode(), false);
0123 }
0124
0125 }