1 /* $Id: AliPhysicsSelection.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */
3 /**************************************************************************
4 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
6 * Author: The ALICE Off-line Project. *
7 * Contributors are mentioned in the code where appropriate. *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
18 //-------------------------------------------------------------------------
19 // Implementation of Class AliPhysicsSelection
20 // This class selects collision candidates from data runs, applying selection cuts on triggers
21 // and background rejection based on the content of the ESD
25 // Create the object and initialize it with the correct run number:
26 // fPhysicsSelection = new AliPhysicsSelection;
27 // fPhysicsSelection->Initialize(104160);
29 // To check if an event is a collision candidate, use:
30 // fPhysicsSelection->IsCollisionCandidate(fESD)
32 // After processing save the resulting histograms to a file with (a folder physics_selection
33 // will be created that contains the histograms):
34 // fPhysicsSelection->SaveHistograms("physics_selection")
36 // To print statistics after processing use:
37 // fPhysicsSelection->Print();
39 // Origin: Jan Fiete Grosse-Oetringhaus, CERN
40 //-------------------------------------------------------------------------
42 #include <Riostream.h>
46 #include <TIterator.h>
47 #include <TDirectory.h>
48 #include <TObjArray.h>
50 #include <AliPhysicsSelection.h>
52 #include <AliTriggerAnalysis.h>
55 #include <AliESDEvent.h>
57 ClassImp(AliPhysicsSelection)
59 AliPhysicsSelection::AliPhysicsSelection() :
60 AliAnalysisCuts("AliPhysicsSelection", "AliPhysicsSelection"),
65 fBackgroundIdentification(0),
71 fCollTrigClasses.SetOwner(1);
72 fBGTrigClasses.SetOwner(1);
73 fTriggerAnalysis.SetOwner(1);
75 AliLog::SetClassDebugLevel("AliPhysicsSelection", AliLog::kWarning);
78 AliPhysicsSelection::~AliPhysicsSelection()
82 fCollTrigClasses.Delete();
83 fBGTrigClasses.Delete();
84 fTriggerAnalysis.Delete();
88 delete fHistStatistics;
92 if (fHistBunchCrossing)
94 delete fHistBunchCrossing;
95 fHistBunchCrossing = 0;
99 Bool_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const char* trigger) const
101 // checks if the given trigger class(es) are found for the current event
102 // format of trigger: +TRIGGER1 -TRIGGER2
103 // requires TRIGGER1 and rejects TRIGGER2
105 TString str(trigger);
106 TObjArray* tokens = str.Tokenize(" ");
108 for (Int_t i=0; i < tokens->GetEntries(); i++)
110 TString str2(((TObjString*) tokens->At(i))->String());
112 if (str2[0] != '+' && str2[0] != '-')
113 AliFatal(Form("Invalid trigger syntax: %s", trigger));
115 Bool_t flag = (str2[0] == '+');
119 if (flag && !aEsd->IsTriggerClassFired(str2))
121 AliDebug(AliLog::kDebug, Form("Rejecting event because trigger class %s is not present", str2.Data()));
125 if (!flag && aEsd->IsTriggerClassFired(str2))
127 AliDebug(AliLog::kDebug, Form("Rejecting event because trigger class %s is present", str2.Data()));
137 Bool_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
139 // checks if the given event is a collision candidate
141 const AliESDHeader* esdHeader = aEsd->GetHeader();
144 AliError("ESD Header could not be retrieved");
148 // check event type (should be PHYSICS = 7)
149 if (esdHeader->GetEventType() != 7)
152 if (fCurrentRun != aEsd->GetRunNumber())
153 if (!Initialize(aEsd->GetRunNumber()))
154 AliFatal(Form("Could not initialize for run %d", aEsd->GetRunNumber()));
156 Bool_t accept = kFALSE;
158 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
159 for (Int_t i=0; i < count; i++)
161 const char* triggerClass = 0;
162 if (i < fCollTrigClasses.GetEntries())
163 triggerClass = ((TObjString*) fCollTrigClasses.At(i))->String();
165 triggerClass = ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
167 AliDebug(AliLog::kDebug, Form("Processing trigger class %s", triggerClass));
169 AliTriggerAnalysis* triggerAnalysis = static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i));
171 triggerAnalysis->FillTriggerClasses(aEsd);
173 if (CheckTriggerClass(aEsd, triggerClass))
175 triggerAnalysis->FillHistograms(aEsd);
177 fHistStatistics->Fill(1, i);
179 Int_t fastOR = triggerAnalysis->SPDFiredChips(aEsd, 0);
180 Bool_t v0A = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0A);
181 Bool_t v0C = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0C);
182 Bool_t v0ABG = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0ABG);
183 Bool_t v0CBG = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0CBG);
184 Bool_t v0BG = v0ABG || v0CBG;
187 fHistStatistics->Fill(2, i);
189 fHistStatistics->Fill(3, i);
192 fHistStatistics->Fill(4, i);
194 fHistStatistics->Fill(5, i);
196 fHistStatistics->Fill(6, i);
198 fHistStatistics->Fill(7, i);
200 if ((fastOR > 0 || v0A || v0C) && !v0BG)
201 fHistStatistics->Fill(8, i);
203 if (fastOR > 0 && (v0A || v0C) && !v0BG)
204 fHistStatistics->Fill(9, i);
206 if (v0A && v0C && !v0BG)
207 fHistStatistics->Fill(10, i);
209 if (fastOR > 1 || (fastOR > 0 && (v0A || v0C)) || (v0A && v0C))
213 fHistStatistics->Fill(11, i);
215 if (fBackgroundIdentification && !fBackgroundIdentification->IsSelected(const_cast<AliESDEvent*> (aEsd)))
217 AliDebug(AliLog::kDebug, "Rejecting event because of background identification");
218 fHistStatistics->Fill(12, i);
222 AliDebug(AliLog::kDebug, "Accepted event for histograms");
224 fHistStatistics->Fill(13, i);
225 fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i);
226 if (i < fCollTrigClasses.GetEntries())
231 AliDebug(AliLog::kDebug, "Rejecting event because of V0 BG flag");
234 AliDebug(AliLog::kDebug, "Rejecting event because trigger condition is not fulfilled");
239 AliDebug(AliLog::kDebug, "Accepted event as collision candidate");
244 Bool_t AliPhysicsSelection::Initialize(UInt_t runNumber)
246 // initializes the object for the given run
247 // TODO having the run number here and parameters hardcoded is clearly temporary, a way needs to be found to have a CDB-like configuration also for analysis
249 if (fCurrentRun != -1)
250 AliFatal("Processing several runs is not supported, yet");
252 AliInfo(Form("Initializing for run %d", runNumber));
253 fCurrentRun = runNumber;
255 fTriggerAnalysis.Delete();
256 fCollTrigClasses.Delete();
257 fBGTrigClasses.Delete();
259 fCollTrigClasses.Add(new TObjString("+CINT1B-ABCE-NOPF-ALL"));
260 fBGTrigClasses.Add(new TObjString("+CINT1A-ABCE-NOPF-ALL"));
261 fBGTrigClasses.Add(new TObjString("+CINT1C-ABCE-NOPF-ALL"));
262 fBGTrigClasses.Add(new TObjString("+CINT1-E-NOPF-ALL"));
264 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
266 for (Int_t i=0; i<count; i++)
268 AliTriggerAnalysis* triggerAnalysis = new AliTriggerAnalysis;
269 triggerAnalysis->EnableHistograms();
270 triggerAnalysis->SetSPDGFOThreshhold(1);
271 triggerAnalysis->SetV0TimeOffset(0);
279 triggerAnalysis->SetV0TimeOffset(7.5);
283 fTriggerAnalysis.Add(triggerAnalysis);
287 delete fHistStatistics;
289 fHistStatistics = new TH2F("fHistStatistics", "fHistStatistics;;", 13, 0.5, 13.5, count, -0.5, -0.5 + count);
292 fHistStatistics->GetXaxis()->SetBinLabel(n++, "Correct trigger class(es)");
293 fHistStatistics->GetXaxis()->SetBinLabel(n++, "FO >= 1");
294 fHistStatistics->GetXaxis()->SetBinLabel(n++, "FO >= 2");
295 fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0A");
296 fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0C");
297 fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0A BG");
298 fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0C BG");
299 fHistStatistics->GetXaxis()->SetBinLabel(n++, "(FO >= 1 | V0A | VOC) & !V0 BG");
300 fHistStatistics->GetXaxis()->SetBinLabel(n++, "FO >= 1 & (V0A | VOC) & !V0 BG");
301 fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0A & VOC & !V0 BG");
302 fHistStatistics->GetXaxis()->SetBinLabel(n++, "(FO >= 2 | (FO >= 1 & (V0A | VOC)) | (V0A & VOC)) & !V0 BG");
303 fHistStatistics->GetXaxis()->SetBinLabel(n++, "Background identification");
304 fHistStatistics->GetXaxis()->SetBinLabel(n++, "Accepted");
306 if (fHistBunchCrossing)
307 delete fHistBunchCrossing;
309 fHistBunchCrossing = new TH2F("fHistBunchCrossing", "fHistBunchCrossing;bunch crossing number;", 4000, -0.5, 3999.5, count, -0.5, -0.5 + count);
312 for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
314 fHistStatistics->GetYaxis()->SetBinLabel(n, ((TObjString*) fCollTrigClasses.At(i))->String());
315 fHistBunchCrossing->GetYaxis()->SetBinLabel(n, ((TObjString*) fCollTrigClasses.At(i))->String());
318 for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
320 fHistStatistics->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
321 fHistBunchCrossing->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
328 void AliPhysicsSelection::Print(Option_t* /* option */) const
330 // print the configuration
332 Printf("Configuration initialized for run %d:", fCurrentRun);
334 Printf("Collision trigger classes:");
335 for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
336 Printf("%s", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
338 Printf("Background trigger classes:");
339 for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
340 Printf("%s", ((TObjString*) fBGTrigClasses.At(i))->String().Data());
342 AliTriggerAnalysis* triggerAnalysis = dynamic_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(0));
346 if (triggerAnalysis->GetV0TimeOffset() > 0)
347 Printf("V0 time offset active: %.2f ns", triggerAnalysis->GetV0TimeOffset());
349 Printf("\nTotal available events:");
351 triggerAnalysis->PrintTriggerClasses();
356 Printf("\nSelection statistics for first collision trigger:");
358 Printf("Total events with correct trigger class: %d", (Int_t) fHistStatistics->GetBinContent(1, 1));
359 Printf("Selected collision candidates: %d", (Int_t) fHistStatistics->GetBinContent(13, 1));
363 Long64_t AliPhysicsSelection::Merge(TCollection* list)
365 // Merge a list of AliMultiplicityCorrection objects with this (needed for
367 // Returns the number of merged objects (including this).
375 TIterator* iter = list->MakeIterator();
378 // collections of all histograms
379 const Int_t nHists = 9;
380 TList collections[nHists];
383 while ((obj = iter->Next())) {
385 AliPhysicsSelection* entry = dynamic_cast<AliPhysicsSelection*> (obj);
390 collections[n++].Add(&(entry->fTriggerAnalysis));
391 collections[n++].Add(entry->fHistStatistics);
392 collections[n++].Add(entry->fHistBunchCrossing);
393 if (entry->fBackgroundIdentification)
394 collections[n++].Add(entry->fBackgroundIdentification);
400 fTriggerAnalysis.Merge(&collections[n++]);
401 fHistStatistics->Merge(&collections[n++]);
402 fHistBunchCrossing->Merge(&collections[n++]);
403 if (fBackgroundIdentification)
404 fBackgroundIdentification->Merge(&collections[n++]);
411 void AliPhysicsSelection::SaveHistograms(const char* folder) const
413 // write histograms to current directory
415 if (!fHistStatistics)
420 gDirectory->mkdir(folder);
421 gDirectory->cd(folder);
424 fHistStatistics->Write();
425 fHistBunchCrossing->Write();
427 Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
428 for (Int_t i=0; i < count; i++)
430 TString triggerClass = "trigger_histograms_";
431 if (i < fCollTrigClasses.GetEntries())
432 triggerClass += ((TObjString*) fCollTrigClasses.At(i))->String();
434 triggerClass += ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
436 gDirectory->mkdir(triggerClass);
437 gDirectory->cd(triggerClass);
439 static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i))->SaveHistograms();
441 gDirectory->cd("..");
444 if (fBackgroundIdentification)
446 gDirectory->mkdir("background_identification");
447 gDirectory->cd("background_identification");
449 fBackgroundIdentification->GetOutput()->Write();
451 gDirectory->cd("..");
455 gDirectory->cd("..");