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

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

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

File size: 9.9 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
21/* Class LocalMap */
22
23
24template<class T>
25class LocalMap : public PixelMap<T>
26{
27
28public:
29
30LocalMap();
31LocalMap(int_4 nx, int_4 ny);
32LocalMap(const LocalMap<T>& lm, bool share);
33LocalMap(const LocalMap<T>& lm);
34virtual ~LocalMap();
35
36inline virtual bool IsTemp(void) const { return pixels_.IsTemp();}
37
38/*! Setting blockdata to temporary (see ndatablock documentation) */
39inline virtual void SetTemp(bool temp=false) const {pixels_.SetTemp(temp);};
40
41
42// ---------- Overloading of () to access pixel number k ----
43
44inline T& operator()(int_4 k) {return(PixVal(k));}
45inline T const& operator()(int_4 k) const {return(PixVal(k));}
46inline T& operator()(int_4 ix, int_4 iy) {return PixVal(iy*nSzX_+ix);};
47inline T const& operator()(int_4 ix, int_4 iy) const {return PixVal(iy*nSzX_+ix);};
48
49// ---------- Definition of PixelMap abstract methods -------
50
51virtual int_4 NbPixels() const; // D.Y. int change en int_4 rationalisation Mac
52
53virtual T& PixVal(int_4 k);
54virtual T const& PixVal(int_4 k) const;
55
56virtual bool ContainsSph(double theta, double phi) const;
57virtual int_4 PixIndexSph(double theta,double phi) const;
58
59virtual void PixThetaPhi(int_4 k,double& theta,double& phi) const;
60
61virtual T SetPixels(T v);
62
63virtual double PixSolAngle(int_4 k) const;
64
65// ---------- Specific methods ------------------------------
66
67void ReSize(int_4 nx, int_4 ny);
68
69inline virtual char* TypeOfMap() const {return "LOCAL";};
70
71virtual void SetOrigin(double theta=90.,double phi=0.,double angle=0.);
72virtual void SetOrigin(double theta,double phi,int_4 x0,int_4 y0,double angle=0.);
73
74virtual void SetSize(double angleX,double angleY);
75
76/*! Check to see if the local mapping is done */
77inline bool LocalMap_isDone() const {return(originFlag_ && extensFlag_);};
78
79virtual void Project(SphericalMap<T>& sphere) const;
80
81/* There should be a more complex algorithm somewhere to combine *several* local maps to a full sphere.
82 -> static method, or separate class */
83
84/*! provides a integer characterizing the pixelization refinement (here : number of pixels) */
85inline virtual int_4 SizeIndex() const {return(nPix_);}
86inline int_4 Size_x() const {return nSzX_;}
87inline int_4 Size_y() const {return nSzY_;}
88
89/* Je rajoute ces 2 fonctions inlines pour compatibilite d'interface
90 avec TArray - Reza 30/8/2000 */
91inline int_4 SizeX() const {return nSzX_;}
92inline int_4 SizeY() const {return nSzY_;}
93
94inline void Origin(double& theta,double& phi,int_4& x0,int_4& y0,double& angle) const {theta= theta0_; phi= phi0_; x0= x0_; y0= y0_;angle= angle_;}
95
96inline void Aperture(double& anglex,double& angley) const {anglex= angleX_; angley= angleY_;}
97
98
99/* Acces to the DataBlock */
100inline NDataBlock<T>& DataBlock() {return pixels_;}
101inline const NDataBlock<T>& DataBlock() const {return pixels_;}
102
103/* impression */
104void print(ostream& os) const;
105
106// Operations diverses = , +=, ...
107
108
109virtual LocalMap<T>& Set(const LocalMap<T>& a);
110inline LocalMap<T>& operator = (const LocalMap<T>& a) {return Set(a);}
111
112// A += -= *= /= x (ajoute, soustrait, ... x a tous les elements)
113
114 //! Fill LocalMap with all elements equal to \b x
115virtual LocalMap<T>& SetT(T a);
116inline LocalMap<T>& operator = (T a) {return SetT(a);}
117
118//! Add \b x to all elements
119virtual LocalMap<T>& Add(T a);
120inline LocalMap<T>& operator += (T x) { return Add(x); }
121//! Substract \b x to all elements
122virtual LocalMap<T>& Sub(T a,bool fginv=false);
123inline LocalMap<T>& operator -= (T x) { return Sub(x); }
124//! Multiply all elements by \b x
125virtual LocalMap<T>& Mul(T a);
126inline LocalMap<T>& operator *= (T x) { return Mul(x); }
127//! Divide all elements by \b x
128virtual LocalMap<T>& Div(T a);
129inline LocalMap<T>& operator /= (T x) { return Div(x); }
130
131// A += -= (ajoute, soustrait element par element les deux spheres )
132 //! Operator LocalMap += LocalMap
133 virtual LocalMap<T>& AddElt(const LocalMap<T>& a);
134 inline LocalMap<T>& operator += (const LocalMap<T>& a) { return AddElt(a); }
135
136
137
138 virtual LocalMap<T>& SubElt(const LocalMap<T>& a);
139 //! Operator LocalMap -= LocalMap
140 inline LocalMap<T>& operator -= (const LocalMap<T>& a) { return SubElt(a); }
141// Multiplication, division element par element les deux LocalMap
142 virtual LocalMap<T>& MulElt(const LocalMap<T>& a);
143 inline LocalMap<T>& operator *= (const LocalMap<T>& a) { return MulElt(a); }
144 virtual LocalMap<T>& DivElt(const LocalMap<T>& a);
145 inline LocalMap<T>& operator /= (const LocalMap<T>& a) { return DivElt(a); }
146
147
148void CloneOrShare(const LocalMap<T>& a);
149void Share(const LocalMap<T>& a);
150LocalMap<T>& CopyElt(const LocalMap<T>& a);
151
152
153// ---------- Méthodes internes -----------------------------
154
155private :
156
157void InitNul();
158void Getij(int_4 k,int_4& i,int_4& j) const;
159void ReferenceToUser(double& theta,double& phi) const;
160void UserToReference(double& theta,double& phi) const;
161void PixProjToAngle(double x,double y,double& theta,double& phi) const;
162void AngleProjToPix(double theta,double phi,double& x,double& y) const;
163
164void recopierVariablesSimples(const LocalMap<T>& lm);
165
166
167// ---------- Variables internes ----------------------------
168
169int_4 nSzX_;
170int_4 nSzY_;
171int_4 nPix_;
172bool originFlag_;
173bool extensFlag_;
174int_4 x0_;
175int_4 y0_;
176double theta0_;
177double phi0_;
178double angle_;
179double cos_angle_;
180double sin_angle_;
181double angleX_;
182double angleY_;
183double tgAngleX_;
184double tgAngleY_;
185NDataBlock<T> pixels_;
186};
187
188////////////////////////////////////////////////////////////////
189// Surcharge d'operateurs A (+,-,*,/) (T) x
190/*! \ingroup SkyMap \fn operator+(const LocalMap<T>&,T)
191 \brief Operator LocalMap = LocalMap + constant */
192template <class T> inline LocalMap<T> operator + (const LocalMap<T>& a, T b)
193 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
194 result.Add(b); return result;}
195/*! \ingroup SkyMap \fn operator+(T,const LocalMap<T>&)
196 \brief Operator LocalMap = constant + LocalMap */
197template <class T> inline LocalMap<T> operator + (T b,const LocalMap<T>& a)
198 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
199 result.Add(b); return result;}
200
201
202/*! \ingroup SkyMap\fn operator-(const LocalMap<T>&,T)
203 \brief Operator LocalMap = LocalMap - constant */
204template <class T> inline LocalMap<T> operator - (const LocalMap<T>& a, T b)
205 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
206 result.Sub(b); return result;}
207
208/*! \ingroup \fn operator-(T,const LocalMap<T>&)
209 \brief Operator LocalMap = constant - LocalMap */
210template <class T> inline LocalMap<T> operator - (T b,const LocalMap<T>& a)
211 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
212 result.Sub(b,true); return result;}
213
214/*! \ingroup SkyMap \fn operator*(const LocalMap<T>&,T)
215 \brief Operator LocalMap = LocalMap * constant */
216template <class T> inline LocalMap<T> operator * (const LocalMap<T>& a, T b)
217 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
218 result.Mul(b); return result;}
219
220/*! \ingroup SkyMap \fn operator*(T,const LocalMap<T>&)
221 \brief Operator LocalMap = constant * LocalMap */
222template <class T> inline LocalMap<T> operator * (T b,const LocalMap<T>& a)
223 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
224 result.Mul(b); return result;}
225
226/*! \ingroup SkyMap \fn operator/(const LocalMap<T>&,T)
227 \brief Operator LocalMap = LocalMap / constant */
228template <class T> inline LocalMap<T> operator / (const LocalMap<T>& a, T b)
229 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
230 result.Div(b); return result;}
231
232/*! \ingroup SkyMap \fn operator/(T,const LocalMap<T>&)
233 \brief Operator LocalMap = constant / LocalMap */
234template <class T> inline LocalMap<T> operator / (T b, const LocalMap<T>& a)
235 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
236 result.Div(b, true); return result;}
237
238////////////////////////////////////////////////////////////////
239// Surcharge d'operateurs C = A (+,-) B
240
241/*! \ingroup SkyMap \fn operator+(const LocalMap<T>&,const LocalMap<T>&)
242 \brief Operator LocalMap = LocalMap + LocalMap */
243template <class T>
244inline LocalMap<T> operator + (const LocalMap<T>& a,const LocalMap<T>& b)
245 { LocalMap<T> result; result.SetTemp(true);
246 if (b.IsTemp()) { result.Share(b); result.AddElt(a); }
247 else { result.CloneOrShare(a); result.AddElt(b); }
248 return result; }
249
250/*! \ingroup SkyMap \fn operator-(const LocalMap<T>&,const LocalMap<T>&)
251 \brief Operator LocalMap = LocalMap - LocalMap */
252template <class T>
253inline LocalMap<T> operator - (const LocalMap<T>& a,const LocalMap<T>& b)
254 { LocalMap<T> result; result.SetTemp(true);
255 if (b.IsTemp()) { result.Share(b); result.SubElt(a); }
256 else { result.CloneOrShare(a); result.SubElt(b); }
257 return result; }
258
259////////////////////////////////////////////////////////////////
260// Surcharge d'operateurs C = A (*,/) B
261
262/*! \ingroup SkyMap \fn operator*(const LocalMap<T>&,const LocalMap<T>&)
263 \brief Operator LocalMap = LocalMap * LocalMap (pixel by pixel multiply)*/
264template <class T>
265inline LocalMap<T> operator * (const LocalMap<T>& a,const LocalMap<T>& b)
266 { LocalMap<T> result; result.SetTemp(true);
267 if (b.IsTemp()) { result.Share(b); result.MulElt(a); }
268 else { result.CloneOrShare(a); result.MulElt(b); }
269 return result; }
270
271/*! \ingroup SkyMap \fn operator/(const LocalMap<T>&,const LocalMap<T>&)
272 \brief Operator LocalMap = LocalMap / LocalMap (pixel by pixel divide)*/
273template <class T>
274inline LocalMap<T> operator / (const LocalMap<T>& a,const LocalMap<T>& b)
275 { LocalMap<T> result; result.SetTemp(true);
276 if (b.IsTemp()) { result.Share(b); result.DivElt(a); }
277 else { result.CloneOrShare(a); result.DivElt(b); }
278 return result; }
279
280
281
282} // Fin du namespace
283
284#endif
Note: See TracBrowser for help on using the repository browser.