2012-11-18 22:18:18 +01:00
|
|
|
#ifndef __COSMOTOOL_FOURIER_HEALPIX_DETAILS_SPECTRUM_HP
|
|
|
|
#define __COSMOTOOL_FOURIER_HEALPIX_DETAILS_SPECTRUM_HP
|
|
|
|
|
|
|
|
namespace CosmoTool
|
|
|
|
{
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
class HealpixUtilityFunction: public MapUtilityFunction<T>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef typename MapUtilityFunction<T>::Spectrum Spectrum;
|
|
|
|
typedef typename MapUtilityFunction<T>::Spectrum_ptr Spectrum_ptr;
|
|
|
|
typedef typename MapUtilityFunction<T>::FMap FMap;
|
2012-11-18 22:36:18 +01:00
|
|
|
typedef typename HealpixSpectrum<T>::LType LType;
|
|
|
|
|
2012-11-18 22:18:18 +01:00
|
|
|
Spectrum_ptr estimateSpectrumFromMap(const FMap& m) const
|
|
|
|
{
|
|
|
|
const HealpixFourierALM<T>& alms = dynamic_cast<const HealpixFourierALM<T>&>(m);
|
2012-11-18 22:36:18 +01:00
|
|
|
LType Lmax = alms.Lmax(), Mmax = alms.Mmax();
|
2012-11-18 22:18:18 +01:00
|
|
|
HealpixSpectrum<T> *spectrum = new HealpixSpectrum<T>(Lmax);
|
|
|
|
T *data_cls = spectrum->data();
|
2012-11-18 22:36:18 +01:00
|
|
|
const std::complex<T> *data_alms = alms.data();
|
2012-11-18 22:18:18 +01:00
|
|
|
|
|
|
|
// make an estimate of the cls
|
|
|
|
std::fill(data_cls, data_cls+Lmax+1, 0);
|
2012-11-18 22:36:18 +01:00
|
|
|
LType q = 0;
|
|
|
|
for (LType m = 0; m <= Mmax; ++m )
|
2012-11-18 22:18:18 +01:00
|
|
|
{
|
2012-11-18 22:36:18 +01:00
|
|
|
for (LType l = m; l <= Lmax; ++l)
|
2012-11-18 22:18:18 +01:00
|
|
|
{
|
|
|
|
// Triangular storage
|
2012-11-18 22:36:18 +01:00
|
|
|
data_cls[l] += std::norm(data_alms[l+q]);
|
2012-11-18 22:18:18 +01:00
|
|
|
}
|
2012-11-18 22:36:18 +01:00
|
|
|
q += Lmax+1-m;
|
2012-11-18 22:18:18 +01:00
|
|
|
}
|
2012-11-18 22:36:18 +01:00
|
|
|
assert(q==alms.size());
|
2012-11-18 22:18:18 +01:00
|
|
|
|
2012-11-18 22:36:18 +01:00
|
|
|
for (LType l = 0; l <= Lmax; ++l)
|
2012-11-18 22:18:18 +01:00
|
|
|
{
|
|
|
|
int dof = 1 + std::min(l, Mmax);
|
|
|
|
spectrum->set_dof(l, dof);
|
|
|
|
data_cls[l] /= dof;
|
|
|
|
}
|
|
|
|
|
|
|
|
return Spectrum_ptr(spectrum);
|
|
|
|
}
|
|
|
|
|
|
|
|
Spectrum_ptr newSpectrumFromRaw(T *data, long size,
|
2012-11-20 14:45:48 +01:00
|
|
|
const Spectrum& like_spec) const
|
2012-11-18 22:18:18 +01:00
|
|
|
{
|
2012-11-20 14:45:48 +01:00
|
|
|
const HealpixSpectrum<T>& in_spec = dynamic_cast<const HealpixSpectrum<T>&>(like_spec);
|
2012-11-18 22:18:18 +01:00
|
|
|
HealpixSpectrum<T> *new_spectrum = new HealpixSpectrum<T>(in_spec.Lmax());
|
|
|
|
T *out_d = new_spectrum->data();
|
|
|
|
|
|
|
|
std::copy(data, data + min(size,new_spectrum->size()), out_d);
|
|
|
|
|
|
|
|
return Spectrum_ptr(new_spectrum);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|