]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/flow/AliFMDFlowEventPlane.cxx
Misalignment-related bug fixed
[u/mrichter/AliRoot.git] / FMD / flow / AliFMDFlowEventPlane.cxx
CommitLineData
97e94238 1/* Copyright (C) 2007 Christian Holm Christensen <cholm@nbi.dk>
2 *
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public License
5 * as published by the Free Software Foundation; either version 2.1 of
6 * the License, or (at your option) any later version.
7 *
8 * This library is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
16 * USA
17 */
39eefe19 18/** @file
19 @brief Implementation of an EventPlane class */
97e94238 20//____________________________________________________________________
21//
22// Class to determine the event plane
23//
24// The event plane is calculated as
25//
26// Psi_n = 1/n * atan((sum_i(w_i sin(n phi_i)))
27// sum_i(w_i cos(n phi_i))))
28//
29// where i runs over all observations of phi in an event, and
30// w_i is the weight of the ith observation of phi
39eefe19 31#include "flow/AliFMDFlowEventPlane.h"
32#include "flow/AliFMDFlowUtil.h"
57f71fe4 33#include <TMath.h>
39eefe19 34// #include <cmath>
35#ifndef _GNU_SOURCE
36extern "C"
37{
38 /** Function to caculate @f$ \sin(a), \cos(a)@f$ in one go. Note,
39 that with GCC, this is a built-in, and we only have this to
40 serve as a replacement function
41 @ingroup utils */
42 inline void sincos(Double_t a, Double_t* sina, Double_t* cosa) {
43 *sina = sin(a);
44 *cosa = cos(a);
45 }
46}
47#endif
48
49//====================================================================
97e94238 50AliFMDFlowEventPlane::AliFMDFlowEventPlane(const AliFMDFlowEventPlane& o)
51 : TObject(o),
52 fSumSinMPhi(o.fSumSinMPhi),
53 fSumCosMPhi(o.fSumCosMPhi),
54 fOrder(o.fOrder),
55 fCache(-1)
56{
57 // copy cosntructor
58 // Parameters
59 // o Object to copy from.
60}
61//____________________________________________________________________
62AliFMDFlowEventPlane&
63AliFMDFlowEventPlane::operator=(const AliFMDFlowEventPlane& o)
64{
65 // Assignment operator.
66 // Parameters:
67 // o Object to assign from
68 fSumSinMPhi = o.fSumSinMPhi;
69 fSumCosMPhi = o.fSumCosMPhi;
70 fOrder = o.fOrder;
71 fCache = -1;
72 return *this;
73}
74
75//____________________________________________________________________
39eefe19 76void
77AliFMDFlowEventPlane::Clear(Option_t*)
78{
97e94238 79 // clear internal variables.
39eefe19 80 fSumSinMPhi = 0;
81 fSumCosMPhi = 0;
82 fCache = -1;
83}
84//____________________________________________________________________
85void
86AliFMDFlowEventPlane::Add(Double_t phi, Double_t weight)
87{
97e94238 88 // Add a data point
89 // Parameters:
90 // phi The angle phi in[0,2pi]
91 // weight The weight
39eefe19 92 Double_t a = NormalizeAngle(fOrder * phi);
93 Double_t s, c;
94 sincos(a, &s, &c);
57f71fe4 95 if (TMath::IsNaN(s) || !TMath::Finite(s) ||
96 TMath::IsNaN(c) || !TMath::Finite(s)) return;
39eefe19 97 fSumSinMPhi += weight * s;
98 fSumCosMPhi += weight * c;
99}
100//____________________________________________________________________
101Double_t
102AliFMDFlowEventPlane::Psi() const
103{
97e94238 104 // Get the event plane
105 // Parameters:
106 // none
39eefe19 107 if (fCache < 0) fCache = DoPsi(fSumSinMPhi, fSumCosMPhi);
108 return fCache;
109}
110//____________________________________________________________________
111Double_t
112AliFMDFlowEventPlane::Psi(Double_t phi, Double_t w) const
113{
97e94238 114 // Get the event plane angle Psi_k disregarding the contribution
115 // from the observation phi with weight w. This is to avoid
116 // auto-correlations
117 //
118 // Parameters:
119 // phi The observation phi
120 // w The weight w of the obervation.
121 //
122 // Returns The event plane angle Psi with out the contribution from
123 // phi_i
39eefe19 124 Double_t a = NormalizeAngle(fOrder * phi);
125 Double_t s, c;
126 sincos(a, &s, &c);
57f71fe4 127 if (TMath::IsNaN(s) || !TMath::Finite(s) ||
128 TMath::IsNaN(c) || !TMath::Finite(s)) return Psi();
39eefe19 129 Double_t psi = DoPsi(fSumSinMPhi - w * s, fSumCosMPhi - w * c);
130 return psi;
131}
132
133//____________________________________________________________________
134Double_t
135AliFMDFlowEventPlane::DoPsi(Double_t sumsin, Double_t sumcos) const
136{
97e94238 137 // Calculate the event plane
138 // Parameters:
139 // sumsin Sum of sines
140 // sumcos Sum of cosines
39eefe19 141 Double_t psi = 0;
142 // Make sure we get an angle everywhere
143 if (sumcos != 0) psi = atan2(sumsin, sumcos);
144 else if (sumsin == 0) psi = 0;
145 else if (sumsin > 0) psi = M_PI / 2;
146 else psi = -M_PI / 2;
147 psi = NormalizeAngle(psi);
148 psi /= fOrder;
149 return psi;
150}
151
152//____________________________________________________________________
153//
154// EOF
155//
156