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

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

correction bug ds operateur PixelMap-PixelMap , Reza 1/3/2001

File size: 9.7 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
46SphereHEALPix();
47SphereHEALPix(int_4 m);
48SphereHEALPix(const SphereHEALPix<T>& s, bool share);
49SphereHEALPix(const SphereHEALPix<T>& s);
50virtual ~SphereHEALPix();
51
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}
58
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
83/*! Pixel Solid angle (steradians)
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*/
89inline virtual double PixSolAngle(int_4 dummy=0) const {return omeg_;}
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
97virtual void Resize(int_4 m);
98
99/*!
100
101\return type of storage of the map : RING or NESTED
102
103at the moment, always RING
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
122/*! \return value of healpix nside */
123inline virtual int_4 SizeIndex() const {return(nSide_);}
124
125void print(ostream& os) const;
126
127
128
129
130
131
132
133
134// Operations diverses = , +=, ...
135
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) { return Add(x); }
150//! Substract \b x to all elements
151virtual SphereHEALPix<T>& Sub(T a);
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); }
173
174
175 void CloneOrShare(const SphereHEALPix<T>& a);
176 void Share(const SphereHEALPix<T>& a);
177 SphereHEALPix<T>& CopyElt(const SphereHEALPix<T>& a);
178
179
180 // friend declaration for classes which handle persistence and FITS IO
181 friend class FIO_SphereHEALPix<T>;
182 friend class FITS_SphereHEALPix<T>;
183
184protected :
185
186// ------------- méthodes internes ----------------------
187void InitNul();
188void SetThetaSlices();
189
190inline void setParameters(int_4 nside, int_4 nbpixels, double solangle)
191 {
192 nSide_= nside;
193 nPix_= nbpixels;
194 omeg_= solangle;
195 }
196
197// ------------- variables internes -----------------------
198
199int_4 nSide_;
200int_4 nPix_;
201double omeg_;
202
203NDataBlock<T> pixels_;
204NDataBlock<int_4> sliceBeginIndex_; // Rationalisation Mac. D.Y.
205NDataBlock<int_4> sliceLenght_;
206
207};
208
209////////////////////////////////////////////////////////////////
210// Surcharge d'operateurs A (+,-,*,/) (T) x
211/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,T)
212 \brief Operator SphereHEALPix = SphereHEALPix + constant */
213template <class T> inline SphereHEALPix<T> operator + (const SphereHEALPix<T>& a, T b)
214 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
215 result.Add(b); return result;}
216/*! \ingroup SkyMap \fn operator+(T,const SphereHEALPix<T>&)
217 \brief Operator SphereHEALPix = constant + SphereHEALPix */
218template <class T> inline SphereHEALPix<T> operator + (T b,const SphereHEALPix<T>& a)
219 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
220 result.Add(b); return result;}
221
222
223/*! \ingroup SphereHEALPix\fn operator-(const SphereHEALPix<T>&,T)
224 \brief Operator SphereHEALPix = SphereHEALPix - constant */
225template <class T> inline SphereHEALPix<T> operator - (const SphereHEALPix<T>& a, T b)
226 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
227 result.Sub(b); return result;}
228
229/*! \ingroup \fn operator-(T,const SphereHEALPix<T>&)
230 \brief Operator SphereHEALPix = constant - SphereHEALPix */
231template <class T> inline SphereHEALPix<T> operator - (T b,const SphereHEALPix<T>& a)
232 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
233 result.Sub(b,true); return result;}
234
235/*! \ingroup SkyMap \fn operator*(const SphereHEALPix<T>&,T)
236 \brief Operator SphereHEALPix = SphereHEALPix * constant */
237template <class T> inline SphereHEALPix<T> operator * (const SphereHEALPix<T>& a, T b)
238 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
239 result.Mul(b); return result;}
240
241/*! \ingroup SkyMap \fn operator*(T,const SphereHEALPix<T>&)
242 \brief Operator SphereHEALPix = constant * SphereHEALPix */
243template <class T> inline SphereHEALPix<T> operator * (T b,const SphereHEALPix<T>& a)
244 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
245 result.Mul(b); return result;}
246
247/*! \ingroup SkyMap \fn operator/(const SphereHEALPix<T>&,T)
248 \brief Operator SphereHEALPix = SphereHEALPix / constant */
249template <class T> inline SphereHEALPix<T> operator / (const SphereHEALPix<T>& a, T b)
250 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
251 result.Div(b); return result;}
252
253/*! \ingroup SkyMap \fn operator/(T,const SphereHEALPix<T>&)
254 \brief Operator SphereHEALPix = constant / SphereHEALPix */
255template <class T> inline SphereHEALPix<T> operator / (T b, const SphereHEALPix<T>& a)
256 {SphereHEALPix<T> result; result.CloneOrShare(a); result.SetTemp(true);
257 result.Div(b, true); return result;}
258
259////////////////////////////////////////////////////////////////
260// Surcharge d'operateurs C = A (+,-) B
261
262/*! \ingroup SkyMap \fn operator+(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
263 \brief Operator SphereHEALPix = SphereHEALPix + SphereHEALPix */
264template <class T>
265inline SphereHEALPix<T> operator + (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
266 { SphereHEALPix<T> result; result.SetTemp(true);
267 if (b.IsTemp()) { result.Share(b); result.AddElt(a); }
268 else { result.CloneOrShare(a); result.AddElt(b); }
269 return result; }
270
271/*! \ingroup SkyMap \fn operator-(const SphereHEALPix<T>&,const SphereHEALPix<T>&)
272 \brief Operator SphereHEALPix = SphereHEALPix - SphereHEALPix */
273template <class T>
274inline SphereHEALPix<T> operator - (const SphereHEALPix<T>& a,const SphereHEALPix<T>& b)
275 { SphereHEALPix<T> result; result.SetTemp(true);
276 if (b.IsTemp()) { result.Share(b); result.SubElt(a); }
277 else { result.CloneOrShare(a); result.SubElt(b); }
278 return result; }
279
280} // Fin du namespace
281
282#endif
Note: See TracBrowser for help on using the repository browser.