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