#ifndef ALIDIELECTRONVARMANAGER_H #define ALIDIELECTRONVARMANAGER_H /* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. * * See cxx source for full Copyright notice */ //############################################################# //# # //# Class AliDielectronVarManager # //# Class for management of available variables # //# # //# Authors: # //# Anton Andronic, GSI / A.Andronic@gsi.de # //# Ionut C. Arsene, GSI / I.C.Arsene@gsi.de # //# Julian Book, Uni Ffm / Julian.Book@cern.ch # //# Frederick Kramer, Uni Ffm / Frederick.Kramer@cern.ch # //# Magnus Mager, CERN / Magnus.Mager@cern.ch # //# WooJin J. Park, GSI / W.J.Park@gsi.de # //# Jens Wiechula, Uni HD / Jens.Wiechula@cern.ch # //# # //############################################################# #include #include #include #include #include #include #include #include #include #include #include #include #include #include // ? #include #include #include "AliDielectronPair.h" class AliVEvent; //________________________________________________________________ class AliDielectronVarManager : public TNamed { public: // Particle specific variables enum ValueTypes { kPx = 0, // px kPy, // py kPz, // pz kPt, // transverse momentum kP, // momentum kXv, // vertex position in x kYv, // vertex position in y kZv, // vertex position in z kOneOverPt, // 1/pt kPhi, // phi angle kTheta, // theta angle kEta, // pseudo-rapidity kY, // rapidity kE, // energy kM, // mass kCharge, // charge kNclsITS, // number of clusters assigned in the ITS kNclsTPC, // number of clusters assigned in the TPC kNFclsTPC, // number of findable clusters in the TPC kTPCsignalN, // number of points used for dEdx kNclsTRD, // number of clusters assigned in the TRD kTRDntracklets, // number of TRD tracklets used for tracking/PID TODO: correct getter kTRDpidQuality, // number of TRD tracklets used for PID kImpactParXY, // Impact parameter in XY plane kImpactParZ, // Impact parameter in Z kTrackLength, // Track length kPdgCode, // PDG code kPIn, // momentum at inner wall of TPC (if available), used for PID kTPCsignal, // TPC dE/dx signal kTPCnSigmaEle, // number of sigmas to the dE/dx electron line in the TPC kParticleMax, // // TODO: kRNClusters ?? // AliDielectronPair specific variables kChi2NDF = kParticleMax, // Chi^2/NDF kDecayLength, // decay length kR, // distance to the origin kOpeningAngle, // opening angle kMerr, // error of mass calculation kDCA, // distance of closest approach TODO: not implemented yet kPairType, // type of the pair, like like sign ++ unlikesign ... kPairMax, // // Event specific variables kXvPrim=kPairMax, // prim vertex kYvPrim, // prim vertex kZvPrim, // prim vertex kXRes, // primary vertex x-resolution kYRes, // primary vertex y-resolution kZRes, // primary vertex z-resolution kNTrk, // number of tracks (or tracklets) kTracks, // ESD tracks kNevents, // event counter kNMaxValues // // TODO: (for A+A) ZDCEnergy, impact parameter, Iflag?? }; AliDielectronVarManager(); AliDielectronVarManager(const char* name, const char* title); virtual ~AliDielectronVarManager(); static void Fill(const TObject* particle, Double_t * const values); static void InitESDpid(Int_t type=0); static void SetEvent(AliVEvent * const ev) { fgEvent = ev; } static const char* GetValueName(Int_t i) { return (i>=0&&iIsA() == AliESDtrack::Class()) FillVarESDtrack(static_cast(object), values); else if (object->IsA() == AliAODTrack::Class()) FillVarAODTrack(static_cast(object), values); else if (object->IsA() == AliMCParticle::Class()) FillVarMCParticle(static_cast(object), values); else if (object->IsA() == AliAODMCParticle::Class()) FillVarAODMCParticle(static_cast(object), values); else if (object->IsA() == AliDielectronPair::Class()) FillVarDielectronPair(static_cast(object), values); // Main function to fill all available variables according to the type of event else if (object->IsA() == AliVEvent::Class()) FillVarVEvent(static_cast(object), values); else if (object->IsA() == AliESDEvent::Class()) FillVarESDEvent(static_cast(object), values); else if (object->IsA() == AliAODEvent::Class()) FillVarAODEvent(static_cast(object), values); else if (object->IsA() == AliMCEvent::Class()) FillVarMCEvent(static_cast(object), values); // else Error("Fill",Form("Type %s is not supported by AliDielectronVarManager!", object->ClassName())); //TODO: implement without object needed } inline void AliDielectronVarManager::FillVarVParticle(const AliVParticle *particle, Double_t * const values) { // // Fill track information available in AliVParticle into an array // values[AliDielectronVarManager::kPx] = particle->Px(); values[AliDielectronVarManager::kPy] = particle->Py(); values[AliDielectronVarManager::kPz] = particle->Pz(); values[AliDielectronVarManager::kPt] = particle->Pt(); values[AliDielectronVarManager::kP] = particle->P(); values[AliDielectronVarManager::kXv] = particle->Xv(); values[AliDielectronVarManager::kYv] = particle->Yv(); values[AliDielectronVarManager::kZv] = particle->Zv(); values[AliDielectronVarManager::kOneOverPt] = particle->OneOverPt(); values[AliDielectronVarManager::kPhi] = particle->Phi(); values[AliDielectronVarManager::kTheta] = particle->Theta(); values[AliDielectronVarManager::kEta] = particle->Eta(); values[AliDielectronVarManager::kY] = particle->Y(); values[AliDielectronVarManager::kE] = particle->E(); values[AliDielectronVarManager::kM] = particle->M(); values[AliDielectronVarManager::kCharge] = particle->Charge(); if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values); } inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle, Double_t * const values) { // // Fill track information available for histogramming into an array // // Fill common AliVParticle interface information FillVarVParticle(particle, values); // Fill AliESDtrack interface specific information values[AliDielectronVarManager::kNclsITS] = particle->GetNcls(0); // TODO: get rid of the plain numbers values[AliDielectronVarManager::kNclsTPC] = particle->GetNcls(1); // TODO: get rid of the plain numbers values[AliDielectronVarManager::kNFclsTPC] = particle->GetTPCNclsF(); values[AliDielectronVarManager::kTPCsignalN] = particle->GetTPCsignalN(); values[AliDielectronVarManager::kNclsTRD] = particle->GetNcls(2); // TODO: get rid of the plain numbers values[AliDielectronVarManager::kTRDntracklets] = particle->GetTRDntracklets(); // TODO: GetTRDtracklets/GetTRDntracklets? values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDpidQuality(); Float_t impactParXY, impactParZ; particle->GetImpactParameters(impactParXY, impactParZ); values[AliDielectronVarManager::kImpactParXY] = impactParXY; values[AliDielectronVarManager::kImpactParZ] = impactParZ; values[AliDielectronVarManager::kTrackLength] = particle->GetIntegratedLength(); //dEdx information Double_t mom = particle->GetP(); const AliExternalTrackParam *in=particle->GetInnerParam(); if (in) mom = in->GetP(); values[AliDielectronVarManager::kPIn]=mom; values[AliDielectronVarManager::kTPCsignal]=particle->GetTPCsignal(); // nsigma to Electron band // TODO: for the moment we set the bethe bloch parameters manually // this should be changed in future! values[AliDielectronVarManager::kTPCnSigmaEle]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kElectron); } inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle, Double_t * const values) { // // Fill track information available for histogramming into an array // // Fill common AliVParticle interface information FillVarVParticle(particle, values); // Fill AliAODTrack interface information // ... } inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *particle, Double_t * const values) { // // Fill track information available for histogramming into an array // // Fill common AliVParticle interface information FillVarVParticle(particle, values); // Fill AliMCParticle interface specific information values[AliDielectronVarManager::kPdgCode] = particle->PdgCode(); } inline void AliDielectronVarManager::FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values) { // // Fill track information available for histogramming into an array // // Fill common AliVParticle interface information FillVarVParticle(particle, values); // Fill AliAODMCParticle interface specific information values[AliDielectronVarManager::kPdgCode] = particle->GetPdgCode(); } inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values) { // // Fill pair information available for histogramming into an array // // Fill common AliVParticle interface information FillVarVParticle(pair, values); // Fill AliDielectronPair specific information const AliKFParticle &kfPair = pair->GetKFParticle(); values[AliDielectronVarManager::kChi2NDF] = kfPair.GetChi2()/kfPair.GetNDF(); values[AliDielectronVarManager::kDecayLength] = kfPair.GetDecayLength(); values[AliDielectronVarManager::kR] = kfPair.GetR(); values[AliDielectronVarManager::kOpeningAngle] = pair->OpeningAngle(); values[AliDielectronVarManager::kMerr] = kfPair.GetErrMass()>0?kfPair.GetErrMass()/kfPair.GetMass():1000000; values[AliDielectronVarManager::kPairType] = pair->GetType(); } inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Double_t * const values) { // // Fill event information available for histogramming into an array // const AliVVertex *primVtx = event->GetPrimaryVertex(); values[AliDielectronVarManager::kXvPrim] = primVtx->GetX(); values[AliDielectronVarManager::kYvPrim] = primVtx->GetY(); values[AliDielectronVarManager::kZvPrim] = primVtx->GetZ(); values[AliDielectronVarManager::kChi2NDF] = primVtx->GetChi2perNDF(); values[AliDielectronVarManager::kNTrk] = event->GetNumberOfTracks(); values[AliDielectronVarManager::kNevents] = 0; //always fill bin 0; } inline void AliDielectronVarManager::FillVarESDEvent(const AliESDEvent *event, Double_t * const values) { // // Fill event information available for histogramming into an array // // Fill common AliVEvent interface information FillVarVEvent(event, values); // Fill AliESDEvent interface specific information const AliESDVertex *primVtx = event->GetPrimaryVertex(); values[AliDielectronVarManager::kXRes] = primVtx->GetXRes(); values[AliDielectronVarManager::kYRes] = primVtx->GetYRes(); values[AliDielectronVarManager::kZRes] = primVtx->GetZRes(); } inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values) { // // Fill event information available for histogramming into an array // // Fill common AliVEvent interface information FillVarVEvent(event, values); // Fill AliAODEvent interface specific information } inline void AliDielectronVarManager::FillVarMCEvent(const AliMCEvent *event, Double_t * const values) { // // Fill event information available for histogramming into an array // // Fill common AliVEvent interface information FillVarVEvent(event, values); // Fill AliMCEvent interface specific information } inline void AliDielectronVarManager::InitESDpid(Int_t type) { // // initialize PID parameters // type=0 is simulation // type=1 is data Double_t alephParameters[5]; // simulation alephParameters[0] = 2.15898e+00/50.; alephParameters[1] = 1.75295e+01; alephParameters[2] = 3.40030e-09; alephParameters[3] = 1.96178e+00; alephParameters[4] = 3.91720e+00; // data if (type==1){ alephParameters[0] = 0.0283086; alephParameters[1] = 2.63394e+01; alephParameters[2] = 5.04114e-11; alephParameters[3] = 2.12543e+00; alephParameters[4] = 4.88663e+00; } fgESDpid->GetTPCResponse().SetBetheBlochParameters( alephParameters[0],alephParameters[1],alephParameters[2], alephParameters[3],alephParameters[4]); } /* inline void AliDielectronVarManager::FillValues(const TParticle *particle, Double_t *values) { // // Fill track information available for histogramming into an array // // Fill TParticle interface information values[AliDielectronVarManager::kPx] = particle->Px(); values[AliDielectronVarManager::kPy] = particle->Py(); values[AliDielectronVarManager::kPz] = particle->Pz(); values[AliDielectronVarManager::kPt] = particle->Pt(); values[AliDielectronVarManager::kP] = particle->P(); values[AliDielectronVarManager::kXv] = particle->Vx(); values[AliDielectronVarManager::kYv] = particle->Vy(); values[AliDielectronVarManager::kZv] = particle->Vz(); values[AliDielectronVarManager::kOneOverPt] = 1./particle->Pt(); values[AliDielectronVarManager::kPhi] = particle->Phi(); values[AliDielectronVarManager::kTheta] = values[AliDielectronVarManager::kEta] = particle->Eta(); values[AliDielectronVarManager::kY] = values[AliDielectronVarManager::kE] = particle->Energy(); values[AliDielectronVarManager::kM] = particle->GetMass(); values[AliDielectronVarManager::kCharge] = particle->GetPDG()->Charge()/3; // uggly }*/ #endif