healpix_map.cc
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "healpix_map.h"
00033
00034 using namespace std;
00035
00036 template<typename T> void Healpix_Map<T>::Import_degrade
00037 (const Healpix_Map<T> &orig, bool pessimistic)
00038 {
00039 planck_assert(nside_<orig.nside_,"Import_degrade: this is no degrade");
00040 int fact = orig.nside_/nside_;
00041 planck_assert (orig.nside_==nside_*fact,
00042 "the larger Nside must be a multiple of the smaller one");
00043
00044 int minhits = pessimistic ? fact*fact : 1;
00045 #pragma omp parallel
00046 {
00047 int m;
00048 #pragma omp for schedule (static)
00049 for (m=0; m<npix_; ++m)
00050 {
00051 int x,y,f;
00052 pix2xyf(m,x,y,f);
00053 int hits = 0;
00054 kahan_adder<double> adder;
00055 for (int j=fact*y; j<fact*(y+1); ++j)
00056 for (int i=fact*x; i<fact*(x+1); ++i)
00057 {
00058 int opix = orig.xyf2pix(i,j,f);
00059 if (!approx<double>(orig.map[opix],Healpix_undef))
00060 {
00061 ++hits;
00062 adder.add(orig.map[opix]);
00063 }
00064 }
00065 map[m] = T((hits<minhits) ? Healpix_undef : adder.result()/hits);
00066 }
00067 }
00068 }
00069
00070 template void Healpix_Map<float>::Import_degrade
00071 (const Healpix_Map<float> &orig, bool pessimistic);
00072 template void Healpix_Map<double>::Import_degrade
00073 (const Healpix_Map<double> &orig, bool pessimistic);
00074
00075 template<typename T> void Healpix_Map<T>::minmax (T &Min, T &Max) const
00076 {
00077 Min = T(1e30); Max = T(-1e30);
00078 for (int m=0; m<npix_; ++m)
00079 {
00080 T val = map[m];
00081 if (!approx<double>(val,Healpix_undef))
00082 {
00083 if (val>Max) Max=val;
00084 if (val<Min) Min=val;
00085 }
00086 }
00087 }
00088
00089 template void Healpix_Map<float>::minmax (float &Min, float &Max) const;
00090 template void Healpix_Map<double>::minmax (double &Min, double &Max) const;