00001
00002
00003
00004
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <memory>
00020 #include <utility>
00021 #include <iostream>
00022
00023
00024 #include "FWCore/Framework/interface/Frameworkfwd.h"
00025 #include "FWCore/Framework/interface/EDAnalyzer.h"
00026
00027 #include "FWCore/Framework/interface/Event.h"
00028 #include "FWCore/Framework/interface/MakerMacros.h"
00029
00030 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00031
00032 #include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h"
00033 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
00034 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
00035
00036 #include "TestMix.h"
00037
00038 #include "SimDataFormats/CaloHit/interface/PCaloHitContainer.h"
00039 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
00040 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
00041 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
00042
00043
00044 using namespace edm;
00045
00046 TestMix::TestMix(const edm::ParameterSet& iConfig):
00047 level_(iConfig.getUntrackedParameter<int>("PrintLevel"))
00048 {
00049 std::cout << "Constructed testMix , level "<<level_<<std::endl;
00050
00051 track_containers_.push_back("g4SimHitsTrackerHitsTECHighTof");
00052 track_containers_.push_back("g4SimHitsTrackerHitsTECLowTof");
00053
00054 track_containers2_.push_back("g4SimHitsTrackerHitsTECLowTof");
00055 track_containers2_.push_back("g4SimHitsTrackerHitsTECHighTof");
00056
00057 }
00058
00059
00060 TestMix::~TestMix()
00061 {
00062
00063
00064
00065
00066 }
00067
00068
00069
00070
00071
00072
00073
00074 void
00075 TestMix::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00076 {
00077 using namespace edm;
00078 bool got;
00079 int count=0;
00080
00081
00082
00083
00084
00085
00086
00087 edm::Handle<CrossingFrame<SimTrack> > cf_simtrack;
00088 bool gotTracks = iEvent.getByLabel("mix","g4SimHits",cf_simtrack);
00089 if (!gotTracks) std::cout<<" Could not read SimTracks!!!!"<<std::endl;
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 const std::string subdet("g4SimHitsTrackerHitsTECHighTof");
00105 edm::Handle<CrossingFrame<PSimHit> > cf_simhit;
00106 got = iEvent.getByLabel("mix",subdet,cf_simhit);
00107 if (!got) std::cout<<" Could not read SimHits with label "<<subdet<<"!!!!"<<std::endl;
00108 else {
00109 std::cout<<"\n\n=================== Starting SimHit access, subdet "<<subdet<<" ==================="<<std::endl;
00110
00111 std::auto_ptr<MixCollection<PSimHit> > col(new MixCollection<PSimHit>(cf_simhit.product(),std::pair<int,int>(-1,1)));
00112 std::cout<<*(col.get())<<std::endl;
00113 MixCollection<PSimHit>::iterator cfi;
00114 for (cfi=col->begin(); cfi!=col->end();cfi++) {
00115 std::cout<<" Hit "<<count<<" has tof "<<cfi->timeOfFlight()<<" trackid "<<cfi->trackId() <<" bunchcr "<<cfi.bunch()<<" trigger "<<cfi.getTrigger()<<", from EncodedEventId: "<<cfi->eventId().bunchCrossing()<<" " <<cfi->eventId().event() <<" bcr from MixCol "<<cfi.bunch()<<std::endl;
00116
00117 count++;
00118 }
00119 }
00120
00121
00122 const std::string subdetcalo("g4SimHitsEcalHitsEB");
00123 edm::Handle<CrossingFrame<PCaloHit> > cf_calo;
00124 got = iEvent.getByLabel("mix",subdetcalo,cf_calo);
00125 if (!got) std::cout<<" Could not read CaloHits with label "<<subdetcalo<<"!!!!"<<std::endl;
00126 else {
00127 std::cout<<"\n\n=================== Starting CaloHit access, subdet "<<subdetcalo<<" ==================="<<std::endl;
00128 std::auto_ptr<MixCollection<PCaloHit> > colcalo(new MixCollection<PCaloHit>(cf_calo.product(), std::pair<int,int>(-1,1)));
00129 std::cout<<*(colcalo.get())<<std::endl;
00130 MixCollection<PCaloHit>::iterator cficalo;
00131 count=0;
00132 for (cficalo=colcalo->begin(); cficalo!=colcalo->end();cficalo++) {
00133 std::cout<<" CaloHit "<<count<<" has tof "<<cficalo->time()<<" trackid "<<cficalo->geantTrackId() <<" bunchcr "<<cficalo.bunch()<<" trigger "<<cficalo.getTrigger()<<", from EncodedEventId: "<<cficalo->eventId().bunchCrossing()<<" " <<cficalo->eventId().event() <<std::endl;
00134
00135 count++;
00136 }
00137 }
00138
00139
00140 if (gotTracks) {
00141 std::cout<<"\n=================== Starting SimTrack access ==================="<<std::endl;
00142
00143
00144 std::auto_ptr<MixCollection<SimTrack> > col2(new MixCollection<SimTrack>(cf_simtrack.product()));
00145 MixCollection<SimTrack>::iterator cfi2;
00146 int count2=0;
00147 std::cout <<" \nWe got "<<col2->sizeSignal()<<" signal tracks and "<<col2->sizePileup()<<" pileup tracks, total: "<<col2->size()<<std::endl;
00148 for (cfi2=col2->begin(); cfi2!=col2->end();cfi2++) {
00149 std::cout<<" SimTrack "<<count2<<" has genpart index "<<cfi2->genpartIndex()<<" vertex Index "<<cfi2->vertIndex() <<" bunchcr "<<cfi2.bunch()<<" trigger "<<cfi2.getTrigger()<<", from EncodedEventId: "<<cfi2->eventId().bunchCrossing() <<" "<<cfi2->eventId().event() <<std::endl;
00150 count2++;
00151 }
00152 }
00153
00154
00155 edm::Handle<CrossingFrame<SimVertex> > cf_simvtx;
00156 got = iEvent.getByLabel("mix","g4SimHits",cf_simvtx);
00157 if (!got) std::cout<<" Could not read Simvertices !!!!"<<std::endl;
00158 else {
00159 std::cout<<"\n=================== Starting SimVertex access ==================="<<std::endl;
00160 std::auto_ptr<MixCollection<SimVertex> > col3(new MixCollection<SimVertex>(cf_simvtx.product()));
00161 MixCollection<SimVertex>::iterator cfi3;
00162 int count3=0;
00163 std::cout <<" \nWe got "<<col3->sizeSignal()<<" signal vertices and "<<col3->sizePileup()<<" pileup vertices, total: "<<col3->size()<<std::endl;
00164 for (cfi3=col3->begin(); cfi3!=col3->end();cfi3++) {
00165 std::cout<<" SimVertex "<<count3<<" has parent index "<<cfi3->parentIndex()<<" bunchcr "<<cfi3.bunch()<<" trigger "<<cfi3.getTrigger()<<", from EncodedEventId: "<<cfi3->eventId().bunchCrossing() <<" "<<cfi3->eventId().event() <<std::endl;
00166 SimVertex myvtx=(*cfi3);
00167 std::cout<<"Same with op*: "<<count3<<" has parent index "<<myvtx.parentIndex()<<" bunchcr "<<cfi3.bunch()<<" trigger "<<cfi3.getTrigger()<<", from EncodedEventId: "<<myvtx.eventId().bunchCrossing() <<" "<<myvtx.eventId().event() <<std::endl;
00168 count3++;
00169 }
00170 }
00171
00172
00173 bool got1,got2=false;
00174 std::auto_ptr<MixCollection<PSimHit> > all_trackhits;
00175 std::auto_ptr<MixCollection<PSimHit> > all_trackhits2;
00176 std::cout<<"\n=================== Starting test for coll of several ROU-s ==================="<<std::endl;
00177
00178 std::vector<const CrossingFrame<PSimHit> *> cfvec;
00179 got1 = iEvent.getByLabel("mix",track_containers_[0],cf_simhit);
00180 if (!got1) std::cout<<" Could not read SimHits with label "<<track_containers_[0]<<"!!!!"<<std::endl;
00181 else {
00182 std::cout<<"\n=================== Starting test for coll of several ROU-s ==================="<<std::endl;
00183 cfvec.push_back(cf_simhit.product());
00184 std::cout <<" \nFirst container "<<track_containers_[0]<<" Nr signals "<<cf_simhit->getNrSignals() << ", Nr pileups "<<cf_simhit->getNrPileups() <<std::endl;
00185 got2 = iEvent.getByLabel("mix",track_containers_[1],cf_simhit);
00186 if (got2) {
00187 cfvec.push_back(cf_simhit.product());
00188 std::cout <<" \nSecond container "<<track_containers_[1]<<" Nr signals "<<cf_simhit->getNrSignals() << ", Nr pileups "<<cf_simhit->getNrPileups() <<std::endl;
00189 all_trackhits= std::auto_ptr<MixCollection<PSimHit> >(new MixCollection<PSimHit>(cfvec));
00190
00191 std::cout <<" \nFor all containers we got "<<all_trackhits->sizeSignal()<<" signal hits and "<<all_trackhits->sizePileup()<<" pileup hits, total: "<<all_trackhits->size()<<std::endl;
00192
00193 MixCollection<PSimHit>::iterator it;
00194 int ii=0;
00195 for (it=all_trackhits->begin(); it!= all_trackhits->end();it++) {
00196 std::cout<<" Hit "<<ii<<" of all hits has tof "<<it->timeOfFlight()<<" trackid "<<it->trackId() <<" bunchcr "<<it.bunch()<<" trigger "<<it.getTrigger()<<", from EncodedEventId: "<<it->eventId().bunchCrossing() <<" "<<it->eventId().event()<<std::endl;
00197 ii++;
00198 }
00199 }
00200 }
00201
00202
00203 MixCollection<PSimHit>::iterator it2;
00204 int ii2=0;
00205 std::vector<const CrossingFrame<PSimHit> *> cfvec2;
00206 got = iEvent.getByLabel("mix",track_containers2_[0],cf_simhit);
00207 if (!got) std::cout<<" Could not read SimHits with label "<<track_containers2_[0]<<"!!!!"<<std::endl;
00208 else {
00209 cfvec2.push_back(cf_simhit.product());
00210 got2 = iEvent.getByLabel("mix",track_containers2_[1],cf_simhit);
00211 if (got2) {
00212 cfvec2.push_back(cf_simhit.product());
00213 all_trackhits2= std::auto_ptr<MixCollection<PSimHit> > (new MixCollection<PSimHit>(cfvec2));
00214 std::cout <<" \nSame containers, different order: we got "<<all_trackhits2->sizeSignal()<<" signal hits and "<<all_trackhits2->sizePileup()<<" pileup hits, total: "<<all_trackhits2->size()<<std::endl;
00215 for (it2=all_trackhits2->begin(); it2!= all_trackhits2->end();it2++) {
00216 std::cout<<" Hit "<<ii2<<" of all hits has tof "<<it2->timeOfFlight()<<" trackid "<<it2->trackId() <<" bunchcr "<<it2.bunch()<<" trigger "<<it2.getTrigger()<<", bcr from Id: "<<it2->eventId().bunchCrossing() <<" evtnr in id "<<it2->eventId().event()<<std::endl;
00217 ii2++;
00218 }
00219 }
00220 }
00221
00222
00223
00224
00225
00226 edm::Handle<CrossingFrame<edm::HepMCProduct> > cf_hepmc;
00227 got = iEvent.getByLabel("mix","generator",cf_hepmc);
00228 if (!got) std::cout<<" Could not read HepMCProducts!!!!"<<std::endl;
00229 else {
00230 std::auto_ptr<MixCollection<edm::HepMCProduct> > colhepmc(new MixCollection<edm::HepMCProduct>(cf_hepmc.product()));
00231 MixCollection<edm::HepMCProduct>::iterator cfihepmc;
00232 int counthepmc=0;
00233 std::cout <<" \nWe got "<<colhepmc->sizeSignal()<<" signal hepmc products and "<<colhepmc->sizePileup()<<" pileup hepmcs, total: "<<colhepmc->size()<<std::endl;
00234 for (cfihepmc=colhepmc->begin(); cfihepmc!=colhepmc->end();cfihepmc++) {
00235 std::cout<<" edm::HepMCProduct "<<counthepmc<<" has event number "<<cfihepmc->GetEvent()->event_number()<<", "<< cfihepmc->GetEvent()->particles_size()<<" particles and "<<cfihepmc->GetEvent()->vertices_size()<<" vertices, bunchcr= "<<cfihepmc.bunch()<<" trigger= "<<cfihepmc.getTrigger() <<" sourcetype= "<<cfihepmc.getSourceType()<<std::endl;
00236 HepMCProduct myprod=colhepmc->getObject(counthepmc);
00237 std::cout<<"same with getObject:hepmc product "<<counthepmc<<" has event number "<<myprod.GetEvent()->event_number()<<", "<<myprod.GetEvent()->particles_size()<<" particles and "<<myprod.GetEvent()->vertices_size()<<" vertices"<<std::endl;
00238 counthepmc++;
00239 }
00240 }
00241
00242
00243
00244
00245 if (got2) {
00246
00247 int ii3=0;
00248 for (it2=all_trackhits2->begin(); it2!= all_trackhits2->end();it2++) ii3++;
00249 if (ii3!=ii2) std::cout<<" Problem when re-using iterator!!"<<std::endl;
00250 else std::cout<<" \nNo problem when re-using iterator."<<std::endl;
00251 }
00252
00253
00254
00255
00256 std::cout<<"\n=================== Starting tests for abnormal conditions ==================="<<std::endl;
00257
00258
00259 if (got1) {
00260 std::cout<<"\n[ Testing abnormal conditions case 0]Should be all ok: registry: "<<all_trackhits->inRegistry()<<" size: "<<all_trackhits->size()<<std::endl;
00261
00262
00263 std::cout<<"\n[ Testing abnormal conditions case 1] Should throw an exception " <<std::endl;
00264 MixCollection<PSimHit> * col21=0;
00265 col21=new MixCollection<PSimHit>(cf_simhit.product(),std::pair<int,int>(-10,20));
00266 delete col21;
00267 }
00268 }
00269