00001
00002
00015
00016
00017
00018
00019 #include "L1Trigger/DTTrigger/interface/DTTrigTest.h"
00020
00021
00022 #include "FWCore/Framework/interface/EventSetup.h"
00023 #include "FWCore/Framework/interface/ESHandle.h"
00024
00025 #include "L1TriggerConfig/DTTPGConfig/interface/DTConfigManager.h"
00026 #include "L1TriggerConfig/DTTPGConfig/interface/DTConfigManagerRcd.h"
00027
00028
00029 #include "L1Trigger/DTSectorCollector/interface/DTSectCollPhSegm.h"
00030 #include "L1Trigger/DTSectorCollector/interface/DTSectCollThSegm.h"
00031 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
00032 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
00033
00034
00035 #include "TROOT.h"
00036 #include "TTree.h"
00037 #include "TFile.h"
00038
00039
00040 #include "DataFormats/Math/interface/LorentzVector.h"
00041 #include <CLHEP/Vector/LorentzVector.h>
00042
00043
00044 #include <iostream>
00045 #include <math.h>
00046 #include<time.h>
00047
00048 using namespace std;
00049 using namespace edm;
00050
00051 const double DTTrigTest::my_TtoTDC = 32./25.;
00052
00053 DTTrigTest::DTTrigTest(const ParameterSet& pset): my_trig(0) {
00054
00055 my_debug= pset.getUntrackedParameter<bool>("debug");
00056 string outputfile = pset.getUntrackedParameter<string>("outputFileName");
00057 if (my_debug)
00058 cout << "[DTTrigTest] Creating rootfile " << outputfile <<endl;
00059 my_rootfile = new TFile(outputfile.c_str(),"RECREATE");
00060 my_tree = new TTree("h1","GMT",0);
00061 my_params = pset;
00062 if (my_debug) cout << "[DTTrigTest] Constructor executed!!!" << endl;
00063
00064
00065 }
00066
00067 DTTrigTest::~DTTrigTest(){
00068
00069 if (my_trig != 0) delete my_trig;
00070 delete my_rootfile;
00071 if (my_debug)
00072 cout << "[DTTrigTest] Destructor executed!!!" << endl;
00073
00074 }
00075
00076 void DTTrigTest::endJob(){
00077
00078 if (my_debug)
00079 cout << "[DTTrigTest] Writing Tree and Closing File" << endl;
00080 my_tree->Write();
00081 delete my_tree;
00082 my_rootfile->Close();
00083
00084 }
00085
00086
00087 void DTTrigTest::beginJob(){
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 my_tree->Branch("Run",&runn,"Run/I");
00105 my_tree->Branch("Event",&eventn,"Event/I");
00106 my_tree->Branch("Weight",&weight,"Weight/F");
00107
00108 my_tree->Branch("Ngen",&ngen,"Ngen/I");
00109 my_tree->Branch("Pxgen",pxgen,"Pxgen[Ngen]/F");
00110 my_tree->Branch("Pygen",pygen,"Pygen[Ngen]/F");
00111 my_tree->Branch("Pzgen",pzgen,"Pzgen[Ngen]/F");
00112 my_tree->Branch("Ptgen",ptgen,"Ptgen[Ngen]/F");
00113 my_tree->Branch("Etagen",etagen,"Etagen[Ngen]/F");
00114 my_tree->Branch("Phigen",phigen,"Phigen[Ngen]/F");
00115 my_tree->Branch("Chagen",chagen,"Chagen[Ngen]/I");
00116 my_tree->Branch("Vxgen",vxgen,"Vxgen[Ngen]/F");
00117 my_tree->Branch("Vygen",vygen,"Vygen[Ngen]/F");
00118 my_tree->Branch("Vzgen",vzgen,"Vzgen[Ngen]/F");
00119
00120 my_tree->Branch("Nbti",&nbti,"Nbti/I");
00121 my_tree->Branch("bwh",bwh,"bwh[Nbti]/I");
00122 my_tree->Branch("bstat",bstat,"bstat[Nbti]/I");
00123 my_tree->Branch("bsect",bsect,"bsect[Nbti]/I");
00124 my_tree->Branch("bsl",bsl,"bsl[Nbti]/I");
00125 my_tree->Branch("bnum",bnum,"bnum[Nbti]/I");
00126 my_tree->Branch("bbx",bbx,"bbx[Nbti]/I");
00127 my_tree->Branch("bcod",bcod,"bcod[Nbti]/I");
00128 my_tree->Branch("bk",bk,"bk[Nbti]/I");
00129 my_tree->Branch("bx",bx,"bx[Nbti]/I");
00130 my_tree->Branch("bposx",bposx,"bposx[Nbti]/F");
00131 my_tree->Branch("bposy",bposy,"bposy[Nbti]/F");
00132 my_tree->Branch("bposz",bposz,"bposz[Nbti]/F");
00133 my_tree->Branch("bdirx",bdirx,"bdirx[Nbti]/F");
00134 my_tree->Branch("bdiry",bdiry,"bdiry[Nbti]/F");
00135 my_tree->Branch("bdirz",bdirz,"bdirz[Nbti]/F");
00136
00137 my_tree->Branch("Ntraco",&ntraco,"Ntraco/I");
00138 my_tree->Branch("twh",twh,"twh[Ntraco]/I");
00139 my_tree->Branch("tstat",tstat,"tstat[Ntraco]/I");
00140 my_tree->Branch("tsect",tsect,"tsect[Ntraco]/I");
00141 my_tree->Branch("tnum",tnum,"tnum[Ntraco]/I");
00142 my_tree->Branch("tbx",tbx,"tbx[Ntraco]/I");
00143 my_tree->Branch("tcod",tcod,"tcod[Ntraco]/I");
00144 my_tree->Branch("tk",tk,"tk[Ntraco]/I");
00145 my_tree->Branch("tx",tx,"tx[Ntraco]/I");
00146 my_tree->Branch("tposx",tposx,"tposx[Ntraco]/F");
00147 my_tree->Branch("tposy",tposy,"tposy[Ntraco]/F");
00148 my_tree->Branch("tposz",tposz,"tposz[Ntraco]/F");
00149 my_tree->Branch("tdirx",tdirx,"tdirx[Ntraco]/F");
00150 my_tree->Branch("tdiry",tdiry,"tdiry[Ntraco]/F");
00151 my_tree->Branch("tdirz",tdirz,"tdirz[Ntraco]/F");
00152
00153 my_tree->Branch("Ntsphi",&ntsphi,"Ntsphi/I");
00154 my_tree->Branch("swh",swh,"swh[Ntsphi]/I");
00155 my_tree->Branch("sstat",sstat,"sstat[Ntsphi]/I");
00156 my_tree->Branch("ssect",ssect,"ssect[Ntsphi]/I");
00157 my_tree->Branch("sbx",sbx,"sbx[Ntsphi]/I");
00158 my_tree->Branch("scod",scod,"scod[Ntsphi]/I");
00159 my_tree->Branch("sphi",sphi,"sphi[Ntsphi]/I");
00160 my_tree->Branch("sphib",sphib,"sphib[Ntsphi]/I");
00161 my_tree->Branch("sposx",sposx,"sposx[Ntsphi]/F");
00162 my_tree->Branch("sposy",sposy,"sposy[Ntsphi]/F");
00163 my_tree->Branch("sposz",sposz,"sposz[Ntsphi]/F");
00164 my_tree->Branch("sdirx",sdirx,"sdirx[Ntsphi]/F");
00165 my_tree->Branch("sdiry",sdiry,"sdiry[Ntsphi]/F");
00166 my_tree->Branch("sdirz",sdirz,"sdirz[Ntsphi]/F");
00167
00168 my_tree->Branch("Ntstheta",&ntstheta,"Ntstheta/I");
00169 my_tree->Branch("thwh",thwh,"thwh[Ntstheta]/I");
00170 my_tree->Branch("thstat",thstat,"thstat[Ntstheta]/I");
00171 my_tree->Branch("thsect",thsect,"thsect[Ntstheta]/I");
00172 my_tree->Branch("thbx",thbx,"thbx[Ntstheta]/I");
00173 my_tree->Branch("thcode",thcode,"thcode[Ntstheta][7]/I");
00174 my_tree->Branch("thpos",thpos,"thpos[Ntstheta][7]/I");
00175 my_tree->Branch("thqual",thqual,"thqual[Ntstheta][7]/I");
00176
00177 my_tree->Branch("Nscphi",&nscphi,"Nscphi/I");
00178 my_tree->Branch("scphwh",scphwh,"scphwh[Nscphi]/I");
00179 my_tree->Branch("scphstat",scphstat,"scphstat[Nscphi]/I");
00180 my_tree->Branch("scphsect",scphsect,"scphsect[Nscphi]/I");
00181 my_tree->Branch("scphbx",scphbx,"scphbx[Nscphi]/I");
00182 my_tree->Branch("scphcod",scphcod,"scphcod[Nscphi]/I");
00183 my_tree->Branch("scphphi",scphphi,"scphphi[Nscphi]/I");
00184 my_tree->Branch("scphphib",scphphib,"scphphib[Nscphi]/I");
00185 my_tree->Branch("scphposx",scphposx,"scphposx[Nscphi]/F");
00186 my_tree->Branch("scphposy",scphposy,"scphposy[Nscphi]/F");
00187 my_tree->Branch("scphposz",scphposz,"scphposz[Nscphi]/F");
00188 my_tree->Branch("scphdirx",scphdirx,"scphdirx[Nscphi]/F");
00189 my_tree->Branch("scphdiry",scphdiry,"scphdiry[Nscphi]/F");
00190 my_tree->Branch("scphdirz",scphdirz,"scphdirz[Nscphi]/F");
00191
00192 my_tree->Branch("Nsctheta",&nsctheta,"Nsctheta/I");
00193 my_tree->Branch("scthwh",scthwh,"scthwh[Nsctheta]/I");
00194 my_tree->Branch("scthstat",scthstat,"scthstat[Nsctheta]/I");
00195 my_tree->Branch("scthsect",scthsect,"scthsect[Nsctheta]/I");
00196 my_tree->Branch("scthbx",scthbx,"scthbx[Nsctheta]/I");
00197 my_tree->Branch("scthcode",scthcode,"scthcode[Nsctheta][7]/I");
00198 my_tree->Branch("scthpos",scthpos,"scthpos[Nsctheta][7]/I");
00199 my_tree->Branch("scthqual",scthqual,"scthqual[Nsctheta][7]/I");
00200
00201 }
00202
00203 void DTTrigTest::beginRun(const edm::Run& iRun, const edm::EventSetup& iEventSetup) {
00204
00205 if (!my_trig) {
00206 my_trig = new DTTrig(my_params);
00207 my_trig->createTUs(iEventSetup);
00208 if (my_debug)
00209 cout << "[DTTrigTest] TU's Created" << endl;
00210 }
00211
00212 }
00213
00214
00215
00216 void DTTrigTest::analyze(const Event & iEvent, const EventSetup& iEventSetup){
00217
00218 const int MAXGEN = 10;
00219 const float ptcut = 1.0;
00220 const float etacut = 2.4;
00221 my_trig->triggerReco(iEvent,iEventSetup);
00222 if (my_debug)
00223 cout << "[DTTrigTest] Trigger algorithm executed for run " << iEvent.id().run()
00224 <<" event " << iEvent.id().event() << endl;
00225
00226
00227 runn = iEvent.id().run();
00228 eventn = iEvent.id().event();
00229 weight = 1;
00230
00231
00232 Handle<vector<SimTrack> > MyTracks;
00233 Handle<vector<SimVertex> > MyVertexes;
00234 iEvent.getByLabel("g4SimHits",MyTracks);
00235 iEvent.getByLabel("g4SimHits",MyVertexes);
00236 vector<SimTrack>::const_iterator itrack;
00237 ngen=0;
00238 if (my_debug)
00239 cout << "[DTTrigTest] Tracks found in the detector (not only muons) " << MyTracks->size() <<endl;
00240
00241 for (itrack=MyTracks->begin(); itrack!=MyTracks->end(); itrack++){
00242 if ( abs(itrack->type())==13){
00243 math::XYZTLorentzVectorD momentum = itrack->momentum();
00244 float pt = momentum.Pt();
00245 float eta = momentum.eta();
00246 if ( pt>ptcut && fabs(eta)<etacut ){
00247 float phi = momentum.phi();
00248 int charge = static_cast<int> (-itrack->type()/13);
00249 if ( phi<0 ) phi = 2*M_PI + phi;
00250 int vtxindex = itrack->vertIndex();
00251 float gvx=0,gvy=0,gvz=0;
00252 if (vtxindex >-1){
00253 gvx=MyVertexes->at(vtxindex).position().x();
00254 gvy=MyVertexes->at(vtxindex).position().y();
00255 gvz=MyVertexes->at(vtxindex).position().z();
00256 }
00257 if ( ngen < MAXGEN ) {
00258 pxgen[ngen]=momentum.x();
00259 pygen[ngen]=momentum.y();
00260 pzgen[ngen]=momentum.z();
00261 ptgen[ngen]=pt;
00262 etagen[ngen]=eta;
00263 phigen[ngen]=phi;
00264 chagen[ngen]=charge;
00265 vxgen[ngen]=gvx;
00266 vygen[ngen]=gvy;
00267 vzgen[ngen]=gvz;
00268 ngen++;
00269 }
00270 }
00271 }
00272 }
00273
00274
00275
00276 vector<DTBtiTrigData> btitrigs = my_trig->BtiTrigs();
00277 vector<DTBtiTrigData>::const_iterator pbti;
00278 int ibti = 0;
00279 if (my_debug)
00280 cout << "[DTTrigTest] " << btitrigs.size() << " BTI triggers found" << endl;
00281
00282 for ( pbti = btitrigs.begin(); pbti != btitrigs.end(); pbti++ ) {
00283 if ( ibti < 100 ) {
00284 bwh[ibti]=pbti->wheel();
00285 bstat[ibti]=pbti->station();
00286 bsect[ibti]=pbti->sector();
00287 bsl[ibti]=pbti->btiSL();
00288 bnum[ibti]=pbti->btiNumber();
00289 bbx[ibti]=pbti->step();
00290 bcod[ibti]=pbti->code();
00291 bk[ibti]=pbti->K();
00292 bx[ibti]=pbti->X();
00293 GlobalPoint pos = my_trig->CMSPosition(&(*pbti));
00294 GlobalVector dir = my_trig->CMSDirection(&(*pbti));
00295 bposx[ibti] = pos.x();
00296 bposy[ibti] = pos.y();
00297 bposz[ibti] = pos.z();
00298 bdirx[ibti] = dir.x();
00299 bdiry[ibti] = dir.y();
00300 bdirz[ibti] = dir.z();
00301 ibti++;
00302 }
00303 }
00304 nbti = ibti;
00305
00306
00307 vector<DTTracoTrigData> tracotrigs = my_trig->TracoTrigs();
00308 vector<DTTracoTrigData>::const_iterator ptc;
00309 int itraco = 0;
00310 if (my_debug)
00311 cout << "[DTTrigTest] " << tracotrigs.size() << " TRACO triggers found" << endl;
00312
00313 for (ptc=tracotrigs.begin(); ptc!=tracotrigs.end(); ptc++) {
00314 if (itraco<80) {
00315 twh[itraco]=ptc->wheel();
00316 tstat[itraco]=ptc->station();
00317 tsect[itraco]=ptc->sector();
00318 tnum[itraco]=ptc->tracoNumber();
00319 tbx[itraco]=ptc->step();
00320 tcod[itraco]=ptc->code();
00321 tk[itraco]=ptc->K();
00322 tx[itraco]=ptc->X();
00323 GlobalPoint pos = my_trig->CMSPosition(&(*ptc));
00324 GlobalVector dir = my_trig->CMSDirection(&(*ptc));
00325 tposx[itraco] = pos.x();
00326 tposy[itraco] = pos.y();
00327 tposz[itraco] = pos.z();
00328 tdirx[itraco] = dir.x();
00329 tdiry[itraco] = dir.y();
00330 tdirz[itraco] = dir.z();
00331 itraco++;
00332 }
00333 }
00334 ntraco = itraco;
00335
00336
00337 vector<DTChambPhSegm> tsphtrigs = my_trig->TSPhTrigs();
00338 vector<DTChambPhSegm>::const_iterator ptsph;
00339 int itsphi = 0;
00340 if (my_debug )
00341 cout << "[DTTrigTest] " << tsphtrigs.size() << " TSPhi triggers found" << endl;
00342
00343 for (ptsph=tsphtrigs.begin(); ptsph!=tsphtrigs.end(); ptsph++) {
00344 if (itsphi<40 ) {
00345 swh[itsphi] = ptsph->wheel();
00346 sstat[itsphi] = ptsph->station();
00347 ssect[itsphi] = ptsph->sector();
00348 sbx[itsphi] = ptsph->step();
00349 scod[itsphi] = ptsph->oldCode();
00350 sphi[itsphi] = ptsph->phi();
00351 sphib[itsphi] = ptsph->phiB();
00352 GlobalPoint pos = my_trig->CMSPosition(&(*ptsph));
00353 GlobalVector dir = my_trig->CMSDirection(&(*ptsph));
00354 sposx[itsphi] = pos.x();
00355 sposy[itsphi] = pos.y();
00356 sposz[itsphi] = pos.z();
00357 sdirx[itsphi] = dir.x();
00358 sdiry[itsphi] = dir.y();
00359 sdirz[itsphi] = dir.z();
00360 itsphi++;
00361 }
00362 }
00363 ntsphi = itsphi;
00364
00365
00366 vector<DTChambThSegm> tsthtrigs = my_trig->TSThTrigs();
00367 vector<DTChambThSegm>::const_iterator ptsth;
00368 int itstheta = 0;
00369 if (my_debug)
00370 cout << "[DTTrigTest] " << tsthtrigs.size() << " TSTheta triggers found" << endl;
00371
00372 for (ptsth=tsthtrigs.begin(); ptsth!=tsthtrigs.end(); ptsth++) {
00373 if (itstheta<40 ) {
00374 thwh[itstheta] = ptsth->ChamberId().wheel();
00375 thstat[itstheta] = ptsth->ChamberId().station();
00376 thsect[itstheta] = ptsth->ChamberId().sector();
00377 thbx[itstheta] = ptsth->step();
00378 for(int i=0;i<7;i++) {
00379 thcode[itstheta][i] = ptsth->code(i);
00380 thpos[itstheta][i] = ptsth->position(i);
00381 thqual[itstheta][i] = ptsth->quality(i);
00382 }
00383 itstheta++;
00384 }
00385 }
00386 ntstheta = itstheta;
00387
00388
00389 vector<DTSectCollPhSegm> scphtrigs = my_trig->SCPhTrigs();
00390 vector<DTSectCollPhSegm>::const_iterator pscph;
00391 int iscphi = 0;
00392 if (my_debug )
00393 cout << "[DTTrigTest] " << scphtrigs.size() << " SectCollPhi triggers found" << endl;
00394
00395 for (pscph=scphtrigs.begin(); pscph!=scphtrigs.end(); pscph++) {
00396 if (iscphi<40 ) {
00397 const DTChambPhSegm *seg = (*pscph).tsPhiTrig();
00398 scphwh[iscphi] = pscph->wheel();
00399 scphstat[iscphi] = pscph->station();
00400 scphsect[iscphi] = pscph->sector();
00401 scphbx[iscphi] = pscph->step();
00402 scphcod[iscphi] = pscph->oldCode();
00403 scphphi[iscphi] = pscph->phi();
00404 scphphib[iscphi] = pscph->phiB();
00405 GlobalPoint pos = my_trig->CMSPosition(seg);
00406 GlobalVector dir = my_trig->CMSDirection(seg);
00407 scphposx[iscphi] = pos.x();
00408 scphposy[iscphi] = pos.y();
00409 scphposz[iscphi] = pos.z();
00410 scphdirx[iscphi] = dir.x();
00411 scphdiry[iscphi] = dir.y();
00412 scphdirz[iscphi] = dir.z();
00413 iscphi++;
00414 }
00415 }
00416 nscphi = iscphi;
00417
00418
00419 vector<DTSectCollThSegm> scthtrigs = my_trig->SCThTrigs();
00420 vector<DTSectCollThSegm>::const_iterator pscth;
00421 int isctheta = 0;
00422 if (my_debug)
00423 cout << "[DTTrigTest] " << scthtrigs.size() << " SectCollTheta triggers found" << endl;
00424
00425 for (pscth=scthtrigs.begin(); pscth!=scthtrigs.end(); pscth++) {
00426 if (isctheta<40 ) {
00427 scthwh[isctheta] = pscth->ChamberId().wheel();
00428 scthstat[isctheta] = pscth->ChamberId().station();
00429 scthsect[isctheta] = pscth->ChamberId().sector();
00430 scthbx[isctheta] = pscth->step();
00431 for(int i=0;i<7;i++) {
00432 scthcode[isctheta][i] = pscth->code(i);
00433 scthpos[isctheta][i] = pscth->position(i);
00434 scthqual[isctheta][i] = pscth->quality(i);
00435 }
00436 isctheta++;
00437 }
00438 }
00439 nsctheta = isctheta;
00440
00441
00442 my_tree->Fill();
00443
00444 }