X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FMUONefficiency.C;h=e799880cd7cb14e8a88d603ecf95f856085d69fa;hb=745851289deea658a72e1aba6bf96eb184c4d9a4;hp=c6b84fcfd035108bd823f02fc63919488ac665f3;hpb=690d2205d260c6401c46797c529839b4304c506b;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/MUONefficiency.C b/MUON/MUONefficiency.C index c6b84fcfd03..e799880cd7c 100644 --- a/MUON/MUONefficiency.C +++ b/MUON/MUONefficiency.C @@ -15,72 +15,72 @@ /* $Id$ */ -// Macro (upgraded version of MUONmassPlot_ESD.C, better handling of Jpsi) to make : -// 1) Ntuple (Ktuple) containing Upsilon kinematics variables (from kinematics.root files) -// 2) Ntuple (ESDtuple) containing Upsilon kinematics variables from reconstruction and -// combinations of 2 muons with opposite charges (ESDtupleBck will be used later) -// 3) Some QA histograms -// Ntuple are stored in the file MUONefficiency.root and ESD tree and QA histograms in AliESDs.root +/// \ingroup macros +/// \file MUONefficiency.C +/// \brief add brief description +/// +/// Macro (upgraded version of MUONmassPlot_ESD.C, better handling of Jpsi) to make : +/// - Ntuple (Ktuple) containing Upsilon kinematics variables (from kinematics.root files) +/// - Ntuple (ESDtuple) containing Upsilon kinematics variables from reconstruction and +/// combinations of 2 muons with opposite charges (ESDtupleBck will be used later) +/// - Some QA histograms +/// Ntuple are stored in the file MUONefficiency.root and ESD tree and QA histograms in AliESDs.root +/// +/// \author Christophe Suire, IPN Orsay -// Christophe Suire, IPN Orsay +#if !defined(__CINT__) || defined(__MAKECINT__) -// Arguments: -// FirstEvent (default 0) -// LastEvent (default 1.e6) -// ResType (default 553) -// 553 for Upsilon, 443 for J/Psi -// Chi2Cut (default 100) -// to keep only tracks with chi2 per d.o.f. < Chi2Cut - +// MUON includes +#include "AliMUONCDB.h" +#include "AliMUONTrackParam.h" +#include "AliMUONTrackExtrap.h" +#include "AliMUONESDInterface.h" +// STEER includes +#include "AliRun.h" +#include "AliRunLoader.h" +#include "AliHeader.h" +#include "AliLoader.h" +#include "AliStack.h" +#include "AliESDEvent.h" +#include "AliESDVertex.h" +#include "AliCDBManager.h" +#include "AliESDMuonTrack.h" -#if !defined(__CINT__) || defined(__MAKECINT__) // ROOT includes #include "TTree.h" #include "TNtuple.h" -#include "TBranch.h" -#include "TClonesArray.h" #include "TLorentzVector.h" #include "TFile.h" #include "TH1.h" #include "TH2.h" #include "TParticle.h" -#include "TTree.h" #include "TString.h" #include #include #include +#include +#include -// STEER includes -#include "AliRun.h" -#include "AliRunLoader.h" -#include "AliHeader.h" -#include "AliLoader.h" -#include "AliStack.h" -#include "AliMagFMaps.h" -#include "AliESDEvent.h" -#include "AliESDVertex.h" -#include "AliTracker.h" - -// MUON includes -#include "AliMUONTrackParam.h" -#include "AliMUONTrackExtrap.h" -#include "AliESDMuonTrack.h" #endif -// Arguments: -// ExtrapToVertex (default -1) -// <0: no extrapolation; -// =0: extrapolation to (0,0,0); -// >0: extrapolation to ESDVertex if available, else to (0,0,0) -// ResType (default 553) -// 553 for Upsilon, anything else for J/Psi +Bool_t MUONefficiency(char* filename = "generated/galice.root", char* esdFileName = "AliESDs.root", + char* geoFilename = "geometry.root", char* ocdbPath = "local://$ALICE_ROOT/OCDB", + Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t FirstEvent = 0, Int_t LastEvent = 1000000 ) +{ +/// \param ExtrapToVertex (default -1) +/// - <0: no extrapolation; +/// - =0: extrapolation to (0,0,0); +/// - >0: extrapolation to ESDVertex if available, else to (0,0,0) +/// \param ResType 553 for Upsilon, 443 for J/Psi (default 553) +/// \param FirstEvent (default 0) +/// \param LastEvent (default 1.e6) +/// \param Chi2Cut to keep only tracks with chi2 per d.o.f. < Chi2Cut (default 100) -Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geometry.root", char* esdFileName = "AliESDs.root", - Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t FirstEvent = 0, Int_t LastEvent = 1000000 ) -{ // MUONefficiency starts + + // MUONefficiency starts Double_t MUON_MASS = 0.105658369; Double_t UPSILON_MASS = 9.4603 ; @@ -192,16 +192,40 @@ Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geom if (!gGeoManager) { TGeoManager::Import(geoFilename); if (!gGeoManager) { - Error("MUONmass_ESD", "getting geometry from file %s failed", filename); + Error("MUONefficiency", "getting geometry from file %s failed", geoFilename); return kFALSE; } } - // set mag field - // waiting for mag field in CDB - printf("Loading field map...\n"); - AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG); - AliTracker::SetFieldMap(field, kFALSE); + // open the ESD file + TFile* esdFile = TFile::Open(esdFileName); + if (!esdFile || !esdFile->IsOpen()) { + Error("MUONefficiency", "opening ESD file %s failed", esdFileName); + return kFALSE; + } + + AliESDEvent* esd = new AliESDEvent(); + TTree* tree = (TTree*) esdFile->Get("esdTree"); + if (!tree) { + Error("MUONefficiency", "no ESD tree found"); + return kFALSE; + } + esd->ReadFromTree(tree); + + // get run number + if (tree->GetEvent(0) <= 0) { + Error("MUONefficiency", "no ESD object found for event 0"); + return kFALSE; + } + Int_t runNumber = esd->GetRunNumber(); + + // load necessary data from OCDB + AliCDBManager::Instance()->SetDefaultStorage(ocdbPath); + AliCDBManager::Instance()->SetRun(runNumber); + if (!AliMUONCDB::LoadField()) return kFALSE; + + // set the magnetic field for track extrapolations + AliMUONTrackExtrap::SetField(); // open run loader and load gAlice, kinematics and header AliRunLoader* runLoader = AliRunLoader::Open(filename); @@ -216,23 +240,13 @@ Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geom Error("MUONefficiency", "no galice object found"); return kFALSE; } - - // open the ESD file - TFile* esdFile = TFile::Open(esdFileName); - if (!esdFile || !esdFile->IsOpen()) { - Error("MUONefficiency", "opening ESD file %s failed", esdFileName); + + runLoader->LoadHeader(); + if (runNumber != runLoader->GetHeader()->GetRun()) { + Error("MUONefficiency", "mismatch between run number from ESD and from runLoader"); return kFALSE; } - - AliESDEvent* esd = new AliESDEvent(); - TTree* tree = (TTree*) esdFile->Get("esdTree"); - if (!tree) { - Error("CheckESD", "no ESD tree found"); - return kFALSE; - } - esd->ReadFromTree(tree); - runLoader->LoadHeader(); nevents = runLoader->GetNumberOfEvents(); AliMUONTrackParam trackParam; @@ -312,8 +326,7 @@ Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geom // get the event summary data - tree->GetEvent(iEvent); - if (!esd) { + if (tree->GetEvent(iEvent) <= 0) { Error("CheckESD", "no ESD object found for event %d", iEvent); return kFALSE; } @@ -337,22 +350,23 @@ Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geom cout << " number of tracks: " << nTracks <GetMuonTrack(iTrack)->ContainTrackerData()) continue; + AliESDMuonTrack* muonTrack = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack))); // extrapolate to vertex if required and available if (ExtrapToVertex > 0 && Vertex->GetNContributors()) { - trackParam.GetParamFromUncorrected(*muonTrack); + AliMUONESDInterface::GetParamAtFirstCluster(*muonTrack, trackParam); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, fXVertex, fYVertex, fZVertex, errXVtx, errYVtx); - trackParam.SetParamFor(*muonTrack); // put the new parameters in this copy of AliESDMuonTrack + AliMUONESDInterface::SetParamAtVertex(trackParam, *muonTrack); // put the new parameters in this copy of AliESDMuonTrack } else if ((ExtrapToVertex > 0 && !Vertex->GetNContributors()) || ExtrapToVertex == 0){ - trackParam.GetParamFromUncorrected(*muonTrack); + AliMUONESDInterface::GetParamAtFirstCluster(*muonTrack, trackParam); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, 0., 0., 0., 0., 0.); - trackParam.SetParamFor(*muonTrack); // put the new parameters in this copy of AliESDMuonTrack + AliMUONESDInterface::SetParamAtVertex(trackParam, *muonTrack); // put the new parameters in this copy of AliESDMuonTrack } // Trigger @@ -405,17 +419,20 @@ Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geom // loop over second track of combination for (Int_t iTrack2 = iTrack + 1; iTrack2 < nTracks; iTrack2++) { + // skip ghosts + if (!esd->GetMuonTrack(iTrack2)->ContainTrackerData()) continue; + AliESDMuonTrack* muonTrack2 = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack2))); // extrapolate to vertex if required and available if (ExtrapToVertex > 0 && Vertex->GetNContributors()) { - trackParam.GetParamFromUncorrected(*muonTrack2); + AliMUONESDInterface::GetParamAtFirstCluster(*muonTrack2, trackParam); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, fXVertex, fYVertex, fZVertex, errXVtx, errYVtx); - trackParam.SetParamFor(*muonTrack2); // put the new parameters in this copy of AliESDMuonTrack + AliMUONESDInterface::SetParamAtVertex(trackParam, *muonTrack2); // put the new parameters in this copy of AliESDMuonTrack } else if ((ExtrapToVertex > 0 && !Vertex->GetNContributors()) || ExtrapToVertex == 0){ - trackParam.GetParamFromUncorrected(*muonTrack2); + AliMUONESDInterface::GetParamAtFirstCluster(*muonTrack2, trackParam); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, 0., 0., 0., 0., 0.); - trackParam.SetParamFor(*muonTrack2); // put the new parameters in this copy of AliESDMuonTrack + AliMUONESDInterface::SetParamAtVertex(trackParam, *muonTrack2); // put the new parameters in this copy of AliESDMuonTrack } track2Trigger = muonTrack2->GetMatchTrigger(); @@ -580,7 +597,17 @@ Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geom cout << "Chi2Cut for muon tracks = " << Chi2Cut << endl; cout << "PtCutMin for muon tracks = " << PtCutMin << endl; cout << "PtCutMax for muon tracks = " << PtCutMax << endl; - cout << "Entries (unlike sign dimuons) in the mass range ["<GetEntries(); + + if (hInvMassAll->GetEntries() > 0) { + hInvMassAll->Fit("gaus","q0"); + TF1* f1 = hInvMassAll->GetFunction("gaus"); + cout << Form(". Rough sigma = %7.2f MeV/c2",f1->GetParameter(2)*1000.0); + } + + cout << endl << "Entries (unlike sign dimuons) in the mass range ["<