43bf76e9daa6b0a66f35bbd359759be9a331264c
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliFlowTasks / AliAnalysisTaskQCumulants.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  * 
14 **************************************************************************/
15
16 /**************************************
17  * analysis task for Q-cumulants      * 
18  *                                    * 
19  * authors: Naomi van der Kolk        *
20  *           (kolk@nikhef.nl)         *  
21  *          Raimond Snellings         *
22  *           (snelling@nikhef.nl)     * 
23  *          Ante Bilandzic            *
24  *           (anteb@nikhef.nl)        * 
25  * ***********************************/
26  
27 class TFile;
28 class TList;
29 class AliAnalysisTaskSE; 
30  
31 #include "Riostream.h"
32 #include "AliFlowEventSimple.h"
33 #include "AliAnalysisTaskQCumulants.h"
34 #include "AliFlowAnalysisWithQCumulants.h"
35
36 ClassImp(AliAnalysisTaskQCumulants)
37
38 //================================================================================================================
39
40 AliAnalysisTaskQCumulants::AliAnalysisTaskQCumulants(const char *name, Bool_t useParticleWeights): 
41  AliAnalysisTaskSE(name), 
42  fEvent(NULL),
43  fQC(NULL), 
44  fListHistos(NULL),
45  fFillMultipleControlHistograms(kFALSE),
46  fHarmonic(2),  
47  fApplyCorrectionForNUA(kFALSE), 
48  fApplyCorrectionForNUAVsM(kFALSE), 
49  fPropagateErrorAlsoFromNIT(kFALSE),
50  fCalculateDiffFlow(kTRUE),
51  fCalculate2DDiffFlow(kFALSE),
52  fStoreDistributions(kFALSE),
53  fCalculateCumulantsVsM(kFALSE), 
54  fMinimumBiasReferenceFlow(kTRUE), 
55  fForgetAboutCovariances(kFALSE),  
56  fStorePhiDistributionForOneEvent(kFALSE),
57  fnBinsMult(10000),
58  fMinMult(0.),  
59  fMaxMult(10000.), 
60  fUseParticleWeights(useParticleWeights),
61  fUsePhiWeights(kFALSE),
62  fUsePtWeights(kFALSE),
63  fUseEtaWeights(kFALSE),
64  fWeightsList(NULL),
65  fMultiplicityWeight(NULL)
66 {
67  // constructor
68  cout<<"AliAnalysisTaskQCumulants::AliAnalysisTaskQCumulants(const char *name, Bool_t useParticleWeights)"<<endl;
69  
70  // Define input and output slots here
71  // Input slot #0 works with an AliFlowEventSimple
72  DefineInput(0, AliFlowEventSimple::Class());  
73  // Input slot #1 is needed for the weights input file:
74  if(useParticleWeights)
75  {
76   DefineInput(1, TList::Class());   
77  }  
78  // Output slot #0 is reserved              
79  // Output slot #1 writes into a TList container
80  DefineOutput(1, TList::Class());  
81  
82  // Event weights:
83  fMultiplicityWeight = new TString("combinations");
84  
85  // Store phi distribution for one event to illustrate flow:
86  for(Int_t p=0;p<4;p++) // [v_min,v_max,refMult_min,refMult_max]
87  {
88   fPhiDistributionForOneEventSettings[p] = 0.;
89  } 
90   
91 }
92
93 AliAnalysisTaskQCumulants::AliAnalysisTaskQCumulants(): 
94  AliAnalysisTaskSE(),
95  fEvent(NULL),
96  fQC(NULL),
97  fListHistos(NULL),
98  fFillMultipleControlHistograms(kFALSE),
99  fHarmonic(0),  
100  fApplyCorrectionForNUA(kFALSE), 
101  fApplyCorrectionForNUAVsM(kFALSE), 
102  fPropagateErrorAlsoFromNIT(kFALSE),
103  fCalculateDiffFlow(kFALSE),
104  fCalculate2DDiffFlow(kFALSE),
105  fStoreDistributions(kFALSE),
106  fCalculateCumulantsVsM(kFALSE),  
107  fMinimumBiasReferenceFlow(kFALSE), 
108  fForgetAboutCovariances(kFALSE), 
109  fStorePhiDistributionForOneEvent(kFALSE), 
110  fnBinsMult(0),
111  fMinMult(0.),  
112  fMaxMult(0.), 
113  fUseParticleWeights(kFALSE),
114  fUsePhiWeights(kFALSE),
115  fUsePtWeights(kFALSE),
116  fUseEtaWeights(kFALSE),
117  fWeightsList(NULL),
118  fMultiplicityWeight(NULL)
119 {
120  // Dummy constructor
121  cout<<"AliAnalysisTaskQCumulants::AliAnalysisTaskQCumulants()"<<endl;
122  
123  // Store phi distribution for one event to illustrate flow:
124  for(Int_t p=0;p<4;p++) // [v_min,v_max,refMult_min,refMult_max]
125  {
126   fPhiDistributionForOneEventSettings[p] = 0.;
127  } 
128  
129 }
130
131 //================================================================================================================
132
133 void AliAnalysisTaskQCumulants::UserCreateOutputObjects() 
134 {
135  // Called at every worker node to initialize
136  cout<<"AliAnalysisTaskQCumulants::UserCreateOutputObjects()"<<endl;
137
138  // Analyser:
139  fQC = new AliFlowAnalysisWithQCumulants();
140  
141  // Common:
142  fQC->SetFillMultipleControlHistograms(fFillMultipleControlHistograms);
143  fQC->SetHarmonic(fHarmonic);
144  fQC->SetApplyCorrectionForNUA(fApplyCorrectionForNUA);
145  fQC->SetApplyCorrectionForNUAVsM(fApplyCorrectionForNUAVsM);
146  fQC->SetPropagateErrorAlsoFromNIT(fPropagateErrorAlsoFromNIT);
147  fQC->SetCalculateDiffFlow(fCalculateDiffFlow);
148  fQC->SetCalculate2DDiffFlow(fCalculate2DDiffFlow);
149  fQC->SetStoreDistributions(fStoreDistributions);
150  fQC->SetCalculateCumulantsVsM(fCalculateCumulantsVsM);
151  fQC->SetMinimumBiasReferenceFlow(fMinimumBiasReferenceFlow); 
152  fQC->SetForgetAboutCovariances(fForgetAboutCovariances); 
153  // Multiparticle correlations vs multiplicity:
154  fQC->SetnBinsMult(fnBinsMult);
155  fQC->SetMinMult(fMinMult);
156  fQC->SetMaxMult(fMaxMult);
157  // Particle weights:
158  if(fUseParticleWeights)
159  {
160   // Pass the flags to class:
161   if(fUsePhiWeights) fQC->SetUsePhiWeights(fUsePhiWeights);
162   if(fUsePtWeights) fQC->SetUsePtWeights(fUsePtWeights);
163   if(fUseEtaWeights) fQC->SetUseEtaWeights(fUseEtaWeights);
164   // Get data from input slot #1 which is used for weights:
165   if(GetNinputs()==2) 
166   {                   
167    fWeightsList = (TList*)GetInputData(1); 
168   }
169   // Pass the list with weights to class:
170   if(fWeightsList) fQC->SetWeightsList(fWeightsList);
171  }
172  // Event weights:
173  if(!(strcmp(fMultiplicityWeight->Data(),"combinations")==0)) // default is "combinations"
174  {
175   fQC->SetMultiplicityWeight(fMultiplicityWeight->Data());
176  }
177
178  // Store phi distribution for one event to illustrate flow:
179  fQC->SetStorePhiDistributionForOneEvent(fStorePhiDistributionForOneEvent);
180  for(Int_t i=0;i<4;i++)
181  {
182   fQC->SetPhiDistributionForOneEventSettings(fPhiDistributionForOneEventSettings[i],i);
183  }
184   
185  fQC->Init();
186  
187  if(fQC->GetHistList()) 
188  {
189   fListHistos = fQC->GetHistList();
190   // fListHistos->Print();
191  } else 
192    {
193     Printf("ERROR: Could not retrieve histogram list (QC, Task::UserCreateOutputObjects()) !!!!"); 
194    }
195  
196  PostData(1,fListHistos);
197   
198 } // end of void AliAnalysisTaskQCumulants::UserCreateOutputObjects() 
199
200 //================================================================================================================
201
202 void AliAnalysisTaskQCumulants::UserExec(Option_t *) 
203 {
204  // main loop (called for each event)
205  fEvent = dynamic_cast<AliFlowEventSimple*>(GetInputData(0));
206
207  // Q-cumulants
208  if(fEvent) 
209  {
210   fQC->Make(fEvent);
211  } else 
212    {
213     cout<<"WARNING: No input data (QC, Task::UserExec()) !!!!"<<endl;
214     cout<<endl;
215    }
216   
217  PostData(1,fListHistos);
218 }
219
220 //================================================================================================================
221
222 void AliAnalysisTaskQCumulants::Terminate(Option_t *) 
223 {
224  //accessing the merged output list: 
225  fListHistos = (TList*)GetOutputData(1);
226  
227  fQC = new AliFlowAnalysisWithQCumulants(); 
228  
229  if(fListHistos) 
230  {
231   fQC->GetOutputHistograms(fListHistos);
232   fQC->Finish();
233   PostData(1,fListHistos);
234  } else
235    {
236     cout<<" WARNING: histogram list pointer is empty (QC, Task::Terminate()) !!!!"<<endl;
237     cout<<endl;
238    }
239     
240 } // end of void AliAnalysisTaskQCumulants::Terminate(Option_t *)
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261