CMS 3D CMS Logo

TestMix.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Class: TestMix
4 //
10 //
11 // Original Author: Ursula Berthon
12 // Created: Fri Sep 23 11:38:38 CEST 2005
13 //
14 //
15 
16 // system include files
17 #include <memory>
18 #include <utility>
19 #include <iostream>
20 
21 // user include files
23 
26 
28 
29 #include "TestMix.h"
30 
31 using namespace edm;
32 
33 TestMix::TestMix(const edm::ParameterSet& iConfig) : level_(iConfig.getUntrackedParameter<int>("PrintLevel")) {
34  std::cout << "Constructed testMix , level " << level_ << std::endl;
35 
36  track_containers_.push_back("g4SimHitsTrackerHitsTECHighTof");
37  track_containers_.push_back("g4SimHitsTrackerHitsTECLowTof");
38 
39  track_containers2_.push_back("g4SimHitsTrackerHitsTECLowTof");
40  track_containers2_.push_back("g4SimHitsTrackerHitsTECHighTof");
41 
42  edm::InputTag tag = edm::InputTag("mix", "g4SimHits");
43 
44  SimTrackToken_ = consumes<CrossingFrame<SimTrack>>(tag);
45  SimVertexToken_ = consumes<CrossingFrame<SimVertex>>(tag);
46 
47  tag = edm::InputTag("mix", "g4SimHitsTrackerHitsTECHighTof");
48  TrackerToken0_ = consumes<CrossingFrame<PSimHit>>(tag);
49 
50  tag = edm::InputTag("mix", "g4SimHitsEcalHitsEB");
51  CaloToken1_ = consumes<CrossingFrame<PCaloHit>>(tag);
52 
53  tag = edm::InputTag("mix", track_containers_[0]);
54  TrackerToken1_ = consumes<CrossingFrame<PSimHit>>(tag);
55 
56  tag = edm::InputTag("mix", track_containers_[1]);
57  TrackerToken2_ = consumes<CrossingFrame<PSimHit>>(tag);
58 
60  TrackerToken3_ = consumes<CrossingFrame<PSimHit>>(tag);
61 
63  TrackerToken4_ = consumes<CrossingFrame<PSimHit>>(tag);
64 
65  tag = edm::InputTag("mix", "generatorSmeared");
66  HepMCToken_ = consumes<CrossingFrame<HepMCProduct>>(tag);
67 }
68 
70  // do anything here that needs to be done at desctruction time
71  // (e.g. close files, deallocate resources etc.)
72 }
73 
74 //
75 // member functions
76 //
77 
78 // ------------ method called to analyze the data ------------
79 void TestMix::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
80  using namespace edm;
81  bool got;
82  int count = 0;
83 
84  // test accesses to CrossingFrame
85  // attention: operator-> returns the templated object, but
86  // bunch() and getTrigger() are methods of the iterator itself!
87 
88  // test access to SimTracks directly in CrossingFrame
89 
91  bool gotTracks = iEvent.getByToken(SimTrackToken_, cf_simtrack);
92  if (!gotTracks)
93  std::cout << " Could not read SimTracks!!!!" << std::endl;
94 
95  // not pointer compatible!!!!
96  // if (gotTracks) {
97  // std::vector<SimTrack>::const_iterator first;
98  // std::vector<SimTrack>::const_iterator last;
99  // cf_simtrack->getPileups(first,last);
100  // unsigned int ic=0;
101  // for (std::vector<SimTrack>::const_iterator it=first;it!=last;it++) {
102  // std::cout<<" pileup SimTrack "<<ic<<" has genpart index "<<(*it).genpartIndex()<<" vertex Index "<<(*it).vertIndex() <<" bunchcrossing "<<cf_simtrack->getBunchCrossing(ic)<<std::endl;
103  // ic++;
104  // }
105  // }
106 
107  const std::string subdet("g4SimHitsTrackerHitsTECHighTof");
109  got = iEvent.getByToken(TrackerToken0_, cf_simhit);
110  if (!got)
111  std::cout << " Could not read SimHits with label " << subdet << "!!!!" << std::endl;
112  else {
113  std::cout << "\n\n=================== Starting SimHit access, subdet " << subdet
114  << " ===================" << std::endl;
115 
116  std::unique_ptr<MixCollection<PSimHit>> col(
117  new MixCollection<PSimHit>(cf_simhit.product(), std::pair<int, int>(-1, 1)));
118  std::cout << *(col.get()) << std::endl;
120  for (cfi = col->begin(); cfi != col->end(); cfi++) {
121  std::cout << " Hit " << count << " has tof " << cfi->timeOfFlight() << " trackid " << cfi->trackId()
122  << " bunchcr " << cfi.bunch() << " trigger " << cfi.getTrigger()
123  << ", from EncodedEventId: " << cfi->eventId().bunchCrossing() << " " << cfi->eventId().event()
124  << " bcr from MixCol " << cfi.bunch() << std::endl;
125  // std::cout<<" Hit: "<<(*cfi)<<std::endl;
126  count++;
127  }
128  }
129 
130  // test access to CaloHits
131  const std::string subdetcalo("g4SimHitsEcalHitsEB");
133  got = iEvent.getByToken(CaloToken1_, cf_calo);
134  if (!got)
135  std::cout << " Could not read CaloHits with label " << subdetcalo << "!!!!" << std::endl;
136  else {
137  std::cout << "\n\n=================== Starting CaloHit access, subdet " << subdetcalo
138  << " ===================" << std::endl;
139  std::unique_ptr<MixCollection<PCaloHit>> colcalo(
140  new MixCollection<PCaloHit>(cf_calo.product(), std::pair<int, int>(-1, 1)));
141  std::cout << *(colcalo.get()) << std::endl;
143  count = 0;
144  for (cficalo = colcalo->begin(); cficalo != colcalo->end(); cficalo++) {
145  std::cout << " CaloHit " << count << " has tof " << cficalo->time() << " trackid " << cficalo->geantTrackId()
146  << " bunchcr " << cficalo.bunch() << " trigger " << cficalo.getTrigger()
147  << ", from EncodedEventId: " << cficalo->eventId().bunchCrossing() << " " << cficalo->eventId().event()
148  << std::endl;
149  // std::cout<<" Calo Hit: "<<(*cficalo)<<std::endl;
150  count++;
151  }
152  }
153 
154  // test access to SimTracks
155  if (gotTracks) {
156  std::cout << "\n=================== Starting SimTrack access ===================" << std::endl;
157  // edm::Handle<CrossingFrame<SimTrack> > cf_simtrack;
158  // iEvent.getByLabel("mix",cf_simtrack);
159  std::unique_ptr<MixCollection<SimTrack>> col2(new MixCollection<SimTrack>(cf_simtrack.product()));
161  int count2 = 0;
162  std::cout << " \nWe got " << col2->sizeSignal() << " signal tracks and " << col2->sizePileup()
163  << " pileup tracks, total: " << col2->size() << std::endl;
164  for (cfi2 = col2->begin(); cfi2 != col2->end(); cfi2++) {
165  std::cout << " SimTrack " << count2 << " has genpart index " << cfi2->genpartIndex() << " vertex Index "
166  << cfi2->vertIndex() << " bunchcr " << cfi2.bunch() << " trigger " << cfi2.getTrigger()
167  << ", from EncodedEventId: " << cfi2->eventId().bunchCrossing() << " " << cfi2->eventId().event()
168  << std::endl;
169  count2++;
170  }
171  }
172 
173  // test access to SimVertices
175  got = iEvent.getByToken(SimVertexToken_, cf_simvtx);
176  if (!got)
177  std::cout << " Could not read Simvertices !!!!" << std::endl;
178  else {
179  std::cout << "\n=================== Starting SimVertex access ===================" << std::endl;
180  std::unique_ptr<MixCollection<SimVertex>> col3(new MixCollection<SimVertex>(cf_simvtx.product()));
182  int count3 = 0;
183  std::cout << " \nWe got " << col3->sizeSignal() << " signal vertices and " << col3->sizePileup()
184  << " pileup vertices, total: " << col3->size() << std::endl;
185  for (cfi3 = col3->begin(); cfi3 != col3->end(); cfi3++) {
186  std::cout << " SimVertex " << count3 << " has parent index " << cfi3->parentIndex() << " bunchcr "
187  << cfi3.bunch() << " trigger " << cfi3.getTrigger()
188  << ", from EncodedEventId: " << cfi3->eventId().bunchCrossing() << " " << cfi3->eventId().event()
189  << std::endl;
190  SimVertex myvtx = (*cfi3);
191  std::cout << "Same with op*: " << count3 << " has parent index " << myvtx.parentIndex() << " bunchcr "
192  << cfi3.bunch() << " trigger " << cfi3.getTrigger()
193  << ", from EncodedEventId: " << myvtx.eventId().bunchCrossing() << " " << myvtx.eventId().event()
194  << std::endl;
195  count3++;
196  }
197  }
198 
199  //test MixCollection constructor with several subdetector names
200  bool got1, got2 = false;
201  std::unique_ptr<MixCollection<PSimHit>> all_trackhits;
202  std::unique_ptr<MixCollection<PSimHit>> all_trackhits2;
203  std::cout << "\n=================== Starting test for coll of several ROU-s ===================" << std::endl;
204  // edm::Handle<CrossingFrame<PSimHit> > cf_simhit;
205  std::vector<const CrossingFrame<PSimHit>*> cfvec;
206  got1 = iEvent.getByToken(TrackerToken1_, cf_simhit);
207  if (!got1)
208  std::cout << " Could not read SimHits with label " << track_containers_[0] << "!!!!" << std::endl;
209  else {
210  std::cout << "\n=================== Starting test for coll of several ROU-s ===================" << std::endl;
211  cfvec.push_back(cf_simhit.product());
212  std::cout << " \nFirst container " << track_containers_[0] << " Nr signals " << cf_simhit->getNrSignals()
213  << ", Nr pileups " << cf_simhit->getNrPileups() << std::endl;
214  got2 = iEvent.getByToken(TrackerToken2_, cf_simhit);
215  if (got2) {
216  cfvec.push_back(cf_simhit.product());
217  std::cout << " \nSecond container " << track_containers_[1] << " Nr signals " << cf_simhit->getNrSignals()
218  << ", Nr pileups " << cf_simhit->getNrPileups() << std::endl;
219  all_trackhits = std::make_unique<MixCollection<PSimHit>>(cfvec);
220 
221  std::cout << " \nFor all containers we got " << all_trackhits->sizeSignal() << " signal hits and "
222  << all_trackhits->sizePileup() << " pileup hits, total: " << all_trackhits->size() << std::endl;
223 
225  int ii = 0;
226  for (it = all_trackhits->begin(); it != all_trackhits->end(); it++) {
227  std::cout << " Hit " << ii << " of all hits has tof " << it->timeOfFlight() << " trackid " << it->trackId()
228  << " bunchcr " << it.bunch() << " trigger " << it.getTrigger()
229  << ", from EncodedEventId: " << it->eventId().bunchCrossing() << " " << it->eventId().event()
230  << std::endl;
231  ii++;
232  }
233  }
234  }
235 
236  //test the same in different order: should be the same sizes, different order
238  int ii2 = 0;
239  std::vector<const CrossingFrame<PSimHit>*> cfvec2;
240  got = iEvent.getByToken(TrackerToken3_, cf_simhit);
241  if (!got)
242  std::cout << " Could not read SimHits with label " << track_containers2_[0] << "!!!!" << std::endl;
243  else {
244  cfvec2.push_back(cf_simhit.product());
245  got2 = iEvent.getByToken(TrackerToken4_, cf_simhit);
246  if (got2) {
247  cfvec2.push_back(cf_simhit.product());
248  all_trackhits2 = std::make_unique<MixCollection<PSimHit>>(cfvec2);
249  std::cout << " \nSame containers, different order: we got " << all_trackhits2->sizeSignal() << " signal hits and "
250  << all_trackhits2->sizePileup() << " pileup hits, total: " << all_trackhits2->size() << std::endl;
251  for (it2 = all_trackhits2->begin(); it2 != all_trackhits2->end(); it2++) {
252  std::cout << " Hit " << ii2 << " of all hits has tof " << it2->timeOfFlight() << " trackid " << it2->trackId()
253  << " bunchcr " << it2.bunch() << " trigger " << it2.getTrigger()
254  << ", bcr from Id: " << it2->eventId().bunchCrossing() << " evtnr in id " << it2->eventId().event()
255  << std::endl;
256  ii2++;
257  }
258  }
259  }
260 
261  //test MixCollection for HepMCProducts
262  //at the same time test getObject method
263  //we should have each line twice
264  //------------------------------------
266  got = iEvent.getByToken(HepMCToken_, cf_hepmc);
267  if (!got)
268  std::cout << " Could not read HepMCProducts!!!!" << std::endl;
269  else {
270  std::unique_ptr<MixCollection<edm::HepMCProduct>> colhepmc(
271  new MixCollection<edm::HepMCProduct>(cf_hepmc.product()));
273  int counthepmc = 0;
274  std::cout << " \nWe got " << colhepmc->sizeSignal() << " signal hepmc products and " << colhepmc->sizePileup()
275  << " pileup hepmcs, total: " << colhepmc->size() << std::endl;
276  for (cfihepmc = colhepmc->begin(); cfihepmc != colhepmc->end(); cfihepmc++) {
277  std::cout << " edm::HepMCProduct " << counthepmc << " has event number " << cfihepmc->GetEvent()->event_number()
278  << ", " << cfihepmc->GetEvent()->particles_size() << " particles and "
279  << cfihepmc->GetEvent()->vertices_size() << " vertices, bunchcr= " << cfihepmc.bunch()
280  << " trigger= " << cfihepmc.getTrigger() << " sourcetype= " << cfihepmc.getSourceType() << std::endl;
281  HepMCProduct myprod = colhepmc->getObject(counthepmc);
282  std::cout << "same with getObject:hepmc product " << counthepmc << " has event number "
283  << myprod.GetEvent()->event_number() << ", " << myprod.GetEvent()->particles_size() << " particles and "
284  << myprod.GetEvent()->vertices_size() << " vertices" << std::endl;
285  counthepmc++;
286  }
287  }
288  //----------------------------------------------------------------------------
289  // testing special situations
290  //----------------------------------------------------------------------------
291 
292  if (got2) {
293  // test reusage of the same iterator
294  int ii3 = 0;
295  for (it2 = all_trackhits2->begin(); it2 != all_trackhits2->end(); it2++)
296  ii3++;
297  if (ii3 != ii2)
298  std::cout << " Problem when re-using iterator!!" << std::endl;
299  else
300  std::cout << " \nNo problem when re-using iterator." << std::endl;
301  }
302  // test access to non-filled collections
303  //cases: 0) ok, collection has members
304  // 1) bunchrange given outside of existent bunchcrossing numbers ==>exc
305 
306  std::cout << "\n=================== Starting tests for abnormal conditions ===================" << std::endl;
307 
308  // test case 0
309  if (got1) {
310  std::cout << "\n[ Testing abnormal conditions case 0]Should be all ok: registry: " << all_trackhits->inRegistry()
311  << " size: " << all_trackhits->size() << std::endl;
312 
313  // test case 1
314  std::cout << "\n[ Testing abnormal conditions case 1] Should throw an exception " << std::endl;
315  MixCollection<PSimHit>* col21 = nullptr;
316  col21 = new MixCollection<PSimHit>(cf_simhit.product(), std::pair<int, int>(-10, 20));
317  delete col21;
318  }
319 }
edm::EDGetTokenT< CrossingFrame< PSimHit > > TrackerToken3_
Definition: TestMix.h:57
edm::EDGetTokenT< CrossingFrame< HepMCProduct > > HepMCToken_
Definition: TestMix.h:64
edm::EDGetTokenT< CrossingFrame< PSimHit > > TrackerToken4_
Definition: TestMix.h:58
int event() const
get the contents of the subdetector field (should be protected?)
edm::EDGetTokenT< CrossingFrame< PSimHit > > TrackerToken2_
Definition: TestMix.h:56
int getSourceType() const
Definition: MixCollection.h:99
T const * product() const
Definition: Handle.h:70
~TestMix() override
Definition: TestMix.cc:69
int iEvent
Definition: GenABIO.cc:224
std::vector< std::string > track_containers2_
Definition: TestMix.h:52
int bunchCrossing() const
get the detector field from this detid
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:37
ii
Definition: cuy.py:589
edm::EDGetTokenT< CrossingFrame< SimTrack > > SimTrackToken_
Definition: TestMix.h:62
bool getTrigger() const
Definition: MixCollection.h:97
void analyze(const edm::Event &, const edm::EventSetup &) override
Definition: TestMix.cc:79
std::vector< std::string > track_containers_
Definition: TestMix.h:51
edm::EDGetTokenT< CrossingFrame< SimVertex > > SimVertexToken_
Definition: TestMix.h:63
HLT enums.
col
Definition: cuy.py:1009
EncodedEventId eventId() const
Definition: CoreSimVertex.h:25
edm::EDGetTokenT< CrossingFrame< PSimHit > > TrackerToken1_
Definition: TestMix.h:55
edm::EDGetTokenT< CrossingFrame< PCaloHit > > CaloToken1_
Definition: TestMix.h:60
int parentIndex() const
Definition: SimVertex.h:29
edm::EDGetTokenT< CrossingFrame< PSimHit > > TrackerToken0_
Definition: TestMix.h:54
TestMix(const edm::ParameterSet &)
Definition: TestMix.cc:33
int level_
Definition: TestMix.h:50