CMS 3D CMS Logo

L1TTwinMuxAlgorithm.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: L1TwinMuxAlgortithm
4 //
5 // L1TwinMuxAlgortithm
6 //
7 //
8 // Author :
9 // G. Flouris U Ioannina Feb. 2015
10 // modifications: G Karathanasis
11 //--------------------------------------------------
12 
13 #include <iostream>
14 #include <iomanip>
15 #include <iterator>
16 
29 
30 using namespace std;
31 
35  const edm::EventSetup& c) {
37  const L1TTwinMuxParamsRcd& tmParamsRcd = c.get<L1TTwinMuxParamsRcd>();
38  tmParamsRcd.get(tmParamsHandle);
39  const L1TTwinMuxParams& tmParams = *tmParamsHandle.product();
40  bool onlyRPC = tmParams.get_UseOnlyRPC();
41  bool onlyDT = tmParams.get_UseOnlyDT();
42  bool useLowQDT = tmParams.get_UseLowQDT();
43  bool correctBX = tmParams.get_CorrectDTBxwRPC();
44  bool verbose = tmParams.get_Verbose();
45 
47  AlignTrackSegments alignedDTs{*inphiDigis};
48  alignedDTs.run(c);
49  L1MuDTChambPhContainer const& phiDigis = alignedDTs.getDTContainer();
50  //if only DTs are required without bx correction
51  //return the aligned track segments
52  if (onlyDT && !correctBX && !useLowQDT) {
53  m_tm_phi_output = phiDigis;
54  return;
55  }
57  RPCHitCleaner rpcHitCl{*rpcDigis};
58  rpcHitCl.run(c);
59  RPCDigiCollection const& rpcDigisCleaned = rpcHitCl.getRPCCollection();
60 
62  RPCtoDTTranslator dt_from_rpc{rpcDigisCleaned};
63  dt_from_rpc.run(c);
64  L1MuDTChambPhContainer const& rpcPhiDigis =
65  dt_from_rpc.getDTContainer(); //Primitves used for RPC->DT (only station 1 and 2)
66  L1MuDTChambPhContainer const& rpcHitsPhiDigis =
67  dt_from_rpc.getDTRPCHitsContainer(); //Primitves used for bx correction
68 
70  DTLowQMatching dtlowq{&phiDigis, rpcHitsPhiDigis};
71  dtlowq.run(c);
72 
73  if (onlyDT && !correctBX && useLowQDT) {
74  m_tm_phi_output = phiDigis;
75  if (verbose) {
76  IOPrinter ioPrinter;
77  cout << "======DT========" << endl;
78  ioPrinter.run(inphiDigis, m_tm_phi_output, rpcDigis, c);
79  cout << "======RPC========" << endl;
80  ioPrinter.run(&rpcHitsPhiDigis, m_tm_phi_output, &rpcDigisCleaned, c);
81  cout << "+++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
82  }
83 
84  return;
85  }
86 
88  // DTRPCBxCorrection *rpc_dt_bx = new DTRPCBxCorrection(phiDigis,rpcHitsPhiDigis);
89  DTRPCBxCorrection rpc_dt_bx{phiDigis, rpcHitsPhiDigis};
90  rpc_dt_bx.run(c);
91 
92  L1MuDTChambPhContainer const& phiDigiscp = rpc_dt_bx.getDTContainer();
93 
95  std::vector<L1MuDTChambPhDigi> l1ttma_out;
96 
97  int bx = 0, wheel = 0, sector = 0, station = 1;
98 
99  for (bx = -3; bx <= 3; bx++) {
100  for (wheel = -2; wheel <= 2; wheel++) {
101  for (sector = 0; sector < 12; sector++) {
102  for (station = 1; station <= 4; station++) {
103  L1MuDTChambPhDigi const* dtts1 = phiDigiscp.chPhiSegm1(wheel, station, sector, bx);
104  L1MuDTChambPhDigi const* dtts2 = phiDigiscp.chPhiSegm2(wheel, station, sector, bx);
105  L1MuDTChambPhDigi const* rpcts1 = rpcPhiDigis.chPhiSegm1(wheel, station, sector, bx);
106 
107  if (!onlyRPC) {
108  if (!dtts1 && !dtts2 && !rpcts1)
109  continue;
110  if (dtts1 && dtts1->code() != 7) {
111  l1ttma_out.push_back(*dtts1);
112  }
113  if (dtts2 && dtts2->code() != 7) {
114  l1ttma_out.push_back(*dtts2);
115  }
116  if (!onlyDT) {
117  if (!dtts1 && !dtts2 && rpcts1 && station <= 2) {
118  l1ttma_out.emplace_back(rpcts1->bxNum(),
119  rpcts1->whNum(),
120  rpcts1->scNum(),
121  rpcts1->stNum(),
122  rpcts1->phi(),
123  rpcts1->phiB(),
124  rpcts1->code(),
125  rpcts1->Ts2Tag(),
126  rpcts1->BxCnt(),
127  2);
128  }
129  }
130  }
131 
132  else if (onlyRPC) {
133  if (rpcts1 && station <= 2) {
134  l1ttma_out.emplace_back(rpcts1->bxNum(),
135  rpcts1->whNum(),
136  rpcts1->scNum(),
137  rpcts1->stNum(),
138  rpcts1->phi(),
139  rpcts1->phiB(),
140  rpcts1->code(),
141  rpcts1->Ts2Tag(),
142  rpcts1->BxCnt(),
143  2);
144  }
145  }
146  }
147  }
148  }
149  }
150 
151  m_tm_phi_output.setContainer(l1ttma_out);
152 
153  if (verbose) {
154  IOPrinter ioPrinter;
155  cout << "======DT========" << endl;
156  ioPrinter.run(inphiDigis, m_tm_phi_output, rpcDigis, c);
157  cout << "======RPC========" << endl;
158  ioPrinter.run(&rpcHitsPhiDigis, m_tm_phi_output, &rpcDigisCleaned, c);
159  cout << "+++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
160  }
161 }
int get_Verbose() const
L1MuDTChambPhDigi const * chPhiSegm1(int wheel, int stat, int sect, int bx) const
L1MuDTChambPhDigi const * chPhiSegm2(int wheel, int stat, int sect, int bx) const
void run(edm::Handle< L1MuDTChambPhContainer >, const L1MuDTChambPhContainer &, edm::Handle< RPCDigiCollection >, const edm::EventSetup &)
Definition: IOPrinter.cc:17
PRODUCT const & get(ESGetToken< PRODUCT, T > const &iToken) const
void run(edm::Handle< L1MuDTChambPhContainer > phiDigis, edm::Handle< L1MuDTChambThContainer > thetaDigis, edm::Handle< RPCDigiCollection > rpcDigis, const edm::EventSetup &c)
int get_UseLowQDT() const
int get_UseOnlyDT() const
T get() const
Definition: EventSetup.h:73
int get_UseOnlyRPC() const
int get_CorrectDTBxwRPC() const