CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
Reconstruction.cpp
Go to the documentation of this file.
1 /********************************************************************
2  * Copyright (C) 2010 by Federico Marulli and Alfonso Veropalumbo *
3  * federico.marulli3@unibo.it *
4  * *
5  * This program is free software; you can redistribute it and/or *
6  * modify it under the terms of the GNU General Public License as *
7  * published by the Free Software Foundation; either version 2 of *
8  * the License, or (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public *
16  * License along with this program; if not, write to the Free *
17  * Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ********************************************************************/
20 
35 #include "GlobalFunc.h"
36 
37 using namespace std;
38 
39 using namespace cbl;
40 
41 
42 // ============================================================================
43 
44 
45 void cbl::reconstruction_fourier_space (const catalogue::Catalogue data, const catalogue::Catalogue random, const bool random_RSD, const cosmology::Cosmology cosmology, const double redshift, const double bias, const double cell_size, const double smoothing_radius, const int interpolation_type)
46 {
47  double ff = cosmology.linear_growth_rate(redshift);
48  double beta = ff/bias;
49 
50  //double rsd_term = 3*ff/(7+3*ff);
51  //double rsd_term = (ff-beta)/(1+beta);
52  //double rsd_term= ff/(ff+1);
53 
54  double rsd_term = 3*beta/(7+3*beta);
55 
56  data::ScalarField3D density_field = data.density_field(cell_size, random, interpolation_type, smoothing_radius);
57 
58  density_field.FourierTransformField();
59 
60  data::VectorField3D displacement_field(density_field.nx(), density_field.ny(), density_field.nz(), density_field.MinX(), density_field.MaxX(), density_field.MinY(), density_field.MaxY(), density_field.MinZ(), density_field.MaxZ());
61 
62  data::VectorField3D displacement_field_RSD(density_field.nx(), density_field.ny(), density_field.nz(), density_field.MinX(), density_field.MaxX(), density_field.MinY(), density_field.MaxY(), density_field.MinZ(), density_field.MaxZ());
63 
64 
65  // convert the grid to the displacement field (in Fourier space)
66 
67  double xfact = 2.*par::pi/(density_field.deltaX()*density_field.nx());
68  double yfact = 2.*par::pi/(density_field.deltaY()*density_field.ny());
69  double zfact = 2.*par::pi/(density_field.deltaZ()*density_field.nz());
70 
71  for (int i=0; i<density_field.nx(); i++) {
72  double kx = (i<=density_field.nx()/2) ? xfact*i : -(density_field.nx()-i)*xfact;
73  for (int j=0; j<density_field.ny(); j++) {
74  double ky =(j<=density_field.ny()/2) ? yfact*j : -(density_field.ny()-j)*yfact;
75  for (int k=0; k<density_field.nzFourier(); k++) {
76  double kz = zfact*k;
77  double kk = pow(kx*kx+ky*ky+kz*kz, 0.5);
78 
79  vector<double> gridK = {density_field.ScalarField_FourierSpace_real (i, j, k)/bias, density_field.ScalarField_FourierSpace_complex (i, j, k)/bias };
80 
81  if (kk!=0){
82  displacement_field.set_VectorField_FourierSpace_real({kx*gridK[1]/(kk*kk), ky*gridK[1]/(kk*kk), kz*gridK[1]/(kk*kk)} ,i ,j ,k);
83 
84  displacement_field.set_VectorField_FourierSpace_complex({-kx*gridK[0]/(kk*kk), -ky*gridK[0]/(kk*kk)/bias, -kz*gridK[0]/(kk*kk)} ,i , j, k);
85  }
86 
87  }
88  }
89  }
90 
91  displacement_field.FourierAntiTransformField();
92 
93 
94  // apply the RSD correction (in Fourier space)
95 
96  for (int i=0; i<density_field.nx(); i++)
97  for (int j=0; j<density_field.ny(); j++)
98  for (int k=0; k<density_field.nz(); k++) {
99 
100  double rx = density_field.XX(i), ry = density_field.YY(j), rz = density_field.ZZ(k);
101  double rr = (sqrt(rx*rx+ry*ry+rz*rz)==0) ? 1 : sqrt(rx*rx+ry*ry+rz*rz);
102 
103  vector<double> displ = displacement_field.VectorField(i, j, k);
104  double scalar_product = (rr==0) ? 0. : (displ[0]*rx+displ[1]*ry+displ[2]*rz)/rr;
105 
106  double displ_x_rsd = displ[0]+rsd_term*scalar_product*rx/rr;
107  double displ_y_rsd = displ[1]+rsd_term*scalar_product*ry/rr;
108  double displ_z_rsd = displ[2]+rsd_term*scalar_product*rz/rr;
109 
110  displacement_field_RSD.set_VectorField({displ_x_rsd, displ_y_rsd, displ_z_rsd}, i, j, k);
111  }
112 
113 
114  // set the displacement
115 
116  for (size_t i=0; i<data.nObjects(); i++) {
117  int i1 = min(int((data.xx(i)-density_field.MinX())/density_field.deltaX()), density_field.nx()-1);
118  int j1 = min(int((data.yy(i)-density_field.MinY())/density_field.deltaY()), density_field.ny()-1);
119  int k1 = min(int((data.zz(i)-density_field.MinZ())/density_field.deltaZ()), density_field.nz()-1);
120 
121  vector<double> displacement = displacement_field_RSD.VectorField(i1, j1, k1);
122 
123  data.catalogue_object(i)->set_x_displacement(displacement[0]);
124  data.catalogue_object(i)->set_y_displacement(displacement[1]);
125  data.catalogue_object(i)->set_z_displacement(displacement[2]);
126  }
127 
128  for (size_t i=0; i<random.nObjects(); i++) {
129  int i1 = min(int((random.xx(i)-density_field.MinX())/density_field.deltaX()), density_field.nx()-1);
130  int j1 = min(int((random.yy(i)-density_field.MinY())/density_field.deltaY()), density_field.ny()-1);
131  int k1 = min(int((random.zz(i)-density_field.MinZ())/density_field.deltaZ()), density_field.nz()-1);
132 
133  vector<double> displacement = (random_RSD) ? displacement_field_RSD.VectorField(i1, j1, k1) : displacement_field.VectorField(i1, j1, k1);
134 
135  random.catalogue_object(i)->set_x_displacement(displacement[0]);
136  random.catalogue_object(i)->set_y_displacement(displacement[1]);
137  random.catalogue_object(i)->set_z_displacement(displacement[2]);
138  }
139 }
140 
141 
142 // ============================================================================
143 
144 
146 {
147  catalogue::Catalogue displaced_cat(input_catalogue);
148 
149  // apply the displacements
150 
151  for (size_t i=0; i<displaced_cat.nObjects(); i++) {
152 
153  double xx = displaced_cat.xx(i);
154  double yy = displaced_cat.yy(i);
155  double zz = displaced_cat.zz(i);
156 
157  double x_displ = displaced_cat.x_displacement(i);
158  double y_displ = displaced_cat.y_displacement(i);
159  double z_displ = displaced_cat.z_displacement(i);
160 
161  displaced_cat.catalogue_object(i)->set_xx(xx+x_displ);
162  displaced_cat.catalogue_object(i)->set_yy(yy+y_displ);
163  displaced_cat.catalogue_object(i)->set_zz(zz+z_displ);
164  }
165 
166  displaced_cat.computePolarCoordinates();
167 
168  return displaced_cat;
169 }
Generic functions that use one or more classes of the CosmoBolognaLib.
The class Catalogue.
Definition: Catalogue.h:654
double z_displacement(const int i) const
get the private member Catalogue::m_object[i]->m_z_displacement
Definition: Catalogue.h:1985
double yy(const int i) const
get the private member Catalogue::m_object[i]->m_yy
Definition: Catalogue.h:1814
size_t nObjects() const
get the number of objects of the catalogue
Definition: Catalogue.h:2264
double xx(const int i) const
get the private member Catalogue::m_object[i]->m_xx
Definition: Catalogue.h:1807
std::shared_ptr< Object > catalogue_object(const int i) const
get the i-th object of the catalogue
Definition: Catalogue.h:2236
double y_displacement(const int i) const
get the private member Catalogue::m_object[i]->m_y_displacement
Definition: Catalogue.h:1977
data::ScalarField3D density_field(const double cell_size, const Catalogue mask_catalogue, const int interpolation_type=0, const double kernel_radius=0., const bool useMass=false) const
return the density field from object position
Definition: Catalogue.cpp:2341
double zz(const int i) const
get the private member Catalogue::m_object[i]->m_zz
Definition: Catalogue.h:1821
double x_displacement(const int i) const
get the private member Catalogue::m_object[i]->m_x_displacement
Definition: Catalogue.h:1969
void computePolarCoordinates(const CoordinateUnits outputUnits=CoordinateUnits::_radians_)
compute the polar coordinates (R.A., Dec, dc) from the comoving coordinates (x, y,...
Definition: Catalogue.cpp:1587
The class Cosmology.
Definition: Cosmology.h:277
double linear_growth_rate(const double redshift, const double prec=1.e-4) const
the linear growth rate at a given redshift,
Definition: Cosmology.cpp:662
double deltaX() const
get the private member m_deltaX
Definition: Field3D.h:319
double MaxY() const
get the private member m_MaxY
Definition: Field3D.h:307
double MinY() const
get the private member m_MinY
Definition: Field3D.h:289
int nzFourier() const
get the private member m_nZF
Definition: Field3D.h:265
double XX(const int i) const
get the value of the X coordinates at the i-th cell
Definition: Field3D.h:346
double deltaZ() const
get the private member m_deltaZ
Definition: Field3D.h:331
int ny() const
get the private member m_nY
Definition: Field3D.h:253
double MinX() const
get the private member m_MinX
Definition: Field3D.h:283
int nx() const
get the private member m_nX
Definition: Field3D.h:247
double MaxZ() const
get the private member m_MaxZ
Definition: Field3D.h:313
double ZZ(const int i) const
get the value of the Z coordinates at the i-th cell
Definition: Field3D.h:364
double deltaY() const
get the private member m_deltaY
Definition: Field3D.h:325
int nz() const
get the private member m_nZ
Definition: Field3D.h:259
double MinZ() const
get the private member m_MinZ
Definition: Field3D.h:295
double YY(const int i) const
get the value of the Y coordinates at the i-th cell
Definition: Field3D.h:355
double MaxX() const
get the private member m_MaxX
Definition: Field3D.h:301
The class ScalarField3D.
Definition: Field3D.h:648
void FourierTransformField()
perform the Fourier transform on the field
Definition: Field3D.cpp:217
double ScalarField_FourierSpace_real(const int i, const int j, const int k) const
get the value of the scalar field, Fourier space, real part
Definition: Field3D.cpp:325
double ScalarField_FourierSpace_complex(const int i, const int j, const int k) const
get the value of the scalar field, Fourier space, complex part
Definition: Field3D.cpp:334
The class VectorField3D.
Definition: Field3D.h:871
void set_VectorField_FourierSpace_real(const std::vector< double > value, const int i, const int j, const int k, const bool add=0)
set the value of the vector field, Fourier space, real part
Definition: Field3D.cpp:529
void set_VectorField_FourierSpace_complex(const std::vector< double > value, const int i, const int j, const int k, const bool add=0)
set the value of the vector field, Fourier space, complex part
Definition: Field3D.cpp:540
void set_VectorField(const std::vector< double > value, const int i, const int j, const int k, const bool add=0)
set the value of the vectorr field
Definition: Field3D.cpp:518
std::vector< double > VectorField(const int i, const int j, const int k) const
get the value of the vector field
Definition: Field3D.cpp:551
void FourierAntiTransformField()
perform the anti-Fourier transform on the field
Definition: Field3D.cpp:490
static const double pi
: the ratio of a circle's circumference to its diameter
Definition: Constants.h:199
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
Definition: CAMB.h:38
catalogue::Catalogue displaced_catalogue(const catalogue::Catalogue input_catalogue)
return a sample with objects displaced, according to the internal variables m_x_displacement,...
void reconstruction_fourier_space(const catalogue::Catalogue data, const catalogue::Catalogue random, const bool random_RSD, const cosmology::Cosmology cosmology, const double redshift, const double bias, const double cell_size, const double smoothing_radius, const int interpolation_type=0)
compute the non linear displacements of the density field