]> git.uio.no Git - u/mrichter/AliRoot.git/blob - FMD/flow/AliFMDFlowBinned1D.cxx
Added code to do flow analysis.
[u/mrichter/AliRoot.git] / FMD / flow / AliFMDFlowBinned1D.cxx
1 /** @file 
2     @brief Implementation of a 1-dimensional Flow "histogram" */
3 #include "flow/AliFMDFlowBinned1D.h"
4 #include "flow/AliFMDFlowBin.h"
5 #include <cmath>
6 #include <cstdlib>
7 #include <iostream>
8 #include <iomanip>
9 #include <TBrowser.h>
10 #include <TString.h>
11
12 //====================================================================
13 AliFMDFlowBinned1D::AliFMDFlowBinned1D(UShort_t order, 
14                                        UShort_t nxbins, 
15                                        Double_t* xbins) 
16   : fXAxis(nxbins, xbins),
17     fBins(0)
18 {
19   UShort_t n = fXAxis.N();
20   fBins   = new AliFMDFlowBin*[n];
21   for (UInt_t i = 0; i < n; i++) fBins[i]= new AliFMDFlowBin(order);
22 }
23 //____________________________________________________________________
24 AliFMDFlowBinned1D::AliFMDFlowBinned1D(UShort_t order, 
25                                        const AliFMDFlowAxis& xaxis)
26   : fXAxis(xaxis)
27 {
28   UShort_t n = fXAxis.N();
29   fBins   = new AliFMDFlowBin*[n];
30   for (UInt_t i = 0; i < n; i++) fBins[i]= new AliFMDFlowBin(order);
31 }
32 //____________________________________________________________________
33 AliFMDFlowBinned1D::AliFMDFlowBinned1D(const AliFMDFlowBinned1D& o)
34   : fXAxis(o.fXAxis)
35 {
36   UShort_t n = fXAxis.N();
37   fBins   = new AliFMDFlowBin*[n];
38   for (UInt_t i = 0; i < n; i++) fBins[i]= new AliFMDFlowBin(*(o.fBins[i]));
39 }
40 //____________________________________________________________________
41 AliFMDFlowBinned1D&
42 AliFMDFlowBinned1D::operator=(const AliFMDFlowBinned1D& o)
43 {
44   if (fBins) { 
45     for (UInt_t i = 0; i < fXAxis.N(); i++) delete fBins[i];
46     delete [] fBins;
47   }
48   fXAxis     = o.fXAxis;
49   UShort_t n = fXAxis.N();
50   fBins   = new AliFMDFlowBin*[n];
51   for (UInt_t i = 0; i < n; i++) fBins[i]= new AliFMDFlowBin(*(o.fBins[i]));
52   return *this;
53 }
54   
55 //____________________________________________________________________
56 AliFMDFlowBinned1D::~AliFMDFlowBinned1D()
57 {
58   if (fBins) { 
59     for (UInt_t i = 0; i < fXAxis.N(); i++) delete fBins[i];
60     delete [] fBins;
61   }
62 }
63
64 //____________________________________________________________________
65 AliFMDFlowBin* 
66 AliFMDFlowBinned1D::GetBin(UShort_t i) const
67 {
68   if (i >= fXAxis.N()) return 0;
69   return fBins[i];
70 }
71 //____________________________________________________________________
72 AliFMDFlowBin* 
73 AliFMDFlowBinned1D::GetBin(Double_t x) const
74 {
75   Int_t i = fXAxis.FindBin(x);
76   if (i < 0) return 0;
77   UShort_t j = i;
78   return GetBin(j);
79 }
80   
81 //____________________________________________________________________
82 void 
83 AliFMDFlowBinned1D::Begin()
84 {
85   for (UInt_t i = 0; i < fXAxis.N(); i++) fBins[i]->Begin();
86 }
87 //____________________________________________________________________
88 void 
89 AliFMDFlowBinned1D::End()
90 {
91   for (UInt_t i = 0; i < fXAxis.N(); i++) fBins[i]->End();
92 }
93 //____________________________________________________________________
94 void 
95 AliFMDFlowBinned1D::Finish()
96 {
97   for (UInt_t i = 0; i < fXAxis.N(); i++) fBins[i]->Finish();
98 }
99 //____________________________________________________________________
100 Bool_t 
101 AliFMDFlowBinned1D::AddToEventPlane(Double_t x, Double_t phi, Double_t w, Bool_t a)
102 {
103   AliFMDFlowBin* bin = GetBin(x);
104   if (!bin) return kFALSE;
105   bin->AddToEventPlane(phi, w, a);
106   return kTRUE;
107 }
108
109 //____________________________________________________________________
110 Bool_t 
111 AliFMDFlowBinned1D::AddToHarmonic(Double_t x, Double_t phi)
112 {
113   AliFMDFlowBin* bin = GetBin(x);
114   if (!bin) return kFALSE;
115   bin->AddToHarmonic(phi);
116   return kTRUE;
117 }
118
119 //____________________________________________________________________
120 void 
121 AliFMDFlowBinned1D::Event(Double_t* phis, Double_t* xs, Double_t* ws, ULong_t n)
122 {
123   Begin();
124   for (UInt_t i = 0; i < n; i++) 
125     AddToEventPlane(xs[i], phis[i], (ws ? ws[i] : 1), 
126                     Float_t(rand()) / RAND_MAX > 0.5);
127   for (UInt_t i = 0; i < n; i++) 
128     AddToHarmonic(xs[i], phis[i]);
129   End();
130 }
131
132 //____________________________________________________________________
133 void 
134 AliFMDFlowBinned1D::Browse(TBrowser* b)
135 {
136   b->Add(&fXAxis, "xaxis");
137   for (UInt_t i = 0; i < fXAxis.N(); i++) 
138     b->Add(fBins[i], Form("bin_%03d", i));
139 }
140
141 //____________________________________________________________________
142 void 
143 AliFMDFlowBinned1D::Print(Option_t* option) const
144 {
145   TString opt(option);
146   opt.ToLower();
147   Bool_t det = opt.Contains("d");
148   Bool_t sum = opt.Contains("s");
149   if (det) { 
150     for (UShort_t i = 0; i < fXAxis.N(); i++) { 
151       Double_t x = fXAxis.BinCenter(i);
152       std::streamsize         old_p = std::cout.precision(3);
153       std::ios_base::fmtflags old_f = std::cout.setf(std::ios_base::fixed, 
154                                                      std::ios_base::floatfield);
155       std::cout << "x=" << std::setw(5) << x << std::endl;
156       fBins[i]->Print();
157       std::cout.precision(old_p);
158       std::cout.setf(old_f, std::ios_base::floatfield);
159     }
160   }
161   
162   if (sum) { 
163     UInt_t       nType = 4;
164     const char*  names[] = { "Bare",    "Naive",    "STAR",    "TDR" };
165     AliFMDFlowBin::CorType types[] = { AliFMDFlowBin::none, 
166                                        AliFMDFlowBin::naive, 
167                                        AliFMDFlowBin::star, 
168                                        AliFMDFlowBin::tdr };
169     std::cout << "    x";
170     for (UInt_t i = 0; i < nType; i++) 
171       std::cout << " | " << std::setw(6+6+5) << names[i];
172     std::cout << "\n-----" << std::setfill('-');
173     for (UInt_t i = 0; i < nType; i++) 
174       std::cout << "-+-" <<  std::setw(6+6+5) << "-";
175     std::cout << std::setfill(' ') << std::endl;
176     
177     std::streamsize         old_p = std::cout.precision(2);
178     std::ios_base::fmtflags old_f = std::cout.setf(std::ios_base::fixed, 
179                                                    std::ios_base::floatfield);
180     for (UShort_t i = 0; i < fXAxis.N(); i++) { 
181       Double_t x = fXAxis.BinCenter(i);
182       std::cout << std::setprecision(2) << std::setw(5) << x << std::flush;
183       for (UShort_t j = 0; j < nType; j++) { 
184         Double_t e2v;
185         Double_t v  = fBins[i]->Value(e2v, types[j]);
186         std::cout << std::setprecision(3)    << " | "
187                   << std::setw(6) << 100 * v << " +/- " 
188                   << std::setw(6) << 100 * sqrt(e2v);
189       }
190       std::cout << std::endl;
191     }
192     std::cout.precision(old_p);
193     std::cout.setf(old_f, std::ios_base::floatfield);
194   }
195 }
196
197     
198 //____________________________________________________________________
199 //
200 // EOF
201 //