Load pythia libraries.
[u/mrichter/AliRoot.git] / FMD / AliFMDAnaRing.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, 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 // Utility class for analysing ESD data. 
18 // This class does sharing and background correction 
19 // It can form a base class for other things too.
20 // This line is here to make the silly code checker happy!
21 // This line is here to make the silly code checker happy!
22 //
23 #include "AliFMDAnaRing.h"
24 #include <TH2.h>
25 #include <TMath.h>
26 #include <TBrowser.h>
27 // #include <AliLog.h>
28 #define ne    80
29 #define emin  -3.7
30 #define emax   5.3
31 #define nm    100
32 #define mmin  -.5
33 #define mmax  9.5
34 // namespace {
35 //   Int_t   ne   = 80;
36 //   Float_t emin = -3.7;
37 //   Float_t emax =  5.3;
38 //   Int_t   nm   = 100;
39 //   Int_t   mmin = -.5;
40 //   Int_t   mmax = 9.5;
41 // }
42
43 //____________________________________________________________________
44 AliFMDAnaRing::AliFMDAnaRing()
45   : fDet(0), 
46     fRing('\0'), 
47     fBg(0), 
48     fCut0(0), 
49     fCut1(0), 
50     fUseBgCor(kFALSE), 
51     fNSeq(0),
52     fBareMult(),
53     fMergedMult(),
54     fRemovedMult(),
55     fMult(),
56     fStep1(),
57     fStep2(),
58     fStep3(),
59     fNEvents(0)
60 {
61   // Default constructor.  
62   // Do not use.  
63   // Used by ROOT I/O
64 }
65
66 //____________________________________________________________________
67 AliFMDAnaRing::AliFMDAnaRing(UShort_t det, Char_t ring, 
68                              TH2* bg, Float_t c0, Float_t c1) 
69   : fDet(det), 
70     fRing(ring), 
71     fBg(bg), 
72     fCut0(c0), 
73     fCut1(c1), 
74     fUseBgCor(bg ? kTRUE : kFALSE), 
75     fNSeq(ring == 'I' || ring == 'i' ? 20 : 40), 
76     fBareMult(Form("bareMult%d%c", fDet, fRing), "Bare multiplicity",
77               ne, emin, emax, fNSeq, 0, 2*TMath::Pi()),
78     fMergedMult(Form("mergedMult%d%c", fDet, fRing), "Merged multiplicity",
79                 ne, emin, emax, fNSeq, 0, 2*TMath::Pi()),
80     fRemovedMult(Form("removedMult%d%c", fDet, fRing), "Removed multiplicity",
81                  ne, emin, emax, fNSeq, 0, 2*TMath::Pi()),
82     fMult(Form("mult%d%c", fDet, fRing), "Multiplicity", 
83           ne, emin, emax, fNSeq, 0, 2*TMath::Pi()), 
84     fStep1(Form("step1_%d%c",fDet,fRing), "Step 1", nm,mmin,mmax,nm,mmin,mmax),
85     fStep2(Form("step2_%d%c",fDet,fRing), "Step 2", nm,mmin,mmax,nm,mmin,mmax),
86     fStep3(Form("step3_%d%c",fDet,fRing), "Step 3", nm,mmin,mmax,nm,mmin,mmax),
87     fNEvents(0)
88 {
89   // Constructor 
90   // 
91   // Parameters
92   //     det   Detector 
93   //     ring  Ring 
94   //     bg    Background 
95   //     c0    Lower cut 
96   //     c1    higher cut */
97   fName[0] = 'F'; fName[1] = 'M'; fName[2] = 'D'; 
98   fName[3] = Char_t(det+48);      fName[4] = ring; 
99   fName[5] = '\0';
100   fBareMult.SetDirectory(0);
101   fBareMult.SetXTitle("#eta");
102   fBareMult.SetYTitle("#varphi");
103   fBareMult.SetZTitle("d^2M_{ch}'/d#etad#varphi");
104   fMergedMult.SetDirectory(0);
105   fMergedMult.SetXTitle("#eta");
106   fMergedMult.SetYTitle("#varphi");
107   fMergedMult.SetZTitle("d^2M_{ch}''/d#etad#varphi");
108   fRemovedMult.SetDirectory(0);
109   fRemovedMult.SetXTitle("#eta");
110   fRemovedMult.SetYTitle("#varphi");
111   fRemovedMult.SetZTitle("d^2M_{ch}'''/d#etad#varphi");
112   fMult.SetDirectory(0);
113   fMult.SetXTitle("#eta");
114   fMult.SetYTitle("#varphi");
115   fMult.SetZTitle("d^2M_{ch}/d#etad#varphi");
116   fStep1.SetDirectory(0);
117   fStep1.SetXTitle("Bare multiplicity");
118   fStep1.SetYTitle("Merged multiplicity");
119   fStep2.SetDirectory(0);
120   fStep2.SetXTitle("Merged multiplicity");
121   fStep2.SetYTitle("Cut multiplicity");
122   fStep3.SetDirectory(0);
123   fStep3.SetXTitle("Cut multiplicity");
124   fStep3.SetYTitle("Multiplicity");
125 }
126
127 //____________________________________________________________________
128 AliFMDAnaRing::AliFMDAnaRing(const AliFMDAnaRing& o)
129   : TObject(o),
130     fDet(o.fDet), 
131     fRing(o.fRing), 
132     fBg(o.fBg), 
133     fCut0(o.fCut0), 
134     fCut1(o.fCut1), 
135     fUseBgCor(o.fUseBgCor), 
136     fNSeq(o.fNSeq), 
137     fBareMult(o.fBareMult),
138     fMergedMult(o.fMergedMult),
139     fRemovedMult(o.fRemovedMult),
140     fMult(o.fMult), 
141     fStep1(o.fStep1),
142     fStep2(o.fStep2),
143     fStep3(o.fStep3),
144     fNEvents(o.fNEvents)
145 {
146   // Copy constructor.  
147   // Do not use.  
148   // Used by ROOT I/O
149   fBareMult.SetDirectory(0);
150   fBareMult.SetXTitle("#eta");
151   fBareMult.SetYTitle("#varphi");
152   fBareMult.SetZTitle("dM_{ch}'/d#eta");
153   fMergedMult.SetDirectory(0);
154   fMergedMult.SetXTitle("#eta");
155   fMergedMult.SetYTitle("#varphi");
156   fMergedMult.SetZTitle("dM_{ch}''/d#eta");
157   fRemovedMult.SetDirectory(0);
158   fRemovedMult.SetXTitle("#eta");
159   fRemovedMult.SetYTitle("#varphi");
160   fRemovedMult.SetZTitle("dM_{ch}'''/d#eta");
161   fMult.SetDirectory(0);
162   fMult.SetXTitle("#eta");
163   fMult.SetYTitle("#varphi");
164   fMult.SetZTitle("dM_{ch}/d#eta");
165 }
166
167 //____________________________________________________________________
168 AliFMDAnaRing&
169 AliFMDAnaRing::operator=(const AliFMDAnaRing& o)
170 {
171   // Assignment operator 
172   // 
173   // Parameters: 
174   //   o   Object to assign from 
175   // Returns: 
176   //   Reference to this object. 
177   this->fDet      = o.fDet;
178   this->fRing     = o.fRing;
179   this->fBg       = o.fBg;
180   this->fCut0     = o.fCut0; 
181   this->fCut1     = o.fCut1;
182   this->fUseBgCor = o.fUseBgCor;
183   this->fNSeq     = o.fNSeq;
184   fBareMult.Reset();    fBareMult.Add(&o.fBareMult);
185   fMergedMult.Reset();  fMergedMult.Add(&o.fMergedMult);
186   fRemovedMult.Reset(); fRemovedMult.Add(&o.fRemovedMult);
187   fMult.Reset();        fMult.Add(&o.fMult);
188   return *this;
189 }
190
191
192 //____________________________________________________________________
193 Bool_t 
194 AliFMDAnaRing::ProcessESD(Float_t phi, Float_t eta, Float_t& m1, Float_t m2) 
195
196   // Process ESD 
197   // Parameters
198   //     phi Azimuthal angle @f$ \varphi @f$ of the hit 
199   //     eta Psuedo-rapidity @f$ \eta@f$ of hit
200   //     m1  Multiplicity of this strip. C ontains the corrected 
201   //         value on return 
202   //     m2  Multiplicity of neighbor strip 
203   // Return 
204   //     true if hits are merged */
205
206   // Merge shared hits 
207   Bool_t  merged = false;
208   Float_t sig    = m1;
209   fBareMult.Fill(eta, phi, m1);
210   if ((m1 < fCut0 || m2 < fCut0) && m2 > 0.001) { 
211     sig = m1 + m2;
212     merged = true;
213     fRemovedMult.Fill(eta, phi, TMath::Min(m1,m2));
214   }
215   fMergedMult.Fill(eta, phi, sig);
216   fStep1.Fill(m1, sig);
217
218   // Real multiplicity 
219   Double_t cmult = 1;
220   if (sig < fCut0 / 2)  cmult = 0; // return merged; // cmult = 0;
221   if (sig > fCut1)      cmult = 2;
222   fStep2.Fill(sig, cmult);
223
224   // Background correction
225   Float_t bmult = cmult;
226   if (fUseBgCor && fBg) { 
227     // Float_t bgPhi = phi + (phi >  TMath::Pi() ? -2*TMath::Pi() : 0);
228     Float_t bgPhi = phi - TMath::Pi();
229     Int_t   bgBin = fBg->FindBin(eta, bgPhi);
230     Float_t bgCor = (bgBin > 0 ? fBg->GetBinContent(bgBin) : 0);
231     bmult         = (bgCor < 0.01 ? 0 : cmult / bgCor);
232   }
233   fStep3.Fill(cmult, bmult);
234   fMult.Fill(eta, phi, bmult);
235
236   // Call user code 
237   Fill(phi, eta, bmult);
238   m1 = bmult;
239
240   return merged;
241 }
242 //____________________________________________________________________
243 void
244 AliFMDAnaRing::Finish()
245 {
246   // Finish this task 
247   // 
248   // Parameters: 
249   //    none
250   // Returns: 
251   //    nothing
252   Double_t de    = (fMult.GetXaxis()->GetXmax() - 
253                     fMult.GetXaxis()->GetXmin())/fMult.GetNbinsX(); 
254   Double_t dp    = 2*TMath::Pi() / fNSeq;
255   Double_t scale = ((fNEvents == 0 ? 1. : 1. / fNEvents) * 1 / de * 1 / dp);
256   fBareMult.Scale(scale);
257   fMergedMult.Scale(scale);
258   fRemovedMult.Scale(scale);
259   fMult.Scale(scale);
260 }
261 //____________________________________________________________________
262 Int_t  
263 AliFMDAnaRing::Color() const 
264
265   // Get the ring specific color 
266   // 
267   // Returns:
268   //   The color of the current ring
269   switch (fDet) { 
270   case 1: return kGreen + 2; 
271   case 2: return kRed  + (fRing == 'I' || fRing == 'i' ? 2 : -7);
272   case 3: return kBlue + (fRing == 'I' || fRing == 'i' ? 2 : -7);
273   }
274   return 0;
275 }
276 //____________________________________________________________________
277 void
278 AliFMDAnaRing::Browse(TBrowser* b) 
279 {
280   // Browse this object
281   // 
282   // Parameters: 
283   //    b  Browser to use
284   // Returns: 
285   //    nothing
286   b->Add(&fBareMult);
287   b->Add(&fMergedMult);
288   b->Add(&fRemovedMult);
289   b->Add(&fMult);
290   b->Add(&fStep1);
291   b->Add(&fStep2);
292   b->Add(&fStep3);
293   if (fBg) b->Add(fBg);
294 }
295
296 //____________________________________________________________________
297 //
298 // EOF
299 //
300