CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RPCRecHitProducer.cc
Go to the documentation of this file.
1 
6 #include "RPCRecHitProducer.h"
7 
9 
15 
18 
22 
23 #include <string>
24 #include <fstream>
25 
26 using namespace edm;
27 using namespace std;
28 
30  theRPCDigiLabel(consumes<RPCDigiCollection>(config.getParameter<InputTag>("rpcDigiLabel"))),
31  maskSource_(MaskSource::EventSetup), deadSource_(MaskSource::EventSetup)
32 {
33  // Set verbose output
34  produces<RPCRecHitCollection>();
35 
36  // Get the concrete reconstruction algo from the factory
37  const string theAlgoName = config.getParameter<string>("recAlgo");
38  theAlgo.reset(RPCRecHitAlgoFactory::get()->create(theAlgoName,
39  config.getParameter<ParameterSet>("recAlgoConfig")));
40 
41  // Get masked- and dead-strip information
42  theRPCMaskedStripsObj = std::make_unique<RPCMaskedStrips>();
43  theRPCDeadStripsObj = std::make_unique<RPCDeadStrips>();
44 
45  const string maskSource = config.getParameter<std::string>("maskSource");
46  if (maskSource == "File") {
48  edm::FileInPath fp = config.getParameter<edm::FileInPath>("maskvecfile");
49  std::ifstream inputFile(fp.fullPath().c_str(), std::ios::in);
50  if ( !inputFile ) {
51  std::cerr << "Masked Strips File cannot not be opened" << std::endl;
52  exit(1);
53  }
54  while ( inputFile.good() ) {
56  inputFile >> Item.rawId >> Item.strip;
57  if ( inputFile.good() ) MaskVec.push_back(Item);
58  }
59  inputFile.close();
60  }
61 
62  const string deadSource = config.getParameter<std::string>("deadSource");
63  if (deadSource == "File") {
65  edm::FileInPath fp = config.getParameter<edm::FileInPath>("deadvecfile");
66  std::ifstream inputFile(fp.fullPath().c_str(), std::ios::in);
67  if ( !inputFile ) {
68  std::cerr << "Dead Strips File cannot not be opened" << std::endl;
69  exit(1);
70  }
71  while ( inputFile.good() ) {
73  inputFile >> Item.rawId >> Item.strip;
74  if ( inputFile.good() ) DeadVec.push_back(Item);
75  }
76  inputFile.close();
77  }
78 }
79 
80 
82  // Getting the masked-strip information
84  edm::ESHandle<RPCMaskedStrips> readoutMaskedStrips;
85  setup.get<RPCMaskedStripsRcd>().get(readoutMaskedStrips);
86  const RPCMaskedStrips* tmp_obj = readoutMaskedStrips.product();
87  theRPCMaskedStripsObj->MaskVec = tmp_obj->MaskVec;
88  delete tmp_obj;
89  }
90  else if ( maskSource_ == MaskSource::File ) {
91  std::vector<RPCMaskedStrips::MaskItem>::iterator posVec;
92  for ( posVec = MaskVec.begin(); posVec != MaskVec.end(); ++posVec ) {
94  Item.rawId = (*posVec).rawId;
95  Item.strip = (*posVec).strip;
96  theRPCMaskedStripsObj->MaskVec.push_back(Item);
97  }
98  }
99 
100  // Getting the dead-strip information
102  edm::ESHandle<RPCDeadStrips> readoutDeadStrips;
103  setup.get<RPCDeadStripsRcd>().get(readoutDeadStrips);
104  const RPCDeadStrips* tmp_obj = readoutDeadStrips.product();
105  theRPCDeadStripsObj->DeadVec = tmp_obj->DeadVec;
106  delete tmp_obj;
107  }
108  else if ( deadSource_ == MaskSource::File ) {
109  std::vector<RPCDeadStrips::DeadItem>::iterator posVec;
110  for ( posVec = DeadVec.begin(); posVec != DeadVec.end(); ++posVec ) {
112  Item.rawId = (*posVec).rawId;
113  Item.strip = (*posVec).strip;
114  theRPCDeadStripsObj->DeadVec.push_back(Item);
115  }
116  }
117 
118 }
119 
121  // Get the RPC Geometry
122  ESHandle<RPCGeometry> rpcGeom;
123  setup.get<MuonGeometryRecord>().get(rpcGeom);
124 
125  // Get the digis from the event
127  event.getByToken(theRPCDigiLabel,digis);
128 
129  // Pass the EventSetup to the algo
130  theAlgo->setES(setup);
131 
132  // Create the pointer to the collection which will store the rechits
133  auto recHitCollection = std::make_unique<RPCRecHitCollection>();
134 
135  // Iterate through all digi collections ordered by LayerId
136 
137  for ( auto rpcdgIt = digis->begin(); rpcdgIt != digis->end(); ++rpcdgIt ) {
138  // The layerId
139  const RPCDetId& rpcId = (*rpcdgIt).first;
140 
141  // Get the GeomDet from the setup
142  const RPCRoll* roll = rpcGeom->roll(rpcId);
143  if (roll == 0){
144  edm::LogError("BadDigiInput")<<"Failed to find RPCRoll for ID "<<rpcId;
145  continue;
146  }
147 
148  // Get the iterators over the digis associated with this LayerId
149  const RPCDigiCollection::Range& range = (*rpcdgIt).second;
150 
151  // Getting the roll mask, that includes dead strips, for the given RPCDet
152  RollMask mask;
153  const int rawId = rpcId.rawId();
154  for ( const auto& tomask : theRPCMaskedStripsObj->MaskVec ) {
155  if ( tomask.rawId == rawId ) {
156  const int bit = tomask.strip;
157  mask.set(bit-1);
158  }
159  }
160 
161  for ( const auto& tomask : theRPCDeadStripsObj->DeadVec ) {
162  if ( tomask.rawId == rawId ) {
163  const int bit = tomask.strip;
164  mask.set(bit-1);
165  }
166  }
167 
168  // Call the reconstruction algorithm
169  OwnVector<RPCRecHit> recHits = theAlgo->reconstruct(*roll, rpcId, range, mask);
170 
171  if(recHits.size() > 0) //FIXME: is it really needed?
172  recHitCollection->put(rpcId, recHits.begin(), recHits.end());
173  }
174 
175  event.put(std::move(recHitCollection));
176 
177 }
178 
T getParameter(std::string const &) const
std::vector< MaskItem > MaskVec
size_type size() const
Definition: OwnVector.h:264
std::unique_ptr< RPCRecHitBaseAlgo > theAlgo
virtual void beginRun(const edm::Run &, const edm::EventSetup &) override
iterator begin()
Definition: OwnVector.h:244
enum RPCRecHitProducer::MaskSource deadSource_
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
virtual void produce(edm::Event &event, const edm::EventSetup &setup) override
The method which produces the rechits.
def move
Definition: eostools.py:510
const edm::EDGetTokenT< RPCDigiCollection > theRPCDigiLabel
std::bitset< maskSIZE > RollMask
Definition: RPCRollMask.h:7
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
std::unique_ptr< RPCMaskedStrips > theRPCMaskedStripsObj
iterator end()
Definition: OwnVector.h:249
std::vector< RPCDeadStrips::DeadItem > DeadVec
RPCRecHitProducer(const edm::ParameterSet &config)
Constructor.
const T & get() const
Definition: EventSetup.h:56
T const * product() const
Definition: ESHandle.h:86
enum RPCRecHitProducer::MaskSource maskSource_
std::vector< DeadItem > DeadVec
Definition: RPCDeadStrips.h:28
std::vector< RPCMaskedStrips::MaskItem > MaskVec
std::pair< const_iterator, const_iterator > Range
std::string fullPath() const
Definition: FileInPath.cc:184
T get(const Candidate &c)
Definition: component.h:55
std::unique_ptr< RPCDeadStrips > theRPCDeadStripsObj
Definition: Run.h:42