source: Sophya/trunk/SophyaLib/SkyMap/localmap.h@ 3868

Last change on this file since 3868 was 3836, checked in by ansari, 15 years ago

Declaration extern des classes templ des classes template avec instantiation explicite (avec flag NEED_EXT_DECL_TEMP) pour regler le pb de dynamic_cast sur Mac OS X 10.6, Reza 05/08/2010

File size: 12.5 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2#ifndef LOCALMAP_SEEN
3#define LOCALMAP_SEEN
4
5#include "pixelmap.h"
6#include "sphericalmap.h"
7#include "ndatablock.h"
8
9#include "anydataobj.h"
10#include "ppersist.h"
11
12
13
14// ***************** Class LocalMap *****************************
15
16
17
18namespace SOPHYA {
19
20
21template <class T>
22class FIO_LocalMap;
23
24template<class T>
25class FITS_LocalMap;
26
27/* Class LocalMap */
28
29
30template<class T>
31class LocalMap : public PixelMap<T>
32{
33
34 // friend declaration for classes which handle persistence and FITS IO
35 friend class FIO_LocalMap<T>;
36 friend class FITS_LocalMap<T>;
37
38public:
39
40LocalMap();
41LocalMap(int_4 nx, int_4 ny);
42LocalMap(int_4 nx, int_4 ny, double angleX,double angleY, double theta0,double phi0,int_4 x0,int_4 y0,double angle=0.);
43LocalMap(int_4 nx, int_4 ny, double angleX,double angleY, double theta0,double phi0, double angle=0.);
44LocalMap(const LocalMap<T>& lm, bool share);
45LocalMap(const LocalMap<T>& lm);
46virtual ~LocalMap();
47
48inline virtual bool IsTemp(void) const { return pixels_.IsTemp();}
49
50/*! Setting blockdata to temporary (see ndatablock documentation) */
51inline virtual void SetTemp(bool temp=false) const {pixels_.SetTemp(temp);};
52
53
54// ---------- Overloading of () to access pixel number k ----
55
56inline T& operator()(int_4 k) {return(this->PixVal(k));}
57inline T const& operator()(int_4 k) const {return(this->PixVal(k));}
58inline T& operator()(int_4 ix, int_4 iy) {return this->PixVal(iy*nSzX_+ix);};
59inline T const& operator()(int_4 ix, int_4 iy) const {return this->PixVal(iy*nSzX_+ix);};
60
61// Acces a un pixel
62inline T& operator()(double theta,double phi) {return(this->PixValSph(theta,phi));};
63inline T const& operator()(double theta,double phi) const {return(this->PixValSph(theta,phi));};
64
65// ---------- Definition of PixelMap abstract methods -------
66
67virtual int_4 NbPixels() const; // D.Y. int change en int_4 rationalisation Mac
68
69virtual T& PixVal(int_4 k);
70virtual T const& PixVal(int_4 k) const;
71 //! if fg = true, will generate exceptions , when theta-phi out of range
72inline void SetThrowExceptionWhenOutofMapFlag(bool fg = false) { exc_outofmap_ = fg; }
73
74//! true --> exceptions wil be active when theta-phi out of range
75inline bool GetThrowExceptionWhenOutofMapFlag() { return exc_outofmap_; }
76
77virtual bool ContainsSph(double theta, double phi) const;
78//! return pixel number correspoinding to (theta,phi)
79virtual int_4 PixIndexSph(double theta,double phi) const;
80
81//! return (theta,phi) correspoinding to pixel number k
82virtual void PixThetaPhi(int_4 k,double& theta,double& phi) const;
83
84//! set all pixel values equal to v
85virtual T SetPixels(T v);
86
87// return the solid angle covered by pixel k (steradians)
88virtual double PixSolAngle(int_4 k) const;
89
90// ---------- Specific methods ------------------------------
91
92void ReSize(int_4 nx, int_4 ny);
93
94void SetOrigin(double theta=90.,double phi=0.,double angle=0.);
95void SetOrigin(double theta,double phi,int_4 x0,int_4 y0,double angle=0.);
96void SetSize(double angleX,double angleY);
97
98 /*! \fn TypeOfMap()
99 return the string "LOCAL"
100 */
101inline virtual string TypeOfMap() const {return string("LOCAL");};
102
103
104/*! Check to see if the local mapping is done */
105inline bool LocalMap_isDone() const {return( originSet_ && angleSized_ && pixelSized_);};
106
107void PixThetaPhi(int_4 ip,int_4 it, double& theta,double& phi) const;
108
109
110void ProjectionToSphere(SphericalMap<T>&) const;
111
112/* There should be a more complex algorithm somewhere to combine *several* local maps to a full sphere.
113 -> static method, or separate class */
114
115/*! provides a integer characterizing the pixelization refinement (here : number of pixels) */
116inline virtual int_4 SizeIndex() const {return(nPix_);}
117inline int_4 Size_x() const {return nSzX_;}
118inline int_4 Size_y() const {return nSzY_;}
119
120/* Je rajoute ces 2 fonctions inlines pour compatibilite d'interface
121 avec TArray - Reza 30/8/2000 */
122inline int_4 SizeX() const {return nSzX_;}
123inline int_4 SizeY() const {return nSzY_;}
124
125inline void Origin(double& theta,double& phi,int_4& x0,int_4& y0,double& angle) const {theta= thetaDegresC_; phi= phiDegresC_; x0= x0_; y0= y0_;angle= angleDegres_;}
126
127/*! total aperture in theta and phi, in degrees ( from SetSize() ) */
128inline void Aperture(double& anglex,double& angley) const {anglex= angleDegresX_; angley= angleDegresY_;}
129
130
131/* Acces to the DataBlock */
132inline NDataBlock<T>& DataBlock() {return pixels_.DataBlock();}
133inline const NDataBlock<T>& DataBlock() const {return pixels_.DataBlock();}
134
135/* Acces to the matrix */
136//! access to matrix
137/*!
138 \warning : a pixel is defined by the pair of a phi-like index
139 (x-axis) and a theta-like index (y-axis). The phi-like index denotes
140 the column number in the matrix ; the theta-like index denotes the
141 row number.
142*/
143inline TMatrix<T>& Matrix() {return pixels_;}
144inline const TMatrix<T>& Matrix() const {return pixels_;}
145
146/* impression */
147void print(ostream& os) const;
148
149// Operations diverses = , +=, ...
150
151
152virtual LocalMap<T>& Set(const LocalMap<T>& a);
153inline LocalMap<T>& operator = (const LocalMap<T>& a) {return Set(a);}
154
155// A += -= *= /= x (ajoute, soustrait, ... x a tous les elements)
156
157 //! Fill LocalMap with all elements equal to \b x
158virtual LocalMap<T>& SetT(T a);
159inline LocalMap<T>& operator = (T a) {return SetT(a);}
160
161// Add \b x to all elements
162virtual LocalMap<T>& Add(T a);
163inline LocalMap<T>& operator += (T x) { return Add(x); }
164// Substract \b x to all elements
165virtual LocalMap<T>& Sub(T a,bool fginv=false);
166inline LocalMap<T>& operator -= (T x) { return Sub(x); }
167// Multiply all elements by \b x
168virtual LocalMap<T>& Mul(T a);
169inline LocalMap<T>& operator *= (T x) { return Mul(x); }
170// Divide all elements by \b x
171virtual LocalMap<T>& Div(T a);
172inline LocalMap<T>& operator /= (T x) { return Div(x); }
173
174// A += -= (ajoute, soustrait element par element les deux spheres )
175 //! Operator LocalMap += LocalMap
176 virtual LocalMap<T>& AddElt(const LocalMap<T>& a);
177 inline LocalMap<T>& operator += (const LocalMap<T>& a) { return AddElt(a); }
178
179
180
181 virtual LocalMap<T>& SubElt(const LocalMap<T>& a);
182 //! Operator LocalMap -= LocalMap
183 inline LocalMap<T>& operator -= (const LocalMap<T>& a) { return SubElt(a); }
184// Multiplication, division element par element les deux LocalMap
185 virtual LocalMap<T>& MulElt(const LocalMap<T>& a);
186 inline LocalMap<T>& operator *= (const LocalMap<T>& a) { return MulElt(a); }
187 virtual LocalMap<T>& DivElt(const LocalMap<T>& a);
188 inline LocalMap<T>& operator /= (const LocalMap<T>& a) { return DivElt(a); }
189
190
191void CloneOrShare(const LocalMap<T>& a);
192void Share(const LocalMap<T>& a);
193LocalMap<T>& CopyElt(const LocalMap<T>& a);
194
195//! assign a new object Id (or DataRef Id) - useful for PPF write operations
196 inline void RenewObjId() { pixels_.RenewObjId(); }
197
198// ---------- Méthodes internes -----------------------------
199
200private :
201
202void InitNul();
203void SetCoorC(double theta0, double phi0);
204TMatrix<double> CalculMatricePassage();
205void Getij(int_4 k,int_4& i,int_4& j) const;
206 void PixToSphereC(int_4 ip, int_4 it, double& XP, double& YP, double& ZP) const;
207
208void recopierVariablesSimples(const LocalMap<T>& lm);
209
210void initializationError() const;
211
212
213// ---------- Variables internes ----------------------------
214 // variables suffisantes pour reconstruire l'objet
215
216 bool pixelSized_;
217 bool angleSized_;
218 bool originSet_;
219
220 int_4 nSzX_;
221 int_4 nSzY_;
222 double angleDegresX_;
223 double angleDegresY_;
224 double thetaDegresC_;
225 double phiDegresC_;
226 int_4 x0_;
227 int_4 y0_;
228 double angleDegres_;
229
230
231 // NDataBlock<T> pixels_;
232 TMatrix<T> pixels_;
233
234
235 // variables derivees (redondantes, precalculees pour ameliorer
236 // les performances)
237
238 int_4 nPix_;
239
240
241 double thetaC_;
242 double phiC_;
243 double csthC_;
244 double snthC_;
245 double csphC_;
246 double snphC_;
247 double XC_;
248 double YC_;
249 double ZC_;
250
251
252 double angle_;
253 double cosAngle_;
254 double sinAngle_;
255 double deltaPhi_;
256 double deltaTheta_;
257
258 bool exc_outofmap_;
259
260
261};
262
263////////////////////////////////////////////////////////////////
264// Surcharge d'operateurs A (+,-,*,/) (T) x
265/*! \ingroup SkyMap \fn operator+(const LocalMap<T>&,T)
266 \brief Operator LocalMap = LocalMap + constant */
267template <class T> inline LocalMap<T> operator + (const LocalMap<T>& a, T b)
268 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
269 result.Add(b); return result;}
270/*! \ingroup SkyMap \fn operator+(T,const LocalMap<T>&)
271 \brief Operator LocalMap = constant + LocalMap */
272template <class T> inline LocalMap<T> operator + (T b,const LocalMap<T>& a)
273 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
274 result.Add(b); return result;}
275
276
277/*! \ingroup SkyMap\fn operator-(const LocalMap<T>&,T)
278 \brief Operator LocalMap = LocalMap - constant */
279template <class T> inline LocalMap<T> operator - (const LocalMap<T>& a, T b)
280 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
281 result.Sub(b); return result;}
282
283/*! \ingroup \fn operator-(T,const LocalMap<T>&)
284 \brief Operator LocalMap = constant - LocalMap */
285template <class T> inline LocalMap<T> operator - (T b,const LocalMap<T>& a)
286 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
287 result.Sub(b,true); return result;}
288
289/*! \ingroup SkyMap \fn operator*(const LocalMap<T>&,T)
290 \brief Operator LocalMap = LocalMap * constant */
291template <class T> inline LocalMap<T> operator * (const LocalMap<T>& a, T b)
292 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
293 result.Mul(b); return result;}
294
295/*! \ingroup SkyMap \fn operator*(T,const LocalMap<T>&)
296 \brief Operator LocalMap = constant * LocalMap */
297template <class T> inline LocalMap<T> operator * (T b,const LocalMap<T>& a)
298 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
299 result.Mul(b); return result;}
300
301/*! \ingroup SkyMap \fn operator/(const LocalMap<T>&,T)
302 \brief Operator LocalMap = LocalMap / constant */
303template <class T> inline LocalMap<T> operator / (const LocalMap<T>& a, T b)
304 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
305 result.Div(b); return result;}
306
307/*! \ingroup SkyMap \fn operator/(T,const LocalMap<T>&)
308 \brief Operator LocalMap = constant / LocalMap */
309template <class T> inline LocalMap<T> operator / (T b, const LocalMap<T>& a)
310 {LocalMap<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 LocalMap<T>&,const LocalMap<T>&)
317 \brief Operator LocalMap = LocalMap + LocalMap */
318template <class T>
319inline LocalMap<T> operator + (const LocalMap<T>& a,const LocalMap<T>& b)
320 { LocalMap<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 LocalMap<T>&,const LocalMap<T>&)
326 \brief Operator LocalMap = LocalMap - LocalMap */
327template <class T>
328inline LocalMap<T> operator - (const LocalMap<T>& a,const LocalMap<T>& b)
329 { LocalMap<T> result; result.SetTemp(true);
330 if (b.IsTemp()) { result.Share(b); result.SubElt(a); }
331 else { result.CloneOrShare(a); result.SubElt(b); }
332 return result; }
333
334////////////////////////////////////////////////////////////////
335// Surcharge d'operateurs C = A (*,/) B
336
337/*! \ingroup SkyMap \fn operator*(const LocalMap<T>&,const LocalMap<T>&)
338 \brief Operator LocalMap = LocalMap * LocalMap (pixel by pixel multiply)*/
339template <class T>
340inline LocalMap<T> operator * (const LocalMap<T>& a,const LocalMap<T>& b)
341 { LocalMap<T> result; result.SetTemp(true);
342 if (b.IsTemp()) { result.Share(b); result.MulElt(a); }
343 else { result.CloneOrShare(a); result.MulElt(b); }
344 return result; }
345
346/*! \ingroup SkyMap \fn operator/(const LocalMap<T>&,const LocalMap<T>&)
347 \brief Operator LocalMap = LocalMap / LocalMap (pixel by pixel divide)*/
348template <class T>
349inline LocalMap<T> operator / (const LocalMap<T>& a,const LocalMap<T>& b)
350 { LocalMap<T> result; result.SetTemp(true);
351 result.CloneOrShare(a); result.DivElt(b);
352 return result; }
353
354//--------- extern template declarations (if needed) -----------
355#if defined ( NEED_EXT_DECL_TEMP ) && !defined( LOCALMAP_CC_BFILE )
356extern template class LocalMap<int_4>;
357extern template class LocalMap<r_8>;
358extern template class LocalMap<r_4>;
359extern template class LocalMap< complex<r_8> >;
360extern template class LocalMap< complex<r_4> >;
361#endif // Fin de if defined ( NEED_EXT_DECL_TEMP )
362
363
364
365} // Fin du namespace
366
367#endif
Note: See TracBrowser for help on using the repository browser.