FairRoot/PandaRoot
PndDiscSensorGrid.cxx
Go to the documentation of this file.
1 //-------------------------------------------------------------------------
2 // Author: Oliver Merle (Oliver.Merle@exp2.physik.uni-giessen.de)
3 // Changes: Mustafa Schmidt (Mustafa.A.Schmidt@physik.uni-giessen.de)
4 // Date: 30.11.2015
5 // Description: Definition of sensor grid
6 //-------------------------------------------------------------------------
7 
8 
9 #include "PndDiscSensorGrid.h"
10 
11 #include <math.h>
12 #include <iostream>
13 
14 #define OMERLE_SENSORGRID_DEBUG
15 
16 namespace SensorGrid {
17 
19 void SensorGridBase::LockGrid(bool lock) {
20  if(lock == true) {
21  // Enumerate this and all child grids:
22  int grid_id = 1;
23  int pixel_offset = number_of_pixels;
24  EnumerateGrids(grid_id, pixel_offset);
25  LockChilds(true);
26 
27  // and set lock flag
28  locked = true;
29  }
30  else
31  locked = false;
32 }
33 
34 
36 
40 bool SensorGridBase::NextPixel(double & x, double & y, PixelInfo & pixel_info) const {
41  // simple method that will work with all derived classes.
42  // !!! maybe slow !!! -> derived classes should implement caching of last subgrid.
43  if(pixel_info.pixel_number < 0) pixel_info.pixel_number = 0; // start enum
44  else ++pixel_info.pixel_number; // run enum
45  return PixelToPosition(pixel_info, x, y);
46 }
47 
48 
49 // -------------------------------------------------------------------------------------------------------
50 // BasicGrid
51 // -------------------------------------------------------------------------------------------------------
52 
54 
55 
56 BasicGrid::BasicGrid(const double & x_min_, const double & x_width_, const double & x_pitch_, int n_x_,
57  const double & y_min_, const double & y_width_, const double & y_pitch_, int n_y_)
58  : SensorGridBase(), x_min(x_min_), x_width(x_width_), x_pitch(x_pitch_),
59  y_min(y_min_), y_width(y_width_), y_pitch(y_pitch_), n_x(n_x_), n_y(n_y_)
60 {
64  x_max = x_min + double(n_x)*x_pitch;
65  y_max = y_min + double(n_y)*y_pitch;
67 }
68 
69 
71 
72 
73 void BasicGrid::EnumerateGrids(int & id, int & pixel_offset) {
74 #ifdef OMERLE_SENSORGRID_DEBUG
75  std::cout << "BasicGrid::EnumerateGrids\n";
76 #endif
77  // Set grid id and pixel number offset
78  grid_number = id++;
79  pixel_number_offset = pixel_offset;
80  pixel_offset += number_of_pixels;
81 }
82 
83 
84 void BasicGrid::SetXDivision(const double & x_min_, const double & x_width_, const double & x_pitch_, int n_x_) {
85  if(locked) return; // todo: throw error
86  x_min = x_min_; x_width = x_width_; x_pitch = x_pitch_; n_x = n_x_;
88  x_max = x_min + double(n_x)*x_pitch;
90 }
91 
92 
93 void BasicGrid::SetYDivision(const double & y_min_, const double & y_width_, const double & y_pitch_, int n_y_) {
94  if(locked) return; // todo: throw error
95  y_min = y_min_; y_width = y_width_; y_pitch = y_pitch_; n_y = n_y_;
97  y_max = y_min + double(n_y)*y_pitch;
99 }
100 
101 
103 bool BasicGrid::PositionToPixel(const double & x, const double & y, PixelInfo & pixel_info) const {
104  if(x<x_min || x>x_max || y<y_min || y>y_max) return false;
105 
106  double x_coord_fp = (x-x_min)/x_pitch;
107  double x_coord = floor(x_coord_fp);
108  if(x_width_over_two_pitch < fabs(0.5-(x_coord_fp-x_coord))) return false;
109 
110  double y_coord_fp = (y-y_min)/y_pitch;
111  double y_coord = floor(y_coord_fp);
112  if(y_width_over_two_pitch < fabs(0.5-(y_coord_fp-y_coord))) return false;
113 
114  pixel_info.column_on_grid = (int)x_coord;
115  pixel_info.row_on_grid = (int)y_coord;
116  pixel_info.pixel_number = pixel_info.column_on_grid + pixel_info.row_on_grid*n_x + pixel_number_offset;
117 
118  pixel_info.column_on_grid += user_col_offset;
119  pixel_info.row_on_grid += user_row_offset;
120 
121  pixel_info.grid_id = grid_number;
122  return true;
123 }
124 
125 
127 bool BasicGrid::PixelToPosition(PixelInfo & pixel_info, double & x, double & y) const {
128  //std::cout << pixel_number_offset << "\t" << number_of_pixels << std::endl;
129  int local_pixel_num = pixel_info.pixel_number-pixel_number_offset;
130  if(pixel_info.pixel_number < pixel_number_offset || local_pixel_num >= number_of_pixels) return false;
131 
132  pixel_info.column_on_grid = local_pixel_num % n_x;
133  pixel_info.row_on_grid = local_pixel_num / n_x;
134  pixel_info.grid_id = grid_number;
135 
136  x = x_min + (0.5 + (double)(pixel_info.column_on_grid)) * x_pitch;
137  y = y_min + (0.5 + (double)(pixel_info.row_on_grid)) * y_pitch;
138 
139  pixel_info.column_on_grid += user_col_offset;
140  pixel_info.row_on_grid += user_row_offset;
141  return true;
142 }
143 
144 
145 // -------------------------------------------------------------------------------------------------------
146 // MultipleGrids
147 // -------------------------------------------------------------------------------------------------------
148 
149 
151 { }
152 
153 
155  std::vector<SensorGridBase*>::const_iterator it;
156  for(it = grids.begin(); it != grids.end(); ++it) delete *it;
157 }
158 
159 
161  grids.push_back(grid);
162 }
163 
164 
165 void MultipleGrids::EnumerateGrids(int & id, int & pixel_offset) {
166 #ifdef OMERLE_SENSORGRID_DEBUG
167  std::cout << "MultipleGrids::EnumerateGrids\n";
168 #endif
169  grid_number = id++;
170  pixel_number_offset = pixel_offset;
171  std::vector<SensorGridBase*>::const_iterator it;
172  for(it = grids.begin(); it != grids.end(); ++it) {
173  EnumerateGridsProxy(*it, id, pixel_offset);
174 #ifdef OMERLE_SENSORGRID_DEBUG
175  std::cout << "After Enum cycle" << id << "\t" << pixel_offset << std::endl;
176 #endif
177  }
178  number_of_pixels = pixel_offset;
179 }
180 
181 
182 bool MultipleGrids::PositionToPixel(const double & x, const double & y, PixelInfo & pixel_info) const {
183  std::vector<SensorGridBase*>::const_iterator it;
184  for(it = grids.begin(); it != grids.end(); ++it) {
185  if((*it)->PositionToPixel(x, y, pixel_info)) return true;
186  }
187  return false;
188 }
189 
190 
191 void MultipleGrids::LockChilds(bool lock) {
192  std::vector<SensorGridBase*>::const_iterator it;
193  for(it = grids.begin(); it != grids.end(); ++it) LockChildsProxy(*it, lock);
194 }
195 
196 
197 bool MultipleGrids::PixelToPosition(PixelInfo & pixel_info, double & x, double & y) const {
198  std::vector<SensorGridBase*>::const_iterator it;
199  for(it = grids.begin(); it != grids.end(); ++it) {
200  if((*it)->PixelToPosition(pixel_info, x, y)) return true;
201  }
202  return false;
203 }
204 
205 
206 }
bool locked
The total number of pixels in this grid (or its childs)
int user_row_offset
The pixel number of the first pixel in this grid (or its childs)
virtual void EnumerateGrids(int &id, int &pixel_offset)
Common base class for sensor grids.
virtual bool PixelToPosition(PixelInfo &pixel_number, double &x, double &y) const
int number_of_pixels
user prowided offset to add to column on grid value in PixelInfo
virtual void EnumerateGrids(int &id, int &pixel_offset)
void EnumerateGridsProxy(SensorGridBase *b, int &grid_id, int &pixel_number)
void LockGrid(bool lock)
Lock the grid:
virtual bool PositionToPixel(const double &x, const double &y, PixelInfo &pixel_info) const
virtual bool PositionToPixel(const double &x, const double &y, PixelInfo &pixel_info) const
Convert a hit position to a pixel number.
virtual bool PixelToPosition(PixelInfo &pixel_info, double &x, double &y) const
Compute the center-position of a pixel on this grid and update the pixel_info structure.
void SetXDivision(const double &x_min, const double &x_width, const double &x_pitch, int n_x)
virtual void LockChilds(bool)
friend F32vec4 fabs(const F32vec4 &a)
Definition: P4_F32vec4.h:47
virtual bool PixelToPosition(PixelInfo &pixel_info, double &x, double &y) const =0
Double_t x
virtual bool NextPixel(double &x, double &y, PixelInfo &pixel_number) const
Return information of the next pixel (pixel iteration)
virtual void LockChilds(bool lock)
int user_col_offset
user prowided offset to add to row on grid value in PixelInfo
virtual void EnumerateGrids(int &id, int &pixel_offset)=0
Double_t y
void AddGrid(SensorGridBase *grid)
std::vector< SensorGridBase * > grids
void LockChildsProxy(SensorGridBase *b, bool lock)
void SetYDivision(const double &y_min, const double &y_width, const double &y_pitch, int n_y)