source: Sophya/trunk/SophyaLib/SkyMap/spherethetaphi.h@ 1447

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

modif pour documentation - Reza 23/2/2001

File size: 12.3 KB
Line 
1#ifndef SPHERETHETAPHI_SEEN
2#define SPHERETHETAPHI_SEEN
3
4#include "sphericalmap.h"
5#include "ndatablock.h"
6#include "tvector.h"
7
8#include "anydataobj.h"
9#include "ppersist.h"
10
11namespace SOPHYA {
12
13
14
15template <class T>
16class FIO_SphereThetaPhi;
17
18template<class T>
19class FITS_SphereThetaPhi;
20
21
22// ***************** Class SphereThetaPhi *****************************
23/*! sphere splitted with respect to theta, phi : each hemisphere is
24 splitted into (m-1) parallels (equator does not enter into account).
25 This operation defines m slices, each of which is splitted into
26 equidistant meridians. This splitting is realized in such a way that
27 all pixels have the same area and are as square as possible.
28
29 One begins with the hemisphere with positive z, starting from the pole
30 toward the equator. The first pixel is the polar cap ; it is circular
31 and centered on theta=0.
32*/
33template <class T>
34class SphereThetaPhi : public SphericalMap<T>
35{
36
37public :
38
39SphereThetaPhi();
40/*! m is the number of slices in theta on an hemisphere (the polar cap
41 forms the first slice).
42 pet is a dummy parameter at the moment.
43*/
44SphereThetaPhi(int_4 m);
45SphereThetaPhi(const SphereThetaPhi<T>& s, bool share);
46SphereThetaPhi(const SphereThetaPhi<T>& s);
47virtual ~SphereThetaPhi();
48
49 // Temporaire?
50inline virtual bool IsTemp(void) const {
51
52 if ( NPhi_.IsTemp() != pixels_.IsTemp() ||
53 TNphi_.IsTemp() != pixels_.IsTemp()||
54 Theta_.IsTemp() != pixels_.IsTemp() )
55 throw PException(" l'etat 'temporaire' de la spherethetaphi est incoherent");
56 return pixels_.IsTemp();
57}
58/*! Setting blockdata to temporary (see ndatablock documentation) */
59inline virtual void SetTemp(bool temp=false) const
60 {
61 NPhi_.SetTemp(temp);
62 TNphi_.SetTemp(temp);
63 Theta_.SetTemp(temp);
64 pixels_.SetTemp(temp);
65 };
66
67// ------------ Definition of PixelMap abstract methods -
68
69/* retourne le nombre de pixels */
70/*! Return total number of pixels */
71virtual int_4 NbPixels() const;
72
73/* retourne la valeur du pixel d'indice k */
74/*! Return value of pixel with index k */
75virtual T& PixVal(int_4 k);
76virtual T const& PixVal(int_4 k) const;
77
78/* Return true if teta,phi in map */
79virtual bool ContainsSph(double theta, double phi) const;
80/* retourne l'indice du pixel a (theta,phi) */
81/* Return index of the pixel corresponding to direction (theta, phi). */
82virtual int_4 PixIndexSph(double theta, double phi) const;
83
84/* retourne les coordonnees Spheriques du centre du pixel d'indice k */
85/*! Return (theta,phi) coordinates of middle of pixel with index k */
86virtual void PixThetaPhi(int_4 k, double& theta, double& phi) const;
87
88/*! Setting pixel values to a constant */
89virtual T SetPixels(T v);
90
91/* retourne/fixe l'angle Solide de Pixel (steradians) */
92/*! Pixel Solid angle (steradians)
93
94 All the pixels have the same solid angle. The dummy argument is
95 for compatibility with eventual pixelizations which would not
96 fulfil this requirement.
97*/
98virtual double PixSolAngle(int_4 dummy=0) const;
99
100/* retourne/fixe la valeur du parametre de decoupage m */
101inline virtual int_4 SizeIndex() const { return( NTheta_); }
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
109/*! re-pixelize the sphere */
110virtual void Resize(int_4 m);
111
112inline virtual char* TypeOfMap() const {return "TETAFI";};
113
114/* Valeurs de theta des paralleles et phi des meridiens limitant le pixel d'indice k */
115/* Return values of theta,phi which limit the pixel with index k */
116virtual void Limits(int_4 k,double& th1,double& th2,double& phi1,double& phi2);
117
118/* Nombre de tranches en theta */
119/*! Return number of theta-slices on the sphere */
120uint_4 NbThetaSlices() const;
121
122/* Nombre de pixels en phi de la tranche d'indice kt */
123int_4 NPhi(int_4 kt) const;
124
125/* Renvoie dans t1,t2 les valeurs respectives de theta min et theta max */
126/* de la tranche d'indice kt */
127/*! Return theta values which limit the slice kt */
128void Theta(int_4 kt, double& t1, double& t2);
129
130/* Renvoie dans p1,p2 les valeurs phimin et phimax du pixel d'indice jp */
131/* dans la tranche d'indice kt */
132/*! Return values of phi which limit the jp-th pixel of the kt-th slice */
133void Phi(int_4 kt, int_4 jp, double& p1, double& p2);
134
135/* Renvoie l'indice k du pixel d'indice jp dans la tranche d'indice kt */
136/*! Return pixel index with sequence index jp in the slice kt */
137int_4 Index(int_4 kt, int_4 jp) const;
138
139/* Indice kt de la tranche et indice jp du pixel d'indice k */
140/*! Return indices kt (theta) and jp (phi) of pixel with index k */
141void ThetaPhiIndex(int_4 k,int_4& kt,int_4& jp);
142
143/*! achieve the splitting into pixels (m has the same signification
144 as for the constructor)
145
146 Each theta-slice of the north hemisphere will be spitted starting f
147 from phi=0 ...
148
149 South hemisphere is scanned in the same direction according to phi
150 and from equator to the pole (the pixel following the last one of
151 the slice closest to the equator with z>0, is the pixel with lowest
152 phi of the slice closest of the equator with z<0).
153*/
154void Pixelize(int_4);
155
156/*! For a theta-slice with index 'index', return :
157
158 the corresponding "theta"
159
160 a vector containing the phi's of the pixels of the slice
161
162 a vector containing the corresponding values of pixels
163*/
164virtual void GetThetaSlice(int_4 index,r_8& theta,TVector<r_8>& phi,TVector<T>& value) const;
165
166/*! For a theta-slice with index 'index', return :
167
168 the corresponding "theta"
169
170 the corresponding "phi" for first pixel of the slice
171
172 a vector containing indices of the pixels of the slice
173
174 (equally distributed in phi)
175
176 a vector containing the corresponding values of pixels
177*/
178virtual void GetThetaSlice(int_4 index, r_8& theta, r_8& phi0,TVector<int_4>& pixelIndices, TVector<T>& value) const ;
179
180
181/* impression */
182void print(ostream& os) const;
183
184
185
186// Operations diverses = , +=, ...
187
188
189SphereThetaPhi<T>& Set(const SphereThetaPhi<T>& a);
190inline SphereThetaPhi<T>& operator = (const SphereThetaPhi<T>& a)
191 {return Set(a);}
192
193// A += -= *= /= x (ajoute, soustrait, ... x a tous les elements)
194
195 //! Fill SphereThetaPhi with all elements equal to \b x
196virtual SphereThetaPhi<T>& SetT(T a);
197inline SphereThetaPhi<T>& operator = (T a) {return SetT(a);}
198
199//! Add \b x to all elements
200virtual SphereThetaPhi<T>& Add(T a);
201inline SphereThetaPhi<T>& operator += (T x) { return Add(x); }
202//! Substract \b x to all elements
203virtual SphereThetaPhi<T>& Sub(T a);
204inline SphereThetaPhi<T>& operator -= (T x) { return Sub(x); }
205//! Multiply all elements by \b x
206virtual SphereThetaPhi<T>& Mul(T a);
207inline SphereThetaPhi<T>& operator *= (T x) { return Mul(x); }
208//! Divide all elements by \b x
209virtual SphereThetaPhi<T>& Div(T a);
210inline SphereThetaPhi<T>& operator /= (T x) { return Div(x); }
211
212// A += -= (ajoute, soustrait element par element les deux spheres )
213 //! Operator SphereThetaPhi += SphereThetaPhi
214 virtual SphereThetaPhi<T>& AddElt(const SphereThetaPhi<T>& a);
215 inline SphereThetaPhi<T>& operator += (const SphereThetaPhi<T>& a) { return AddElt(a); }
216
217
218
219 virtual SphereThetaPhi<T>& SubElt(const SphereThetaPhi<T>& a);
220 //! Operator SphereThetaPhi -= SphereThetaPhi
221 inline SphereThetaPhi<T>& operator -= (const SphereThetaPhi<T>& a) { return SubElt(a); }
222// Multiplication, division element par element les deux SphereThetaPhi
223 virtual SphereThetaPhi<T>& MulElt(const SphereThetaPhi<T>& a);
224 inline SphereThetaPhi<T>& operator *= (const SphereThetaPhi<T>& a) { return MulElt(a); }
225
226
227 void CloneOrShare(const SphereThetaPhi<T>& a);
228 void Share(const SphereThetaPhi<T>& a);
229
230 SphereThetaPhi<T>& CopyElt(const SphereThetaPhi<T>& a);
231
232
233
234
235
236
237 // friend declaration for classes which handle persistence and FITS IO
238 friend class FIO_SphereThetaPhi<T>;
239 friend class FITS_SphereThetaPhi<T>;
240
241protected :
242
243// ------------- méthodes internes ----------------------
244void InitNul();
245inline void setParameters( int nbThetaIndex, int nbpix, double omega)
246 {
247 NPix_= nbpix;
248 Omega_= omega;
249 NTheta_= nbThetaIndex;
250 }
251
252// ------------- variables internes ---------------------
253 int_4 NTheta_; // nombre de tranches en theta, pour une demi-sphere
254 int_4 NPix_; // nombre total de pixels
255 double Omega_; // angle solide constant pour chaque pixel
256 NDataBlock<int_4> NPhi_; // tableau donnant, pour chaque bande en theta,
257 //le nombre de pixels selon phi
258 NDataBlock<int_4> TNphi_;
259 NDataBlock<r_8> Theta_;
260 NDataBlock<T> pixels_;
261};
262
263////////////////////////////////////////////////////////////////
264// Surcharge d'operateurs A (+,-,*,/) (T) x
265/*! \ingroup SkyMap \fn operator+(const SphereThetaPhi<T>&,T)
266 \brief Operator SphereThetaPhi = SphereThetaPhi + constant */
267template <class T> inline SphereThetaPhi<T> operator + (const SphereThetaPhi<T>& a, T b)
268 {SphereThetaPhi<T> result; result.CloneOrShare(a); result.SetTemp(true);
269 result.Add(b); return result;}
270/*! \ingroup SkyMap \fn operator+(T,const SphereThetaPhi<T>&)
271 \brief Operator SphereThetaPhi = constant + SphereThetaPhi */
272template <class T> inline SphereThetaPhi<T> operator + (T b,const SphereThetaPhi<T>& a)
273 {SphereThetaPhi<T> result; result.CloneOrShare(a); result.SetTemp(true);
274 result.Add(b); return result;}
275
276
277/*! \ingroup SphereThetaPhi\fn operator-(const SphereThetaPhi<T>&,T)
278 \brief Operator SphereThetaPhi = SphereThetaPhi - constant */
279template <class T> inline SphereThetaPhi<T> operator - (const SphereThetaPhi<T>& a, T b)
280 {SphereThetaPhi<T> result; result.CloneOrShare(a); result.SetTemp(true);
281 result.Sub(b); return result;}
282
283/*! \ingroup \fn operator-(T,const SphereThetaPhi<T>&)
284 \brief Operator SphereThetaPhi = constant - SphereThetaPhi */
285template <class T> inline SphereThetaPhi<T> operator - (T b,const SphereThetaPhi<T>& a)
286 {SphereThetaPhi<T> result; result.CloneOrShare(a); result.SetTemp(true);
287 result.Sub(b,true); return result;}
288
289/*! \ingroup SkyMap \fn operator*(const SphereThetaPhi<T>&,T)
290 \brief Operator SphereThetaPhi = SphereThetaPhi * constant */
291template <class T> inline SphereThetaPhi<T> operator * (const SphereThetaPhi<T>& a, T b)
292 {SphereThetaPhi<T> result; result.CloneOrShare(a); result.SetTemp(true);
293 result.Mul(b); return result;}
294
295/*! \ingroup SkyMap \fn operator*(T,const SphereThetaPhi<T>&)
296 \brief Operator SphereThetaPhi = constant * SphereThetaPhi */
297template <class T> inline SphereThetaPhi<T> operator * (T b,const SphereThetaPhi<T>& a)
298 {SphereThetaPhi<T> result; result.CloneOrShare(a); result.SetTemp(true);
299 result.Mul(b); return result;}
300
301/*! \ingroup SkyMap \fn operator/(const SphereThetaPhi<T>&,T)
302 \brief Operator SphereThetaPhi = SphereThetaPhi / constant */
303template <class T> inline SphereThetaPhi<T> operator / (const SphereThetaPhi<T>& a, T b)
304 {SphereThetaPhi<T> result; result.CloneOrShare(a); result.SetTemp(true);
305 result.Div(b); return result;}
306
307/*! \ingroup SkyMap \fn operator/(T,const SphereThetaPhi<T>&)
308 \brief Operator SphereThetaPhi = constant / SphereThetaPhi */
309template <class T> inline SphereThetaPhi<T> operator / (T b, const SphereThetaPhi<T>& a)
310 {SphereThetaPhi<T> result; result.CloneOrShare(a); result.SetTemp(true);
311 result.Div(b, true); return result;}
312
313////////////////////////////////////////////////////////////////
314// Surcharge d'operateurs C = A (+,-) B
315
316/*! \ingroup SkyMap \fn operator+(const SphereThetaPhi<T>&,const SphereThetaPhi<T>&)
317 \brief Operator SphereThetaPhi = SphereThetaPhi + SphereThetaPhi */
318template <class T>
319inline SphereThetaPhi<T> operator + (const SphereThetaPhi<T>& a,const SphereThetaPhi<T>& b)
320 { SphereThetaPhi<T> result; result.SetTemp(true);
321 if (b.IsTemp()) { result.Share(b); result.AddElt(a); }
322 else { result.CloneOrShare(a); result.AddElt(b); }
323 return result; }
324
325/*! \ingroup SkyMap \fn operator-(const SphereThetaPhi<T>&,const SphereThetaPhi<T>&)
326 \brief Operator SphereThetaPhi = SphereThetaPhi - SphereThetaPhi */
327template <class T>
328inline SphereThetaPhi<T> operator - (const SphereThetaPhi<T>& a,const SphereThetaPhi<T>& b)
329 { SphereThetaPhi<T> result; result.SetTemp(true);
330 if (b.IsTemp()) { result.Share(b); result.SubElt(a, true); }
331 else { result.CloneOrShare(a); result.SubElt(b); }
332 return result; }
333
334
335} // Fin du namespace
336
337#endif
Note: See TracBrowser for help on using the repository browser.