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

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

surcharge operateur =

File size: 7.5 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
206
207 void CloneOrShare(const SphereHEALPix<T>& a);
208
209 SphereHEALPix<T>& Set(const SphereHEALPix<T>& a);
210
211inline SphereHEALPix<T>& operator = (const SphereHEALPix<T>& a)
212 {return Set(a);}
213
214private :
215
216// ------------- méthodes internes ----------------------
217void InitNul();
218void SetThetaSlices();
219
220int_4 nest2ring(int_4 nside,int_4 ipnest) const;
221int_4 ring2nest(int_4 nside,int_4 ipring) const;
222
223int_4 ang2pix_ring(int_4 nside,double theta,double phi) const;
224int_4 ang2pix_nest(int_4 nside,double theta,double phi) const;
225void pix2ang_ring(int_4 nside,int_4 ipix,double& theta,double& phi) const;
226void pix2ang_nest(int_4 nside,int_4 ipix,double& theta,double& phi) const;
227inline void setParameters(int_4 nside, int_4 nbpixels, double solangle)
228 {
229 nSide_= nside;
230 nPix_= nbpixels;
231 omeg_= solangle;
232 }
233
234// ------------- variables internes -----------------------
235
236int_4 nSide_;
237int_4 nPix_;
238double omeg_;
239
240NDataBlock<T> pixels_;
241NDataBlock<int> sliceBeginIndex_;
242NDataBlock<int> sliceLenght_;
243
244};
245
246
247//////////////////////////////////////////////////////////////////////////
248//
249// ------------- Classe PIXELS_XY -----------------------
250//
251class PIXELS_XY
252{
253
254public :
255
256static PIXELS_XY& instance();
257
258NDataBlock<int_4> pix2x_;
259NDataBlock<int_4> pix2y_;
260NDataBlock<int_4> x2pix_;
261NDataBlock<int_4> y2pix_;
262
263private :
264
265PIXELS_XY();
266void mk_pix2xy();
267void mk_xy2pix();
268};
269
270} // Fin du namespace
271
272#endif
Note: See TracBrowser for help on using the repository browser.