source: Sophya/trunk/SophyaLib/Samba/spheregorski.h@ 470

Last change on this file since 470 was 470, checked in by ansari, 26 years ago

versions templatees, NdataBlocks etc. 15-OCT-99-GLM

File size: 5.7 KB
Line 
1#ifndef SPHEREGORSKI_SEEN
2#define SPHEREGORSKI_SEEN
3
4#include "sphericalmap.h"
5#include "tvector.h"
6#include "ndatablock.h"
7
8#include "anydataobj.h"
9#include "ppersist.h"
10
11// les attributs de classe pix2x_ et pix2y_ sont relatifs a la traduction des
12// indices RING en indices NESTED (ou l inverse). Ce sont des tableaux
13// d'entiers initialises et remplis par le constructeur. Dans la version
14// FORTRAN de healpix, il s'agissait de tableaux mis en COMMON. Ils etaient
15// initialises au premier appel d'une conversion d indice. Je ne peux pas
16// garder cette procedure car, par exemple, la fonction PixValNest() const
17// n'autorisera pas la constitution de ces tableaux (a cause du const). Ainsi,
18// des la creation d un objet SphereGorski ces tableaux sont calcules, ce qui
19// est, certes, inutile si on ne se sert pas des indices NESTED. Ca ne me
20// rejouit pas, mais c est le seul moyen que j ai trouve pour temir compte de
21// toutes les demandes et des options prises.
22//
23// G. Le Meur
24
25// ***************** CLASSE SphereGorski *****************************
26
27template<class T>
28class SphereGorski : public SphericalMap<T>, public AnyDataObj
29{
30
31public :
32
33SphereGorski();
34SphereGorski(int_4 m);
35SphereGorski(const SphereGorski<T>& s);
36virtual ~SphereGorski();
37
38// ------------------ Definition of PixelMap abstract methods
39
40/* Nombre de pixels du decoupage */
41virtual int_4 NbPixels() const;
42inline void setNbPixels(int_4 n) {nPix_= n;}
43
44/* Valeur du contenu du pixel d'indice "RING" k */
45virtual T& PixVal(int_4 k);
46virtual T const& PixVal(int_4 k) const;
47
48/* Nombre de tranches en theta */
49int_4 NbThetaSlices() const;
50void GetThetaSlice(int_4 index,r_4& theta,TVector<float>& phi,TVector<T>& value) const;
51
52/* Indice "RING" du pixel vers lequel pointe une direction definie par
53ses coordonnees spheriques */
54virtual int_4 PixIndexSph(float theta, float phi) const;
55
56/* Coordonnees spheriques du milieu du pixel d'indice "RING" k */
57virtual void PixThetaPhi(int_4 k, float& teta, float& phi) const;
58
59/* Pixel Solid angle (steradians) */
60virtual r_8 PixSolAngle(int_4 dummy) const;
61inline void setPixSolAngle(r_8 x) {omeg_= x;}
62
63// --------------- Specific methods
64
65virtual void Resize(int_4 m);
66
67inline virtual char* TypeOfMap() const {return "RING";};
68
69/* Valeur du contenu du pixel d'indice "NEST" k */
70virtual T& PixValNest(int_4 k);
71virtual T const& PixValNest(int_4 k) const;
72
73/* Indice "NEST" du pixel vers lequel pointe une direction definie par
74ses coordonnees spheriques */
75virtual int_4 PixIndexSphNest(float theta, float phi) const;
76
77/* Coordonnees spheriques du milieu du pixel d'indice "NEST" k */
78virtual void PixThetaPhiNest(int_4 k, float& teta, float& phi) const;
79
80/* algorithme de pixelisation */
81void Pixelize(int_4);
82
83/* convertit index nested en ring */
84int_4 NestToRing(int_4 ) const;
85
86/* convertit index ring en nested" */
87int_4 RingToNest(int_4 ) const;
88
89/* analyse en harmoniques spheriques des valeurs des pixels de la
90 sphere : appel du module anafast (Gorski-Hivon) */
91//void anharm(int, float, float*);
92
93/*synthese des valeurs des pixels de la sphere par l'intermediaire
94 des coefficients en harmoniques spheriques reconstitues apartir d'un
95 spectre en puissance : appel du module synfast (Gorski-Hivon) */
96//void synharm(int, int, float, float*);
97
98/* retourne/fixe la valeur du parametre Gorski */
99inline virtual int_4 SizeIndex() const {return(nSide_);}
100inline void setSizeIndex(int_4 n) {nSide_= n;}
101
102/* retourne les pointeurs /remplit les tableaux */
103inline const NDataBlock<T>* getDataBlock() const { return (&pixels_); }
104inline void setDataBlock(T* data, int_4 m) { pixels_.FillFrom(m,data); }
105
106/* retourne/fixe les parametres des modules anafast et synfast */
107void getParafast(int_4& nlmax,int_4& nmmax,int_4& iseed,float& fwhm,float& quadr,float& cut) const;
108void setParafast(int_4 nlmax,int_4 nmmax,int_4 iseed,float fwhm,float quadr,float cut,char* filename);
109
110/* retourne/fixe le nom du fichier qui contient le spectre de puissance */
111void powfile(char filename[]) const;
112
113/* impression */
114void print(ostream& os) const;
115
116private :
117
118// ------------- méthodes internes ----------------------
119void InitNul();
120
121int nest2ring(int nside, int ipnest) const;
122int ring2nest(int nside, int ipring) const;
123
124int ang2pix_ring(int nside, double theta, double phi) const;
125int ang2pix_nest(int nside, double theta, double phi) const;
126void pix2ang_ring(int nside, int ipix, double& theta, double& phi) const;
127void pix2ang_nest(int nside, int ipix, double& theta, double& phi) const;
128
129// ------------- variables internes -----------------------
130int_4 nSide_;
131int_4 nPix_;
132r_8 omeg_;
133
134NDataBlock<T> pixels_;
135
136int nlmax_;
137int nmmax_;
138int iseed_;
139float fwhm_;
140float quadrupole_;
141float sym_cut_deg_;
142char powFile_[128];
143};
144
145//
146// ------------- Classe pour la gestion de persistance --
147//
148template <class T>
149class FIO_SphereGorski : public PPersist
150{
151public:
152
153FIO_SphereGorski();
154FIO_SphereGorski(string const & filename);
155FIO_SphereGorski(const SphereGorski<T>& obj);
156FIO_SphereGorski(SphereGorski<T>* obj);
157virtual ~FIO_SphereGorski();
158virtual AnyDataObj* DataObj();
159inline operator SphereGorski<T>() { return(*dobj); }
160inline SphereGorski<T> getObj() { return(*dobj); }
161
162protected :
163
164virtual void ReadSelf(PInPersist&);
165virtual void WriteSelf(POutPersist&) const;
166SphereGorski<T>* dobj;
167bool ownobj;
168};
169
170//
171// ------------- Classe PIXELS_XY -----------------------
172//
173class PIXELS_XY
174{
175
176public :
177
178static PIXELS_XY& instance();
179
180NDataBlock<int> pix2x_;
181NDataBlock<int> pix2y_;
182NDataBlock<int> x2pix_;
183NDataBlock<int> y2pix_;
184
185private :
186
187PIXELS_XY();
188void mk_pix2xy();
189void mk_xy2pix();
190};
191#endif
Note: See TracBrowser for help on using the repository browser.