CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
CSCTFanalyzer.cc
Go to the documentation of this file.
1 #include "CSCTFanalyzer.h"
7 
8 CSCTFanalyzer::CSCTFanalyzer(edm::ParameterSet const& pset) : edm::EDAnalyzer() {
9  verbose = pset.getUntrackedParameter<unsigned int>("verbose", 0);
10  dataTrackProducer = pset.getUntrackedParameter<edm::InputTag>("dataTrackProducer", edm::InputTag("csctfDigis"));
11  emulTrackProducer = pset.getUntrackedParameter<edm::InputTag>("emulTrackProducer", edm::InputTag("csctfTrackDigis"));
12  lctProducer = pset.getUntrackedParameter<edm::InputTag>("lctProducer", edm::InputTag("csctfDigis"));
13  mbProducer = pset.getUntrackedParameter<edm::InputTag>("mbProducer", edm::InputTag("csctfDigis"));
14  scalesToken = esConsumes<L1MuTriggerScales, L1MuTriggerScalesRcd>();
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  ts = scales.product();
79  }
80 
81  if (lctProducer.label() != "null") {
84 
85  for (CSCCorrelatedLCTDigiCollection::DigiRangeIterator csc = LCTs.product()->begin(); csc != LCTs.product()->end();
86  csc++) {
87  int lctId = 0;
88 
89  CSCCorrelatedLCTDigiCollection::Range range1 = LCTs.product()->get((*csc).first);
90  for (CSCCorrelatedLCTDigiCollection::const_iterator lct = range1.first; lct != range1.second; lct++, lctId++) {
91  int station = (*csc).first.station() - 1;
92  int cscId = (*csc).first.triggerCscId() - 1;
93  int sector = (*csc).first.triggerSector() - 1 + ((*csc).first.endcap() == 1 ? 0 : 6);
94  //int subSector = CSCTriggerNumbering::triggerSubSectorFromLabels((*csc).first);
95  int tbin = lct->getBX();
96  //int fpga = ( subSector ? subSector-1 : station+1 );
97  if ((verbose & 1) == 1)
98  std::cout << "LCT in station=" << (station + 1) << " sector=" << (sector + 1) << " cscId=" << (cscId + 1)
99  << " bx=" << tbin << std::endl;
100  }
101  }
102  }
103 
104  if (mbProducer.label() != "null") {
106  e.getByLabel(mbProducer.label(), mbProducer.instance(), dtStubs);
107  if (dtStubs.isValid()) {
108  std::vector<csctf::TrackStub> vstubs = dtStubs->get();
109  for (std::vector<csctf::TrackStub>::const_iterator stub = vstubs.begin(); stub != vstubs.end(); stub++) {
110  //int dtSector =(stub->sector()-1)*2 + stub->subsector()-1;
111  //int dtEndcap = stub->endcap()-1;
112  std::cout << " DT data: tbin=" << stub->BX() << " (CSC) sector=" << stub->sector()
113  << " (CSC) subsector=" << stub->subsector() << " station=" << stub->station()
114  << " endcap=" << stub->endcap() << " phi=" << stub->phiPacked() << " phiBend=" << stub->getBend()
115  << " quality=" << stub->getQuality() << " id=" << stub->getMPCLink() << " mb_bxn=" << stub->cscid()
116  << std::endl;
117  }
118 
119  } else
120  edm::LogInfo("CSCTFAnalyzer") << " No valid CSCTriggerContainer<csctf::TrackStub> products found";
121  }
122 
123  nDataMuons = 0;
124  nEmulMuons = 0;
125  dphi1 = -1;
126  deta1 = -1;
127  dpt1 = -1;
128  dch1 = -1, dbx1 = -10;
129  dphi2 = -1;
130  deta2 = -1;
131  dpt2 = -1;
132  dch2 = -1, dbx2 = -10;
133  dphi3 = -1;
134  deta3 = -1;
135  dpt3 = -1;
136  dch3 = -1, dbx3 = -10;
137  drank1 = -1;
138  drank2 = -1;
139  drank3 = -1;
140  dmode1 = -1;
141  dmode2 = -1;
142  dmode3 = -1;
143  dlcts1 = 0;
144  dlcts2 = 0;
145  dlcts3 = 0;
146  ephi1 = -1;
147  eeta1 = -1;
148  ept1 = -1;
149  ech1 = -1, ebx1 = -10;
150  ephi2 = -1;
151  eeta2 = -1;
152  ept2 = -1;
153  ech2 = -1, ebx2 = -10;
154  ephi3 = -1;
155  eeta3 = -1;
156  ept3 = -1;
157  ech3 = -1, ebx3 = -10;
158  erank1 = -1;
159  erank2 = -1;
160  erank3 = -1;
161  emode1 = -1;
162  emode2 = -1;
163  emode3 = -1;
164 
165  if (dataTrackProducer.label() != "null") {
168  // Muon sorter emulation:
169  std::vector<csc::L1Track> result;
170  CSCTriggerContainer<csc::L1Track> stripped_tracks;
171  for (L1CSCTrackCollection::const_iterator tmp_trk = tracks->begin(); tmp_trk != tracks->end(); tmp_trk++) {
172  csc::L1Track qqq(tmp_trk->first);
173  qqq.setOutputLink(0);
174  CSCCorrelatedLCTDigiCollection qwe = tmp_trk->second;
175  for (CSCCorrelatedLCTDigiCollection::DigiRangeIterator csc = qwe.begin(); csc != qwe.end(); csc++) {
176  CSCCorrelatedLCTDigiCollection::Range range1 = qwe.get((*csc).first);
177  for (CSCCorrelatedLCTDigiCollection::const_iterator lct = range1.first; lct != range1.second; lct++)
178  qqq.setOutputLink(qqq.outputLink() | (1 << (*csc).first.station()));
179  }
180  stripped_tracks.push_back(qqq);
181  }
182  // First we sort and crop the incoming tracks based on their rank.
183  for (int bx = -3; bx <= 3; ++bx) { // switch back into signed BX
184  std::vector<csc::L1Track> tks = stripped_tracks.get(bx);
185  std::sort(tks.begin(), tks.end(), std::greater<csc::L1Track>());
186  if (tks.size() > 4)
187  tks.resize(4); // resize to max number of muons the MS can output
188  for (std::vector<csc::L1Track>::iterator itr = tks.begin(); itr != tks.end(); itr++) {
189  unsigned gbl_phi =
190  itr->localPhi() + ((itr->sector() - 1) * 24) + 6; // for now, convert using this.. LUT in the future
191  if (gbl_phi > 143)
192  gbl_phi -= 143;
193  itr->setPhiPacked(gbl_phi & 0xff);
194  unsigned eta_sign = (itr->endcap() == 1 ? 0 : 1);
195  int gbl_eta = itr->eta_packed() | eta_sign << (L1MuRegionalCand::ETA_LENGTH - 1);
196  itr->setEtaPacked(gbl_eta & 0x3f);
197  itr->setQualityPacked((itr->rank() >> 4) & 0x3);
198  itr->setPtPacked(itr->rank() & 0x1f);
199  if (!itr->empty())
200  result.push_back(*itr);
201  }
202  }
203  // for(std::vector<csc::L1Track>::const_iterator trk=result.begin(); trk!=result.end(); trk++){
204  for (L1CSCTrackCollection::const_iterator _trk = tracks->begin(); _trk != tracks->end(); _trk++) {
205  const csc::L1Track* trk = &(_trk->first);
206  switch (nDataMuons) {
207  case 0:
208  dphi1 = ts->getPhiScale()->getLowEdge(trk->phi_packed());
210  dpt1 = trk->pt_packed();
211  dch1 = trk->charge_packed();
212  dbx1 = trk->BX();
213  dmode1 = trk->mode();
214  drank1 = trk->rank();
215  dlcts1 = trk->outputLink();
216  break;
217  case 1:
218  dphi2 = ts->getPhiScale()->getLowEdge(trk->phi_packed());
220  dpt2 = trk->pt_packed();
221  dch2 = trk->charge_packed();
222  dbx2 = trk->BX();
223  dmode2 = trk->mode();
224  drank2 = trk->rank();
225  dlcts2 = trk->outputLink();
226  break;
227  case 2:
228  dphi3 = ts->getPhiScale()->getLowEdge(trk->phi_packed());
230  dpt3 = trk->pt_packed();
231  dch3 = trk->charge_packed();
232  dbx3 = trk->BX();
233  dmode3 = trk->mode();
234  drank3 = trk->rank();
235  dlcts3 = trk->outputLink();
236  break;
237  default:
238  break;
239  }
240  if ((verbose & 2) == 2)
241  std::cout << "Data: TRK in endcap=" << trk->endcap() << " sector=" << trk->sector() << " bx=" << trk->BX()
242  << " (rank=" << trk->rank() << " localPhi=" << trk->localPhi() << " etaPacked=" << trk->eta_packed()
243  << " me1D=" << trk->me1ID() << " me2D=" << trk->me2ID() << " me3D=" << trk->me3ID()
244  << " me4D=" << trk->me4ID() << " mb1D=" << trk->mb1ID() << " pTaddr=" << std::hex
245  << trk->ptLUTAddress() << std::dec << ")" << std::endl;
246  nDataMuons++;
247  }
248  }
249 
250  if (emulTrackProducer.label() != "null") {
253  for (L1CSCTrackCollection::const_iterator trk = tracks.product()->begin(); trk != tracks.product()->end(); trk++) {
254  switch (nEmulMuons) {
255  case 0:
256  ephi1 = trk->first.localPhi();
257  eeta1 = trk->first.eta_packed();
258  ept1 = trk->first.pt_packed();
259  ech1 = trk->first.charge_packed();
260  ebx1 = trk->first.BX();
261  break;
262  case 1:
263  ephi2 = trk->first.localPhi();
264  eeta2 = trk->first.eta_packed();
265  ept2 = trk->first.pt_packed();
266  ech2 = trk->first.charge_packed();
267  ebx2 = trk->first.BX();
268  break;
269  case 2:
270  ephi3 = trk->first.localPhi();
271  eeta3 = trk->first.eta_packed();
272  ept3 = trk->first.pt_packed();
273  ech3 = trk->first.charge_packed();
274  ebx3 = trk->first.BX();
275  break;
276  default:
277  break;
278  }
279  if ((verbose & 2) == 2)
280  std::cout << "Emulator: TRK in endcap=" << trk->first.endcap() << " sector=" << trk->first.sector()
281  << " bx=" << trk->first.BX() << " (rank=" << trk->first.rank()
282  << " localPhi=" << trk->first.localPhi() << " etaPacked=" << trk->first.eta_packed()
283  << " me1D=" << trk->first.me1ID() << " me2D=" << trk->first.me2ID() << " me3D=" << trk->first.me3ID()
284  << " me4D=" << trk->first.me4ID() << " mb1D=" << trk->first.mb1ID() << " pTaddr=" << std::hex
285  << trk->first.ptLUTAddress() << std::dec << ")" << std::endl;
286  nEmulMuons++;
287  }
288  }
289 
290  tree->Fill();
291 }
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
virtual float getLowEdge(unsigned packed) const =0
get the low edge of bin represented by packed
unsigned charge_packed() const
return charge packed as in hardware (0=pos, 1=neg)
auto const & tracks
cannot be loose
edm::InputTag mbProducer
Definition: CSCTFanalyzer.h:20
virtual float getCenter(unsigned packed) const =0
get the center of bin represented by packed
void push_back(const T &data)
tuple result
Definition: mps_fire.py:311
void endJob(void) override
edm::InputTag lctProducer
Definition: CSCTFanalyzer.h:20
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:500
unsigned rank() const
Definition: L1Track.cc:120
Log< level::Info, false > LogInfo
unsigned localPhi() const
Definition: L1Track.h:37
edm::ESGetToken< L1MuTriggerScales, L1MuTriggerScalesRcd > scalesToken
Definition: CSCTFanalyzer.h:21
unsigned outputLink() const
Definition: L1Track.h:63
T const * product() const
Definition: Handle.h:70
std::pair< const_iterator, const_iterator > Range
void setOutputLink(unsigned oPL)
Definition: L1Track.h:64
T const * product() const
Definition: ESHandle.h:86
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:43
unsigned endcap() const
Definition: L1Track.h:46
CSCTFanalyzer(edm::ParameterSet const &pset)
Definition: CSCTFanalyzer.cc:8
edm::InputTag emulTrackProducer
Definition: CSCTFanalyzer.h:20
unsigned me4ID() const
Definition: L1Track.h:43
tuple cout
Definition: gather_cfg.py:144
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:157
unsigned pt_packed() const
return pt packed as in hardware
std::string const & instance() const
Definition: InputTag.h:37
edm::InputTag dataTrackProducer
Definition: CSCTFanalyzer.h:20
int BX() const
Definition: L1Track.h:53
unsigned me3ID() const
Definition: L1Track.h:42
unsigned phi_packed() const
return phi packed as in hardware