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

Last change on this file since 2013 was 1624, checked in by cmv, 24 years ago

On enleve les SetTemp() inutiles cmv 6/8/01

File size: 10.8 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
[853]46SphereHEALPix();
47SphereHEALPix(int_4 m);
[906]48SphereHEALPix(const SphereHEALPix<T>& s, bool share);
49SphereHEALPix(const SphereHEALPix<T>& s);
[853]50virtual ~SphereHEALPix();
[843]51
[908]52inline virtual bool IsTemp(void) const {
53
54 if (sliceBeginIndex_.IsTemp() != pixels_.IsTemp() || sliceLenght_.IsTemp() != pixels_.IsTemp() )
55 throw PException(" l'etat 'temporaire' de la spherehealpix est incoherent");
56 return pixels_.IsTemp();
57}
[1217]58
[843]59inline virtual void SetTemp(bool temp=false) const
60 {
61 pixels_.SetTemp(temp);
62 sliceBeginIndex_.SetTemp(temp);
63 sliceLenght_.SetTemp(temp);
64 };
65// ------------------ Definition of PixelMap abstract methods
66
67virtual int_4 NbPixels() const;
68
69virtual T& PixVal(int_4 k);
70virtual T const& PixVal(int_4 k) const;
71
72uint_4 NbThetaSlices() const;
73virtual void GetThetaSlice(int_4 index,r_8& theta,TVector<r_8>& phi,TVector<T>& value) const;
74virtual void GetThetaSlice(int_4 sliceIndex,r_8& theta, r_8& phi0, TVector<int_4>& pixelIndices,TVector<T>& value) const ;
75
76virtual bool ContainsSph(double theta, double phi) const;
77virtual int_4 PixIndexSph(double theta,double phi) const;
78
79virtual void PixThetaPhi(int_4 k,double& theta,double& phi) const;
80
81virtual T SetPixels(T v);
82
[1217]83/*! Pixel Solid angle (steradians)
[843]84
85 All the pixels have the same solid angle. The dummy argument is
86 for compatibility with eventual pixelizations which would not
87 fulfil this requirement.
88*/
[1217]89inline virtual double PixSolAngle(int_4 dummy=0) const {return omeg_;}
[843]90
91/* Acces to the DataBlock */
92inline NDataBlock<T>& DataBlock() {return pixels_;}
93inline const NDataBlock<T>& DataBlock() const {return pixels_;}
94
95// --------------- Specific methods
96
[1217]97virtual void Resize(int_4 m);
[843]98
[1217]99/*!
[843]100
[1217]101\return type of storage of the map : RING or NESTED
102
103at the moment, always RING
[843]104*/
105inline virtual char* TypeOfMap() const {return "RING";};
106
107
108virtual T& PixValNest(int_4 k);
109virtual T const& PixValNest(int_4 k) const;
110
111virtual int_4 PixIndexSphNest(double theta,double phi) const;
112
113virtual void PixThetaPhiNest(int_4 k,double& theta,double& phi) const;
114
115void Pixelize(int_4);
116
117int_4 NestToRing(int_4) const;
118
119int_4 RingToNest(int_4) const;
120
121
[1217]122/*! \return value of healpix nside */
[843]123inline virtual int_4 SizeIndex() const {return(nSide_);}
124
125void print(ostream& os) const;
[892]126
127
128
[1419]129
130
131
132
133
134// Operations diverses = , +=, ...
135
136
137SphereHEALPix<T>& Set(const SphereHEALPix<T>& a);
[892]138inline SphereHEALPix<T>& operator = (const SphereHEALPix<T>& a)
[980]139 {return Set(a);}
[1195]140
[1419]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) { return Add(x); }
150//! Substract \b x to all elements
[1624]151virtual SphereHEALPix<T>& Sub(T a,bool fginv=false);
[1419]152inline SphereHEALPix<T>& operator -= (T x) { return Sub(x); }
153//! Multiply all elements by \b x
154virtual SphereHEALPix<T>& Mul(T a);
155inline SphereHEALPix<T>& operator *= (T x) { return Mul(x); }
156//! Divide all elements by \b x
157virtual SphereHEALPix<T>& Div(T a);
158inline SphereHEALPix<T>& operator /= (T x) { return Div(x); }
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); }
[1551]173 virtual SphereHEALPix<T>& DivElt(const SphereHEALPix<T>& a);
174 inline SphereHEALPix<T>& operator /= (const SphereHEALPix<T>& a) { return DivElt(a); }
[1419]175
176
[1196]177 void CloneOrShare(const SphereHEALPix<T>& a);
[1419]178 void Share(const SphereHEALPix<T>& a);
[1196]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>;
[1195]185
[1196]186protected :
[843]187
188// ------------- méthodes internes ----------------------
189void InitNul();
190void SetThetaSlices();
191
192inline void setParameters(int_4 nside, int_4 nbpixels, double solangle)
193 {
194 nSide_= nside;
195 nPix_= nbpixels;
196 omeg_= solangle;
197 }
198
199// ------------- variables internes -----------------------
200
201int_4 nSide_;
202int_4 nPix_;
203double omeg_;
204
205NDataBlock<T> pixels_;
[1217]206NDataBlock<int_4> sliceBeginIndex_; // Rationalisation Mac. D.Y.
[1145]207NDataBlock<int_4> sliceLenght_;
[843]208
209};
210
[1419]211////////////////////////////////////////////////////////////////
212// Surcharge d'operateurs A (+,-,*,/) (T) x
[1423]213/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,T)
[1419]214 \brief Operator SphereHEALPix = SphereHEALPix + constant */
215template <class T> inline SphereHEALPix<T> operator + (const SphereHEALPix<T>& a, T b)
216 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
217 result.Add(b); return result;}
[1423]218/*! \ingroup SkyMap \fn operator+(T,const SphereHEALPix<T>&)
[1419]219 \brief Operator SphereHEALPix = constant + SphereHEALPix */
220template <class T> inline SphereHEALPix<T> operator + (T b,const SphereHEALPix<T>& a)
221 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
222 result.Add(b); return result;}
[843]223
224
[1419]225/*! \ingroup SphereHEALPix\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.Sub(b); return result;}
230
231/*! \ingroup \fn operator-(T,const SphereHEALPix<T>&)
232 \brief Operator SphereHEALPix = constant - SphereHEALPix */
233template <class T> inline SphereHEALPix<T> operator - (T b,const SphereHEALPix<T>& a)
234 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
235 result.Sub(b,true); return result;}
236
[1423]237/*! \ingroup SkyMap \fn operator*(const SphereHEALPix<T>&,T)
[1419]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.Mul(b); return result;}
242
[1423]243/*! \ingroup SkyMap \fn operator*(T,const SphereHEALPix<T>&)
[1419]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.Mul(b); 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.Div(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.Div(b, true); return result;}
260
261////////////////////////////////////////////////////////////////
262// Surcharge d'operateurs C = A (+,-) B
263
[1423]264/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
[1419]265 \brief Operator SphereHEALPix = SphereHEALPix + SphereHEALPix */
266template <class T>
267inline SphereHEALPix<T> operator + (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
268 { SphereHEALPix<T> result; result.SetTemp(true);
269 if (b.IsTemp()) { result.Share(b); result.AddElt(a); }
270 else { result.CloneOrShare(a); result.AddElt(b); }
271 return result; }
272
[1423]273/*! \ingroup SkyMap \fn operator-(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
[1419]274 \brief Operator SphereHEALPix = SphereHEALPix - SphereHEALPix */
275template <class T>
276inline SphereHEALPix<T> operator - (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
277 { SphereHEALPix<T> result; result.SetTemp(true);
[1429]278 if (b.IsTemp()) { result.Share(b); result.SubElt(a); }
[1419]279 else { result.CloneOrShare(a); result.SubElt(b); }
280 return result; }
281
[1551]282////////////////////////////////////////////////////////////////
283// Surcharge d'operateurs C = A (*,/) B
284
285/*! \ingroup SkyMap \fn operator*(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
286 \brief Operator SphereHEALPix = SphereHEALPix * SphereHEALPix (pixel by pixel multiply) */
287template <class T>
288inline SphereHEALPix<T> operator * (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
289 { SphereHEALPix<T> result; result.SetTemp(true);
290 if (b.IsTemp()) { result.Share(b); result.MulElt(a); }
291 else { result.CloneOrShare(a); result.MulElt(b); }
292 return result; }
293
294/*! \ingroup SkyMap \fn operator/(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
295 \brief Operator SphereHEALPix = SphereHEALPix / SphereHEALPix (pixel by pixel divide) */
296template <class T>
297inline SphereHEALPix<T> operator / (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
298 { SphereHEALPix<T> result; result.SetTemp(true);
299 if (b.IsTemp()) { result.Share(b); result.DivElt(a); }
300 else { result.CloneOrShare(a); result.DivElt(b); }
301 return result; }
302
[843]303} // Fin du namespace
304
305#endif
Note: See TracBrowser for help on using the repository browser.