CMS 3D CMS Logo

CSCTFanalyzer.cc
Go to the documentation of this file.
1 #include "CSCTFanalyzer.h"
8 
10  verbose = pset.getUntrackedParameter<unsigned int>("verbose", 0);
11  dataTrackProducer = pset.getUntrackedParameter<edm::InputTag>("dataTrackProducer", edm::InputTag("csctfDigis"));
12  emulTrackProducer = pset.getUntrackedParameter<edm::InputTag>("emulTrackProducer", edm::InputTag("csctfTrackDigis"));
13  lctProducer = pset.getUntrackedParameter<edm::InputTag>("lctProducer", edm::InputTag("csctfDigis"));
14  mbProducer = pset.getUntrackedParameter<edm::InputTag>("mbProducer", edm::InputTag("csctfDigis"));
15  file = new TFile("qwe.root", "RECREATE");
16  tree = new TTree("dy", "QWE");
17  tree->Branch("nDataMuons", &nDataMuons, "nDataMuons/I");
18  tree->Branch("dphi1", &dphi1, "dphi1/D");
19  tree->Branch("dphi2", &dphi2, "dphi2/D");
20  tree->Branch("dphi3", &dphi3, "dphi3/D");
21  tree->Branch("deta1", &deta1, "deta1/D");
22  tree->Branch("deta2", &deta2, "deta2/D");
23  tree->Branch("deta3", &deta3, "deta3/D");
24  tree->Branch("dpt1", &dpt1, "dpt1/I");
25  tree->Branch("dpt2", &dpt2, "dpt2/I");
26  tree->Branch("dpt3", &dpt3, "dpt3/I");
27  tree->Branch("dch1", &dch1, "dch1/I");
28  tree->Branch("dch2", &dch2, "dch2/I");
29  tree->Branch("dch3", &dch3, "dch3/I");
30  tree->Branch("dbx1", &dbx1, "dbx1/I");
31  tree->Branch("dbx2", &dbx2, "dbx2/I");
32  tree->Branch("dbx3", &dbx3, "dbx3/I");
33  tree->Branch("drank1", &drank1, "drank1/I");
34  tree->Branch("drank2", &drank2, "drank2/I");
35  tree->Branch("drank3", &drank3, "drank3/I");
36  tree->Branch("dmode1", &dmode1, "dmode1/I");
37  tree->Branch("dmode2", &dmode2, "dmode2/I");
38  tree->Branch("dmode3", &dmode3, "dmode3/I");
39  tree->Branch("dlcts1", &dlcts1, "dlcts1/I");
40  tree->Branch("dlcts2", &dlcts2, "dlcts2/I");
41  tree->Branch("dlcts3", &dlcts3, "dlcts3/I");
42 
43  tree->Branch("nEmulMuons", &nEmulMuons, "nEmulMuons/I");
44  tree->Branch("ephi1", &ephi1, "ephi1/D");
45  tree->Branch("ephi2", &ephi2, "ephi2/D");
46  tree->Branch("ephi3", &ephi3, "ephi3/D");
47  tree->Branch("eeta1", &eeta1, "eeta1/D");
48  tree->Branch("eeta2", &eeta2, "eeta2/D");
49  tree->Branch("eeta3", &eeta3, "eeta3/D");
50  tree->Branch("ept1", &ept1, "ept1/I");
51  tree->Branch("ept2", &ept2, "ept2/I");
52  tree->Branch("ept3", &ept3, "ept3/I");
53  tree->Branch("ech1", &ech1, "ech1/I");
54  tree->Branch("ech2", &ech2, "ech2/I");
55  tree->Branch("ech3", &ech3, "ech3/I");
56  tree->Branch("ebx1", &ebx1, "ebx1/I");
57  tree->Branch("ebx2", &ebx2, "ebx2/I");
58  tree->Branch("ebx3", &ebx3, "ebx3/I");
59  tree->Branch("erank1", &erank1, "erank1/I");
60  tree->Branch("erank2", &erank2, "erank2/I");
61  tree->Branch("erank3", &erank3, "erank3/I");
62  tree->Branch("emode1", &emode1, "emode1/I");
63  tree->Branch("emode2", &emode2, "emode2/I");
64  tree->Branch("emode3", &emode3, "emode3/I");
65 
66  ts = nullptr;
67 }
68 
70  tree->Write();
71  file->Write();
72  file->Close();
73 }
74 
76  if (!ts) {
78  es.get<L1MuTriggerScalesRcd>().get(scales);
79  ts = scales.product();
80  }
81 
82  if (lctProducer.label() != "null") {
85 
86  for (CSCCorrelatedLCTDigiCollection::DigiRangeIterator csc = LCTs.product()->begin(); csc != LCTs.product()->end();
87  csc++) {
88  int lctId = 0;
89 
90  CSCCorrelatedLCTDigiCollection::Range range1 = LCTs.product()->get((*csc).first);
91  for (CSCCorrelatedLCTDigiCollection::const_iterator lct = range1.first; lct != range1.second; lct++, lctId++) {
92  int station = (*csc).first.station() - 1;
93  int cscId = (*csc).first.triggerCscId() - 1;
94  int sector = (*csc).first.triggerSector() - 1 + ((*csc).first.endcap() == 1 ? 0 : 6);
95  //int subSector = CSCTriggerNumbering::triggerSubSectorFromLabels((*csc).first);
96  int tbin = lct->getBX();
97  //int fpga = ( subSector ? subSector-1 : station+1 );
98  if ((verbose & 1) == 1)
99  std::cout << "LCT in station=" << (station + 1) << " sector=" << (sector + 1) << " cscId=" << (cscId + 1)
100  << " bx=" << tbin << std::endl;
101  }
102  }
103  }
104 
105  if (mbProducer.label() != "null") {
107  e.getByLabel(mbProducer.label(), mbProducer.instance(), dtStubs);
108  if (dtStubs.isValid()) {
109  std::vector<csctf::TrackStub> vstubs = dtStubs->get();
110  for (std::vector<csctf::TrackStub>::const_iterator stub = vstubs.begin(); stub != vstubs.end(); stub++) {
111  //int dtSector =(stub->sector()-1)*2 + stub->subsector()-1;
112  //int dtEndcap = stub->endcap()-1;
113  std::cout << " DT data: tbin=" << stub->BX() << " (CSC) sector=" << stub->sector()
114  << " (CSC) subsector=" << stub->subsector() << " station=" << stub->station()
115  << " endcap=" << stub->endcap() << " phi=" << stub->phiPacked() << " phiBend=" << stub->getBend()
116  << " quality=" << stub->getQuality() << " id=" << stub->getMPCLink() << " mb_bxn=" << stub->cscid()
117  << std::endl;
118  }
119 
120  } else
121  edm::LogInfo("CSCTFAnalyzer") << " No valid CSCTriggerContainer<csctf::TrackStub> products found";
122  }
123 
124  nDataMuons = 0;
125  nEmulMuons = 0;
126  dphi1 = -1;
127  deta1 = -1;
128  dpt1 = -1;
129  dch1 = -1, dbx1 = -10;
130  dphi2 = -1;
131  deta2 = -1;
132  dpt2 = -1;
133  dch2 = -1, dbx2 = -10;
134  dphi3 = -1;
135  deta3 = -1;
136  dpt3 = -1;
137  dch3 = -1, dbx3 = -10;
138  drank1 = -1;
139  drank2 = -1;
140  drank3 = -1;
141  dmode1 = -1;
142  dmode2 = -1;
143  dmode3 = -1;
144  dlcts1 = 0;
145  dlcts2 = 0;
146  dlcts3 = 0;
147  ephi1 = -1;
148  eeta1 = -1;
149  ept1 = -1;
150  ech1 = -1, ebx1 = -10;
151  ephi2 = -1;
152  eeta2 = -1;
153  ept2 = -1;
154  ech2 = -1, ebx2 = -10;
155  ephi3 = -1;
156  eeta3 = -1;
157  ept3 = -1;
158  ech3 = -1, ebx3 = -10;
159  erank1 = -1;
160  erank2 = -1;
161  erank3 = -1;
162  emode1 = -1;
163  emode2 = -1;
164  emode3 = -1;
165 
166  if (dataTrackProducer.label() != "null") {
169  // Muon sorter emulation:
170  std::vector<csc::L1Track> result;
171  CSCTriggerContainer<csc::L1Track> stripped_tracks;
172  for (L1CSCTrackCollection::const_iterator tmp_trk = tracks->begin(); tmp_trk != tracks->end(); tmp_trk++) {
173  csc::L1Track qqq(tmp_trk->first);
174  qqq.setOutputLink(0);
175  CSCCorrelatedLCTDigiCollection qwe = tmp_trk->second;
176  for (CSCCorrelatedLCTDigiCollection::DigiRangeIterator csc = qwe.begin(); csc != qwe.end(); csc++) {
177  CSCCorrelatedLCTDigiCollection::Range range1 = qwe.get((*csc).first);
178  for (CSCCorrelatedLCTDigiCollection::const_iterator lct = range1.first; lct != range1.second; lct++)
179  qqq.setOutputLink(qqq.outputLink() | (1 << (*csc).first.station()));
180  }
181  stripped_tracks.push_back(qqq);
182  }
183  // First we sort and crop the incoming tracks based on their rank.
184  for (int bx = -3; bx <= 3; ++bx) { // switch back into signed BX
185  std::vector<csc::L1Track> tks = stripped_tracks.get(bx);
186  std::sort(tks.begin(), tks.end(), std::greater<csc::L1Track>());
187  if (tks.size() > 4)
188  tks.resize(4); // resize to max number of muons the MS can output
189  for (std::vector<csc::L1Track>::iterator itr = tks.begin(); itr != tks.end(); itr++) {
190  unsigned gbl_phi =
191  itr->localPhi() + ((itr->sector() - 1) * 24) + 6; // for now, convert using this.. LUT in the future
192  if (gbl_phi > 143)
193  gbl_phi -= 143;
194  itr->setPhiPacked(gbl_phi & 0xff);
195  unsigned eta_sign = (itr->endcap() == 1 ? 0 : 1);
196  int gbl_eta = itr->eta_packed() | eta_sign << (L1MuRegionalCand::ETA_LENGTH - 1);
197  itr->setEtaPacked(gbl_eta & 0x3f);
198  itr->setQualityPacked((itr->rank() >> 4) & 0x3);
199  itr->setPtPacked(itr->rank() & 0x1f);
200  if (!itr->empty())
201  result.push_back(*itr);
202  }
203  }
204  // for(std::vector<csc::L1Track>::const_iterator trk=result.begin(); trk!=result.end(); trk++){
205  for (L1CSCTrackCollection::const_iterator _trk = tracks->begin(); _trk != tracks->end(); _trk++) {
206  const csc::L1Track* trk = &(_trk->first);
207  switch (nDataMuons) {
208  case 0:
209  dphi1 = ts->getPhiScale()->getLowEdge(trk->phi_packed());
211  dpt1 = trk->pt_packed();
212  dch1 = trk->charge_packed();
213  dbx1 = trk->BX();
214  dmode1 = trk->mode();
215  drank1 = trk->rank();
216  dlcts1 = trk->outputLink();
217  break;
218  case 1:
219  dphi2 = ts->getPhiScale()->getLowEdge(trk->phi_packed());
221  dpt2 = trk->pt_packed();
222  dch2 = trk->charge_packed();
223  dbx2 = trk->BX();
224  dmode2 = trk->mode();
225  drank2 = trk->rank();
226  dlcts2 = trk->outputLink();
227  break;
228  case 2:
229  dphi3 = ts->getPhiScale()->getLowEdge(trk->phi_packed());
231  dpt3 = trk->pt_packed();
232  dch3 = trk->charge_packed();
233  dbx3 = trk->BX();
234  dmode3 = trk->mode();
235  drank3 = trk->rank();
236  dlcts3 = trk->outputLink();
237  break;
238  default:
239  break;
240  }
241  if ((verbose & 2) == 2)
242  std::cout << "Data: TRK in endcap=" << trk->endcap() << " sector=" << trk->sector() << " bx=" << trk->BX()
243  << " (rank=" << trk->rank() << " localPhi=" << trk->localPhi() << " etaPacked=" << trk->eta_packed()
244  << " me1D=" << trk->me1ID() << " me2D=" << trk->me2ID() << " me3D=" << trk->me3ID()
245  << " me4D=" << trk->me4ID() << " mb1D=" << trk->mb1ID() << " pTaddr=" << std::hex
246  << trk->ptLUTAddress() << std::dec << ")" << std::endl;
247  nDataMuons++;
248  }
249  }
250 
251  if (emulTrackProducer.label() != "null") {
254  for (L1CSCTrackCollection::const_iterator trk = tracks.product()->begin(); trk != tracks.product()->end(); trk++) {
255  switch (nEmulMuons) {
256  case 0:
257  ephi1 = trk->first.localPhi();
258  eeta1 = trk->first.eta_packed();
259  ept1 = trk->first.pt_packed();
260  ech1 = trk->first.charge_packed();
261  ebx1 = trk->first.BX();
262  break;
263  case 1:
264  ephi2 = trk->first.localPhi();
265  eeta2 = trk->first.eta_packed();
266  ept2 = trk->first.pt_packed();
267  ech2 = trk->first.charge_packed();
268  ebx2 = trk->first.BX();
269  break;
270  case 2:
271  ephi3 = trk->first.localPhi();
272  eeta3 = trk->first.eta_packed();
273  ept3 = trk->first.pt_packed();
274  ech3 = trk->first.charge_packed();
275  ebx3 = trk->first.BX();
276  break;
277  default:
278  break;
279  }
280  if ((verbose & 2) == 2)
281  std::cout << "Emulator: TRK in endcap=" << trk->first.endcap() << " sector=" << trk->first.sector()
282  << " bx=" << trk->first.BX() << " (rank=" << trk->first.rank()
283  << " localPhi=" << trk->first.localPhi() << " etaPacked=" << trk->first.eta_packed()
284  << " me1D=" << trk->first.me1ID() << " me2D=" << trk->first.me2ID() << " me3D=" << trk->first.me3ID()
285  << " me4D=" << trk->first.me4ID() << " mb1D=" << trk->first.mb1ID() << " pTaddr=" << std::hex
286  << trk->first.ptLUTAddress() << std::dec << ")" << std::endl;
287  nEmulMuons++;
288  }
289  }
290 
291  tree->Fill();
292 }
unsigned mode(void) const
Definition: L1Track.h:90
T getUntrackedParameter(std::string const &, T const &) const
std::vector< T > get() const
void analyze(edm::Event const &e, edm::EventSetup const &iSetup) override
unsigned me1ID() const
Definition: L1Track.h:40
unsigned me2ID() const
Definition: L1Track.h:41
unsigned charge_packed() const
return charge packed as in hardware (0=pos, 1=neg)
edm::InputTag mbProducer
Definition: CSCTFanalyzer.h:18
virtual float getCenter(unsigned packed) const =0
get the center of bin represented by packed
void push_back(const T &data)
void endJob(void) override
edm::InputTag lctProducer
Definition: CSCTFanalyzer.h:18
unsigned mb1ID() const
Definition: L1Track.h:44
const L1MuScale * getPhiScale() const
get the phi scale
unsigned ptLUTAddress() const
Definition: L1Track.h:58
unsigned eta_packed() const
return eta packed as in hardware
unsigned sector() const
Definition: L1Track.h:47
bool isValid() const
Definition: HandleBase.h:70
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:488
Definition: L1Track.h:19
unsigned rank() const
Definition: L1Track.cc:120
unsigned localPhi() const
Definition: L1Track.h:37
unsigned outputLink() const
Definition: L1Track.h:63
T const * product() const
Definition: Handle.h:69
std::pair< const_iterator, const_iterator > Range
void setOutputLink(unsigned oPL)
Definition: L1Track.h:64
std::vector< DigiType >::const_iterator const_iterator
std::string const & label() const
Definition: InputTag.h:36
const L1MuScale * getRegionalEtaScale(int isys) const
get the regioanl muon trigger eta scale, isys = 0(DT), 1(bRPC), 2(CSC), 3(fwdRPC) ...
const L1MuTriggerScales * ts
Definition: CSCTFanalyzer.h:40
HLT enums.
unsigned endcap() const
Definition: L1Track.h:46
T get() const
Definition: EventSetup.h:73
virtual float getLowEdge(unsigned packed) const =0
get the low edge of bin represented by packed
CSCTFanalyzer(edm::ParameterSet const &pset)
Definition: CSCTFanalyzer.cc:9
edm::InputTag emulTrackProducer
Definition: CSCTFanalyzer.h:18
unsigned me4ID() const
Definition: L1Track.h:43
Definition: tree.py:1
unsigned pt_packed() const
return pt packed as in hardware
T const * product() const
Definition: ESHandle.h:86
std::string const & instance() const
Definition: InputTag.h:37
edm::InputTag dataTrackProducer
Definition: CSCTFanalyzer.h:18
int BX() const
Definition: L1Track.h:53
unsigned me3ID() const
Definition: L1Track.h:42
unsigned phi_packed() const
return phi packed as in hardware