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