source: Sophya/trunk/SophyaLib/Samba/sphericaltransformserver.h@ 988

Last change on this file since 988 was 866, checked in by ansari, 25 years ago

mise a jour 04/2000

File size: 10.8 KB
Line 
1#ifndef SPHERICALTRANFORMSERVER_SEEN
2#define SPHERICALTRANFORMSERVER_SEEN
3
4#include "sphericalmap.h"
5#include "fftservintf.h"
6#include "fftpserver.h"
7#include "alm.h"
8#include "lambdaBuilder.h"
9
10
11namespace SOPHYA {
12
13//
14/*! Class for performing analysis and synthesis of sky maps using spin-0 or spin-2 spherical harmonics.
15
16Maps must be SOPHYA SphericalMaps (SphereGorski or SphereThetaPhi).
17
18Temperature and polarization (Stokes parameters) can be developped on spherical harmonics :
19\f[
20\frac{\Delta T}{T}(\hat{n})=\sum_{lm}a_{lm}^TY_l^m(\hat{n})
21\f]
22\f[
23Q(\hat{n})=\frac{1}{\sqrt{2}}\sum_{lm}N_l\left(a_{lm}^EW_{lm}(\hat{n})+a_{lm}^BX_{lm}(\hat{n})\right)
24\f]
25\f[
26U(\hat{n})=-\frac{1}{\sqrt{2}}\sum_{lm}N_l\left(a_{lm}^EX_{lm}(\hat{n})-a_{lm}^BW_{lm}(\hat{n})\right)
27\f]
28\f[
29\left(Q \pm iU\right)(\hat{n})=\sum_{lm}a_{\pm 2lm}\, _{\pm 2}Y_l^m(\hat{n})
30\f]
31
32\f[
33Y_l^m(\hat{n})=\lambda_l^m(\theta)e^{im\phi}
34\f]
35\f[
36_{\pm}Y_l^m(\hat{n})=_{\pm}\lambda_l^m(\theta)e^{im\phi}
37\f]
38\f[
39W_{lm}(\hat{n})=\frac{1}{N_l}\,_{w}\lambda_l^m(\theta)e^{im\phi}
40\f]
41\f[
42X_{lm}(\hat{n})=\frac{-i}{N_l}\,_{x}\lambda_l^m(\theta)e^{im\phi}
43\f]
44
45(see LambdaLMBuilder, LambdaPMBuilder, LambdaWXBuilder classes)
46
47power spectra :
48
49\f[
50C_l^T=\frac{1}{2l+1}\sum_{m=0}^{+ \infty }\left|a_{lm}^T\right|^2=\langle\left|a_{lm}^T\right|^2\rangle
51\f]
52\f[
53C_l^E=\frac{1}{2l+1}\sum_{m=0}^{+\infty}\left|a_{lm}^E\right|^2=\langle\left|a_{lm}^E\right|^2\rangle
54\f]
55\f[
56C_l^B=\frac{1}{2l+1}\sum_{m=0}^{+\infty}\left|a_{lm}^B\right|^2=\langle\left|a_{lm}^B\right|^2\rangle
57\f]
58
59\arg
60\b Synthesis : Get temperature and polarization maps from \f$a_{lm}\f$ coefficients or from power spectra, (methods GenerateFrom...).
61
62\b Temperature:
63\f[
64\frac{\Delta T}{T}(\hat{n})=\sum_{lm}a_{lm}^TY_l^m(\hat{n}) = \sum_{-\infty}^{+\infty}b_m(\theta)e^{im\phi}
65\f]
66
67with
68\f[
69b_m(\theta)=\sum_{l=\left|m\right|}^{+\infty}a_{lm}^T\lambda_l^m(\theta)
70\f]
71
72\b Polarisation
73\f[
74Q \pm iU = \sum_{-\infty}^{+\infty}b_m^{\pm}(\theta)e^{im\phi}
75\f]
76
77where :
78\f[
79b_m^{\pm}(\theta) = \sum_{l=\left|m\right|}^{+\infty}a_{\pm 2lm}\,_{\pm}\lambda_l^m(\theta)
80\f]
81
82or :
83\f[
84Q = \sum_{-\infty}^{+\infty}b_m^{Q}(\theta)e^{im\phi}
85\f]
86\f[
87U = \sum_{-\infty}^{+\infty}b_m^{U}(\theta)e^{im\phi}
88\f]
89
90where:
91\f[
92b_m^{Q}(\theta) = \frac{1}{\sqrt{2}}\sum_{l=\left|m\right|}^{+\infty}\left(a_{lm}^E\,_{w}\lambda_l^m(\theta)-ia_{lm}^B\,_{x}\lambda_l^m(\theta)\right)
93\f]
94\f[
95b_m^{U}(\theta) = \frac{1}{\sqrt{2}}\sum_{l=\left|m\right|}^{+\infty}\left(ia_{lm}^E\,_{x}\lambda_l^m(\theta)+a_{lm}^B\,_{w}\lambda_l^m(\theta)\right)
96\f]
97
98Since the pixelization provides "slices" with constant \f$\theta\f$ and \f$\phi\f$ equally distributed on \f$2\pi\f$ \f$\frac{\Delta T}{T}\f$, \f$Q\f$,\f$U\f$ can be computed by FFT.
99
100
101\arg
102\b Analysis : Get \f$a_{lm}\f$ coefficients or power spectra from temperature and polarization maps (methods DecomposeTo...).
103
104\b Temperature:
105\f[
106a_{lm}^T=\int\frac{\Delta T}{T}(\hat{n})Y_l^{m*}(\hat{n})d\hat{n}
107\f]
108
109approximated as :
110\f[
111a_{lm}^T=\sum_{\theta_k}\omega_kC_m(\theta_k)\lambda_l^m(\theta_k)
112\f]
113where :
114\f[
115C_m (\theta _k)=\sum_{\phi _{k\prime}}\frac{\Delta T}{T}(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}}
116\f]
117Since the pixelization provides "slices" with constant \f$\theta\f$ and \f$\phi\f$ equally distributed on \f$2\pi\f$ (\f$\omega_k\f$ is the solid angle of each pixel of the slice \f$\theta_k\f$) \f$C_m\f$ can be computed by FFT.
118
119\b polarisation:
120
121\f[
122a_{\pm 2lm}=\sum_{\theta_k}\omega_kC_m^{\pm}(\theta_k)\,_{\pm}\lambda_l^m(\theta_k)
123\f]
124where :
125\f[
126C_m^{\pm} (\theta _k)=\sum_{\phi _{k\prime}}\left(Q \pm iU\right)(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}}
127\f]
128or :
129
130\f[
131a_{lm}^E=\frac{1}{\sqrt{2}}\sum_{\theta_k}\omega_k\left(C_m^{Q}(\theta_k)\,_{w}\lambda_l^m(\theta_k)-iC_m^{U}(\theta_k)\,_{x}\lambda_l^m(\theta_k)\right)
132\f]
133\f[
134a_{lm}^B=\frac{1}{\sqrt{2}}\sum_{\theta_k}\omega_k\left(iC_m^{Q}(\theta_k)\,_{x}\lambda_l^m(\theta_k)+C_m^{U}(\theta_k)\,_{w}\lambda_l^m(\theta_k)\right)
135\f]
136
137where :
138\f[
139C_m^{Q} (\theta _k)=\sum_{\phi _{k\prime}}Q(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}}
140\f]
141\f[
142C_m^{U} (\theta _k)=\sum_{\phi _{k\prime}}U(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}}
143\f]
144
145 */
146template <class T>
147class SphericalTransformServer
148{
149
150 public:
151
152 SphericalTransformServer()
153{
154 fftIntfPtr_=new FFTPackServer;
155 fftIntfPtr_->setNormalize(false);
156};
157 ~SphericalTransformServer(){ if (fftIntfPtr_!=NULL) delete fftIntfPtr_;};
158/*!
159 Set a fft server. The constructor sets a default fft server (fft-pack). So it is not necessary to call this method for a standard use.
160*/
161 void SetFFTServer(FFTServerInterface* srv=NULL)
162{
163 if (fftIntfPtr_!=NULL) delete fftIntfPtr_;
164 fftIntfPtr_=srv;
165 fftIntfPtr_->setNormalize(false);
166}
167 /*! synthesis of a temperature map from Alm coefficients */
168 void GenerateFromAlm( SphericalMap<T>& map, int_4 pixelSizeIndex, const Alm<T>& alm) const;
169 /*! synthesis of a polarization map from Alm coefficients. The spheres mapq and mapu contain respectively the Stokes parameters. */
170 void GenerateFromAlm(SphericalMap<T>& mapq, SphericalMap<T>& mapu, int_4 pixelSizeIndex, const Alm<T>& alme, const Alm<T>& almb) const;
171
172 /*! synthesis of a temperature map from power spectrum Cl (Alm's are generated randomly, following a gaussian distribution). */
173 void GenerateFromCl(SphericalMap<T>& sph, int_4 pixelSizeIndex,
174 const TVector<T>& Cl, const r_8 fwhm) const;
175 /*! synthesis of a polarization map from power spectra electric-Cl and magnetic-Cl (Alm's are generated randomly, following a gaussian distribution).
176 \param fwhm FWHM in arcmin for random generation of Alm's (eg. 5)
177
178*/
179 void GenerateFromCl(SphericalMap<T>& sphq, SphericalMap<T>& sphu,
180 int_4 pixelSizeIndex,
181 const TVector<T>& Cle, const TVector<T>& Clb,
182 const r_8 fwhm) const;
183 /*!return the Alm coefficients from analysis of a temperature map.
184
185 \param<nlmax> : maximum value of the l index
186
187 \param<cos_theta_cut> : cosinus of the symmetric cut EULER angle theta : cos_theta_cut=0 means no cut ; cos_theta_cut=1 all the sphere is cut.
188 */
189
190
191Alm<T> DecomposeToAlm(const SphericalMap<T>& map, int_4 nlmax, r_8 cos_theta_cut) const;
192 /*!analysis of a polarization map into Alm coefficients.
193
194 The spheres \c mapq and \c mapu contain respectively the Stokes parameters.
195
196 \c a2lme and \c a2lmb will receive respectively electric and magnetic Alm's
197 nlmax : maximum value of the l index
198
199 \c cos_theta_cut : cosinus of the symmetric cut EULER angle theta : cos_theta_cut=0 means no cut ; cos_theta_cut=1 all the sphere is cut.
200 */
201
202 void DecomposeToAlm(const SphericalMap<T>& mapq, const SphericalMap<T>& mapu,
203 Alm<T>& a2lme, Alm<T>& a2lmb,
204 int_4 nlmax, r_8 cos_theta_cut) const;
205
206/*!return power spectrum from analysis of a temperature map.
207
208 \param<nlmax> : maximum value of the l index
209
210 \param<cos_theta_cut> : cosinus of the symmetric cut EULER angle theta : cos_theta_cut=0 means no cut ; cos_theta_cut=1 all the sphere is cut.
211 */
212 TVector<T> DecomposeToCl(const SphericalMap<T>& sph,
213 int_4 nlmax, r_8 cos_theta_cut) const;
214
215
216 private:
217 /*! return a vector with nph elements which are sums :\f$\sum_{m=-mmax}^{mmax}b_m(\theta)e^{im\varphi}\f$ for nph values of \f$\varphi\f$ regularly distributed in \f$[0,\pi]\f$ ( calculated by FFT)
218
219 The object b_m (\f$b_m\f$) of the class Bm is a special vector which index goes from -mmax to mmax.
220 */
221 TVector< complex<T> > fourierSynthesisFromB(const Bm<complex<T> >& b_m,
222 int_4 nph, r_8 phi0) const;
223/*! same as fourierSynthesisFromB, but return a real vector, taking into account the fact that b(-m) is conjugate of b(m) */
224 TVector<T> RfourierSynthesisFromB(const Bm<complex<T> >& b_m,
225 int_4 nph, r_8 phi0) const;
226
227 /*! return a vector with mmax elements which are sums :
228\f$\sum_{k=0}^{nphi}datain(\theta,\varphi_k)e^{im\varphi_k}\f$ for (mmax+1) values of \f$m\f$ from 0 to mmax.
229 */
230 TVector< complex<T> > CFromFourierAnalysis(int_4 mmax,
231 const TVector<complex<T> > datain,
232 r_8 phi0) const;
233/* same as previous one, but with a "datain" which is real (not complex) */
234 TVector< complex<T> > CFromFourierAnalysis(int_4 mmax,
235 const TVector<T> datain,
236 r_8 phi0) const;
237
238 /*!
239Compute polarized Alm's as :
240\f[
241a_{lm}^E=\frac{1}{\sqrt{2}}\sum_{slices}{\omega_{pix}\left(\,_{w}\lambda_l^m\tilde{Q}-i\,_{x}\lambda_l^m\tilde{U}\right)}
242\f]
243\f[
244a_{lm}^B=\frac{1}{\sqrt{2}}\sum_{slices}{\omega_{pix}\left(i\,_{x}\lambda_l^m\tilde{Q}+\,_{w}\lambda_l^m\tilde{U}\right)}
245\f]
246
247where \f$\tilde{Q}\f$ and \f$\tilde{U}\f$ are C-coefficients computed by FFT (method CFromFourierAnalysis, called by present method) from the Stokes parameters.
248
249\f$\omega_{pix}\f$ are solid angle of each pixel.
250
251dataq, datau : Stokes parameters.
252
253 */
254void almFromWX(int_4 nlmax, int_4 nmmax, r_8 phi0,
255 r_8 domega, r_8 theta,
256 const TVector<T>& dataq, const TVector<T>& datau,
257 Alm<T>& alme, Alm<T>& almb) const;
258 /*!
259Compute polarized Alm's as :
260\f[
261a_{lm}^E=-\frac{1}{2}\sum_{slices}{\omega_{pix}\left(\,_{+}\lambda_l^m\tilde{P^+}+\,_{-}\lambda_l^m\tilde{P^-}\right)}
262\f]
263\f[
264a_{lm}^B=\frac{i}{2}\sum_{slices}{\omega_{pix}\left(\,_{+}\lambda_l^m\tilde{P^+}-\,_{-}\lambda_l^m\tilde{P^-}\right)}
265\f]
266
267where \f$\tilde{P^{\pm}}=\tilde{Q}\pm\tilde{U}\f$ computed by FFT (method CFromFourierAnalysis, called by present method) from the Stokes parameters,\f$Q\f$ and \f$U\f$ .
268
269\f$\omega_{pix}\f$ are solid angle of each pixel.
270
271dataq, datau : Stokes parameters.
272
273 */
274void almFromPM(int_4 nph, int_4 nlmax, int_4 nmmax,
275 r_8 phi0, r_8 domega, r_8 theta,
276 const TVector<T>& dataq, const TVector<T>& datau,
277 Alm<T>& alme, Alm<T>& almb) const;
278
279/*! synthesis of Stokes parameters following formulae :
280
281\f[
282Q=\sum_{m=-mmax}^{mmax}b_m^qe^{im\varphi}
283\f]
284\f[
285U=\sum_{m=-mmax}^{mmax}b_m^ue^{im\varphi}
286\f]
287
288computed by FFT (method fourierSynthesisFromB called by the present one)
289
290with :
291
292\f[
293b_m^q=-\frac{1}{\sqrt{2}}\sum_{l=|m|}^{lmax}{\left(\,_{w}\lambda_l^ma_{lm}^E-i\,_{x}\lambda_l^ma_{lm}^B\right) }
294\f]
295\f[
296b_m^u=\frac{1}{\sqrt{2}}\sum_{l=|m|}^{lmax}{\left(i\,_{x}\lambda_l^ma_{lm}^E+\,_{w}\lambda_l^ma_{lm}^B\right) }
297\f]
298 */
299void mapFromWX(int_4 nlmax, int_4 nmmax,
300 SphericalMap<T>& mapq, SphericalMap<T>& mapu,
301 const Alm<T>& alme, const Alm<T>& almb) const;
302
303/*! synthesis of polarizations following formulae :
304
305\f[
306P^+ = \sum_{m=-mmax}^{mmax} {b_m^+e^{im\varphi} }
307\f]
308\f[
309P^- = \sum_{m=-mmax}^{mmax} {b_m^-e^{im\varphi} }
310\f]
311
312computed by FFT (method fourierSynthesisFromB called by the present one)
313
314with :
315
316\f[
317b_m^+=-\sum_{l=|m|}^{lmax}{\,_{+}\lambda_l^m \left( a_{lm}^E+ia_{lm}^B \right) }
318\f]
319\f[
320b_m^-=-\sum_{l=|m|}^{lmax}{\,_{+}\lambda_l^m \left( a_{lm}^E-ia_{lm}^B \right) }
321\f]
322 */
323
324void mapFromPM(int_4 nlmax, int_4 nmmax,
325 SphericalMap<T>& mapq, SphericalMap<T>& mapu,
326 const Alm<T>& alme, const Alm<T>& almb) const;
327
328
329
330 FFTServerInterface* fftIntfPtr_;
331};
332} // Fin du namespace
333
334
335#endif
Note: See TracBrowser for help on using the repository browser.