2 // Class AliRsnAnalysisTask
4 // Virtual Class derivated from AliRsnVAnalysisTask which will be base class
5 // for all RSN SE tasks
7 // authors: Martin Vala (martin.vala@cern.ch)
8 // Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
11 #include <Riostream.h>
13 #include "AliESDEvent.h"
14 #include "AliMCEvent.h"
15 #include "AliAODEvent.h"
17 #include "AliRsnCutSet.h"
18 #include "AliRsnVATProcessInfo.h"
19 #include "AliRsnAnalysisTask.h"
21 ClassImp(AliRsnAnalysisTask)
23 //_____________________________________________________________________________
24 AliRsnAnalysisTask::AliRsnAnalysisTask(const char *name, Bool_t useKine) :
25 AliRsnVAnalysisTask(name, useKine),
26 fRsnAnalysisManager(),
27 fEventCuts("eventCuts", AliRsnCut::kEvent),
29 fZeroEventPercentWarning(100),
30 fUseZeroEventWarning(kTRUE)
33 // Default constructor.
34 // Defines another output slot for histograms/ntuples
37 DefineOutput(2, TList::Class());
40 //_____________________________________________________________________________
41 AliRsnAnalysisTask::AliRsnAnalysisTask(const AliRsnAnalysisTask& copy) :
42 AliRsnVAnalysisTask(copy),
43 fRsnAnalysisManager(copy.fRsnAnalysisManager),
44 fEventCuts(copy.fEventCuts),
46 fZeroEventPercentWarning(copy.fZeroEventPercentWarning),
47 fUseZeroEventWarning(copy.fUseZeroEventWarning)
54 //_____________________________________________________________________________
55 AliRsnAnalysisTask& AliRsnAnalysisTask::operator=(const AliRsnAnalysisTask& copy)
58 // Assigment operator.
61 AliRsnVAnalysisTask::operator=(copy);
63 fRsnAnalysisManager = copy.fRsnAnalysisManager;
64 fEventCuts = copy.fEventCuts;
65 if (fOutList) fOutList->Clear();
66 fZeroEventPercentWarning = copy.fZeroEventPercentWarning;
67 fUseZeroEventWarning = copy.fUseZeroEventWarning;
72 //_____________________________________________________________________________
73 void AliRsnAnalysisTask::RsnUserCreateOutputObjects()
76 // Creation of output objects.
77 // These are created through the utility methods in the analysis manager,
78 // which asks all the AliRsnPair objects to initialize their output which
79 // is then linked to the TList data member of this, which will contain all the output.
82 if (!fOutList) fOutList = new TList;
85 fRsnAnalysisManager.InitAllPairs(fOutList);
87 PostData(2, fOutList);
90 //_____________________________________________________________________________
91 void AliRsnAnalysisTask::RsnUserExec(Option_t*)
94 // Execution of the analysis task.
95 // Recovers the input event and processes it with all included pair objects,
96 // using 'reconstructed' or 'MonteCarlo' functions depending on MC-only flag.
98 if (IsMixing()) return;
101 fRsnAnalysisManager.ProcessAllPairsMC();
103 fRsnAnalysisManager.ProcessAllPairs();
105 PostData(2, fOutList);
108 void AliRsnAnalysisTask::RsnUserExecMix(Option_t* /*opt*/)
110 if (!IsMixing()) return;
111 AliDebug(AliLog::kDebug,Form("RSN Mixing %lld %d [%lld,%lld] %d",fMixedEH->CurrentEntry(),fMixedEH->NumberMixed(),fMixedEH->CurrentEntryMain(),fMixedEH->CurrentEntryMix(),fMixedEH->CurrentBinIndex()));
113 // the virtual class has already sorted tracks in the PID index
114 // so we need here just to call the execution of analysis
116 fRsnAnalysisManager.ProcessAllPairs();
118 fRsnAnalysisManager.ProcessAllPairsMC();
121 //_____________________________________________________________________________
122 void AliRsnAnalysisTask::RsnTerminate(Option_t*)
126 // Could be added some monitor histograms here.
130 //______________________________________________________________________________
131 Bool_t AliRsnAnalysisTask::EventProcess()
134 // Customized event pre-processing.
135 // First checks if the current event passes all cuts,
136 // and if it does, updates the informations and then
137 // call the operations which are already defined in the
138 // omonyme function in mother class
141 // initially, an event is expected to be bad
142 fTaskInfo.SetEventUsed(kFALSE);
144 if (!AliRsnVAnalysisTask::EventProcess()) return kFALSE;
146 // check #1: number of tracks in event (reject empty events)
147 Int_t ntracks = fRsnEvent[0].GetMultiplicity();
148 Double_t zeroEventPercent = 0.0;
151 // if using the checker for amount of empty events, update it
152 if (fUseZeroEventWarning)
154 TH1I *hist = (TH1I*)fInfoList->FindObject(fTaskInfo.GetEventHistogramName());
157 if (hist->Integral() > 1) zeroEventPercent = (Double_t)hist->GetBinContent(1) / hist->Integral() * 100;
158 if ((zeroEventPercent > fZeroEventPercentWarning) && (fEntry > 100))
159 AliWarning(Form("%3.2f%% Events are with zero tracks (CurrentEvent=%d)!!!", zeroEventPercent, fEntry));
163 // empty events are rejected by default
164 fTaskInfo.SetEventUsed(kFALSE);
165 AliDebug(AliLog::kDebug, "Empty event. Skipping...");
169 // check the event cuts and update the info data accordingly
170 // events not passing the cuts must be rejected
171 if (!fEventCuts.IsSelected(&fRsnEvent[0]))
173 fTaskInfo.SetEventUsed(kFALSE);
177 // if we reach this point, cuts were passed;
178 // then additional operations can be done
180 // find leading particle (without any PID/momentum restriction)
181 fRsnEvent[0].SelectLeadingParticle(0);
183 // final return value is positive
184 // but call the mother class method which updates info object
185 fTaskInfo.SetEventUsed(kTRUE);