source: Sophya/trunk/SophyaLib/SkyMap/spherehealpix.h@ 843

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

changement de nom gorski->healpix

File size: 7.3 KB
Line 
1#ifndef SPHEREHEALPIX_SEEN
2#define SPHEREHEALPIX_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
12namespace SOPHYA {
13
14
15// ***************** CLASSE SphereHealpix *****************************
16
17//! class SphereHealpix
18/*!
19 Pixelisation Gorski
20
21
22 -----------------------------------------------------------------------
23 version 0.8.2 Aug97 TAC Eric Hivon, Kris Gorski
24 -----------------------------------------------------------------------
25
26 the sphere is split in 12 diamond-faces containing nside**2 pixels each
27
28 the numbering of the pixels (in the nested scheme) is similar to
29 quad-cube
30 In each face the first pixel is in the lowest corner of the diamond
31
32 the faces are (x,y) coordinate on each face
33\verbatim
34 . . . . <--- North Pole
35 / \ / \ / \ / \ ^ ^
36 . 0 . 1 . 2 . 3 . <--- z = 2/3 \ /
37 \ / \ / \ / \ / y \ / x
38 4 . 5 . 6 . 7 . 4 <--- equator \ /
39 / \ / \ / \ / \ \/
40 . 8 . 9 .10 .11 . <--- z = -2/3 (0,0) : lowest corner
41 \ / \ / \ / \ /
42 . . . . <--- South Pole
43\endverbatim
44 phi:0 2Pi
45
46 in the ring scheme pixels are numbered along the parallels
47 the first parallel is the one closest to the north pole and so on
48 on each parallel, pixels are numbered starting from the one closest
49 to phi = 0
50
51 nside MUST be a power of 2 (<= 8192)
52
53*/
54
55
56template<class T>
57class FIO_SphereHealpix;
58
59template<class T>
60class FITS_SphereHealpix;
61
62template<class T>
63class SphereHealpix : public SphericalMap<T>
64{
65
66
67 friend class FIO_SphereHealpix<T>;
68 friend class FITS_SphereHealpix<T>;
69
70public :
71
72SphereHealpix();
73/*!
74 m is the "nside" of the Gorski algorithm
75
76 The total number of pixels will be Npix = 12*nside**2
77
78 nside MUST be a power of 2 (<= 8192)
79*/
80SphereHealpix(int_4 m);
81SphereHealpix(const SphereHealpix<T>& s, bool share=false);
82//! Destructor
83virtual ~SphereHealpix();
84
85/*! Setting blockdata to temporary (see ndatablock documentation) */
86inline virtual void SetTemp(bool temp=false) const
87 {
88 pixels_.SetTemp(temp);
89 sliceBeginIndex_.SetTemp(temp);
90 sliceLenght_.SetTemp(temp);
91 };
92// ------------------ Definition of PixelMap abstract methods
93
94/* Nombre de pixels du decoupage */
95/*! Return number of pixels of the splitting */
96virtual int_4 NbPixels() const;
97
98/* Valeur du contenu du pixel d'indice "RING" k */
99/*! Return value of pixel with "RING" index k */
100virtual T& PixVal(int_4 k);
101virtual T const& PixVal(int_4 k) const;
102
103/* Nombre de tranches en theta */
104/*! Return number of slices in theta direction on the sphere */
105uint_4 NbThetaSlices() const;
106/*! For a theta-slice with index 'index', return :
107
108 the corresponding "theta"
109
110 a vector containing the phi's of the pixels of the slice
111
112 a vector containing the corresponding values of pixels
113*/
114virtual void GetThetaSlice(int_4 index,r_8& theta,TVector<r_8>& phi,TVector<T>& value) const;
115/*! For a theta-slice with index 'index', return :
116
117 the corresponding "theta"
118
119 the corresponding "phi" for first pixel of the slice
120
121 a vector containing indices of the pixels of the slice
122
123 (equally distributed in phi)
124
125 a vector containing the corresponding values of pixels
126*/
127virtual void GetThetaSlice(int_4 sliceIndex,r_8& theta, r_8& phi0, TVector<int_4>& pixelIndices,TVector<T>& value) const ;
128
129/* Return true if teta,phi in map */
130virtual bool ContainsSph(double theta, double phi) const;
131/* Indice "RING" du pixel vers lequel pointe une direction definie par
132ses coordonnees spheriques */
133/*! Return "RING" index of the pixel corresponding to direction (theta, phi).
134 */
135virtual int_4 PixIndexSph(double theta,double phi) const;
136
137/* Coordonnees spheriques du milieu du pixel d'indice "RING" k */
138virtual void PixThetaPhi(int_4 k,double& theta,double& phi) const;
139
140/*! Set all pixels to value v */
141virtual T SetPixels(T v);
142
143/* Pixel Solid angle (steradians) */
144/*! Pixel Solid angle (steradians)
145
146 All the pixels have the same solid angle. The dummy argument is
147 for compatibility with eventual pixelizations which would not
148 fulfil this requirement.
149*/
150virtual double PixSolAngle(int_4 dummy=0) const;
151
152/* Acces to the DataBlock */
153inline NDataBlock<T>& DataBlock() {return pixels_;}
154inline const NDataBlock<T>& DataBlock() const {return pixels_;}
155
156// --------------- Specific methods
157
158/*!
159 m is the "nside" of the Gorski algorithm
160
161 The total number of pixels will be Npix = 12*nside**2
162
163 nside MUST be a power of 2 (<= 8192)
164*/
165virtual void Resize(int_4 m);
166
167// pour l'instant le tableau est ordonne selon RING, uniquement
168inline virtual char* TypeOfMap() const {return "RING";};
169
170
171/* Valeur du contenu du pixel d'indice "NEST" k */
172/*! Return value of pixel with "NESTED" index k */
173virtual T& PixValNest(int_4 k);
174/*! Return value of pixel with "NESTED" index k */
175virtual T const& PixValNest(int_4 k) const;
176
177/* Indice "NEST" du pixel vers lequel pointe une direction definie par
178ses coordonnees spheriques */
179/*! Return "NESTED" index of the pixel corresponding to direction (theta, phi).
180 */
181virtual int_4 PixIndexSphNest(double theta,double phi) const;
182
183/* Coordonnees spheriques du milieu du pixel d'indice "NEST" k */
184/*! Return (theta,phi) coordinates of middle of pixel with "NESTED" index k
185 */
186virtual void PixThetaPhiNest(int_4 k,double& theta,double& phi) const;
187
188/* algorithme de pixelisation */
189void Pixelize(int_4);
190
191/* convertit index nested en ring */
192/*! translation from NESTED index into RING index */
193int_4 NestToRing(int_4) const;
194
195/* convertit index ring en nested" */
196/*! translation from RING index into NESTED index */
197int_4 RingToNest(int_4) const;
198
199
200/* retourne la valeur du parametre Gorski */
201inline virtual int_4 SizeIndex() const {return(nSide_);}
202
203/* impression */
204void print(ostream& os) const;
205
206private :
207
208// ------------- méthodes internes ----------------------
209void InitNul();
210void SetThetaSlices();
211
212int_4 nest2ring(int_4 nside,int_4 ipnest) const;
213int_4 ring2nest(int_4 nside,int_4 ipring) const;
214
215int_4 ang2pix_ring(int_4 nside,double theta,double phi) const;
216int_4 ang2pix_nest(int_4 nside,double theta,double phi) const;
217void pix2ang_ring(int_4 nside,int_4 ipix,double& theta,double& phi) const;
218void pix2ang_nest(int_4 nside,int_4 ipix,double& theta,double& phi) const;
219inline void setParameters(int_4 nside, int_4 nbpixels, double solangle)
220 {
221 nSide_= nside;
222 nPix_= nbpixels;
223 omeg_= solangle;
224 }
225
226// ------------- variables internes -----------------------
227
228int_4 nSide_;
229int_4 nPix_;
230double omeg_;
231
232NDataBlock<T> pixels_;
233NDataBlock<int> sliceBeginIndex_;
234NDataBlock<int> sliceLenght_;
235
236};
237
238
239//////////////////////////////////////////////////////////////////////////
240//
241// ------------- Classe PIXELS_XY -----------------------
242//
243class PIXELS_XY
244{
245
246public :
247
248static PIXELS_XY& instance();
249
250NDataBlock<int_4> pix2x_;
251NDataBlock<int_4> pix2y_;
252NDataBlock<int_4> x2pix_;
253NDataBlock<int_4> y2pix_;
254
255private :
256
257PIXELS_XY();
258void mk_pix2xy();
259void mk_xy2pix();
260};
261
262} // Fin du namespace
263
264#endif
Note: See TracBrowser for help on using the repository browser.