40 using namespace catalogue;
41 using namespace pairs;
49 const double dist = (m_angularUnits==CoordinateUnits::_radians_) ?
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz())
50 :
converted_angle(
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz()), CoordinateUnits::_radians_, m_angularUnits);
52 if (m_thetaMin < dist && dist < m_thetaMax) {
54 const int kk = max(0, min(
int((dist-m_thetaMin)*m_binSize_inv), m_nbins));
56 const double WeightTOT = obj1->weight()*obj2->weight();
59 m_PP1D_weighted[kk] += WeightTOT;
61 if (m_PP1D_weighted[kk]>0) {
63 const double scale_mean_p = m_scale_mean[kk];
64 m_scale_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
65 m_scale_S[kk] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
67 const double pair_redshift = (obj1->redshift()>0 && obj2->redshift()>0) ? (obj1->redshift()+obj2->redshift())*0.5 : -1.;
68 const double z_mean_p = m_z_mean[kk];
69 m_z_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(pair_redshift-z_mean_p);
70 m_z_S[kk] += WeightTOT*(pair_redshift-z_mean_p)*(pair_redshift-m_z_mean[kk]);
83 const double dist = (m_angularUnits==CoordinateUnits::_radians_) ?
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz())
84 :
converted_angle(
angular_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz()), CoordinateUnits::_radians_, m_angularUnits);
86 if (m_thetaMin < dist && dist < m_thetaMax) {
88 const int kk = max(0, min(
int((log10(dist)-log10(m_thetaMin))*m_binSize_inv), m_nbins));
90 const double WeightTOT = obj1->weight()*obj2->weight();
93 m_PP1D_weighted[kk] += WeightTOT;
95 if (m_PP1D_weighted[kk]>0) {
97 const double scale_mean_p = m_scale_mean[kk];
98 m_scale_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
99 m_scale_S[kk] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
101 const double pair_redshift = (obj1->redshift()>0 && obj2->redshift()>0) ? (obj1->redshift()+obj2->redshift())*0.5 : -1.;
102 const double z_mean_p = m_z_mean[kk];
103 m_z_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(pair_redshift-z_mean_p);
104 m_z_S[kk] += WeightTOT*(pair_redshift-z_mean_p)*(pair_redshift-m_z_mean[kk]);
117 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
119 if (m_rMin < dist && dist < m_rMax) {
121 const int kk = max(0, min(
int((dist-m_rMin)*m_binSize_inv), m_nbins));
123 const double angWeight = (m_angularWeight==
nullptr) ? 1.
124 : 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)));
126 const double WeightTOT = obj1->weight()*obj2->weight()*angWeight;
129 m_PP1D_weighted[kk] += WeightTOT;
131 if (m_PP1D_weighted[kk]>0) {
133 const double scale_mean_p = m_scale_mean[kk];
134 m_scale_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
135 m_scale_S[kk] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
137 const double pair_redshift = (obj1->redshift()>0 && obj2->redshift()>0) ? (obj1->redshift()+obj2->redshift())*0.5 : -1.;
138 const double z_mean_p = m_z_mean[kk];
139 m_z_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(pair_redshift-z_mean_p);
140 m_z_S[kk] += WeightTOT*(pair_redshift-z_mean_p)*(pair_redshift-m_z_mean[kk]);
153 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
155 if (m_rMin < dist && dist < m_rMax) {
157 const int kk = max(0, min(
int((log10(dist)-log10(m_rMin))*m_binSize_inv), m_nbins));
159 const double angWeight = (m_angularWeight==
nullptr) ? 1.
160 : 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)));
162 const double WeightTOT = obj1->weight()*obj2->weight()*angWeight;
165 m_PP1D_weighted[kk] += WeightTOT;
167 if (m_PP1D_weighted[kk]>0) {
169 const double scale_mean_p = m_scale_mean[kk];
170 m_scale_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
171 m_scale_S[kk] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
173 const double pair_redshift = (obj1->redshift()>0 && obj2->redshift()>0) ? (obj1->redshift()+obj2->redshift())*0.5 : -1.;
174 const double z_mean_p = m_z_mean[kk];
175 m_z_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(pair_redshift-z_mean_p);
176 m_z_S[kk] += WeightTOT*(pair_redshift-z_mean_p)*(pair_redshift-m_z_mean[kk]);
189 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
191 if (m_rMin < dist && dist < m_rMax) {
193 const int kk = max(0, min(
int((dist-m_rMin)*m_binSize_inv), m_nbins));
195 const double angWeight = (m_angularWeight==
nullptr) ? 1.
196 : 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)));
198 const double WeightTOT = obj1->weight()*obj2->weight()*angWeight;
199 const double cosmu2 = pow((obj2->dc()-obj1->dc())/dist, 2);
202 m_PP1D_weighted[kk] += WeightTOT;
204 double leg_pol_2 = 0.5*(3.*cosmu2-1.);
205 m_PP1D[(m_nbins+1)+kk] += 5.*leg_pol_2 ;
206 m_PP1D_weighted[(m_nbins+1)+kk] += 5.*WeightTOT*leg_pol_2;
208 double leg_pol_4 = 0.125*(35.*cosmu2*cosmu2-30.*cosmu2+3.);
209 m_PP1D[2.*(m_nbins+1)+kk] += 9.*leg_pol_4;
210 m_PP1D_weighted[2.*(m_nbins+1)+kk] += 9.*WeightTOT*leg_pol_4;
212 if (m_PP1D_weighted[kk]>0) {
214 const double scale_mean_p = m_scale_mean[kk];
215 m_scale_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
216 m_scale_S[kk] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
218 const double pair_redshift = (obj1->redshift()>0 && obj2->redshift()>0) ? (obj1->redshift()+obj2->redshift())*0.5 : -1.;
219 const double z_mean_p = m_z_mean[kk];
220 m_z_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(pair_redshift-z_mean_p);
221 m_z_S[kk] += WeightTOT*(pair_redshift-z_mean_p)*(pair_redshift-m_z_mean[kk]);
223 m_scale_mean[kk+(m_nbins+1)] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
224 m_scale_S[kk+(m_nbins+1)] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
226 m_scale_mean[kk+2*(m_nbins+1)] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
227 m_scale_S[kk+2*(m_nbins+1)] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
238 const double dist =
Euclidean_distance(obj1->xx(), obj2->xx(), obj1->yy(), obj2->yy(), obj1->zz(), obj2->zz());
240 if (m_rMin < dist && dist < m_rMax) {
242 const int kk = max(0, min(
int((log10(dist)-log10(m_rMin))*m_binSize_inv), m_nbins));
244 const double angWeight = (m_angularWeight==
nullptr) ? 1.
245 : 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)));
247 const double WeightTOT = obj1->weight()*obj2->weight()*angWeight;
248 const double cosmu2 = pow((obj2->dc()-obj1->dc())/dist, 2);
251 m_PP1D_weighted[kk] += WeightTOT;
253 double leg_pol_2 = 0.5*(3.*cosmu2-1.);
254 m_PP1D[(m_nbins+1)+kk] += 5.*leg_pol_2 ;
255 m_PP1D_weighted[(m_nbins+1)+kk] += 5.*WeightTOT*leg_pol_2;
257 double leg_pol_4 = 0.125*(35.*cosmu2*cosmu2-30.*cosmu2+3.);
258 m_PP1D[2.*(m_nbins+1)+kk] += 9.*leg_pol_4;
259 m_PP1D_weighted[2.*(m_nbins+1)+kk] += 9.*WeightTOT*leg_pol_4;
261 if (m_PP1D_weighted[kk]>0) {
263 const double scale_mean_p = m_scale_mean[kk];
264 m_scale_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
265 m_scale_S[kk] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
267 const double pair_redshift = (obj1->redshift()>0 && obj2->redshift()>0) ? (obj1->redshift()+obj2->redshift())*0.5 : -1.;
268 const double z_mean_p = m_z_mean[kk];
269 m_z_mean[kk] += WeightTOT/m_PP1D_weighted[kk]*(pair_redshift-z_mean_p);
270 m_z_S[kk] += WeightTOT*(pair_redshift-z_mean_p)*(pair_redshift-m_z_mean[kk]);
272 m_scale_mean[kk+(m_nbins+1)] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
273 m_scale_S[kk+(m_nbins+1)] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
275 m_scale_mean[kk+2*(m_nbins+1)] += WeightTOT/m_PP1D_weighted[kk]*(dist-scale_mean_p);
276 m_scale_S[kk+2*(m_nbins+1)] += WeightTOT*(dist-scale_mean_p)*(dist-m_scale_mean[kk]);
299 const double scale_mean_temp_p = m_scale_mean[i];
302 const double z_mean_temp_p = m_z_mean[i];
305 m_PP1D[i] += data[0];
308 m_PP1D_weighted[i] += data[1];
311 if (m_PP1D_weighted[i]>0) {
314 m_scale_mean[i] += data[1]/m_PP1D_weighted[i]*(data[2]-scale_mean_temp_p);
317 m_z_mean[i] += data[1]/m_PP1D_weighted[i]*(data[4]-z_mean_temp_p);
320 m_scale_S[i] += data[3]+pow(data[2]-scale_mean_temp_p, 2)*data[1]*(m_PP1D_weighted[i]-data[1])/m_PP1D_weighted[i];
321 m_scale_sigma[i] = sqrt(m_scale_S[i]/m_PP1D_weighted[i]);
324 m_z_S[i] += data[5]+pow(data[4]-z_mean_temp_p, 2)*data[1]*(m_PP1D_weighted[i]-data[1])/m_PP1D_weighted[i];
325 m_z_sigma[i] = sqrt(m_z_S[i]/m_PP1D_weighted[i]);
337 add_data1D(i, {ww*pair->PP1D(i), ww*pair->PP1D_weighted(i), pair->scale_mean(i), pair->scale_S(i), pair->z_mean(i), pair->z_S(i)});
346 if (m_nbins != pair->nbins())
347 ErrorCBL(
"dimension problems!",
"Sum",
"Pair1D_extra.cpp");
349 for (
int i=0; i<m_nbins; ++i)
350 add_data1D(i, pair, ww);
359 if (m_nbins != pair->nbins())
360 ErrorCBL(
"dimension problems!",
"Sum",
"Pair1D_extra.cpp");
362 for (
int l=0; l<3; ++l)
363 for (
int i=0; i<m_nbins; ++i)
364 add_data1D(l*(m_nbins+1)+i, pair, ww);
373 if (m_nbins != pair->nbins())
374 ErrorCBL(
"dimension problems!",
"Sum",
"Pair1D_extra.cpp");
376 for (
int l=0; l<3; ++l)
377 for (
int i=0; i<m_nbins; ++i)
378 add_data1D(l*(m_nbins+1)+i, pair, ww);
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