39 using namespace cosmology;
40 using namespace catalogue;
48 set_cosmo_function(cosmology, redshift_min, redshift_max, n_redshift_bins, author);
55 cbl::lognormal::LogNormalFull::LogNormalFull (
const double rmin,
const double xMin,
const double xMax,
const double yMin,
const double yMax,
const double zMin,
const double zMax,
const cosmology::Cosmology cosmology,
const double redshift_min,
const double redshift_max,
const int n_redshift_bins,
const std::string author)
57 set_grid_parameters(rmin, xMin, xMax, yMin, yMax, zMin, zMax);
59 set_cosmo_function(cosmology, redshift_min, redshift_max, n_redshift_bins, author);
68 set_grid_parameters(rmin, random, pad);
70 set_cosmo_function(cosmology, redshift_min, redshift_max, n_redshift_bins, author);
79 m_cosmology = make_shared<Cosmology>(cosmology);
83 vector<double> redshift =
linear_bin_vector(nredshift, redshift_min, redshift_max);
85 vector<double> dc, ff, dd, HH;
87 for (
int i=0; i<nredshift;i++) {
88 HH.push_back(cosmology.
HH(redshift[i]));
89 dc.push_back(cosmology.
D_C(redshift[i]));
91 dd.push_back(cosmology.
DD(redshift[i])/cosmology.
DD(0.));
94 m_func_DC = make_shared<glob::FuncGrid>(
glob::FuncGrid(redshift, dc,
"Spline"));
96 m_func_redshift = make_shared<glob::FuncGrid>(
glob::FuncGrid(dc, redshift,
"Spline"));
98 m_func_HH = make_shared<glob::FuncGrid>(
glob::FuncGrid(redshift, HH,
"Spline"));
100 m_func_growth_rate = make_shared<glob::FuncGrid>(
glob::FuncGrid(redshift, ff,
"Spline"));
102 m_func_growth_factor = make_shared<glob::FuncGrid>(
glob::FuncGrid(redshift, dd,
"Spline"));
108 vector<double> Pk = m_cosmology->Pk_matter(kk, m_author, 0, 0.);
110 m_func_pk = make_shared<glob::FuncGrid>(
glob::FuncGrid(kk, Pk,
"Spline"));
119 m_nx = (m_xMax-m_xMin)/m_rmin;
120 m_nx = (m_nx%2==0) ? m_nx : m_nx+1;
122 m_ny = (m_yMax-m_yMin)/m_rmin;
123 m_ny = (m_ny%2==0) ? m_ny : m_ny+1;
125 m_nz = (m_zMax-m_zMin)/m_rmin;
126 m_nz = (m_nz%2==0) ? m_nz : m_nz+1;
147 m_set_grid_parameters();
160 vector<double> xMin, xMax, yMin, yMax, zMin, zMax;
162 for (
size_t i=0; i< m_random.size(); i++) {
163 xMin.push_back(m_random[i]->
Min(Var::_X_));
164 yMin.push_back(m_random[i]->
Min(Var::_Y_));
165 zMin.push_back(m_random[i]->
Min(Var::_Z_));
167 xMax.push_back(m_random[i]->
Max(Var::_X_));
168 yMax.push_back(m_random[i]->
Max(Var::_Y_));
169 zMax.push_back(m_random[i]->
Max(Var::_Z_));
172 m_xMin =
Min(xMin)-pad;
173 m_yMin =
Min(yMin)-pad;
174 m_zMin =
Min(zMin)-pad;
176 m_xMax =
Max(xMax)+pad;
177 m_yMax =
Max(yMax)+pad;
178 m_zMax =
Max(zMax)+pad;
180 m_set_grid_parameters();
189 m_clustering_signal = make_shared<data::ScalarField3D> (
data::ScalarField3D(m_nx, m_ny, m_nz, m_xMin, m_xMax, m_yMin, m_yMax, m_zMin, m_zMax));
191 m_densityG = make_shared<data::ScalarField3D> (
data::ScalarField3D(m_nx, m_ny, m_nz, m_xMin, m_xMax, m_yMin, m_yMax, m_zMin, m_zMax));
193 m_density = make_shared<data::ScalarField3D> (
data::ScalarField3D(m_nx, m_ny, m_nz, m_xMin, m_xMax, m_yMin, m_yMax, m_zMin, m_zMax));
196 m_los_velocity = make_shared<data::ScalarField3D> (
data::ScalarField3D(m_nx, m_ny, m_nz, m_xMin, m_xMax, m_yMin, m_yMax, m_zMin, m_zMax));
197 m_velocity = make_shared<data::VectorField3D> (
data::VectorField3D(m_nx, m_ny, m_nz, m_xMin, m_xMax, m_yMin, m_yMax, m_zMin, m_zMax));
201 for (
size_t i=0;i<m_random.size();i++) {
202 m_visibility_random.push_back(make_shared<data::ScalarField3D> (
data::ScalarField3D(m_nx, m_ny, m_nz, m_xMin, m_xMax, m_yMin, m_yMax, m_zMin, m_zMax)));
205 m_visibility = make_shared<data::ScalarField3D> (
data::ScalarField3D(m_nx, m_ny, m_nz, m_xMin, m_xMax, m_yMin, m_yMax, m_zMin, m_zMax));
215 m_clustering_signal->reset();
220 m_los_velocity->reset();
225 m_visibility.reset();
226 for (
size_t i=0;i<m_random.size();i++) {
227 m_visibility_random[i]->reset();
231 m_visibility->reset();
232 for (
size_t i=0;i<m_random.size();i++) {
233 m_visibility_random[i].reset();
254 double Volume = m_clustering_signal->Volume();
256 for (
int i=0; i<m_nx; i++) {
257 double kx = m_clustering_signal->kX(i);
258 for (
int j=0; j<m_ny; j++) {
259 double ky = m_clustering_signal->kY(j);
260 for (
int k=0; k<m_nzF; k++) {
261 double kz = m_clustering_signal->kZ(k);
263 double kk = sqrt(kx*kx+ky*ky+kz*kz);
265 m_clustering_signal->set_ScalarField_FourierSpace_real(m_func_pk->operator()(kk)/Volume, i, j, k, 0);
266 m_clustering_signal->set_ScalarField_FourierSpace_complex(0, i, j, k, 0);
271 m_clustering_signal->FourierAntiTransformField ();
273 for (
int i=0; i<m_nx; i++) {
274 for (
int j=0; j<m_ny; j++) {
275 for (
int k=0; k<m_nz; k++) {
277 double value = log(m_clustering_signal->ScalarField(i, j, k)+1);
278 m_clustering_signal->set_ScalarField(value, i, j, k);
283 m_clustering_signal->FourierTransformField ();
295 for (
int i=0; i<m_nx; i++) {
296 double kx = m_density->kX(i);
297 for (
int j=0; j<m_ny; j++) {
298 double ky = m_density->kY(j);
299 for (
int k=0; k<m_nzF; k++) {
300 double kz = m_density->kZ(k);
301 double kk = sqrt(kx*kx+ky*ky+kz*kz);
303 if (i==0 && j==0 && k==0) {
304 m_densityG->set_ScalarField_FourierSpace_real(0, i, j, k, 0);
305 m_densityG->set_ScalarField_FourierSpace_complex(0, i, j, k, 0);
307 else if (i == m_nx/2 || j == m_ny/2) {
309 double smoothing = exp(-0.5*pow(kk*smoothing_radius, 2));
310 double Pkk = sqrt(max(0., 0.5*m_clustering_signal->ScalarField_FourierSpace_real(i, j, k)));
314 double val = normal()*smoothing;
317 val = normal()*smoothing;
319 m_densityG->set_ScalarField_FourierSpace_real(val, i, j, k, 0);
320 m_densityG->set_ScalarField_FourierSpace_complex(0, i, j, k, 0);
323 double smoothing = exp(-0.5*pow(kk*smoothing_radius,2));
324 double Pkk = sqrt(max(0., 0.5*m_clustering_signal->ScalarField_FourierSpace_real(i,j,k)));
327 double val1 = normal()*smoothing;
328 double val2 = normal()*smoothing;
331 val1 = normal()*smoothing;
334 val2 = normal()*smoothing;
336 m_densityG->set_ScalarField_FourierSpace_real(val1, i, j, k, 0);
337 m_densityG->set_ScalarField_FourierSpace_complex(val2, i, j, k, 0);
344 m_densityG->FourierAntiTransformField ();
345 double mean =
Average(m_densityG->ScalarField());
346 m_sigma2G = pow(
Sigma(m_densityG->ScalarField()), 2);
348 coutCBL <<
"Average: " << mean <<
" Sigma^2: " << m_sigma2G << endl;
350 for (
int i=0; i<m_nx; i++) {
351 double xx = m_density->XX(i);
352 for (
int j=0; j<m_ny; j++) {
353 double yy = m_density->YY(j);
354 for (
int k=0; k<m_nz; k++) {
355 double zz = m_density->ZZ(k);
357 double dc = sqrt(xx*xx+yy*yy+zz*zz);
359 double redshift = m_func_redshift->operator()(dc);
360 double fact = m_func_growth_factor->operator()(redshift);
361 double delta = exp(fact*(m_densityG->ScalarField(i,j,k)-fact*0.5*m_sigma2G))-1;
362 m_density->set_ScalarField(delta, i, j, k);
367 m_density->FourierTransformField();
376 for (
int i=0; i<m_nx; i++) {
377 double kx = m_clustering_signal->kX(i);
378 for (
int j=0; j<m_ny; j++) {
379 double ky = m_clustering_signal->kY(j);
380 for (
int k=0; k<m_nzF; k++) {
381 double kz = m_clustering_signal->kZ(k);
383 double k2 = kx*kx+ky*ky+kz*kz;
389 double vx_complex = 0;
390 double vy_complex = 0;
391 double vz_complex = 0;
394 if (i==0 && j==0 && k==0) {
396 else if (i == m_nx/2 || j == m_ny/2) {
397 vx_real = kx/k2*m_density->ScalarField_FourierSpace_complex(i,j,k);
398 vy_real = ky/k2*m_density->ScalarField_FourierSpace_complex(i,j,k);
399 vz_real = kz/k2*m_density->ScalarField_FourierSpace_complex(i,j,k);
402 vx_real = kx/k2*m_density->ScalarField_FourierSpace_complex(i,j,k);
403 vy_real = ky/k2*m_density->ScalarField_FourierSpace_complex(i,j,k);
404 vz_real = kz/k2*m_density->ScalarField_FourierSpace_complex(i,j,k);
406 vx_complex = -kx/k2*m_density->ScalarField_FourierSpace_real(i,j,k);
407 vy_complex = -ky/k2*m_density->ScalarField_FourierSpace_real(i,j,k);
408 vz_complex = -kz/k2*m_density->ScalarField_FourierSpace_real(i,j,k);
411 m_velocity->set_VectorField_FourierSpace_real( {vx_real, vy_real, vz_real}, i, j, k, 0);
412 m_velocity->set_VectorField_FourierSpace_complex( {vx_complex, vy_complex, vz_complex}, i, j, k, 0);
416 m_velocity->FourierAntiTransformField();
418 for (
int i=0; i<m_nx; i++) {
419 double xx = m_velocity->XX(i);
420 for (
int j=0; j<m_ny; j++) {
421 double yy = m_velocity->YY(j);
422 for (
int k=0; k<m_nz; k++) {
423 double zz = m_velocity->ZZ(k);
425 double rr2 = xx*xx+yy*yy+zz*zz;
426 double rr = sqrt(rr2);
428 double redshift = m_func_redshift->operator()(rr);
429 double fact = m_func_growth_rate->operator()(redshift)*m_func_HH->operator()(redshift)*m_func_growth_factor->operator()(redshift);
431 vector<double> vel = m_velocity->VectorField(i,j,k);
433 double vr = fact*(xx*vel[0]+yy*vel[1]+zz*vel[2])/rr;
435 m_los_velocity->set_ScalarField(vr, i, j, k, 0);
448 double mmax = max(max((m_xMax-m_xMin)/2, (m_yMax-m_yMin)/2),(m_xMax-m_xMin)/2);
451 for (
int i=0; i<m_nx; i++) {
452 double xx = m_visibility->XX(i);
453 for (
int j=0; j<m_ny; j++) {
454 double yy = m_visibility->YY(j);
455 for (
int k=0; k<m_nz; k++) {
456 double zz = m_visibility->ZZ(k);
458 double dc = sqrt(xx*xx+yy*yy+zz*zz);
461 m_visibility->set_ScalarField(1., i, j, k, 0);
464 m_visibility->set_ScalarField(0., i, j, k, 0);
470 for (
int i=0; i<m_nx; i++)
471 for (
int j=0; j<m_ny; j++)
472 for (
int k=0; k<m_nz; k++) {
473 double vis = m_visibility->ScalarField(i, j, k)/m_nCells_eff;
474 m_visibility->set_ScalarField(vis, i, j, k, 0);
484 coutCBL <<
"I'm setting the visibility from random sample..." << endl;
485 int nsamples = m_random.size();
486 double cell_size_inv = 1./m_rmin;
488 for (
int s=0; s<nsamples; s++) {
489 m_visibility_random[s]->reset();
491 int nObjects = m_random[s]->weightedN();
492 for (
int obj = 0; obj<nObjects; obj++) {
493 int i = min(
int((m_random[s]->xx(obj)-m_xMin)*cell_size_inv), m_nx-1);
494 int j = min(
int((m_random[s]->yy(obj)-m_yMin)*cell_size_inv), m_ny-1);
495 int k = min(
int((m_random[s]->zz(obj)-m_zMin)*cell_size_inv), m_nz-1);
497 double ww = m_random[s]->weight(obj)/nObjects;
498 m_visibility_random[s]->set_ScalarField(ww, i, j, k, 1);
512 coutCBL <<
"I'm setting the visibility from random sample, using velocity field..." << endl;
513 int nsamples = m_random.size();
514 double cell_size_inv = 1./m_rmin;
516 for (
int s=0; s<nsamples; s++) {
517 m_visibility_random[s]->reset();
519 int nObjects = m_random[s]->nObjects();
520 for (
int obj = 0; obj<nObjects; obj++) {
521 int i = min(
int((m_random[s]->xx(obj)-m_xMin)*cell_size_inv), m_nx-1);
522 int j = min(
int((m_random[s]->yy(obj)-m_yMin)*cell_size_inv), m_ny-1);
523 int k = min(
int((m_random[s]->zz(obj)-m_zMin)*cell_size_inv), m_nz-1);
525 double dc = m_func_DC->operator()(m_random[s]->redshift(obj));
526 double dz = m_los_velocity->ScalarField(i, j, k)/
par::cc;
527 double newred = m_random[s]->redshift(obj)-dz*(1+m_random[s]->redshift(obj));
528 double newdc = m_func_DC->operator()(newred);
530 double newx = newdc*m_random[s]->xx(obj)/dc, newy=newdc*m_random[s]->yy(obj)/dc, newz = newdc*m_random[s]->zz(obj)/dc;
532 i = min(
int((newx-m_xMin)*cell_size_inv), m_nx-1);
533 j = min(
int((newy-m_yMin)*cell_size_inv), m_ny-1);
534 k = min(
int((newz-m_zMin)*cell_size_inv), m_nz-1);
536 double ww = m_random[s]->weight(obj)/nObjects;
537 m_visibility_random[s]->set_ScalarField(ww, i, j, k, 1);
551 ofstream fout(file_out.c_str());
553 double max_redshift = m_func_redshift->operator()(sqrt(m_xMax*m_xMax+m_yMax*m_yMax+m_zMax*m_zMax));
558 double min = -m_rmin*0.5, max = m_rmin*0.5;
562 for (
int i=0; i<m_nx; i++) {
563 double xx = m_density->XX(i);
564 for (
int j=0; j<m_ny; j++) {
565 double yy = m_density->YY(j);
566 for (
int k=0; k<m_nz; k++) {
567 double zz = m_density->ZZ(k);
569 double dc2 = xx*xx+yy*yy+zz*zz;
570 double dc = sqrt(dc2);
572 double redshift = m_func_redshift->operator()(dc);
573 double bias = func_bias(redshift);
575 double fact =
bias*m_func_growth_factor->operator()(redshift);
577 double delta = exp(fact*(m_densityG->ScalarField(i,j,k)-fact*0.5*m_sigma2G));
578 double p = nObjects*visibility->ScalarField(i,j,k)*delta;
583 double vv = (doRSD) ? m_los_velocity->ScalarField(i, j, k)/
par::cc : 0.;
585 for (
int n = 0; n<no; n++) {
586 comovingCoordinates comcoord;
587 observedCoordinates obscoord;
589 comcoord.xx = ran()+xx;
590 comcoord.yy = ran()+yy;
591 comcoord.zz = ran()+zz;
592 double ddcc = sqrt(comcoord.xx*comcoord.xx+comcoord.yy*comcoord.yy+comcoord.zz*comcoord.zz);
594 polar_coord(comcoord.xx, comcoord.yy, comcoord.zz, obscoord.ra, obscoord.dec, ddcc);
596 obscoord.ra = obscoord.ra*180./
par::pi;
597 obscoord.dec = obscoord.dec*180./
par::pi;
599 obscoord.ra = (obscoord.ra<0) ? obscoord.ra+360. : obscoord.ra;
601 obscoord.redshift = m_func_redshift->operator()(ddcc);
602 obscoord.redshift -= vv*(1+obscoord.redshift);
603 if (obscoord.redshift >0 && obscoord.redshift<max_redshift) {
604 fout << obscoord.ra <<
" " << obscoord.dec <<
" " << obscoord.redshift <<
" " << endl;
611 fout.clear(); fout.close();
612 coutCBL <<
"Extracted "<< nObj <<
" points, written in " << file_out << endl;
619 void cbl::lognormal::LogNormalFull::generate_lognormal (
const int start,
const int stop,
const bool doRSD,
const double smoothing_radius,
const std::vector<double> nObjects,
const std::vector<std::vector<double>> redshift,
const std::vector<std::vector<double> >
bias,
const std::string dir,
const std::string filename,
const int seed,
const bool set_fields,
const bool use_random)
621 m_generator.seed(seed);
624 m_set_fields(use_random, doRSD);
626 m_reset_fields(use_random, doRSD);
628 m_set_clustering_signal();
630 int nsamples = nObjects.size();
633 m_set_visibility_from_random();
637 for (
int i=start; i<stop; i++) {
638 m_set_density_field(smoothing_radius);
640 if (doRSD) m_set_radial_velocity();
642 for (
int n=0;n<nsamples; n++) {
645 m_extract_points_lognormal_field(nObjects[n], doRSD, redshift[n],
bias[n], (use_random) ? m_visibility_random[n] : m_visibility, ff);
#define coutCBL
CBL print message.
Implementation of the log-normal data structure.
double HH(const double redshift=0.) const
the Hubble function
double D_C(const double redshift) const
the comoving line-of-sight distance at a given redshift
double linear_growth_rate(const double redshift, const double prec=1.e-4) const
the linear growth rate at a given redshift,
double DD(const double redshift) const
the amplitude of the growing mode at a given redshift,
void m_set_grid_parameters()
set the grid parameters
void m_extract_points_lognormal_field(const double nObjects, const bool doRSD, const std::vector< double > redshift, const std::vector< double > bias, const std::shared_ptr< data::Field3D > visibility, const std::string file_out)
extract points from lognormal density fields
void m_set_fields(const bool use_random, const bool doRSD)
set the fields
void set_cosmo_function(const cosmology::Cosmology cosmology, const double redshift_min=0., const double redshift_max=10., const int n_redshift_bins=500, const std::string author="CAMB")
set cosmological functions
void m_set_visibility_from_random_RSD()
set the visibility for redshift space mocks
void m_reset_fields(const bool use_random, const bool doRSD)
reset the fields
void m_set_radial_velocity()
set the radial velocity field
void m_set_visibility_from_random()
set the visibility from random catalogue
void generate_lognormal(const int start, const int stop, const bool doRSD, const double smoothing_radius, const std::vector< double > nObjects, const std::vector< std::vector< double >> redshift, const std::vector< std::vector< double > > bias, const std::string dir, const std::string filename, const int seed, const bool set_fields=true, const bool use_random=true)
generate lognormal realizations
LogNormalFull()=default
default constructor
void m_set_density_field(const double smoothing_radius)
set the density field
void m_set_visibility()
set the visibility
void set_grid_parameters(const double rmin, const double xMin, const double xMax, const double yMin, const double yMax, const double zMin, const double zMax)
set grid parameters
void m_set_clustering_signal()
set the target dark matter clustering signal
The class NormalRandomNumbers.
void set_mean_sigma(const double mean, const double sigma)
set parameters for Normal distribution
The class PoissonRandomNumbers.
static const char fINT[]
conversion symbol for: int -> std::string
static const double pi
: the ratio of a circle's circumference to its diameter
static const double cc
: the speed of light in vacuum (the value is exact) [km/sec]
double bias(const double Mmin, const double sigmalgM, const double M0, const double M1, const double alpha, const std::shared_ptr< void > inputs)
the mean galaxy bias
The global namespace of the CosmoBolognaLib
T Min(const std::vector< T > vect)
minimum element of a std::vector
std::string conv(const T val, const char *fact)
convert a number to a std::string
double Average(const std::vector< double > vect)
the average of a std::vector
std::vector< T > logarithmic_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with logarithmically spaced values
std::vector< T > linear_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with linearly spaced values
T poisson(T xx, std::shared_ptr< void > pp, std::vector< double > par)
the poisson distribution
T Max(const std::vector< T > vect)
maximum element of a std::vector
double Sigma(const std::vector< double > vect)
the standard deviation of a std::vector
void polar_coord(const double XX, const double YY, const double ZZ, double &ra, double &dec, double &dd)
conversion from Cartesian coordinates to polar coordinates