CMS 3D CMS Logo

L1MuDTTrackFinder.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: L1MuDTTrackFinder
4 //
5 // Description: L1 barrel Muon Trigger Track Finder
6 //
7 //
8 //
9 // Author :
10 // N. Neumeister CERN EP
11 // J. Troconiz UAM Madrid
12 //
13 //--------------------------------------------------
14 
15 //-----------------------
16 // This Class's Header --
17 //-----------------------
18 
20 
21 //---------------
22 // C++ Headers --
23 //---------------
24 
25 #include <iostream>
26 
27 //-------------------------------
28 // Collaborating Class Headers --
29 //-------------------------------
30 
43 
44 using namespace std;
45 
46 //---------------------------------
47 // class L1MuDTTrackFinder
48 //---------------------------------
49 
50 
51 //----------------
52 // Constructors --
53 //----------------
54 
56 
57  // set configuration parameters
58  if ( m_config == nullptr ) m_config = new L1MuDTTFConfig(ps);
59 
60  if ( m_config->Debug(1) ) cout << endl;
61  if ( m_config->Debug(1) ) cout << "**** entering L1MuDTTrackFinder ****" << endl;
62  if ( m_config->Debug(1) ) cout << endl;
63 
64  m_spmap = new L1MuDTSecProcMap();
65  m_epvec.reserve(12);
66  m_wsvec.reserve(12);
67  m_ms = nullptr;
68 
69  _cache.reserve(4*17);
70  _cache0.reserve(144*17);
71 
72  m_DTDigiToken = iC.consumes<L1MuDTChambPhContainer>(m_config->getDTDigiInputTag());
73 }
74 
75 
76 //--------------
77 // Destructor --
78 //--------------
79 
81 
82  delete m_spmap;
83 
84  vector<L1MuDTEtaProcessor*>::iterator it_ep = m_epvec.begin();
85  while ( it_ep != m_epvec.end() ) {
86  delete (*it_ep);
87  it_ep++;
88  }
89  m_epvec.clear();
90 
91  vector<L1MuDTWedgeSorter*>::iterator it_ws = m_wsvec.begin();
92  while ( it_ws != m_wsvec.end() ) {
93  delete (*it_ws);
94  it_ws++;
95  }
96  m_wsvec.clear();
97 
98  delete m_ms;
99 
100  if ( m_config ) delete m_config;
101  m_config = nullptr;
102 
103 }
104 
105 
106 //--------------
107 // Operations --
108 //--------------
109 
110 //
111 // setup MTTF configuration
112 //
114 
115  // build the barrel Muon Trigger Track Finder
116 
117  if ( m_config->Debug(1) ) cout << endl;
118  if ( m_config->Debug(1) ) cout << "**** L1MuDTTrackFinder building ****" << endl;
119  if ( m_config->Debug(1) ) cout << endl;
120 
121  // create new sector processors
122  for ( int wh = -3; wh <= 3; wh++ ) {
123  if ( wh == 0 ) continue;
124  for ( int sc = 0; sc < 12; sc++ ) {
125  L1MuDTSecProcId tmpspid(wh,sc);
126  L1MuDTSectorProcessor* sp = new L1MuDTSectorProcessor(*this,tmpspid,std::move(iC));
127  if ( m_config->Debug(2) ) cout << "creating " << tmpspid << endl;
128  m_spmap->insert(tmpspid,sp);
129  }
130  }
131 
132  // create new eta processors and wedge sorters
133  for ( int sc = 0; sc < 12; sc++ ) {
134  L1MuDTEtaProcessor* ep = new L1MuDTEtaProcessor(*this,sc,std::move(iC));
135  if ( m_config->Debug(2) ) cout << "creating Eta Processor " << sc << endl;
136  m_epvec.push_back(ep);
137  L1MuDTWedgeSorter* ws = new L1MuDTWedgeSorter(*this,sc);
138  if ( m_config->Debug(2) ) cout << "creating Wedge Sorter " << sc << endl;
139  m_wsvec.push_back(ws);
140  }
141 
142  // create new muon sorter
143  if ( m_config->Debug(2) ) cout << "creating DT Muon Sorter " << endl;
144  m_ms = new L1MuDTMuonSorter(*this);
145 
146 }
147 
148 
149 //
150 // run MTTF
151 //
153 
154  // run the barrel Muon Trigger Track Finder
155 
157  e.getByToken(m_DTDigiToken,dttrig);
158  if ( dttrig->getContainer()->empty() ) return;
159 
160  if ( m_config->Debug(2) ) cout << endl;
161  if ( m_config->Debug(2) ) cout << "**** L1MuDTTrackFinder processing ****" << endl;
162  if ( m_config->Debug(2) ) cout << endl;
163 
164  int bx_min = m_config->getBxMin();
165  int bx_max = m_config->getBxMax();
166 
167  for ( int bx = bx_min; bx <= bx_max; bx++ ) {
168 
169  if ( dttrig->bxEmpty(bx) ) continue;
170 
171  if ( m_config->Debug(2) ) cout << "L1MuDTTrackFinder processing bunch-crossing : " << bx << endl;
172 
173  // reset MTTF
174  reset();
175 
176  // run sector processors
177  L1MuDTSecProcMap::SPmap_iter it_sp = m_spmap->begin();
178  while ( it_sp != m_spmap->end() ) {
179  if ( m_config->Debug(2) ) cout << "running "
180  << (*it_sp).second->id() << endl;
181  if ( (*it_sp).second ) (*it_sp).second->run(bx,e,c);
182  if ( m_config->Debug(2) && (*it_sp).second ) (*it_sp).second->print();
183  it_sp++;
184  }
185 
186  // run eta processors
187  vector<L1MuDTEtaProcessor*>::iterator it_ep = m_epvec.begin();
188  while ( it_ep != m_epvec.end() ) {
189  if ( m_config->Debug(2) ) cout << "running Eta Processor "
190  << (*it_ep)->id() << endl;
191  if ( *it_ep ) (*it_ep)->run(bx,e,c);
192  if ( m_config->Debug(2) && *it_ep ) (*it_ep)->print();
193  it_ep++;
194  }
195 
196  // read sector processors
197  it_sp = m_spmap->begin();
198  while ( it_sp != m_spmap->end() ) {
199  if ( m_config->Debug(2) ) cout << "reading "
200  << (*it_sp).second->id() << endl;
201  for ( int number = 0; number < 2; number++ ) {
202  const L1MuDTTrack* cand = (*it_sp).second->tracK(number);
203  if ( cand && !cand->empty() ) _cache0.push_back(L1MuDTTrackCand(cand->getDataWord(),cand->bx(),
204  cand->spid().wheel(),cand->spid().sector(),number,cand->address(1),
205  cand->address(2),cand->address(3),cand->address(4),cand->tc()));
206  }
207  it_sp++;
208  }
209 
210  // run wedge sorters
211  vector<L1MuDTWedgeSorter*>::iterator it_ws = m_wsvec.begin();
212  while ( it_ws != m_wsvec.end() ) {
213  if ( m_config->Debug(2) ) cout << "running Wedge Sorter "
214  << (*it_ws)->id() << endl;
215  if ( *it_ws ) (*it_ws)->run();
216  if ( m_config->Debug(2) && *it_ws ) (*it_ws)->print();
217  it_ws++;
218  }
219 
220  // run muon sorter
221  if ( m_config->Debug(2) ) cout << "running DT Muon Sorter" << endl;
222  if ( m_ms ) m_ms->run();
223  if ( m_config->Debug(2) && m_ms ) m_ms->print();
224 
225  // store found track candidates in container (cache)
226  if ( m_ms->numberOfTracks() > 0 ) {
227  const vector<const L1MuDTTrack*>& mttf_cont = m_ms->tracks();
228  vector<const L1MuDTTrack*>::const_iterator iter;
229  for ( iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++ ) {
230  if ( *iter ) _cache.push_back(L1MuRegionalCand((*iter)->getDataWord(),(*iter)->bx()));
231  }
232  }
233 
234  }
235 
236 }
237 
238 
239 //
240 // reset MTTF
241 //
243 
244  L1MuDTSecProcMap::SPmap_iter it_sp = m_spmap->begin();
245  while ( it_sp != m_spmap->end() ) {
246  if ( (*it_sp).second ) (*it_sp).second->reset();
247  it_sp++;
248  }
249 
250  vector<L1MuDTEtaProcessor*>::iterator it_ep = m_epvec.begin();
251  while ( it_ep != m_epvec.end() ) {
252  if ( *it_ep ) (*it_ep)->reset();
253  it_ep++;
254  }
255 
256  vector<L1MuDTWedgeSorter*>::iterator it_ws = m_wsvec.begin();
257  while ( it_ws != m_wsvec.end() ) {
258  if ( *it_ws ) (*it_ws)->reset();
259  it_ws++;
260  }
261 
262  if ( m_ms ) m_ms->reset();
263 
264 }
265 
266 
267 //
268 // return Sector Processor container
269 //
271 
272  return m_spmap->sp(id);
273 
274 }
275 
276 
277 //
278 // return number of muon candidates found by the barrel MTTF
279 //
281 
282  return _cache.size();
283 
284 }
285 
286 
288 
289  return _cache.begin();
290 
291 }
292 
293 
295 
296  return _cache.end();
297 
298 }
299 
300 
302 
303  _cache.clear();
304  _cache0.clear();
305 
306 }
307 
308 
309 //
310 // return number of muon candidates found by the barrel MTTF at a given bx
311 //
313 
314  int number = 0;
315  for ( TFtracks_const_iter it = _cache.begin(); it != _cache.end(); it++ ) {
316  if ( (*it).bx() == bx ) number++;
317  }
318 
319  return number;
320 
321 }
322 
323 
324 // static data members
325 
TFtracks_const_iter begin()
L1MuDTAddressArray address() const
get address-array for this muon candidate
Definition: L1MuDTTrack.h:96
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
TrackClass tc() const
get track-class
Definition: L1MuDTTrack.h:87
TFtracks_const_iter end()
bool bxEmpty(int step) const
void run(const edm::Event &e, const edm::EventSetup &c)
run the barrel MTTF
void setup(edm::ConsumesCollector &&iC)
build the structure of the barrel MTTF
const L1MuDTSectorProcessor * sp(const L1MuDTSecProcId &) const
get a pointer to a Sector Processor
int sector() const
return sector number
virtual ~L1MuDTTrackFinder()
destructor
void reset()
reset the barrel MTTF
bool empty() const override
is it an empty muon candidate?
Definition: L1MuDTTrack.h:90
int numberOfTracks()
get number of muon candidates found by the barrel MTTF
unsigned getDataWord() const
return data word
L1MuDTTrackFinder(const edm::ParameterSet &ps, edm::ConsumesCollector &&iC)
constructor
const L1MuDTSecProcId & spid() const
return Sector Processor in which the muon candidate was found
Definition: L1MuDTTrack.h:93
SPmap::iterator SPmap_iter
std::vector< L1MuRegionalCand >::const_iterator TFtracks_const_iter
container for muon candidates
Phi_Container const * getContainer() const
int bx() const
return bunch crossing identifier
int wheel() const
return wheel number
static L1MuDTTFConfig * m_config
Track Finder configuration.
void reset(double vett[256])
Definition: TPedValues.cc:11
def move(src, dest)
Definition: eostools.py:510