CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
LogNormalFull.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 
34 #include "LogNormalFull.h"
35 
36 using namespace std;
37 
38 using namespace cbl;
39 using namespace cosmology;
40 using namespace catalogue;
41 
42 
43 // ============================================================================
44 
45 
46 cbl::lognormal::LogNormalFull::LogNormalFull (const cosmology::Cosmology cosmology, const double redshift_min, const double redshift_max, const int n_redshift_bins, const std::string author)
47 {
48  set_cosmo_function(cosmology, redshift_min, redshift_max, n_redshift_bins, author);
49 }
50 
51 
52 // ============================================================================
53 
54 
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)
56 {
57  set_grid_parameters(rmin, xMin, xMax, yMin, yMax, zMin, zMax);
58 
59  set_cosmo_function(cosmology, redshift_min, redshift_max, n_redshift_bins, author);
60 }
61 
62 
63 // ============================================================================
64 
65 
66 cbl::lognormal::LogNormalFull::LogNormalFull (const double rmin, const std::vector<std::shared_ptr<catalogue::Catalogue>> random, const double pad, const cosmology::Cosmology cosmology, const double redshift_min, const double redshift_max, const int n_redshift_bins, const std::string author)
67 {
68  set_grid_parameters(rmin, random, pad);
69 
70  set_cosmo_function(cosmology, redshift_min, redshift_max, n_redshift_bins, author);
71 }
72 
73 
74 // ============================================================================
75 
76 
77 void cbl::lognormal::LogNormalFull::set_cosmo_function (const cosmology::Cosmology cosmology, const double redshift_min, const double redshift_max, const int nredshift, const std::string author)
78 {
79  m_cosmology = make_shared<Cosmology>(cosmology);
80 
81  m_author = author;
82 
83  vector<double> redshift = linear_bin_vector(nredshift, redshift_min, redshift_max);
84 
85  vector<double> dc, ff, dd, HH;
86 
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]));
90  ff.push_back(cosmology.linear_growth_rate(redshift[i], 0.));
91  dd.push_back(cosmology.DD(redshift[i])/cosmology.DD(0.));
92  }
93 
94  m_func_DC = make_shared<glob::FuncGrid>(glob::FuncGrid(redshift, dc, "Spline"));
95 
96  m_func_redshift = make_shared<glob::FuncGrid>(glob::FuncGrid(dc, redshift, "Spline"));
97 
98  m_func_HH = make_shared<glob::FuncGrid>(glob::FuncGrid(redshift, HH, "Spline"));
99 
100  m_func_growth_rate = make_shared<glob::FuncGrid>(glob::FuncGrid(redshift, ff, "Spline"));
101 
102  m_func_growth_factor = make_shared<glob::FuncGrid>(glob::FuncGrid(redshift, dd, "Spline"));
103 
104  int nk = 500;
105  double kmin = 1.e-4;
106  double kmax = 1.e2;
107  vector<double> kk = logarithmic_bin_vector(nk, kmin, kmax);
108  vector<double> Pk = m_cosmology->Pk_matter(kk, m_author, 0, 0.);
109 
110  m_func_pk = make_shared<glob::FuncGrid>(glob::FuncGrid(kk, Pk, "Spline"));
111 }
112 
113 
114 // ============================================================================
115 
116 
118 {
119  m_nx = (m_xMax-m_xMin)/m_rmin;
120  m_nx = (m_nx%2==0) ? m_nx : m_nx+1;
121 
122  m_ny = (m_yMax-m_yMin)/m_rmin;
123  m_ny = (m_ny%2==0) ? m_ny : m_ny+1;
124 
125  m_nz = (m_zMax-m_zMin)/m_rmin;
126  m_nz = (m_nz%2==0) ? m_nz : m_nz+1;
127 
128  m_nzF = m_nz*0.5+1;
129 }
130 
131 
132 // ============================================================================
133 
134 
135 void cbl::lognormal::LogNormalFull::set_grid_parameters (const double rmin, const double xMin, const double xMax, const double yMin, const double yMax, const double zMin, const double zMax)
136 {
137  m_rmin = rmin;
138 
139  m_xMin = xMin;
140  m_yMin = yMin;
141  m_zMin = zMin;
142 
143  m_xMax = xMax;
144  m_yMax = yMax;
145  m_zMax = zMax;
146 
147  m_set_grid_parameters();
148 }
149 
150 
151 // ============================================================================
152 
153 
154 void cbl::lognormal::LogNormalFull::set_grid_parameters (const double rmin, const std::vector<std::shared_ptr<catalogue::Catalogue>> random, const double pad)
155 {
156  m_rmin = rmin;
157 
158  m_random = random;
159 
160  vector<double> xMin, xMax, yMin, yMax, zMin, zMax;
161 
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_));
166 
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_));
170  }
171 
172  m_xMin = Min(xMin)-pad;
173  m_yMin = Min(yMin)-pad;
174  m_zMin = Min(zMin)-pad;
175 
176  m_xMax = Max(xMax)+pad;
177  m_yMax = Max(yMax)+pad;
178  m_zMax = Max(zMax)+pad;
179 
180  m_set_grid_parameters();
181 }
182 
183 
184 // ============================================================================
185 
186 
187 void cbl::lognormal::LogNormalFull::m_set_fields (const bool use_random, const bool doRSD)
188 {
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));
190 
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));
192 
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));
194 
195  if (doRSD) {
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));
198  }
199 
200  if (use_random)
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)));
203  }
204  else
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));
206 
207 }
208 
209 
210 // ============================================================================
211 
212 
213 void cbl::lognormal::LogNormalFull::m_reset_fields (const bool use_random, const bool doRSD)
214 {
215  m_clustering_signal->reset();
216 
217  m_density->reset();
218 
219  if (doRSD) {
220  m_los_velocity->reset();
221  m_velocity->reset();
222  }
223 
224  if (use_random) {
225  m_visibility.reset();
226  for (size_t i=0;i<m_random.size();i++) {
227  m_visibility_random[i]->reset();
228  }
229  }
230  else{
231  m_visibility->reset();
232  for (size_t i=0;i<m_random.size();i++) {
233  m_visibility_random[i].reset();
234  }
235  }
236 
237 }
238 
239 
240 // ============================================================================
241 
242 /*
243 void cbl::lognormal::LogNormalFull::write_XiMultipoles(const std::vector<double> rr, const std::string file_out)
244 {
245  vector<double> kk = logarithmic_bin_vector(200, 1.e-4, 1.e1);
246 }
247 */
248 
249 // ============================================================================
250 
251 
253 {
254  double Volume = m_clustering_signal->Volume();
255 
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);
262 
263  double kk = sqrt(kx*kx+ky*ky+kz*kz);
264 
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);
267  }
268  }
269  }
270 
271  m_clustering_signal->FourierAntiTransformField ();
272 
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++) {
276 
277  double value = log(m_clustering_signal->ScalarField(i, j, k)+1);
278  m_clustering_signal->set_ScalarField(value, i, j, k);
279  }
280  }
281  }
282 
283  m_clustering_signal->FourierTransformField ();
284 
285 }
286 
287 
288 // ============================================================================
289 
290 
291 void cbl::lognormal::LogNormalFull::m_set_density_field (const double smoothing_radius)
292 {
293  random::NormalRandomNumbers normal(0., 1., m_generator());
294 
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);
302 
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);
306  }
307  else if (i == m_nx/2 || j == m_ny/2) {
308 
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)));
311 
312  normal.set_mean_sigma(0., Pkk);
313 
314  double val = normal()*smoothing;
315 
316  while (val!=val)
317  val = normal()*smoothing;
318 
319  m_densityG->set_ScalarField_FourierSpace_real(val, i, j, k, 0);
320  m_densityG->set_ScalarField_FourierSpace_complex(0, i, j, k, 0);
321  }
322  else {
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)));
325 
326  normal.set_mean_sigma(0., Pkk);
327  double val1 = normal()*smoothing;
328  double val2 = normal()*smoothing;
329 
330  while (val1!=val1)
331  val1 = normal()*smoothing;
332 
333  while (val2!=val2)
334  val2 = normal()*smoothing;
335 
336  m_densityG->set_ScalarField_FourierSpace_real(val1, i, j, k, 0);
337  m_densityG->set_ScalarField_FourierSpace_complex(val2, i, j, k, 0);
338  }
339 
340  }
341  }
342  }
343 
344  m_densityG->FourierAntiTransformField ();
345  double mean = Average(m_densityG->ScalarField());
346  m_sigma2G = pow(Sigma(m_densityG->ScalarField()), 2);
347 
348  coutCBL << "Average: " << mean << " Sigma^2: " << m_sigma2G << endl;
349 
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);
356 
357  double dc = sqrt(xx*xx+yy*yy+zz*zz);
358 
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);
363  }
364  }
365  }
366 
367  m_density->FourierTransformField();
368 }
369 
370 
371 // ============================================================================
372 
373 
375 {
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);
382 
383  double k2 = kx*kx+ky*ky+kz*kz;
384 
385  double vx_real = 0;
386  double vy_real = 0;
387  double vz_real = 0;
388 
389  double vx_complex = 0;
390  double vy_complex = 0;
391  double vz_complex = 0;
392 
393 
394  if (i==0 && j==0 && k==0) {
395  }
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);
400  }
401  else {
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);
405 
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);
409  }
410 
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);
413  }
414  }
415  }
416  m_velocity->FourierAntiTransformField();
417 
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);
424 
425  double rr2 = xx*xx+yy*yy+zz*zz;
426  double rr = sqrt(rr2);
427 
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);
430 
431  vector<double> vel = m_velocity->VectorField(i,j,k);
432 
433  double vr = fact*(xx*vel[0]+yy*vel[1]+zz*vel[2])/rr;
434 
435  m_los_velocity->set_ScalarField(vr, i, j, k, 0);
436  }
437  }
438  }
439 
440 }
441 
442 
443 // ============================================================================
444 
445 
447 {
448  double mmax = max(max((m_xMax-m_xMin)/2, (m_yMax-m_yMin)/2),(m_xMax-m_xMin)/2);
449  m_nCells_eff=0;
450 
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);
457 
458  double dc = sqrt(xx*xx+yy*yy+zz*zz);
459  if (dc<mmax) {
460  m_nCells_eff +=1;
461  m_visibility->set_ScalarField(1., i, j, k, 0);
462  }
463  else {
464  m_visibility->set_ScalarField(0., i, j, k, 0);
465  }
466  }
467  }
468  }
469 
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);
475  }
476 }
477 
478 
479 // ============================================================================
480 
481 
483 {
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;
487 
488  for (int s=0; s<nsamples; s++) {
489  m_visibility_random[s]->reset();
490 
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);
496 
497  double ww = m_random[s]->weight(obj)/nObjects;
498  m_visibility_random[s]->set_ScalarField(ww, i, j, k, 1);
499  }
500 
501  }
502 
503  coutCBL << "Done!" << endl;
504 }
505 
506 
507 // ============================================================================
508 
509 
511 {
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;
515 
516  for (int s=0; s<nsamples; s++) {
517  m_visibility_random[s]->reset();
518 
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);
524 
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);
529 
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;
531 
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);
535 
536  double ww = m_random[s]->weight(obj)/nObjects;
537  m_visibility_random[s]->set_ScalarField(ww, i, j, k, 1);
538  }
539 
540  }
541 
542  coutCBL << "Done!" << endl;
543 }
544 
545 
546 // ============================================================================
547 
548 
549 void cbl::lognormal::LogNormalFull::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)
550 {
551  ofstream fout(file_out.c_str());
552 
553  double max_redshift = m_func_redshift->operator()(sqrt(m_xMax*m_xMax+m_yMax*m_yMax+m_zMax*m_zMax));
554  glob::FuncGrid func_bias(redshift, bias, "Spline");
555 
556  random::PoissonRandomNumbers poisson(1, m_generator());
557 
558  double min = -m_rmin*0.5, max = m_rmin*0.5;
559  random::UniformRandomNumbers ran(min, max, m_generator());
560 
561  int nObj = 0;
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);
568 
569  double dc2 = xx*xx+yy*yy+zz*zz;
570  double dc = sqrt(dc2);
571 
572  double redshift = m_func_redshift->operator()(dc);
573  double bias = func_bias(redshift);
574 
575  double fact = bias*m_func_growth_factor->operator()(redshift);
576 
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;
579 
580  poisson.set_mean(p);
581  int no = poisson();
582 
583  double vv = (doRSD) ? m_los_velocity->ScalarField(i, j, k)/par::cc : 0.;
584 
585  for (int n = 0; n<no; n++) {
586  comovingCoordinates comcoord;
587  observedCoordinates obscoord;
588 
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);
593 
594  polar_coord(comcoord.xx, comcoord.yy, comcoord.zz, obscoord.ra, obscoord.dec, ddcc);
595 
596  obscoord.ra = obscoord.ra*180./par::pi;
597  obscoord.dec = obscoord.dec*180./par::pi;
598 
599  obscoord.ra = (obscoord.ra<0) ? obscoord.ra+360. : obscoord.ra;
600 
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;
605  nObj++;
606  }
607  }
608  }
609  }
610  }
611  fout.clear(); fout.close();
612  coutCBL << "Extracted "<< nObj << " points, written in " << file_out << endl;
613 }
614 
615 
616 // ============================================================================
617 
618 
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)
620 {
621  m_generator.seed(seed);
622 
623  if (set_fields)
624  m_set_fields(use_random, doRSD);
625  else
626  m_reset_fields(use_random, doRSD);
627 
628  m_set_clustering_signal();
629 
630  int nsamples = nObjects.size();
631 
632  if (use_random)
633  m_set_visibility_from_random();
634  else
635  m_set_visibility();
636 
637  for (int i=start; i<stop; i++) {
638  m_set_density_field(smoothing_radius);
639 
640  if (doRSD) m_set_radial_velocity();
641 
642  for (int n=0;n<nsamples; n++) {
643  string ff = dir+filename+"_sample_"+conv(n+1, par::fINT)+"_realization_"+conv(i+1, par::fINT);
644 
645  m_extract_points_lognormal_field(nObjects[n], doRSD, redshift[n], bias[n], (use_random) ? m_visibility_random[n] : m_visibility, ff);
646  }
647 
648  }
649 
650 }
651 
652 
653 // ============================================================================
654 /*
655 
656 void cbl::lognormal::LogNormalFull::m_set_potential()
657 {
658  double OmH02 = m_cosmology->OmegaM()*pow(m_cosmology->H0(),2);
659 
660  for (int i=0; i<m_nx; i++) {
661  double kx = m_clustering_signal->kX(i);
662  for (int j=0; j<m_ny; j++) {
663  double ky = m_clustering_signal->kY(j);
664  for (int k=0; k<m_nzF; k++) {
665  double kz = m_clustering_signal->kZ(k);
666 
667  double k2 = kx*kx+ky*ky+kz*kz;
668 
669  double phi_real = 0;
670  double phi_complex = 0;
671 
672  if (i==0 && j==0 && k==0) {
673  }
674  else if (i == m_nx/2 || j == m_ny/2) {
675  phi_real = -1.5*OmH02*m_density->ScalarField_FourierSpace_real(i,j,k)/k2;
676  phi_complex = 0;
677  }
678  else {
679  phi_real = -1.5*OmH02*m_density->ScalarField_FourierSpace_real(i,j,k)/k2;
680  phi_complex = -1.5*OmH02*m_density->ScalarField_FourierSpace_complex(i,j,k)/k2;
681  }
682 
683  m_potential->set_ScalarField_FourierSpace_real( phi_real, i, j, k, 0);
684  m_potential->set_ScalarField_FourierSpace_complex( phi_complex, i, j, k, 0);
685  }
686  }
687  }
688  m_potential->FourierAntiTransformField();
689 
690 }
691 
692 
693 // ============================================================================
694 
695 
696 void cbl::lognormal::LogNormalFull::set_displacement_field ()
697 {
698 
699  m_density->FourierTransformField ();
700 
701  for (int i=0; i<m_nx; i++) {
702  double kx = m_clustering_signal->kX(i);
703  for (int j=0; j<m_ny; j++) {
704  double ky = m_clustering_signal->kY(j);
705  for (int k=0; k<m_nzF; k++) {
706  double kz = m_clustering_signal->kZ(k);
707  double kk2 = kx*kx+ky*ky+kz*kz;
708 
709  vector<double> displ_real(3,0), displ_complex(3,0.);
710 
711  if (i==0 && j==0 && k==0) {
712  }
713  else if (i == m_nx/2 || j == m_ny/2) {
714  displ_real[0] = kx/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
715  displ_real[1] = ky/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
716  displ_real[2] = kz/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
717  }
718  else {
719  displ_real[0] = kx/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
720  displ_real[1] = ky/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
721  displ_real[2] = kz/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
722 
723  displ_complex[0] = -kx/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
724  displ_complex[1] = -ky/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
725  displ_complex[2] = -kz/kk2*m_density->ScalarField_FourierSpace_complex(i,j,k);
726  }
727 
728  m_displacement->set_VectorField_FourierSpace_real( displ_real, i, j, k, 0);
729  m_displacement->set_VectorField_FourierSpace_complex( displ_complex, i, j, k, 0);
730 
731 
732  }
733  }
734  }
735 
736  m_displacement->FourierAntiTransformField ();
737 
738  set_rsd_displacement_field();
739 
740  for (int i=0; i<m_nx; i++)
741  for (int j=0; j<m_ny; j++)
742  for (int k=0; k<m_nz; k++)
743  m_displacement->set_VectorField(m_rsd_displacement->VectorField(i,j,k), i, j, k, 0);
744 
745 }
746 
747 
748 // ============================================================================
749 
750 
751 void cbl::lognormal::LogNormalFull::set_rsd_displacement_field ()
752 {
753  for (int i=0; i<m_nx; i++) {
754  double xx = m_displacement->XX(i);
755  for (int j=0; j<m_ny; j++) {
756  double yy = m_displacement->YY(j);
757  for (int k=0; k<m_nz; k++) {
758  double zz = m_displacement->ZZ(k);
759 
760  double dc2 = xx*xx+yy*yy+zz*zz;
761  double dc = sqrt(dc2);
762 
763  double redshift = m_func_redshift->operator()(dc);
764  double ff = m_func_growth_rate->operator()(redshift);
765 
766  vector<double> displ = m_displacement->VectorField(i, j, k);
767  double prod = displ[0]*xx+displ[1]*yy+displ[2]*zz;
768  double rsd_xx = ff*prod*xx/(dc2*(1.+redshift));
769  double rsd_yy = ff*prod*yy/(dc2*(1.+redshift));
770  double rsd_zz = ff*prod*zz/(dc2*(1.+redshift));
771  m_rsd_displacement->set_VectorField({rsd_xx, rsd_yy, rsd_zz}, i, j, k);
772  }
773  }
774  }
775 
776 }
777 */
778 
779 
#define coutCBL
CBL print message.
Definition: Kernel.h:734
Implementation of the log-normal data structure.
The class Cosmology.
Definition: Cosmology.h:277
double HH(const double redshift=0.) const
the Hubble function
Definition: Cosmology.cpp:570
double D_C(const double redshift) const
the comoving line-of-sight distance at a given redshift
Definition: Cosmology.cpp:741
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 DD(const double redshift) const
the amplitude of the growing mode at a given redshift,
Definition: Cosmology.cpp:702
The class ScalarField3D.
Definition: Field3D.h:648
The class VectorField3D.
Definition: Field3D.h:871
The class FuncGrid.
Definition: FuncGrid.h:55
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.
The class UniformRandomNumbers.
static const char fINT[]
conversion symbol for: int -> std::string
Definition: Constants.h:121
static const double pi
: the ratio of a circle's circumference to its diameter
Definition: Constants.h:199
static const double cc
: the speed of light in vacuum (the value is exact) [km/sec]
Definition: Constants.h:221
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
T Min(const std::vector< T > vect)
minimum element of a std::vector
Definition: Kernel.h:1324
std::string conv(const T val, const char *fact)
convert a number to a std::string
Definition: Kernel.h:903
double Average(const std::vector< double > vect)
the average of a std::vector
Definition: Func.cpp:870
std::vector< T > logarithmic_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with logarithmically spaced values
Definition: Kernel.h:1621
std::vector< T > linear_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with linearly spaced values
Definition: Kernel.h:1604
T poisson(T xx, std::shared_ptr< void > pp, std::vector< double > par)
the poisson distribution
Definition: Func.h:1143
T Max(const std::vector< T > vect)
maximum element of a std::vector
Definition: Kernel.h:1336
double Sigma(const std::vector< double > vect)
the standard deviation of a std::vector
Definition: Func.cpp:925
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
Definition: Func.cpp:214