source: Sophya/trunk/SophyaLib/SkyMap/spherehealpix.cc@ 3206

Last change on this file since 3206 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: 18.9 KB
Line 
1#include "sopnamsp.h"
2#include "machdefs.h"
3#include <math.h>
4#include <complex>
5
6#include "pexceptions.h"
7#include "fiondblock.h"
8#include "spherehealpix.h"
9#include "strutil.h"
10
11extern "C"
12{
13#include <stdio.h>
14#include <stdlib.h>
15#include <unistd.h>
16}
17
18using namespace SOPHYA;
19
20/*!
21 \class SOPHYA::SphereHEALPix
22 \ingroup SkyMap
23 \brief Spherical maps in HEALPix pixelisation scheme.
24
25 Class implementing spherical maps, in the HEALPix pixelisation scheme,
26 with template data types (double, float, complex, ...)
27
28
29\verbatim
30 Adapted from :
31 -----------------------------------------------------------------------
32 version 0.8.2 Aug97 TAC Eric Hivon, Kris Gorski
33 -----------------------------------------------------------------------
34
35 the sphere is split in 12 diamond-faces containing nside**2 pixels each
36 the numbering of the pixels (in the nested scheme) is similar to
37 quad-cube
38 In each face the first pixel is in the lowest corner of the diamond
39 the faces are (x,y) coordinate on each face
40
41 . . . . <--- North Pole
42 / \ / \ / \ / \ ^ ^
43 . 0 . 1 . 2 . 3 . <--- z = 2/3 \ /
44 \ / \ / \ / \ / y \ / x
45 4 . 5 . 6 . 7 . 4 <--- equator \ /
46 / \ / \ / \ / \ \/
47 . 8 . 9 .10 .11 . <--- z = -2/3 (0,0) : lowest corner
48 \ / \ / \ / \ /
49 . . . . <--- South Pole
50\endverbatim
51 phi:0 2Pi
52
53 in the ring scheme pixels are numbered along the parallels
54 the first parallel is the one closest to the north pole and so on
55 on each parallel, pixels are numbered starting from the one closest
56 to phi = 0
57
58 nside MUST be a power of 2 (<= 8192)
59
60*/
61
62/* --Methode-- */
63
64//! Default constructor - optional pixelisation scheme parameter
65template<class T>
66SphereHEALPix<T>::SphereHEALPix(bool fgring) : fgring_(fgring), pixels_(),
67 sliceBeginIndex_(), sliceLenght_()
68
69{
70 InitNul();
71}
72
73/*! \brief Constructor with specification of nside and optional pixelisation scheme
74
75 \param <m> : "nside" of the Healpix algorithm
76 \param <fgring> : if true -> RING pixelisation (default), if not NESTED
77
78 The total number of pixels will be Npix = 12*nside**2
79
80 nside MUST be a power of 2 (<= 8192)
81*/
82
83template<class T>
84SphereHEALPix<T>::SphereHEALPix(int_4 m, bool fgring)
85
86{
87 fgring_ = fgring;
88 InitNul();
89 Pixelize(m);
90 SetThetaSlices();
91}
92//! Copy constructor
93template<class T>
94SphereHEALPix<T>::SphereHEALPix(const SphereHEALPix<T>& s, bool share)
95 : pixels_(s.pixels_, share), sliceBeginIndex_(s.sliceBeginIndex_, share),
96 sliceLenght_(s.sliceLenght_, share)
97//--
98{
99 nSide_= s.nSide_;
100 nPix_ = s.nPix_;
101 omeg_ = s.omeg_;
102 fgring_ = s.fgring_;
103 if(s.mInfo_) this->mInfo_= new DVList(*s.mInfo_);
104}
105//++
106template<class T>
107SphereHEALPix<T>::SphereHEALPix(const SphereHEALPix<T>& s)
108 : pixels_(s.pixels_), sliceBeginIndex_(s.sliceBeginIndex_),
109 sliceLenght_(s.sliceLenght_)
110// copy constructor
111//--
112{
113 nSide_= s.nSide_;
114 nPix_ = s.nPix_;
115 omeg_ = s.omeg_;
116 fgring_ = s.fgring_;
117 if(s.mInfo_) this->mInfo_= new DVList(*s.mInfo_);
118 // CloneOrShare(s);
119}
120
121//! Clone if \b a is not temporary, share if temporary
122/*! \sa NDataBlock::CloneOrShare(const NDataBlock<T>&) */
123template<class T>
124void SphereHEALPix<T>::CloneOrShare(const SphereHEALPix<T>& a)
125{
126 nSide_= a.nSide_;
127 nPix_ = a.nPix_;
128 omeg_ = a.omeg_;
129 fgring_ = a.fgring_;
130 pixels_.CloneOrShare(a.pixels_);
131 sliceBeginIndex_.CloneOrShare(a.sliceBeginIndex_);
132 sliceLenght_.CloneOrShare(a.sliceLenght_);
133 if (this->mInfo_) {delete this->mInfo_; this->mInfo_ = NULL;}
134 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
135}
136
137//! Share data with a
138template<class T>
139void SphereHEALPix<T>::Share(const SphereHEALPix<T>& a)
140{
141 nSide_= a.nSide_;
142 nPix_ = a.nPix_;
143 omeg_ = a.omeg_;
144 fgring_ = a.fgring_;
145 pixels_.Share(a.pixels_);
146 sliceBeginIndex_.Share(a.sliceBeginIndex_);
147 sliceLenght_.Share(a.sliceLenght_);
148 if (this->mInfo_) {delete this->mInfo_; this->mInfo_ = NULL;}
149 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
150}
151
152////////////////////////// methodes de copie/share
153template<class T>
154SphereHEALPix<T>& SphereHEALPix<T>::Set(const SphereHEALPix<T>& a)
155{
156 if (this != &a) {
157 if (a.NbPixels() < 1)
158 throw RangeCheckError("SphereHEALPix<T>::Set(a ) - SphereHEALPix a not allocated ! ");
159 if (NbPixels() < 1) CloneOrShare(a);
160 else CopyElt(a);
161
162 if (this->mInfo_) delete this->mInfo_;
163 this->mInfo_ = NULL;
164 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
165 }
166 return(*this);
167}
168
169template<class T>
170SphereHEALPix<T>& SphereHEALPix<T>::CopyElt(const SphereHEALPix<T>& a)
171{
172 if (NbPixels() < 1)
173 throw RangeCheckError("SphereHEALPix<T>::CopyElt(a) - Not Allocated SphereHEALPix ! ");
174 if (NbPixels() != a.NbPixels())
175 throw(SzMismatchError("SphereHEALPix<T>::CopyElt(a) SizeMismatch")) ;
176 nSide_= a.nSide_;
177 nPix_ = a.nPix_;
178 omeg_ = a.omeg_;
179 int k;
180 if (fgring_ == a.fgring_)
181 for (k=0; k< nPix_; k++) pixels_(k) = a.pixels_(k);
182 else {
183 if (fgring_) for (k=0; k< nPix_; k++)
184 pixels_(k) = a.pixels_(ring2nest(nSide_, k));
185 else for (k=0; k< nPix_; k++)
186 pixels_(k) = a.pixels_(nest2ring(nSide_, k));
187 }
188 for (k=0; k< a.sliceBeginIndex_.Size(); k++) sliceBeginIndex_(k) = a.sliceBeginIndex_(k);
189 for (k=0; k< a.sliceLenght_.Size(); k++) sliceLenght_(k) = a.sliceLenght_(k);
190 return(*this);
191}
192
193template<class T>
194SphereHEALPix<T>::~SphereHEALPix()
195{
196}
197
198/*! \fn void SOPHYA::SphereHEALPix::Resize(int_4 m)
199 \param <m> "nside" of the HEALPix algorithm
200
201 The total number of pixels will be Npix = 12*nside**2
202
203 nside MUST be a power of 2 (<= 8192)
204*/
205template<class T>
206void SphereHEALPix<T>::Resize(int_4 m)
207{
208 if ((m <= 0 && nSide_ > 0)) {
209 cout << "SphereHEALPix<T>::Resize(m) with m<=0, NOT resized" << endl;
210 return;
211 }
212 InitNul();
213 Pixelize(m);
214 SetThetaSlices();
215}
216
217
218//! return type of the map pixelisation : RING or NESTED
219template<class T>
220string SphereHEALPix<T>::TypeOfMap() const
221{
222 if (fgring_) return string("RING");
223 else return string("NESTED");
224}
225
226template<class T>
227void SphereHEALPix<T>::Pixelize( int_4 m)
228// prépare la pixelisation Gorski (m a la même signification
229// que pour le constructeur)
230{
231 if (m<=0 || m> 8192) {
232 cout << "SphereHEALPix<T>::Pixelize() m=" << m <<" out of range [0,8192]" << endl;
233 throw ParmError("SphereHEALPix<T>::Pixelize() m out of range");
234 }
235 // verifier que m est une puissance de deux
236 int x= m;
237 while (x%2==0) x/=2;
238 if(x != 1) {
239 cout << "SphereHEALPix<T>::Pixelize() m=" << m << " != 2^n " << endl;
240 throw ParmError("SphereHEALPix<T>::Pixelize() m!=2^n");
241 }
242
243 // On memorise les arguments d'appel
244 nSide_= m;
245
246 // Nombre total de pixels sur la sphere entiere
247 nPix_= 12*nSide_*nSide_;
248
249 // pour le moment les tableaux qui suivent seront ranges dans l'ordre
250 // de l'indexation GORSKY "RING"
251 // on pourra ulterieurement changer de strategie et tirer profit
252 // de la dualite d'indexation GORSKY (RING et NEST) : tout dependra
253 // de pourquoi c'est faire
254
255 // Creation et initialisation du vecteur des contenus des pixels
256 pixels_.ReSize(nPix_);
257 pixels_.Reset();
258
259 // solid angle per pixel
260 omeg_= 4.0*Pi/nPix_;
261}
262
263template<class T>
264void SphereHEALPix<T>::InitNul()
265//
266// initialise à zéro les variables de classe
267{
268 nSide_= 0;
269 nPix_ = 0;
270 omeg_ = 0.;
271// pixels_.Reset(); - Il ne faut pas mettre les pixels a zero si share !
272}
273
274/* --Methode-- */
275/* Nombre de pixels du decoupage */
276/*! \fn int_4 SOPHYA::SphereHEALPix::NbPixels() const
277
278 Return number of pixels of the splitting
279*/
280template<class T>
281int_4 SphereHEALPix<T>::NbPixels() const
282{
283 return(nPix_);
284}
285
286
287/*! \fn uint_4 SOPHYA::SphereHEALPix::NbThetaSlices() const
288
289 \return number of slices in theta direction on the sphere
290*/
291template<class T>
292uint_4 SphereHEALPix<T>::NbThetaSlices() const
293{
294 uint_4 nbslices = uint_4(4*nSide_-1);
295 if (nSide_<=0) {
296 nbslices = 0;
297 throw PException(" sphere not pixelized, NbSlice=0 ");
298 }
299 return nbslices;
300}
301
302//! Return the theta angle for slice defined by \b index
303template<class T>
304r_8 SphereHEALPix<T>::ThetaOfSlice(int_4 index) const
305{
306 uint_4 nbslices = uint_4(4*nSide_-1);
307 if (index<0 || index >= nbslices)
308 throw RangeCheckError(" SphereHEALPix::ThetaOfSlice() index out of range");
309 r_8 theta, phi0;
310 PixThetaPhi(sliceBeginIndex_(index), theta, phi0);
311 return theta;
312}
313
314//! Return true : All theta slices have a symmetric slice at Pi-Theta in SphereHEALPix
315template <class T>
316bool SphereHEALPix<T>::HasSymThetaSlice() const
317{
318 return true;
319}
320//! Return the slice index for the symmetric slice at theta=Pi-ThetaOfSlice(idx)
321template <class T>
322int_4 SphereHEALPix<T>::GetSymThetaSliceIndex(int_4 idx) const
323{
324 if(idx < 0 || idx >= NbThetaSlices())
325 throw RangeCheckError("SphereHEALPix::GetSymThetaSliceIndex index out of range");
326 return (NbThetaSlices()-1-idx);
327}
328
329/*! \fn void SOPHYA::SphereHEALPix::GetThetaSlice(int_4 index,r_8& theta,TVector<r_8>& phi,TVector<T>& value) const
330
331 For a theta-slice with index 'index', return :
332
333 the corresponding "theta"
334
335 a vector containing the phi's of the pixels of the slice
336
337 a vector containing the corresponding values of pixels
338*/
339template<class T>
340void SphereHEALPix<T>::GetThetaSlice(int_4 index,r_8& theta,TVector<r_8>& phi,TVector<T>& value) const
341{
342 if (index<0 || index >= NbThetaSlices())
343 throw RangeCheckError(" SphereHEALPix::GetThetaSlice() index out of range");
344
345 int_4 iring= sliceBeginIndex_(index);
346 int_4 lring = sliceLenght_(index);
347
348 phi.ReSize(lring);
349 value.ReSize(lring);
350
351 double TH= 0.;
352 double FI= 0.;
353 if (fgring_) { // RING pixelisation scheme
354 for(int_4 kk = 0; kk < lring;kk++) {
355 PixThetaPhi(kk+iring,TH,FI);
356 phi(kk)= FI;
357 value(kk)= pixels_(kk+iring);
358 }
359 PixThetaPhi(iring, theta, FI);
360 }
361 else { // NESTED pixelisation scheme
362 for(int_4 kk = 0; kk < lring;kk++) {
363 int kkn = ring2nest(nSide_, kk+iring);
364 PixThetaPhi(kkn,TH,FI);
365 phi(kk)= FI;
366 value(kk)= pixels_(kkn);
367 }
368 PixThetaPhi(ring2nest(nSide_,iring), theta, FI);
369 }
370 // theta= TH;
371}
372/*! \fn void SOPHYA::SphereHEALPix::GetThetaSlice(int_4 sliceIndex,r_8& theta, r_8& phi0, TVector<int_4>& pixelIndices,TVector<T>& value) const
373
374 For a theta-slice with index 'index', return :
375
376 the corresponding "theta"
377
378 the corresponding "phi" for first pixel of the slice
379
380 a vector containing indices of the pixels of the slice
381
382 (equally distributed in phi)
383
384 a vector containing the corresponding values of pixels
385*/
386
387template<class T>
388void SphereHEALPix<T>::GetThetaSlice(int_4 sliceIndex,r_8& theta, r_8& phi0,
389 TVector<int_4>& pixelIndices,TVector<T>& value) const
390
391{
392
393 if (sliceIndex<0 || sliceIndex >= NbThetaSlices())
394 throw RangeCheckError(" SphereHEALPix::GetThetaSlice() index out of range");
395 int_4 iring= sliceBeginIndex_(sliceIndex);
396 int_4 lring = sliceLenght_(sliceIndex);
397 pixelIndices.ReSize(lring);
398 value.ReSize(lring);
399
400 if (fgring_) { // RING pixelisation scheme
401 for(int_4 kk = 0; kk < lring;kk++) {
402 pixelIndices(kk)= kk+iring;
403 value(kk)= pixels_(kk+iring);
404 }
405 PixThetaPhi(iring, theta, phi0);
406 }
407 else { // NESTED pixelisation scheme
408 for(int_4 kk = 0; kk < lring;kk++) {
409 int_4 kkn = ring2nest(nSide_, kk+iring);
410 pixelIndices(kk)= kkn;
411 value(kk)= pixels_(kkn);
412 }
413 PixThetaPhi(ring2nest(nSide_,iring), theta, phi0);
414 }
415}
416
417//! return a pointer to the specified slice pixel data in RING ordering, NULL in NESTED
418template<class T>
419T* SphereHEALPix<T>::GetThetaSliceDataPtr(int_4 sliceIndex)
420
421{
422 if (sliceIndex<0 || sliceIndex >= NbThetaSlices())
423 throw RangeCheckError(" SphereHEALPix::GetThetaSliceDataPtr(): index out of range");
424 if (fgring_)
425 return pixels_.Begin()+sliceBeginIndex_(sliceIndex);
426 else return NULL;
427}
428
429template<class T>
430void SphereHEALPix<T>::SetThetaSlices()
431{
432 sliceBeginIndex_.ReSize(4*nSide_-1);
433 sliceLenght_.ReSize(4*nSide_-1);
434 int_4 sliceIndex;
435 int_4 offp = 0;
436 for (sliceIndex=0; sliceIndex< nSide_-1; sliceIndex++) {
437 // sliceBeginIndex_(sliceIndex) = 2*sliceIndex*(sliceIndex+1);
438 sliceBeginIndex_(sliceIndex) = offp;
439 sliceLenght_(sliceIndex) = 4*(sliceIndex+1);
440 offp += sliceLenght_(sliceIndex);
441 }
442 for (sliceIndex= nSide_-1; sliceIndex< 3*nSide_; sliceIndex++) {
443 // sliceBeginIndex_(sliceIndex) = 2*nSide_*(2*sliceIndex-nSide_+1);
444 sliceBeginIndex_(sliceIndex) = offp;
445 sliceLenght_(sliceIndex) = 4*nSide_;
446 offp += sliceLenght_(sliceIndex);
447 }
448 for (sliceIndex= 3*nSide_; sliceIndex< 4*nSide_-1; sliceIndex++) {
449 int_4 nc= 4*nSide_-1-sliceIndex;
450 // sliceBeginIndex_(sliceIndex) = nPix_-2*nc*(nc+1);
451 sliceBeginIndex_(sliceIndex) = offp;
452 sliceLenght_(sliceIndex) = 4*nc;
453 offp += sliceLenght_(sliceIndex);
454 }
455}
456
457
458
459//! \return value of the \b k th pixel
460template<class T>
461T& SphereHEALPix<T>::PixVal(int_4 k)
462
463{
464 if((k < 0) || (k >= nPix_))
465 throw RangeCheckError("SphereHEALPix::PixVal() Pixel index out of range");
466 return pixels_(k);
467}
468
469//! \return value of the \b k th pixel
470template<class T>
471T const& SphereHEALPix<T>::PixVal(int_4 k) const
472
473{
474 if((k < 0) || (k >= nPix_))
475 throw RangeCheckError("SphereHEALPix::PIxVal Pixel index out of range");
476 return *(pixels_.Data()+k);
477}
478
479
480/*! \fn bool SOPHYA::SphereHEALPix::ContainsSph(double theta, double phi) const
481
482\return true if teta,phi in map
483*/
484template<class T>
485bool SphereHEALPix<T>::ContainsSph(double theta, double phi) const
486{
487return(true);
488}
489
490/*! \fn int_4 SOPHYA::SphereHEALPix::PixIndexSph(double theta,double phi) const
491
492 \return "RING" index of the pixel corresponding to direction (theta, phi).
493 */
494template<class T>
495int_4 SphereHEALPix<T>::PixIndexSph(double theta,double phi) const
496
497{
498 if (fgring_) return ang2pix_ring(nSide_,theta,phi);
499 else return ang2pix_nest(nSide_,theta,phi);
500}
501
502
503//! \return (theta,phi) coordinates of middle of pixel with "RING" index k
504template<class T>
505void SphereHEALPix<T>::PixThetaPhi(int_4 k,double& theta,double& phi) const
506{
507 if (fgring_) pix2ang_ring(nSide_,k,theta,phi);
508 else pix2ang_nest(nSide_,k,theta,phi);
509}
510
511//! Set all pixels to value v
512template <class T>
513T SphereHEALPix<T>::SetPixels(T v)
514{
515pixels_.Reset(v);
516return(v);
517}
518
519
520
521//! Conversion from NESTED index into RING index
522template<class T>
523int_4 SphereHEALPix<T>::NestToRing(int_4 k) const
524{
525 return nest2ring(nSide_,k);
526}
527
528//! Conversion from RING index into NESTED index
529template<class T>
530int_4 SphereHEALPix<T>::RingToNest(int_4 k) const
531{
532 return ring2nest(nSide_,k);
533}
534
535// ...... Operations de calcul ......
536
537//! Fill a SphereHEALPix with a constant value \b a
538template <class T>
539SphereHEALPix<T>& SphereHEALPix<T>::SetT(T a)
540{
541 if (NbPixels() < 1)
542 throw RangeCheckError("SphereHEALPix<T>::SetT(T ) - SphereHEALPix not dimensionned ! ");
543 pixels_ = a;
544 return (*this);
545}
546
547//! Add a constant value \b x to a SphereHEALPix
548template <class T>
549SphereHEALPix<T>& SphereHEALPix<T>::Add(T a)
550 {
551 cout << " c'est mon Add " << endl;
552 if (NbPixels() < 1)
553 throw RangeCheckError("SphereHEALPix<T>::Add(T ) - SphereHEALPix not dimensionned ! ");
554 // pixels_ += a;
555 pixels_.Add(a);
556 return (*this);
557}
558
559/*! Substract a constant value \b a to a SphereHEALPix */
560template <class T>
561SphereHEALPix<T>& SphereHEALPix<T>::Sub(T a,bool fginv)
562{
563 if (NbPixels() < 1)
564 throw RangeCheckError("SphereHEALPix<T>::Sub(T ) - SphereHEALPix not dimensionned ! ");
565 pixels_.Sub(a,fginv);
566 return (*this);
567}
568
569/*! multiply a SphereHEALPix by a constant value \b a */
570template <class T>
571SphereHEALPix<T>& SphereHEALPix<T>::Mul(T a)
572{
573 if (NbPixels() < 1)
574 throw RangeCheckError("SphereHEALPix<T>::Mul(T ) - SphereHEALPix not dimensionned ! ");
575 pixels_ *= a;
576 return (*this);
577}
578
579/*! divide a SphereHEALPix by a constant value \b a */
580template <class T>
581SphereHEALPix<T>& SphereHEALPix<T>::Div(T a)
582{
583 if (NbPixels() < 1)
584 throw RangeCheckError("SphereHEALPix<T>::Div(T ) - SphereHEALPix not dimensionned ! ");
585 pixels_ /= a;
586 return (*this);
587}
588
589// >>>> Operations avec 2nd membre de type SphereHEALPix
590//! Add two SphereHEALPix
591
592template <class T>
593SphereHEALPix<T>& SphereHEALPix<T>::AddElt(const SphereHEALPix<T>& a)
594{
595 if (NbPixels() != a.NbPixels() )
596 throw(SzMismatchError("SphereHEALPix<T>::AddElt(a) SizeMismatch")) ;
597 if (fgring_ != a.fgring_)
598 throw(ParmError("SphereHEALPix<T>::AddElt(a) different pixelisation RING<>NESTED")) ;
599
600 pixels_ += a.pixels_;
601 return (*this);
602}
603
604//! Substract two SphereHEALPix
605template <class T>
606SphereHEALPix<T>& SphereHEALPix<T>::SubElt(const SphereHEALPix<T>& a)
607{
608 if (NbPixels() != a.NbPixels() )
609 throw(SzMismatchError("SphereHEALPix<T>::SubElt(a) SizeMismatch")) ;
610 if (fgring_ != a.fgring_)
611 throw(ParmError("SphereHEALPix<T>::SubElt(a) different pixelisation RING<>NESTED")) ;
612
613 pixels_ -= a.pixels_;
614 return (*this);
615}
616
617//! Multiply two SphereHEALPix (elements by elements)
618template <class T>
619SphereHEALPix<T>& SphereHEALPix<T>::MulElt(const SphereHEALPix<T>& a)
620{
621 if (NbPixels() != a.NbPixels() )
622 throw(SzMismatchError("SphereHEALPix<T>::MulElt(a) SizeMismatch")) ;
623 if (fgring_ != a.fgring_)
624 throw(ParmError("SphereHEALPix<T>::MulElt(a) different pixelisation RING<>NESTED")) ;
625
626 pixels_ *= a.pixels_;
627 return (*this);
628}
629
630//! Divide two SphereHEALPix (elements by elements) - No protection for divide by 0
631template <class T>
632SphereHEALPix<T>& SphereHEALPix<T>::DivElt(const SphereHEALPix<T>& a)
633{
634 if (NbPixels() != a.NbPixels() )
635 throw(SzMismatchError("SphereHEALPix<T>::DivElt(a) SizeMismatch")) ;
636 if (fgring_ != a.fgring_)
637 throw(ParmError("SphereHEALPix<T>::DivElt(a) different pixelisation RING<>NESTED")) ;
638 pixels_ /= a.pixels_;
639 return (*this);
640}
641
642
643
644
645template <class T>
646void SphereHEALPix<T>::print(ostream& os) const
647{
648 this->Show(os);
649 os << "SphereHEALPix<T>(" << TypeOfMap() << ") NSide= "
650 << nSide_ << " nPix_ = " << nPix_ << " omeg_ = " << omeg_ << endl;
651
652 if(this->mInfo_) os << " DVList Info= " << *(this->mInfo_) << endl;
653 os << "... Pixel values : ";
654 for(int i=0; i < nPix_; i++)
655 {
656 if(i%5 == 0) os << endl;
657 os << pixels_(i) <<", ";
658 }
659 os << endl;
660
661
662}
663
664
665
666//*******************************************************************
667
668#ifdef __CXX_PRAGMA_TEMPLATES__
669#pragma define_template SphereHEALPix<uint_2>
670#pragma define_template SphereHEALPix<int_4>
671#pragma define_template SphereHEALPix<r_8>
672#pragma define_template SphereHEALPix<r_4>
673#pragma define_template SphereHEALPix< complex<r_4> >
674#pragma define_template SphereHEALPix< complex<r_8> >
675#endif
676#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
677namespace SOPHYA {
678template class SphereHEALPix<uint_2>;
679template class SphereHEALPix<int_4>;
680template class SphereHEALPix<r_8>;
681template class SphereHEALPix<r_4>;
682template class SphereHEALPix< complex<r_4> >;
683template class SphereHEALPix< complex<r_8> >;
684}
685#endif
686
Note: See TracBrowser for help on using the repository browser.