SISCone  2.0.6
geom_2d.cpp
1 // File: geom_2d.cpp //
3 // Description: source file for two-dimensional geometry tools //
4 // This file is part of the SISCone project. //
5 // For more details, see http://projects.hepforge.org/siscone //
6 // //
7 // Copyright (c) 2006 Gavin Salam and Gregory Soyez //
8 // //
9 // This program is free software; you can redistribute it and/or modify //
10 // it under the terms of the GNU General Public License as published by //
11 // the Free Software Foundation; either version 2 of the License, or //
12 // (at your option) any later version. //
13 // //
14 // This program is distributed in the hope that it will be useful, //
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of //
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
17 // GNU General Public License for more details. //
18 // //
19 // You should have received a copy of the GNU General Public License //
20 // along with this program; if not, write to the Free Software //
21 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //
22 // //
23 // $Revision:: 171 $//
24 // $Date:: 2007-06-19 16:26:05 +0200 (Tue, 19 Jun 2007) $//
26 
27 #include "geom_2d.h"
28 #include <algorithm>
29 
30 namespace siscone{
31 
32 #define PHI_RANGE_MASK 0xFFFFFFFF
33 
34 /*********************************************************
35  * class Ceta_phi_range implementation *
36  * class for holding a covering range in eta-phi *
37  * *
38  * This class deals with ranges in the eta-phi plane. It *
39  * implements methods to test if two ranges overlap and *
40  * to take the union of two overlapping intervals. *
41  *********************************************************/
42 
43 using namespace std;
44 
45 // static member default init
46 //----------------------------
47 double Ceta_phi_range::eta_min = -100.0;
48 double Ceta_phi_range::eta_max = 100.0;
49 
50 // default ctor
51 //--------------
53  eta_range = 0;
54  phi_range = 0;
55 }
56 
57 // ctor with initialisation
58 // we initialise with a centre (in eta,phi) and a radius
59 // - c_eta eta coordinate of the centre
60 // - c_phi phi coordinate of the centre
61 // - R radius
62 //-------------------------------------------------------
63 Ceta_phi_range::Ceta_phi_range(double c_eta, double c_phi, double R){
64  // determination of the eta range
65  //-------------------------------
66  double xmin = max(c_eta-R,eta_min+0.0001);
67  double xmax = min(c_eta+R,eta_max-0.0001);
68 
69  unsigned int cell_min = get_eta_cell(xmin);
70  unsigned int cell_max = get_eta_cell(xmax);
71 
72  // warning: if cell_max==2^31, 2*cell_max==0 hence,
73  // even if the next formula is formally (2*cell_max-cell_min),
74  // expressing it as (cell_max-cell_min)+cell_max is safe.
75  eta_range = (cell_max-cell_min)+cell_max;
76 
77  // determination of the phi range
78  // !! taking care of periodicity !!
79  //---------------------------------
80  xmin = phi_in_range(c_phi-R);
81  xmax = phi_in_range(c_phi+R);
82 
83  cell_min = get_phi_cell(xmin);
84  cell_max = get_phi_cell(xmax);
85 
86  // Also, if the interval goes through pi, inversion is needed
87  if (xmax>xmin)
88  phi_range = (cell_max-cell_min)+cell_max;
89  else {
90  phi_range = (cell_min==cell_max)
91  ? PHI_RANGE_MASK
92  : ((PHI_RANGE_MASK^(cell_min-cell_max)) + cell_max);
93  }
94 }
95 
96 // assignment of range
97 // - r range to assign to current one
98 //---------------------------------------
100  eta_range = r.eta_range;
101  phi_range = r.phi_range;
102 
103  return *this;
104 }
105 
106 // add a particle to the range
107 // - eta eta coordinate of the particle
108 // - phi phi coordinate of the particle
109 // \return 0 on success, 1 on error
110 //----------------------------------------
111 int Ceta_phi_range::add_particle(const double eta, const double phi){
112  // deal with the eta coordinate
113  eta_range |= get_eta_cell(eta);
114 
115  // deal with the phi coordinate
116  phi_range |= get_phi_cell(phi);
117 
118  return 0;
119 }
120 
121 
122 // test overlap
123 // - r1 first range
124 // - r2 second range
125 // return true if overlap, false otherwise.
126 //------------------------------------------
127 bool is_range_overlap(const Ceta_phi_range &r1, const Ceta_phi_range &r2){
128  // check overlap in eta AND phi
129  return ((r1.eta_range & r2.eta_range) && (r1.phi_range & r2.phi_range));
130 }
131 
132 // compute union
133 // Note: we assume that the two intervals overlap
134 // - r1 first range
135 // - r2 second range
136 // \return union of the two ranges
137 //------------------------------------------
138 const Ceta_phi_range range_union (const Ceta_phi_range &r1, const Ceta_phi_range &r2){
139  Ceta_phi_range tmp;
140 
141  // compute union in eta
142  tmp.eta_range = r1.eta_range | r2.eta_range;
143 
144  // compute union in phi
145  tmp.phi_range = r1.phi_range | r2.phi_range;
146 
147  return tmp;
148 }
149 
150 }
unsigned int eta_range
eta range as a binary coding of covered cells
Definition: geom_2d.h:143
Ceta_phi_range()
default ctor
Definition: geom_2d.cpp:52
Ceta_phi_range & operator=(const Ceta_phi_range &r)
assignment of range
Definition: geom_2d.cpp:99
static double eta_max
maximal value for eta
Definition: geom_2d.h:150
Definition: area.cpp:33
class for holding a covering range in eta-phi
Definition: geom_2d.h:120
int add_particle(const double eta, const double phi)
add a particle to the range
Definition: geom_2d.cpp:111
unsigned int phi_range
phi range as a binary coding of covered cells
Definition: geom_2d.h:146
static double eta_min
minimal value for eta
Definition: geom_2d.h:149
The SISCone project has been developed by Gavin Salam and Gregory Soyez
Documentation generated on Sat Oct 24 2015 19:36:13 for SISCone by  Doxygen 1.8.9.1