CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
CSCTFTrackBuilder.cc
Go to the documentation of this file.
2 
4 
8 
11 
14 #include <sstream>
15 #include <cstdlib>
16 
18  bool TMB07,
19  const L1MuTriggerScales* scales,
20  const L1MuTriggerPtScale* ptScale) {
21  m_minBX = pset.getParameter<int>("MinBX");
22  m_maxBX = pset.getParameter<int>("MaxBX");
23 
24  for (int e = CSCDetId::minEndcapId(); e <= CSCDetId::maxEndcapId(); ++e) {
26  // All SPs work with the same configuration (impossible to make it more exclusive in this framework)
27  my_SPs[e - 1][s - 1] = new CSCTFSectorProcessor(e, s, pset, TMB07, scales, ptScale);
28  }
29  }
30 }
31 
33  //my_dtrc->initialize(c);
34  for (int e = CSCDetId::minEndcapId(); e <= CSCDetId::maxEndcapId(); ++e) {
36  my_SPs[e - 1][s - 1]->initialize(c, tokens);
37  }
38  }
39 }
40 
42  for (int e = CSCDetId::minEndcapId(); e <= CSCDetId::maxEndcapId(); ++e) {
44  delete my_SPs[e - 1][s - 1];
45  my_SPs[e - 1][s - 1] = nullptr;
46  }
47  }
48 }
49 
52  const CSCTriggerContainer<csctf::TrackStub>* dtstubss, //const L1MuDTChambPhContainer* dttrig,
53  L1CSCTrackCollection* trkcoll,
55  std::vector<csc::L1Track> trks;
57 
59 
60  for (Citer = lcts->begin(); Citer != lcts->end(); Citer++) {
61  CSCCorrelatedLCTDigiCollection::const_iterator Diter = (*Citer).second.first;
62  CSCCorrelatedLCTDigiCollection::const_iterator Dend = (*Citer).second.second;
63 
64  for (; Diter != Dend; Diter++) {
65  csctf::TrackStub theStub((*Diter), (*Citer).first);
66  stub_list.push_back(theStub);
67  }
68  }
69 
70  // Now we append the track stubs the the DT Sector Collector
71  // after processing from the DT Receiver.
72 
73  // CSCTriggerContainer<csctf::TrackStub> dtstubs = my_dtrc->process(dttrig);
74  // stub_list.push_many(dtstubs);
75  stub_list.push_many(*dtstubss);
76 
77  // run each sector processor in the TF
78  for (int e = CSCDetId::minEndcapId(); e <= CSCDetId::maxEndcapId(); ++e) {
80  CSCTriggerContainer<csctf::TrackStub> current_e_s = stub_list.get(e, s);
81  int spReturnValue = my_SPs[e - 1][s - 1]->run(current_e_s);
82  if (spReturnValue == -1) //Major Error, returning with empty Coll's
83  {
84  trkcoll->clear();
85  stubs_to_dt->clear();
86  return;
87  } else if (spReturnValue) {
88  std::vector<csc::L1Track> theTracks = my_SPs[e - 1][s - 1]->tracks().get();
89  trks.insert(trks.end(), theTracks.begin(), theTracks.end());
90  }
91  stubs_to_dt->push_many(my_SPs[e - 1][s - 1]->dtStubs()); // send stubs whether or not we find a track!!!
92  }
93  }
94 
95  // Now to combine tracks with their track stubs and send them off.
96  trkcoll->resize(trks.size());
97  std::vector<csc::L1Track>::const_iterator titr = trks.begin();
98  L1CSCTrackCollection::iterator tcitr = trkcoll->begin();
99 
100  for (; titr != trks.end(); titr++) {
101  tcitr->first = (*titr);
102  std::vector<csctf::TrackStub> possible_stubs = my_SPs[titr->endcap() - 1][titr->sector() - 1]->filteredStubs();
103  std::vector<csctf::TrackStub>::const_iterator tkstbs = possible_stubs.begin();
104 
105  int me1ID = titr->me1ID();
106  int me2ID = titr->me2ID();
107  int me3ID = titr->me3ID();
108  int me4ID = titr->me4ID();
109  int mb1ID = titr->mb1ID();
110  int me1delay = titr->me1Tbin();
111  int me2delay = titr->me2Tbin();
112  int me3delay = titr->me3Tbin();
113  int me4delay = titr->me4Tbin();
114  int mb1delay = titr->mb1Tbin();
115  // BX analyzer: some stub could be delayed by BXA so that all the stubs will run through the core at the same BX;
116  // then there is a rule of "second earlies LCT": resulting track will be placed at BX of the "second earliest LCT";
117  // in the end there are two parameters in place: the delay by BXA w.r.t to the last LCT and track tbin assignment
118  std::map<int, std::list<int> > timeline;
119  if (me1ID)
120  timeline[me1delay].push_back(1);
121  if (me2ID)
122  timeline[me2delay].push_back(2);
123  if (me3ID)
124  timeline[me3delay].push_back(3);
125  if (me4ID)
126  timeline[me4delay].push_back(4);
127  int earliest_tbin = 0, second_earliest_tbin = 0;
128  for (int bx = 7; bx >= 0; bx--) {
129  std::list<int>::const_iterator iter = timeline[bx].begin();
130  while (iter != timeline[bx].end()) {
131  if (earliest_tbin == 0)
132  earliest_tbin = bx;
133  else if (second_earliest_tbin == 0)
134  second_earliest_tbin = bx;
135  iter++;
136  }
137  }
138  // Core's input was loaded in a relative time window BX=[0-7)
139  // To relate it to time window of tracks (centred at BX=0) we introduce a shift:
140  int shift = (m_maxBX + m_minBX) / 2 - m_minBX + m_minBX;
141  int me1Tbin = titr->bx() - me1delay + second_earliest_tbin + shift;
142  int me2Tbin = titr->bx() - me2delay + second_earliest_tbin + shift;
143  int me3Tbin = titr->bx() - me3delay + second_earliest_tbin + shift;
144  int me4Tbin = titr->bx() - me4delay + second_earliest_tbin + shift;
145  int mb1Tbin = titr->bx() - mb1delay + second_earliest_tbin + shift;
146 
147  for (; tkstbs != possible_stubs.end(); tkstbs++) {
148  switch (tkstbs->station()) {
149  case 1:
150  if ((tkstbs->getMPCLink() +
151  (3 * (CSCTriggerNumbering::triggerSubSectorFromLabels(CSCDetId(tkstbs->getDetId().rawId())) - 1))) ==
152  me1ID &&
153  me1ID != 0 && me1Tbin == tkstbs->BX()) {
154  tcitr->second.insertDigi(CSCDetId(tkstbs->getDetId().rawId()), *(tkstbs->getDigi()));
155  }
156  break;
157  case 2:
158  if (tkstbs->getMPCLink() == me2ID && me2ID != 0 && me2Tbin == tkstbs->BX()) {
159  tcitr->second.insertDigi(CSCDetId(tkstbs->getDetId().rawId()), *(tkstbs->getDigi()));
160  }
161  break;
162  case 3:
163  if (tkstbs->getMPCLink() == me3ID && me3ID != 0 && me3Tbin == tkstbs->BX()) {
164  tcitr->second.insertDigi(CSCDetId(tkstbs->getDetId().rawId()), *(tkstbs->getDigi()));
165  }
166  break;
167  case 4:
168  if (tkstbs->getMPCLink() == me4ID && me4ID != 0 && me4Tbin == tkstbs->BX()) {
169  tcitr->second.insertDigi(CSCDetId(tkstbs->getDetId().rawId()), *(tkstbs->getDigi()));
170  }
171  break;
172  case 5:
173  if (tkstbs->getMPCLink() == mb1ID && mb1ID != 0 && mb1Tbin == tkstbs->BX()) {
175  }
176  break;
177  default:
178  edm::LogWarning("CSCTFTrackBuilder::buildTracks()")
179  << "SERIOUS ERROR: STATION " << tkstbs->station() << " NOT IN RANGE [1,5]\n";
180  };
181  }
182  tcitr++; // increment to next track in the collection
183  }
184 }
std::vector< csctf::TrackStub > filteredStubs() const
std::vector< T > get() const
const edm::EventSetup & c
static int minEndcapId()
Definition: CSCDetId.h:234
CSCTFTrackBuilder(const edm::ParameterSet &pset, bool TMB07, const L1MuTriggerScales *scales, const L1MuTriggerPtScale *ptScale)
static int maxTriggerSectorId()
std::vector< L1CSCTrack > L1CSCTrackCollection
static int minTriggerSectorId()
void push_back(const T &data)
int run(const CSCTriggerContainer< csctf::TrackStub > &)
static int maxEndcapId()
Definition: CSCDetId.h:235
void push_many(const std::vector< T > &data)
void buildTracks(const CSCCorrelatedLCTDigiCollection *, const CSCTriggerContainer< csctf::TrackStub > *, L1CSCTrackCollection *, CSCTriggerContainer< csctf::TrackStub > *)
void initialize(const edm::EventSetup &c, const Tokens &tokens)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::vector< DigiType >::const_iterator const_iterator
const std::vector< double > ptScale
Definition: Utilities.cc:33
static int triggerSubSectorFromLabels(int station, int chamber)
CSCTriggerContainer< csc::L1Track > tracks() const
void initialize(const edm::EventSetup &c, const Tokens &tokens)
KK.
string end
Definition: dataset.py:937
static unsigned int const shift
Log< level::Warning, false > LogWarning
CSCTFSectorProcessor * my_SPs[nEndcaps][nSectors]