CMS 3D CMS Logo

HLTDTActivityFilter.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: HLTDTActivityFilter
4 // Class: HLTDTActivityFilter
5 //
6 
7 
8 /*
9 
10 Description: Filter to select events with activity in the muon barrel system
11 
12 */
13 
14 
15 //
16 // Original Author: Carlo Battilana
17 // Created: Tue Jan 22 13:55:00 CET 2008
18 //
19 //
20 
21 
22 #include "HLTDTActivityFilter.h"
23 
24 // c++ header files
25 #include <vector>
26 #include <string>
27 #include <map>
28 #include <iostream>
29 #include <memory>
30 
31 // Fwk header files
34 
39 
40 
41 // Typedefs
42 typedef std::map<uint32_t,std::bitset<4> > activityMap; // bitset map according to ActivityType enum
43 
44 
45 //
46 // constructors and destructor
47 //
49 
50  using namespace std;
51 
52  inputTag_[DCC] = iConfig.getParameter<edm::InputTag>("inputDCC");
53  inputTag_[DDU] = iConfig.getParameter<edm::InputTag>("inputDDU");
54  inputTag_[RPC] = iConfig.getParameter<edm::InputTag>("inputRPC");
55  inputTag_[DIGI] = iConfig.getParameter<edm::InputTag>("inputDigis");
56 
57  process_[DCC] = iConfig.getParameter<bool>("processDCC");
58  process_[DDU] = iConfig.getParameter<bool>("processDDU");
59  process_[RPC] = iConfig.getParameter<bool>("processRPC");
60  process_[DIGI] = iConfig.getParameter<bool>("processDigis");
61 
62  orTPG_ = iConfig.getParameter<bool>("orTPG");
63  orRPC_ = iConfig.getParameter<bool>("orRPC");
64  orDigi_ = iConfig.getParameter<bool>("orDigi");
65 
66  minBX_[DCC] = iConfig.getParameter<int>("minDCCBX");
67  maxBX_[DCC] = iConfig.getParameter<int>("maxDCCBX");
68  minBX_[DDU] = iConfig.getParameter<int>("minDDUBX");
69  maxBX_[DDU] = iConfig.getParameter<int>("maxDDUBX");
70  minBX_[RPC] = iConfig.getParameter<int>("minRPCBX");
71  maxBX_[RPC] = iConfig.getParameter<int>("maxRPCBX");
72 
73  minQual_ = iConfig.getParameter<int>("minTPGQual");
74  maxStation_ = iConfig.getParameter<int>("maxStation");
75  minChambLayers_ = iConfig.getParameter<int>("minChamberLayers");
76  minActiveChambs_ = iConfig.getParameter<int>("minActiveChambs");
77 
78  maxDeltaPhi_ = iConfig.getParameter<double>("maxDeltaPhi");
79  maxDeltaEta_ = iConfig.getParameter<double>("maxDeltaEta");
80 
81 
82  activeSecs_.reset();
83  vector<int> aSectors = iConfig.getParameter<vector<int> >("activeSectors");
84  vector<int>::const_iterator iSec = aSectors.begin();
85  vector<int>::const_iterator eSec = aSectors.end();
86  for (;iSec!=eSec;++iSec)
87  if ((*iSec)>0 && (*iSec<15)) activeSecs_.set((*iSec));
88 
89  inputDCCToken_ = consumes<L1MuDTChambPhContainer>(inputTag_[DCC]);
90  inputDDUToken_ = consumes<DTLocalTriggerCollection>(inputTag_[DDU]);
91  inputRPCToken_ = consumes<L1MuGMTReadoutCollection>(inputTag_[RPC]);
92  inputDigiToken_ = consumes<DTDigiCollection>(inputTag_[DIGI]);
93 }
94 
95 
97 
98 void
102  desc.add<edm::InputTag>("inputDCC",edm::InputTag("hltDTTFUnpacker"));
103  desc.add<edm::InputTag>("inputDDU",edm::InputTag("hltMuonDTDigis"));
104  desc.add<edm::InputTag>("inputRPC",edm::InputTag("hltGtDigis"));
105  desc.add<edm::InputTag>("inputDigis",edm::InputTag("hltMuonDTDigis"));
106  desc.add<bool>("processDCC",true);
107  desc.add<bool>("processDDU",true);
108  desc.add<bool>("processRPC",true);
109  desc.add<bool>("processDigis",true);
110  desc.add<bool>("orTPG",true);
111  desc.add<bool>("orRPC",true);
112  desc.add<bool>("orDigi",false)->
113  setComment(" # && of trig & digi info");
114  desc.add<int>("minDCCBX",-1);
115  desc.add<int>("maxDCCBX",1);
116  desc.add<int>("minDDUBX",8);
117  desc.add<int>("maxDDUBX",13);
118  desc.add<int>("minRPCBX",-1);
119  desc.add<int>("maxRPCBX",1);
120  desc.add<int>("minTPGQual",2.)->
121  setComment(" # 0-1=L 2-3=H 4=LL 5=HL 6=HH");
122  desc.add<int>("maxStation",3.);
123  desc.add<int>("minChamberLayers",5);
124  desc.add<int>("minActiveChambs",1);
125  desc.add<double>("MaxDeltaPhi",1.0);
126  desc.add<double>("MaxDeltaEta",0.3);
127  std::vector<int> temp; for (int i=1; i<=12; i++) temp.push_back(i);
128  desc.add<std::vector<int> >("activeSectors", temp);
129  descriptions.add("hltDTActivityFilter",desc);
130 }
131 
132 //
133 // member functions
134 //
135 
136 // ------------ method called on each new Event ------------
138 
139  using namespace edm;
140  using namespace std;
141 
142  activityMap actMap;
143 
144  if (process_[DCC]) {
145 
147  iEvent.getByToken(inputDCCToken_,l1DTTPGPh);
148  vector<L1MuDTChambPhDigi> const* phTrigs = l1DTTPGPh->getContainer();
149  auto iph = phTrigs->begin();
150  auto iphe = phTrigs->end();
151 
152  for(; iph !=iphe ; ++iph) {
153 
154  int qual = iph->code();
155  int bx = iph->bxNum();
156  int ch = iph->stNum();
157  int sec = iph->scNum() + 1; // DTTF range [0:11] -> DT SC range [1:12]
158  int wh = iph->whNum();
159 
160  if (!activeSecs_[sec]) continue;
161 
162  if (ch<=maxStation_ && bx>=minBX_[DCC] && bx<=maxBX_[DCC]
163  && qual>=minQual_ && qual<7) {
164  actMap[DTChamberId(wh,ch,sec).rawId()].set(DCC);
165  }
166 
167  }
168 
169  }
170 
171  if (process_[DDU]) {
172 
174  iEvent.getByToken(inputDDUToken_,trigsDDU);
176 
177  for (detUnitIt=trigsDDU->begin();detUnitIt!=trigsDDU->end();++detUnitIt){
178 
179  int ch = (*detUnitIt).first.station();
180  if (!activeSecs_[(*detUnitIt).first.sector()]) continue;
181 
182  const DTLocalTriggerCollection::Range& range = (*detUnitIt).second;
183 
184  for (DTLocalTriggerCollection::const_iterator trigIt = range.first; trigIt!=range.second;++trigIt){
185  int bx = trigIt->bx();
186  int qual = trigIt->quality();
187  if ( ch<=maxStation_ && bx>=minBX_[DDU] && bx<=maxBX_[DDU]
188  && qual>=minQual_ && qual<7) {
189  actMap[(*detUnitIt).first.rawId()].set(DDU);
190  }
191 
192  }
193 
194  }
195 
196  }
197 
198  if (process_[DIGI]) {
199 
201  iEvent.getByToken(inputDigiToken_, dtdigis);
202  std::map<uint32_t,int> hitMap;
204 
205  for (dtLayerIdIt=dtdigis->begin(); dtLayerIdIt!=dtdigis->end(); dtLayerIdIt++) {
206 
207  DTChamberId chId = ((*dtLayerIdIt).first).chamberId();
208  if (!activeSecs_[(*dtLayerIdIt).first.sector()]) continue;
209  uint32_t rawId = chId.rawId();
210  int station = chId.station();
211 
212  if (station<=maxStation_) {
213  if (hitMap.find(rawId)!=hitMap.end()) {
214  hitMap[rawId]++;
215  } else {
216  hitMap[rawId]=1;
217  }
218  if (hitMap[rawId]>=minChambLayers_) {
219  actMap[chId.rawId()].set(DIGI);
220  }
221  }
222 
223  }
224 
225  }
226 
227  if (process_[RPC]) {
229  iSetup.get<MuonGeometryRecord>().get(dtGeom);
230 
232  iEvent.getByToken(inputRPCToken_,gmtrc);
233 
234  std::vector<L1MuGMTReadoutRecord> gmtrr = gmtrc->getRecords();
235  std::vector<L1MuGMTReadoutRecord>::const_iterator recIt = gmtrr.begin();
236  std::vector<L1MuGMTReadoutRecord>::const_iterator recEnd = gmtrr.end();
237 
238  for(; recIt!=recEnd; ++recIt) {
239 
240  std::vector<L1MuRegionalCand> rpcCands = (*recIt).getBrlRPCCands();
241  std::vector<L1MuRegionalCand>::const_iterator candIt = rpcCands.begin();
242  std::vector<L1MuRegionalCand>::const_iterator candEnd = rpcCands.end();
243 
244  for(; candIt!=candEnd; ++candIt) {
245 
246  if (candIt->empty()) continue;
247  int bx = (*candIt).bx();
248 
249  if (bx>=minBX_[RPC] && bx<=maxBX_[RPC]) {
250  auto actMapIt = actMap.begin();
251  auto actMapEnd = actMap.end();
252  for (; actMapIt!= actMapEnd; ++ actMapIt)
253  if (matchChamber(actMapIt->first, *candIt, dtGeom.product()))
254  actMapIt->second.set(RPC);
255  }
256  }
257  }
258 
259  }
260 
261  int nActCh = 0;
262  activityMap::const_iterator actMapIt = actMap.begin();
263  activityMap::const_iterator actMapEnd = actMap.end();
264 
265  for (; actMapIt!=actMapEnd; ++actMapIt)
266  hasActivity((*actMapIt).second) && nActCh++ ;
267 
268  bool result = nActCh>=minActiveChambs_;
269 
270  return result;
271 
272 }
273 
274 
275 bool HLTDTActivityFilter::hasActivity(const std::bitset<4>& actWord) const {
276 
277  bool actTPG = orTPG_ ? actWord[DCC] || actWord[DDU] : actWord[DCC] && actWord[DDU];
278  bool actTrig = orRPC_ ? actWord[RPC] || actTPG : actWord[RPC] && actTPG;
279  bool result = orDigi_ ? actWord[DIGI] || actTrig : actWord[DIGI] && actTrig;
280 
281  return result;
282 
283 }
284 
285 bool HLTDTActivityFilter::matchChamber(uint32_t rawId, L1MuRegionalCand const & rpcTrig, DTGeometry const * dtGeom) const {
286 
287  const GlobalPoint chPos = dtGeom->chamber(DTChamberId(rawId))->position();
288 
289  float fDeltaPhi = fabs( chPos.phi() - rpcTrig.phiValue() );
290  if ( fDeltaPhi>Geom::pi() ) fDeltaPhi = fabs(fDeltaPhi - 2*Geom::pi());
291 
292  float fDeltaEta = fabs( chPos.eta() - rpcTrig.etaValue() );
293 
294  bool result = fDeltaPhi<maxDeltaPhi_ && fDeltaEta<maxDeltaEta_;
295 
296  return result;
297 
298 }
299 
300 
301 // define as a framework module
edm::EDGetTokenT< L1MuGMTReadoutCollection > inputRPCToken_
T getParameter(std::string const &) const
float etaValue() const
get eta-value of muon candidate
const DTChamber * chamber(const DTChamberId &id) const
Return a DTChamber given its id.
Definition: DTGeometry.cc:117
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
edm::EDGetTokenT< L1MuDTChambPhContainer > inputDCCToken_
edm::InputTag inputTag_[4]
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:50
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::bitset< 15 > activeSecs_
bool matchChamber(uint32_t rawId, L1MuRegionalCand const &rpcTrig, DTGeometry const *dtGeom) const
HLTDTActivityFilter(const edm::ParameterSet &)
bool hasActivity(const std::bitset< 4 > &) const
edm::EDGetTokenT< DTLocalTriggerCollection > inputDDUToken_
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const Surface::PositionType & position() const
The position (origin of the R.F.)
Definition: GeomDet.h:48
std::map< uint32_t, std::bitset< 4 > > activityMap
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
ParameterDescriptionBase * add(U const &iLabel, T const &value)
float phiValue() const
get phi-value of muon candidate in radians (low edge of bin)
edm::EDGetTokenT< DTDigiCollection > inputDigiToken_
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
std::vector< DigiType >::const_iterator const_iterator
Phi_Container const * getContainer() const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
T eta() const
Definition: PV3DBase.h:76
HLT enums.
std::vector< L1MuGMTReadoutRecord > const & getRecords() const
T get() const
Definition: EventSetup.h:71
std::pair< const_iterator, const_iterator > Range
constexpr double pi()
Definition: Pi.h:31
int station() const
Return the station number.
Definition: DTChamberId.h:51
T const * product() const
Definition: ESHandle.h:86
~HLTDTActivityFilter() override