3 #include "AliTestESDtrackCutsSelector.h"
9 #include <TParticlePDG.h>
15 #include <TSelector.h>
20 #include <AliRunLoader.h>
23 #include "esdTrackCuts/AliESDtrackCuts.h"
24 #include "AliPWG0Helper.h"
27 ClassImp(AliTestESDtrackCutsSelector)
29 AliTestESDtrackCutsSelector::AliTestESDtrackCutsSelector() :
34 fEsdTrackCutsPlusZ(0),
35 fEsdTrackCutsMinusZ(0),
40 // Constructor. Initialization of pointers
44 AliTestESDtrackCutsSelector::~AliTestESDtrackCutsSelector()
50 // histograms are in the output list and deleted when the output
51 // list is deleted by the TSelector dtor
54 void AliTestESDtrackCutsSelector::Begin(TTree* tree)
58 AliSelectorRL::Begin(tree);
60 ReadUserObjects(tree);
63 void AliTestESDtrackCutsSelector::ReadUserObjects(TTree* tree)
65 // read the user objects, called from slavebegin and begin
71 if (!fEsdTrackCutsAll && fInput)
72 fEsdTrackCutsAll = dynamic_cast<AliESDtrackCuts*> (fInput->FindObject("esdTrackCutsAll")->Clone());
74 if (!fEsdTrackCutsAll && tree)
75 fEsdTrackCutsAll = dynamic_cast<AliESDtrackCuts*> (tree->GetUserInfo()->FindObject("esdTrackCutsAll"));
77 if (!fEsdTrackCutsAll)
78 AliDebug(AliLog::kError, "ERROR: Could not read fEsdTrackCutsAll from input list.");
80 fEsdTrackCutsPri = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsPri"));
81 fEsdTrackCutsSec = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsSec"));
82 fEsdTrackCutsPlusZ = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsPlusZ"));
83 fEsdTrackCutsMinusZ = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsMinusZ"));
84 fEsdTrackCutsPos = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsPos"));
85 fEsdTrackCutsNeg = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsNeg"));
88 void AliTestESDtrackCutsSelector::SlaveBegin(TTree* tree)
90 // The SlaveBegin() function is called after the Begin() function.
91 // When running with PROOF SlaveBegin() is called on each slave server.
92 // The tree argument is deprecated (on PROOF 0 is passed).
94 AliSelectorRL::SlaveBegin(tree);
96 ReadUserObjects(tree);
99 void AliTestESDtrackCutsSelector::Init(TTree* tree)
101 // read the user objects
103 AliSelectorRL::Init(tree);
105 // Enable only the needed branches
108 tree->SetBranchStatus("*", 0);
109 tree->SetBranchStatus("fTriggerMask", 1);
110 tree->SetBranchStatus("fSPDVertex*", 1);
111 tree->SetBranchStatus("fTracks.fLabel", 1);
113 AliESDtrackCuts::EnableNeededBranches(tree);
117 Bool_t AliTestESDtrackCutsSelector::Process(Long64_t entry)
119 // The Process() function is called for each entry in the tree (or possibly
120 // keyed object in the case of PROOF) to be processed. The entry argument
121 // specifies which entry in the currently loaded tree is to be processed.
122 // It can be passed to either TTree::GetEntry() or TBranch::GetEntry()
123 // to read either all or the required parts of the data. When processing
124 // keyed objects with PROOF, the object is already loaded and is available
125 // via the fObject pointer.
127 // This function should contain the "body" of the analysis. It can contain
128 // simple or elaborate selection criteria, run algorithms on the data
129 // of the event and typically fill histograms.
131 // WARNING when a selector is used with a TChain, you must use
132 // the pointer to the current TTree to call GetEntry(entry).
133 // The entry is always the local entry number in the current tree.
134 // Assuming that fTree is the pointer to the TChain being processed,
135 // use fTree->GetTree()->GetEntry(entry).
137 if (AliSelectorRL::Process(entry) == kFALSE)
140 // Check prerequisites
142 AliDebug(AliLog::kError, "ESD branch not available");
146 if (!AliPWG0Helper::IsVertexReconstructed(fESD)) {
147 AliDebug(AliLog::kDebug+5, "Vertex is not reconstructed");
151 // check if the esd track cut objects are there
152 if (!fEsdTrackCutsAll || !fEsdTrackCutsPri || !fEsdTrackCutsSec || !fEsdTrackCutsPlusZ || !fEsdTrackCutsMinusZ || !fEsdTrackCutsPos || !fEsdTrackCutsNeg) {
153 AliDebug(AliLog::kError, "fEsdTrackCutsXXX not available");
157 // get particle stack
158 AliStack* stack = GetStack();
160 AliDebug(AliLog::kError, "Stack not available");
163 Int_t nPrim = stack->GetNprimary();
165 // ########################################################
166 // loop over esd tracks
167 Int_t nTracks = fESD->GetNumberOfTracks();
169 // count the number of "good" tracks as parameter for vertex reconstruction efficiency
170 for (Int_t t=0; t<nTracks; t++) {
171 AliDebug(AliLog::kDebug+1, Form("ESD Loop: Processing track %d.", t));
173 AliESDtrack* esdTrack = fESD->GetTrack(t);
175 fEsdTrackCutsAll->AcceptTrack(esdTrack);
177 // using the properties of the mc particle
178 Int_t label = TMath::Abs(esdTrack->GetLabel());
180 AliDebug(AliLog::kWarning, Form("WARNING: cannot find corresponding mc part for track %d.", t));
183 TParticle* particle = stack->Particle(label);
185 AliDebug(AliLog::kError, Form("UNEXPECTED: part with label %d not found in stack (track loop).", label));
190 fEsdTrackCutsPri->AcceptTrack(esdTrack);
192 fEsdTrackCutsSec->AcceptTrack(esdTrack);
194 TParticlePDG* pdgPart = particle->GetPDG();
197 if (pdgPart->Charge() > 0)
198 fEsdTrackCutsPos->AcceptTrack(esdTrack);
199 else if (pdgPart->Charge() < 0)
200 fEsdTrackCutsNeg->AcceptTrack(esdTrack);
203 if (particle->Eta() < 0)
204 fEsdTrackCutsPlusZ->AcceptTrack(esdTrack);
206 fEsdTrackCutsMinusZ->AcceptTrack(esdTrack);
212 void AliTestESDtrackCutsSelector::SlaveTerminate()
214 // The SlaveTerminate() function is called after all entries or objects
215 // have been processed. When running with PROOF SlaveTerminate() is called
216 // on each slave server.
218 AliSelectorRL::SlaveTerminate();
220 // Add the histograms to the output on each slave server
223 AliDebug(AliLog::kError, Form("ERROR: Output list not initialized."));
227 fOutput->Add(fEsdTrackCutsAll);
228 fOutput->Add(fEsdTrackCutsPri);
229 fOutput->Add(fEsdTrackCutsSec);
230 fOutput->Add(fEsdTrackCutsPlusZ);
231 fOutput->Add(fEsdTrackCutsMinusZ);
232 fOutput->Add(fEsdTrackCutsPos);
233 fOutput->Add(fEsdTrackCutsNeg);
236 void AliTestESDtrackCutsSelector::Terminate()
238 // The Terminate() function is the last function to be called during
239 // a query. It always runs on the client, it can be used to present
240 // the results graphically or save the results to file.
242 AliSelectorRL::Terminate();
244 fEsdTrackCutsAll = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("esdTrackCutsAll"));
245 fEsdTrackCutsPri = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsPri"));
246 fEsdTrackCutsSec = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsSec"));
247 fEsdTrackCutsPlusZ = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsPlusZ"));
248 fEsdTrackCutsMinusZ = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsMinusZ"));
249 fEsdTrackCutsPos = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsPos"));
250 fEsdTrackCutsNeg = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsNeg"));
252 // check if the esd track cut objects are there
253 if (!fEsdTrackCutsAll || !fEsdTrackCutsPri || !fEsdTrackCutsSec || !fEsdTrackCutsPlusZ || !fEsdTrackCutsMinusZ || !fEsdTrackCutsPos || !fEsdTrackCutsNeg) {
254 AliDebug(AliLog::kError, Form("fEsdTrackCutsXXX not available %p %p %p %p %p %p %p", fEsdTrackCutsAll, fEsdTrackCutsPri, fEsdTrackCutsSec, fEsdTrackCutsPlusZ, fEsdTrackCutsMinusZ, fEsdTrackCutsPos, fEsdTrackCutsNeg));
258 TFile* file = TFile::Open("trackCuts.root", "RECREATE");
260 fEsdTrackCutsAll->SaveHistograms();
261 fEsdTrackCutsPri->SaveHistograms();
262 fEsdTrackCutsSec->SaveHistograms();
263 fEsdTrackCutsPlusZ->SaveHistograms();
264 fEsdTrackCutsMinusZ->SaveHistograms();
265 fEsdTrackCutsPos->SaveHistograms();
266 fEsdTrackCutsNeg->SaveHistograms();
270 fEsdTrackCutsAll->DrawHistograms();