#ifndef ATLAS_AtlEvent
#include <AtlEvent.h>
#endif
#include <HepDatabasePDG.h>
#include <TString.h>
#include <TSystem.h>
#include <TArrayF.h>
#include <TArrayI.h>
#include <TDirectory.h>
#include <iostream>
using namespace std;
#ifndef __CINT__
ClassImp(AtlEvent);
#endif
AtlEvent::AtlEvent() {
Init();
fCone4H1TowerJets = new TClonesArray("AtlJet", 0);
fCone7H1TowerJets = new TClonesArray("AtlJet", 0);
fCone4H1TopoJets = new TClonesArray("AtlJet", 0);
fCone7H1TopoJets = new TClonesArray("AtlJet", 0);
fMCCone4HadronJets = new TClonesArray("AtlJet", 0);
fMCCone7HadronJets = new TClonesArray("AtlJet", 0);
fMCAntiKt4HadronJets = new TClonesArray("AtlJet", 0);
fMCAntiKt6HadronJets = new TClonesArray("AtlJet", 0);
fMCAntiKt4HadronPileupJets = new TClonesArray("AtlJet", 0);
fAntiKt4H1TopoJets = new TClonesArray("AtlJet", 0);
fAntiKt4H1TowerJets = new TClonesArray("AtlJet", 0);
fAntiKt6H1TowerJets = new TClonesArray("AtlJet", 0);
fAntiKt4TopoEMJets = new TClonesArray("AtlJet", 0);
fAntiKt4TopoEMJESJets= new TClonesArray("AtlJet", 0);
fAntiKt4LCTopoJets = new TClonesArray("AtlJet", 0);
fAntiKt4TowerJets = new TClonesArray("AtlJet", 0);
fAntiKt6TopoEMJets = new TClonesArray("AtlJet", 0);
fAntiKt4TopoJets = new TClonesArray("AtlJet", 0);
fAntiKt6TowerJets = new TClonesArray("AtlJet", 0);
fAntiKt6LCTopoJets = new TClonesArray("AtlJet", 0);
fAntiKt6TopoJets = new TClonesArray("AtlJet", 0);
fAtlFastJets = new TClonesArray("AtlJet", 0);
fMCParticles = new TClonesArray("HepMCParticle", 0);
fMCVertices = new TClonesArray("HepMCVertex", 0);
fIDTracks = new TClonesArray("AtlIDTrack", 0);
fPixelHits = new TClonesArray("AtlPixelHit", 0);
fSCTHits = new TClonesArray("AtlSCT3DHit", 0);
fTRTHits = new TClonesArray("AtlTRTDigit", 0);
fElectrons = new TClonesArray("AtlElectron", 0);
fMuons = new TClonesArray("AtlMuon", 0);
fTaus = new TClonesArray("AtlTau", 0);
fPhotons = new TClonesArray("AtlPhoton", 0);
fAtlFastElectrons = new TClonesArray("AtlFastElectron", 0);
fAtlFastMuons = new TClonesArray("AtlFastMuon", 0);
fAtlFastTaus = new TClonesArray("AtlFastTau", 0);
fAtlFastPhotons = new TClonesArray("AtlFastPhoton", 0);
fTopPairs = new TClonesArray("AtlTopPair", 0);
fTopDecays = new TClonesArray("HepTopDecay", 0);
fWDecaysLNu = new TClonesArray("AtlWDecayLNu", 0);
fWDecaysJJ = new TClonesArray("AtlWDecayJJ", 0);
fNeutrinos = new TClonesArray("HepParticle", 0);
fZ0Decays = new TClonesArray("HepZ0Decay", 0);
fPhiDecaysKK = new TClonesArray("AtlPhiDecayKK", 0);
fK0sDecaysPiPi = new TClonesArray("AtlK0sDecayPiPi", 0);
fPhotonConv = new TClonesArray("AtlPhotonConv", 0);
fLambdaDecaysPiPi = new TClonesArray("AtlLambdaDecayPPi",0);
fD0DecaysKPi = new TClonesArray("AtlD0DecayKPi", 0);
fDstarDecaysDPi = new TClonesArray("AtlDstarDecayDPi",0);
fVertices = new TClonesArray("HepVertex", 1);
fTrigger = new AtlTrigger;
}
AtlEvent::~AtlEvent() {
Clear("C");
delete fCone4H1TowerJets;
delete fCone7H1TowerJets;
delete fCone4H1TopoJets;
delete fCone7H1TopoJets;
delete fMCCone4HadronJets;
delete fMCCone7HadronJets;
delete fMCAntiKt4HadronJets;
delete fMCAntiKt6HadronJets;
delete fMCAntiKt4HadronPileupJets;
delete fAntiKt4H1TopoJets;
delete fAntiKt4H1TowerJets;
delete fAntiKt6H1TowerJets;
delete fAntiKt4TopoEMJets;
delete fAntiKt4TopoEMJESJets;
delete fAntiKt4LCTopoJets;
delete fAntiKt4TowerJets;
delete fAntiKt6TopoEMJets;
delete fAntiKt4TopoJets;
delete fAntiKt6TowerJets;
delete fAntiKt6LCTopoJets;
delete fAntiKt6TopoJets;
delete fAtlFastJets;
delete fMCParticles;
delete fMCVertices;
delete fIDTracks;
delete fPixelHits;
delete fSCTHits;
delete fTRTHits;
delete fElectrons;
delete fMuons;
delete fTaus;
delete fPhotons;
delete fAtlFastElectrons;
delete fAtlFastMuons;
delete fAtlFastTaus;
delete fAtlFastPhotons;
delete fTopPairs;
delete fTopDecays;
delete fWDecaysLNu;
delete fWDecaysJJ;
delete fNeutrinos;
delete fZ0Decays;
delete fPhiDecaysKK;
delete fK0sDecaysPiPi;
delete fPhotonConv;
delete fLambdaDecaysPiPi;
delete fD0DecaysKPi;
delete fDstarDecaysDPi;
delete fVertices;
delete fTrigger;
}
void AtlEvent::Clear(Option_t *option) {
Init();
fEventHeader.Clear();
fTrigger->Clear();
fEnergySum.Clear();
fCone4H1TowerJets ->Clear("C");
fCone7H1TowerJets ->Clear("C");
fCone4H1TopoJets ->Clear("C");
fCone7H1TopoJets ->Clear("C");
fMCCone4HadronJets ->Clear("C");
fMCCone7HadronJets ->Clear("C");
fMCAntiKt4HadronJets ->Clear("C");
fMCAntiKt6HadronJets ->Clear("C");
fMCAntiKt4HadronPileupJets->Clear("C");
fAntiKt4H1TopoJets ->Clear("C");
fAntiKt4H1TowerJets ->Clear("C");
fAntiKt6H1TowerJets ->Clear("C");
fAntiKt4TopoEMJets ->Clear("C");
fAntiKt4TopoEMJESJets->Clear("C");
fAntiKt4LCTopoJets ->Clear("C");
fAntiKt4TowerJets ->Clear("C");
fAntiKt6TopoEMJets ->Clear("C");
fAntiKt4TopoJets ->Clear("C");
fAntiKt6TowerJets ->Clear("C");
fAntiKt6LCTopoJets ->Clear("C");
fAntiKt6TopoJets ->Clear("C");
fAtlFastJets ->Clear("C");
fMCParticles ->Clear("C");
fMCVertices ->Clear("C");
fIDTracks ->Clear("C");
fPixelHits ->Clear("C");
fSCTHits ->Clear("C");
fTRTHits ->Clear("C");
fElectrons ->Clear("C");
fMuons ->Clear("C");
fTaus ->Clear("C");
fPhotons ->Clear("C");
fAtlFastElectrons ->Clear("C");
fAtlFastMuons ->Clear("C");
fAtlFastTaus ->Clear("C");
fAtlFastPhotons ->Clear("C");
fTopPairs ->Clear("C");
fTopDecays ->Clear("C");
fWDecaysLNu ->Clear("C");
fWDecaysJJ ->Clear("C");
fNeutrinos ->Clear("C");
fZ0Decays ->Clear("C");
fPhiDecaysKK ->Clear("C");
fK0sDecaysPiPi ->Clear("C");
fPhotonConv ->Clear("C");
fLambdaDecaysPiPi ->Clear("C");
fD0DecaysKPi ->Clear("C");
fDstarDecaysDPi ->Clear("C");
fVertices ->Clear("C");
}
void AtlEvent::Init() {
fN_Cone4H1TowerJets = 0;
fN_Cone7H1TowerJets = 0;
fN_Cone4H1TopoJets = 0;
fN_Cone7H1TopoJets = 0;
fN_MCCone4HadronJets = 0;
fN_MCCone7HadronJets = 0;
fN_MCAntiKt4HadronJets = 0;
fN_MCAntiKt4HadronPileupJets = 0;
fN_MCAntiKt6HadronJets = 0;
fN_AntiKt4H1TopoJets = 0;
fN_AntiKt4H1TowerJets = 0;
fN_AntiKt6H1TowerJets = 0;
fN_AntiKt4TopoEMJets = 0;
fN_AntiKt4TopoEMJESJets= 0;
fN_AntiKt4LCTopoJets = 0;
fN_AntiKt4TowerJets = 0;
fN_AntiKt6TopoEMJets = 0;
fN_AntiKt4TopoJets = 0;
fN_AntiKt6TowerJets = 0;
fN_AntiKt6LCTopoJets = 0;
fN_AntiKt6TopoJets = 0;
fN_AtlFastJets = 0;
fN_MCParticles = 0;
fN_MCVertices = 0;
fN_IDTracks = 0;
fN_PixelHits = 0;
fN_SCTHits = 0;
fN_TRTHits = 0;
fN_Electrons = 0;
fN_Muons = 0;
fN_Taus = 0;
fN_Photons = 0;
fN_AtlFastElectrons = 0;
fN_AtlFastMuons = 0;
fN_AtlFastTaus = 0;
fN_AtlFastPhotons = 0;
fN_TopPairs = 0;
fN_TopDecays = 0;
fN_WDecaysLNu = 0;
fN_WDecaysJJ = 0;
fN_Neutrinos = 0;
fN_Z0Decays = 0;
fN_PhiDecaysKK = 0;
fN_K0sDecaysPiPi = 0;
fN_PhotonConv = 0;
fN_LambdaDecaysPiPi = 0;
fN_D0DecaysKPi = 0;
fN_DstarDecaysDPi = 0;
fN_Vertices = 0;
fN_vpx = -1;
}
void AtlEvent::Print(Option_t *option) const {
TString opt = option;
opt.ToUpper();
cout << endl << endl
<< "====================================================================================================" << endl
<< " Run " << RunNr() << " Event " << EventNr() << " LumiBlock " << LumiBlock();
cout.setf(ios::fixed, ios::floatfield);
cout.precision(2);
cout << " BeamEnergy " << BeamEnergy()/1000. << "TeV" << endl
<< "====================================================================================================" << endl;
if ( opt.Contains("ALL") || opt.Contains("HDR") ) {
fEventHeader.Print();
}
if ( !opt.Contains("NOTRIG") ) {
if ( opt.Contains("ALL") || opt.Contains("TRIG") ) {
if ( GetTrigger()->GetTriggerConf() == 0 ) {
AtlTriggerConf *trig_conf = AtlTriggerConf::Instance()->LoadTree(gDirectory);
if ( trig_conf == 0 ) {
Info("Print",
"No trigger information available due to missing trigger configuration");
} else {
GetTrigger()->SetConfig(trig_conf);
}
}
if ( GetTrigger()->GetTriggerConf() != 0 ) {
fTrigger->Print(RunNr());
}
}
}
if ( opt.Contains("ALL") || opt.Contains("SUM") ) {
if ( IsMC() ) {
fEnergySum.Print("MC");
} else {
fEnergySum.Print();
}
}
if ( opt.Contains("ALL") || opt.Contains("JET") ) {
Int_t njets = 0;
for ( Int_t j = 0; j < AtlJet::kNumTypes-1; j++ ) {
njets = GetN_Jets((AtlJet::EType)j);
cout << endl << AtlJet::NameOfType((AtlJet::EType)j)
<< " Jets: #" << njets << endl;
if ( njets > 0 ) {
AtlJet::PrintHeader();
for ( Int_t i = 0; i < njets; i++ )
((AtlJet*)GetJets((AtlJet::EType)j)->At(i))->Print("nohead");
AtlJet::PrintFooter();
}
}
}
if ( IsMC() && (opt.Contains("ALL") || opt.Contains("PRT")) ) {
cout << endl << "MC particles: #" << fN_MCParticles << endl;
if ( fN_MCParticles > 0 ) {
HepMCParticle::PrintHeader();
for ( Int_t i = 0; i < fN_MCParticles; i++ )
((HepMCParticle*)fMCParticles->At(i))->Print("nohead");
HepMCParticle::PrintFooter();
}
}
if ( opt.Contains("ALL") || opt.Contains("TRK") ) {
cout << endl << "ID tracks: #" << fN_IDTracks << endl;
if ( fN_IDTracks > 0 ) {
AtlIDTrack::PrintHeader();
for ( Int_t i = 0; i < fN_IDTracks; i++ )
((AtlIDTrack*)fIDTracks->At(i))->Print("nohead");
AtlIDTrack::PrintFooter();
}
}
if ( opt.Contains("ALL") || opt.Contains("TRT") ) {
cout << endl << "TRT hits: #" << fN_TRTHits << endl;
if ( fN_TRTHits > 0 ) {
AtlTRTDigit::PrintHeader();
for ( Int_t i = 0; i < fN_TRTHits; i++ )
((AtlTRTDigit*)fTRTHits->At(i))->Print("nohead");
AtlTRTDigit::PrintFooter();
}
}
if ( opt.Contains("ALL") || opt.Contains("VTX") ) {
cout << endl << "Vertices: #" << fN_Vertices << endl;
if ( fN_Vertices > 0 ) {
HepVertex::PrintHeader();
for ( Int_t i = 0; i < fN_Vertices; i++ )
((HepVertex*)fVertices->At(i))
->Print(Form("nohead,%s", opt.Data()));
HepVertex::PrintFooter();
}
}
if ( opt.Contains("ALL") || opt.Contains("ELEC") ) {
cout << endl << "Electrons: #" << fN_Electrons << endl;
if ( fN_Electrons > 0 ) {
AtlElectron::PrintHeader();
for ( Int_t i = 0; i < fN_Electrons; i++ )
((AtlElectron*)fElectrons->At(i))->Print("nohead");
AtlElectron::PrintFooter();
}
if ( IsMC() ) {
cout << endl << "AtlFastElectrons: #" << fN_AtlFastElectrons << endl;
if ( fN_AtlFastElectrons > 0 ) {
AtlFastElectron::PrintHeader();
for ( Int_t i = 0; i < fN_AtlFastElectrons; i++ )
((AtlFastElectron*)fAtlFastElectrons->At(i))->Print("nohead");
AtlFastElectron::PrintFooter();
}
}
}
if ( opt.Contains("ALL") || opt.Contains("MUON") ) {
cout << endl << "Muons: #" << fN_Muons << endl;
if ( fN_Muons > 0 ) {
AtlMuon::PrintHeader();
for ( Int_t i = 0; i < fN_Muons; i++ )
((AtlMuon*)fMuons->At(i))->Print("nohead");
AtlMuon::PrintFooter();
}
if ( IsMC() ) {
cout << endl << "AtlFastMuons: #" << fN_AtlFastMuons << endl;
if ( fN_AtlFastMuons > 0 ) {
AtlFastMuon::PrintHeader();
for ( Int_t i = 0; i < fN_AtlFastMuons; i++ )
((AtlFastMuon*)fAtlFastMuons->At(i))->Print("nohead");
AtlFastMuon::PrintFooter();
}
}
}
if ( opt.Contains("ALL") || opt.Contains("TAU") ) {
cout << endl << "Taus: #" << fN_Taus << endl;
if ( fN_Taus > 0 ) {
AtlTau::PrintHeader();
for ( Int_t i = 0; i < fN_Taus; i++ )
((AtlTau*)fTaus->At(i))->Print("nohead");
AtlTau::PrintFooter();
}
if ( IsMC() ) {
cout << endl << "AtlFastTaus: #" << fN_AtlFastTaus << endl;
if ( fN_AtlFastTaus > 0 ) {
AtlFastTau::PrintHeader();
for ( Int_t i = 0; i < fN_AtlFastTaus; i++ )
((AtlFastTau*)fAtlFastTaus->At(i))->Print("nohead");
AtlFastTau::PrintFooter();
}
}
}
if ( opt.Contains("ALL") || opt.Contains("PHOT") ) {
cout << endl << "Photons: #" << fN_Photons << endl;
if ( fN_Photons > 0 ) {
AtlPhoton::PrintHeader();
for ( Int_t i = 0; i < fN_Photons; i++ )
((AtlPhoton*)fPhotons->At(i))->Print("nohead");
AtlPhoton::PrintFooter();
}
if ( IsMC() ) {
cout << endl << "AtlFastPhotons: #" << fN_AtlFastPhotons << endl;
if ( fN_AtlFastPhotons > 0 ) {
AtlFastPhoton::PrintHeader();
for ( Int_t i = 0; i < fN_AtlFastPhotons; i++ )
((AtlFastPhoton*)fAtlFastPhotons->At(i))->Print("nohead");
AtlFastPhoton::PrintFooter();
}
}
}
if ( opt.Contains("ALL") || opt.Contains("K0S") ) {
cout << endl << "K0s Decays: #" << fN_K0sDecaysPiPi << endl;
if ( fN_K0sDecaysPiPi > 0 ) {
AtlK0sDecayPiPi::PrintHeader();
for ( Int_t i = 0; i < fN_K0sDecaysPiPi; i++ )
((AtlK0sDecayPiPi*)fK0sDecaysPiPi->At(i))->Print("nohead");
AtlK0sDecayPiPi::PrintFooter();
}
}
if ( opt.Contains("ALL") || opt.Contains("CONV") ) {
cout << endl << "Conversions #" << fN_PhotonConv << endl;
if ( fN_PhotonConv > 0 ) {
AtlPhotonConv::PrintHeader();
for ( Int_t i = 0; i < fN_PhotonConv; i++ )
((AtlPhotonConv*)fPhotonConv->At(i))->Print("nohead");
AtlPhotonConv::PrintFooter();
}
}
if ( opt.Contains("ALL") || opt.Contains("ZDEC") ) {
cout << endl << "Z0 decays #" << fN_Z0Decays << endl;
if ( fN_Z0Decays > 0 ) {
HepParticle::PrintHeader();
for ( Int_t i = 0; i < fN_Z0Decays; i++ )
((HepZ0Decay*)fZ0Decays->At(i))->Print("nohead");
HepParticle::PrintFooter();
}
}
if ( opt.Contains("ALL") || opt.Contains("WDEC") ) {
cout << endl << "W->l+nu decays #" << fN_WDecaysLNu << endl;
if ( fN_WDecaysLNu > 0 ) {
for ( Int_t i = 0; i < fN_WDecaysLNu; i++ )
((AtlWDecayLNu*)fWDecaysLNu->At(i))->Print("nohead");
}
cout << endl << "W->jj decays #" << fN_WDecaysJJ << endl;
if ( fN_WDecaysJJ > 0 ) {
for ( Int_t i = 0; i < fN_WDecaysJJ; i++ )
((AtlWDecayJJ*)fWDecaysJJ->At(i))->Print("nohead");
}
}
if ( opt.Contains("ALL") || opt.Contains("TOP") ) {
cout << endl << "Top-quark decays #" << fN_TopDecays << endl;
if ( fN_TopDecays > 0 ) {
for ( Int_t i = 0; i < fN_TopDecays; i++ )
((HepTopDecay*)fTopDecays->At(i))->Print("nohead");
}
}
cout << endl
<< "====================================================================================================" << endl
<< "end of event " << RunNr() << "/" << EventNr() << endl << endl;
}
AtlJet* AtlEvent::AddJet(AtlJet::EType type,
Float_t E, Float_t Px, Float_t Py, Float_t Pz,
AtlJet::EJetQuality JetQuality,
TLorentzVector P_EMSCALE, TLorentzVector P_JESCorrSCALE,
Double_t EMJES_EtaCorr,
Double_t BCH_CORR_CELL, Double_t BCH_CORR_JET,
Float_t eta_offsetJES) {
TClonesArray &jets = *GetJets(type);
Int_t njets = GetN_Jets(type);
AtlJet *jet = new(jets[njets]) AtlJet(njets+1, E, Px, Py, Pz, JetQuality,
P_EMSCALE, P_JESCorrSCALE,
EMJES_EtaCorr,
BCH_CORR_CELL, BCH_CORR_JET,
eta_offsetJES);
SetN_Jets(type, njets+1);
return jet;
}
HepMCParticle* AtlEvent::AddMCParticle(Int_t PdgCode, Float_t Px, Float_t Py,
Float_t Pz, Float_t E, Int_t MCStatus,
Bool_t IsGenerator,
Bool_t IsGenNonInteracting,
Bool_t IsGenStable,
Bool_t IsGenSimulStable,
Bool_t IsGenInteracting,
Bool_t IsConversion,
Bool_t IsBremsstrahlung) {
TClonesArray &mcparticles = *fMCParticles;
HepMCParticle *mcprt = new(mcparticles[fN_MCParticles++])
HepMCParticle(fN_MCParticles, PdgCode, Px, Py, Pz, E, MCStatus,
IsGenerator, IsGenNonInteracting,
IsGenStable, IsGenSimulStable,
IsGenInteracting, IsConversion,
IsBremsstrahlung);
return mcprt;
}
HepMCVertex* AtlEvent::AddMCVertex(Float_t x, Float_t y, Float_t z) {
TClonesArray &mcvertices = *fMCVertices;
HepMCVertex *mcvtx = new(mcvertices[fN_MCVertices++])
HepMCVertex(fN_MCVertices, x, y, z);
return mcvtx;
}
AtlIDTrack* AtlEvent::AddIDTrack(Float_t Chi2, Int_t NDoF,
Float_t Xref, Float_t Yref, Float_t Zref, Float_t Phi0,
Float_t QovP, Float_t D0, Float_t Z0,
Float_t Theta, const Float_t CovMat[15]) {
TClonesArray &id_tracks = *fIDTracks;
AtlIDTrack *trk = new(id_tracks[fN_IDTracks++])
AtlIDTrack(fN_IDTracks, Chi2, NDoF, Xref, Yref, Zref, Phi0, QovP,
D0, Z0, Theta, CovMat);
return trk;
}
AtlIDTrack* AtlEvent::AddIDTrack(AtlIDTrack *trk) {
TClonesArray &id_tracks = *fIDTracks;
AtlIDTrack *trk_clone = new(id_tracks[fN_IDTracks++])
AtlIDTrack(fN_IDTracks, trk->GetChi2(), trk->GetNDoF(),
trk->GetRef().X(), trk->GetRef().Y(), trk->GetRef().Z(), trk->GetPhi0(),
trk->QovP(), trk->GetD0(), trk->GetZ0(),
trk->GetTheta0(), trk->GetCovMatrix());
return trk_clone;
}
AtlTRTDigit* AtlEvent::AddTRTHit(Float_t DriftTime, Float_t DriftRadius,
UInt_t Digit, Int_t EndCapOrBarrel,
Int_t PhiSector, Int_t ModuleOrWheel,
Int_t StrawLayer, Int_t Straw) {
TClonesArray &hits = *fTRTHits;
AtlTRTDigit *hit = new(hits[fN_TRTHits++])
AtlTRTDigit(fN_TRTHits, DriftTime, DriftRadius, Digit);
hit->SetEndCapOrBarrel(EndCapOrBarrel);
hit->SetPhiSector(PhiSector);
hit->SetModuleOrWheel(ModuleOrWheel);
hit->SetStrawLayer(StrawLayer);
hit->SetStraw(Straw);
return hit;
}
AtlPixelHit* AtlEvent::AddPixelHit(Float_t X, Float_t Y, Float_t Z) {
TClonesArray &hits = *fPixelHits;
AtlPixelHit *hit = new(hits[fN_PixelHits++])
AtlPixelHit(fN_PixelHits, X, Y, Z);
return hit;
}
AtlSCT3DHit* AtlEvent::AddSCTHit(Float_t X, Float_t Y, Float_t Z) {
TClonesArray &hits = *fSCTHits;
AtlSCT3DHit *hit = new(hits[fN_SCTHits++])
AtlSCT3DHit(fN_SCTHits, X, Y, Z);
return hit;
}
AtlElectron* AtlEvent::AddElectron(Float_t Px, Float_t Py, Float_t Pz,
Float_t E, Bool_t IsPositron,
Float_t EMWeight, Float_t BkgWeight,
UInt_t OQFlag,
UInt_t IsEMBitField,
AtlEMShower::EIsEM IsEM,
AtlEMShower::EAuthor Author,
TLorentzVector PCluster) {
TClonesArray &electrons = *fElectrons;
AtlElectron *electron = new(electrons[fN_Electrons++])
AtlElectron(fN_Electrons, Px, Py, Pz, E, IsPositron,
EMWeight, BkgWeight, OQFlag,
IsEMBitField, IsEM, Author, PCluster);
return electron;
}
AtlMuon* AtlEvent::AddMuon(Float_t Px, Float_t Py, Float_t Pz,
Float_t E, Bool_t IsMuPlus,
Float_t EtCone10, Float_t EtCone20,
Float_t EtCone30, Float_t EtCone40, Int_t NtrkCone10,
Int_t NtrkCone20, Int_t NtrkCone30, Int_t NtrkCone40,
Float_t PtCone10, Float_t PtCone20, Float_t PtCone30,
Float_t PtCone40, AtlMuon::EAuthor Author,
AtlMuon::EQuality Quality,
Float_t MatchingChi2, Int_t MatchingNDoF,
Bool_t IsCombinedMuon,
TLorentzVector PMuonSpecExtrapol,
Int_t MuonSpecExtrapolCharge) {
TClonesArray &muons = *fMuons;
AtlMuon *muon = new(muons[fN_Muons++])
AtlMuon(fN_Muons, Px, Py, Pz, E, IsMuPlus, EtCone10, EtCone20,
EtCone30, EtCone40, NtrkCone10, NtrkCone20, NtrkCone30,
NtrkCone40, PtCone10, PtCone20, PtCone30, PtCone40,
Author, Quality, MatchingChi2, MatchingNDoF, IsCombinedMuon,
PMuonSpecExtrapol, MuonSpecExtrapolCharge);
return muon;
}
AtlTau* AtlEvent::AddTau(Float_t Px, Float_t Py, Float_t Pz,
Float_t E, Bool_t IsTauPlus,
AtlTau::EAuthor Author, AtlTau::ETauFlag TauFlag) {
TClonesArray &taus = *fTaus;
AtlTau *tau = new(taus[fN_Taus++])
AtlTau(fN_Taus, Px, Py, Pz, E, IsTauPlus,
Author, TauFlag);
return tau;
}
AtlPhoton* AtlEvent::AddPhoton(Float_t Px, Float_t Py, Float_t Pz,
Float_t E,
Float_t EMWeight, Float_t BkgWeight,
UInt_t OQFlag,
UInt_t IsEMBitField,
AtlEMShower::EIsEM IsEM,
AtlEMShower::EAuthor Author,
TLorentzVector PCluster) {
TClonesArray &photons = *fPhotons;
AtlPhoton *photon = new(photons[fN_Photons++])
AtlPhoton(fN_Photons, Px, Py, Pz, E,
EMWeight, BkgWeight,
OQFlag, IsEMBitField,
IsEM, Author, PCluster);
return photon;
}
AtlFastElectron* AtlEvent::AddAtlFastElectron(Float_t Px, Float_t Py, Float_t Pz,
Float_t E, Bool_t IsPositron) {
TClonesArray &electrons = *fAtlFastElectrons;
AtlFastElectron *electron = new(electrons[fN_AtlFastElectrons++])
AtlFastElectron(fN_AtlFastElectrons, Px, Py, Pz, E, IsPositron);
return electron;
}
AtlFastMuon* AtlEvent::AddAtlFastMuon(Float_t Px, Float_t Py, Float_t Pz,
Float_t E, Bool_t IsMuPlus) {
TClonesArray &muons = *fAtlFastMuons;
AtlFastMuon *muon = new(muons[fN_AtlFastMuons++])
AtlFastMuon(fN_Muons, Px, Py, Pz, E, IsMuPlus);
return muon;
}
AtlFastTau* AtlEvent::AddAtlFastTau(Float_t Px, Float_t Py, Float_t Pz,
Float_t E, Bool_t IsTauPlus) {
TClonesArray &taus = *fAtlFastTaus;
AtlFastTau *tau = new(taus[fN_AtlFastTaus++])
AtlFastTau(fN_AtlFastTaus, Px, Py, Pz, E, IsTauPlus);
return tau;
}
AtlFastPhoton* AtlEvent::AddAtlFastPhoton(Float_t Px, Float_t Py, Float_t Pz,
Float_t E) {
TClonesArray &photons = *fAtlFastPhotons;
AtlFastPhoton *photon = new(photons[fN_AtlFastPhotons++])
AtlFastPhoton(fN_AtlFastPhotons, Px, Py, Pz, E);
return photon;
}
AtlTopPair* AtlEvent::AddTopPair(HepTopDecay* top1, HepTopDecay* top2,
Double_t chi2, Int_t ndof, AtlTopPair::EType type){
TClonesArray &TopPairs = *fTopPairs;
AtlTopPair *TopPair = new(TopPairs[fN_TopPairs++])
AtlTopPair(fN_TopPairs, top1, top2, chi2, ndof, type);
return TopPair;
}
HepTopDecay* AtlEvent::AddTopDecay(Float_t Px, Float_t Py, Float_t Pz,
Float_t E, HepWDecay *WDecay,
HepJet *BJetOrig,Float_t Px_j,
Float_t Py_j, Float_t Pz_j, Float_t E_j,
HepTopDecay::ProductionMode mode) {
TClonesArray &TopDecays = *fTopDecays;
HepTopDecay *TopDecay = new(TopDecays[fN_TopDecays++])
HepTopDecay(fN_TopDecays, Px, Py, Pz, E, WDecay, BJetOrig,
Px_j, Py_j, Pz_j, E_j, mode);
return TopDecay;
}
AtlWDecayLNu* AtlEvent::AddWDecayLNu(Float_t Px_W, Float_t Py_W, Float_t Pz_W,
Float_t E_W, HepParticle *lepton_orig, Float_t Px_lep,
Float_t Py_lep, Float_t Pz_lep, Float_t E_lep,
HepParticle* neutrino,
HepWDecay::ProductionMode mode) {
TClonesArray &WdecaysLNu = *fWDecaysLNu;
AtlWDecayLNu *WDecayLNu = new(WdecaysLNu[fN_WDecaysLNu++])
AtlWDecayLNu(fN_WDecaysLNu, Px_W, Py_W, Pz_W, E_W,
lepton_orig, Px_lep, Py_lep, Pz_lep, E_lep, neutrino, mode);
return WDecayLNu;
}
AtlWDecayJJ* AtlEvent::AddWDecayJJ(Float_t Px_W, Float_t Py_W, Float_t Pz_W,
Float_t E_W, AtlJet *jet1_orig, AtlJet *jet2_orig,
Float_t Px_j1, Float_t Py_j1, Float_t Pz_j1, Float_t E_j1,
Float_t Px_j2, Float_t Py_j2, Float_t Pz_j2, Float_t E_j2,
HepWDecay::ProductionMode mode) {
TClonesArray &WdecaysJJ = *fWDecaysJJ;
AtlWDecayJJ *WDecayJJ = new(WdecaysJJ[fN_WDecaysJJ++])
AtlWDecayJJ(fN_WDecaysJJ, Px_W, Py_W, Pz_W, E_W, jet1_orig, jet2_orig,
Px_j1, Py_j1, Pz_j1, E_j1, Px_j2, Py_j2, Pz_j2, E_j2, mode);
return WDecayJJ;
}
HepParticle* AtlEvent::AddNeutrino(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
Int_t PdgCode) {
Int_t pdg = TMath::Abs(PdgCode);
if ( pdg != 12 && pdg != 14 && pdg != 16 ) {
Error("AddNeutrino", "Invalid PDG code %d given. Abort!",
PdgCode);
gSystem->Abort(0);
}
TClonesArray &neutrinos = *fNeutrinos;
HepParticle *neutrino = new(neutrinos[fN_Neutrinos++])
HepParticle(fN_Neutrinos, Px, Py, Pz, E, PdgCode);
return neutrino;
}
HepZ0Decay* AtlEvent::AddZ0Decay(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
TObject* Daughter1, TObject* Daughter2,
HepParticle ReFitDaughter1, HepParticle ReFitDaughter2) {
TClonesArray &Z0decays = *fZ0Decays;
HepZ0Decay *Z0Decay = new(Z0decays[fN_Z0Decays++])
HepZ0Decay(fN_Z0Decays, Px, Py, Pz, E, Daughter1, Daughter2,
ReFitDaughter1, ReFitDaughter2);
return Z0Decay;
}
HepZ0Decay* AtlEvent::AddZ0Decay(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
TObject* Daughter1, TObject* Daughter2) {
TClonesArray &Z0decays = *fZ0Decays;
HepZ0Decay *Z0Decay = new(Z0decays[fN_Z0Decays++])
HepZ0Decay(fN_Z0Decays, Px, Py, Pz, E, Daughter1, Daughter2);
return Z0Decay;
}
AtlK0sDecayPiPi* AtlEvent::AddK0sDecayPiPi(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
AtlIDTrack* Daughter1, AtlIDTrack* Daughter2,
HepVertex* Vtx,
HepParticle Fit_Daughter1, HepParticle Fit_Daughter2) {
TClonesArray &K0sdecays = *fK0sDecaysPiPi;
AtlK0sDecayPiPi *K0sDecayClone = new(K0sdecays[fN_K0sDecaysPiPi++])
AtlK0sDecayPiPi(fN_K0sDecaysPiPi, Px, Py, Pz, E, Daughter1, Daughter2,
Vtx, GetPrimaryVtx(), Fit_Daughter1, Fit_Daughter2);
return K0sDecayClone;
}
AtlPhotonConv* AtlEvent::AddPhotonConv(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
AtlIDTrack* Daughter1, AtlIDTrack* Daughter2,
HepVertex* Vtx,
HepParticle Fit_Daughter1, HepParticle Fit_Daughter2) {
TClonesArray &PhotonConv = *fPhotonConv;
AtlPhotonConv *PhotonConvClone = new(PhotonConv[fN_PhotonConv++])
AtlPhotonConv(fN_PhotonConv, Px, Py, Pz, E, Daughter1, Daughter2,
Vtx, GetPrimaryVtx(), Fit_Daughter1, Fit_Daughter2);
return PhotonConvClone;
}
AtlLambdaDecayPPi* AtlEvent::AddLambdaDecayPiPi(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
AtlIDTrack* Proton, AtlIDTrack* Pion,
HepVertex* Vertex, HepVertex* PrimaryVtx,
HepParticle Fit_Daughter1, HepParticle Fit_Daughter2) {
TClonesArray &LambdaDecays = *fLambdaDecaysPiPi;
AtlLambdaDecayPPi *LambdaDecayClone = new(LambdaDecays[fN_LambdaDecaysPiPi++])
AtlLambdaDecayPPi(fN_LambdaDecaysPiPi, Px, Py, Pz, E, Proton, Pion, Vertex, PrimaryVtx,
Fit_Daughter1, Fit_Daughter2);
return LambdaDecayClone;
}
AtlD0DecayKPi* AtlEvent::AddD0DecayKPi(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
AtlIDTrack* Kaon, AtlIDTrack* Pion,
HepVertex* Vertex, HepVertex* PrimaryVtx,
HepParticle Fit_Daughter1, HepParticle Fit_Daughter2) {
TClonesArray &D0Decays = *fD0DecaysKPi;
AtlD0DecayKPi *D0DecayClone = new(D0Decays[fN_D0DecaysKPi++])
AtlD0DecayKPi(fN_D0DecaysKPi, Px, Py, Pz, E, Kaon, Pion, Vertex, PrimaryVtx,
Fit_Daughter1, Fit_Daughter2);
return D0DecayClone;
}
AtlDstarDecayDPi* AtlEvent::AddDstarDecayDPi(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
AtlD0DecayKPi* D0, AtlIDTrack* Pion,
HepVertex* Vertex, HepVertex* PrimaryVtx,
HepParticle Fit_Daughter1, HepParticle Fit_Daughter2) {
TClonesArray &DstarDecays = *fDstarDecaysDPi;
AtlDstarDecayDPi *DstarDecayClone = new(DstarDecays[fN_DstarDecaysDPi++])
AtlDstarDecayDPi(fN_DstarDecaysDPi, Px, Py, Pz, E, D0, Pion, Vertex, PrimaryVtx,
Fit_Daughter1, Fit_Daughter2);
return DstarDecayClone;
}
AtlPhiDecayKK* AtlEvent::AddPhiDecayKK(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
AtlIDTrack* Daughter1, AtlIDTrack* Daughter2,
HepVertex* Vtx,
HepParticle Fit_Daughter1, HepParticle Fit_Daughter2) {
TClonesArray &Phidecays = *fPhiDecaysKK;
AtlPhiDecayKK *PhiDecayClone = new(Phidecays[fN_PhiDecaysKK++])
AtlPhiDecayKK(fN_PhiDecaysKK, Px, Py, Pz, E, Daughter1, Daughter2,
Vtx,GetPrimaryVtx(),Fit_Daughter1, Fit_Daughter2);
return PhiDecayClone;
}
HepVertex* AtlEvent::AddVertex(Float_t X, Float_t Y, Float_t Z,
Float_t Chi2, Int_t NDoF,
Float_t errX, Float_t errY, Float_t errZ,
Int_t n_tracks, Int_t type) {
TClonesArray &vertices = *fVertices;
HepVertex *vtx = new(vertices[fN_Vertices++])
HepVertex(fN_Vertices, X, Y, Z, Chi2, NDoF);
vtx->SetNDaughters(n_tracks);
vtx->SetErrors(errX, errY, errZ);
if ( type == 1 )
vtx->SetPrimary();
else if ( type == 3 )
vtx->SetPileUp();
else
vtx->SetNotSpecified();
return vtx;
}
HepMCParticle* AtlEvent::GetMCParticle_ById(Int_t Id) const {
for ( Int_t i = 0; i < fN_MCParticles; i++ ) {
HepMCParticle *particle = (HepMCParticle*)fMCParticles->At(i);
if ( Id == particle->GetId() ) return particle;
}
if ( gDebug && Id != 0 )
Warning("GetMCParticle_ById",
"MC particle with Id %-d does not exist.", Id);
return 0;
}
TList* AtlEvent::GetMCTops(Bool_t good) const {
if (!IsMC()){
Error("GetMCTops"," Event is not MC! -> Abort");
gSystem->Abort(0);
}
TList *ListMCTops = new TList;
ListMCTops->AddAll(GetMCParticles("t"));
ListMCTops->AddAll(GetMCParticles("t_bar"));
if (good){
TList *GoodTops = new TList;
HepMCParticle *top = 0;
TIter nexttop(ListMCTops);
while ((top=(HepMCParticle*)nexttop())){
Bool_t containsW=kFALSE;
Bool_t containsQuark=kFALSE;
Int_t NDaughters=top->GetN_Daughters();
if (NDaughters<2) continue;
if (!top->IsGenerator()) continue;
if (!top->IsGoodMother()) continue;
for (Int_t j=0;j<NDaughters;j++){
if (((HepMCParticle*)top->GetDaughters()->At(j))->IsWBoson()) containsW=kTRUE;
if (((HepMCParticle*)top->GetDaughters()->At(j))->IsQuark()&& !((HepMCParticle*)top->GetDaughters()->At(j))->IsTopQuark()) containsQuark=kTRUE;
}
if (containsW && containsQuark){
GoodTops->Add(top);
}
}
delete ListMCTops;
return GoodTops;
}
else return ListMCTops;
}
HepMCParticle* AtlEvent::GetGoodMother(HepMCParticle *particle){
HepMCParticle *null = 0;
if ( particle->GetN_Daughters() == 0 ) {
Error("GetGoodMother","This particle does not have any daughters.");
return null;
}
HepMCParticle *daughter = particle;
while ( !daughter->IsGoodMother() ) {
if( daughter->GetN_Daughters() != 0 ) {
daughter = (HepMCParticle*)daughter->GetDaughters()->At(0);
}
else {
Error("GetGoodMother","This particle has daughters that are no good mothers because they do not have any daughters. DEAD END");
return null;
}
}
return daughter;
}
AtlElectron* AtlEvent::GetElectron_ById(Int_t Id) const {
for ( Int_t i = 0; i < fN_Electrons; i++ ) {
AtlElectron *el = (AtlElectron*)fElectrons->At(i);
if ( Id == el->GetId() ) return el;
}
if ( gDebug && Id != 0 )
Warning("GetElectron_ById",
"AtlElectron with Id %-d does not exist.", Id);
return 0;
}
AtlMuon* AtlEvent::GetMuon_ById(Int_t Id) const {
for ( Int_t i = 0; i < fN_Muons; i++ ) {
AtlMuon *mu = (AtlMuon*)fMuons->At(i);
if ( Id == mu->GetId() ) return mu;
}
if ( gDebug && Id != 0 )
Warning("GetMuon_ById",
"AtlMuon with Id %-d does not exist.", Id);
return 0;
}
TList* AtlEvent::GetMCParticles(const char* PrtType) const {
TList *particles = new TList;
for ( Int_t i = 0; i < fN_MCParticles; i++ ) {
HepMCParticle *prt = (HepMCParticle*)fMCParticles->At(i);
if ( HepDatabasePDG::Instance()->GetParticle(PrtType)->PdgCode()
== prt->GetPdgCode() ) particles->Add(prt);
}
return particles;
}
void AtlEvent::PrintMCParticles(const char* PrtType) const {
cout << endl;
HepMCParticle::PrintHeader();
TList *particles = GetMCParticles(PrtType);
TIter next_prt(particles);
HepMCParticle *prt = 0;
while ( (prt = (HepMCParticle*)next_prt()) ) {
prt->Print("nohead");
}
HepMCParticle::PrintFooter();
cout << endl;
delete particles;
}
TList* AtlEvent::GetMCNeutrinos(Bool_t sort) const {
TList *neutrinos = new TList;
HepMCParticle *prt = 0;
for ( Int_t i = 0; i < fN_MCParticles; i++ ) {
prt = (HepMCParticle*)fMCParticles->At(i);
if ( ((prt)->GetPdgCode()== 12) || ((prt)->GetPdgCode()== -12) ||
((prt)->GetPdgCode()== 14) || ((prt)->GetPdgCode()== -14) ||
((prt)->GetPdgCode()== 16) || ((prt)->GetPdgCode()== -16) )
neutrinos->Add(prt);
}
if ( sort ) neutrinos->Sort(kSortDescending);
return neutrinos;
}
HepMCParticle* AtlEvent::GetLeadingMCNeutrino() const {
TList *neutrinos = GetMCNeutrinos();
HepMCParticle *nu = 0;
if ( neutrinos->GetEntries() > 0 )
nu = (HepMCParticle*)neutrinos->At(0);
delete neutrinos;
return nu;
}
void AtlEvent::PrintMCDaughters(HepMCParticle *prt) const {
if ( prt == 0 ) return;
TRefArray *daughters = prt->GetDaughters();
cout << endl;
HepMCParticle::PrintHeader();
prt->Print("nohead");
cout << " |" << endl
<< " |" << endl
<< " V" << endl;
TIter next(daughters);
while ( HepMCParticle *daughter = (HepMCParticle*)next() )
daughter->Print("nohead");
HepMCParticle::PrintFooter();
cout << endl;
}
void AtlEvent::PrintMCMothers(HepMCParticle *prt) const {
if ( prt == 0 ) return;
TRefArray *mothers = prt->GetMothers();
cout << endl;
HepMCParticle::PrintHeader();
TIter next(mothers);
while ( HepMCParticle *mother = (HepMCParticle*)next() )
mother->Print("nohead");
cout << " |" << endl
<< " |" << endl
<< " V" << endl;
prt->Print("nohead");
HepMCParticle::PrintFooter();
cout << endl;
}
TList* AtlEvent::GetMCGenealogy(HepMCParticle *prt) const {
TList *history = new TList;
while ( prt != 0 ) {
history->Add(prt);
HepMCParticle *mother = prt->DaughterOf();
prt = mother;
}
return history;
}
void AtlEvent::PrintMCGenealogy(HepMCParticle *prt) const {
TList *history = GetMCGenealogy(prt);
cout << endl;
HepMCParticle::PrintHeader();
TIter last(history, kIterBackward);
Bool_t first = kTRUE;
HepMCParticle* p = 0;
while ( (p = (HepMCParticle*)last()) ) {
if ( first ) {
first = kFALSE;
} else {
cout << " |" << endl
<< " |" << endl
<< " V" << endl;
}
p->Print("nohead");
}
if (prt->GetN_Mothers() > 1) {
printf(" (mother IDs=");
TIter next(prt->GetMothers());
Bool_t first = kTRUE;
while ( HepMCParticle* mother = (HepMCParticle*)next() ) {
if(!first) printf(",");
first = kFALSE;
printf("%-d", mother->GetId());
}
printf(")\n");
}
HepMCParticle::PrintFooter();
cout << endl;
delete history;
}
void AtlEvent::PrintMCGenealogyTree(HepMCParticle *prt, TString *padding,
TList *CheckList) const {
Bool_t cleanup = kFALSE;
if ( CheckList == 0 ) {
CheckList = new TList;
cleanup = kTRUE;
}
if ( CheckList->FindObject(prt) == 0 ) {
CheckList->Add(prt);
TString *padding_new = new TString(padding->Data());
printf("%-s (ID=%-d, E=%-.2fGeV, Theta=%-.fdeg, Phi=%-.fdeg, GINUS=%-d%-d%-d%-d%-d",
prt->GetPdgName(), prt->GetId(),
prt->E(), prt->Theta()*180/TMath::Pi(),
prt->Phi()*180/TMath::Pi(),
prt->IsGenerator(),
prt->IsGenInteracting(),
prt->IsGenNonInteracting(),
prt->IsGenSimulStable(),
prt->IsGenStable());
if (prt->GetN_Mothers() > 1) {
printf(", mother IDs=");
TIter next(prt->GetMothers());
Bool_t first = kTRUE;
while ( HepMCParticle* mother = (HepMCParticle*)next() ) {
if(!first) printf(",");
first = kFALSE;
printf("%-d", mother->GetId());
}
}
printf(")\n");
TRefArray *daughters = prt->GetDaughters();
if ( daughters->GetEntries() > 0 ) padding_new->Append("| ");
TIter next(daughters);
while ( HepMCParticle *daughter = (HepMCParticle*)next() ) {
if ( daughter == daughters->Last() )
padding_new->Replace(padding_new->Length()-8, 1, " ");
cout << padding->Data() << "|" << endl;
cout << padding->Data() << "+----- ";
PrintMCGenealogyTree(daughter, padding_new, CheckList);
}
if ( daughters->GetSize() > 0 )
cout << padding->Data() << endl;
delete padding_new;
}
if ( cleanup ) delete CheckList;
}
void AtlEvent::PrintMCGenealogyTree(Int_t First, Int_t Last) const {
TList *CheckList = new TList;
TString *padding = new TString("");
if ( First < 1 ) First = 1;
if ( Last > fN_MCParticles ) Last = fN_MCParticles;
if ( Last < First ) { Int_t tmp = First; First = Last; Last = tmp; }
cout << endl;
for ( Int_t i = First-1; i < Last; i++ ) {
HepMCParticle *prt = (HepMCParticle*)fMCParticles->At(i);
PrintMCGenealogyTree(prt, padding, CheckList);
}
delete CheckList;
delete padding;
}
AtlJet* AtlEvent::GetLeadingJet(AtlJet::EType type) const {
if ( GetN_Jets(type) < 1 ) {
Warning("GetLeadingJet",
"No jets of type \"%s\" in this event!",
AtlJet::NameOfType(type));
return 0;
}
TClonesArray *jets = GetJets(type);
if ( !jets->IsSorted() ) jets->Sort();
return (AtlJet*)jets->Last();
}
Int_t AtlEvent::GetN_Jets(AtlJet::EType type) const {
switch ( type ) {
case AtlJet::kCone4H1Tower:
return fN_Cone4H1TowerJets;
case AtlJet::kCone7H1Tower:
return fN_Cone7H1TowerJets;
case AtlJet::kCone4H1Topo:
return fN_Cone4H1TopoJets;
case AtlJet::kCone7H1Topo:
return fN_Cone7H1TopoJets;
case AtlJet::kMCCone4Hadron:
return fN_MCCone4HadronJets;
case AtlJet::kMCCone7Hadron:
return fN_MCCone7HadronJets;
case AtlJet::kMCAntiKt4Hadron:
return fN_MCAntiKt4HadronJets;
case AtlJet::kMCAntiKt6Hadron:
return fN_MCAntiKt6HadronJets;
case AtlJet::kMCAntiKt4HadronPileup:
return fN_MCAntiKt4HadronPileupJets;
case AtlJet::kAntiKt4H1Topo:
return fN_AntiKt4H1TopoJets;
case AtlJet::kAntiKt4H1Tower:
return fN_AntiKt4H1TowerJets;
case AtlJet::kAntiKt6H1Tower:
return fN_AntiKt6H1TowerJets;
case AtlJet::kAntiKt4TopoEM:
return fN_AntiKt4TopoEMJets;
case AtlJet::kAntiKt4TopoEMJES:
return fN_AntiKt4TopoEMJESJets;
case AtlJet::kAntiKt4LCTopo:
return fN_AntiKt4LCTopoJets;
case AtlJet::kAntiKt4Tower:
return fN_AntiKt4TowerJets;
case AtlJet::kAntiKt6TopoEM:
return fN_AntiKt6TopoEMJets;
case AtlJet::kAntiKt4Topo:
return fN_AntiKt4TopoJets;
case AtlJet::kAntiKt6Tower:
return fN_AntiKt6TowerJets;
case AtlJet::kAntiKt6LCTopo:
return fN_AntiKt6LCTopoJets;
case AtlJet::kAntiKt6Topo:
return fN_AntiKt6TopoJets;
case AtlJet::kAtlFast:
return fN_AtlFastJets;
default:
Error("Get_NJets", "Invalid jet type given. Abort!");
gSystem->Abort(0);
}
return 0;
}
void AtlEvent::SetN_Jets(AtlJet::EType type, Int_t NJets) {
switch ( type ) {
case AtlJet::kCone4H1Tower:
fN_Cone4H1TowerJets = NJets;
break;
case AtlJet::kCone7H1Tower:
fN_Cone7H1TowerJets = NJets;
break;
case AtlJet::kCone4H1Topo:
fN_Cone4H1TopoJets = NJets;
break;
case AtlJet::kCone7H1Topo:
fN_Cone7H1TopoJets = NJets;
break;
case AtlJet::kMCCone4Hadron:
fN_MCCone4HadronJets = NJets;
break;
case AtlJet::kMCCone7Hadron:
fN_MCCone7HadronJets = NJets;
break;
case AtlJet::kMCAntiKt4Hadron:
fN_MCAntiKt4HadronJets = NJets;
break;
case AtlJet::kMCAntiKt6Hadron:
fN_MCAntiKt6HadronJets = NJets;
break;
case AtlJet::kMCAntiKt4HadronPileup:
fN_MCAntiKt4HadronPileupJets = NJets;
break;
case AtlJet::kAntiKt4H1Topo:
fN_AntiKt4H1TopoJets = NJets;
break;
case AtlJet::kAntiKt4H1Tower:
fN_AntiKt4H1TowerJets = NJets;
break;
case AtlJet::kAntiKt6H1Tower:
fN_AntiKt6H1TowerJets = NJets;
break;
case AtlJet::kAntiKt4TopoEM:
fN_AntiKt4TopoEMJets = NJets;
break;
break;
case AtlJet::kAntiKt4TopoEMJES:
fN_AntiKt4TopoEMJESJets = NJets;
break;
case AtlJet::kAntiKt4LCTopo:
fN_AntiKt4LCTopoJets = NJets;
break;
case AtlJet::kAntiKt4Tower:
fN_AntiKt4TowerJets = NJets;
break;
case AtlJet::kAntiKt6TopoEM:
fN_AntiKt6TopoEMJets = NJets;
break;
case AtlJet::kAntiKt4Topo:
fN_AntiKt4TopoJets = NJets;
break;
case AtlJet::kAntiKt6Tower:
fN_AntiKt6TowerJets = NJets;
break;
case AtlJet::kAntiKt6LCTopo:
fN_AntiKt6LCTopoJets = NJets;
break;
case AtlJet::kAntiKt6Topo:
fN_AntiKt6TopoJets = NJets;
break;
case AtlJet::kAtlFast:
fN_AtlFastJets = NJets;
break;
default:
Error("Set_NJets", "Invalid jet type given. Abort!");
gSystem->Abort(0);
}
}
TClonesArray* AtlEvent::GetJets(AtlJet::EType type) const {
switch ( type ) {
case AtlJet::kCone4H1Tower:
return fCone4H1TowerJets;
case AtlJet::kCone7H1Tower:
return fCone7H1TowerJets;
case AtlJet::kCone4H1Topo:
return fCone4H1TopoJets;
case AtlJet::kCone7H1Topo:
return fCone7H1TopoJets;
case AtlJet::kMCCone4Hadron:
return fMCCone4HadronJets;
case AtlJet::kMCCone7Hadron:
return fMCCone7HadronJets;
case AtlJet::kMCAntiKt4Hadron:
return fMCAntiKt4HadronJets;
case AtlJet::kMCAntiKt6Hadron:
return fMCAntiKt6HadronJets;
case AtlJet::kMCAntiKt4HadronPileup:
return fMCAntiKt4HadronPileupJets;
case AtlJet::kAntiKt4H1Topo:
return fAntiKt4H1TopoJets;
case AtlJet::kAntiKt4H1Tower:
return fAntiKt4H1TowerJets;
case AtlJet::kAntiKt6H1Tower:
return fAntiKt6H1TowerJets;
case AtlJet::kAntiKt4TopoEM:
return fAntiKt4TopoEMJets;
case AtlJet::kAntiKt4TopoEMJES:
return fAntiKt4TopoEMJESJets;
case AtlJet::kAntiKt4LCTopo:
return fAntiKt4LCTopoJets;
case AtlJet::kAntiKt4Tower:
return fAntiKt4TowerJets;
case AtlJet::kAntiKt6TopoEM:
return fAntiKt6TopoEMJets;
case AtlJet::kAntiKt4Topo:
return fAntiKt4TopoJets;
case AtlJet::kAntiKt6Tower:
return fAntiKt6TowerJets;
case AtlJet::kAntiKt6LCTopo:
return fAntiKt6LCTopoJets;
case AtlJet::kAntiKt6Topo:
return fAntiKt6TopoJets;
case AtlJet::kAtlFast:
return fAtlFastJets;
default:
Error("GetJets", "Invalid jet type given. Abort!");
gSystem->Abort(0);
}
return 0;
}
TList* AtlEvent::GetElectrons(AtlElectron::EAuthor author,
AtlEMShower::EIsEM IsEM, Float_t Pt_min,
Float_t Pt_max, Float_t Eta_min,
Float_t Eta_max, Float_t EtCone20_max,
Bool_t sort, Bool_t exclude_crack,
Float_t EtCone20_IsoFactor,
Bool_t use_cluster_eta,
AtlEMShower::ECaloIsoCorrection CaloIsoCorrection) {
TList *electrons = new TList();
AtlElectron *el = 0;
Float_t Pt = 0.;
Float_t eta = 0.;
Float_t eta_abs = 0.;
for ( Int_t i = 0; i < fN_Electrons; i++ ) {
el = (AtlElectron*)fElectrons->At(i);
if ( (el->GetAuthor() & author) && (el->IsEM(IsEM))
&& (el->GetEtCone20(CaloIsoCorrection) <= (EtCone20_max + EtCone20_IsoFactor*el->Pt())) ) {
Pt = el->Pt();
if ( use_cluster_eta ){
eta = el->ClusterEta();
}
else{
eta = el->Eta();
}
eta_abs = TMath::Abs(eta);
if ( Pt > Pt_min && Pt < Pt_max ) {
if ( eta > Eta_min && eta < Eta_max ) {
if ( exclude_crack ) {
if ( !((1.37 < eta_abs) && (eta_abs < 1.52)) ){
electrons->Add(el);
}
}
else{
electrons->Add(el);
}
}
}
}
}
if ( sort ) electrons->Sort(kSortDescending);
return electrons;
}
TList* AtlEvent::GetVtxTracks(Float_t Chi2ovNDoF_max, Float_t Pt_min, Float_t Pt_max,
Float_t Eta_min, Float_t Eta_max, Bool_t sort) {
TList *tracks = new TList;
AtlIDTrack *trk = 0;
Float_t Pt = 0.;
Float_t eta = 0.;
for ( Int_t i = 0; i < fN_IDTracks; i++ ) {
trk = (AtlIDTrack*)fIDTracks->At(i);
if ( trk->IsVtxTrack() ) {
Pt = trk->Pt();
eta = TMath::Abs(trk->Eta());
if ( Pt >= Pt_min && Pt <= Pt_max ) {
if ( eta >= Eta_min && eta <= Eta_max ) {
if ( trk->Chi2ovNDoF() <= Chi2ovNDoF_max ) tracks->Add(trk);
}
}
}
}
if ( sort ) tracks->Sort(kSortDescending);
return tracks;
}
TList* AtlEvent::GetSecVtxTracks(Float_t Chi2ovDoF_max, Float_t Pt_min, Float_t Pt_max,
Float_t Eta_min, Float_t Eta_max, Bool_t sort) {
TList *tracks = new TList;
AtlIDTrack *trk = 0;
Float_t Pt = 0.;
Float_t eta = 0.;
for ( Int_t i = 0; i < fN_IDTracks; i++ ) {
trk = (AtlIDTrack*)fIDTracks->At(i);
if ( trk->IsSecondaryVtxTrack() ) {
Pt = trk->Pt();
eta = TMath::Abs(trk->Eta());
if ( Pt >= Pt_min && Pt <= Pt_max ) {
if ( eta >= Eta_min && eta <= Eta_max ) {
if ( (trk->Chi2() / trk->NDoF() ) <= Chi2ovDoF_max ) tracks->Add(trk);
}
}
}
}
if ( sort ) tracks->Sort(kSortDescending);
return tracks;
}
TList* AtlEvent::GetPrimVtxTracks(Float_t Chi2ovDoF_max, Float_t Pt_min, Float_t Pt_max,
Float_t Eta_min, Float_t Eta_max, Bool_t sort) {
TList *tracks = new TList;
AtlIDTrack *trk = 0;
Float_t Pt = 0.;
Float_t eta = 0.;
for ( Int_t i = 0; i < fN_IDTracks; i++ ) {
trk = (AtlIDTrack*)fIDTracks->At(i);
if (trk->IsPrimaryVtxTrack() ) {
Pt = trk->Pt();
eta = TMath::Abs(trk->Eta());
if ( Pt >= Pt_min && Pt <= Pt_max ) {
if ( eta >= Eta_min && eta <= Eta_max ) {
if ( (trk->Chi2() / trk->NDoF() ) <= Chi2ovDoF_max ) tracks->Add(trk);
}
}
}
}
if ( sort ) tracks->Sort(kSortDescending);
return tracks;
}
TList* AtlEvent::GetPhotons(AtlPhoton::EAuthor author,
AtlEMShower::EIsEM IsEM, Float_t Pt_min,
Float_t Pt_max, Float_t Eta_min,
Float_t Eta_max, Float_t EtCone20_max,
Bool_t sort, Bool_t exclude_crack,
AtlEMShower::ECaloIsoCorrection CaloIsoCorrection) {
TList *photons = new TList;
AtlPhoton *ph = 0;
Float_t Pt = 0.;
Float_t eta = 0.;
Float_t eta_abs = 0.;
for ( Int_t i = 0; i < fN_Photons; i++ ) {
ph = (AtlPhoton*)fPhotons->At(i);
if ( (ph->GetAuthor() & author) && (ph->IsEM(IsEM))
&& ph->GetEtCone20(CaloIsoCorrection) <= EtCone20_max ) {
Pt = ph->Pt();
eta = ph->Eta();
eta_abs = TMath::Abs(eta);
if ( Pt >= Pt_min && Pt <= Pt_max ) {
if ( eta >= Eta_min && eta <= Eta_max ) {
if ( exclude_crack ) {
if ( (eta_abs <= 1.37) || (eta_abs >= 1.52) ) photons->Add(ph);
}
else{
photons->Add(ph);
}
}
}
}
}
if ( sort ) photons->Sort(kSortDescending);
return photons;
}
TList* AtlEvent::GetMuons(AtlMuon::EAuthor author, Float_t Pt_min,
Float_t Pt_max, Float_t Eta_min, Float_t Eta_max,
Float_t Chi2_max, Float_t EtCone20_max,
Bool_t staco_combined, Bool_t sort,
AtlMuon::EQuality quality) {
TList *muons = new TList;
AtlMuon *mu = 0;
Float_t Pt = 0.;
Float_t eta = 0.;
for ( Int_t i = 0; i < fN_Muons; i++ ) {
mu = (AtlMuon*)fMuons->At(i);
if ( mu->GetAuthor() & author
&& mu->GetQuality() & quality
&& mu->GetMatchingChi2overNDoF() <= Chi2_max
&& mu->GetEtCone20() <= EtCone20_max ) {
Pt = mu->Pt();
eta = mu->Eta();
if ( Pt >= Pt_min && Pt < Pt_max ) {
if ( eta >= Eta_min && eta < Eta_max ) {
if ( staco_combined && mu->IsCombinedMuon() )
muons->Add(mu);
if ( !staco_combined )
muons->Add(mu);
}
}
}
}
if ( sort ) muons->Sort(kSortDescending);
return muons;
}
TList* AtlEvent::GetJets(AtlJet::EType type, Float_t Et_min,
Float_t Et_max, Float_t Eta_min, Float_t Eta_max,
Bool_t is_good, Bool_t sort, Bool_t remove_faked) {
TList *jets = new TList;
AtlJet *jet = 0;
Float_t Et = 0.;
Float_t eta = 0.;
for ( Int_t i = 0; i < GetN_Jets(type); i++ ) {
jet = (AtlJet*)GetJets(type)->At(i);
if ( is_good ) {
if ( !jet->IsGoodJet() ) continue;
}
Et = jet->Et();
eta = jet->Eta();
if ( Et >= Et_min && Et <= Et_max ) {
if ( eta >= Eta_min && eta <= Eta_max ) {
if ( remove_faked && jet->IsFaked() ) {
continue;
}
else {
jets->Add(jet);
}
}
}
}
if ( sort ) jets->Sort(kSortDescending);
return jets;
}
TList* AtlEvent::GetTaus(AtlTau::EAuthor author,
AtlTau::ETauFlag flag, Float_t Pt_min,
Float_t Pt_max, Float_t Eta_min,
Float_t Eta_max, Bool_t sort) {
TList *taus = new TList;
AtlTau *tau = 0;
Float_t Pt = 0.;
Float_t eta = 0.;
for ( Int_t i = 0; i < fN_Taus; i++ ) {
tau = (AtlTau*)fTaus->At(i);
if ( (tau->GetAuthor() & author) && (tau->GetTauFlag() & flag) ) {
Pt = tau->Pt();
eta = tau->Eta();
if ( Pt >= Pt_min && Pt <= Pt_max ) {
if ( eta >= Eta_min && eta <= Eta_max )
taus->Add(tau);
}
}
}
if ( sort ) taus->Sort(kSortDescending);
return taus;
}
TList* AtlEvent::GetStableMCParticles() const {
TList *particles = new TList;
HepMCParticle *prt = 0;
for ( Int_t i = 0; i < GetN_MCParticles(); i++ ) {
prt = (HepMCParticle*)GetMCParticles()->At(i);
if ( prt->IsGenStable() ) particles->Add(prt);
}
return particles;
}
TList* AtlEvent::FindMCParticlesByName(const char* PdgName,
Bool_t RemoveDouble) {
Int_t PdgCode = HepDatabasePDG::Instance()->GetParticle(PdgName)->PdgCode();
TList *particles = new TList;
HepMCParticle *prt = 0;
for ( Int_t i = 0; i < GetN_MCParticles(); i++ ) {
prt = (HepMCParticle*)GetMCParticles()->At(i);
if ( prt->GetPdgCode() != PdgCode ) continue;
if ( RemoveDouble && prt->GetN_Daughters() == 1 ) {
if ( ((HepMCParticle*)prt->GetDaughters()->First())
->GetPdgCode() == PdgCode ) continue;
}
particles->Add(prt);
}
return particles;
}
TList* AtlEvent::FindOverlaps_ElectronCluster_Jets(AtlElectron *el,
TCollection *search_list,
Float_t DeltaR) {
TList *sorted_overlapping = new TList;
TList *unsorted_overlapping = new TList;
TIter next_jet(search_list);
HepJet *jet_cmp = 0;
Float_t DeltaR_cur = 0.;
TArrayF *dist = new TArrayF(search_list->GetEntries());
Int_t i = 0;
while( (jet_cmp = (HepJet*)next_jet()) ) {
DeltaR_cur = el->ClusterDeltaR(jet_cmp);
if ( (DeltaR_cur < DeltaR) ) {
unsorted_overlapping->Add(jet_cmp);
dist->AddAt(DeltaR_cur, i++);
}
}
TArrayI *index = new TArrayI(i);
TMath::Sort(i, dist->GetArray(), index->GetArray(), kFALSE);
for ( Int_t j = 0; j < i; j++){
sorted_overlapping->Add(unsorted_overlapping->At(index->At(j)));
}
delete unsorted_overlapping;
delete dist;
delete index;
return sorted_overlapping;
}
TList* AtlEvent::FindOverlaps_ElectronTrack_EMScaleJets(AtlElectron *el,
TCollection *search_list,
Float_t DeltaR,
const char* option) {
TList *sorted_overlapping = new TList;
TList *unsorted_overlapping = new TList;
TIter next_jet(search_list);
AtlJet *jet_cmp = 0;
Float_t DeltaR_cur = 0.;
TArrayF *dist = new TArrayF(search_list->GetEntries());
Int_t i = 0;
while( (jet_cmp = (AtlJet*)next_jet()) ) {
DeltaR_cur = jet_cmp->EMScaleDeltaR(el, option);
if ( (DeltaR_cur < DeltaR) ) {
unsorted_overlapping->Add(jet_cmp);
dist->AddAt(DeltaR_cur, i++);
}
}
TArrayI *index = new TArrayI(i);
TMath::Sort(i, dist->GetArray(), index->GetArray(), kFALSE);
for ( Int_t j = 0; j < i; j++){
sorted_overlapping->Add(unsorted_overlapping->At(index->At(j)));
}
delete unsorted_overlapping;
delete dist;
delete index;
return sorted_overlapping;
}
TList* AtlEvent::FindOverlaps_MuonTrack_EMScaleJets(AtlMuon *mu,
TCollection *search_list,
Float_t DeltaR) {
TList *sorted_overlapping = new TList;
TList *unsorted_overlapping = new TList;
TIter next_jet(search_list);
AtlJet *jet_cmp = 0;
Float_t DeltaR_cur = 0.;
TArrayF *dist = new TArrayF(search_list->GetEntries());
Int_t i = 0;
const char* option = "trk";
while( (jet_cmp = (AtlJet*)next_jet()) ) {
DeltaR_cur = jet_cmp->EMScaleDeltaR(mu, option);
if ( (DeltaR_cur < DeltaR) ) {
unsorted_overlapping->Add(jet_cmp);
dist->AddAt(DeltaR_cur, i++);
}
}
TArrayI *index = new TArrayI(i);
TMath::Sort(i, dist->GetArray(), index->GetArray(), kFALSE);
for ( Int_t j = 0; j < i; j++){
sorted_overlapping->Add(unsorted_overlapping->At(index->At(j)));
}
delete unsorted_overlapping;
delete dist;
delete index;
return sorted_overlapping;
}
TList* AtlEvent::FindOverlaps_Particle_Jets(HepParticle *prt,
TCollection *search_list,
Float_t DeltaR) {
TList *sorted_overlapping = new TList;
TList *unsorted_overlapping = new TList;
TIter next_jet(search_list);
HepJet *jet_cmp = 0;
Float_t DeltaR_cur = 0.;
TArrayF *dist = new TArrayF(search_list->GetEntries());
Int_t i = 0;
while( (jet_cmp = (HepJet*)next_jet()) ) {
DeltaR_cur = prt->DeltaR(jet_cmp);
if ( (DeltaR_cur < DeltaR) ) {
unsorted_overlapping->Add(jet_cmp);
dist->AddAt(DeltaR_cur, i++);
}
}
TArrayI *index = new TArrayI(i);
TMath::Sort(i, dist->GetArray(), index->GetArray(), kFALSE);
for ( Int_t j = 0; j < i; j++){
sorted_overlapping->Add(unsorted_overlapping->At(index->At(j)));
}
delete unsorted_overlapping;
delete dist;
delete index;
return sorted_overlapping;
}
TList* AtlEvent::FindMatchedParticles(HepParticle *prt,
TCollection *search_list,
Float_t DeltaR,
Float_t DeltaPtFrac) {
TList *sorted_matched = new TList;
TList *unsorted_matched = new TList;
TIter next_prt(search_list);
HepParticle *prt_cmp = 0;
Float_t DeltaPtFrac_cur = 0.;
Float_t DeltaR_cur = 0.;
TArrayF *chi2 = new TArrayF(search_list->GetEntries());
Int_t i = 0;
while( (prt_cmp = (HepParticle*)next_prt()) ) {
DeltaPtFrac_cur = TMath::Abs(prt->DeltaPtFrac(prt_cmp));
DeltaR_cur = prt->DeltaR(prt_cmp);
if ( (DeltaR_cur < DeltaR) && (DeltaPtFrac_cur < DeltaPtFrac) ) {
unsorted_matched->Add(prt_cmp);
chi2->AddAt(DeltaR_cur*DeltaR_cur + DeltaPtFrac_cur*DeltaPtFrac_cur, i++);
}
}
TArrayI *index = new TArrayI(i);
TMath::Sort(i, chi2->GetArray(), index->GetArray(), kFALSE);
for ( Int_t j = 0; j < i; j++){
sorted_matched->Add(unsorted_matched->At(index->At(j)));
}
delete unsorted_matched;
delete chi2;
delete index;
return sorted_matched;
}
TList* AtlEvent::FindMatchedParticles(HepJet *jet,
TCollection *search_list,
Float_t DeltaR,
Float_t DeltaPtFrac) {
TList *sorted_matched = new TList;
TList *unsorted_matched = new TList;
TIter next_prt(search_list);
HepParticle *prt_cmp = 0;
Float_t DeltaPtFrac_cur = 0.;
Float_t DeltaR_cur = 0.;
TArrayF *chi2 = new TArrayF(search_list->GetEntries());
Int_t i = 0;
while( (prt_cmp = (HepParticle*)next_prt()) ) {
DeltaPtFrac_cur = TMath::Abs(jet->DeltaPtFrac(prt_cmp));
DeltaR_cur = jet->DeltaR(prt_cmp);
if ( (DeltaR_cur < DeltaR) && (DeltaPtFrac_cur < DeltaPtFrac) ) {
unsorted_matched->Add(prt_cmp);
chi2->AddAt(DeltaR_cur*DeltaR_cur + DeltaPtFrac_cur*DeltaPtFrac_cur, i++);
}
}
TArrayI *index = new TArrayI(i);
TMath::Sort(i, chi2->GetArray(), index->GetArray(), kFALSE);
for ( Int_t j = 0; j < i; j++){
sorted_matched->Add(unsorted_matched->At(index->At(j)));
}
delete unsorted_matched;
delete chi2;
delete index;
return sorted_matched;
}
TList* AtlEvent::FindTruthMatchedJets(AtlJet::EType type) {
Float_t DeltaR = 0;
Float_t DeltaPtFrac = 0;
TList* jets = new TList();
switch ( type ) {
case AtlJet::kCone4H1Tower :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fCone4H1TowerJets);
break;
case AtlJet::kCone7H1Tower :
DeltaR = 0.7;
DeltaPtFrac = 10.e10;
jets->AddAll(fCone7H1TowerJets);
break;
case AtlJet::kCone4H1Topo :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fCone4H1TopoJets);
break;
case AtlJet::kCone7H1Topo :
DeltaR = 0.7;
DeltaPtFrac = 10.e10;
jets->AddAll(fCone7H1TopoJets);
break;
case AtlJet::kAntiKt4H1Topo :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fAntiKt4H1TopoJets);
break;
case AtlJet::kAntiKt4TopoEM:
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fAntiKt4TopoEMJets);
break;
case AtlJet::kAntiKt4TopoEMJES:
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fAntiKt4TopoEMJESJets);
break;
case AtlJet::kAntiKt4H1Tower :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fAntiKt4H1TowerJets);
break;
case AtlJet::kAntiKt6H1Tower :
DeltaR = 0.6;
DeltaPtFrac = 10.e10;
jets->AddAll(fAntiKt6H1TowerJets);
break;
case AtlJet::kMCCone4Hadron :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fMCCone4HadronJets);
break;
case AtlJet::kMCCone7Hadron :
DeltaR = 0.7;
DeltaPtFrac = 10.e10;
jets->AddAll(fMCCone7HadronJets);
break;
case AtlJet::kMCAntiKt4Hadron :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fMCAntiKt4HadronJets);
break;
default :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
jets->AddAll(fAntiKt4H1TopoJets);
}
TIter next_jet(jets);
AtlJet* jet = 0;
HepMCParticle* cone_prt = 0;
TList* truth_matched_jets = new TList();
while ( ( jet = (AtlJet*)next_jet() ) ) {
TList *cone_mc_particles =
FindMatchedParticles(jet,fMCParticles,DeltaR,DeltaPtFrac);
TIter next_cone_prt(cone_mc_particles);
while ( ( cone_prt = (HepMCParticle*)next_cone_prt() ) ) {
if ( cone_prt->GetN_Mothers() != 0 ) {
if ( cone_prt->GetMother()->IsStringOrCluster() ) {
truth_matched_jets->Add(jet);
break;
}
}
}
delete cone_mc_particles;
}
delete jets;
return truth_matched_jets;
}
TList* AtlEvent::FindTruthMatchedJets(TCollection *search_list,
AtlJet::EType type) {
Float_t DeltaR = 0;
Float_t DeltaPtFrac = 0;
switch ( type ) {
case AtlJet::kCone4H1Tower :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kCone7H1Tower :
DeltaR = 0.7;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kCone4H1Topo :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kCone7H1Topo :
DeltaR = 0.7;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kAntiKt4H1Topo :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kAntiKt4TopoEM :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kAntiKt4TopoEMJES :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kAntiKt4H1Tower :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kAntiKt6H1Tower :
DeltaR = 0.6;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kMCCone4Hadron :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kMCCone7Hadron :
DeltaR = 0.7;
DeltaPtFrac = 10.e10;
break;
case AtlJet::kMCAntiKt4Hadron :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
break;
default :
DeltaR = 0.4;
DeltaPtFrac = 10.e10;
}
TIter next_jet(search_list);
AtlJet* jet = 0;
HepMCParticle* cone_prt = 0;
TList* truth_matched_jets = new TList();
while ( ( jet = (AtlJet*)next_jet() ) ) {
TList *cone_mc_particles =
FindMatchedParticles(jet,fMCParticles,DeltaR,DeltaPtFrac);
TIter next_cone_prt(cone_mc_particles);
while ( ( cone_prt = (HepMCParticle*)next_cone_prt() ) ) {
if ( cone_prt->GetN_Mothers() != 0 ) {
if ( cone_prt->GetMother()->IsStringOrCluster() ) {
truth_matched_jets->Add(jet);
break;
}
}
}
delete cone_mc_particles;
}
return truth_matched_jets;
}
TList* AtlEvent::FindMatchedJets(HepParticle *prt,
TCollection *search_list,
Float_t DeltaR,
Float_t DeltaPtFrac,
Bool_t UseDeltaRonly) {
TList *sorted_matched = new TList;
TList *unsorted_matched = new TList;
TIter next_jet(search_list);
HepJet *jet_cmp = 0;
Float_t DeltaPtFrac_cur = 0.;
Float_t DeltaR_cur = 0.;
TArrayF *chi2 = new TArrayF(search_list->GetEntries());
Int_t i = 0;
while( (jet_cmp = (HepJet*)next_jet()) ) {
DeltaPtFrac_cur = TMath::Abs(prt->DeltaPtFrac(jet_cmp));
DeltaR_cur = prt->DeltaR(jet_cmp);
if ( DeltaR_cur < DeltaR ) {
if ( UseDeltaRonly && (DeltaPtFrac_cur < DeltaPtFrac) ) {
unsorted_matched->Add(jet_cmp);
chi2->AddAt(DeltaR_cur*DeltaR_cur + DeltaPtFrac_cur*DeltaPtFrac_cur, i++);
} else if ( !UseDeltaRonly ) {
unsorted_matched->Add(jet_cmp);
chi2->AddAt(DeltaR_cur*DeltaR_cur, i++);
}
}
}
TArrayI *index = new TArrayI(i);
TMath::Sort(i, chi2->GetArray(), index->GetArray(), kFALSE);
for ( Int_t j = 0; j < i; j++){
sorted_matched->Add(unsorted_matched->At(index->At(j)));
}
delete unsorted_matched;
delete chi2;
delete index;
return sorted_matched;
}
TList* AtlEvent::FindMatchedJets(HepJet *jet,
TCollection *search_list,
Float_t DeltaR,
Float_t DeltaEtFrac) {
TList *sorted_matched = new TList;
TList *unsorted_matched = new TList;
TIter next_jet(search_list);
HepJet *jet_cmp = 0;
Float_t DeltaEtFrac_cur = 0.;
Float_t DeltaR_cur = 0.;
TArrayF *chi2 = new TArrayF(search_list->GetEntries());
Int_t i = 0;
while( (jet_cmp = (HepJet*)next_jet()) ) {
DeltaEtFrac_cur = TMath::Abs(jet->DeltaEtFrac(jet_cmp));
DeltaR_cur = jet->DeltaR(jet_cmp);
if ( (DeltaR_cur < DeltaR) && (DeltaEtFrac_cur < DeltaEtFrac) ) {
unsorted_matched->Add(jet_cmp);
chi2->AddAt(DeltaR_cur*DeltaR_cur + DeltaEtFrac_cur*DeltaEtFrac_cur, i++);
}
}
TArrayI *index = new TArrayI(i);
TMath::Sort(i, chi2->GetArray(), index->GetArray(), kFALSE);
for ( Int_t j = 0; j < i; j++){
sorted_matched->Add(unsorted_matched->At(index->At(j)));
}
delete unsorted_matched;
delete chi2;
delete index;
return sorted_matched;
}
HepMCParticle* AtlEvent::FindMatchedMCParticle(HepParticle *prt,
Bool_t RemoveUnstable,
Float_t DeltaR,
Float_t DeltaPtFrac) {
HepMCParticle *mc_prt = 0;
TList *mc_particles = FindMatchedParticles(prt, GetMCParticles(),
DeltaR, DeltaPtFrac);
if ( mc_particles->GetSize() == 0 ) ;
else {
Int_t z = 0;
if ( RemoveUnstable ) {
TIter next_mcprt(mc_particles);
while ( (mc_prt = (HepMCParticle*)next_mcprt()) ) {
if ( mc_prt->IsGenStable() ) break;
if (z == 25){
mc_prt = 0;
Error("FindMatchedMCParticle","No GenStable MC particle found within given DeltaR and DeltaPtFrac amongst first 25 candidates that match best.");
break;
}
z++;
}
} else {
mc_prt = (HepMCParticle*)mc_particles->First();
}
}
delete mc_particles;
return mc_prt;
}
HepMCParticle* AtlEvent::FindMatchedMCParticle(HepJet *jet,
Bool_t RemoveUnstable,
Float_t DeltaR,
Float_t DeltaPtFrac) {
HepMCParticle *mc_prt = 0;
TList *mc_particles = FindMatchedParticles(jet, GetMCParticles(),
DeltaR, DeltaPtFrac);
if ( mc_particles->GetSize() == 0 ) ;
else {
Int_t z = 0;
if ( RemoveUnstable ) {
TIter next_mcprt(mc_particles);
while ( (mc_prt = (HepMCParticle*)next_mcprt()) ) {
if ( mc_prt->IsGenStable() ) break;
if (z == 25){
mc_prt = 0;
Error("FindMatchedMCParticle","No GenStable MC particle found within given DeltaR and DeltaPtFrac amongst first 25 candidates that match best.");
break;
}
z++;
}
} else {
mc_prt = (HepMCParticle*)mc_particles->First();
}
}
delete mc_particles;
return mc_prt;
}
HepJet* AtlEvent::FindMatchedMCJet(HepParticle *prt,
Float_t DeltaR,
Float_t DeltaPtFrac) {
TList *mc_jets = FindMatchedJets(prt, GetMCAntiKt4HadronJets(),
DeltaR, DeltaPtFrac);
HepJet *mc_jet = (HepJet*)mc_jets->First();
delete mc_jets;
return mc_jet;
}
HepJet* AtlEvent::FindMatchedMCJet(HepJet *jet,
Float_t DeltaR,
Float_t DeltaEtFrac) {
TList *mc_jets = FindMatchedJets(jet, GetMCAntiKt4HadronJets(),
DeltaR, DeltaEtFrac);
HepJet *mc_jet = (HepJet*)mc_jets->First();
delete mc_jets;
return mc_jet;
}
Float_t AtlEvent::W_Mperp2(HepParticle *lepton, TVector2 MissingEt) const {
return 2* lepton->Et()*MissingEt.Mod()
*(1. - TMath::Cos(lepton->P3().XYvector().DeltaPhi(MissingEt)));
}
TLorentzVector AtlEvent::GetMCSumEnergy_NonInt() const {
HepMCParticle *mc_prt = 0;
TList *mc_particles = GetStableMCParticles();
TIter next_mcprt(mc_particles);
TLorentzVector mc_nonint_sum;
while ( (mc_prt = (HepMCParticle*)next_mcprt()) ) {
if ( mc_prt->IsGenNonInteracting() ) mc_nonint_sum += mc_prt->P();
}
delete mc_particles;
return mc_nonint_sum;
}
Float_t AtlEvent::GetMCSumEnergy_NonInt_Eta() const {
TLorentzVector mc_nonint_sum = GetMCSumEnergy_NonInt();
Float_t mc_nonint_sum_eta;
if ( mc_nonint_sum.Pt() != 0. ) mc_nonint_sum_eta = mc_nonint_sum.Eta();
else {
mc_nonint_sum_eta = ( mc_nonint_sum.Pz() > 0. ) ? 10e10 : -10e10;
}
return mc_nonint_sum_eta;
}
Float_t AtlEvent::GetMCSumEnergy_NonInt_Phi() const {
TLorentzVector mc_nonint_sum = GetMCSumEnergy_NonInt();
Float_t mc_nonint_sum_phi;
mc_nonint_sum_phi = mc_nonint_sum.Phi();
return mc_nonint_sum_phi;
}
Float_t AtlEvent::Sphericity(TList *Vectors) {
Float_t Sphericity = 0;
Float_t denom = 0;
Float_t alpha = 0;
Float_t beta = 0;
TVector3 *p = 0;
TMatrixDSym S(3);
S.Zero();
for ( Int_t n = 0; n < Vectors->GetEntries(); n++){
p = (TVector3*)Vectors->At(n);
for (Int_t i = 0; i < 3; i++ ){
if ( i == 0 ) {
alpha = p->X();
}
else if ( i == 1 ) {
alpha = p->Y();
}
else {
alpha = p->Z();
}
for ( Int_t j = i; j < 3; j++ ){
if ( j == 0 ) {
beta = p->X();
}
else if ( j == 1 ){
beta = p->Y();
}
else {
beta = p->Z();
}
S(i,j) += alpha*beta;
}
}
}
for( Int_t i=0; i < Vectors->GetEntries(); i++ ){
denom += ((TVector3*)Vectors->At(i))->Mag2();
}
S *= 1./denom;
S[1][0]=S[0][1];
S[2][0]=S[0][2];
S[2][1]=S[1][2];
TMatrixDSymEigen Eigen(S);
TVectorD EigenValues = Eigen.GetEigenValues();
Sphericity = 1.5*(EigenValues[1]+EigenValues[2])/EigenValues.Sum();
return Sphericity;
}
TList* AtlEvent::GetVertices(HepVertex::EType type) const {
TList *vertices = new TList;
HepVertex *vtx = 0;
for ( Int_t i = 0; i < fN_Vertices; i++ ) {
vtx = (HepVertex*)fVertices->At(i);
if ( vtx->GetType() & type ) vertices->Add(vtx);
}
return vertices;
}
Int_t AtlEvent::GetN_PrimaryVertices() const {
if ( fN_vpx != -1 ) return fN_vpx;
HepVertex *vtx = 0;
Int_t N_PrimVertixes = 0;
for ( Int_t i = 0; i < fN_Vertices; i++ ) {
vtx = (HepVertex*)fVertices->At(i);
if(vtx->IsPrimary()) N_PrimVertixes++;
}
return N_PrimVertixes;
}
HepVertex* AtlEvent::GetPrimaryVtx() const {
HepVertex *vtx = 0;
if (fVertices == NULL)
return 0;
for ( Int_t i = 0; i < fN_Vertices; i++ ) {
vtx = (HepVertex*)fVertices->At(i);
if ( vtx->GetType() & HepVertex::kPrimary ) break;
}
return vtx;
}
AtlIDTrack* AtlEvent::GetAssociatedIDTrack(HepMCParticle *prt) const {
TClonesArray *idtrks = GetIDTracks();
AtlIDTrack *trk = 0;
for (Int_t i = 0; i < idtrks->GetEntries(); i++){
trk = (AtlIDTrack*)idtrks->At(i);
if ( trk->HasValidTruthMatch(0.0001) ){
if(trk->GetMCParticle() == prt) return trk;
}
}
return 0;
}
void AtlEvent::PrintTriggerMatches(Option_t *option) const {
TString opt = option;
opt.ToUpper();
if ( GetTrigger()->GetTriggerConf() == 0 ) {
AtlTriggerConf *conf = AtlTriggerConf::Instance();
if ( conf->LoadTree(gDirectory) == 0 ) {
Error("PrintTriggerMatches",
"Cannot load trigger configuration. Please check.");
return;
}
AtlTrigger::SetConfig(conf);
}
cout << endl << endl
<< "Trigger <-> Reco Object Matching:" << endl
<< "=================================" << endl;
if ( opt.Contains("ALL") || opt.Contains("ELEC") ) {
cout << endl
<< "Electrons:" << endl
<< "----------" << endl;
AtlElectron *el = 0;
for ( Int_t i = 0; i < GetN_Electrons(); i++ ) {
el = (AtlElectron*)fElectrons->At(i);
if ( el->GetN_TriggerMatches() > 0 ) {
cout << "Id = " << el->GetId() << endl;
PrintTriggerMatches(el);
}
}
cout << endl;
}
if ( opt.Contains("ALL") || opt.Contains("PHOT") ) {
cout << endl
<< "Photons:" << endl
<< "--------" << endl;
AtlPhoton *ph = 0;
for ( Int_t i = 0; i < GetN_Photons(); i++ ) {
ph = (AtlPhoton*)fPhotons->At(i);
if ( ph->GetN_TriggerMatches() > 0 ) {
cout << "Id = " << ph->GetId() << endl;
PrintTriggerMatches(ph);
}
cout << endl;
}
}
if ( opt.Contains("ALL") || opt.Contains("MUON") ) {
cout << endl
<< "Muons:" << endl
<< "------" << endl;
AtlMuon *mu = 0;
for ( Int_t i = 0; i < GetN_Muons(); i++ ) {
mu = (AtlMuon*)fMuons->At(i);
if ( mu->GetN_TriggerMatches() > 0 ) {
cout << "Id = " << mu->GetId() << endl;
PrintTriggerMatches(mu);
}
}
cout << endl;
}
if ( opt.Contains("ALL") || opt.Contains("TAU") ) {
cout << endl
<< "Tau leptons:" << endl
<< "------------" << endl;
AtlTau *tau = 0;
for ( Int_t i = 0; i < GetN_Taus(); i++ ) {
tau = (AtlTau*)fTaus->At(i);
if ( tau->GetN_TriggerMatches() > 0 ) {
cout << "Id = " << tau->GetId() << endl;
PrintTriggerMatches(tau);
}
}
cout << endl;
}
}
void AtlEvent::PrintTriggerMatches(AtlJet::EType type) const {
if ( GetTrigger()->GetTriggerConf() == 0 ) {
AtlTriggerConf *conf = AtlTriggerConf::Instance();
if ( conf->LoadTree(gDirectory) == 0 ) {
Error("PrintTriggerMatches",
"Cannot load trigger configuration. Please check.");
return;
}
AtlTrigger::SetConfig(conf);
}
cout << endl << endl
<< "Trigger <-> Reco Object Matching:" << endl
<< "=================================" << endl;
cout << endl
<< AtlJet::NameOfType(type) << " Jets:" << endl << endl;
AtlJet *jet = 0;
for ( Int_t i = 0; i < GetN_Jets(type); i++ ) {
jet = (AtlJet*)GetJets(type)->At(i);
if ( jet->GetN_TriggerMatches() > 0 ) {
cout << "Id = " << jet->GetId() << endl;
PrintTriggerMatches(jet);
}
}
cout << endl;
}
void AtlEvent::PrintTriggerMatches(AtlTriggerMatch *obj) const {
TObject *item = 0;
TIter next_L1(obj->GetMatchedL1Items());
cout << "Matched L1 items:";
while ( (item = next_L1()) ) {
Int_t bit = GetTrigger()->GetL1Items()->IndexOf(item);
cout << " "
<< GetTrigger()->GetTriggerConf()->GetL1ItemName(bit, RunNr());
}
TIter next_HLT(obj->GetMatchedHLTItems());
cout << endl << "Matched HLT items:";
while ( (item = next_HLT()) ) {
Int_t bit = GetTrigger()->GetHLTItems()->IndexOf(item);
cout << " "
<< GetTrigger()->GetTriggerConf()->GetHLTItemName(bit, RunNr());
}
cout << endl;
}
AtlTriggerItem* AtlEvent::AddL1Match(AtlTriggerMatch* RecoObject,
const char* L1ItemName) {
AtlTriggerItem *item = GetTrigger()->GetL1Item(L1ItemName);
RecoObject->AddL1Match(item);
return item;
}
AtlTriggerItem* AtlEvent::AddHLTMatch(AtlTriggerMatch* RecoObject,
const char* HLTItemName) {
AtlTriggerItem *item = GetTrigger()->GetHLTItem(HLTItemName);
RecoObject->AddHLTMatch(item);
return item;
}
void AtlEvent::ComputePtRel(HepParticle *prt,
TCollection *search_list,
Float_t DeltaRmax,
Double_t &PtRel, Double_t &DeltaR) {
TList *jets = FindMatchedJets(prt, search_list, DeltaRmax, 1., kTRUE);
if ( jets->GetEntries() < 1 ) {
delete jets;
PtRel = -1.; DeltaR = -1.;
return;
}
AtlJet *jet = (AtlJet*)jets->First();
delete jets;
PtRel = jet->PtRel(prt);
DeltaR = jet->DeltaR(prt);
return;
}