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 82 set_particle_list(_particle_list);
91 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 104 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 113 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 124 for (i=0;i<(int) _particle_list.size();i++){
127 if (fabs(_particle_list[i].pz)!=_particle_list[i].E){
128 plist.push_back(_particle_list[i]);
135 plist[n_part].index = n_part;
138 plist[n_part].ref.randomize();
140 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 141 if (fabs(plist[n_part].eta)>eta_max) eta_max=fabs(plist[n_part].eta);
151 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 153 quadtree =
new Cquadtree(0.0, 0.0, eta_max, M_PI);
158 for (i=0;i<n_part;i++){
159 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 160 quadtree->add(&plist[i]);
162 ve_list[j].v = ve_list[j+1].v = &plist[i];
163 ve_list[j].is_inside = ve_list[j+1].is_inside = &(pincluded[i]);
195 for (i=0;i<n_part;i++){
196 append_to_vicinity(&plist[i]);
200 sort(vicinity.begin(), vicinity.end(), ve_less);
202 vicinity_size = vicinity.size();
207 inline double sort_angle(
double s,
double c){
208 if (s==0)
return (c>0) ? 0.0 : 2.0;
210 return (s>0) ? 1-t/(1+fabs(t)) : 3-t/(1+fabs(t));
247 tmp = sqrt(VR2/d2-1);
252 ve_list[i].angle = sort_angle(s,c);
253 ve_list[i].eta = pcx+c;
254 ve_list[i].phi = phi_in_range(pcy+s);
255 ve_list[i].side =
true;
256 ve_list[i].cocircular.clear();
257 vicinity.push_back(&(ve_list[i]));
262 ve_list[i+1].angle = sort_angle(s,c);
263 ve_list[i+1].eta = pcx+c;
264 ve_list[i+1].phi = phi_in_range(pcy+s);
265 ve_list[i+1].side =
false;
266 ve_list[i+1].cocircular.clear();
267 vicinity.push_back(&(ve_list[i+1]));
273 Ctwovect OP(pcx - ve_list[i+1].eta, phi_in_range(pcy-ve_list[i+1].phi));
275 phi_in_range(v->
phi-ve_list[i+1].phi));
284 c = dot_product(OP,OC);
285 s = fabs(cross_product(OP,OC));
286 double inv_err1 = s * inv_R_EPS_COCIRC;
287 double inv_err2_sq = (R2-c) * inv_R_2EPS_COCIRC;
288 ve_list[i].cocircular_range = pow2(inv_err1) > inv_err2_sq ?
290 sqrt(1.0/inv_err2_sq);
291 ve_list[i+1].cocircular_range = ve_list[i].cocircular_range;
Implementation of a 2D quadtree.
void build(Cmomentum *_parent, double _VR)
build the vicinity list from the list of points.
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...
base class for dynamic coordinates management
#define EPSILON_COCIRCULAR
The following parameter controls cocircular situations.
void set_particle_list(std::vector< Cmomentum > &_particle_list)
set the particle_list
const double twopi
definition of 2*M_PI which is useful a bit everyhere!
~Cvicinity()
default destructor
double phi
particle azimuthal angle
Cvicinity()
default constructor
int index
internal particle number
class for holding a two-vector
double eta
particle pseudo-rapidity
element in the vicinity of a parent.