Added the possibility to include a function in the ProcessInfo object, to produce...
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnVATProcessInfo.cxx
1 //
2 // *** Class AliRsnVATProcessInfo ***
3 //
4 // Virtual class which makes computations at the event level,
5 // in order to return a list of histograms useful to have a look
6 // of the characteristics of used events.
7 // If can be inherited and customized for the needs of the analysis.
8 //
9 // authors: A. Pulvirenti (email: alberto.pulvirenti@ct.infn.it)
10 //          M. Vala (email: martin.vala@cern.ch)
11 //
12
13 #include <TList.h>
14 #include <TH1.h>
15
16 #include "AliLog.h"
17
18 #include "AliRsnFunction.h"
19 #include "AliRsnVATProcessInfo.h"
20
21 ClassImp(AliRsnVATProcessInfo)
22
23 //______________________________________________________________________________
24 AliRsnVATProcessInfo::AliRsnVATProcessInfo(const char *name) :
25   TNamed(name,name),
26   fHistUsedEvents(0x0),
27   fEventUsed(kFALSE),
28   fEventFunctions("AliRsnFunction", 0),
29   fPrintInfoNumber(1000)
30 {
31 //
32 // Constructor.
33 // Does nothing more than initialization of data members.
34 //
35
36   AliDebug(AliLog::kDebug+2, "Entering");
37   AliDebug(AliLog::kDebug+2, "Exiting");
38 }
39
40 //______________________________________________________________________________
41 AliRsnVATProcessInfo::AliRsnVATProcessInfo(const AliRsnVATProcessInfo& copy) :
42   TNamed(copy),
43   fHistUsedEvents(0x0),
44   fEventUsed(copy.fEventUsed),
45   fEventFunctions(copy.fEventFunctions),
46   fPrintInfoNumber(copy.fPrintInfoNumber)
47 {
48 //
49 // Copy constructor.
50 // Clones the histogram and copies the values of other data members
51 //
52
53   AliDebug(AliLog::kDebug+2, "Entering");
54   
55   fHistUsedEvents  = (TH1I*)copy.fHistUsedEvents->Clone();
56   
57   AliDebug(AliLog::kDebug+2, "Exiting");
58 }
59
60 //______________________________________________________________________________
61 AliRsnVATProcessInfo& AliRsnVATProcessInfo::operator= 
62 (const AliRsnVATProcessInfo& copy)
63 {
64 //
65 // Assignment operator.
66 // Clones the histogram and copies the values of other data members.
67 //
68
69   AliDebug(AliLog::kDebug+2, "Entering");
70
71   fHistUsedEvents  = (TH1I*)copy.fHistUsedEvents->Clone();
72   fEventUsed       = copy.fEventUsed;
73   fPrintInfoNumber = copy.fPrintInfoNumber;
74   fEventFunctions  = copy.fEventFunctions;
75   
76   AliDebug(AliLog::kDebug+2, "Exiting");
77   
78   return (*this);
79 }
80
81 //______________________________________________________________________________
82 AliRsnVATProcessInfo::~AliRsnVATProcessInfo()
83 {
84 //
85 // Destructor.
86 // Does nothing, since the histogram it creates is usually owned
87 // by another object (TList output of AnalysisTask's), but sets
88 // the data member pointers to NULL.
89 //
90
91   AliDebug(AliLog::kDebug+2, "Entering");
92   
93   fHistUsedEvents  = 0x0;
94   fEventUsed       = 0;
95   fPrintInfoNumber = 0;
96   
97   AliDebug(AliLog::kDebug+2, "Exiting");
98 }
99
100 //______________________________________________________________________________
101 void AliRsnVATProcessInfo::GenerateInfoList(TList *list)
102 {
103 //
104 // Allocate in memory the histograms created in this class and store them
105 // inside the TList object passed as argument, which usually belongs to 
106 // an AnalysisTask object, and represents one of its outputs.
107 // If the histogram was already initialized, it is deleted and recreated.
108 //
109
110   AliDebug(AliLog::kDebug+2, "Entering");
111
112   // delete existing allocation of stored objects
113   if (fHistUsedEvents) delete fHistUsedEvents;
114   
115   // create stored objects
116   fHistUsedEvents = new TH1I(GetEventHistogramName(), "Skipped/used events", 3, 0, 3);
117
118   // ad objects to list
119   list->Add(fHistUsedEvents);
120   
121   // add all other functions
122   Int_t  i;
123   TString hName("");
124   AliRsnFunction *fcn = 0;
125   for (i = 0; i < fEventFunctions.GetEntries(); i++)
126   {
127     fcn = (AliRsnFunction*)fEventFunctions.At(i);
128     hName += GetName();
129     hName += '_';
130     hName += fcn->GetName();
131     if (fcn->IsUsingTH1()) list->Add(fcn->CreateHistogram(hName.Data(), ""));
132     else list->Add(fcn->CreateHistogramSparse(hName.Data(), ""));
133   }
134
135   AliDebug(AliLog::kDebug+2, "Exiting");
136 }
137
138 //______________________________________________________________________________
139 void AliRsnVATProcessInfo::FillInfo(AliRsnEvent *event)
140 {
141 //
142 // This method defines how the information histograms must be filled.
143 // The structure of this class is auto-consistent, but in case of inheritance
144 // this method must be modified accordingly.
145 // Current implementation uses the 'fEventUsed' flag to choose if the event
146 // has been used or not, and increments the corresponding bin in the related
147 // histogram (bin '0' = skipped, bin '1' = used).
148 //
149
150   fHistUsedEvents->Fill(fEventUsed);
151   
152   Int_t i;
153   AliRsnFunction *fcn = 0;
154   for (i = 0; i < fEventFunctions.GetEntries(); i++)
155   {
156     fcn = (AliRsnFunction*)fEventFunctions.At(i);
157     fcn->SetEvent(event);
158     fcn->Fill();
159   }
160 }
161
162 //______________________________________________________________________________
163 void AliRsnVATProcessInfo::PrintInfo(const Long64_t &num)
164 {
165 //
166 // This method is used in some cases
167 // to inform about number of events processed
168 //
169
170   if ((num+1) % fPrintInfoNumber == 0) AliInfo(Form("Events processed %lld", num+1));
171 }
172
173 //______________________________________________________________________________
174 Long64_t AliRsnVATProcessInfo::GetNumerOfEventsProcessed()
175 {
176 //
177 // returns number of events from histogram
178 //
179
180   if (fHistUsedEvents) return fHistUsedEvents->Integral();
181   return 0;
182 }
183
184 //_____________________________________________________________________________
185 void AliRsnVATProcessInfo::AddEventFunction(AliRsnFunction * fcn)
186 {
187 //
188 // Adds a new computing function
189 //
190
191   AliDebug(AliLog::kDebug+2,"<-");
192   
193   fEventFunctions.Print();
194   Int_t size = fEventFunctions.GetEntries();
195   new(fEventFunctions[size]) AliRsnFunction(*fcn);
196   
197   AliDebug(AliLog::kDebug+2,"->");
198 }