CMS 3D CMS Logo

RPixChargeShare.cc
Go to the documentation of this file.
3 #include <iostream>
4 #include <fstream>
5 
7  : det_id_(det_id) {
8  verbosity_ = params.getParameter<int>("RPixVerbosity");
9  signalCoupling_.clear();
10  ChargeMapFile2E_[0] = params.getParameter<std::string>("ChargeMapFile2E");
11  ChargeMapFile2E_[1] = params.getParameter<std::string>("ChargeMapFile2E_2X");
12  ChargeMapFile2E_[2] = params.getParameter<std::string>("ChargeMapFile2E_2Y");
13  ChargeMapFile2E_[3] = params.getParameter<std::string>("ChargeMapFile2E_2X2Y");
14 
15  double coupling_constant_ = params.getParameter<double>("RPixCoupling");
16 
17  signalCoupling_.push_back(coupling_constant_);
18  signalCoupling_.push_back((1.0 - coupling_constant_) / 2);
19 
20  no_of_pixels_ = ppt.getNoPixels();
21 
22  double xMap, yMap;
23  double chargeprobcollect;
24  int xUpper[] = {75, 150, 75, 150};
25  int yUpper[] = {50, 50, 100, 100};
26  int ix, iy;
27  for (int i = 0; i < 4; i++) {
29  std::ifstream fChargeMap(filename.fullPath().c_str());
30  if (fChargeMap.is_open()) {
31  while (fChargeMap >> xMap >> yMap >> chargeprobcollect) {
32  ix = int((xMap + xUpper[i]) / 5);
33  iy = int((yMap + yUpper[i]) / 5);
34  chargeMap2E_[i][ix][iy] = chargeprobcollect;
35  }
36  fChargeMap.close();
37  } else
38  throw cms::Exception("PPS RPixChargeShare") << "Charge map file not found";
39  }
40 }
41 
42 std::map<unsigned short, double> RPixChargeShare::Share(const std::vector<RPixSignalPoint> &charge_map,
43  const PPSPixelTopology &ppt) {
44  std::map<unsigned short, double> thePixelChargeMap;
45  if (verbosity_ > 1)
46  edm::LogInfo("PPS") << "RPixChargeShare " << det_id_ << " : Clouds to be induced= " << charge_map.size();
47 
48  double cH = 0;
49 
50  for (std::vector<RPixSignalPoint>::const_iterator i = charge_map.begin(); i != charge_map.end(); ++i) {
51  double hit_pos_x, hit_pos_y;
52  // Used to avoid the abort due to hits out of detector
53  if (((*i).Position().x() + ppt.getSimXWidth() / 2.) < 0 ||
54  ((*i).Position().x() + ppt.getSimXWidth() / 2.) > ppt.getSimXWidth()) {
55  edm::LogInfo("PPS RPixChargeShare")
56  << "**** Attention ((*i).Position().x()+simX_width_/2.)<0||((*i).Position().x()+simX_width_/2.)>simX_width ";
57  edm::LogInfo("PPS RPixChargeShare") << "(*i).Position().x() = " << (*i).Position().x();
58  continue;
59  }
60  if (((*i).Position().y() + ppt.getSimYWidth() / 2.) < 0 ||
61  ((*i).Position().y() + ppt.getSimYWidth() / 2.) > ppt.getSimYWidth()) {
62  edm::LogInfo("PPS RPixChargeShare")
63  << "**** Attention ((*i).Position().y()+simY_width_/2.)<0||((*i).Position().y()+simY_width_/2.)>simY_width ";
64  edm::LogInfo("PPS RPixChargeShare") << "(*i).Position().y() = " << (*i).Position().y();
65  continue;
66  }
67 
68  PPSPixelTopology::PixelInfo relevant_pixels =
69  ppt.getPixelsInvolved((*i).Position().x(), (*i).Position().y(), (*i).Sigma(), hit_pos_x, hit_pos_y);
70  double effic = relevant_pixels.effFactor();
71  if (effic < 1.e-4)
72  continue;
73 
74  unsigned short pixel_no = ppt.pixelIndex(relevant_pixels);
75 
76  double charge_in_pixel = (*i).Charge() * effic;
77 
78  cH += charge_in_pixel;
79 
80  if (verbosity_ > 1)
81  edm::LogInfo("PPS RPixChargeShare ") << "Efficiency in detector " << det_id_ << " and pixel no " << pixel_no
82  << " : " << effic << " ch: " << charge_in_pixel << " CHtot: " << cH;
83 
84  if (signalCoupling_[0] == 0.) {
85  thePixelChargeMap[pixel_no] += charge_in_pixel;
86  } else {
87  int pixel_row = relevant_pixels.pixelRowNo();
88  int pixel_col = relevant_pixels.pixelColNo();
89  double pixel_lower_x = 0;
90  double pixel_lower_y = 0;
91  double pixel_upper_x = 0;
92  double pixel_upper_y = 0;
93  int psize = 0;
94  ppt.pixelRange(pixel_row, pixel_col, pixel_lower_x, pixel_upper_x, pixel_lower_y, pixel_upper_y);
95  double pixel_width_x = pixel_upper_x - pixel_lower_x;
96  double pixel_width_y = pixel_upper_y - pixel_lower_y;
97  double pixel_center_x = pixel_lower_x + (pixel_width_x) / 2.;
98  double pixel_center_y = pixel_lower_y + (pixel_width_y) / 2.;
99 
100  /*
101  First/last rows/columns are bigger due to sensor edges. 0.2mm is added to the pixel pitch but
102  only 0.15mm is considered sensitive.
103 The pixel size is standard (100x150) but the actual one is +200 and the sensitive +150.
104  Row 0: 100x150 -> 250x150 sensitive (lower x 50, higher x 300) but charge share only in 100x150 and
105  x center in lower_x + active_edge + pitch_x/2.
106  Row 159: 100x150 -> 250x150 sensitive (lower x 16300, higher x 16550) but charge share only in 100x150 and
107  x center in lower_x + pitch_x/2.
108 */
109  if (pixel_row == 0) {
110  pixel_width_x = ppt.getPitchSimX();
111  pixel_center_x = pixel_lower_x + ppt.getPhysActiveEdgeDist() + ppt.getPitchSimX() / 2.;
112  if (fabs((*i).Position().x() - pixel_center_x) > ppt.getPitchSimX() / 2.) {
113  thePixelChargeMap[pixel_no] += charge_in_pixel;
114  continue;
115  }
116  if (pixel_col == 0) {
117  pixel_width_y = ppt.getPitchSimY();
118  pixel_center_y = pixel_lower_y + ppt.getPhysActiveEdgeDist() + ppt.getPitchSimY() / 2.;
119  if (fabs((*i).Position().y() - pixel_center_y) > ppt.getPitchSimY() / 2.) {
120  thePixelChargeMap[pixel_no] += charge_in_pixel;
121  continue;
122  }
123  }
124  if (pixel_col == ppt.getNoPixelsSimY() - 1) {
125  pixel_width_y = ppt.getPitchSimY();
126  pixel_center_y = pixel_lower_y + ppt.getPitchSimY() / 2.;
127  if (fabs((*i).Position().y() - pixel_center_y) > ppt.getPitchSimY() / 2.) {
128  thePixelChargeMap[pixel_no] += charge_in_pixel;
129  continue;
130  }
131  }
132  }
133  if (pixel_row == ppt.getNoPixelsSimX() - 1) {
134  pixel_width_x = ppt.getPitchSimX();
135  pixel_center_x = pixel_lower_x + ppt.getPitchSimX() / 2.;
136  if (fabs((*i).Position().x() - pixel_center_x) > ppt.getPitchSimX() / 2.) {
137  thePixelChargeMap[pixel_no] += charge_in_pixel;
138  continue;
139  }
140  if (pixel_col == 0) {
141  pixel_width_y = ppt.getPitchSimY();
142  pixel_center_y = pixel_lower_y + ppt.getPhysActiveEdgeDist() + ppt.getPitchSimY() / 2.;
143  if (fabs((*i).Position().y() - pixel_center_y) > ppt.getPitchSimY() / 2.) {
144  thePixelChargeMap[pixel_no] += charge_in_pixel;
145  continue;
146  }
147  }
148  if (pixel_col == ppt.getNoPixelsSimY() - 1) {
149  pixel_width_y = ppt.getPitchSimY();
150  pixel_center_y = pixel_lower_y + ppt.getPitchSimY() / 2.;
151  if (fabs((*i).Position().y() - pixel_center_y) > ppt.getPitchSimY() / 2.) {
152  thePixelChargeMap[pixel_no] += charge_in_pixel;
153  continue;
154  }
155  }
156  }
157  if (pixel_col == 0) {
158  pixel_width_y = ppt.getPitchSimY();
159  pixel_center_y = pixel_lower_y + ppt.getPhysActiveEdgeDist() + ppt.getPitchSimY() / 2.;
160  if (fabs((*i).Position().y() - pixel_center_y) > ppt.getPitchSimY() / 2.) {
161  thePixelChargeMap[pixel_no] += charge_in_pixel;
162  continue;
163  }
164  }
165  if (pixel_col == ppt.getNoPixelsSimY() - 1) {
166  pixel_width_y = ppt.getPitchSimY();
167  pixel_center_y = pixel_lower_y + ppt.getPitchSimY() / 2.;
168  if (fabs((*i).Position().y() - pixel_center_y) > ppt.getPitchSimY() / 2.) {
169  thePixelChargeMap[pixel_no] += charge_in_pixel;
170  continue;
171  }
172  }
173 
174  // xbin and ybin are coordinates (um) inside the pixel as in the test beam, swapped wrt plane coordinates.
175  int xbin = int((((*i).Position().y() - pixel_center_y) + pixel_width_y / 2.) * 1.e3 / 5.);
176  int ybin = int((((*i).Position().x() - pixel_center_x) + pixel_width_x / 2.) * 1.e3 / 5.);
177  if (pixel_width_x < 0.11 && pixel_width_y < 0.151) { // pixel 100x150 um^2
178  psize = 0;
179  if (xbin > xBinMax_[psize] || ybin > yBinMax_[psize]) {
180  edm::LogError("PPS RPixChargeShare") << " Array index out of bounds 0";
181  continue;
182  }
183  }
184  if (pixel_width_x > 0.11 && pixel_width_y < 0.151) { // pixel 200x150 um^2
185  psize = 2;
186  if (xbin > xBinMax_[psize] || ybin > yBinMax_[psize]) {
187  edm::LogError("PPS RPixChargeShare") << " Array index out of bounds 2";
188  continue;
189  }
190  }
191  if (pixel_width_x < 0.11 && pixel_width_y > 0.151) { // pixel 100x300 um^2
192  psize = 1;
193  if (xbin > xBinMax_[psize] || ybin > yBinMax_[psize]) {
194  edm::LogError("PPS RPixChargeShare") << " Array index out of bounds 1";
195  continue;
196  }
197  }
198  if (pixel_width_x > 0.11 && pixel_width_y > 0.151) { // pixel 200x300 um^2
199  psize = 3;
200  if (xbin > xBinMax_[psize] || ybin > yBinMax_[psize]) {
201  edm::LogError("PPS RPixChargeShare") << " Array index out of bounds 3";
202  continue;
203  }
204  }
205  if (xbin < 0 || ybin < 0) {
206  edm::LogError("PPS RPixChargeShare") << " Negative array index xbin or ybin";
207  continue;
208  }
209  double hit2neighbour[8];
210  double collect_prob = chargeMap2E_[psize][xbin][ybin];
211  thePixelChargeMap[pixel_no] += charge_in_pixel * collect_prob;
212  unsigned short neighbour_no[8];
213  unsigned short m = 0;
214  double closer_neighbour = 0;
215  unsigned short closer_no = 0;
216  // Considering the 8 neighbours to share charge
217  for (int k = pixel_row - 1; k <= pixel_row + 1; k++) {
218  for (int l = pixel_col - 1; l <= pixel_col + 1; l++) {
219  if ((k < 0) || k > pxlRowSize_ - 1 || l < 0 || l > pxlColSize_ - 1)
220  continue;
221  if ((k == pixel_row) && (l == pixel_col))
222  continue;
223  double neighbour_pixel_lower_x = 0;
224  double neighbour_pixel_lower_y = 0;
225  double neighbour_pixel_upper_x = 0;
226  double neighbour_pixel_upper_y = 0;
227  double neighbour_pixel_center_x = 0;
228  double neighbour_pixel_center_y = 0;
229  // Check the hit approach to the neighbours
230  ppt.pixelRange(
231  k, l, neighbour_pixel_lower_x, neighbour_pixel_upper_x, neighbour_pixel_lower_y, neighbour_pixel_upper_y);
232  neighbour_pixel_center_x = neighbour_pixel_lower_x + (neighbour_pixel_upper_x - neighbour_pixel_lower_x) / 2.;
233  neighbour_pixel_center_y = neighbour_pixel_lower_y + (neighbour_pixel_upper_y - neighbour_pixel_lower_y) / 2.;
234  hit2neighbour[m] = sqrt(pow((*i).Position().x() - neighbour_pixel_center_x, 2.) +
235  pow((*i).Position().y() - neighbour_pixel_center_y, -2.));
236  neighbour_no[m] = l * pxlRowSize_ + k;
237  if (hit2neighbour[m] > closer_neighbour) {
238  closer_neighbour = hit2neighbour[m];
239  closer_no = neighbour_no[m];
240  }
241  m++;
242  }
243  }
244  double chargetransfereff = (1 - collect_prob) * signalCoupling_[0];
245  thePixelChargeMap[closer_no] += charge_in_pixel * chargetransfereff;
246  }
247  }
248 
249  return thePixelChargeMap;
250 }
PPSPixelTopology::pixelIndex
unsigned short pixelIndex(PixelInfo pI) const
Definition: PPSPixelTopology.cc:25
PPSPixelTopology::getNoPixels
unsigned short getNoPixels() const
Definition: PPSPixelTopology.cc:233
PPSPixelTopology::getSimXWidth
double getSimXWidth() const
Definition: PPSPixelTopology.cc:234
PPSPixelTopology::PixelInfo
Definition: PPSPixelTopology.h:29
mps_fire.i
i
Definition: mps_fire.py:428
PPSPixelTopology::getNoPixelsSimY
unsigned short getNoPixelsSimY() const
Definition: PPSPixelTopology.cc:232
PPSPixelTopology::PixelInfo::pixelColNo
unsigned short pixelColNo() const
Definition: PPSPixelTopology.h:55
CalibrationSummaryClient_cfi.params
params
Definition: CalibrationSummaryClient_cfi.py:14
RPixChargeShare::ChargeMapFile2E_
std::string ChargeMapFile2E_[4]
Definition: RPixChargeShare.h:24
PPSPixelTopology::getSimYWidth
double getSimYWidth() const
Definition: PPSPixelTopology.cc:235
RPixChargeShare::Share
std::map< unsigned short, double > Share(const std::vector< RPixSignalPoint > &charge_map, const PPSPixelTopology &ppt)
Definition: RPixChargeShare.cc:42
edm::LogInfo
Log< level::Info, false > LogInfo
Definition: MessageLogger.h:125
RPixChargeShare.h
PPSPixelTopology::getNoPixelsSimX
unsigned short getNoPixelsSimX() const
Definition: PPSPixelTopology.cc:231
PPSPixelTopology::pixelRange
void pixelRange(unsigned int arow, unsigned int acol, double &lower_x, double &higher_x, double &lower_y, double &higher_y) const
Definition: PPSPixelTopology.cc:71
RPixChargeShare::det_id_
uint32_t det_id_
Definition: RPixChargeShare.h:15
edm::FileInPath
Definition: FileInPath.h:61
visualization-live-secondInstance_cfg.m
m
Definition: visualization-live-secondInstance_cfg.py:79
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
PPSPixelTopology::getPixelsInvolved
PixelInfo getPixelsInvolved(double x, double y, double sigma, double &hit_pos_x, double &hit_pos_y) const
Definition: PPSPixelTopology.cc:46
corrVsCorr.filename
filename
Definition: corrVsCorr.py:123
RPixChargeShare::pxlRowSize_
const int pxlRowSize_
Definition: RPixChargeShare.h:18
RPixChargeShare::RPixChargeShare
RPixChargeShare(const edm::ParameterSet &params, uint32_t det_id, const PPSPixelTopology &ppt)
Definition: RPixChargeShare.cc:6
dqmdumpme.k
k
Definition: dqmdumpme.py:60
FileInPath.h
edm::ParameterSet
Definition: ParameterSet.h:47
PPSPixelTopology::getPitchSimY
double getPitchSimY() const
Definition: PPSPixelTopology.cc:228
RPixChargeShare::pxlColSize_
const int pxlColSize_
Definition: RPixChargeShare.h:19
PPSPixelTopology::getPhysActiveEdgeDist
double getPhysActiveEdgeDist() const
Definition: PPSPixelTopology.cc:238
createfilelist.int
int
Definition: createfilelist.py:10
RPixChargeShare::chargeMap2E_
double chargeMap2E_[4][60][40]
Definition: RPixChargeShare.h:25
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
PPSPixelTopology
Definition: PPSPixelTopology.h:22
PPSPixelTopology::PixelInfo::pixelRowNo
unsigned short pixelRowNo() const
Definition: PPSPixelTopology.h:54
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
cmsLHEtoEOSManager.l
l
Definition: cmsLHEtoEOSManager.py:204
RPixChargeShare::signalCoupling_
std::vector< double > signalCoupling_
Definition: RPixChargeShare.h:16
PPSPixelTopology::getPitchSimX
double getPitchSimX() const
Definition: PPSPixelTopology.cc:229
RPixChargeShare::yBinMax_
const int yBinMax_[4]
Definition: RPixChargeShare.h:27
PPSPixelTopology::PixelInfo::effFactor
double effFactor() const
Definition: PPSPixelTopology.h:53
edmStreamStallGrapher.xUpper
xUpper
Definition: edmStreamStallGrapher.py:873
Exception
Definition: hltDiff.cc:245
RPixChargeShare::xBinMax_
const int xBinMax_[4]
Definition: RPixChargeShare.h:26
RPixChargeShare::verbosity_
int verbosity_
Definition: RPixChargeShare.h:22
funct::pow
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
RPixChargeShare::no_of_pixels_
int no_of_pixels_
Definition: RPixChargeShare.h:20
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37