Changeset 1218 in Sophya for trunk/SophyaLib/Samba/sphericaltransformserver.h
- Timestamp:
- Oct 3, 2000, 2:14:14 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/Samba/sphericaltransformserver.h
r866 r1218 11 11 namespace SOPHYA { 12 12 13 //14 /*! Class for performing analysis and synthesis of sky maps using spin-0 or spin-2 spherical harmonics.15 13 16 Maps must be SOPHYA SphericalMaps (SphereGorski or SphereThetaPhi).17 18 Temperature 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[23 Q(\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[26 U(\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[33 Y_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[39 W_{lm}(\hat{n})=\frac{1}{N_l}\,_{w}\lambda_l^m(\theta)e^{im\phi}40 \f]41 \f[42 X_{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 47 power spectra :48 49 \f[50 C_l^T=\frac{1}{2l+1}\sum_{m=0}^{+ \infty }\left|a_{lm}^T\right|^2=\langle\left|a_{lm}^T\right|^2\rangle51 \f]52 \f[53 C_l^E=\frac{1}{2l+1}\sum_{m=0}^{+\infty}\left|a_{lm}^E\right|^2=\langle\left|a_{lm}^E\right|^2\rangle54 \f]55 \f[56 C_l^B=\frac{1}{2l+1}\sum_{m=0}^{+\infty}\left|a_{lm}^B\right|^2=\langle\left|a_{lm}^B\right|^2\rangle57 \f]58 59 \arg60 \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 67 with68 \f[69 b_m(\theta)=\sum_{l=\left|m\right|}^{+\infty}a_{lm}^T\lambda_l^m(\theta)70 \f]71 72 \b Polarisation73 \f[74 Q \pm iU = \sum_{-\infty}^{+\infty}b_m^{\pm}(\theta)e^{im\phi}75 \f]76 77 where :78 \f[79 b_m^{\pm}(\theta) = \sum_{l=\left|m\right|}^{+\infty}a_{\pm 2lm}\,_{\pm}\lambda_l^m(\theta)80 \f]81 82 or :83 \f[84 Q = \sum_{-\infty}^{+\infty}b_m^{Q}(\theta)e^{im\phi}85 \f]86 \f[87 U = \sum_{-\infty}^{+\infty}b_m^{U}(\theta)e^{im\phi}88 \f]89 90 where:91 \f[92 b_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[95 b_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 98 Since 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 \arg102 \b Analysis : Get \f$a_{lm}\f$ coefficients or power spectra from temperature and polarization maps (methods DecomposeTo...).103 104 \b Temperature:105 \f[106 a_{lm}^T=\int\frac{\Delta T}{T}(\hat{n})Y_l^{m*}(\hat{n})d\hat{n}107 \f]108 109 approximated as :110 \f[111 a_{lm}^T=\sum_{\theta_k}\omega_kC_m(\theta_k)\lambda_l^m(\theta_k)112 \f]113 where :114 \f[115 C_m (\theta _k)=\sum_{\phi _{k\prime}}\frac{\Delta T}{T}(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}}116 \f]117 Since 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[122 a_{\pm 2lm}=\sum_{\theta_k}\omega_kC_m^{\pm}(\theta_k)\,_{\pm}\lambda_l^m(\theta_k)123 \f]124 where :125 \f[126 C_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]128 or :129 130 \f[131 a_{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[134 a_{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 137 where :138 \f[139 C_m^{Q} (\theta _k)=\sum_{\phi _{k\prime}}Q(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}}140 \f]141 \f[142 C_m^{U} (\theta _k)=\sum_{\phi _{k\prime}}U(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}}143 \f]144 145 */146 14 template <class T> 147 15 class SphericalTransformServer … … 150 18 public: 151 19 152 SphericalTransformServer() 153 { 154 fftIntfPtr_=new FFTPackServer; 155 fftIntfPtr_->setNormalize(false); 156 }; 157 ~SphericalTransformServer(){ if (fftIntfPtr_!=NULL) delete fftIntfPtr_;}; 158 /*! 20 SphericalTransformServer() 21 { 22 fftIntfPtr_=new FFTPackServer; 23 fftIntfPtr_->setNormalize(false); 24 }; 25 ~SphericalTransformServer(){ if (fftIntfPtr_!=NULL) delete fftIntfPtr_;}; 26 27 /*! 159 28 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 29 */ 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; 30 void SetFFTServer(FFTServerInterface* srv=NULL) 31 { 32 if (fftIntfPtr_!=NULL) delete fftIntfPtr_; 33 fftIntfPtr_=srv; 34 fftIntfPtr_->setNormalize(false); 35 } 171 36 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, 37 void GenerateFromAlm( SphericalMap<T>& map, int_4 pixelSizeIndex, const Alm<T>& alm) const; 38 void GenerateFromAlm(SphericalMap<T>& mapq, SphericalMap<T>& mapu, int_4 pixelSizeIndex, const Alm<T>& alme, const Alm<T>& almb) const; 39 40 void GenerateFromCl(SphericalMap<T>& sph, int_4 pixelSizeIndex, 174 41 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, 42 void GenerateFromCl(SphericalMap<T>& sphq, SphericalMap<T>& sphu, 180 43 int_4 pixelSizeIndex, 181 44 const TVector<T>& Cle, const TVector<T>& Clb, 182 45 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 index186 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 46 190 47 191 Alm<T> DecomposeToAlm(const SphericalMap<T>& map, int_4 nlmax, r_8 cos_theta_cut) const; 192 /*!analysis of a polarization map into Alm coefficients. 48 Alm<T> DecomposeToAlm(const SphericalMap<T>& map, int_4 nlmax, r_8 cos_theta_cut) const; 193 49 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, 50 void DecomposeToAlm(const SphericalMap<T>& mapq, const SphericalMap<T>& mapu, 203 51 Alm<T>& a2lme, Alm<T>& a2lmb, 204 52 int_4 nlmax, r_8 cos_theta_cut) const; 205 53 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, 54 TVector<T> DecomposeToCl(const SphericalMap<T>& sph, 213 55 int_4 nlmax, r_8 cos_theta_cut) const; 214 56 215 57 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, 58 private: 59 TVector< complex<T> > fourierSynthesisFromB(const Bm<complex<T> >& b_m, 222 60 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, 61 TVector<T> RfourierSynthesisFromB(const Bm<complex<T> >& b_m, 225 62 int_4 nph, r_8 phi0) const; 226 63 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, 64 TVector< complex<T> > CFromFourierAnalysis(int_4 mmax, 231 65 const TVector<complex<T> > datain, 232 66 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, 67 TVector< complex<T> > CFromFourierAnalysis(int_4 mmax, 235 68 const TVector<T> datain, 236 69 r_8 phi0) const; 237 70 238 /*! 239 Compute polarized Alm's as : 240 \f[ 241 a_{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[ 244 a_{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 247 where \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 251 dataq, datau : Stokes parameters. 252 253 */ 254 void almFromWX(int_4 nlmax, int_4 nmmax, r_8 phi0, 71 void almFromWX(int_4 nlmax, int_4 nmmax, r_8 phi0, 255 72 r_8 domega, r_8 theta, 256 73 const TVector<T>& dataq, const TVector<T>& datau, 257 74 Alm<T>& alme, Alm<T>& almb) const; 258 /*! 259 Compute polarized Alm's as : 260 \f[ 261 a_{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[ 264 a_{lm}^B=\frac{i}{2}\sum_{slices}{\omega_{pix}\left(\,_{+}\lambda_l^m\tilde{P^+}-\,_{-}\lambda_l^m\tilde{P^-}\right)} 265 \f] 266 267 where \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 271 dataq, datau : Stokes parameters. 272 273 */ 274 void almFromPM(int_4 nph, int_4 nlmax, int_4 nmmax, 75 void almFromPM(int_4 nph, int_4 nlmax, int_4 nmmax, 275 76 r_8 phi0, r_8 domega, r_8 theta, 276 77 const TVector<T>& dataq, const TVector<T>& datau, 277 78 Alm<T>& alme, Alm<T>& almb) const; 278 79 279 /*! synthesis of Stokes parameters following formulae : 280 281 \f[ 282 Q=\sum_{m=-mmax}^{mmax}b_m^qe^{im\varphi} 283 \f] 284 \f[ 285 U=\sum_{m=-mmax}^{mmax}b_m^ue^{im\varphi} 286 \f] 287 288 computed by FFT (method fourierSynthesisFromB called by the present one) 289 290 with : 291 292 \f[ 293 b_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[ 296 b_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 */ 299 void mapFromWX(int_4 nlmax, int_4 nmmax, 80 void mapFromWX(int_4 nlmax, int_4 nmmax, 300 81 SphericalMap<T>& mapq, SphericalMap<T>& mapu, 301 82 const Alm<T>& alme, const Alm<T>& almb) const; 302 83 303 /*! synthesis of polarizations following formulae :304 84 305 \f[ 306 P^+ = \sum_{m=-mmax}^{mmax} {b_m^+e^{im\varphi} } 307 \f] 308 \f[ 309 P^- = \sum_{m=-mmax}^{mmax} {b_m^-e^{im\varphi} } 310 \f] 311 312 computed by FFT (method fourierSynthesisFromB called by the present one) 313 314 with : 315 316 \f[ 317 b_m^+=-\sum_{l=|m|}^{lmax}{\,_{+}\lambda_l^m \left( a_{lm}^E+ia_{lm}^B \right) } 318 \f] 319 \f[ 320 b_m^-=-\sum_{l=|m|}^{lmax}{\,_{+}\lambda_l^m \left( a_{lm}^E-ia_{lm}^B \right) } 321 \f] 322 */ 323 324 void mapFromPM(int_4 nlmax, int_4 nmmax, 85 void mapFromPM(int_4 nlmax, int_4 nmmax, 325 86 SphericalMap<T>& mapq, SphericalMap<T>& mapu, 326 87 const Alm<T>& alme, const Alm<T>& almb) const;
Note:
See TracChangeset
for help on using the changeset viewer.