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
RevLine 
[729]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
[746]11namespace SOPHYA {
[729]12
13//
14/*! Class for performing analysis and synthesis of sky maps using spin-0 or spin-2 spherical harmonics.
[866]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
[729]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
[866]185 \param<nlmax> : maximum value of the l index
[729]186
[866]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.
[729]188 */
189
190
191Alm<T> DecomposeToAlm(const SphericalMap<T>& map, int_4 nlmax, r_8 cos_theta_cut) const;
[866]192 /*!analysis of a polarization map into Alm coefficients.
[729]193
[866]194 The spheres \c mapq and \c mapu contain respectively the Stokes parameters.
[729]195
[866]196 \c a2lme and \c a2lmb will receive respectively electric and magnetic Alm's
[729]197 nlmax : maximum value of the l index
198
[866]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.
[729]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
[866]206/*!return power spectrum from analysis of a temperature map.
[729]207
[866]208 \param<nlmax> : maximum value of the l index
[729]209
[866]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 */
[729]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 */
[746]230 TVector< complex<T> > CFromFourierAnalysis(int_4 mmax,
[729]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) */
[746]234 TVector< complex<T> > CFromFourierAnalysis(int_4 mmax,
[729]235 const TVector<T> datain,
236 r_8 phi0) const;
237
238 /*!
239Compute polarized Alm's as :
240\f[
[866]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)}
[729]242\f]
243\f[
[866]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)}
[729]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 */
[746]254void almFromWX(int_4 nlmax, int_4 nmmax, r_8 phi0,
[729]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[
[866]261a_{lm}^E=-\frac{1}{2}\sum_{slices}{\omega_{pix}\left(\,_{+}\lambda_l^m\tilde{P^+}+\,_{-}\lambda_l^m\tilde{P^-}\right)}
[729]262\f]
263\f[
[866]264a_{lm}^B=\frac{i}{2}\sum_{slices}{\omega_{pix}\left(\,_{+}\lambda_l^m\tilde{P^+}-\,_{-}\lambda_l^m\tilde{P^-}\right)}
[729]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[
[866]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) }
[729]294\f]
295\f[
[866]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) }
[729]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[
[866]317b_m^+=-\sum_{l=|m|}^{lmax}{\,_{+}\lambda_l^m \left( a_{lm}^E+ia_{lm}^B \right) }
[729]318\f]
319\f[
[866]320b_m^-=-\sum_{l=|m|}^{lmax}{\,_{+}\lambda_l^m \left( a_{lm}^E-ia_{lm}^B \right) }
[729]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};
[746]332} // Fin du namespace
[729]333
334
335#endif
Note: See TracBrowser for help on using the repository browser.