]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ANALYSIS/AliPPVsMultUtils.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / ANALYSIS / AliPPVsMultUtils.cxx
1 /*****************************************************************
2  
3  General utility class for doing pp vs multiplicity studies
4  
5  --- Functionality being added on demand.
6  
7  --- Please report any bugs, comments, suggestions to:
8  david.dobrigkeit.chinellato@cern.ch
9  
10  *****************************************************************/
11
12 #include "AliVEvent.h"
13 #include "AliESDEvent.h"
14 #include "AliAODEvent.h"
15 #include "AliVVertex.h"
16 #include "AliLog.h"
17 #include "AliAODVertex.h"
18 #include "AliVTrack.h"
19 #include "AliVEvent.h"
20 #include <TMatrixDSym.h>
21 #include <TMath.h>
22 #include "AliESDUtils.h"
23 #include "AliPPVsMultUtils.h"
24 #include <TFile.h>
25
26
27 ClassImp(AliPPVsMultUtils)
28
29 //______________________________________________________________________
30 AliPPVsMultUtils::AliPPVsMultUtils():TObject(),
31 fRunNumber(0),
32 fBoundaryHisto_V0M(0),
33 fBoundaryHisto_V0A(0),
34 fBoundaryHisto_V0C(0),
35 fBoundaryHisto_V0MEq(0),
36 fBoundaryHisto_V0AEq(0),
37 fBoundaryHisto_V0CEq(0)
38 {
39     // Default contructor
40 }
41
42
43 //_____________________________________________________________________________
44 AliPPVsMultUtils::AliPPVsMultUtils(const AliPPVsMultUtils &c) : TObject(c),
45 fRunNumber(0),
46 fBoundaryHisto_V0M(0),
47 fBoundaryHisto_V0A(0),
48 fBoundaryHisto_V0C(0),
49 fBoundaryHisto_V0MEq(0),
50 fBoundaryHisto_V0AEq(0),
51 fBoundaryHisto_V0CEq(0)
52 {
53     //
54     // copy constructor - untested
55     //
56     ((AliPPVsMultUtils &) c).Copy(*this);
57 }
58
59 //_____________________________________________________________________________
60 AliPPVsMultUtils &AliPPVsMultUtils::operator=(const AliPPVsMultUtils &c)
61 {
62     //
63     // Assignment operator - untested
64     //
65     
66     if (this != &c) ((AliPPVsMultUtils &) c).Copy(*this);
67     return *this;
68 }
69
70 //______________________________________________________________________
71 Float_t AliPPVsMultUtils::GetMultiplicityPercentile(AliESDEvent *event, TString lMethod)
72 // Function to get multiplicity quantiles in ESDs. All methods would work 
73 // with AliVEvent except GetPrimaryVertexSPD which exists in both ESD and AOD 
74 // but not in the AliVEvent class; therefore two functions are included. 
75 // N.B.: Any change to this method has to be propagated by hand to the function 
76 // below! 
77 {
78     Int_t lRequestedRunNumber = event->GetRunNumber();
79     if( lRequestedRunNumber != fRunNumber ) LoadCalibration( lRequestedRunNumber );
80     
81     Float_t lreturnval = -1;
82     
83     //Get VZERO Information for multiplicity later
84     AliVVZERO* esdV0 = event->GetVZEROData();
85     if (!esdV0) {
86         AliError("AliVVZERO not available");
87         return -1;
88     }
89     
90     // VZERO PART
91     Float_t  multV0A  = 0;            //  multiplicity from V0 reco side A
92     Float_t  multV0C  = 0;            //  multiplicity from V0 reco side C
93     Float_t  multV0AEq  = 0;          //  multiplicity from V0 reco side A
94     Float_t  multV0CEq  = 0;          //  multiplicity from V0 reco side C
95     Float_t  multV0ACorr  = 0;            //  multiplicity from V0 reco side A
96     Float_t  multV0CCorr  = 0;            //  multiplicity from V0 reco side C
97     
98     //Non-Equalized Signal: copy of multV0ACorr and multV0CCorr from AliCentralitySelectionTask
99     //Getters for uncorrected multiplicity
100     multV0A=esdV0->GetMTotV0A();
101     multV0C=esdV0->GetMTotV0C();
102     const AliESDVertex *lPrimarySPDVtx         = event->GetPrimaryVertexSPD();
103     
104     //Get Z vertex position of SPD vertex (why not Tracking if available?)
105     Float_t zvtx = lPrimarySPDVtx->GetZ();
106     
107     //Acquire Corrected multV0A
108     multV0ACorr = AliESDUtils::GetCorrV0A(multV0A,zvtx);
109     multV0CCorr = AliESDUtils::GetCorrV0C(multV0C,zvtx);
110     
111     // Equalized signals // From AliCentralitySelectionTask // Updated
112     for(Int_t iCh = 32; iCh < 64; ++iCh) {
113         Double_t mult = event->GetVZEROEqMultiplicity(iCh);
114         multV0AEq += mult;
115     }
116     for(Int_t iCh = 0; iCh < 32; ++iCh) {
117         Double_t mult = event->GetVZEROEqMultiplicity(iCh);
118         multV0CEq += mult;
119     }
120     
121     if ( lMethod == "V0M" ) lreturnval =
122         fBoundaryHisto_V0M -> GetBinContent( fBoundaryHisto_V0M->FindBin(multV0ACorr+multV0CCorr) );
123     if ( lMethod == "V0A" ) lreturnval =
124         fBoundaryHisto_V0A -> GetBinContent( fBoundaryHisto_V0A->FindBin(multV0ACorr) );
125     if ( lMethod == "V0C" ) lreturnval =
126         fBoundaryHisto_V0C -> GetBinContent( fBoundaryHisto_V0C->FindBin(multV0CCorr) );
127     //equalized
128     if ( lMethod == "V0MEq" ) lreturnval =
129         fBoundaryHisto_V0MEq -> GetBinContent( fBoundaryHisto_V0MEq->FindBin(multV0AEq+multV0CEq) );
130     if ( lMethod == "V0AEq" ) lreturnval =
131         fBoundaryHisto_V0AEq -> GetBinContent( fBoundaryHisto_V0AEq->FindBin(multV0AEq) );
132     if ( lMethod == "V0CEq" ) lreturnval =
133         fBoundaryHisto_V0CEq -> GetBinContent( fBoundaryHisto_V0CEq->FindBin(multV0CEq) );
134     
135     return lreturnval;
136 }
137
138 //______________________________________________________________________
139 Float_t AliPPVsMultUtils::GetMultiplicityPercentile(AliAODEvent *event, TString lMethod)
140 // Carbon-copy version of ESD function (GetPrimaryVertexSPD won't work 
141 // in the base class AliVEvent...FIXME) 
142 {
143     Int_t lRequestedRunNumber = event->GetRunNumber();
144     if( lRequestedRunNumber != fRunNumber ) LoadCalibration( lRequestedRunNumber );
145     
146     Float_t lreturnval = -1;
147     
148     //Get VZERO Information for multiplicity later
149     AliVVZERO* esdV0 = event->GetVZEROData();
150     if (!esdV0) {
151         AliError("AliVVZERO not available");
152         return -1;
153     }
154     
155     // VZERO PART
156     Float_t  multV0A  = 0;            //  multiplicity from V0 reco side A
157     Float_t  multV0C  = 0;            //  multiplicity from V0 reco side C
158     Float_t  multV0AEq  = 0;          //  multiplicity from V0 reco side A
159     Float_t  multV0CEq  = 0;          //  multiplicity from V0 reco side C
160     Float_t  multV0ACorr  = 0;            //  multiplicity from V0 reco side A
161     Float_t  multV0CCorr  = 0;            //  multiplicity from V0 reco side C
162     
163     //Non-Equalized Signal: copy of multV0ACorr and multV0CCorr from AliCentralitySelectionTask
164     //Getters for uncorrected multiplicity
165     multV0A=esdV0->GetMTotV0A();
166     multV0C=esdV0->GetMTotV0C();
167     const AliAODVertex *lPrimarySPDVtx         = event->GetPrimaryVertexSPD();
168     
169     //Get Z vertex position of SPD vertex (why not Tracking if available?)
170     Float_t zvtx = lPrimarySPDVtx->GetZ();
171     
172     //Acquire Corrected multV0A
173     multV0ACorr = AliESDUtils::GetCorrV0A(multV0A,zvtx);
174     multV0CCorr = AliESDUtils::GetCorrV0C(multV0C,zvtx);
175     
176     // Equalized signals // From AliCentralitySelectionTask // Updated
177     for(Int_t iCh = 32; iCh < 64; ++iCh) {
178         Double_t mult = event->GetVZEROEqMultiplicity(iCh);
179         multV0AEq += mult;
180     }
181     for(Int_t iCh = 0; iCh < 32; ++iCh) {
182         Double_t mult = event->GetVZEROEqMultiplicity(iCh);
183         multV0CEq += mult;
184     }
185     
186     if ( lMethod == "V0M" ) lreturnval =
187         fBoundaryHisto_V0M -> GetBinContent( fBoundaryHisto_V0M->FindBin(multV0ACorr+multV0CCorr) );
188     if ( lMethod == "V0A" ) lreturnval =
189         fBoundaryHisto_V0A -> GetBinContent( fBoundaryHisto_V0A->FindBin(multV0ACorr) );
190     if ( lMethod == "V0C" ) lreturnval =
191         fBoundaryHisto_V0C -> GetBinContent( fBoundaryHisto_V0C->FindBin(multV0CCorr) );
192     //equalized
193     if ( lMethod == "V0MEq" ) lreturnval =
194         fBoundaryHisto_V0MEq -> GetBinContent( fBoundaryHisto_V0MEq->FindBin(multV0AEq+multV0CEq) );
195     if ( lMethod == "V0AEq" ) lreturnval =
196         fBoundaryHisto_V0AEq -> GetBinContent( fBoundaryHisto_V0AEq->FindBin(multV0AEq) );
197     if ( lMethod == "V0CEq" ) lreturnval =
198         fBoundaryHisto_V0CEq -> GetBinContent( fBoundaryHisto_V0CEq->FindBin(multV0CEq) );
199     
200     return lreturnval;
201 }
202
203 //______________________________________________________________________
204 Bool_t AliPPVsMultUtils::LoadCalibration(Int_t lLoadThisCalibration)
205 //To be called if starting analysis on a new run
206 {
207     //If Histograms exist, de-allocate to prevent memory leakage
208     if( fBoundaryHisto_V0M ) {fBoundaryHisto_V0M->Delete(); fBoundaryHisto_V0M = 0x0; }
209     if( fBoundaryHisto_V0A ) {fBoundaryHisto_V0A->Delete(); fBoundaryHisto_V0A = 0x0; }
210     if( fBoundaryHisto_V0C ) {fBoundaryHisto_V0C->Delete(); fBoundaryHisto_V0C = 0x0; }
211     if( fBoundaryHisto_V0MEq ) {fBoundaryHisto_V0MEq->Delete(); fBoundaryHisto_V0MEq = 0x0; }
212     if( fBoundaryHisto_V0AEq ) {fBoundaryHisto_V0AEq->Delete(); fBoundaryHisto_V0AEq = 0x0; }
213     if( fBoundaryHisto_V0CEq ) {fBoundaryHisto_V0CEq->Delete(); fBoundaryHisto_V0CEq = 0x0; }
214     
215     AliInfo(Form( "Loading calibration file for run %i",lLoadThisCalibration) );
216     TFile *lCalibFile_V0M = 0x0;
217     TFile *lCalibFile_V0A = 0x0;
218     TFile *lCalibFile_V0C = 0x0;
219     TFile *lCalibFile_V0MEq = 0x0;
220     TFile *lCalibFile_V0AEq = 0x0;
221     TFile *lCalibFile_V0CEq = 0x0;
222     
223     //AliInfo("Calling TFile::Open");
224     lCalibFile_V0M = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0M.root");
225     lCalibFile_V0A = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0A.root");
226     lCalibFile_V0C = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0C.root");
227     lCalibFile_V0MEq = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0MEq.root");
228     lCalibFile_V0AEq = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0AEq.root");
229     lCalibFile_V0CEq = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0CEq.root");
230
231     //AliInfo("Casting");
232     //check memory consumption later... 
233     fBoundaryHisto_V0M   = dynamic_cast<TH1F *>(lCalibFile_V0M  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
234     fBoundaryHisto_V0A   = dynamic_cast<TH1F *>(lCalibFile_V0A  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
235     fBoundaryHisto_V0C   = dynamic_cast<TH1F *>(lCalibFile_V0C  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
236     fBoundaryHisto_V0MEq   = dynamic_cast<TH1F *>(lCalibFile_V0MEq  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
237     fBoundaryHisto_V0AEq   = dynamic_cast<TH1F *>(lCalibFile_V0AEq  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
238     fBoundaryHisto_V0CEq   = dynamic_cast<TH1F *>(lCalibFile_V0CEq  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
239     
240     if ( !fBoundaryHisto_V0M   || !fBoundaryHisto_V0A   || !fBoundaryHisto_V0C ||
241         !fBoundaryHisto_V0MEq || !fBoundaryHisto_V0AEq || !fBoundaryHisto_V0CEq ){
242         AliFatal(Form("No calibration for run %i exists at the moment!",lLoadThisCalibration));
243         return kFALSE; //return denial
244     }
245     
246     //Careful with manual cleanup if needed: to be implemented
247     fBoundaryHisto_V0M->SetDirectory(0);
248     fBoundaryHisto_V0A->SetDirectory(0);
249     fBoundaryHisto_V0C->SetDirectory(0);
250     fBoundaryHisto_V0MEq->SetDirectory(0);
251     fBoundaryHisto_V0AEq->SetDirectory(0);
252     fBoundaryHisto_V0CEq->SetDirectory(0);
253     
254     //AliInfo("Closing");
255     
256     if( lCalibFile_V0M ) lCalibFile_V0M->Close();
257     if( lCalibFile_V0A ) lCalibFile_V0A->Close();
258     if( lCalibFile_V0C ) lCalibFile_V0C->Close();
259     if( lCalibFile_V0MEq ) lCalibFile_V0MEq->Close();
260     if( lCalibFile_V0AEq ) lCalibFile_V0AEq->Close();
261     if( lCalibFile_V0CEq ) lCalibFile_V0CEq->Close();
262     
263     fRunNumber = lLoadThisCalibration; //Loaded!
264     AliInfo(Form("Finished loading calibration for run %i",lLoadThisCalibration));
265     return kTRUE;
266 }