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

Last change on this file since 2973 was 2973, checked in by ansari, 19 years ago

1/ Nettoyage+commentaires/doxygen ds Vector3d, UnitVector, LongLat,
SphereCoordSys ...
2/ Ajout de la classe angle pour faciliter les conversions rad<>deg<>arcmin
dans le fichier vector3d.h .cc
3/ nettoyage/uniformisation methodes print pour pixelmap, ajout de la
methode PixelMap<T>::Show()
4/ Ajout methodes SphericalMap<T>::HasSymThetaSlice() et
GetSymThetaSliceIndex(int_4 idx) et leurs implementations pour
SphereHEALPix et SphereThetaPhi en vue de l'optimisation du calcul
transforme Ylm
5/ Ajout methode ResolToSizeIndex ds SphereThetaPhi , SphereHEALPix et
SphereECP

Reza , 20 Juin 2006

File size: 11.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#include "HEALPixUtils.h"
12
13namespace SOPHYA {
14
15
16// ***************** CLASSE SphereHEALPix *****************************
17
18 /*! Class SphereHEALPix */
19
20
21template<class T>
22class FIO_SphereHEALPix;
23
24template<class T>
25class FITS_SphereHEALPix;
26
27template<class T>
28class SphereHEALPix : public SphericalMap<T>
29{
30public :
31// Static Methods to ease the use of HEALPix index <> angle conversion methods
32
33 static inline int_4 nest2ring(int_4 nside,int_4 ipnest)
34 { return HEALPix::nest2ring(nside, ipnest); }
35 static inline int_4 ring2nest(int_4 nside,int_4 ipring)
36 { return HEALPix::ring2nest(nside, ipring); }
37 static inline int_4 ang2pix_ring(int_4 nside,double theta,double phi)
38 { return HEALPix::ang2pix_ring(nside, theta, phi); }
39 static inline int_4 ang2pix_nest(int_4 nside,double theta,double phi)
40 { return HEALPix::ang2pix_nest(nside, theta, phi); }
41 static inline void pix2ang_ring(int_4 nside,int_4 ipix,double& theta,double& phi)
42 { HEALPix::pix2ang_ring(nside, ipix, theta, phi); }
43 static inline void pix2ang_nest(int_4 nside,int_4 ipix,double& theta,double& phi)
44 { HEALPix::pix2ang_nest(nside, ipix, theta, phi); }
45
46 //! return the size index (=nside) corresponding to resolution res (in radian)
47 static inline int_4 ResolToSizeIndex(double res)
48 { return HEALPix::ResolToSizeIndex(res); }
49
50 //! return the size index (=nside) corresponding to resolution res (in radian)
51 static inline int_4 ResolToNSide(double res)
52 { return HEALPix::ResolToSizeIndex(res); }
53
54SphereHEALPix();
55SphereHEALPix(int_4 m);
56SphereHEALPix(const SphereHEALPix<T>& s, bool share);
57SphereHEALPix(const SphereHEALPix<T>& s);
58virtual ~SphereHEALPix();
59
60inline virtual bool IsTemp(void) const {
61
62 if (sliceBeginIndex_.IsTemp() != pixels_.IsTemp() || sliceLenght_.IsTemp() != pixels_.IsTemp() )
63 throw PException(" l'etat 'temporaire' de la spherehealpix est incoherent");
64 return pixels_.IsTemp();
65}
66
67inline virtual void SetTemp(bool temp=false) const
68 {
69 pixels_.SetTemp(temp);
70 sliceBeginIndex_.SetTemp(temp);
71 sliceLenght_.SetTemp(temp);
72 };
73// ------------------ Definition of PixelMap abstract methods
74
75virtual int_4 NbPixels() const;
76
77virtual T& PixVal(int_4 k);
78virtual T const& PixVal(int_4 k) const;
79
80virtual uint_4 NbThetaSlices() const;
81virtual r_8 ThetaOfSlice(int_4 index) const;
82virtual bool HasSymThetaSlice() const;
83virtual int_4 GetSymThetaSliceIndex(int_4 idx) const;
84
85virtual void GetThetaSlice(int_4 index,r_8& theta,TVector<r_8>& phi,TVector<T>& value) const;
86virtual void GetThetaSlice(int_4 sliceIndex,r_8& theta, r_8& phi0, TVector<int_4>& pixelIndices,TVector<T>& value) const ;
87
88virtual bool ContainsSph(double theta, double phi) const;
89virtual int_4 PixIndexSph(double theta,double phi) const;
90
91virtual void PixThetaPhi(int_4 k,double& theta,double& phi) const;
92
93virtual T SetPixels(T v);
94
95/*! Pixel Solid angle (steradians)
96
97 All the pixels have the same solid angle. The dummy argument is
98 for compatibility with eventual pixelizations which would not
99 fulfil this requirement.
100*/
101inline virtual double PixSolAngle(int_4 dummy=0) const {return omeg_;}
102
103/* Acces to the DataBlock */
104inline NDataBlock<T>& DataBlock() {return pixels_;}
105inline const NDataBlock<T>& DataBlock() const {return pixels_;}
106
107// --------------- Specific methods
108
109virtual void Resize(int_4 m);
110
111/*!
112
113\return type of storage of the map : RING or NESTED
114
115at the moment, always RING
116*/
117inline virtual string TypeOfMap() const {return string("RING");};
118
119
120virtual T& PixValNest(int_4 k);
121virtual T const& PixValNest(int_4 k) const;
122
123virtual int_4 PixIndexSphNest(double theta,double phi) const;
124
125virtual void PixThetaPhiNest(int_4 k,double& theta,double& phi) const;
126
127void Pixelize(int_4);
128
129int_4 NestToRing(int_4) const;
130
131int_4 RingToNest(int_4) const;
132
133
134/*! \return value of healpix nside */
135inline virtual int_4 SizeIndex() const {return(nSide_);}
136
137void print(ostream& os) const;
138inline void Print(ostream& os) const { print(os); }
139
140
141
142
143
144
145
146// Operations diverses = , +=, ...
147
148
149SphereHEALPix<T>& Set(const SphereHEALPix<T>& a);
150inline SphereHEALPix<T>& operator = (const SphereHEALPix<T>& a)
151 {return Set(a);}
152
153// A += -= *= /= x (ajoute, soustrait, ... x a tous les elements)
154
155 //! Fill SphereHEALPix with all elements equal to \b x
156virtual SphereHEALPix<T>& SetT(T a);
157inline SphereHEALPix<T>& operator = (T a) {return SetT(a);}
158
159//! Add \b x to all elements
160virtual SphereHEALPix<T>& Add(T a);
161inline SphereHEALPix<T>& operator += (T x) { pixels_ += x; return *this; }
162//! Substract \b x to all elements
163virtual SphereHEALPix<T>& Sub(T a,bool fginv=false);
164inline SphereHEALPix<T>& operator -= (T x) { pixels_ -= x; return *this; }
165//! Multiply all elements by \b x
166virtual SphereHEALPix<T>& Mul(T a);
167inline SphereHEALPix<T>& operator *= (T x) {pixels_ *= x; return *this; }
168//! Divide all elements by \b x
169virtual SphereHEALPix<T>& Div(T a);
170inline SphereHEALPix<T>& operator /= (T x) {pixels_ /= x; return *this; }
171
172// A += -= (ajoute, soustrait element par element les deux spheres )
173 //! Operator SphereHEALPix += SphereHEALPix
174 virtual SphereHEALPix<T>& AddElt(const SphereHEALPix<T>& a);
175 inline SphereHEALPix<T>& operator += (const SphereHEALPix<T>& a) { return AddElt(a); }
176
177
178
179 virtual SphereHEALPix<T>& SubElt(const SphereHEALPix<T>& a);
180 //! Operator SphereHEALPix -= SphereHEALPix
181 inline SphereHEALPix<T>& operator -= (const SphereHEALPix<T>& a) { return SubElt(a); }
182// Multiplication, division element par element les deux SphereHEALPix
183 virtual SphereHEALPix<T>& MulElt(const SphereHEALPix<T>& a);
184 inline SphereHEALPix<T>& operator *= (const SphereHEALPix<T>& a) { return MulElt(a); }
185 virtual SphereHEALPix<T>& DivElt(const SphereHEALPix<T>& a);
186 inline SphereHEALPix<T>& operator /= (const SphereHEALPix<T>& a) { return DivElt(a); }
187
188
189 void CloneOrShare(const SphereHEALPix<T>& a);
190 void Share(const SphereHEALPix<T>& a);
191 SphereHEALPix<T>& CopyElt(const SphereHEALPix<T>& a);
192
193
194 // friend declaration for classes which handle persistence and FITS IO
195 friend class FIO_SphereHEALPix<T>;
196 friend class FITS_SphereHEALPix<T>;
197
198protected :
199
200// ------------- méthodes internes ----------------------
201void InitNul();
202void SetThetaSlices();
203
204inline void setParameters(int_4 nside, int_4 nbpixels, double solangle)
205 {
206 nSide_= nside;
207 nPix_= nbpixels;
208 omeg_= solangle;
209 }
210
211// ------------- variables internes -----------------------
212
213int_4 nSide_;
214int_4 nPix_;
215double omeg_;
216
217NDataBlock<T> pixels_;
218NDataBlock<int_4> sliceBeginIndex_; // Rationalisation Mac. D.Y.
219NDataBlock<int_4> sliceLenght_;
220
221};
222
223////////////////////////////////////////////////////////////////
224// Surcharge d'operateurs A (+,-,*,/) (T) x
225/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,T)
226 \brief Operator SphereHEALPix = SphereHEALPix + constant */
227template <class T> inline SphereHEALPix<T> operator + (const SphereHEALPix<T>& a, T b)
228 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
229 result.Add(b); return result;}
230/*! \ingroup SkyMap \fn operator+(T,const SphereHEALPix<T>&)
231 \brief Operator SphereHEALPix = constant + SphereHEALPix */
232template <class T> inline SphereHEALPix<T> operator + (T b,const SphereHEALPix<T>& a)
233 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
234 result.Add(b); return result;}
235
236
237/*! \ingroup SphereHEALPix\fn operator-(const SphereHEALPix<T>&,T)
238 \brief Operator SphereHEALPix = SphereHEALPix - constant */
239template <class T> inline SphereHEALPix<T> operator - (const SphereHEALPix<T>& a, T b)
240 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
241 result.Sub(b); return result;}
242
243/*! \ingroup \fn operator-(T,const SphereHEALPix<T>&)
244 \brief Operator SphereHEALPix = constant - SphereHEALPix */
245template <class T> inline SphereHEALPix<T> operator - (T b,const SphereHEALPix<T>& a)
246 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
247 result.Sub(b,true); return result;}
248
249/*! \ingroup SkyMap \fn operator*(const SphereHEALPix<T>&,T)
250 \brief Operator SphereHEALPix = SphereHEALPix * constant */
251template <class T> inline SphereHEALPix<T> operator * (const SphereHEALPix<T>& a, T b)
252 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
253 result.Mul(b); return result;}
254
255/*! \ingroup SkyMap \fn operator*(T,const SphereHEALPix<T>&)
256 \brief Operator SphereHEALPix = constant * SphereHEALPix */
257template <class T> inline SphereHEALPix<T> operator * (T b,const SphereHEALPix<T>& a)
258 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
259 result.Mul(b); return result;}
260
261/*! \ingroup SkyMap \fn operator/(const SphereHEALPix<T>&,T)
262 \brief Operator SphereHEALPix = SphereHEALPix / constant */
263template <class T> inline SphereHEALPix<T> operator / (const SphereHEALPix<T>& a, T b)
264 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
265 result.Div(b); return result;}
266
267/*! \ingroup SkyMap \fn operator/(T,const SphereHEALPix<T>&)
268 \brief Operator SphereHEALPix = constant / SphereHEALPix */
269template <class T> inline SphereHEALPix<T> operator / (T b, const SphereHEALPix<T>& a)
270 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
271 result.Div(b, true); return result;}
272
273////////////////////////////////////////////////////////////////
274// Surcharge d'operateurs C = A (+,-) B
275
276/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
277 \brief Operator SphereHEALPix = SphereHEALPix + SphereHEALPix */
278template <class T>
279inline SphereHEALPix<T> operator + (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
280 { SphereHEALPix<T> result; result.SetTemp(true);
281 if (b.IsTemp()) { result.Share(b); result.AddElt(a); }
282 else { result.CloneOrShare(a); result.AddElt(b); }
283 return result; }
284
285/*! \ingroup SkyMap \fn operator-(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
286 \brief Operator SphereHEALPix = SphereHEALPix - SphereHEALPix */
287template <class T>
288inline SphereHEALPix<T> operator - (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
289 { SphereHEALPix<T> result; result.SetTemp(true);
290 result.CloneOrShare(a); result.SubElt(b);
291 return result; }
292
293////////////////////////////////////////////////////////////////
294// Surcharge d'operateurs C = A (*,/) B
295
296/*! \ingroup SkyMap \fn operator*(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
297 \brief Operator SphereHEALPix = SphereHEALPix * SphereHEALPix (pixel by pixel multiply) */
298template <class T>
299inline SphereHEALPix<T> operator * (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
300 { SphereHEALPix<T> result; result.SetTemp(true);
301 if (b.IsTemp()) { result.Share(b); result.MulElt(a); }
302 else { result.CloneOrShare(a); result.MulElt(b); }
303 return result; }
304
305/*! \ingroup SkyMap \fn operator/(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
306 \brief Operator SphereHEALPix = SphereHEALPix / SphereHEALPix (pixel by pixel divide) */
307template <class T>
308inline SphereHEALPix<T> operator / (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
309 { SphereHEALPix<T> result; result.SetTemp(true);
310 result.CloneOrShare(a); result.DivElt(b);
311 return result; }
312
313} // Fin du namespace
314
315#endif
Note: See TracBrowser for help on using the repository browser.