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

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

constructeurs de copie

File size: 7.6 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);
82SphereHEALPix(const SphereHEALPix<T>& s);
83//! Destructor
84virtual ~SphereHEALPix();
85
86/*! Setting blockdata to temporary (see ndatablock documentation) */
87inline virtual void SetTemp(bool temp=false) const
88 {
89 pixels_.SetTemp(temp);
90 sliceBeginIndex_.SetTemp(temp);
91 sliceLenght_.SetTemp(temp);
92 };
93// ------------------ Definition of PixelMap abstract methods
94
95/* Nombre de pixels du decoupage */
96/*! Return number of pixels of the splitting */
97virtual int_4 NbPixels() const;
98
99/* Valeur du contenu du pixel d'indice "RING" k */
100/*! Return value of pixel with "RING" index k */
101virtual T& PixVal(int_4 k);
102virtual T const& PixVal(int_4 k) const;
103
104/* Nombre de tranches en theta */
105/*! Return number of slices in theta direction on the sphere */
106uint_4 NbThetaSlices() const;
107/*! For a theta-slice with index 'index', return :
108
109 the corresponding "theta"
110
111 a vector containing the phi's of the pixels of the slice
112
113 a vector containing the corresponding values of pixels
114*/
115virtual void GetThetaSlice(int_4 index,r_8& theta,TVector<r_8>& phi,TVector<T>& value) const;
116/*! For a theta-slice with index 'index', return :
117
118 the corresponding "theta"
119
120 the corresponding "phi" for first pixel of the slice
121
122 a vector containing indices of the pixels of the slice
123
124 (equally distributed in phi)
125
126 a vector containing the corresponding values of pixels
127*/
128virtual void GetThetaSlice(int_4 sliceIndex,r_8& theta, r_8& phi0, TVector<int_4>& pixelIndices,TVector<T>& value) const ;
129
130/* Return true if teta,phi in map */
131virtual bool ContainsSph(double theta, double phi) const;
132/* Indice "RING" du pixel vers lequel pointe une direction definie par
133ses coordonnees spheriques */
134/*! Return "RING" index of the pixel corresponding to direction (theta, phi).
135 */
136virtual int_4 PixIndexSph(double theta,double phi) const;
137
138/* Coordonnees spheriques du milieu du pixel d'indice "RING" k */
139virtual void PixThetaPhi(int_4 k,double& theta,double& phi) const;
140
141/*! Set all pixels to value v */
142virtual T SetPixels(T v);
143
144/* Pixel Solid angle (steradians) */
145/*! Pixel Solid angle (steradians)
146
147 All the pixels have the same solid angle. The dummy argument is
148 for compatibility with eventual pixelizations which would not
149 fulfil this requirement.
150*/
151virtual double PixSolAngle(int_4 dummy=0) const;
152
153/* Acces to the DataBlock */
154inline NDataBlock<T>& DataBlock() {return pixels_;}
155inline const NDataBlock<T>& DataBlock() const {return pixels_;}
156
157// --------------- Specific methods
158
159/*!
160 m is the "nside" of the Gorski algorithm
161
162 The total number of pixels will be Npix = 12*nside**2
163
164 nside MUST be a power of 2 (<= 8192)
165*/
166virtual void Resize(int_4 m);
167
168// pour l'instant le tableau est ordonne selon RING, uniquement
169inline virtual char* TypeOfMap() const {return "RING";};
170
171
172/* Valeur du contenu du pixel d'indice "NEST" k */
173/*! Return value of pixel with "NESTED" index k */
174virtual T& PixValNest(int_4 k);
175/*! Return value of pixel with "NESTED" index k */
176virtual T const& PixValNest(int_4 k) const;
177
178/* Indice "NEST" du pixel vers lequel pointe une direction definie par
179ses coordonnees spheriques */
180/*! Return "NESTED" index of the pixel corresponding to direction (theta, phi).
181 */
182virtual int_4 PixIndexSphNest(double theta,double phi) const;
183
184/* Coordonnees spheriques du milieu du pixel d'indice "NEST" k */
185/*! Return (theta,phi) coordinates of middle of pixel with "NESTED" index k
186 */
187virtual void PixThetaPhiNest(int_4 k,double& theta,double& phi) const;
188
189/* algorithme de pixelisation */
190void Pixelize(int_4);
191
192/* convertit index nested en ring */
193/*! translation from NESTED index into RING index */
194int_4 NestToRing(int_4) const;
195
196/* convertit index ring en nested" */
197/*! translation from RING index into NESTED index */
198int_4 RingToNest(int_4) const;
199
200
201/* retourne la valeur du parametre Gorski */
202inline virtual int_4 SizeIndex() const {return(nSide_);}
203
204/* impression */
205void print(ostream& os) const;
206
207
208 void CloneOrShare(const SphereHEALPix<T>& a);
209
210 SphereHEALPix<T>& Set(const SphereHEALPix<T>& a);
211
212inline SphereHEALPix<T>& operator = (const SphereHEALPix<T>& a)
213 {return Set(a);}
214
215private :
216
217// ------------- méthodes internes ----------------------
218void InitNul();
219void SetThetaSlices();
220
221int_4 nest2ring(int_4 nside,int_4 ipnest) const;
222int_4 ring2nest(int_4 nside,int_4 ipring) const;
223
224int_4 ang2pix_ring(int_4 nside,double theta,double phi) const;
225int_4 ang2pix_nest(int_4 nside,double theta,double phi) const;
226void pix2ang_ring(int_4 nside,int_4 ipix,double& theta,double& phi) const;
227void pix2ang_nest(int_4 nside,int_4 ipix,double& theta,double& phi) const;
228inline void setParameters(int_4 nside, int_4 nbpixels, double solangle)
229 {
230 nSide_= nside;
231 nPix_= nbpixels;
232 omeg_= solangle;
233 }
234
235// ------------- variables internes -----------------------
236
237int_4 nSide_;
238int_4 nPix_;
239double omeg_;
240
241NDataBlock<T> pixels_;
242NDataBlock<int> sliceBeginIndex_;
243NDataBlock<int> sliceLenght_;
244
245};
246
247
248//////////////////////////////////////////////////////////////////////////
249//
250// ------------- Classe PIXELS_XY -----------------------
251//
252class PIXELS_XY
253{
254
255public :
256
257static PIXELS_XY& instance();
258
259NDataBlock<int_4> pix2x_;
260NDataBlock<int_4> pix2y_;
261NDataBlock<int_4> x2pix_;
262NDataBlock<int_4> y2pix_;
263
264private :
265
266PIXELS_XY();
267void mk_pix2xy();
268void mk_xy2pix();
269};
270
271} // Fin du namespace
272
273#endif
Note: See TracBrowser for help on using the repository browser.