39 using namespace catalogue;
40 using namespace pairs;
48 for (
int i=0; i<m_nbins; i++) {
50 m_PP1D_weighted[i] = 0;
60 const double binSize = ((m_thetaMax-m_thetaMin)/m_nbins);
61 m_binSize_inv = 1./binSize;
63 m_scale.resize(m_nbins);
64 for (
int i=0; i<m_nbins; i++)
65 m_scale[i] = binSize*(i+m_shift)+m_thetaMin;
74 m_nbins =
nint((m_thetaMax-m_thetaMin)*m_binSize_inv);
75 m_thetaMax = m_nbins/m_binSize_inv+m_thetaMin;
77 m_scale.resize(m_nbins);
78 for (
int i=0; i<m_nbins; i++)
79 m_scale[i] = (i+m_shift)/m_binSize_inv+m_thetaMin;
88 if (m_thetaMin<1.e-30)
ErrorCBL(
"m_thetaMin must be >0!",
"m_set_parameters_nbins",
"Pair1D.cpp");
90 const double binSize = ((log10(m_thetaMax)-log10(m_thetaMin))/m_nbins);
91 m_binSize_inv = 1./binSize;
93 m_scale.resize(m_nbins);
94 for (
int i=0; i<m_nbins; i++)
95 m_scale[i] = pow(10.,(i+m_shift)*binSize+log10(m_thetaMin));
104 if (m_thetaMin<1.e-30)
ErrorCBL(
"m_thetaMin must be >0!",
"m_set_parameters_binSize",
"Pair1D.cpp");
106 m_nbins =
nint((log10(m_thetaMax)-log10(m_thetaMin))*m_binSize_inv);
107 m_thetaMax = pow(10.,m_nbins/m_binSize_inv+log10(m_thetaMin));
109 m_scale.resize(m_nbins);
110 for (
int i=0; i<m_nbins; i++)
111 m_scale[i] = pow(10.,(i+m_shift)/m_binSize_inv+log10(m_thetaMin));
120 const double binSize = ((m_rMax-m_rMin)/m_nbins);
121 m_binSize_inv = 1./binSize;
123 m_scale.resize(m_nbins);
124 for (
int i=0; i<m_nbins; i++)
125 m_scale[i] = (i+m_shift)*binSize+m_rMin;
134 m_nbins =
nint((m_rMax-m_rMin)*m_binSize_inv);
135 m_rMax = m_nbins/m_binSize_inv+m_rMin;
137 m_scale.resize(m_nbins);
138 for (
int i=0; i<m_nbins; i++)
139 m_scale[i] = (i+m_shift)/m_binSize_inv+m_rMin;
148 if (m_rMin<1.e-30)
ErrorCBL(
"m_rMin must be >0!",
"m_set_parameters_nbins",
"Pair1D.cpp");
150 const double binSize = ((log10(m_rMax)-log10(m_rMin))/m_nbins);
151 m_binSize_inv = 1./binSize;
153 m_scale.resize(m_nbins);
154 for (
int i=0; i<m_nbins; i++)
155 m_scale[i] = pow(10.,(i+m_shift)*binSize+log10(m_rMin));
164 if (m_rMin<1.e-30)
ErrorCBL(
"m_rMin must be >0!",
"m_set_parameters_binSize",
"Pair1D.cpp");
166 m_nbins =
nint((log10(m_rMax)-log10(m_rMin))*m_binSize_inv);
167 m_rMax = pow(10.,m_nbins/m_binSize_inv+log10(m_rMin));
169 m_scale.resize(m_nbins);
170 for (
int i=0; i<m_nbins; i++)
171 m_scale[i] = pow(10.,(i+m_shift)/m_binSize_inv+log10(m_rMin));
180 const double binSize = ((m_rMax-m_rMin)/m_nbins);
181 m_binSize_inv = 1./binSize;
183 m_scale.resize(3*m_nbins);
184 for (
int l=0; l<3; l++)
185 for (
int i=0; i<m_nbins; i++)
186 m_scale[l*m_nbins+i] = (i+m_shift)*binSize+m_rMin;
195 m_nbins =
nint((m_rMax-m_rMin)*m_binSize_inv);
196 m_rMax = m_nbins/m_binSize_inv+m_rMin;
198 m_scale.resize(3*m_nbins);
199 for (
int l=0; l<3; l++)
200 for (
int i=0; i<m_nbins; i++)
201 m_scale[l*m_nbins+i] = (i+m_shift)/m_binSize_inv+m_rMin;
210 if (m_rMin<1.e-30)
ErrorCBL(
"m_rMin must be >0!",
"m_set_parameters_nbins",
"Pair1D.cpp");
212 const double binSize = ((log10(m_rMax)-log10(m_rMin))/m_nbins);
213 m_binSize_inv = 1./binSize;
215 m_scale.resize(3*m_nbins);
216 for (
int l=0; l<3; l++)
217 for (
int i=0; i<m_nbins; i++)
218 m_scale[l*m_nbins+i] = pow(10.,(i+m_shift)*binSize+log10(m_rMin));
227 if (m_rMin<1.e-30)
ErrorCBL(
"m_rMin must be >0!",
"m_set_parameters_binSize",
"Pair1D.cpp");
229 m_nbins =
nint((log10(m_rMax)-log10(m_rMin))*m_binSize_inv);
230 m_rMax = pow(10.,m_nbins/m_binSize_inv+log10(m_rMin));
232 m_scale.resize(3*m_nbins);
233 for (
int l=0; l<3; l++)
234 for (
int i=0; i<m_nbins; i++)
235 m_scale[l*m_nbins+i] = pow(10.,(i+m_shift)/m_binSize_inv+log10(m_rMin));
247 const double dist = (m_angularUnits==CoordinateUnits::_radians_) ?
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz())
248 :
converted_angle(
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz()), CoordinateUnits::_radians_, m_angularUnits);
250 if (m_thetaMin < dist && dist < m_thetaMax) {
251 kk = max(0, min(
int((dist-m_thetaMin)*m_binSize_inv), m_nbins));
253 wkk += obj1->weight()*obj2->weight();
266 const double dist = (m_angularUnits==CoordinateUnits::_radians_) ?
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz())
267 :
converted_angle(
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz()), CoordinateUnits::_radians_, m_angularUnits);
269 if (m_thetaMin < dist && dist < m_thetaMax) {
270 kk = max(0, min(
int((log10(dist)-log10(m_thetaMin))*m_binSize_inv), m_nbins));
272 wkk = obj1->weight()*obj2->weight();
285 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
287 if (m_rMin < dist && dist < m_rMax) {
288 kk = max(0, min(
int((dist-m_rMin)*m_binSize_inv), m_nbins));
290 const double angWeight = (m_angularWeight==
nullptr) ? 1.
291 : max(0., m_angularWeight(
converted_angle(
angular_distance(obj1->xx()/obj1->dc(), obj2->xx()/obj2->dc(), obj1->yy()/obj1->dc(), obj2->yy()/obj2->dc(), obj1->zz()/obj1->dc(), obj2->zz()/obj2->dc()), CoordinateUnits::_radians_, m_angularUnits)));
293 wkk = obj1->weight()*obj2->weight()*angWeight;
306 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
308 if (m_rMin < dist && dist < m_rMax) {
309 kk = max(0, min(
int((log10(dist)-log10(m_rMin))*m_binSize_inv), m_nbins));
311 const double angWeight = (m_angularWeight==
nullptr) ? 1.
312 : max(0., m_angularWeight(
converted_angle(
angular_distance(obj1->xx()/obj1->dc(), obj2->xx()/obj2->dc(), obj1->yy()/obj1->dc(), obj2->yy()/obj2->dc(), obj1->zz()/obj1->dc(), obj2->zz()/obj2->dc()), CoordinateUnits::_radians_, m_angularUnits)));
314 wkk = obj1->weight()*obj2->weight()*angWeight;
327 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
329 if (m_rMin < dist && dist < m_rMax) {
330 kk = max(0, min(
int((dist-m_rMin)*m_binSize_inv), m_nbins));
332 const double angWeight = (m_angularWeight==
nullptr) ? 1.
333 : max(0., m_angularWeight(
converted_angle(
angular_distance(obj1->xx()/obj1->dc(), obj2->xx()/obj2->dc(), obj1->yy()/obj1->dc(), obj2->yy()/obj2->dc(), obj1->zz()/obj1->dc(), obj2->zz()/obj2->dc()), CoordinateUnits::_radians_, m_angularUnits)));
335 wkk = obj1->weight()*obj2->weight()*angWeight;
337 cosmu = (obj2->dc()-obj1->dc())/dist;
350 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
352 if (m_rMin < dist && dist < m_rMax) {
353 kk = max(0, min(
int((log10(dist)-log10(m_rMin))*m_binSize_inv), m_nbins));
355 const double angWeight = (m_angularWeight==
nullptr) ? 1.
356 : max(0., m_angularWeight(
converted_angle(
angular_distance(obj1->xx()/obj1->dc(), obj2->xx()/obj2->dc(), obj1->yy()/obj1->dc(), obj2->yy()/obj2->dc(), obj1->zz()/obj1->dc(), obj2->zz()/obj2->dc()), CoordinateUnits::_radians_, m_angularUnits)));
358 wkk = obj1->weight()*obj2->weight()*angWeight;
360 cosmu = (obj2->dc()-obj1->dc())/dist;
370 m_PP1D[kk] += weight;
371 m_PP1D_weighted[kk] += wkk*weight;
382 m_PP1D[kk] += weight;
383 m_PP1D_weighted[kk] += wkk*weight;
394 m_PP1D[kk] += weight;
395 m_PP1D_weighted[kk] += wkk*weight;
406 m_PP1D[kk] += weight;
407 m_PP1D_weighted[kk] += wkk*weight;
418 double cosmu2 = cosmu*cosmu;
419 m_PP1D[kk] += weight;
420 m_PP1D_weighted[kk] += wkk*weight;
422 double leg_pol_2 = 0.5*(3.*cosmu2-1);
423 m_PP1D[(m_nbins+1)+kk] += 5.*leg_pol_2*weight ;
424 m_PP1D_weighted[(m_nbins+1)+kk] += 5.*wkk*leg_pol_2*weight;
426 double leg_pol_4 = 0.125*(35.*cosmu2*cosmu2-30.*cosmu2+3.);
427 m_PP1D[2.*(m_nbins+1)+kk] += 9.*leg_pol_4*weight;
428 m_PP1D_weighted[2.*(m_nbins+1)+kk] += 9.*wkk*leg_pol_4*weight;
439 double cosmu2 = cosmu*cosmu;
440 m_PP1D[kk] += weight;
441 m_PP1D_weighted[kk] += wkk*weight;
443 double leg_pol_2 = 0.5*(3.*cosmu2-1);
444 m_PP1D[(m_nbins+1)+kk] += 5.*leg_pol_2*weight ;
445 m_PP1D_weighted[(m_nbins+1)+kk] += 5.*wkk*leg_pol_2*weight;
447 double leg_pol_4 = 0.125*(35.*cosmu2*cosmu2-30.*cosmu2+3.);
448 m_PP1D[2.*(m_nbins+1)+kk] += 9.*leg_pol_4*weight;
449 m_PP1D_weighted[2.*(m_nbins+1)+kk] += 9.*wkk*leg_pol_4*weight;
458 const double dist = (m_angularUnits==CoordinateUnits::_radians_) ?
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz())
459 :
converted_angle(
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz()), CoordinateUnits::_radians_, m_angularUnits);
461 if (m_thetaMin < dist && dist < m_thetaMax) {
463 const int kk = max(0, min(
int((dist-m_thetaMin)*m_binSize_inv), m_nbins));
466 m_PP1D_weighted[kk] += obj1->weight()*obj2->weight();
477 const double dist = (m_angularUnits==CoordinateUnits::_radians_) ?
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz())
478 :
converted_angle(
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz()), CoordinateUnits::_radians_, m_angularUnits);
480 if (m_thetaMin < dist && dist < m_thetaMax) {
482 const int kk = max(0, min(
int((log10(dist)-log10(m_thetaMin))*m_binSize_inv), m_nbins));
485 m_PP1D_weighted[kk] += obj1->weight()*obj2->weight();
496 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
498 if (m_rMin < dist && dist < m_rMax) {
500 const int kk = max(0, min(
int((dist-m_rMin)*m_binSize_inv), m_nbins));
502 const double angWeight = (m_angularWeight==
nullptr) ? 1.
503 : max(0., m_angularWeight(
converted_angle(
angular_distance(obj1->xx()/obj1->dc(), obj2->xx()/obj2->dc(), obj1->yy()/obj1->dc(), obj2->yy()/obj2->dc(), obj1->zz()/obj1->dc(), obj2->zz()/obj2->dc()), CoordinateUnits::_radians_, m_angularUnits)));
506 m_PP1D_weighted[kk] += obj1->weight()*obj2->weight()*angWeight;
517 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
519 if (m_rMin < dist && dist < m_rMax) {
521 const int kk = max(0, min(
int((log10(dist)-log10(m_rMin))*m_binSize_inv), m_nbins));
523 const double angWeight = (m_angularWeight==
nullptr) ? 1.
524 : max(0., m_angularWeight(
converted_angle(
angular_distance(obj1->xx()/obj1->dc(), obj2->xx()/obj2->dc(), obj1->yy()/obj1->dc(), obj2->yy()/obj2->dc(), obj1->zz()/obj1->dc(), obj2->zz()/obj2->dc()), CoordinateUnits::_radians_, m_angularUnits)));
527 m_PP1D_weighted[kk] += obj1->weight()*obj2->weight()*angWeight;
538 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
540 if (m_rMin < dist && dist < m_rMax) {
542 const int kk = max(0, min(
int((dist-m_rMin)*m_binSize_inv), m_nbins));
544 const double angWeight = (m_angularWeight==
nullptr) ? 1.
545 : max(0., m_angularWeight(
converted_angle(
angular_distance(obj1->xx()/obj1->dc(), obj2->xx()/obj2->dc(), obj1->yy()/obj1->dc(), obj2->yy()/obj2->dc(), obj1->zz()/obj1->dc(), obj2->zz()/obj2->dc()), CoordinateUnits::_radians_, m_angularUnits)));
547 const double ww = obj1->weight()*obj2->weight()*angWeight;
548 double cosmu2 = pow((obj2->dc()-obj1->dc())/dist, 2);
551 m_PP1D_weighted[kk] += ww;
553 double leg_pol_2 = 0.5*(3.*cosmu2-1.);
554 m_PP1D[(m_nbins+1)+kk] += 5.*leg_pol_2 ;
555 m_PP1D_weighted[(m_nbins+1)+kk] += 5.*ww*leg_pol_2;
557 double leg_pol_4 = 0.125*(35.*cosmu2*cosmu2-30.*cosmu2+3.);
558 m_PP1D[2.*(m_nbins+1)+kk] += 9.*leg_pol_4;
559 m_PP1D_weighted[2.*(m_nbins+1)+kk] += 9.*ww*leg_pol_4;
571 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
573 if (m_rMin < dist && dist < m_rMax) {
575 const int kk = max(0, min(
int((log10(dist)-log10(m_rMin))*m_binSize_inv), m_nbins));
577 const double angWeight = (m_angularWeight==
nullptr) ? 1.
578 : max(0., m_angularWeight(
converted_angle(
angular_distance(obj1->xx()/obj1->dc(), obj2->xx()/obj2->dc(), obj1->yy()/obj1->dc(), obj2->yy()/obj2->dc(), obj1->zz()/obj1->dc(), obj2->zz()/obj2->dc()), CoordinateUnits::_radians_, m_angularUnits)));
580 const double ww = obj1->weight()*obj2->weight()*angWeight;
581 double cosmu2 = pow((obj2->dc()-obj1->dc())/dist, 2);
584 m_PP1D_weighted[kk] += ww;
586 double leg_pol_2 = 0.5*(3.*cosmu2-1);
587 m_PP1D[(m_nbins+1)+kk] += 5.*leg_pol_2 ;
588 m_PP1D_weighted[(m_nbins+1)+kk] += 5.*ww*leg_pol_2;
590 double leg_pol_4 = 0.125*(35.*cosmu2*cosmu2-30.*cosmu2+3.);
591 m_PP1D[2.*(m_nbins+1)+kk] += 9.*leg_pol_4;
592 m_PP1D_weighted[2.*(m_nbins+1)+kk] += 9.*ww*leg_pol_4;
603 m_PP1D[i] += data[0];
604 m_PP1D_weighted[i] += data[1];
613 add_data1D(i, {ww*pair->PP1D(i), ww*pair->PP1D_weighted(i)});
622 if (m_nbins != pair->nbins())
623 ErrorCBL(
"dimension problems!",
"Sum",
"Pair1D.cpp");
625 for (
int i=0; i<m_nbins; ++i)
626 add_data1D(i, pair, ww);
635 if (m_nbins != pair->nbins())
636 ErrorCBL(
"dimension problems!",
"Sum",
"Pair1D.cpp");
638 for (
int l=0; l<3; ++l)
639 for (
int i=0; i<m_nbins; ++i)
640 add_data1D(l*(m_nbins+1)+i, pair, ww);
649 if (m_nbins != pair->nbins())
650 ErrorCBL(
"dimension problems!",
"Sum",
"Pair1D.cpp");
652 for (
int l=0; l<3; ++l)
653 for (
int i=0; i<m_nbins; ++i)
654 add_data1D(l*(m_nbins+1)+i, pair, ww);
void m_set_parameters_nbins() override
set the binning parameters given the number of bins
void put(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2) override
estimate the distance between two objects and update the pair vector accordingly
void set(const int kk, const double wkk, const double weight=1) override
set the pair vector
void m_set_parameters_binSize() override
set the binning parameters given the bin size
void get(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2, int &kk, double &wkk) override
get the pair index and weight
void set(const int kk, const double wkk, const double weight=1) override
set the pair vector
void put(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2) override
estimate the distance between two objects and update the pair vector accordingly
void get(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2, int &kk, double &wkk) override
get the pair index and weight
void m_set_parameters_nbins() override
set the binning parameters given the number of bins
void m_set_parameters_binSize() override
set the binning parameters given the bin size
void set(const int kk, const double wkk, const double weight=1) override
set the pair vector
void get(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2, int &kk, double &wkk) override
get the pair index and weight
void m_set_parameters_nbins() override
set the binning parameters given the number of bins
void put(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2) override
estimate the distance between two objects and update the pair vector accordingly
void m_set_parameters_binSize() override
set the binning parameters given the bin size
void get(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2, int &kk, double &wkk) override
get the pair index and weight
void m_set_parameters_nbins() override
set the binning parameters given the number of bins
void set(const int kk, const double wkk, const double weight=1) override
set the pair vector
void m_set_parameters_binSize() override
set the binning parameters given the bin size
void put(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2) override
estimate the distance between two objects and update the pair vector accordingly
void m_set_parameters_nbins() override
set the binning parameters given the number of bins
void set(const double cosmu, const int kk, const double wkk, const double weight=1) override
set the pair vector
void put(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2) override
estimate the distance between two objects and update the pair vector accordingly
void get(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2, int &kk, double &cosmu, double &wkk) override
get the pair index and weight
virtual void Sum(const std::shared_ptr< Pair > pair, const double ww=1) override
sum the number of binned pairs
void m_set_parameters_binSize() override
set the binning parameters given the bin size
void put(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2) override
estimate the distance between two objects and update the pair vector accordingly
void m_set_parameters_binSize() override
set the binning parameters given the bin size
virtual void Sum(const std::shared_ptr< Pair > pair, const double ww=1) override
sum the number of binned pairs
void set(const double cosmu, const int kk, const double wkk, const double weight=1) override
set the pair vector
void get(const std::shared_ptr< catalogue::Object > obj1, const std::shared_ptr< catalogue::Object > obj2, int &kk, double &cosmu, double &wkk) override
get the pair index and weight
void m_set_parameters_nbins() override
set the binning parameters given the number of bins
virtual void Sum(const std::shared_ptr< Pair > pair, const double ww=1) override
sum the number of binned pairs
void add_data1D(const int i, const std::vector< double > data) override
set the protected member by adding new data
void reset() override
reset the pair counts
The global namespace of the CosmoBolognaLib
double Euclidean_distance(const double x1, const double x2, const double y1, const double y2, const double z1, const double z2)
the Euclidean distance in 3D relative to the origin (0,0,0), i.e. the Euclidean norm
double converted_angle(const double angle, const CoordinateUnits inputUnits=CoordinateUnits::_radians_, const CoordinateUnits outputUnits=CoordinateUnits::_degrees_)
conversion to angle units
double angular_distance(const double x1, const double x2, const double y1, const double y2, const double z1, const double z2)
the angular separation in 3D
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
int nint(const T val)
the nearest integer