00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "Validation/EventGenerator/interface/TauValidation.h"
00010
00011 #include "CLHEP/Units/defs.h"
00012 #include "CLHEP/Units/PhysicalConstants.h"
00013
00014 #include "DataFormats/Math/interface/LorentzVector.h"
00015
00016 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00017
00018 using namespace edm;
00019
00020 TauValidation::TauValidation(const edm::ParameterSet& iPSet):
00021 hepmcCollection_(iPSet.getParameter<edm::InputTag>("hepmcCollection")),
00022 tauEtCut(iPSet.getParameter<double>("tauEtCutForRtau"))
00023 {
00024 dbe = 0;
00025 dbe = edm::Service<DQMStore>().operator->();
00026 }
00027
00028 TauValidation::~TauValidation() {}
00029
00030 void TauValidation::beginJob()
00031 {
00032 if(dbe){
00034 dbe->setCurrentFolder("Generator/Tau");
00035
00036
00037 nEvt = dbe->book1D("nEvt", "n analyzed Events", 1, 0., 1.);
00038
00039
00040 TauPt = dbe->book1D("TauPt","Tau pT", 100 ,0,100);
00041 TauEta = dbe->book1D("TauEta","Tau eta", 100 ,-2.5,2.5);
00042 TauProngs = dbe->book1D("TauProngs","Tau n prongs", 7 ,0,7);
00043 TauDecayChannels = dbe->book1D("TauDecayChannels","Tau decay channels", 10 ,0,10);
00044 TauDecayChannels->setBinLabel(1+undetermined,"?");
00045 TauDecayChannels->setBinLabel(1+electron,"e");
00046 TauDecayChannels->setBinLabel(1+muon,"mu");
00047 TauDecayChannels->setBinLabel(1+pi,"#pi^{#pm}");
00048 TauDecayChannels->setBinLabel(1+pi1pi0,"#pi^{#pm}#pi^{0}");
00049 TauDecayChannels->setBinLabel(1+pinpi0,"#pi^{#pm}n#pi^{0}");
00050 TauDecayChannels->setBinLabel(1+tripi,"3#pi^{#pm}");
00051 TauDecayChannels->setBinLabel(1+tripinpi0,"3#pi^{#pm}n#pi^{0}");
00052 TauDecayChannels->setBinLabel(1+K,"K");
00053 TauDecayChannels->setBinLabel(1+stable,"Stable");
00054
00055 TauMothers = dbe->book1D("TauMothers","Tau mother particles", 10 ,0,10);
00056 TauMothers->setBinLabel(1+other,"?");
00057 TauMothers->setBinLabel(1+gamma,"#gamma");
00058 TauMothers->setBinLabel(1+Z,"Z");
00059 TauMothers->setBinLabel(1+W,"W");
00060 TauMothers->setBinLabel(1+HSM,"H_{SM}/h^{0}");
00061 TauMothers->setBinLabel(1+H0,"H^{0}");
00062 TauMothers->setBinLabel(1+A0,"A^{0}");
00063 TauMothers->setBinLabel(1+Hpm,"H^{#pm}");
00064
00065 TauRtauW = dbe->book1D("TauRtauW","W->Tau p(leading track)/E(visible tau)", 50 ,0,1);
00066 TauRtauW->setAxisTitle("rtau");
00067 TauRtauHpm = dbe->book1D("TauRtauHpm","Hpm->Tau p(leading track)/E(visible tau)", 50 ,0,1);
00068 TauRtauHpm->setAxisTitle("rtau");
00069 TauSpinEffectsW = dbe->book1D("TauSpinEffectsW","Pion energy in W rest frame", 50 ,0,1);
00070 TauSpinEffectsW->setAxisTitle("Energy");
00071 TauSpinEffectsHpm = dbe->book1D("TauSpinEffectsHpm","Pion energy in Hpm rest frame", 50 ,0,1);
00072 TauSpinEffectsHpm->setAxisTitle("Energy");
00073
00074 TauPhotons = dbe->book1D("TauPhoton","Photons radiating from tau", 2 ,0,2);
00075 TauPhotons->setBinLabel(1,"Fraction of taus radiating photons");
00076 TauPhotons->setBinLabel(2,"Fraction of tau pt radiated by photons");
00077 }
00078
00079 nTaus = 0;
00080 nTausWithPhotons = 0;
00081 tauPtSum = 0;
00082 photonFromTauPtSum = 0;
00083
00084 return;
00085 }
00086
00087 void TauValidation::endJob(){
00088 return;
00089 }
00090
00091 void TauValidation::beginRun(const edm::Run& iRun,const edm::EventSetup& iSetup)
00092 {
00094 iSetup.getData( fPDGTable );
00095 return;
00096 }
00097 void TauValidation::endRun(const edm::Run& iRun,const edm::EventSetup& iSetup){return;}
00098 void TauValidation::analyze(const edm::Event& iEvent,const edm::EventSetup& iSetup)
00099 {
00100
00102 edm::Handle<HepMCProduct> evt;
00103 iEvent.getByLabel(hepmcCollection_, evt);
00104
00105
00106 HepMC::GenEvent *myGenEvent = new HepMC::GenEvent(*(evt->GetEvent()));
00107
00108 nEvt->Fill(0.5);
00109
00110
00111 for(HepMC::GenEvent::particle_const_iterator iter = myGenEvent->particles_begin(); iter != myGenEvent->particles_end(); ++iter) {
00112 if((*iter)->status()==3) {
00113 if(abs((*iter)->pdg_id())==15){
00114 TauPt->Fill((*iter)->momentum().perp());
00115 TauEta->Fill((*iter)->momentum().eta());
00116 int mother = tauMother(*iter);
00117 int decaychannel = tauDecayChannel(*iter);
00118 tauProngs(*iter);
00119 rtau(*iter,mother,decaychannel);
00120 spinEffects(*iter,mother,decaychannel);
00121 photons(*iter);
00122 }
00123 }
00124 }
00125
00126 delete myGenEvent;
00127 }
00128
00129 int TauValidation::tauMother(const HepMC::GenParticle* tau){
00130 int mother_pid = 0;
00131
00132 if ( tau->production_vertex() ) {
00133 HepMC::GenVertex::particle_iterator mother;
00134 for (mother = tau->production_vertex()->particles_begin(HepMC::parents);
00135 mother!= tau->production_vertex()->particles_end(HepMC::parents); ++mother ) {
00136 mother_pid = (*mother)->pdg_id();
00137
00138 }
00139 }
00140
00141 int label = other;
00142 if(abs(mother_pid) == 24) label = W;
00143 if(abs(mother_pid) == 23) label = Z;
00144 if(abs(mother_pid) == 22) label = gamma;
00145 if(abs(mother_pid) == 25) label = HSM;
00146 if(abs(mother_pid) == 35) label = H0;
00147 if(abs(mother_pid) == 36) label = A0;
00148 if(abs(mother_pid) == 37) label = Hpm;
00149
00150 TauMothers->Fill(label);
00151
00152 return mother_pid;
00153 }
00154
00155 int TauValidation::tauProngs(const HepMC::GenParticle* tau){
00156
00157 int nProngs = 0;
00158 if ( tau->end_vertex() ) {
00159 HepMC::GenVertex::particle_iterator des;
00160 for(des = tau->end_vertex()->particles_begin(HepMC::descendants);
00161 des!= tau->end_vertex()->particles_end(HepMC::descendants);++des ) {
00162 int pid = (*des)->pdg_id();
00163 if(abs(pid) == 15) return tauProngs(*des);
00164 if((*des)->status() != 1) continue;
00165
00166 const HepPDT::ParticleData* pd = fPDGTable->particle((*des)->pdg_id ());
00167 int charge = (int) pd->charge();
00168 if(charge == 0) continue;
00169
00170
00171
00172 nProngs++;
00173 }
00174 }
00175 TauProngs->Fill(nProngs);
00176 return nProngs;
00177 }
00178
00179 int TauValidation::tauDecayChannel(const HepMC::GenParticle* tau){
00180
00181 int channel = undetermined;
00182 if(tau->status() == 1) channel = stable;
00183
00184 int eCount = 0,
00185 muCount = 0,
00186 pi0Count = 0,
00187 piCount = 0;
00188
00189 if ( tau->end_vertex() ) {
00190 HepMC::GenVertex::particle_iterator des;
00191 for(des = tau->end_vertex()->particles_begin(HepMC::descendants);
00192 des!= tau->end_vertex()->particles_end(HepMC::descendants);++des ) {
00193
00194
00195 int pid = (*des)->pdg_id();
00196
00197
00198
00199
00200 if(abs(pid) == 15) return tauDecayChannel(*des);
00201
00202 if(abs(pid) == 11) eCount++;
00203 if(abs(pid) == 13) muCount++;
00204 if(abs(pid) == 111) pi0Count++;
00205 if(abs(pid) == 211) piCount++;
00206
00207 }
00208 }
00209
00210 if(piCount == 1 && pi0Count == 0) channel = pi;
00211 if(piCount == 1 && pi0Count == 1) channel = pi1pi0;
00212 if(piCount == 1 && pi0Count > 1) channel = pinpi0;
00213
00214 if(piCount == 3 && pi0Count == 0) channel = tripi;
00215 if(piCount == 3 && pi0Count > 0) channel = tripinpi0;
00216
00217 if(eCount == 1) channel = electron;
00218 if(muCount == 1) channel = muon;
00219
00220 TauDecayChannels->Fill(channel);
00221 return channel;
00222 }
00223
00224 void TauValidation::rtau(const HepMC::GenParticle* tau,int mother, int decay){
00225
00226 if(decay != pi1pi0) return;
00227
00228 if(tau->momentum().perp() < tauEtCut) return;
00229
00230 double rTau = 0;
00231 double ltrack = leadingPionMomentum(tau);
00232 double visibleTauE = visibleTauEnergy(tau);
00233
00234 if(visibleTauE != 0) rTau = ltrack/visibleTauE;
00235
00236 if(abs(mother) == 23) TauRtauW->Fill(rTau);
00237 if(abs(mother) == 37) TauRtauHpm->Fill(rTau);
00238 }
00239
00240 void TauValidation::spinEffects(const HepMC::GenParticle* tau,int mother, int decay){
00241
00242 if(decay != pi) return;
00243
00244 TLorentzVector momP4 = motherP4(tau);
00245 TLorentzVector pionP4 = leadingPionP4(tau);
00246
00247 pionP4.Boost(-1*momP4.BoostVector());
00248
00249 double energy = pionP4.E()/(momP4.M()/2);
00250
00251 if(abs(mother) == 23) TauSpinEffectsW->Fill(energy);
00252 if(abs(mother) == 37) TauSpinEffectsHpm->Fill(energy);
00253 }
00254
00255 double TauValidation::leadingPionMomentum(const HepMC::GenParticle* tau){
00256 return leadingPionP4(tau).P();
00257 }
00258
00259 TLorentzVector TauValidation::leadingPionP4(const HepMC::GenParticle* tau){
00260
00261 TLorentzVector p4(0,0,0,0);
00262
00263 if ( tau->end_vertex() ) {
00264 HepMC::GenVertex::particle_iterator des;
00265 for(des = tau->end_vertex()->particles_begin(HepMC::descendants);
00266 des!= tau->end_vertex()->particles_end(HepMC::descendants);++des ) {
00267 int pid = (*des)->pdg_id();
00268
00269 if(abs(pid) == 15) return leadingPionP4(*des);
00270
00271 if(abs(pid) != 211) continue;
00272
00273 if((*des)->momentum().rho() > p4.P()) {
00274 p4 = TLorentzVector((*des)->momentum().px(),
00275 (*des)->momentum().py(),
00276 (*des)->momentum().pz(),
00277 (*des)->momentum().e());
00278 }
00279 }
00280 }
00281
00282 return p4;
00283 }
00284
00285 TLorentzVector TauValidation::motherP4(const HepMC::GenParticle* tau){
00286
00287 TLorentzVector p4(0,0,0,0);
00288
00289 if ( tau->production_vertex() ) {
00290 HepMC::GenVertex::particle_iterator mother;
00291 for (mother = tau->production_vertex()->particles_begin(HepMC::parents);
00292 mother!= tau->production_vertex()->particles_end(HepMC::parents); ++mother ) {
00293
00294
00295 p4 = TLorentzVector((*mother)->momentum().px(),
00296 (*mother)->momentum().py(),
00297 (*mother)->momentum().pz(),
00298 (*mother)->momentum().e());
00299 }
00300 }
00301
00302 return p4;
00303 }
00304
00305 double TauValidation::visibleTauEnergy(const HepMC::GenParticle* tau){
00306 TLorentzVector p4(tau->momentum().px(),
00307 tau->momentum().py(),
00308 tau->momentum().pz(),
00309 tau->momentum().e());
00310
00311 if ( tau->end_vertex() ) {
00312 HepMC::GenVertex::particle_iterator des;
00313 for(des = tau->end_vertex()->particles_begin(HepMC::descendants);
00314 des!= tau->end_vertex()->particles_end(HepMC::descendants);++des ) {
00315 int pid = (*des)->pdg_id();
00316
00317 if(abs(pid) == 15) return visibleTauEnergy(*des);
00318
00319 if(abs(pid) == 12 || abs(pid) == 14 || abs(pid) == 16) {
00320 p4 -= TLorentzVector((*des)->momentum().px(),
00321 (*des)->momentum().py(),
00322 (*des)->momentum().pz(),
00323 (*des)->momentum().e());
00324 }
00325 }
00326 }
00327
00328 return p4.E();
00329 }
00330
00331 void TauValidation::photons(const HepMC::GenParticle* tau){
00332
00333 if ( tau->end_vertex() ) {
00334 bool photonFromTau = false;
00335 HepMC::GenVertex::particle_iterator des;
00336 for(des = tau->end_vertex()->particles_begin(HepMC::descendants);
00337 des!= tau->end_vertex()->particles_end(HepMC::descendants);++des ) {
00338 int pid = (*des)->pdg_id();
00339 if(pid == 22) {
00340 photonFromTauPtSum += (*des)->momentum().perp();
00341 photonFromTau = true;
00342 }
00343 }
00344 nTaus++;
00345 if(photonFromTau) {
00346 tauPtSum += tau->momentum().perp();
00347 nTausWithPhotons++;
00348 }
00349
00350 double nFrac = double(nTausWithPhotons)/nTaus;
00351 double ptFrac = 0;
00352 if(tauPtSum > 0) ptFrac = photonFromTauPtSum/tauPtSum;
00353
00354 TauPhotons->setBinContent(1,nFrac);
00355 TauPhotons->setBinContent(2,ptFrac);
00356 }
00357 }
00358