1 #include "AliAnalysisTaskMuMu.h"
3 #include "AliAnalysisManager.h"
4 #include "AliAnalysisMuMuBinning.h"
5 #include "AliAnalysisMuonUtility.h"
6 #include "AliAnalysisUtils.h"
7 #include "AliAODEvent.h"
8 #include "AliAODMCParticle.h"
9 #include "AliAODTrack.h"
10 #include "AliAODTZERO.h"
11 #include "AliCentrality.h"
12 #include "AliCodeTimer.h"
13 #include "AliCounterCollection.h"
14 #include "AliESDEvent.h"
15 #include "AliESDTZERO.h"
16 #include "AliInputEventHandler.h"
18 #include "AliMCEvent.h"
19 #include "AliMCEventHandler.h"
20 #include "AliMergeableCollection.h"
21 #include "AliMuonEventCuts.h"
22 #include "AliMuonTrackCuts.h"
23 #include "Riostream.h"
25 #include "TDatabasePDG.h"
29 #include "THashList.h"
32 #include "TObjString.h"
33 #include "TPaveText.h"
39 #include "AliAnalysisMuMuBase.h"
40 #include "AliInputEventHandler.h"
41 #include "AliAnalysisMuMuCutRegistry.h"
42 #include "AliAnalysisMuMuCutElement.h"
43 #include "AliAnalysisMuMuCutCombination.h"
47 * \class AliAnalysisTaskMuMu
49 * This class steers the work of one or more sub-analysis deriving from AliAnalysisMuMuBase
50 * The output contains an AliHistogramCollection, an AliCounterCollection
51 * and an AliAnalysisMuMuBinning
52 * This task must be configured a bit before being used. For instance
53 * you can select various event cuts, single muon track cuts and
54 * muon pairs cut, as well as defining various bins (for minv and mean pt
55 * histograms) in pt,y,phi etc...
57 * Note that it's also possible to disable some (or all) histograms
58 * (to save speed/memory), using DisableHistograms() method.
60 * For an example of such configuration, \see AddTaskMuMu.C
66 ClassImp(AliAnalysisTaskMuMu)
68 //_____________________________________________________________________________
69 AliAnalysisTaskMuMu::AliAnalysisTaskMuMu()
70 : AliAnalysisTaskSE("AliAnalysisTaskMuMu"),
71 fHistogramCollection(0),
76 fHistogramToDisable(0x0),
77 fSubAnalysisVector(0x0)
79 /// Constructor with a predefined list of triggers to consider
80 /// Note that we take ownership of cutRegister
83 // fBranchNames = "AOD:header,tracks,vertices,tracklets,AliAODTZERO,AliAODVZERO";
85 DefineOutput(1,AliMergeableCollection::Class());
86 DefineOutput(2,AliCounterCollection::Class());
87 DefineOutput(3,AliAnalysisMuMuBinning::Class());
90 //_____________________________________________________________________________
91 AliAnalysisTaskMuMu::~AliAnalysisTaskMuMu()
95 if (fHistogramCollection && ! AliAnalysisManager::GetAnalysisManager()->IsProofMode())
97 delete fHistogramCollection;
100 if (fEventCounters && ! AliAnalysisManager::GetAnalysisManager()->IsProofMode())
102 delete fEventCounters;
105 if (fBinning && ! AliAnalysisManager::GetAnalysisManager()->IsProofMode())
110 delete fHistogramToDisable;
114 delete fSubAnalysisVector;
117 //_____________________________________________________________________________
118 void AliAnalysisTaskMuMu::AdoptSubAnalysis(AliAnalysisMuMuBase* analysis)
120 if (!fSubAnalysisVector)
122 fSubAnalysisVector = new TObjArray;
123 fSubAnalysisVector->SetOwner(kTRUE);
125 if ( !fSubAnalysisVector->FindObject(analysis) )
127 fSubAnalysisVector->Add(analysis);
131 //_____________________________________________________________________________
132 AliAnalysisMuMuCutRegistry* AliAnalysisTaskMuMu::CutRegistry() const
134 /// Return (and create if not yet there) our cut registry
137 fCutRegistry = new AliAnalysisMuMuCutRegistry;
142 //_____________________________________________________________________________
144 AliAnalysisTaskMuMu::DefaultCentralityName() const
146 /// Get default centrality name
147 if ( !fBeamYear.Contains("pp") ) return "CENTX";
151 //_____________________________________________________________________________
152 void AliAnalysisTaskMuMu::DisableHistograms(const char* pattern)
154 /// Disable the histogramming of all the histograms matching the pattern
156 TIter next(fSubAnalysisVector);
157 AliAnalysisMuMuBase* a;
159 while ( ( a = static_cast<AliAnalysisMuMuBase*>(next()) ) )
161 a->DisableHistograms(pattern);
165 //_____________________________________________________________________________
167 AliAnalysisTaskMuMu::Event() const
169 // some const-dirty-dancing
170 return const_cast<AliAnalysisTaskMuMu*>(this)->InputEvent();
173 //_____________________________________________________________________________
174 void AliAnalysisTaskMuMu::Fill(const char* eventSelection, const char* triggerClassName)
176 // Fill one set of histograms (only called for events which pass the eventSelection cut)
178 TString seventSelection(eventSelection);
179 seventSelection.ToLower();
181 fEventCounters->Count(Form("event:%s/trigger:%s/centrality:%s/run:%d", seventSelection.Data(), triggerClassName, "ALL", fCurrentRunNumber));
183 if ( !IsHistogrammingDisabled() )
185 TObjArray* centralities = fBinning->CreateBinObjArray("centrality");
187 TIter next(centralities);
188 AliAnalysisMuMuBinning::Range* r;
190 while ( ( r = static_cast<AliAnalysisMuMuBinning::Range*>(next()) ) )
192 TString estimator = r->Quantity();
194 Float_t fcent = Event()->GetCentrality()->GetCentralityPercentile(estimator.Data());
195 if ( fcent < 0.) FillHistos(eventSelection,triggerClassName,"MV0");
196 if ( fcent == 0.) FillHistos(eventSelection,triggerClassName,"0V0");
197 if ( r->IsInRange(fcent) )
199 FillHistos(eventSelection,triggerClassName,r->AsString());
206 //_____________________________________________________________________________
207 void AliAnalysisTaskMuMu::FillHistos(const char* eventSelection,
208 const char* triggerClassName,
209 const char* centrality)
211 /// Fill histograms for /physics/triggerClassName/centrality
213 AliCodeTimerAuto("",0);
215 TIter nextAnalysis(fSubAnalysisVector);
216 AliAnalysisMuMuBase* analysis;
218 Int_t nTracks = AliAnalysisMuonUtility::GetNTracks(Event());
220 fEventCounters->Count(Form("event:%s/trigger:%s/centrality:%s/run:%d", eventSelection, triggerClassName, centrality, fCurrentRunNumber));
222 TIter nextTrackCut(fCutRegistry->GetCutCombinations(AliAnalysisMuMuCutElement::kTrack));
223 TIter nextPairCut(fCutRegistry->GetCutCombinations(AliAnalysisMuMuCutElement::kTrackPair));
225 // loop on single tracks (whatever the type of tracks
226 while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(nextAnalysis()) ) )
228 analysis->DefineHistogramCollection(eventSelection,triggerClassName,centrality);
230 AliCodeTimerAuto(Form("%s (FillHistosForEvent)",analysis->ClassName()),1);
232 if ( MCEvent() != 0x0 )
234 analysis->FillHistosForMCEvent(eventSelection,triggerClassName,centrality);
237 analysis->FillHistosForEvent(eventSelection,triggerClassName,centrality);
239 for (Int_t i = 0; i < nTracks; ++i)
241 AliVParticle* tracki = AliAnalysisMuonUtility::GetTrack(i,Event());
243 nextTrackCut.Reset();
244 AliAnalysisMuMuCutCombination* trackCut;
246 while ( ( trackCut = static_cast<AliAnalysisMuMuCutCombination*>(nextTrackCut()) ) )
248 if ( trackCut->Pass(*tracki) )
250 analysis->FillHistosForTrack(eventSelection,triggerClassName,centrality,trackCut->GetName(),*tracki);
254 if (!AliAnalysisMuonUtility::IsMuonTrack(tracki) ) continue;
256 // loop on track pairs (here we only consider muon pairs)
258 for (Int_t j = i+1; j < nTracks; ++j)
260 AliVParticle* trackj = AliAnalysisMuonUtility::GetTrack(j,Event());
262 if (!AliAnalysisMuonUtility::IsMuonTrack(trackj) ) continue;
265 AliAnalysisMuMuCutCombination* pairCut;
267 while ( ( pairCut = static_cast<AliAnalysisMuMuCutCombination*>(nextPairCut()) ) )
269 Bool_t testi = (pairCut->IsTrackCutter()) ? pairCut->Pass(*tracki) : kTRUE;
270 Bool_t testj = (pairCut->IsTrackCutter()) ? pairCut->Pass(*trackj) : kTRUE;
271 Bool_t testij = pairCut->Pass(*tracki,*trackj);
273 if ( ( testi || testj ) && testij )
275 analysis->FillHistosForPair(eventSelection,triggerClassName,centrality,pairCut->GetName(),*tracki,*trackj);
283 //_____________________________________________________________________________
284 void AliAnalysisTaskMuMu::FinishTaskOutput()
286 /// prune empty histograms BEFORE mergin, in order to save some bytes...
288 if ( fHistogramCollection )
290 fHistogramCollection->PruneEmptyObjects();
294 //_____________________________________________________________________________
295 void AliAnalysisTaskMuMu::GetSelectedTrigClassesInEvent(const AliVEvent* event, TObjArray& array)
297 /// Fills the array with a list of TObjString of the trigger classes that the various
298 /// cuts accept for this event
304 AliError("Will get a hard time selecting trigger classes with an empty event...");
308 TString firedTriggerClasses = event->GetFiredTriggerClasses();
309 UInt_t l0 = AliAnalysisMuonUtility::GetL0TriggerInputs(event);
310 UInt_t l1 = AliAnalysisMuonUtility::GetL1TriggerInputs(event);
311 UInt_t l2 = AliAnalysisMuonUtility::GetL2TriggerInputs(event);
313 std::set<std::string> tmpArray;
315 TIter nextCutCombination(CutRegistry()->GetCutCombinations(AliAnalysisMuMuCutElement::kTriggerClass));
316 AliAnalysisMuMuCutCombination* cutCombination;
318 while ( ( cutCombination = static_cast<AliAnalysisMuMuCutCombination*>(nextCutCombination()) ) )
320 TString acceptedTriggerClasses;
322 if ( cutCombination->Pass(firedTriggerClasses,acceptedTriggerClasses,l0,l1,l2) )
324 TObjArray* split = acceptedTriggerClasses.Tokenize(" ");
327 while ( ( str = static_cast<TObjString*>(next()) ) )
329 tmpArray.insert(str->String().Data());
335 std::set<std::string>::const_iterator it;
337 for ( it = tmpArray.begin(); it != tmpArray.end(); ++it )
339 array.Add(new TObjString(it->c_str()));
344 //_____________________________________________________________________________
345 Bool_t AliAnalysisTaskMuMu::IsHistogramDisabled(const char* hname) const
347 /// Whether or not a given histogram (identified by its name)
348 /// is disabled or not
350 TIter next(fSubAnalysisVector);
351 AliAnalysisMuMuBase* analysis;
353 while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(next()) ) )
355 if ( analysis->IsHistogramDisabled(hname) )
364 //_____________________________________________________________________________
365 Bool_t AliAnalysisTaskMuMu::IsHistogrammingDisabled() const
367 /// Whether or not *all* histograms are disabled
369 Bool_t disabled(kTRUE);
371 TIter next(fSubAnalysisVector);
372 AliAnalysisMuMuBase* analysis;
374 while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(next()) ) )
376 disabled = disabled && analysis->IsHistogrammingDisabled();
382 //_____________________________________________________________________________
383 Bool_t AliAnalysisTaskMuMu::IsPP() const
385 // whether we're dealing with proton proton collisions
386 return fBeamYear.Contains("pp");
389 //_____________________________________________________________________________
390 void AliAnalysisTaskMuMu::NotifyRun()
392 /// Called at each change of run
394 AliDebug(1,Form("Run %09d File %s",fCurrentRunNumber,CurrentFileName()));
396 TIter next(fSubAnalysisVector);
397 AliAnalysisMuMuBase* analysis;
399 while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(next()) ) )
401 analysis->SetRun(fInputHandler);
405 //_____________________________________________________________________________
407 AliAnalysisTaskMuMu::Print(Option_t* opt) const
409 /// Print the definition of this analysis
411 cout << ClassName() << " - " << GetName() << " - " << fBeamYear.Data() << endl;
413 TIter next(fSubAnalysisVector);
414 AliAnalysisMuMuBase* analysis;
416 while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(next()) ) )
418 analysis->Print(opt);
421 fCutRegistry->Print("ALL");
425 cout << "Binning" << endl;
430 //_____________________________________________________________________________
432 AliAnalysisTaskMuMu::Terminate(Option_t* opt)
434 /// Called once at the end of the query
435 /// Just a simple printout of the stat we analyse and how many histograms
438 TIter next(fSubAnalysisVector);
439 AliAnalysisMuMuBase* analysis;
441 while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(next()) ) )
443 analysis->Terminate(opt);
446 fHistogramCollection = dynamic_cast<AliMergeableCollection*>(GetOutputData(1));
448 if (!fHistogramCollection)
450 AliError("Could not find back histogram collection in output...");
454 // Removes empty objects and also the event histos of the Nch task
455 fHistogramCollection->PruneEmptyObjects();
457 UInt_t size2 = fHistogramCollection->EstimateSize();
459 TIter nextHistogram(fHistogramCollection->CreateIterator());
462 while ( ( object = nextHistogram() ) )
464 if ( object->IsA()->InheritsFrom(TH1::Class()) )
466 TH1* h = static_cast<TH1*>(object);
467 if ( h->GetXaxis()->GetLabels() )
469 h->LabelsDeflate("X");
474 AliInfo(Form("size after prune histograms = %5.1f MB",size2/1024.0/1024.0));
476 fHistogramCollection->Print("-");
479 fEventCounters = dynamic_cast<AliCounterCollection*>(GetOutputData(2));
483 AliError("Could not find back counters in output...");
487 fEventCounters->Print("trigger/event");
490 // post param container(s)
491 PostData(3,fBinning);
494 //_____________________________________________________________________________
495 AliAnalysisMuMuBinning* AliAnalysisTaskMuMu::Binning() const
497 // Return our binning (making a default one if not already created
498 if ( fBinning ) return fBinning;
500 fBinning = new AliAnalysisMuMuBinning("BIN");
505 //_____________________________________________________________________________
506 void AliAnalysisTaskMuMu::UserExec(Option_t* /*opt*/)
508 /// Executed at each event
510 // static Int_t n(0);
511 // AliInfo(Form("EVENT %10d Event()=%p MCEvent()=%p",n,Event(),MCEvent()));
514 AliCodeTimerAuto("",0);
516 Binning(); // insure we have a binning...
520 TIter nextAnalysis(fSubAnalysisVector);
521 AliAnalysisMuMuBase* analysis;
522 while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(nextAnalysis()) ) )
524 if ( MCEvent() ) // Set the MC flag for all analysis (prior to call anything from them
525 // (e.g. any trigger class selection that might behave differently for
526 // MC and real trigger classes)
530 analysis->SetEvent(Event(),MCEvent()); // Set the new event properties derived in the analysis
535 TString firedTriggerClasses(AliAnalysisMuonUtility::GetFiredTriggerClasses(Event()));
537 // first loop to count things not associated to a specific trigger
538 TIter nextEventCutCombination(CutRegistry()->GetCutCombinations(AliAnalysisMuMuCutElement::kEvent));
539 AliAnalysisMuMuCutCombination* cutCombination;
541 while ( ( cutCombination = static_cast<AliAnalysisMuMuCutCombination*>(nextEventCutCombination())))
543 if ( cutCombination->Pass(*fInputHandler) )
545 fEventCounters->Count(Form("event:%s/trigger:%s/centrality:%s/run:%d", cutCombination->GetName(), "EVERYTHING", "ALL", fCurrentRunNumber));
547 if ( firedTriggerClasses == "" )
549 fEventCounters->Count(Form("event:%s/trigger:%s/centrality:%s/run:%d", cutCombination->GetName(), "EMPTY", "ALL", fCurrentRunNumber));
554 // second loop to count only the triggers we're interested in
555 TObjArray selectedTriggerClasses;
557 GetSelectedTrigClassesInEvent(Event(),selectedTriggerClasses);
559 TIter next(&selectedTriggerClasses);
561 // Bool_t hasSetEventBeenCalled(kFALSE);
563 while ( ( tname = static_cast<TObjString*>(next()) ) )
565 nextEventCutCombination.Reset();
567 while ( ( cutCombination = static_cast<AliAnalysisMuMuCutCombination*>(nextEventCutCombination())) )
569 if ( cutCombination->Pass(*fInputHandler) )
571 // if (!hasSetEventBeenCalled)
573 // TIter nextAnalysis(fSubAnalysisVector);
574 // AliAnalysisMuMuBase* analysis;
576 // while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(nextAnalysis()) ) )
578 // analysis->SetEvent(Event(),MCEvent());
580 // hasSetEventBeenCalled = kTRUE;
582 Fill(cutCombination->GetName(),tname->String().Data());
588 PostData(1, fHistogramCollection);
589 PostData(2, fEventCounters);
590 PostData(3, fBinning);
593 //_____________________________________________________________________________
594 void AliAnalysisTaskMuMu::UserCreateOutputObjects()
596 /// Create histograms
601 AliInfo(Form("fCutRegistry=%p",fCutRegistry));
605 fCutRegistry->Print();
608 fHistogramCollection = new AliMergeableCollection("OC");
610 fEventCounters = new AliCounterCollection("CC");
612 // initialize event counters
615 TIter next(CutRegistry()->GetCutCombinations(AliAnalysisMuMuCutElement::kEvent));
616 AliAnalysisMuMuCutCombination* cutCombination;
618 while ( ( cutCombination = static_cast<AliAnalysisMuMuCutCombination*>(next())) )
620 TString cutName = cutCombination->GetName();
621 if ( eventRubric.Length() > 0 ) eventRubric += "/";
622 eventRubric += cutName;
625 fEventCounters->AddRubric("event", eventRubric.Data());
627 fEventCounters->AddRubric("trigger", 100);
629 fEventCounters->AddRubric("centrality", 100);
631 fEventCounters->AddRubric("run", 1000000);
633 // Initialize our subtasks, if any...
635 TIter nextAnalysis(fSubAnalysisVector);
636 AliAnalysisMuMuBase* analysis;
638 while ( ( analysis = static_cast<AliAnalysisMuMuBase*>(nextAnalysis()) ) )
640 analysis->Init(*fEventCounters,*fHistogramCollection,*fBinning,*fCutRegistry);
643 // finally end the counters initialization
644 fEventCounters->Init();
647 PostData(1,fHistogramCollection);
648 PostData(2,fEventCounters);
649 PostData(3,fBinning);