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

Last change on this file since 2977 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
RevLine 
[843]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
[1196]11#include "HEALPixUtils.h"
[843]12
13namespace SOPHYA {
14
15
[853]16// ***************** CLASSE SphereHEALPix *****************************
[843]17
[1217]18 /*! Class SphereHEALPix */
[843]19
20
21template<class T>
[853]22class FIO_SphereHEALPix;
[843]23
24template<class T>
[853]25class FITS_SphereHEALPix;
[843]26
27template<class T>
[853]28class SphereHEALPix : public SphericalMap<T>
[843]29{
[1196]30public :
31// Static Methods to ease the use of HEALPix index <> angle conversion methods
[843]32
[1196]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); }
[843]45
[2973]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
[853]54SphereHEALPix();
55SphereHEALPix(int_4 m);
[906]56SphereHEALPix(const SphereHEALPix<T>& s, bool share);
57SphereHEALPix(const SphereHEALPix<T>& s);
[853]58virtual ~SphereHEALPix();
[843]59
[908]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}
[1217]66
[843]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
[2968]80virtual uint_4 NbThetaSlices() const;
81virtual r_8 ThetaOfSlice(int_4 index) const;
[2973]82virtual bool HasSymThetaSlice() const;
83virtual int_4 GetSymThetaSliceIndex(int_4 idx) const;
84
[843]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
[1217]95/*! Pixel Solid angle (steradians)
[843]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*/
[1217]101inline virtual double PixSolAngle(int_4 dummy=0) const {return omeg_;}
[843]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
[1217]109virtual void Resize(int_4 m);
[843]110
[1217]111/*!
[843]112
[1217]113\return type of storage of the map : RING or NESTED
114
115at the moment, always RING
[843]116*/
[2290]117inline virtual string TypeOfMap() const {return string("RING");};
[843]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
[1217]134/*! \return value of healpix nside */
[843]135inline virtual int_4 SizeIndex() const {return(nSide_);}
136
137void print(ostream& os) const;
[2973]138inline void Print(ostream& os) const { print(os); }
[892]139
140
141
[1419]142
143
144
145
146// Operations diverses = , +=, ...
147
148
149SphereHEALPix<T>& Set(const SphereHEALPix<T>& a);
[892]150inline SphereHEALPix<T>& operator = (const SphereHEALPix<T>& a)
[980]151 {return Set(a);}
[1195]152
[1419]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);
[2290]161inline SphereHEALPix<T>& operator += (T x) { pixels_ += x; return *this; }
[1419]162//! Substract \b x to all elements
[1624]163virtual SphereHEALPix<T>& Sub(T a,bool fginv=false);
[2290]164inline SphereHEALPix<T>& operator -= (T x) { pixels_ -= x; return *this; }
[1419]165//! Multiply all elements by \b x
166virtual SphereHEALPix<T>& Mul(T a);
[2290]167inline SphereHEALPix<T>& operator *= (T x) {pixels_ *= x; return *this; }
[1419]168//! Divide all elements by \b x
169virtual SphereHEALPix<T>& Div(T a);
[2290]170inline SphereHEALPix<T>& operator /= (T x) {pixels_ /= x; return *this; }
[1419]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); }
[1551]185 virtual SphereHEALPix<T>& DivElt(const SphereHEALPix<T>& a);
186 inline SphereHEALPix<T>& operator /= (const SphereHEALPix<T>& a) { return DivElt(a); }
[1419]187
188
[1196]189 void CloneOrShare(const SphereHEALPix<T>& a);
[1419]190 void Share(const SphereHEALPix<T>& a);
[1196]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>;
[1195]197
[1196]198protected :
[843]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_;
[1217]218NDataBlock<int_4> sliceBeginIndex_; // Rationalisation Mac. D.Y.
[1145]219NDataBlock<int_4> sliceLenght_;
[843]220
221};
222
[1419]223////////////////////////////////////////////////////////////////
224// Surcharge d'operateurs A (+,-,*,/) (T) x
[1423]225/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,T)
[1419]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;}
[1423]230/*! \ingroup SkyMap \fn operator+(T,const SphereHEALPix<T>&)
[1419]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;}
[843]235
236
[1419]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
[1423]249/*! \ingroup SkyMap \fn operator*(const SphereHEALPix<T>&,T)
[1419]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
[1423]255/*! \ingroup SkyMap \fn operator*(T,const SphereHEALPix<T>&)
[1419]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
[1423]261/*! \ingroup SkyMap \fn operator/(const SphereHEALPix<T>&,T)
[1419]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
[1423]267/*! \ingroup SkyMap \fn operator/(T,const SphereHEALPix<T>&)
[1419]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
[1423]276/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
[1419]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
[1423]285/*! \ingroup SkyMap \fn operator-(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
[1419]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);
[2965]290 result.CloneOrShare(a); result.SubElt(b);
[1419]291 return result; }
292
[1551]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);
[2433]310 result.CloneOrShare(a); result.DivElt(b);
[1551]311 return result; }
312
[843]313} // Fin du namespace
314
315#endif
Note: See TracBrowser for help on using the repository browser.