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

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

1/ Mise en place de la prise en charge du schema de pixelisation NESTED dans
SphereHEALPix<T>
2/ petites corrections sur PixelMap<T> et cartes speheriques

Reza 21/06/2006

File size: 11.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#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(bool fgring=true);
55SphereHEALPix(int_4 m, bool fgring=true);
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/*! \brief 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);
110virtual string TypeOfMap() const;
111
112inline bool IfRING() const { return fgring_; }
113inline bool IfNESTED() const { return ( (fgring_) ? false : true ); }
114
115/*
116virtual T& PixValNest(int_4 k);
117virtual T const& PixValNest(int_4 k) const;
118virtual int_4 PixIndexSphNest(double theta,double phi) const;
119virtual void PixThetaPhiNest(int_4 k,double& theta,double& phi) const;
120*/
121
122void Pixelize(int_4);
123
124int_4 NestToRing(int_4) const;
125
126int_4 RingToNest(int_4) const;
127
128
129/*! \return value of healpix nside */
130inline virtual int_4 SizeIndex() const {return(nSide_);}
131
132void print(ostream& os) const;
133inline void Print(ostream& os) const { print(os); }
134
135//--------------------- Operations diverses = , +=, ...
136
137SphereHEALPix<T>& Set(const SphereHEALPix<T>& a);
138inline SphereHEALPix<T>& operator = (const SphereHEALPix<T>& a)
139 {return Set(a);}
140
141// A += -= *= /= x (ajoute, soustrait, ... x a tous les elements)
142
143//! Fill SphereHEALPix with all elements equal to \b x
144virtual SphereHEALPix<T>& SetT(T a);
145inline SphereHEALPix<T>& operator = (T a) {return SetT(a);}
146
147//! Add \b x to all elements
148virtual SphereHEALPix<T>& Add(T a);
149inline SphereHEALPix<T>& operator += (T x) { pixels_ += x; return *this; }
150//! Substract \b x to all elements
151virtual SphereHEALPix<T>& Sub(T a,bool fginv=false);
152inline SphereHEALPix<T>& operator -= (T x) { pixels_ -= x; return *this; }
153//! Multiply all elements by \b x
154virtual SphereHEALPix<T>& Mul(T a);
155inline SphereHEALPix<T>& operator *= (T x) {pixels_ *= x; return *this; }
156//! Divide all elements by \b x
157virtual SphereHEALPix<T>& Div(T a);
158inline SphereHEALPix<T>& operator /= (T x) {pixels_ /= x; return *this; }
159
160// A += -= (ajoute, soustrait element par element les deux spheres )
161 //! Operator SphereHEALPix += SphereHEALPix
162 virtual SphereHEALPix<T>& AddElt(const SphereHEALPix<T>& a);
163 inline SphereHEALPix<T>& operator += (const SphereHEALPix<T>& a) { return AddElt(a); }
164
165
166
167 virtual SphereHEALPix<T>& SubElt(const SphereHEALPix<T>& a);
168 //! Operator SphereHEALPix -= SphereHEALPix
169 inline SphereHEALPix<T>& operator -= (const SphereHEALPix<T>& a) { return SubElt(a); }
170// Multiplication, division element par element les deux SphereHEALPix
171 virtual SphereHEALPix<T>& MulElt(const SphereHEALPix<T>& a);
172 inline SphereHEALPix<T>& operator *= (const SphereHEALPix<T>& a) { return MulElt(a); }
173 virtual SphereHEALPix<T>& DivElt(const SphereHEALPix<T>& a);
174 inline SphereHEALPix<T>& operator /= (const SphereHEALPix<T>& a) { return DivElt(a); }
175
176
177 void CloneOrShare(const SphereHEALPix<T>& a);
178 void Share(const SphereHEALPix<T>& a);
179 SphereHEALPix<T>& CopyElt(const SphereHEALPix<T>& a);
180
181
182 // friend declaration for classes which handle persistence and FITS IO
183 friend class FIO_SphereHEALPix<T>;
184 friend class FITS_SphereHEALPix<T>;
185
186protected :
187
188// ------------- méthodes internes ----------------------
189void InitNul();
190void SetThetaSlices();
191
192inline void setParameters(int_4 nside, int_4 nbpixels, double solangle,
193 bool fgring)
194{
195 nSide_= nside;
196 nPix_= nbpixels;
197 omeg_= solangle;
198 fgring_ = fgring;
199}
200
201// ------------- variables internes -----------------------
202
203int_4 nSide_;
204int_4 nPix_;
205double omeg_;
206bool fgring_; // true -> RING pixelisation , false -> NESTED
207
208NDataBlock<T> pixels_;
209NDataBlock<int_4> sliceBeginIndex_; // Indices in RING scheme
210NDataBlock<int_4> sliceLenght_;
211
212};
213
214////////////////////////////////////////////////////////////////
215// Surcharge d'operateurs A (+,-,*,/) (T) x
216/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,T)
217 \brief Operator SphereHEALPix = SphereHEALPix + constant */
218template <class T> inline SphereHEALPix<T> operator + (const SphereHEALPix<T>& a, T b)
219 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
220 result.Add(b); return result;}
221/*! \ingroup SkyMap \fn operator+(T,const SphereHEALPix<T>&)
222 \brief Operator SphereHEALPix = constant + SphereHEALPix */
223template <class T> inline SphereHEALPix<T> operator + (T b,const SphereHEALPix<T>& a)
224 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
225 result.Add(b); return result;}
226
227
228/*! \ingroup SphereHEALPix\fn operator-(const SphereHEALPix<T>&,T)
229 \brief Operator SphereHEALPix = SphereHEALPix - constant */
230template <class T> inline SphereHEALPix<T> operator - (const SphereHEALPix<T>& a, T b)
231 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
232 result.Sub(b); return result;}
233
234/*! \ingroup \fn operator-(T,const SphereHEALPix<T>&)
235 \brief Operator SphereHEALPix = constant - SphereHEALPix */
236template <class T> inline SphereHEALPix<T> operator - (T b,const SphereHEALPix<T>& a)
237 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
238 result.Sub(b,true); return result;}
239
240/*! \ingroup SkyMap \fn operator*(const SphereHEALPix<T>&,T)
241 \brief Operator SphereHEALPix = SphereHEALPix * constant */
242template <class T> inline SphereHEALPix<T> operator * (const SphereHEALPix<T>& a, T b)
243 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
244 result.Mul(b); return result;}
245
246/*! \ingroup SkyMap \fn operator*(T,const SphereHEALPix<T>&)
247 \brief Operator SphereHEALPix = constant * SphereHEALPix */
248template <class T> inline SphereHEALPix<T> operator * (T b,const SphereHEALPix<T>& a)
249 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
250 result.Mul(b); return result;}
251
252/*! \ingroup SkyMap \fn operator/(const SphereHEALPix<T>&,T)
253 \brief Operator SphereHEALPix = SphereHEALPix / constant */
254template <class T> inline SphereHEALPix<T> operator / (const SphereHEALPix<T>& a, T b)
255 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
256 result.Div(b); return result;}
257
258/*! \ingroup SkyMap \fn operator/(T,const SphereHEALPix<T>&)
259 \brief Operator SphereHEALPix = constant / SphereHEALPix */
260template <class T> inline SphereHEALPix<T> operator / (T b, const SphereHEALPix<T>& a)
261 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
262 result.Div(b, true); return result;}
263
264////////////////////////////////////////////////////////////////
265// Surcharge d'operateurs C = A (+,-) B
266
267/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
268 \brief Operator SphereHEALPix = SphereHEALPix + SphereHEALPix */
269template <class T>
270inline SphereHEALPix<T> operator + (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
271 { SphereHEALPix<T> result; result.SetTemp(true);
272 if (b.IsTemp()) { result.Share(b); result.AddElt(a); }
273 else { result.CloneOrShare(a); result.AddElt(b); }
274 return result; }
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 result.CloneOrShare(a); result.SubElt(b);
282 return result; }
283
284////////////////////////////////////////////////////////////////
285// Surcharge d'operateurs C = A (*,/) B
286
287/*! \ingroup SkyMap \fn operator*(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
288 \brief Operator SphereHEALPix = SphereHEALPix * SphereHEALPix (pixel by pixel multiply) */
289template <class T>
290inline SphereHEALPix<T> operator * (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
291 { SphereHEALPix<T> result; result.SetTemp(true);
292 if (b.IsTemp()) { result.Share(b); result.MulElt(a); }
293 else { result.CloneOrShare(a); result.MulElt(b); }
294 return result; }
295
296/*! \ingroup SkyMap \fn operator/(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
297 \brief Operator SphereHEALPix = SphereHEALPix / SphereHEALPix (pixel by pixel divide) */
298template <class T>
299inline SphereHEALPix<T> operator / (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
300 { SphereHEALPix<T> result; result.SetTemp(true);
301 result.CloneOrShare(a); result.DivElt(b);
302 return result; }
303
304} // Fin du namespace
305
306#endif
Note: See TracBrowser for help on using the repository browser.