]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/FEMTOSCOPY/AliFemto/AliFemtoAnalysisReactionPlane.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGCF / FEMTOSCOPY / AliFemto / AliFemtoAnalysisReactionPlane.cxx
1 ////////////////////////////////////////////////////////////////////////////
2 //                                                                        //
3 // AliFemtoAnalysisReactionPlane - Femtoscopic analysis which mixes event //
4 // with respect to the z position of the primary vertex and event total   //
5 // multiplicity and uses only events in certain reaction plane angle bin  //
6 //                                                                        //
7 ////////////////////////////////////////////////////////////////////////////
8
9 #include <TMath.h>
10 #include "AliFemtoAnalysisReactionPlane.h"
11 #include "AliFemtoParticleCollection.h"
12 #include "AliFemtoTrackCut.h"
13 #include "AliFemtoV0Cut.h"
14 #include "AliFemtoKinkCut.h"
15 #include "AliFemtoPicoEventCollectionVector.h"
16 #include "AliFemtoPicoEventCollectionVectorHideAway.h"
17
18 #ifdef __ROOT__ 
19 ClassImp(AliFemtoAnalysisReactionPlane)
20 #endif
21
22 //____________________________
23 AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(unsigned int binsVertex, double minVertex, double maxVertex,
24                                                        unsigned int binsMult, double minMult, double maxMult, unsigned short binsRP) 
25   : 
26   fVertexZBins(binsVertex), 
27   fOverFlowVertexZ(0), 
28   fUnderFlowVertexZ(0),
29   fMultBins(binsMult) ,
30   fOverFlowMult(0),    
31   fUnderFlowMult(0),
32   fRPBins(binsRP),
33   fCurrentRP(0)
34 {
35   //  mControlSwitch     = 0;
36   fEventCut          = 0;
37   fFirstParticleCut  = 0;
38   fSecondParticleCut = 0;
39   fPairCut           = 0;
40   fCorrFctnCollection= 0;
41   fCorrFctnCollection = new AliFemtoCorrFctnCollection;
42   fVertexZ[0] = minVertex;
43   fVertexZ[1] = maxVertex;
44   fUnderFlowVertexZ = 0; 
45   fOverFlowVertexZ = 0; 
46   fMult[0] = minMult;
47   fMult[1] = maxMult;
48   fUnderFlowMult = 0; 
49   fOverFlowMult = 0; 
50   if (fMixingBuffer) delete fMixingBuffer;
51   fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexZBins,fVertexZ[0],fVertexZ[1],
52                                                                                      fMultBins,fMult[0],fMult[1],
53                                                                                      fRPBins,0.0,TMath::Pi());
54 }
55 //____________________________
56
57 AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(const AliFemtoAnalysisReactionPlane& a) : 
58   AliFemtoSimpleAnalysis(),
59   fVertexZBins(a.fVertexZBins), 
60   fOverFlowVertexZ(0), 
61   fUnderFlowVertexZ(0),
62   fMultBins(a.fMultBins) ,
63   fOverFlowMult(0),    
64   fUnderFlowMult(0),
65   fRPBins(a.fRPBins),
66   fCurrentRP(0)
67 {
68   //AliFemtoAnalysisReactionPlane();
69   fEventCut          = 0;
70   fFirstParticleCut  = 0;
71   fSecondParticleCut = 0;
72   fPairCut           = 0;
73   fCorrFctnCollection= 0;
74   fCorrFctnCollection = new AliFemtoCorrFctnCollection;
75   fVertexZ[0] = a.fVertexZ[0]; 
76   fVertexZ[1] = a.fVertexZ[1];
77   fUnderFlowVertexZ = 0; 
78   fOverFlowVertexZ = 0; 
79   fMult[0] = a.fMult[0]; 
80   fMult[1] = a.fMult[1];
81   fUnderFlowMult = 0; 
82   fOverFlowMult = 0; 
83   if (fMixingBuffer) delete fMixingBuffer;
84   fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexZBins,fVertexZ[0],fVertexZ[1],
85                                                                                      fMultBins,fMult[0],fMult[1],
86                                                                                      fRPBins,0.0,TMath::Pi());
87
88   // find the right event cut
89   fEventCut = a.fEventCut->Clone();
90   // find the right first particle cut
91   fFirstParticleCut = a.fFirstParticleCut->Clone();
92   // find the right second particle cut
93   if (a.fFirstParticleCut==a.fSecondParticleCut) 
94     SetSecondParticleCut(fFirstParticleCut); // identical particle hbt
95   else
96   fSecondParticleCut = a.fSecondParticleCut->Clone();
97
98   fPairCut = a.fPairCut->Clone();
99   
100   if ( fEventCut ) {
101       SetEventCut(fEventCut); // this will set the myAnalysis pointer inside the cut
102       cout << " AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(const AliFemtoAnalysisReactionPlane& a) - event cut set " << endl;
103   }
104   if ( fFirstParticleCut ) {
105       SetFirstParticleCut(fFirstParticleCut); // this will set the myAnalysis pointer inside the cut
106       cout << " AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(const AliFemtoAnalysisReactionPlane& a) - first particle cut set " << endl;
107   }
108   if ( fSecondParticleCut ) {
109       SetSecondParticleCut(fSecondParticleCut); // this will set the myAnalysis pointer inside the cut
110       cout << " AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(const AliFemtoAnalysisReactionPlane& a) - second particle cut set " << endl;
111   }  if ( fPairCut ) {
112       SetPairCut(fPairCut); // this will set the myAnalysis pointer inside the cut
113       cout << " AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(const AliFemtoAnalysisReactionPlane& a) - pair cut set " << endl;
114   }
115
116   AliFemtoCorrFctnIterator iter;
117   for (iter=a.fCorrFctnCollection->begin(); iter!=a.fCorrFctnCollection->end();iter++){
118     cout << " AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(const AliFemtoAnalysisReactionPlane& a) - looking for correlation functions " << endl;
119     AliFemtoCorrFctn* fctn = (*iter)->Clone();
120     if (fctn) AddCorrFctn(fctn);
121     else cout << " AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(const AliFemtoAnalysisReactionPlane& a) - correlation function not found " << endl;
122   }
123
124   fNumEventsToMix = a.fNumEventsToMix;
125
126   cout << " AliFemtoAnalysisReactionPlane::AliFemtoAnalysisReactionPlane(const AliFemtoAnalysisReactionPlane& a) - analysis copied " << endl;
127
128 }
129 AliFemtoAnalysisReactionPlane& AliFemtoAnalysisReactionPlane::operator=(const AliFemtoAnalysisReactionPlane& TheOriginalAnalysis)
130 {
131   if (this != &TheOriginalAnalysis) {
132
133     //AliFemtoAnalysisReactionPlane();
134     fVertexZ[0] = TheOriginalAnalysis.fVertexZ[0]; 
135     fVertexZ[1] = TheOriginalAnalysis.fVertexZ[1];
136     fUnderFlowVertexZ = 0; 
137     fOverFlowVertexZ = 0; 
138     fMult[0] = TheOriginalAnalysis.fMult[0]; 
139     fMult[1] = TheOriginalAnalysis.fMult[1];
140     fUnderFlowMult = 0; 
141     fOverFlowMult = 0; 
142     if (fMixingBuffer) delete fMixingBuffer;
143     fVertexZBins = TheOriginalAnalysis.fVertexZBins;
144     fMultBins = TheOriginalAnalysis.fMultBins;
145     fRPBins = TheOriginalAnalysis.fRPBins;
146     fCurrentRP = 0;
147     
148     if (fEventCut) delete fEventCut;
149     fEventCut = TheOriginalAnalysis.fEventCut->Clone();
150     
151     if (fFirstParticleCut) delete fFirstParticleCut;
152     fFirstParticleCut = TheOriginalAnalysis.fFirstParticleCut->Clone();
153     
154     if (fSecondParticleCut) delete fSecondParticleCut;
155     if (TheOriginalAnalysis.fFirstParticleCut==TheOriginalAnalysis.fSecondParticleCut) 
156       SetSecondParticleCut(fFirstParticleCut); // identical particle hbt
157     else
158       fSecondParticleCut = TheOriginalAnalysis.fSecondParticleCut->Clone();
159     
160     if (fPairCut) delete fPairCut;
161     fPairCut = TheOriginalAnalysis.fPairCut->Clone();
162     
163     if ( fEventCut ) {
164       SetEventCut(fEventCut); // this will set the myAnalysis pointer inside the cut
165     }
166     if ( fFirstParticleCut ) {
167       SetFirstParticleCut(fFirstParticleCut); // this will set the myAnalysis pointer inside the cut
168     }
169     if ( fSecondParticleCut ) {
170       SetSecondParticleCut(fSecondParticleCut); // this will set the myAnalysis pointer inside the cut
171     }  if ( fPairCut ) {
172       SetPairCut(fPairCut); // this will set the myAnalysis pointer inside the cut
173     }
174     
175     if (fPicoEventCollectionVectorHideAway) delete fPicoEventCollectionVectorHideAway;
176     fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexZBins,fVertexZ[0],fVertexZ[1],
177                                                                                        fMultBins,fMult[0],fMult[1],
178                                                                                        fRPBins,0.0,TMath::Pi());
179     
180     AliFemtoCorrFctnIterator iter;
181     for (iter=TheOriginalAnalysis.fCorrFctnCollection->begin(); iter!=TheOriginalAnalysis.fCorrFctnCollection->end();iter++){
182       AliFemtoCorrFctn* fctn = (*iter)->Clone();
183       if (fctn) AddCorrFctn(fctn);
184     }
185     
186     fNumEventsToMix = TheOriginalAnalysis.fNumEventsToMix;
187
188   }
189
190   return *this;
191 }
192
193 //____________________________
194 AliFemtoAnalysisReactionPlane::~AliFemtoAnalysisReactionPlane(){
195   // now delete every PicoEvent in the EventMixingBuffer and then the Buffer itself
196   delete fPicoEventCollectionVectorHideAway;
197 }
198
199 //____________________________
200 AliFemtoString AliFemtoAnalysisReactionPlane::Report()
201 {
202   // Prepare a report of the execution
203   cout << "AliFemtoAnalysisReactionPlane - constructing Report..."<<endl;
204   char ctemp[200];
205   AliFemtoString temp = "-----------\nHbt AliFemtoAnalysisReactionPlane Report:\n";
206   snprintf(ctemp , 200, "Events are mixed in %d VertexZ bins in the range %E cm to %E cm.\n",fVertexZBins,fVertexZ[0],fVertexZ[1]);
207   temp += ctemp;
208   snprintf(ctemp , 200, "Events underflowing: %d\n",fUnderFlowVertexZ);
209   temp += ctemp;
210   snprintf(ctemp , 200, "Events overflowing: %d\n",fOverFlowVertexZ);
211   temp += ctemp;
212   snprintf(ctemp , 200, "Events are mixed in %d Mult bins in the range %E cm to %E cm.\n",fMultBins,fMult[0],fMult[1]);
213   temp += ctemp;
214   snprintf(ctemp , 200, "Events underflowing: %d\n",fUnderFlowMult);
215   temp += ctemp;
216   snprintf(ctemp , 200, "Events overflowing: %d\n",fOverFlowMult);
217   temp += ctemp;
218   snprintf(ctemp , 200, "Now adding AliFemtoSimpleAnalysis(base) Report\n");
219   temp += ctemp;
220   temp += AliFemtoSimpleAnalysis::Report();
221   AliFemtoString returnThis=temp;
222   return returnThis;
223 }
224 //_________________________
225 void AliFemtoAnalysisReactionPlane::ProcessEvent(const AliFemtoEvent* hbtEvent) {
226   // Perform event processing
227   // in bins of z vertex and multiplicity
228
229   // cout << " AliFemtoAnalysisReactionPlane::ProcessEvent(const AliFemtoEvent* hbtEvent) " << endl;
230   // get right mixing buffer
231   double vertexZ = hbtEvent->PrimVertPos().z();
232   double mult = hbtEvent->UncorrectedNumberOfPrimaries();
233   fCurrentRP = hbtEvent->ReactionPlaneAngle();
234   
235   fMixingBuffer = fPicoEventCollectionVectorHideAway->PicoEventCollection(vertexZ,mult,fCurrentRP); 
236   if (!fMixingBuffer) {
237     if ( vertexZ < fVertexZ[0] ) fUnderFlowVertexZ++;
238     if ( vertexZ > fVertexZ[1] ) fOverFlowVertexZ++;
239     if ( mult < fMult[0] ) fUnderFlowMult++;
240     if ( mult > fMult[1] ) fOverFlowMult++;
241     return;
242   }
243   // call ProcessEvent() from AliFemtoSimpleAnalysis-base
244   AliFemtoSimpleAnalysis::ProcessEvent(hbtEvent);
245 }
246
247 double AliFemtoAnalysisReactionPlane::GetCurrentReactionPlane()
248 {
249   return fCurrentRP;
250 }