CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuonTruth.cc
Go to the documentation of this file.
7 
9  theDigiSimLinks(0),
10  theWireDigiSimLinks(0),
11  linksTag(conf.getParameter<edm::InputTag>("CSClinksTag")),
12  wireLinksTag(conf.getParameter<edm::InputTag>("CSCwireLinksTag")),
13  // CrossingFrame used or not ?
14  crossingframe(conf.getParameter<bool>("crossingframe")),
15  CSCsimHitsTag(conf.getParameter<edm::InputTag>("CSCsimHitsTag")),
16  CSCsimHitsXFTag(conf.getParameter<edm::InputTag>("CSCsimHitsXFTag"))
17 
18 {
19  edm::Handle<DigiSimLinks> digiSimLinks;
20  LogTrace("MuonTruth") <<"getting CSC Strip DigiSimLink collection - "<<linksTag;
21  event.getByLabel(linksTag, digiSimLinks);
22  theDigiSimLinks = digiSimLinks.product();
23 
24  edm::Handle<DigiSimLinks> wireDigiSimLinks;
25  LogTrace("MuonTruth") <<"getting CSC Wire DigiSimLink collection - "<<wireLinksTag;
26  event.getByLabel(wireLinksTag, wireDigiSimLinks);
27  theWireDigiSimLinks = wireDigiSimLinks.product();
28 
29  // get CSC Geometry to use CSCLayer methods
31  setup.get<MuonGeometryRecord>().get( mugeom );
32  cscgeom = &*mugeom;
33 
34  // get CSC Bad Chambers (ME4/2)
36  setup.get<CSCBadChambersRcd>().get(badChambers);
37  cscBadChambers = badChambers.product();
38 
39  theSimHitMap.clear();
40 
41  if (crossingframe) {
42 
44  LogTrace("MuonTruth") <<"getting CrossingFrame<PSimHit> collection - "<<CSCsimHitsXFTag;
45  event.getByLabel(CSCsimHitsXFTag, cf);
46 
47  std::auto_ptr<MixCollection<PSimHit> >
48  CSCsimhits( new MixCollection<PSimHit>(cf.product()) );
49  LogTrace("MuonTruth") <<"... size = "<<CSCsimhits->size();
50 
51  for(MixCollection<PSimHit>::MixItr hitItr = CSCsimhits->begin();
52  hitItr != CSCsimhits->end(); ++hitItr)
53  {
54  theSimHitMap[hitItr->detUnitId()].push_back(*hitItr);
55  }
56 
57  } else if (!CSCsimHitsTag.label().empty()){
58 
60  LogTrace("MuonTruth") <<"getting PSimHit collection - "<<CSCsimHitsTag;
61  event.getByLabel(CSCsimHitsTag, CSCsimhits);
62  LogTrace("MuonTruth") <<"... size = "<<CSCsimhits->size();
63 
64  for(edm::PSimHitContainer::const_iterator hitItr = CSCsimhits->begin();
65  hitItr != CSCsimhits->end(); ++hitItr)
66  {
67  theSimHitMap[hitItr->detUnitId()].push_back(*hitItr);
68  }
69  }
70 }
71 
73 {
74  if(theChargeMap.size() == 0) return 0.;
75 
76  float muonCharge = 0.;
77  for(std::map<SimHitIdpr, float>::const_iterator chargeMapItr = theChargeMap.begin();
78  chargeMapItr != theChargeMap.end(); ++chargeMapItr)
79  {
80  if( abs(particleType(chargeMapItr->first)) == 13)
81  {
82  muonCharge += chargeMapItr->second;
83  }
84  }
85 
86  return muonCharge / theTotalCharge;
87 }
88 
89 
90 std::vector<PSimHit> MuonTruth::simHits()
91 {
92  std::vector<PSimHit> result;
93  for(std::map<SimHitIdpr, float>::const_iterator chargeMapItr = theChargeMap.begin();
94  chargeMapItr != theChargeMap.end(); ++chargeMapItr)
95  {
96  std::vector<PSimHit> trackHits = hitsFromSimTrack(chargeMapItr->first);
97  result.insert(result.end(), trackHits.begin(), trackHits.end());
98  }
99 
100  return result;
101 }
102 
103 
104 std::vector<PSimHit> MuonTruth::muonHits()
105 {
106  std::vector<PSimHit> result;
107  std::vector<PSimHit> allHits = simHits();
108  std::vector<PSimHit>::const_iterator hitItr = allHits.begin(), lastHit = allHits.end();
109 
110  for( ; hitItr != lastHit; ++hitItr)
111  {
112  if(abs((*hitItr).particleType()) == 13)
113  {
114  result.push_back(*hitItr);
115  }
116  }
117  return result;
118 }
119 
120 
121 std::vector<MuonTruth::SimHitIdpr> MuonTruth::associateCSCHitId(const CSCRecHit2D * cscrechit) {
122  std::vector<SimHitIdpr> simtrackids;
123 
124  theDetId = cscrechit->geographicalId().rawId();
125  int nchannels = cscrechit->channels().size();
126  const CSCLayerGeometry * laygeom = cscgeom->layer(cscrechit->cscDetId())->geometry();
127 
129 
130  if (layerLinks != theDigiSimLinks->end()) {
131 
132  for(int idigi = 0; idigi < nchannels; ++idigi) {
133  // strip and readout channel numbers may differ in ME1/1A
134  int istrip = cscrechit->channels()[idigi];
135  int channel = laygeom->channel(istrip);
136 
137  for (LayerLinks::const_iterator link=layerLinks->begin(); link!=layerLinks->end(); ++link) {
138  int ch = static_cast<int>(link->channel());
139  if (ch == channel) {
140  SimHitIdpr currentId(link->SimTrackId(), link->eventId());
141  if (find(simtrackids.begin(), simtrackids.end(), currentId) == simtrackids.end())
142  simtrackids.push_back(currentId);
143  }
144  }
145  }
146 
147  } else edm::LogWarning("MuonTruth")
148  <<"*** WARNING in MuonTruth::associateCSCHitId - CSC layer "<<theDetId<<" has no DigiSimLinks !"<<std::endl;
149 
150  return simtrackids;
151 }
152 
153 
154 std::vector<MuonTruth::SimHitIdpr> MuonTruth::associateHitId(const TrackingRecHit & hit)
155 {
156  std::vector<SimHitIdpr> simtrackids;
157 
158  const TrackingRecHit * hitp = &hit;
159  const CSCRecHit2D * cscrechit = dynamic_cast<const CSCRecHit2D *>(hitp);
160 
161  if (cscrechit) {
162 
163  theDetId = cscrechit->geographicalId().rawId();
164  int nchannels = cscrechit->channels().size();
165  const CSCLayerGeometry * laygeom = cscgeom->layer(cscrechit->cscDetId())->geometry();
166 
168 
169  if (layerLinks != theDigiSimLinks->end()) {
170 
171  for(int idigi = 0; idigi < nchannels; ++idigi) {
172  // strip and readout channel numbers may differ in ME1/1A
173  int istrip = cscrechit->channels()[idigi];
174  int channel = laygeom->channel(istrip);
175 
176  for (LayerLinks::const_iterator link=layerLinks->begin(); link!=layerLinks->end(); ++link) {
177  int ch = static_cast<int>(link->channel());
178  if (ch == channel) {
179  SimHitIdpr currentId(link->SimTrackId(), link->eventId());
180  if (find(simtrackids.begin(), simtrackids.end(), currentId) == simtrackids.end())
181  simtrackids.push_back(currentId);
182  }
183  }
184  }
185 
186  } else edm::LogWarning("MuonTruth")
187  <<"*** WARNING in MuonTruth::associateHitId - CSC layer "<<theDetId<<" has no DigiSimLinks !"<<std::endl;
188 
189  } else edm::LogWarning("MuonTruth")<<"*** WARNING in MuonTruth::associateHitId, null dynamic_cast !";
190 
191  return simtrackids;
192 }
193 
194 
196 {
197  std::vector<PSimHit> result;
199 
200  if (theSimHitMap.find(theDetId) != theSimHitMap.end())
201  hits = theSimHitMap[theDetId];
202 
203  edm::PSimHitContainer::const_iterator hitItr = hits.begin(), lastHit = hits.end();
204 
205  for( ; hitItr != lastHit; ++hitItr)
206  {
207  unsigned int hitTrack = hitItr->trackId();
208  EncodedEventId hitEvId = hitItr->eventId();
209 
210  if(hitTrack == truthId.first && hitEvId == truthId.second)
211  {
212  result.push_back(*hitItr);
213  }
214  }
215  return result;
216 }
217 
218 
220 {
221  int result = 0;
222  std::vector<PSimHit> hits = hitsFromSimTrack(truthId);
223  if(!hits.empty())
224  {
225  result = hits[0].particleType();
226  }
227  return result;
228 }
229 
230 
231 void MuonTruth::analyze(const CSCRecHit2D & recHit)
232 {
233  theChargeMap.clear();
234  theTotalCharge = 0.;
235  theDetId = recHit.geographicalId().rawId();
236 
237  int nchannels = recHit.channels().size();
238  CSCRecHit2D::ADCContainer adcContainer = recHit.adcs();
239  const CSCLayerGeometry * laygeom = cscgeom->layer(recHit.cscDetId())->geometry();
240 
241  for(int idigi = 0; idigi < nchannels; ++idigi)
242  {
243  // strip and readout channel numbers may differ in ME1/1A
244  int istrip = recHit.channels()[idigi];
245  int channel = laygeom->channel(istrip);
246  float weight = adcContainer[idigi];
247 
249 
250  if(layerLinks != theDigiSimLinks->end())
251  {
252  addChannel(*layerLinks, channel, weight);
253  }
254  }
255 }
256 
257 
258 void MuonTruth::analyze(const CSCStripDigi & stripDigi, int rawDetIdCorrespondingToCSCLayer)
259 {
260  theDetId = rawDetIdCorrespondingToCSCLayer;
261  theChargeMap.clear();
262  theTotalCharge = 0.;
263 
265  if(layerLinks != theDigiSimLinks->end())
266  {
267  addChannel(*layerLinks, stripDigi.getStrip(), 1.);
268  }
269 }
270 
271 
272 void MuonTruth::analyze(const CSCWireDigi & wireDigi, int rawDetIdCorrespondingToCSCLayer)
273 {
274  theDetId = rawDetIdCorrespondingToCSCLayer;
275  theChargeMap.clear();
276  theTotalCharge = 0.;
277 
279 
280  if(layerLinks != theDigiSimLinks->end())
281  {
282  // In the simulation digis, the channel labels for wires and strips must be distinct, therefore:
283  int wireDigiInSimulation = wireDigi.getWireGroup() + 100;
284  //
285  addChannel(*layerLinks, wireDigiInSimulation, 1.);
286  }
287 }
288 
289 
290 void MuonTruth::addChannel(const LayerLinks &layerLinks, int channel, float weight)
291 {
292  LayerLinks::const_iterator linkItr = layerLinks.begin(),
293  lastLayerLink = layerLinks.end();
294 
295  for ( ; linkItr != lastLayerLink; ++linkItr)
296  {
297  int linkChannel = linkItr->channel();
298  if(linkChannel == channel)
299  {
300  float charge = linkItr->fraction() * weight;
302  // see if it's in the map
303  SimHitIdpr truthId(linkItr->SimTrackId(),linkItr->eventId());
304  std::map<SimHitIdpr, float>::const_iterator chargeMapItr = theChargeMap.find(truthId);
305  if(chargeMapItr == theChargeMap.end())
306  {
307  theChargeMap[truthId] = charge;
308  }
309  else
310  {
311  theChargeMap[truthId] += charge;
312  }
313  }
314  }
315 }
316 
317 
std::map< unsigned int, edm::PSimHitContainer > theSimHitMap
Definition: MuonTruth.h:71
iterator end()
Definition: DetSet.h:50
std::pair< uint32_t, EncodedEventId > SimHitIdpr
Definition: MuonTruth.h:29
edm::InputTag CSCsimHitsTag
Definition: MuonTruth.h:68
CSCDetId cscDetId() const
Definition: CSCRecHit2D.h:47
iterator find(det_id_type id)
Definition: DetSetVector.h:281
edm::InputTag linksTag
Definition: MuonTruth.h:64
int particleType(SimHitIdpr truthId)
Definition: MuonTruth.cc:219
edm::InputTag CSCsimHitsXFTag
Definition: MuonTruth.h:69
edm::InputTag wireLinksTag
Definition: MuonTruth.h:65
#define abs(x)
Definition: mlp_lapack.h:159
const DigiSimLinks * theWireDigiSimLinks
Definition: MuonTruth.h:62
const CSCGeometry * cscgeom
Definition: MuonTruth.h:73
std::map< SimHitIdpr, float > theChargeMap
Definition: MuonTruth.h:56
std::vector< SimHitIdpr > associateHitId(const TrackingRecHit &)
Definition: MuonTruth.cc:154
std::vector< PSimHit > muonHits()
Definition: MuonTruth.cc:104
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
double charge(const std::vector< uint8_t > &Ampls)
std::vector< PSimHit > simHits()
Definition: MuonTruth.cc:90
int getStrip() const
Definition: CSCStripDigi.h:39
bool crossingframe
Definition: MuonTruth.h:67
uint32_t rawId() const
get the raw id
Definition: DetId.h:45
std::string link(std::string &nm, std::string &ns)
Definition: hierarchy.cc:47
const ADCContainer & adcs() const
L1A.
Definition: CSCRecHit2D.h:60
const CSCBadChambers * cscBadChambers
Definition: MuonTruth.h:46
unsigned int theDetId
Definition: MuonTruth.h:59
std::vector< PSimHit > hitsFromSimTrack(SimHitIdpr truthId)
Definition: MuonTruth.cc:195
tuple result
Definition: query.py:137
std::vector< SimHitIdpr > associateCSCHitId(const CSCRecHit2D *)
Definition: MuonTruth.cc:121
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
void analyze(const CSCRecHit2D &recHit)
Definition: MuonTruth.cc:231
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:352
#define LogTrace(id)
tuple conf
Definition: dbtoconf.py:185
int channel(int strip) const
iterator begin()
Definition: DetSet.h:49
float theTotalCharge
Definition: MuonTruth.h:57
MuonTruth(const edm::Event &, const edm::EventSetup &, const edm::ParameterSet &)
Definition: MuonTruth.cc:8
iterator begin()
int getWireGroup() const
default
Definition: CSCWireDigi.h:24
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
T const * product() const
Definition: Handle.h:74
std::string const & label() const
Definition: InputTag.h:25
ESHandle< TrackerGeometry > geometry
const ChannelContainer & channels() const
Extracting strip channel numbers comprising the rechit.
Definition: CSCRecHit2D.h:50
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to given DetId.
Definition: CSCGeometry.cc:123
std::vector< PSimHit > PSimHitContainer
DetId geographicalId() const
float muonFraction()
analyze() must be called before any of the following
Definition: MuonTruth.cc:72
const DigiSimLinks * theDigiSimLinks
Definition: MuonTruth.h:61
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:105
void addChannel(const LayerLinks &layerLinks, int channel, float weight=1.)
Definition: MuonTruth.cc:290