source: Sophya/trunk/SophyaLib/SkyMap/spherethetaphi.cc@ 3174

Last change on this file since 3174 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: 21.6 KB
Line 
1#include "sopnamsp.h"
2#include "spherethetaphi.h"
3#include "smathconst.h"
4#include <complex>
5#include "fiondblock.h"
6#include <iostream>
7
8
9/*!
10 \class SOPHYA::SphereThetaPhi
11 \ingroup SkyMap
12
13 \brief Spherical map with equal latitude (iso-theta) rings
14
15
16 Class implementing spherical maps, with equal latitude (iso-theta) rings
17 pixelisation scheme - with template data types (double, float, complex, ...)
18
19 sphere splitted with respect to theta, phi : each hemisphere is
20 splitted into (m-1) parallels (equator does not enter into account).
21 This operation defines m slices, each of which is splitted into
22 equidistant meridians. This splitting is realized in such a way that
23 all pixels have the same area and are as square as possible.
24
25 One begins with the hemisphere with positive z, starting from the pole
26 toward the equator. The first pixel is the polar cap ; it is circular
27 and centered on theta=0.
28*/
29
30//***************************************************************
31//++
32// Class SphereThetaPhi
33//
34//
35// include spherethetaphi.h
36//--
37//++
38//
39// Links Parents
40//
41// SphericalMap
42//--
43
44/* --Methode-- */
45//++
46// Titre Constructors
47//--
48//++
49
50template <class T>
51SphereThetaPhi<T>::SphereThetaPhi()
52 : NPhi_(), TNphi_(), Theta_(), pixels_()
53
54//--
55{
56 InitNul();
57}
58
59
60/* --Methode-- */
61
62/*!
63 \brief Constructor with specification of number of slices (in a hemisphere)
64 \param m is the number of slices in theta on an hemisphere (the polar cap
65 forms the first slice).
66*/
67template <class T>
68SphereThetaPhi<T>::SphereThetaPhi(int_4 m)
69{
70 InitNul();
71 Pixelize(m);
72}
73
74//! Copy constructor (shares the pixel data if share==true)
75template <class T>
76SphereThetaPhi<T>::SphereThetaPhi(const SphereThetaPhi<T>& s, bool share)
77 : NPhi_(s.NPhi_, share), TNphi_(s.TNphi_, share), Theta_(s.Theta_, share),
78 pixels_(s.pixels_ , share)
79{
80
81 NTheta_= s.NTheta_;
82 NPix_ = s.NPix_;
83 Omega_ = s.Omega_;
84 if(s.mInfo_) this->mInfo_= new DVList(*s.mInfo_);
85}
86
87//! Copy constructor (shares the pixel data)
88template <class T>
89SphereThetaPhi<T>::SphereThetaPhi(const SphereThetaPhi<T>& s)
90 : NPhi_(s.NPhi_), TNphi_(s.TNphi_), Theta_(s.Theta_), pixels_(s.pixels_)
91{
92
93 NTheta_= s.NTheta_;
94 NPix_ = s.NPix_;
95 Omega_ = s.Omega_;
96 if(s.mInfo_) this->mInfo_= new DVList(*s.mInfo_);
97}
98
99//++
100// Titre Destructor
101//--
102//++
103template <class T>
104SphereThetaPhi<T>::~SphereThetaPhi()
105
106//--
107{}
108
109template <class T>
110void SphereThetaPhi<T>::InitNul()
111//
112{
113 NTheta_= 0;
114 NPix_ = 0;
115// pixels_.Reset(); Pas de reset par InitNul (en cas de share) - Reza 20/11/99 $CHECK$
116}
117
118
119//! re-pixelize the sphere if (m > 0)
120template <class T>
121void SphereThetaPhi<T>::Resize(int_4 m)
122{
123 if ((m <= 0) && (NTheta_ > 0) ) {
124 cout << "SphereThetaPhi<T>::Resize(m) with m<=0 - NOT resized" << endl;
125 return;
126 }
127 InitNul();
128 Pixelize(m);
129}
130
131//! Clone or share the SphereThetaPhi object \b a
132template<class T>
133void SphereThetaPhi<T>::CloneOrShare(const SphereThetaPhi<T>& a)
134{
135
136 NTheta_= a.NTheta_;
137 NPix_ = a.NPix_;
138 Omega_ = a.Omega_;
139 NPhi_.CloneOrShare(a.NPhi_);
140 TNphi_.CloneOrShare(a.TNphi_);
141 Theta_.CloneOrShare(a.Theta_);
142 pixels_.CloneOrShare(a.pixels_);
143 if (this->mInfo_) {delete this->mInfo_; this->mInfo_ = NULL;}
144 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
145}
146//! Share the pixel data with object \b a
147template<class T>
148void SphereThetaPhi<T>::Share(const SphereThetaPhi<T>& a)
149{
150
151 NTheta_= a.NTheta_;
152 NPix_ = a.NPix_;
153 Omega_ = a.Omega_;
154 NPhi_.Share(a.NPhi_);
155 TNphi_.Share(a.TNphi_);
156 Theta_.Share(a.Theta_);
157 pixels_.Share(a.pixels_);
158 if (this->mInfo_) {delete this->mInfo_; this->mInfo_ = NULL;}
159 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
160}
161
162////////////////////////// methodes de copie/share
163//! Perform data copy or shares the data
164template<class T>
165SphereThetaPhi<T>& SphereThetaPhi<T>::Set(const SphereThetaPhi<T>& a)
166{
167 if (this != &a)
168 {
169
170
171 if (a.NbPixels() < 1)
172 throw RangeCheckError("SphereThetaPhi<T>::Set(a ) - Array a not allocated ! ");
173 if (NbPixels() < 1) CloneOrShare(a);
174 else CopyElt(a);
175 if (this->mInfo_) delete this->mInfo_;
176 this->mInfo_ = NULL;
177 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
178 }
179 return(*this);
180}
181
182//! Perform data copy or shares the data
183template<class T>
184SphereThetaPhi<T>& SphereThetaPhi<T>::CopyElt(const SphereThetaPhi<T>& a)
185{
186 if (NbPixels() < 1)
187 throw RangeCheckError("SphereThetaPhi<T>::CopyElt(const SphereThetaPhi<T>& ) - Not Allocated Array ! ");
188 if (NbPixels() != a.NbPixels())
189 throw(SzMismatchError("SphereThetaPhi<T>::CopyElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
190
191 NTheta_= a.NTheta_;
192 NPix_ = a.NPix_;
193 Omega_ = a.Omega_;
194 int_4 k;
195 for (k=0; k< NPix_; k++) pixels_(k) = a.pixels_(k);
196 for (k=0; k< a.NPhi_.Size(); k++) NPhi_(k) = a.NPhi_(k);
197 for (k=0; k< a.TNphi_.Size(); k++) TNphi_(k) = a.TNphi_(k);
198 for (k=0; k< a.Theta_.Size(); k++) Theta_(k) = a.Theta_(k);
199 return(*this);
200
201}
202
203/* --Methode-- */
204//! Return total number of pixels
205template <class T>
206int_4 SphereThetaPhi<T>::NbPixels() const
207{
208 return(NPix_);
209}
210
211/* --Methode-- */
212//! Return value of pixel with index k
213template <class T>
214T& SphereThetaPhi<T>::PixVal(int_4 k)
215{
216 if((k < 0) || (k >= NPix_))
217 {
218 throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range");
219 }
220 return pixels_(k);
221}
222
223//! Return value of pixel with index k
224template <class T>
225T const& SphereThetaPhi<T>::PixVal(int_4 k) const
226{
227 if((k < 0) || (k >= NPix_))
228 {
229 throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range");
230 }
231 return *(pixels_.Data()+k);
232}
233
234/* --Methode-- */
235//! Return true if teta,phi in map
236template <class T>
237bool SphereThetaPhi<T>::ContainsSph(double /*theta*/, double /*phi*/) const
238{
239 return(true);
240}
241
242/* --Methode-- */
243//! Return index of the pixel corresponding to direction (theta, phi).
244template <class T>
245int_4 SphereThetaPhi<T>::PixIndexSph(double theta, double phi) const
246{
247 double dphi;
248 int_4 i,k;
249 bool fgzn = false;
250
251 if((theta > Pi) || (theta < 0.)) return(-1);
252 if((phi < 0.) || (phi > DeuxPi)) return(-1);
253 if(theta > Pi*0.5) {fgzn = true; theta = Pi-theta;}
254
255 // La bande d'indice kt est limitée par les valeurs de theta contenues dans
256 // Theta_[kt] et Theta_[kt+1]
257 for( i=1; i< NTheta_; i++ )
258 if( theta < Theta_(i) ) break;
259
260 dphi= DeuxPi/(double)NPhi_(i-1);
261
262 if (fgzn) k= NPix_-TNphi_(i)+(int_4)(phi/dphi);
263 else k= TNphi_(i-1)+(int_4)(phi/dphi);
264 return(k);
265}
266
267/* --Methode-- */
268//! Return (theta,phi) coordinates of middle of pixel with index k
269template <class T>
270void SphereThetaPhi<T>::PixThetaPhi(int_4 k,double& theta,double& phi) const
271{
272 int_4 i;
273 bool fgzn = false;
274
275 if((k < 0) || (k >= NPix_)) {theta = -99999.; phi = -99999.; return; }
276 if( k >= NPix_/2) {fgzn = true; k = NPix_-1-k;}
277
278 // recupère l'indice i de la tranche qui contient le pixel k
279 for( i=0; i< NTheta_; i++ )
280 if( k < TNphi_(i+1) ) break;
281
282 // angle theta
283 theta= 0.5*(Theta_(i)+Theta_(i+1));
284 if (fgzn) theta= Pi-theta;
285
286 // angle phi
287 k -= TNphi_(i);
288 phi= DeuxPi/(double)NPhi_(i)*(double)(k+.5);
289 if (fgzn) phi= DeuxPi-phi;
290}
291
292//! Setting pixel values to a constant
293template <class T>
294T SphereThetaPhi<T>::SetPixels(T v)
295{
296pixels_.Reset(v);
297return(v);
298}
299
300/*!
301 \brief Pixel Solid angle (steradians)
302 All the pixels have the same solid angle. The dummy argument is
303 for compatibility with eventual pixelizations which would not
304 fulfil this requirement.
305*/
306template <class T>
307double SphereThetaPhi<T>::PixSolAngle(int_4 /*dummy*/) const
308
309{
310 return Omega_;
311}
312
313/* --Methode-- */
314//! Return values of theta,phi which limit the pixel with index k
315template <class T>
316void SphereThetaPhi<T>::Limits(int_4 k,double& tetMin,double& tetMax,double& phiMin,double& phiMax)
317 {
318 int_4 j;
319 double dphi;
320 bool fgzn= false;
321
322 if((k < 0) || (k >= NPix_)) {
323 tetMin= -99999.;
324 phiMin= -99999.;
325 tetMax= -99999.;
326 phiMax= -99999.;
327 return;
328 }
329
330 // si on se trouve dans l'hémisphère Sud
331 if(k >= NPix_/2) {
332 fgzn= true;
333 k= NPix_-1-k;
334 }
335
336 // on recupere l'indice i de la tranche qui contient le pixel k
337 int_4 i;
338 for( i=0; i< NTheta_; i++ )
339 if(k < TNphi_(i+1)) break;
340
341 // valeurs limites de theta dans l'hemisphere Nord
342 tetMin= Theta_(i);
343 tetMax= Theta_(i+1);
344 // valeurs limites de theta dans l'hemisphere Sud
345 if (fgzn) {
346 tetMin= Pi - Theta_(i+1);
347 tetMax= Pi - Theta_(i);
348 }
349
350 // pixel correspondant dans l'hemisphere Nord
351 if (fgzn) k= TNphi_(i+1)-k+TNphi_(i)-1;
352
353 // indice j de discretisation ( phi= j*dphi )
354 j= k-TNphi_(i);
355 dphi= DeuxPi/(double)NPhi_(i);
356
357 // valeurs limites de phi
358 phiMin= dphi*(double)(j);
359 phiMax= dphi*(double)(j+1);
360 return;
361}
362
363/* --Methode-- */
364//! Return number of theta-slices on the sphere
365template <class T>
366uint_4 SphereThetaPhi<T>::NbThetaSlices() const
367{
368 if (NTheta_<=0)
369 {
370 throw PException(" sphere not pixelized, NbSlice=0 ");
371 }
372 return( 2*NTheta_);
373}
374
375/* --Methode-- */
376//! Return number of pixels along the phi-direction of the kt-th slice
377template <class T>
378int_4 SphereThetaPhi<T>::NPhi(int_4 kt) const
379{
380 int_4 nbpix;
381 // verification
382 if((kt < 0) || (kt >= 2*NTheta_)) return(-1);
383
384 // si on se trouve dans l'hemisphere Sud
385 if(kt >= NTheta_) {
386 kt= 2*NTheta_-1-kt;
387 }
388
389 // nombre de pixels
390 nbpix= NPhi_(kt);
391 return(nbpix);
392}
393
394
395/* --Methode-- */
396//! Return theta values which limit the slice kt
397template <class T>
398void SphereThetaPhi<T>::Theta(int_4 kt,double& tetMin,double& tetMax) const
399{
400 bool fgzn= false;
401 // verification
402 if( (kt< 0) || (kt>= 2*NTheta_) ) {
403 tetMin= -99999.;
404 tetMax= -99999.;
405 return;
406 }
407
408 // si on se trouve dans l'hemisphere Sud
409 if( kt >= NTheta_ ) {
410 fgzn= true;
411 kt= 2*NTheta_-1-kt;
412 }
413
414 // valeurs limites de theta dans l'hemisphere Nord
415 tetMin= Theta_(kt);
416 tetMax= Theta_(kt+1);
417 // valeurs limites de theta dans l'hemisphere Sud
418 if (fgzn) {
419 tetMin= Pi - Theta_(kt+1);
420 tetMax= Pi - Theta_(kt);
421 }
422}
423
424/* --Methode-- */
425//! Return values of phi which limit the jp-th pixel of the kt-th slice
426template <class T>
427void SphereThetaPhi<T>::Phi(int_4 kt,int_4 jp,double& phiMin,double& phiMax) const
428{
429 // verification
430 if((kt < 0) || (kt >= 2*NTheta_)) {
431 phiMin= -99999.;
432 phiMax= -99999.;
433 return;
434 }
435
436 // si on se trouve dans l'hemisphere Sud
437 if(kt >= NTheta_) kt= 2*NTheta_-1-kt;
438
439 // verifie si la tranche kt contient au moins jp pixels
440 if( (jp< 0) || (jp >= NPhi_(kt)) ) {
441 phiMin= -88888.;
442 phiMax= -88888.;
443 return;
444 }
445
446 double dphi= DeuxPi/(double)NPhi_(kt);
447 phiMin= dphi*(double)(jp);
448 phiMax= dphi*(double)(jp+1);
449 return;
450}
451
452/* --Methode-- */
453//! Return pixel index with sequence index jp in the slice kt
454template <class T>
455int_4 SphereThetaPhi<T>::Index(int_4 kt,int_4 jp) const
456{
457 int_4 k;
458 bool fgzn= false;
459
460 // si on se trouve dans l'hemisphere Sud
461 if(kt >= NTheta_) {
462 fgzn= true;
463 kt= 2*NTheta_-1-kt;
464 }
465
466 // si la tranche kt contient au moins i pixels
467 if( (jp>=0) && (jp<NPhi_(kt)) )
468 {
469 // dans l'hemisphere Sud
470 if (fgzn) k= NPix_-TNphi_(kt+1)+jp;
471 // dans l'hemisphere Nord
472 else k= TNphi_(kt)+jp;
473 }
474 else
475 {
476 k= 9999;
477 printf("\n la tranche %d ne contient pas un pixel de rang %d",kt,jp);
478 }
479 return(k);
480}
481
482/* --Methode-- */
483//! Return indices kt (theta) and jp (phi) of pixel with index k
484template <class T>
485void SphereThetaPhi<T>::ThetaPhiIndex(int_4 k,int_4& kt,int_4& jp)
486{
487 bool fgzn= false;
488 // si on se trouve dans l'hemisphere Sud
489 if(k >= NPix_/2)
490 {
491 fgzn= true;
492 k= NPix_-1-k;
493 }
494
495 // on recupere l'indice kt de la tranche qui contient le pixel k
496 int_4 i;
497 for(i = 0; i < NTheta_; i++)
498 if(k < TNphi_(i+1)) break;
499
500 // indice kt de tranche
501 if (fgzn) kt= 2*NTheta_-1-i;
502 else kt= i;
503
504 // indice jp de pixel
505 if (fgzn) jp= TNphi_(i+1)-k-1;
506 else jp= k-TNphi_(i);
507}
508/*!
509 \brief achieve the splitting into pixels
510 m has the same signification as for the constructor
511
512 Each theta-slice of the north hemisphere will be spitted starting f
513 from phi=0 ...
514
515 South hemisphere is scanned in the same direction according to phi
516 and from equator to the pole (the pixel following the last one of
517 the slice closest to the equator with z>0, is the pixel with lowest
518 phi of the slice closest of the equator with z<0).
519*/
520template <class T>
521void SphereThetaPhi<T>::Pixelize(int_4 m)
522
523//--
524{
525 int_4 ntotpix,j;
526
527 // Decodage et controle des arguments d'appel :
528 // au moins 2 et au plus 524288 bandes d'un hemisphere en theta
529 if (m < 2) m = 2;
530 if (m > 524288) m = 524288;
531
532 // On memorise les arguments d'appel
533 NTheta_ = m;
534
535 // On commence par decouper l'hemisphere z>0.
536 // Creation des vecteurs contenant :
537 // Les valeurs limites de theta (une valeur de plus que le nombre de bandes...)
538 // Theta_= new double[m+1];
539 Theta_.ReSize(m+1);
540
541 // Le nombre de pixels en phi de chacune des bandes en theta
542 // NPhi_ = new int_4[m];
543 // une taille de m suffit, mais je mets m+1 pour que les 3 tableaux aient
544 // la meme taille pour une manipulation plus faciles par la librairie
545 // cfitsio -- GLM (13-04-00)
546 NPhi_.ReSize(m+1);
547
548 // Le nombre/Deuxpi total des pixels contenus dans les bandes de z superieur a une
549 // bande donnee (mTPphi[m] contient le nombre de pixels total de l'hemisphere)
550 // TNphi_= new int_4[m+1];
551 TNphi_.ReSize(m+1);
552
553 // Calcul du nombre total de pixels dans chaque bande pour optimiser
554 // le rapport largeur/hauteur des pixels
555
556 //calotte polaire
557 TNphi_(0)= 0;
558 NPhi_(0) = 1;
559
560 //bandes jusqu'a l'equateur
561 for(j = 1; j < m; j++)
562 {
563 TNphi_(j)= TNphi_(j-1)+NPhi_(j-1);
564 NPhi_(j) = (int_4)(.5+4.*(double)(m-.5)*sin(Pi*(double)j/(double)(2.*m-1.))) ;
565 }
566
567 // Nombre total de pixels sur l'hemisphere
568 ntotpix = TNphi_(m-1)+NPhi_(m-1);
569 TNphi_(m)= ntotpix;
570 // et sur la sphere entiere
571 NPix_= 2*ntotpix;
572
573 // Creation et initialisation du vecteur des contenus des pixels
574 pixels_.ReSize(NPix_);
575 pixels_.Reset();
576
577 // Determination des limites des bandes en theta :
578 // omeg est l'angle solide couvert par chaque pixel,
579 // une bande donnee kt couvre un angle solide NPhi_[kt]*omeg
580 // egal a 2* Pi*(cos Theta_[kt]-cos Theta_[kt+1]). De meme, l'angle solide
581 //de la
582 // calotte allant du pole a la limite haute de la bande kt vaut
583 // 2* Pi*(1.-cos Theta_[kt+1])= TNphi_[kt]*omeg...
584
585 double omeg2pi= 1./(double)ntotpix;
586 Omega_ = omeg2pi*DeuxPi;
587
588 for(j=0; j <= m; j++)
589 {
590 Theta_(j)= acos(1.-(double)TNphi_(j)*omeg2pi);
591 }
592}
593
594//! Return the theta angle for slice defined by \b index
595template <class T>
596r_8 SphereThetaPhi<T>::ThetaOfSlice(int_4 index) const
597{
598 if(index < 0 || index >= 2*NTheta_)
599 throw RangeCheckError("SphereThetaPhi::ThetaOfSlice() index out of range");
600 double tet1, tet2;
601 Theta(index, tet1, tet2);
602 return 0.5*(tet1+tet2);
603}
604
605//! Return true : All theta slices have a symmetric slice at Pi-Theta in SphereThetaPhi
606template <class T>
607bool SphereThetaPhi<T>::HasSymThetaSlice() const
608{
609 return true;
610}
611//! Return the slice index for the symmetric slice at theta=Pi-ThetaOfSlice(idx)
612template <class T>
613int_4 SphereThetaPhi<T>::GetSymThetaSliceIndex(int_4 idx) const
614{
615 if(idx < 0 || idx >= NbThetaSlices())
616 throw RangeCheckError("SphereThetaPhi::GetSymThetaSliceIndex index out of range");
617 return (NbThetaSlices()-1-idx);
618}
619
620/*!
621 \brief return a Theta slice information
622 For a theta-slice with index 'index', return :
623 the corresponding "theta"
624 a vector containing the phi's of the pixels of the slice
625 a vector containing the corresponding values of pixels
626*/
627template <class T>
628void SphereThetaPhi<T>::GetThetaSlice(int_4 index,r_8& theta, TVector<r_8>& phi, TVector<T>& value) const
629
630{
631
632 if(index < 0 || index >= NbThetaSlices())
633 throw RangeCheckError("SphereThetaPhi::GetThetaSlice(idx...) index out of range");
634
635
636 int_4 iring= Index(index,0);
637 int_4 lring = NPhi(index);
638
639 phi.ReSize(lring);
640 value.ReSize(lring);
641 double Te= 0.;
642 double Fi= 0.;
643 PixThetaPhi(iring,Te,Fi);
644 double DFi = DeuxPi/(double)NPhi(index);
645 for(int_4 kk = 0; kk < lring; kk++) {
646 value(kk)= pixels_(kk+iring);
647 phi(kk)= Fi;
648 Fi += DFi;
649 }
650 theta= Te;
651}
652
653/*
654 \brief return information on a theta slice
655 For a theta-slice with index 'index', return :
656 the corresponding "theta"
657 the corresponding "phi" for first pixel of the slice
658 a vector containing the indices of the pixels of the slice
659 (equally distributed in phi)
660 a vector containing the corresponding values of pixels
661*/
662template <class T>
663void SphereThetaPhi<T>::GetThetaSlice(int_4 index,r_8& theta, r_8& phi0,TVector<int_4>& pixelIndices, TVector<T>& value) const
664
665{
666
667 if(index < 0 || index >= NbThetaSlices())
668 throw RangeCheckError("SphereThetaPhi::GetThetaSlice(idx...) idx out of range");
669
670 int_4 iring= Index(index,0);
671 int_4 lring = NPhi(index);
672
673 pixelIndices.ReSize(lring);
674 value.ReSize(lring);
675 double Te= 0.;
676 double Fi= 0.;
677 for(int_4 kk = 0; kk < lring; kk++) {
678 pixelIndices(kk)=kk+iring ;
679 value(kk)= pixels_(kk+iring);
680 }
681 PixThetaPhi(iring,theta,phi0);
682}
683
684//! return a pointer to the specified slice pixel data
685template <class T>
686T* SphereThetaPhi<T>::GetThetaSliceDataPtr(int_4 index)
687{
688 if(index < 0 || index >= NbThetaSlices())
689 throw RangeCheckError("SphereThetaPhi::GetThetaSliceDataPtr(idx) idx out of range");
690 return pixels_.Begin()+Index(index,0);
691}
692
693
694template <class T>
695void SphereThetaPhi<T>::print(ostream& os) const
696{
697 this->Show(os);
698 os << "SphereThetaPhi<T> NTheta_= " << NTheta_ << " NPix_ = " << NPix_
699 << " Omega_ = " << Omega_ << endl;
700 if(this->mInfo_) os << " DVList Info= " << *(this->mInfo_) << endl;
701
702 os << "... NPhi_ Values : ";
703 int_4 i;
704 for(i=0; i < NTheta_; i++)
705 {
706 if(i%5 == 0) os << endl;
707 os << NPhi_(i) <<", ";
708 }
709 os << endl;
710
711 os << "... Theta_ Values : ";
712 for(i=0; i < NTheta_+1; i++)
713 {
714 if(i%5 == 0) os << endl;
715 os << Theta_(i) <<", ";
716 }
717 os << endl;
718
719 os << "... TNphi_ Values : ";
720 for(i=0; i < NTheta_+1; i++)
721 {
722 if(i%5 == 0) os << endl;
723 os << TNphi_(i) <<", ";
724 }
725 os << endl;
726
727 os << "... Pixel Values : ";
728 for(i=0; i < NPix_; i++)
729 {
730 if(i%5 == 0) os << endl;
731 os << pixels_(i) <<", ";
732 }
733 os << endl;
734}
735
736// ...... Operations de calcul ......
737
738
739//! Fill a SphereThetaPhi with a constant value \b a
740template <class T>
741SphereThetaPhi<T>& SphereThetaPhi<T>::SetT(T a)
742{
743 if (NbPixels() < 1)
744 throw RangeCheckError("SphereThetaPhi<T>::SetT(T ) - SphereThetaPhi not dimensionned ! ");
745 pixels_ = a;
746 return (*this);
747}
748
749/*! Add a constant value \b x to a SphereThetaPhi */
750template <class T>
751SphereThetaPhi<T>& SphereThetaPhi<T>::Add(T a)
752 {
753 if (NbPixels()< 1)
754 throw RangeCheckError("SphereThetaPhi<T>::Add(T ) - SphereThetaPhi not dimensionned ! ");
755 pixels_ += a;
756 return (*this);
757}
758
759/*! Substract a constant value \b a to a SphereThetaPhi */
760template <class T>
761SphereThetaPhi<T>& SphereThetaPhi<T>::Sub(T a,bool fginv)
762{
763 if (NbPixels()< 1)
764 throw RangeCheckError("SphereThetaPhi<T>::Sub(T ) - SphereThetaPhi not dimensionned ! ");
765 pixels_.Sub(a,fginv);
766 return (*this);
767}
768
769/*! multiply a SphereThetaPhi by a constant value \b a */
770template <class T>
771SphereThetaPhi<T>& SphereThetaPhi<T>::Mul(T a)
772{
773 if (NbPixels()< 1)
774 throw RangeCheckError("SphereThetaPhi<T>::Mul(T ) - SphereThetaPhi not dimensionned ! ");
775 pixels_ *= a;
776 return (*this);
777}
778
779/*! divide a SphereThetaPhi by a constant value \b a */
780template <class T>
781SphereThetaPhi<T>& SphereThetaPhi<T>::Div(T a)
782{
783 if (NbPixels()< 1)
784 throw RangeCheckError("SphereThetaPhi<T>::Div(T ) - SphereThetaPhi not dimensionned ! ");
785 pixels_ /= a;
786 return (*this);
787}
788
789// >>>> Operations avec 2nd membre de type SphereThetaPhi
790//! Add two SphereThetaPhi
791
792template <class T>
793SphereThetaPhi<T>& SphereThetaPhi<T>::AddElt(const SphereThetaPhi<T>& a)
794{
795 if (NbPixels()!= a.NbPixels())
796 {
797 throw(SzMismatchError("SphereThetaPhi<T>::AddElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
798 }
799 pixels_ += a.pixels_;
800 return (*this);
801}
802
803//! Substract two SphereThetaPhi
804template <class T>
805SphereThetaPhi<T>& SphereThetaPhi<T>::SubElt(const SphereThetaPhi<T>& a)
806{
807 if (NbPixels()!= a.NbPixels())
808 {
809 throw(SzMismatchError("SphereThetaPhi<T>::SubElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
810 }
811 pixels_ -= a.pixels_;
812 return (*this);
813}
814
815//! Multiply two SphereThetaPhi (elements by elements)
816template <class T>
817SphereThetaPhi<T>& SphereThetaPhi<T>::MulElt(const SphereThetaPhi<T>& a)
818{
819 if (NbPixels()!= a.NbPixels())
820 {
821 throw(SzMismatchError("SphereThetaPhi<T>::MulElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
822 }
823 pixels_ *= a.pixels_;
824 return (*this);
825}
826
827//! Divide two SphereThetaPhi (elements by elements) - No protection for divide by 0
828template <class T>
829SphereThetaPhi<T>& SphereThetaPhi<T>::DivElt(const SphereThetaPhi<T>& a)
830{
831 if (NbPixels()!= a.NbPixels())
832 {
833 throw(SzMismatchError("SphereThetaPhi<T>::DivElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
834 }
835 pixels_ /= a.pixels_;
836 return (*this);
837}
838
839
840
841#ifdef __CXX_PRAGMA_TEMPLATES__
842#pragma define_template SphereThetaPhi<int_4>
843#pragma define_template SphereThetaPhi<r_8>
844#pragma define_template SphereThetaPhi<r_4>
845#pragma define_template SphereThetaPhi< complex<r_4> >
846#pragma define_template SphereThetaPhi< complex<r_8> >
847#endif
848#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
849namespace SOPHYA {
850template class SphereThetaPhi<int_4>;
851template class SphereThetaPhi<r_8>;
852template class SphereThetaPhi<r_4>;
853template class SphereThetaPhi< complex<r_4> >;
854template class SphereThetaPhi< complex<r_8> >;
855}
856#endif
Note: See TracBrowser for help on using the repository browser.