Changeset 1218 in Sophya for trunk/SophyaLib/Samba/sphericaltransformserver.cc
- Timestamp:
- Oct 3, 2000, 2:14:14 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/Samba/sphericaltransformserver.cc
r833 r1218 8 8 #include "nbmath.h" 9 9 10 10 /*! \class SOPHYA::SphericalTransformServer 11 12 Class for performing analysis and synthesis of sky maps using spin-0 or spin-2 spherical harmonics. 13 14 Maps must be SOPHYA SphericalMaps (SphereGorski or SphereThetaPhi). 15 16 Temperature and polarization (Stokes parameters) can be developped on spherical harmonics : 17 \f[ 18 \frac{\Delta T}{T}(\hat{n})=\sum_{lm}a_{lm}^TY_l^m(\hat{n}) 19 \f] 20 \f[ 21 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) 22 \f] 23 \f[ 24 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) 25 \f] 26 \f[ 27 \left(Q \pm iU\right)(\hat{n})=\sum_{lm}a_{\pm 2lm}\, _{\pm 2}Y_l^m(\hat{n}) 28 \f] 29 30 \f[ 31 Y_l^m(\hat{n})=\lambda_l^m(\theta)e^{im\phi} 32 \f] 33 \f[ 34 _{\pm}Y_l^m(\hat{n})=_{\pm}\lambda_l^m(\theta)e^{im\phi} 35 \f] 36 \f[ 37 W_{lm}(\hat{n})=\frac{1}{N_l}\,_{w}\lambda_l^m(\theta)e^{im\phi} 38 \f] 39 \f[ 40 X_{lm}(\hat{n})=\frac{-i}{N_l}\,_{x}\lambda_l^m(\theta)e^{im\phi} 41 \f] 42 43 (see LambdaLMBuilder, LambdaPMBuilder, LambdaWXBuilder classes) 44 45 power spectra : 46 47 \f[ 48 C_l^T=\frac{1}{2l+1}\sum_{m=0}^{+ \infty }\left|a_{lm}^T\right|^2=\langle\left|a_{lm}^T\right|^2\rangle 49 \f] 50 \f[ 51 C_l^E=\frac{1}{2l+1}\sum_{m=0}^{+\infty}\left|a_{lm}^E\right|^2=\langle\left|a_{lm}^E\right|^2\rangle 52 \f] 53 \f[ 54 C_l^B=\frac{1}{2l+1}\sum_{m=0}^{+\infty}\left|a_{lm}^B\right|^2=\langle\left|a_{lm}^B\right|^2\rangle 55 \f] 56 57 \arg 58 \b Synthesis : Get temperature and polarization maps from \f$a_{lm}\f$ coefficients or from power spectra, (methods GenerateFrom...). 59 60 \b Temperature: 61 \f[ 62 \frac{\Delta T}{T}(\hat{n})=\sum_{lm}a_{lm}^TY_l^m(\hat{n}) = \sum_{-\infty}^{+\infty}b_m(\theta)e^{im\phi} 63 \f] 64 65 with 66 \f[ 67 b_m(\theta)=\sum_{l=\left|m\right|}^{+\infty}a_{lm}^T\lambda_l^m(\theta) 68 \f] 69 70 \b Polarisation 71 \f[ 72 Q \pm iU = \sum_{-\infty}^{+\infty}b_m^{\pm}(\theta)e^{im\phi} 73 \f] 74 75 where : 76 \f[ 77 b_m^{\pm}(\theta) = \sum_{l=\left|m\right|}^{+\infty}a_{\pm 2lm}\,_{\pm}\lambda_l^m(\theta) 78 \f] 79 80 or : 81 \f[ 82 Q = \sum_{-\infty}^{+\infty}b_m^{Q}(\theta)e^{im\phi} 83 \f] 84 \f[ 85 U = \sum_{-\infty}^{+\infty}b_m^{U}(\theta)e^{im\phi} 86 \f] 87 88 where: 89 \f[ 90 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) 91 \f] 92 \f[ 93 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) 94 \f] 95 96 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. 97 98 99 \arg 100 \b Analysis : Get \f$a_{lm}\f$ coefficients or power spectra from temperature and polarization maps (methods DecomposeTo...). 101 102 \b Temperature: 103 \f[ 104 a_{lm}^T=\int\frac{\Delta T}{T}(\hat{n})Y_l^{m*}(\hat{n})d\hat{n} 105 \f] 106 107 approximated as : 108 \f[ 109 a_{lm}^T=\sum_{\theta_k}\omega_kC_m(\theta_k)\lambda_l^m(\theta_k) 110 \f] 111 where : 112 \f[ 113 C_m (\theta _k)=\sum_{\phi _{k\prime}}\frac{\Delta T}{T}(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}} 114 \f] 115 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. 116 117 \b polarisation: 118 119 \f[ 120 a_{\pm 2lm}=\sum_{\theta_k}\omega_kC_m^{\pm}(\theta_k)\,_{\pm}\lambda_l^m(\theta_k) 121 \f] 122 where : 123 \f[ 124 C_m^{\pm} (\theta _k)=\sum_{\phi _{k\prime}}\left(Q \pm iU\right)(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}} 125 \f] 126 or : 127 128 \f[ 129 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) 130 \f] 131 \f[ 132 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) 133 \f] 134 135 where : 136 \f[ 137 C_m^{Q} (\theta _k)=\sum_{\phi _{k\prime}}Q(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}} 138 \f] 139 \f[ 140 C_m^{U} (\theta _k)=\sum_{\phi _{k\prime}}U(\theta _k,\phi_{k\prime})e^{-im\phi _{k\prime}} 141 \f] 142 143 */ 144 145 /*! \fn void SOPHYA::SphericalTransformServer::GenerateFromAlm( SphericalMap<T>& map, int_4 pixelSizeIndex, const Alm<T>& alm) const 146 147 synthesis of a temperature map from Alm coefficients 148 */ 11 149 template<class T> 12 150 void SphericalTransformServer<T>::GenerateFromAlm( SphericalMap<T>& map, int_4 pixelSizeIndex, const Alm<T>& alm) const … … 125 263 126 264 265 /*! \fn TVector< complex<T> > SOPHYA::SphericalTransformServer::fourierSynthesisFromB(const Bm<complex<T> >& b_m, int_4 nph, r_8 phi0) const 266 267 \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) 268 269 The object b_m (\f$b_m\f$) of the class Bm is a special vector which index goes from -mmax to mmax. 270 */ 127 271 template<class T> 128 272 TVector< complex<T> > SphericalTransformServer<T>::fourierSynthesisFromB(const Bm<complex<T> >& b_m, int_4 nph, r_8 phi0) const … … 205 349 206 350 //******************************************** 351 /*! \fn TVector<T> SOPHYA::SphericalTransformServer::RfourierSynthesisFromB(const Bm<complex<T> >& b_m, int_4 nph, r_8 phi0) const 352 353 same as fourierSynthesisFromB, but return a real vector, taking into account the fact that b(-m) is conjugate of b(m) */ 207 354 template<class T> 208 355 TVector<T> SphericalTransformServer<T>::RfourierSynthesisFromB(const Bm<complex<T> >& b_m, int_4 nph, r_8 phi0) const … … 285 432 //******************************************* 286 433 434 /*! \fn Alm<T> SOPHYA::SphericalTransformServer::DecomposeToAlm(const SphericalMap<T>& map, int_4 nlmax, r_8 cos_theta_cut) const 435 436 \return the Alm coefficients from analysis of a temperature map. 437 438 \param<nlmax> : maximum value of the l index 439 440 \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. 441 */ 287 442 template<class T> 288 443 Alm<T> SphericalTransformServer<T>::DecomposeToAlm(const SphericalMap<T>& map, int_4 nlmax, r_8 cos_theta_cut) const … … 346 501 return alm; 347 502 } 503 /*! \fn TVector< complex<T> > SOPHYA::SphericalTransformServer::CFromFourierAnalysis(int_4 nmmax, const TVector<complex<T> >datain, r_8 phi0) const 504 505 \return a vector with mmax elements which are sums : 506 \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. 507 */ 348 508 template<class T> 349 509 TVector< complex<T> > SphericalTransformServer<T>::CFromFourierAnalysis(int_4 nmmax, const TVector<complex<T> >datain, r_8 phi0) const … … 384 544 385 545 //&&&&&&&&& nouvelle version 546 /* \fn TVector< complex<T> > SOPHYA::SphericalTransformServer::CFromFourierAnalysis(int_4 nmmax, const TVector<T> datain, r_8 phi0) const 547 548 same as previous one, but with a "datain" which is real (not complex) */ 386 549 template<class T> 387 550 TVector< complex<T> > SphericalTransformServer<T>::CFromFourierAnalysis(int_4 nmmax, const TVector<T> datain, r_8 phi0) const … … 445 608 } 446 609 610 /*! \fn void SOPHYA::SphericalTransformServer::GenerateFromAlm(SphericalMap<T>& mapq, 611 SphericalMap<T>& mapu, 612 int_4 pixelSizeIndex, 613 const Alm<T>& alme, 614 const Alm<T>& almb) const 615 616 synthesis of a polarization map from Alm coefficients. The spheres mapq and mapu contain respectively the Stokes parameters. */ 447 617 template<class T> 448 618 void SphericalTransformServer<T>::GenerateFromAlm(SphericalMap<T>& mapq, … … 521 691 522 692 693 /*! \fn void SOPHYA::SphericalTransformServer::DecomposeToAlm(const SphericalMap<T>& mapq, 694 const SphericalMap<T>& mapu, 695 Alm<T>& alme, 696 Alm<T>& almb, 697 int_4 nlmax, 698 r_8 cos_theta_cut) const 699 700 analysis of a polarization map into Alm coefficients. 701 702 The spheres \c mapq and \c mapu contain respectively the Stokes parameters. 703 704 \c a2lme and \c a2lmb will receive respectively electric and magnetic Alm's 705 nlmax : maximum value of the l index 706 707 \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. 708 */ 523 709 template<class T> 524 710 void SphericalTransformServer<T>::DecomposeToAlm(const SphericalMap<T>& mapq, … … 578 764 579 765 766 /*! \fn void SOPHYA::SphericalTransformServer::almFromWX(int_4 nlmax, int_4 nmmax, 767 r_8 phi0, r_8 domega, 768 r_8 theta, 769 const TVector<T>& dataq, 770 const TVector<T>& datau, 771 Alm<T>& alme, 772 Alm<T>& almb) const 773 774 Compute polarized Alm's as : 775 \f[ 776 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)} 777 \f] 778 \f[ 779 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)} 780 \f] 781 782 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. 783 784 \f$\omega_{pix}\f$ are solid angle of each pixel. 785 786 dataq, datau : Stokes parameters. 787 788 */ 580 789 template<class T> 581 790 void SphericalTransformServer<T>::almFromWX(int_4 nlmax, int_4 nmmax, … … 628 837 629 838 630 template<class T> 631 void SphericalTransformServer<T>::almFromPM(int_4 nph, int_4 nlmax, int_4 nmmax, 839 /*! \fn void SOPHYA::SphericalTransformServer::almFromPM(int_4 nph, int_4 nlmax, 840 int_4 nmmax, 841 r_8 phi0, r_8 domega, 842 r_8 theta, 843 const TVector<T>& dataq, 844 const TVector<T>& datau, 845 Alm<T>& alme, 846 Alm<T>& almb) const 847 848 Compute polarized Alm's as : 849 \f[ 850 a_{lm}^E=-\frac{1}{2}\sum_{slices}{\omega_{pix}\left(\,_{+}\lambda_l^m\tilde{P^+}+\,_{-}\lambda_l^m\tilde{P^-}\right)} 851 \f] 852 \f[ 853 a_{lm}^B=\frac{i}{2}\sum_{slices}{\omega_{pix}\left(\,_{+}\lambda_l^m\tilde{P^+}-\,_{-}\lambda_l^m\tilde{P^-}\right)} 854 \f] 855 856 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$ . 857 858 \f$\omega_{pix}\f$ are solid angle of each pixel. 859 860 dataq, datau : Stokes parameters. 861 862 */ 863 template<class T> 864 void SphericalTransformServer<T>::almFromPM(int_4 nph, int_4 nlmax, 865 int_4 nmmax, 632 866 r_8 phi0, r_8 domega, 633 867 r_8 theta, … … 673 907 674 908 909 /*! \fn void SOPHYA::SphericalTransformServer::mapFromWX(int_4 nlmax, int_4 nmmax, 910 SphericalMap<T>& mapq, 911 SphericalMap<T>& mapu, 912 const Alm<T>& alme, 913 const Alm<T>& almb) const 914 915 synthesis of Stokes parameters following formulae : 916 917 \f[ 918 Q=\sum_{m=-mmax}^{mmax}b_m^qe^{im\varphi} 919 \f] 920 \f[ 921 U=\sum_{m=-mmax}^{mmax}b_m^ue^{im\varphi} 922 \f] 923 924 computed by FFT (method fourierSynthesisFromB called by the present one) 925 926 with : 927 928 \f[ 929 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) } 930 \f] 931 \f[ 932 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) } 933 \f] 934 */ 675 935 template<class T> 676 936 void SphericalTransformServer<T>::mapFromWX(int_4 nlmax, int_4 nmmax, … … 744 1004 } 745 1005 } 1006 /*! \fn void SOPHYA::SphericalTransformServer::mapFromPM(int_4 nlmax, int_4 nmmax, 1007 SphericalMap<T>& mapq, 1008 SphericalMap<T>& mapu, 1009 const Alm<T>& alme, 1010 const Alm<T>& almb) const 1011 1012 synthesis of polarizations following formulae : 1013 1014 \f[ 1015 P^+ = \sum_{m=-mmax}^{mmax} {b_m^+e^{im\varphi} } 1016 \f] 1017 \f[ 1018 P^- = \sum_{m=-mmax}^{mmax} {b_m^-e^{im\varphi} } 1019 \f] 1020 1021 computed by FFT (method fourierSynthesisFromB called by the present one) 1022 1023 with : 1024 1025 \f[ 1026 b_m^+=-\sum_{l=|m|}^{lmax}{\,_{+}\lambda_l^m \left( a_{lm}^E+ia_{lm}^B \right) } 1027 \f] 1028 \f[ 1029 b_m^-=-\sum_{l=|m|}^{lmax}{\,_{+}\lambda_l^m \left( a_{lm}^E-ia_{lm}^B \right) } 1030 \f] 1031 */ 746 1032 template<class T> 747 1033 void SphericalTransformServer<T>::mapFromPM(int_4 nlmax, int_4 nmmax, … … 809 1095 810 1096 1097 /*! \fn void SOPHYA::SphericalTransformServer::GenerateFromCl(SphericalMap<T>& sphq, 1098 SphericalMap<T>& sphu, 1099 int_4 pixelSizeIndex, 1100 const TVector<T>& Cle, 1101 const TVector<T>& Clb, 1102 const r_8 fwhm) const 1103 1104 synthesis of a polarization map from power spectra electric-Cl and magnetic-Cl (Alm's are generated randomly, following a gaussian distribution). 1105 \param fwhm FWHM in arcmin for random generation of Alm's (eg. 5) 1106 */ 811 1107 template<class T> 812 1108 void SphericalTransformServer<T>::GenerateFromCl(SphericalMap<T>& sphq, … … 833 1129 GenerateFromAlm(sphq,sphu,pixelSizeIndex,a2lme,a2lmb); 834 1130 } 1131 /*! \fn void SOPHYA::SphericalTransformServer::GenerateFromCl(SphericalMap<T>& sph, 1132 int_4 pixelSizeIndex, 1133 const TVector<T>& Cl, 1134 const r_8 fwhm) const 1135 1136 synthesis of a temperature map from power spectrum Cl (Alm's are generated randomly, following a gaussian distribution). */ 835 1137 template<class T> 836 1138 void SphericalTransformServer<T>::GenerateFromCl(SphericalMap<T>& sph, … … 846 1148 847 1149 1150 /*! \fn TVector<T> SOPHYA::SphericalTransformServer::DecomposeToCl(const SphericalMap<T>& sph, int_4 nlmax, r_8 cos_theta_cut) const 1151 1152 \return power spectrum from analysis of a temperature map. 1153 1154 \param<nlmax> : maximum value of the l index 1155 1156 \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. 1157 */ 848 1158 template <class T> 849 1159 TVector<T> SphericalTransformServer<T>::DecomposeToCl(const SphericalMap<T>& sph, int_4 nlmax, r_8 cos_theta_cut) const
Note:
See TracChangeset
for help on using the changeset viewer.