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

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

Ajouts methode GetThetaSliceDataPtr() dans SphericalMap, SphereThetaPhi SphereHEALPix SphereECP pour optimisation calcul transforme Ylm + passage TypeOfMap TETAFI->ECP pour SphereECP , Reza 23/6/2006

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