45 bool ve_less(Cvicinity_elm *ve1, Cvicinity_elm *ve2){
46 return ve1->angle < ve2->angle;
64 #ifdef USE_QUADTREE_FOR_STABILITY_TEST
77 #ifdef USE_QUADTREE_FOR_STABILITY_TEST
83 set_particle_list(_particle_list);
92 #ifdef USE_QUADTREE_FOR_STABILITY_TEST
105 #ifdef USE_QUADTREE_FOR_STABILITY_TEST
114 #ifdef USE_QUADTREE_FOR_STABILITY_TEST
125 for (i=0;i<(int) _particle_list.size();i++){
128 if (fabs(_particle_list[i].pz)!=_particle_list[i].E){
129 plist.push_back(_particle_list[i]);
136 plist[n_part].index = n_part;
139 plist[n_part].ref.randomize();
141 #ifdef USE_QUADTREE_FOR_STABILITY_TEST
142 if (fabs(plist[n_part].eta)>eta_max) eta_max=fabs(plist[n_part].eta);
152 #ifdef USE_QUADTREE_FOR_STABILITY_TEST
154 quadtree =
new Cquadtree(0.0, 0.0, eta_max, M_PI);
159 for (i=0;i<n_part;i++){
160 #ifdef USE_QUADTREE_FOR_STABILITY_TEST
161 quadtree->add(&plist[i]);
163 ve_list[j].v = ve_list[j+1].v = &plist[i];
164 ve_list[j].is_inside = ve_list[j+1].is_inside = &(pincluded[i]);
196 for (i=0;i<n_part;i++){
197 append_to_vicinity(&plist[i]);
201 sort(vicinity.begin(), vicinity.end(), ve_less);
203 vicinity_size = vicinity.size();
208 inline double sort_angle(
double s,
double c){
209 if (s==0)
return (c>0) ? 0.0 : 2.0;
211 return (s>0) ? 1-t/(1+fabs(t)) : 3-t/(1+fabs(t));
248 tmp = sqrt(VR2/d2-1);
253 ve_list[i].angle = sort_angle(s,c);
254 ve_list[i].eta = pcx+c;
255 ve_list[i].phi = phi_in_range(pcy+s);
256 ve_list[i].side =
true;
257 ve_list[i].cocircular.clear();
258 vicinity.push_back(&(ve_list[i]));
263 ve_list[i+1].angle = sort_angle(s,c);
264 ve_list[i+1].eta = pcx+c;
265 ve_list[i+1].phi = phi_in_range(pcy+s);
266 ve_list[i+1].side =
false;
267 ve_list[i+1].cocircular.clear();
268 vicinity.push_back(&(ve_list[i+1]));
274 Ctwovect OP(pcx - ve_list[i+1].eta, phi_in_range(pcy-ve_list[i+1].phi));
276 phi_in_range(v->
phi-ve_list[i+1].phi));
285 c = dot_product(OP,OC);
286 s = fabs(cross_product(OP,OC));
287 double inv_err1 = s * inv_R_EPS_COCIRC;
288 double inv_err2_sq = (R2-c) * inv_R_2EPS_COCIRC;
289 ve_list[i].cocircular_range = pow2(inv_err1) > inv_err2_sq ?
291 sqrt(1.0/inv_err2_sq);
292 ve_list[i+1].cocircular_range = ve_list[i].cocircular_range;
base class for dynamic coordinates management
int index
internal particle number
double eta
particle pseudo-rapidity
double phi
particle azimuthal angle
Implementation of a 2D quadtree.
class for holding a two-vector
element in the vicinity of a parent.
a class to keep track of inclusion status in cone and in cocircular region while using minimal resour...
void append_to_vicinity(Cmomentum *v)
append a particle to the 'vicinity' list after having tested it and computed the angular-ordering qua...
void build(Cmomentum *_parent, double _VR)
build the vicinity list from the list of points.
Cvicinity()
default constructor
~Cvicinity()
default destructor
void set_particle_list(std::vector< Cmomentum > &_particle_list)
set the particle_list
#define EPSILON_COCIRCULAR
The following parameter controls cocircular situations.
const double twopi
definition of 2*M_PI which is useful a bit everyhere!