Added drawing capabilities
[u/mrichter/AliRoot.git] / FMD / flow / AliFMDFlowBin.cxx
1 /** @file 
2     @brief implementation of a Bin in a Flow histogram */
3 #include "flow/AliFMDFlowBin.h"
4 #include <cmath>
5 #include <iostream>
6 #include <iomanip>
7 #include <TBrowser.h>
8
9 //====================================================================
10 void 
11 AliFMDFlowBin::Begin() 
12 {
13   // Clear event plane calculators 
14   fPsi.Clear();
15   fPsiA.Clear();
16   fPsiB.Clear();
17 }
18
19 //____________________________________________________________________
20 void 
21 AliFMDFlowBin::AddToEventPlane(Double_t phi, Double_t w, Bool_t a) 
22 {
23   fPsi.Add(phi, w);
24   if (a) fPsiA.Add(phi, w);
25   else   fPsiB.Add(phi, w);
26 }
27
28 //____________________________________________________________________
29 void 
30 AliFMDFlowBin::AddToHarmonic(Double_t phi, Double_t w)
31 {
32   // Disregard the obervation of phi from the event plane angle. 
33   Double_t psi   = fPsi.Psi(phi, w);
34   fHarmonic.Add(phi, psi);
35 }
36
37 //____________________________________________________________________
38 void 
39 AliFMDFlowBin::End()
40 {
41   Double_t psi_A = fPsiA.Psi();
42   Double_t psi_B = fPsiB.Psi();
43
44   // Update the resolutions 
45   fRes.Add(psi_A, psi_B);
46   fResStar.Add(psi_A, psi_B);
47   fResTdr.Add(psi_A, psi_B);
48 }
49
50 //____________________________________________________________________
51 void 
52 AliFMDFlowBin::Event(Double_t* phis, Double_t* ws, UInt_t n) 
53
54   Begin();
55   
56   // Calculate split. 
57   UInt_t split = n / 2;
58   // First sub-event. 
59   for (UInt_t i = 0; i < split; i++) 
60     AddToEventPlane(phis[i], (ws ? ws[i] : 1), kTRUE);
61   // Second sub-event. 
62   for (UInt_t i = split; i < n; i++) 
63     AddToEventPlane(phis[i], (ws ? ws[i] : 1), kFALSE);
64   // Add contributions to the harmonic. 
65   for (UInt_t i = 0; i < n; i++)     
66     AddToHarmonic(phis[i], (ws ? ws[i] : 1));
67
68   End();
69 }
70
71 //____________________________________________________________________
72 Double_t 
73 AliFMDFlowBin::Value(CorType t) const
74
75   Double_t e;
76   return Value(e, t);
77 }
78
79 //____________________________________________________________________
80 Double_t 
81 AliFMDFlowBin::EValue(CorType t) const 
82
83   Double_t e2;
84   Value(e2, t);
85   return sqrt(e2);
86 }
87
88 //____________________________________________________________________
89 Double_t 
90 AliFMDFlowBin::Value(Double_t& e2, CorType t) const
91
92   Double_t r, er2;
93   r = Correction(er2, t);
94   return fHarmonic.Value(r, er2, e2);
95 }
96
97 //____________________________________________________________________
98 Double_t 
99 AliFMDFlowBin::Correction(Double_t& er2, CorType t) const
100 {
101   Double_t r = 1;
102   UShort_t k = fHarmonic.Order()/fRes.Order();
103   switch (t) { 
104   case naive: r = fRes.Correction(k, er2);     break;
105   case star:  r = fResStar.Correction(k, er2); break;
106   case tdr:   r = fResTdr.Correction(k, er2);  break;
107   default:    r = 1; er2 = 0;                  break;
108   }
109   return r;
110 }
111
112 //____________________________________________________________________
113 void 
114 AliFMDFlowBin::Finish() 
115 {}
116
117 //____________________________________________________________________
118 void
119 AliFMDFlowBin::Browse(TBrowser* b) 
120 {
121   b->Add(&fPsi,      "Full event plane");
122   b->Add(&fPsiA,     "Sub-event A event plane");
123   b->Add(&fPsiB,     "Sub-event A event plane");
124   b->Add(&fRes,      "Naive resolution");
125   b->Add(&fResStar,  "STAR resolution");
126   b->Add(&fResTdr,   "TDR resolution");
127   b->Add(&fHarmonic, "Harmonic");
128 }
129
130 //____________________________________________________________________
131 void 
132 AliFMDFlowBin::Print(Option_t*) const
133 {
134   Double_t e2v[4], v[4], r[4], e2r[4];
135   const char* names[] = { "Bare", "Naive", "STAR", "TDR" };
136   v[0] = 100 * Value(e2v[0], AliFMDFlowBin::none);
137   v[1] = 100 * Value(e2v[1], AliFMDFlowBin::naive);
138   v[2] = 100 * Value(e2v[2], AliFMDFlowBin::star);
139   v[3] = 100 * Value(e2v[3], AliFMDFlowBin::tdr);
140   r[0] = 100 * Correction(e2r[0], AliFMDFlowBin::none);
141   r[1] = 100 * Correction(e2r[1], AliFMDFlowBin::naive);
142   r[2] = 100 * Correction(e2r[2], AliFMDFlowBin::star);
143   r[3] = 100 * Correction(e2r[3], AliFMDFlowBin::tdr);
144   
145   std::streamsize         old_prec  = std::cout.precision(3);
146   std::ios_base::fmtflags old_flags = std::cout.setf(std::ios_base::fixed, 
147                                                      std::ios_base::floatfield);
148   std::cout << "  v" << std::setw(1) << fHarmonic.Order() << ": ";
149   for (UInt_t i = 0; i < 4; i++) 
150     std::cout << std::setw(6+(i == 0 ? 0 : 6)) << names[i] << ": " 
151               << std::setw(6) << v[i] << " +/- " 
152               << std::setw(6) << 100*sqrt(e2v[i]) << " ["
153               << std::setw(7) << r[i] << " +/- " 
154               << std::setw(7) << 100*sqrt(e2r[i]) << "]\n";
155   std::cout << std::flush;
156   std::cout.precision(old_prec);
157   std::cout.setf(old_flags, std::ios_base::floatfield);
158 }
159
160
161 //____________________________________________________________________
162 //
163 // EOF
164 //