47 if (type!=RandomType::_createRandom_box_)
ErrorCBL(
"the random catalogue has to be cubic!",
"Catalogue",
"RandomCatalogue.cpp");
49 coutCBL <<
"I'm creating a random catalogue with warped cubic geometry, due to geometric distortions: the undistorted random catalogue is read from a file..." << endl;
51 string file_in = dir_in+
"random_catalogue";
52 coutCBL <<
"file_in = " << file_in << endl;
53 ifstream fin(file_in.c_str());
checkIO(fin, file_in);
55 string line;
double NUM;
56 vector<double> random_X, random_Y, random_Z;
58 while (getline(fin, line)) {
59 stringstream ss(line);
60 ss >> NUM; random_X.push_back(NUM);
61 ss >> NUM; random_Y.push_back(NUM);
62 ss >> NUM; random_Z.push_back(NUM);
65 fin.clear(); fin.close();
70 vector<double> random_ra(random_X.size()), random_dec(random_X.size()), random_dc(random_X.size()), random_dc_warped(random_X.size()), random_redshift(random_X.size());
71 polar_coord(random_X, random_Y, random_Z, random_ra, random_dec, random_dc);
72 for (
size_t i=0; i<random_X.size(); i++) random_redshift[i] = real_cosm.
Redshift(random_dc[i], Zguess_min, Zguess_max);
73 for (
size_t i=0; i<random_X.size(); i++) random_dc_warped[i] = test_cosm.
D_C(random_redshift[i]);
74 cartesian_coord(random_ra, random_dec, random_dc_warped, random_X, random_Y, random_Z);
78 for (
size_t i=0; i<random_X.size(); i++) {
79 comovingCoordinates coord = {random_X[i], random_Y[i], random_Z[i]};
80 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord)));
88 cbl::catalogue::Catalogue::Catalogue (
const RandomType type,
const Catalogue catalogue,
const double N_R,
const int nbin,
const cosmology::Cosmology &cosm,
const bool conv,
const double sigma,
const std::vector<double> redshift,
const std::vector<double> RA,
const std::vector<double> Dec,
const int z_ndigits,
const int seed)
90 size_t nRandom = int(N_R*catalogue.
nObjects());
92 vector<double> ra, dec;
93 if (RA.size()>0) ra = RA;
94 if (Dec.size()>0) dec = Dec;
95 if (ra.size()!=dec.size())
ErrorCBL(
"the dimension of observed random coordinates read in input is wrong!",
"Catalogue",
"RandomCatalogue.cpp");
96 if (ra.size()>0 && ra.size()!=nRandom) nRandom = ra.size();
98 if (type==RandomType::_createRandom_box_) {
100 coutCBL <<
"* * * I'm creating a random catalogue with cubic geometry * * *" << endl;
102 double Xmin = catalogue.
Min(Var::_X_), Xmax = catalogue.
Max(Var::_X_);
103 double Ymin = catalogue.
Min(Var::_Y_), Ymax = catalogue.
Max(Var::_Y_);
104 double Zmin = catalogue.
Min(Var::_Z_), Zmax = catalogue.
Max(Var::_Z_);
106 if (Xmin>Xmax || Ymin>Ymax || Zmin>Zmax)
ErrorCBL(
"wrong values of the coordinates in the construction of the random catalogue; the following conditions have to be satisfied: Xmin<=Xmax, Ymin<=Ymax and Zmin<=Zmax!",
"Catalogue",
"RandomCatalogue.cpp");
110 for (
size_t i=0; i<nRandom; ++i) {
111 comovingCoordinates coord;
112 coord.xx = ran()*(Xmax-Xmin)+Xmin;
113 coord.yy = ran()*(Ymax-Ymin)+Ymin;
114 coord.zz = ran()*(Zmax-Zmin)+Zmin;
115 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord)));
120 else if (type==RandomType::_createRandom_shuffleTOT_) {
123 ra = catalogue.
var(Var::_RA_);
124 dec = catalogue.
var(Var::_Dec_);
125 vector<double> raB = ra, decB = dec;
128 for (
int i=0; i<max(0,
int(N_R)-1); i++) {
129 ra.insert(ra.end(), raB.begin(), raB.end());
130 dec.insert(dec.end(), decB.begin(), decB.end());
137 for (
size_t i=0; i<ra.size(); i++) {
139 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord, cosm)));
147 ra = catalogue.
var(Var::_RA_);
148 dec = catalogue.
var(Var::_Dec_);
149 vector<double> raB = ra , decB = dec;
151 if (type==RandomType::_createRandom_shuffle_) {
153 coutCBL <<
"I'm creating a random catalogue with the 'shuffle' method..." << endl;
157 for (
int i=0; i<max(0,
int(N_R)-1); i++) {
158 ra.insert(ra.end(), raB.begin(), raB.end());
159 dec.insert(dec.end(), decB.begin(), decB.end());
163 else if (type==RandomType::_createRandom_square_) {
164 coutCBL <<
"I'm creating a random catalogue in a RA-Dec square..." << endl;
166 ra.erase(ra.begin(), ra.end());
167 dec.erase(dec.begin(), dec.end());
171 const double ra_min = catalogue.
Min(Var::_RA_),
172 ra_max = catalogue.
Max(Var::_RA_),
173 sin_dec_min = sin(catalogue.
Min(Var::_Dec_)),
174 sin_dec_max = sin(catalogue.
Max(Var::_Dec_));
176 for (
size_t i=0; i<nRandom; i++) {
177 ra.push_back((ra_max-ra_min)*ran()+ra_min);
178 dec.push_back(asin((sin_dec_max-sin_dec_min)*ran()+sin_dec_min));
194 ErrorCBL(
"the chosen random catalogue type is not allowed!",
"Catalogue",
"RandomCatalogue.cpp");
200 vector<double> random_redshift = (redshift.size()>0) ? redshift : catalogue.
var(Var::_Redshift_);
205 vector<double> xx, yy, err;
206 distribution(xx, yy, err, random_redshift, {}, nbin,
true,
par::defaultString, 1.,
cbl::Min(random_redshift),
cbl::Max(random_redshift),
"Linear",
conv, sigma);
209 random_redshift.resize(ra.size());
215 for (
size_t i=0; i<random_redshift.size(); i++) {
216 observedCoordinates coord = {ra[i], dec[i],
round_to_precision(random_redshift[i], z_ndigits)};
217 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord, cosm)));
225 cbl::catalogue::Catalogue::Catalogue (
const RandomType type,
const int N_R,
const double z_step,
const Catalogue catalogue,
const cosmology::Cosmology &cosm,
const std::vector<double> RA,
const std::vector<double> Dec,
const double sigma_kernel,
const int nbins,
const int z_ndigits,
const int times_default,
double times_change,
const double tolerance,
const std::string out_path_nz,
const std::string out_file_nz,
const int seed)
228 size_t nRandom = int(N_R*catalogue.
nObjects());
230 vector<double> ra, dec;
231 if (RA.size()>0) ra = RA;
232 if (Dec.size()>0) dec = Dec;
233 if (ra.size()!=dec.size())
ErrorCBL(
"the dimension of observed random coordinates read in input is wrong!",
"Catalogue",
"RandomCatalogue.cpp");
234 if (ra.size()>0 && ra.size()!=nRandom) nRandom = ra.size();
237 ra = catalogue.
var(Var::_RA_);
238 dec = catalogue.
var(Var::_Dec_);
239 vector<double> raB = ra, decB = dec;
242 for (
int i=0; i<max(0,
int(N_R)-1); i++) {
243 ra.insert(ra.end(), raB.begin(), raB.end());
244 dec.insert(dec.end(), decB.begin(), decB.end());
248 if (type==RandomType::_createRandom_shuffleTOT_) {
253 for (
size_t i=0; i<ra.size(); i++) {
255 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord, cosm)));
259 else if (type==RandomType::_createRandom_shuffle_) {
264 std::vector<double> z_binEdges = {zMin};
266 double z_position = zMin;
267 while (z_position <= zMax) {
268 z_position += z_step;
269 z_binEdges.emplace_back(z_position);
273 std::vector<bool> good_zbin(z_binEdges.size()-1,
false);
274 for (
size_t j=0; j<z_binEdges.size()-1; j++)
275 for (
size_t i=0; i<catalogue.
nObjects(); i++)
276 if (catalogue.
redshift(i)>=z_binEdges[j] && catalogue.
redshift(i)<z_binEdges[j+1]) {
281 std::vector<double> good_z_binEdges;
282 for (
size_t j=0; j<z_binEdges.size()-1; j++) {
285 const bool found = std::find(good_z_binEdges.begin(), good_z_binEdges.end(), z_binEdges[j]) != good_z_binEdges.end();
288 good_z_binEdges.emplace_back(z_binEdges[j]);
289 good_z_binEdges.emplace_back(z_binEdges[j+1]);
294 std::vector<double> z_preliminary = catalogue.
var(Var::_Redshift_);
295 vector<double> xx, yy, err;
296 distribution(xx, yy, err, z_preliminary, {}, nbins,
true,
par::defaultString, 1., zMin, zMax,
"Linear",
true, sigma_kernel);
299 std::vector<double> z;
300 int times = times_default;
301 bool ok_random =
false, been_higher =
false, been_lower =
false;
303 coutCBL <<
"I'm searching for the best number of extractions from the smoothed n(z)..." << endl;
306 while (ok_random==
false) {
309 if (i_counter == 100)
310 ErrorCBL(
"Reached 100 iterations: I couldn't find a good way to build the random redshifts! Play with the following parameters: times_default, times_change, tolerance.",
"Catalogue",
"RandomCatalogue.cpp");
313 z_preliminary.resize(ra.size()*times);
317 for (
size_t i=0; i<z_preliminary.size(); i++) {
318 for (
size_t j=0; j<good_z_binEdges.size()-1; j++) {
319 if ( (good_z_binEdges[j+1]-good_z_binEdges[j]<1.5*z_step) &&
320 (good_z_binEdges[j]<=z_preliminary[i]) && (z_preliminary[i]<good_z_binEdges[j+1]) ) {
321 z.emplace_back(z_preliminary[i]);
326 if (z.size() < ra.size()) {
328 times = (int)(times*(1+times_change));
330 else if (z.size() > ra.size()*(1+tolerance)) {
332 times = (int)(times*(1-times_change));
335 if (been_higher && been_lower) {
339 if (times_change<=0.015)
340 ErrorCBL(
"I couldn't find a good way to build the random redshifts! Play with the following parameters: times_default, times_change, tolerance.",
"Catalogue",
"RandomCatalogue.cpp");
343 coutCBL <<
"I've built the random redshifts vector." << endl;
346 const int nExcess = (int)(z.size()-ra.size());
348 for (
int i=0; i<nExcess; i++) {
350 z.erase(z.begin()+rand());
357 std::vector<double> yy_norm (yy.size());
358 double yy_sum = 0, bin_width = xx[1]-xx[0];
360 for (
size_t j=0; j<xx.size(); j++)
363 for (
size_t j=0; j<xx.size(); j++)
364 yy_norm[j] = yy[j]/yy_sum/bin_width;
367 glob::Histogram1D hist_obj;
368 hist_obj.set(nbins, xx[0], xx[xx.size()-1], 0.5, BinType::_linear_);
370 std::vector<double> weight (z_preliminary.size(), 1.);
371 hist_obj.put(z_preliminary, weight);
373 std::vector<double> hist = hist_obj.operator()(glob::HistogramType::_N_V_);
376 for (
size_t j=0; j<hist.size(); j++)
379 std::vector<double> yy2_norm (hist.size());
380 for (
size_t j=0; j<hist.size(); j++)
381 yy2_norm[j] = hist[j]/yy_sum/bin_width;
384 hist_obj.set(nbins, xx[0], xx[xx.size()-1], 0.5, BinType::_linear_);
385 weight.resize(z.size(), 1.);
386 hist_obj.put(z, weight);
388 hist = hist_obj.operator()(glob::HistogramType::_N_V_);
391 for (
size_t j=0; j<hist.size(); j++)
394 std::vector<double> yy3_norm (hist.size());
395 for (
size_t j=0; j<hist.size(); j++)
396 yy3_norm[j] = hist[j]/yy_sum/bin_width;
399 std::string mkdir =
"mkdir -p "+out_path_nz;
400 if (system(mkdir.c_str())) {}
402 std::ofstream myfile;
403 myfile.open(out_path_nz+out_file_nz);
405 for (
size_t j=0; j<xx.size(); j++)
406 myfile << xx[j] << std::setw(20) << yy_norm[j] << std::setw(20) << yy2_norm[j] << std::setw(20) << yy3_norm[j] << std::endl;
408 coutCBL<<
"I wrote the file "+out_path_nz+out_file_nz<<std::endl;
412 for (
size_t i=0; i<ra.size(); i++) {
414 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord, cosm)));
418 ErrorCBL(
"the chosen random catalogue type is not allowed!",
"Catalogue",
"RandomCatalogue.cpp");
427 if (type!=RandomType::_createRandom_cone_)
ErrorCBL(
"the random catalogue has to be conic!",
"Catalogue",
"RandomCatalogue.cpp");
429 coutCBL <<
"I'm creating a random catalogue in a cone..." << endl;
430 const int nRandom = int(catalogue.
nObjects()*N_R);
435 vector<double> xx, yy, err;
436 distribution(xx, yy, err, redshift, {}, nbin,
true,
par::defaultString, 1.,
cbl::Min(redshift),
cbl::Max(redshift),
"Linear",
conv, sigma);
445 for (
auto &&red : random_redshift)
446 DD.emplace_back(cosm.
D_C(red));
450 const double rMax = cosm.
D_C(catalogue.
Max(Var::_Redshift_))*tan(Angle);
451 const double Dm =
cbl::Min(DD)*0.999;
452 const double DM =
cbl::Max(DD)*1.001;
453 const double fact = 1./DM;
455 for (
size_t i=0; i<DD.size(); ++i) {
456 comovingCoordinates coord;
460 coord.xx = fact*DD[i]*rMax*2.*(ran()-0.5);
462 coord.zz = fact*DD[i]*rMax*2.*(ran()-0.5);
464 const double r1 = sqrt(coord.xx*coord.xx+coord.zz*coord.zz);
465 const double r2 = sqrt(coord.xx*coord.xx+coord.zz*coord.zz+DD[i]*DD[i]);
467 if (r1<fact*DD[i]*rMax && Dm<r2 && r2<DM) OK =
true;
470 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord)));
473 computePolarCoordinates();
483 if (type!=RandomType::_createRandom_MANGLE_)
ErrorCBL(
"the random catalogue has to be of type _MANGLE_!",
"Catalogue",
"RandomCatalogue.cpp");
486 string mangle_dir = path.
DirCosmo()+
"/External/mangle/";
488 string mangle_working_dir = mangle_dir+
"output/";
489 string mkdir =
"mkdir -p "+mangle_working_dir;
490 if (system(mkdir.c_str())) {}
492 string mangle_mask_list;
493 for (
size_t i=0; i<mangle_mask.size(); i++)
494 mangle_mask_list += mangle_mask[i]+
" ";
496 string random_output = mangle_working_dir+
"temporary_random_output.dat";
501 double nrandom = N_R*catalogue.
nObjects();
504 string ransack = mangle_dir+
"/bin/ransack -r"+nrandom_str+
" "+mangle_mask_list+
" "+random_output;
505 if (system(ransack.c_str())) {}
507 vector<double> random_ra, random_dec, random_redshift;
509 ifstream fin(random_output.c_str());
checkIO(fin, random_output);
514 while (getline(fin, line)) {
515 stringstream ss(line);
518 random_ra.push_back(ra);
519 random_dec.push_back(dec);
521 fin.clear(); fin.close();
526 vector<double> redshift = catalogue.
var(Var::_Redshift_);
527 vector<double> xx, yy, err;
528 distribution(xx, yy, err, redshift, {}, nbin,
true,
par::defaultString, 1.,
cbl::Min(redshift),
cbl::Max(redshift),
"Linear",
conv, sigma);
535 for (
size_t i =0; i<random_ra.size(); i++) {
536 observedCoordinates coord = {
radians(random_ra[i]),
radians(random_dec[i]), random_redshift[i]};
537 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord, cosm)));
548 if (type!=RandomType::_createRandom_SDSS_stripes_)
ErrorCBL(
"the random catalogue has to be of type _SDSS_stripe_!",
"Catalogue",
"RandomCatalogue.cpp");
550 vector<double> lambda, eta;
551 vector<int> stripe, stripe_list;
553 vector<double> ra, dec;
555 for (
size_t i=0; i<catalogue.
nObjects(); i++) {
556 ra.push_back(catalogue.
ra(i));
557 dec.push_back(catalogue.
dec(i));
564 std::map<int, vector<double>> lambda_stripe, eta_stripe, redshift_stripe;
565 std::map<int, int> nObj_stripe;
567 for (
size_t i=0; i<catalogue.
nObjects(); i++) {
568 nObj_stripe[stripe[i]] ++;
569 lambda_stripe[stripe[i]].push_back(lambda[i]);
570 eta_stripe[stripe[i]].push_back(eta[i]);
572 redshift_stripe[stripe[i]].push_back(catalogue.
redshift(i));
580 vector<double> random_lambda, random_eta, random_ra, random_dec, random_redshift;
582 for (
auto &&ss : stripe_list) {
585 const double deltaL = MaxL-MinL;
586 const double MinE =
cbl::Min(eta_stripe[ss]);
587 const double MaxE =
cbl::Max(eta_stripe[ss]);
588 const double deltaE = MaxE-MinE;
590 const int nObj = lambda_stripe[ss].size();
591 const int nRan = int(N_R*nObj);
593 for (
int j=0; j<nRan; j++) {
594 random_lambda.push_back(asin(MinL+deltaL*random())*180/
par::pi);
595 random_eta.push_back(MinE+deltaE*random());
597 random_redshift.push_back(redshift_stripe[ss][
int(random()*(nObj-1))]);
601 sdss2eq(random_lambda, random_eta, random_ra, random_dec);
603 if (!dndz_per_stripe) {
606 vector<double> redshift = catalogue.
var(Var::_Redshift_);
607 vector<double> xx, yy, err;
608 distribution(xx, yy, err, redshift, {}, nbin,
true,
par::defaultString, 1.,
cbl::Min(redshift),
cbl::Max(redshift),
"Linear",
conv, sigma);
615 for (
size_t i =0; i<random_ra.size(); i++) {
616 observedCoordinates coord = {
radians(random_ra[i]),
radians(random_dec[i]), random_redshift[i]};
617 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord, cosm)));
625 if (type != RandomType::_createRandom_homogeneous_LC_)
626 ErrorCBL(
"the random catalogue has to be of type _homogeneous_LC_!",
"Catalogue",
"RandomCatalogue.cpp");
629 vector<double> nObj(nbin+1);
631 vector<double> zbins =
linear_bin_vector(nbin+1, catalogue.
Min(Var::_Redshift_), catalogue.
Max(Var::_Redshift_));
632 for (
size_t i=1; i<nbin+1; i++)
633 nObj[i]=nObj[i-1]+prop[1][i-1];
635 std::default_random_engine generator;
636 generator.seed(seed);
641 for (
int i=0; i<int(catalogue.
nObjects()*N_R); i++) {
642 observedCoordinates coord = {randomRA(), asin(randomDec()),
interpolated(
distribution(generator), nObj, zbins,
"Linear")};
643 m_object.push_back(move(Object::Create(ObjectType::_Random_, coord, cosm)));
652 if (nObjects()>tracer_catalogue.
nObjects()) {
653 std::default_random_engine generator;
654 generator.seed(seed);
655 std::uniform_int_distribution<int>
distribution(0,nObjects()-1);
657 vector<bool> mask(nObjects(),
false);
660 while (erased<nObjects()-tracer_catalogue.
nObjects()) {
662 if (mask[rand] ==
false) {
668 remove_objects(mask);
673 vector<double> nObj = {1.};
675 for (
size_t i=0; i<100; i++)
676 nObj.emplace_back(prop[1][i]);
678 std::default_random_engine generator;
679 generator.seed(seed);
684 int nObjec = nObjects();
685 for (
int i=0; i<int(tracer_catalogue.
nObjects()-nObjec); i++) {
686 observedCoordinates coord = {randomRA(), asin(randomDec()),
interpolated(
distribution(generator), nObj, zbins,
"Linear")};
687 add_object(move(Object::Create(ObjectType::_Random_, coord, cosm)));
696 if (nObjects()>tracer_catalogue.
nObjects()) {
697 std::default_random_engine generator;
698 generator.seed(seed);
699 std::uniform_int_distribution<int>
distribution(0,nObjects()-1);
701 vector<bool> mask(nObjects(),
false);
704 while (erased<nObjects()-tracer_catalogue.
nObjects()) {
706 if (mask[rand] ==
false) {
712 remove_objects(mask);
719 int nObjec = nObjects();
720 for (
int i=0; i<int(tracer_catalogue.
nObjects()-nObjec); i++) {
721 comovingCoordinates coord = {randomX(), randomY(), randomZ()};
722 add_object(move(Object::Create(ObjectType::_Random_, coord)));
Class used to handle binned variables.
#define coutCBL
CBL print message.
std::string DirCosmo()
get the directory where the CosmoBolognaLbi are stored
Catalogue()=default
default constructor
double Min(const Var var_name) const
get the minimum value of a variable of the catalogue objects
size_t nObjects() const
get the number of objects of the catalogue
double dec(const int i) const
get the private member Catalogue::m_object[i]->m_dec
double redshift(const int i) const
get the private member Catalogue::m_object[i]->m_redshift
double ra(const int i) const
get the private member Catalogue::m_object[i]->m_ra
double var(const int index, const Var var_name) const
get the value of the i-th object variable
std::vector< std::vector< double > > compute_catalogueProperties_lightCone(cbl::cosmology::Cosmology cosmology, const std::vector< double > RA_range, const std::vector< double > DEC_range, const unsigned int nbin)
compute catalogue volume, number density and mean particle separation in light cones
double Max(const Var var_name) const
get the maximum value of a variable of the catalogue objects
void equalize_random_box(cbl::catalogue::Catalogue tracer_catalogue, const int seed)
equalize the number of objects in two Box catalogues
void equalize_random_lightCone(cbl::catalogue::Catalogue tracer_catalogue, cbl::cosmology::Cosmology cosm, const std::vector< double > RA_range, const std::vector< double > DEC_range, const int seed)
equalize the number of objects in two Light Cones catalogues
double Redshift(const double d_c=1., const double z1_guess=0., const double z2_guess=10., const double prec=0.0001) const
redshift at a given comoving distance
double D_C(const double redshift) const
the comoving line-of-sight distance at a given redshift
static const char fDP1[]
conversion symbol for: double -> std::string
static const std::string defaultString
default std::string value
static const double pi
: the ratio of a circle's circumference to its diameter
RandomType
the type of random catalogue
The global namespace of the CosmoBolognaLib
void distribution(std::vector< double > &xx, std::vector< double > &fx, std::vector< double > &err, const std::vector< double > FF, const std::vector< double > WW, const int nbin, const bool linear=true, const std::string file_out=par::defaultString, const double fact=1., const double V1=par::defaultDouble, const double V2=par::defaultDouble, const std::string bin_type="Linear", const bool conv=false, const double sigma=0.)
derive and store the number distribution of a given std::vector
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
std::vector< T > linear_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with linearly spaced values
void checkIO(const std::ifstream &fin, const std::string file="NULL")
check if an input file can be opened
void cartesian_coord(const double ra, const double dec, const double dd, double &XX, double &YY, double &ZZ)
conversion from polar coordinates to Cartesian coordinates
int ErrorCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL, const cbl::glob::ExitCode exitCode=cbl::glob::ExitCode::_error_)
throw an exception: it is used for handling exceptions inside the CosmoBolognaLib
T Max(const std::vector< T > vect)
maximum element of a std::vector
double radians(const double angle, const CoordinateUnits inputUnits=CoordinateUnits::_degrees_)
conversion to radians
double interpolated(const double _xx, const std::vector< double > xx, const std::vector< double > yy, const std::string type)
1D interpolation
void sdss2eq(const std::vector< double > lambda, const std::vector< double > eta, std::vector< double > &ra, std::vector< double > &dec)
convert sdss coordinates to R.A., Dec.
void sdss_stripe(const std::vector< double > eta, const std::vector< double > lambda, std::vector< int > &stripe, std::vector< int > &str_u)
compute the SDSS stripe given SDSS coordinates
std::vector< double > vector_from_distribution(const int nRan, const std::vector< double > xx, const std::vector< double > fx, const double xmin, const double xmax, const int seed)
return a std::vector of numbers sampled from a given distribution
double round_to_precision(const double num, const int ndigits)
reduce the precision of an input double
void eq2sdss(const std::vector< double > ra, const std::vector< double > dec, std::vector< double > &lambda, std::vector< double > &eta)
convert from equatorial coordinates R.A., Dec to sdss coordinates
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