borg_public/libLSS/data/spectro_gals.hpp
2023-05-29 10:41:03 +02:00

165 lines
5.2 KiB
C++

/*+
ARES/HADES/BORG Package -- ./libLSS/data/spectro_gals.hpp
Copyright (C) 2014-2020 Guilhem Lavaux <guilhem.lavaux@iap.fr>
Copyright (C) 2009-2020 Jens Jasche <jens.jasche@fysik.su.se>
Additional contributions from:
Guilhem Lavaux <guilhem.lavaux@iap.fr> (2023)
+*/
#ifndef __LIBLSS_DATA_GALACTIC_HPP
#define __LIBLSS_DATA_GALACTIC_HPP
#include <H5Cpp.h>
#include <boost/utility/base_from_member.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/multi_array.hpp>
#include <boost/function.hpp>
#include <healpix_cxx/pointing.h>
#include "libLSS/data/base.hpp"
#include "libLSS/tools/allocator_policy.hpp"
#include "libLSS/tools/checkmem.hpp"
#include "libLSS/physics/cosmo.hpp"
#include "libLSS/tools/hdf5_type.hpp"
namespace LibLSS
{
class NoSelection {
public:
int getNumRadial() const {return 1;}
double getRadialSelection(double r, int n) const { return 1; }
double get_sky_completeness(double x, double y, double z) const { return 1; }
};
HAS_MEM_FUNC(saveFunction, has_save_function);
HAS_MEM_FUNC(loadFunction, has_load_function);
/* These are two helper functions. Depending on the availability of the
* member function void T::saveFunction(H5_CommonFileGroup&), the function
* will be executed (or not if it does not exist). This ensures
* that GalaxySurvey always try to save the maximum but still is
* compatible with restricted selection functions.
*/
namespace details {
template<typename T>
typename boost::enable_if< has_save_function<T, void (T::*)(H5_CommonFileGroup&)> >::type
saveRadialCompleteness(H5_CommonFileGroup& fg, T& func)
{
func.saveFunction(fg);
}
template<typename T>
typename boost::disable_if< has_load_function<T, void (T::*)(H5_CommonFileGroup&)> >::type
saveRadialCompleteness(H5_CommonFileGroup& fg, T& func)
{
}
template<typename T>
typename boost::enable_if< has_load_function<T, void (T::*)(H5_CommonFileGroup&)> >::type
loadRadialCompleteness(H5_CommonFileGroup& fg, T& func)
{
func.loadFunction(fg);
}
template<typename T>
typename boost::disable_if< has_save_function<T, void (T::*)(H5_CommonFileGroup&)> >::type
loadRadialCompleteness(H5_CommonFileGroup& fg, T& func)
{
}
static double nullCorrection(double d) { return 0; }
};
typedef boost::function1<double, double> CorrectionFunction;
template<typename SelFunction, class GT, class AllocationPolicy = DefaultAllocationPolicy>
class GalaxySurvey: virtual LibLSS::Base_Data
{
public:
typedef GT GalaxyType;
typedef GT& RefGalaxyType;
typedef const GT& ConstRefGalaxyType;
typedef typename boost::multi_array<GalaxyType, 1> GalaxyArray;
protected:
GalaxyArray galaxies;
long numGalaxies;
SelFunction radialSelection;
bool is_reference_survey;
CorrectionFunction zcorrection;
public:
GalaxySurvey(bool ref_survey = false) : numGalaxies(0), is_reference_survey(ref_survey) {}
~GalaxySurvey() {}
SelFunction& selection() { return radialSelection; }
const SelFunction& selection() const { return radialSelection; }
double getCompleteness(double phi, double theta) {
vec3 v(pointing(0.5*M_PI - theta, phi));
return radialSelection.get_sky_completeness(v.x, v.y, v.z);
}
void setSelectionFunction(SelFunction f) {
radialSelection = f;
}
bool isReferenceSurvey() const { return is_reference_survey; }
RefGalaxyType operator[](size_t i) {
return galaxies[i];
}
ConstRefGalaxyType operator[](size_t i) const {
return galaxies[i];
}
void optimize() {
galaxies.resize(boost::extents[numGalaxies]);
}
long surveySize() const { return numGalaxies; }
// Methods defined in the tcc file
void addGalaxy(const GalaxyType& g);
// I/O support for galaxy surveys
void saveMain(H5_CommonFileGroup& fg);
void restoreMain(H5_CommonFileGroup& fg);
void save(H5_CommonFileGroup& fg) {
saveMain(fg);
details::saveRadialCompleteness(fg, radialSelection);
}
void restore(H5_CommonFileGroup& fg) {
restoreMain(fg);
details::loadRadialCompleteness(fg, radialSelection);
}
void updateComovingDistance(const Cosmology& cosmo, const CorrectionFunction& zcorrection = details::nullCorrection);
void useLuminosityAsWeight();
void resetWeight();
void setCorrections(const CorrectionFunction& zcorrection = details::nullCorrection) { this->zcorrection = zcorrection; }
//
GalaxyArray& getGalaxies() { return galaxies; }
const GalaxyArray& getGalaxies() const { return galaxies; }
GalaxyArray& allocateGalaxies(size_t numGals) {
numGalaxies = numGals;
galaxies.resize(boost::extents[numGals]);
return galaxies;
}
};
};
#include "spectro_gals.tcc"
#endif