ATLAS Offline Software
Loading...
Searching...
No Matches
MapEta.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "MapEta.h"
6
7// For reading the data files in Athena.
8#ifndef LARG4_STAND_ALONE
10#endif
11
12#include <iostream>
13#include <fstream>
14
15MapEta::MapEta(int isampling)
16 : m_directory ("/afs/cern.ch/atlas/offline/data/lar/calo_data"),
17 m_init (0),
18 m_nx (0),
19 m_ny (0),
20 m_resp (nullptr),
21 m_xt0 (nullptr),
22 m_xt1 (nullptr),
23 m_xt2 (nullptr)
24{
25 Initialize(isampling);
26}
27
29{
30 if (m_resp) delete [] m_resp;
31 if (m_xt0) delete [] m_xt0;
32 if (m_xt1) delete [] m_xt1;
33 if (m_xt2) delete [] m_xt2;
34}
35
36
37void MapEta::SetDirectory(const std::string& dir)
38{
39 m_directory=dir;
40}
41
42void MapEta::Initialize(int isampling)
43{
44 if (m_init==1) return;
45 if (isampling < 1 || isampling >3) return;
46 std::string filename{};
47 if (isampling==1) filename = "deta_strip.map";
48 if (isampling==2) filename = "deta_middle.map";
49 if (isampling==3) filename = "eta_trans.map";
50 std::string fileLocation;
51#ifdef LARG4_STAND_ALONE
52 // The stand-alone program expects to find the file via AFS.
53 fileLocation = m_directory + "/" + filename;
54#else
55 // In Athena, the PathResolver tool will find the file for us.
56 std::cout << "filename " << filename << std::endl;
57 //std::string larLocation = PathResolver::find_directory("lar","DATAPATH");
58 //fileLocation=larLocation+"/calo_data/"+filename;
59 std::string larLocation = PathResolver::find_directory("LArG4Barrel","ATLASCALDATA");
60 fileLocation=larLocation+"/"+filename;
61 std::cout << "fileLocation " << fileLocation << std::endl;
62#endif
63
64 std::ifstream in(fileLocation);
65 if (in)
66 {
68 if(m_nx>0 && m_ny>0 && m_nx<10000 && m_ny<10000){//coverity issue. This is a tainted variable protection, 10000 can be changed if required.
69 m_deltax=(m_xmax-m_xmin)/((float) m_nx);
70 m_deltay=(m_ymax-m_ymin)/((float) m_ny);
71 // what is written as xmax in the map is x of last point + delta x
72 // (such that npoint = (xmax-xmin)/deltax
73 // to get the real last point in the map we should subtract deltax
76 m_resp = new float[m_ny*m_nx];
77 m_xt0 = new float[m_ny*m_nx];
78 m_xt1 = new float[m_ny*m_nx];
79 m_xt2 = new float[m_ny*m_nx];
80 int ii,jj;
81 for (int ix=0;ix<m_nx;ix++) {
82 for (int iy=0;iy<m_ny;iy++) {
83 in>>ii>>jj>>m_resp[ix+iy*m_nx]>>m_xt0[ix+iy*m_nx]>>m_xt1[ix+iy*m_nx]>>m_xt2[ix+iy*m_nx];
84 if (ii != ix || jj != iy) std::cout << "MapEta: inconsistency when reading map..." << std::endl;
85 }
86 }
87
88 std::cout << "Eta Map read " << " Nbins " << m_nx << " " << m_ny
89 << " bin size*1000 " << 1000*m_deltax << " " << 1000*m_deltay
90 << " X range " << m_xmin << " " << m_xmax
91 << " Y range " << m_ymin << " " << m_ymax << std::endl;
92 m_init=1;
93 }
94 else{
95 std::cout << "Error in MapEta::Initialize: nx or ny out of limits." << std::endl;
96 return;
97 }
98 }
99 else{
100 std::cout << "Error in MapEta::Initialize: The file could not be open." << std::endl;
101 return;
102 }
103}
104
105void MapEta::GetData(double x,double y,double* resp, double* xt0, double* xt1, double* xt2) const
106{
107 *resp=1;
108 *xt0=1;
109 *xt1=0;
110 *xt2=0;
111 if (m_nx==0 || m_ny ==0) return;
112 if (x<m_xmin ) x=m_xmin+0.01*m_deltax;
113 if (x>=m_xmax) x=m_xmax-0.01*m_deltax;
114 if (y<m_ymin ) y=m_ymin+0.01*m_deltay;
115 if (y>=m_ymax) y=m_ymax-0.01*m_deltay;
116
117 int ix,iy;
118 ix = (int) ((x-m_xmin)/m_deltax);
119 iy = (int) ((y-m_ymin)/m_deltay);
120 float x0 = ((float) ix)*m_deltax+m_xmin;
121 float x1 = x0+m_deltax;
122 float y0 = ((float) iy)*m_deltay+m_ymin;
123 float y1 = y0+m_deltay;
124
125
126 if (ix<0 || ix+1 >= m_nx || iy<0 || iy+1 >= m_ny) {
127 std::cout << "MapEta: Out of range " << ix << " " << iy << std::endl;
128 return;
129 }
130 double w[4];
131 w[0]=(x1-x)*(y1-y);
132 w[1]=(x-x0)*(y1-y);
133 w[2]=(x1-x)*(y-y0);
134 w[3]=(x-x0)*(y-y0);
135
136 double sumw=0.;
137 *resp=0;
138 *xt0=0;
139 for (int i=0;i<2;i++) {
140 for (int j=0;j<2;j++) {
141 int n=ix+i+(iy+j)*m_nx;
142 int m=i+2*j;
143 sumw +=w[m];
144 *resp += m_resp[n]*w[m];
145 *xt0 += m_xt0[n]*w[m];
146 *xt1 += m_xt1[n]*w[m];
147 *xt2 += m_xt2[n]*w[m];
148 }
149 }
150 const double inv_sumw = 1. / sumw;
151 if (sumw>0.) {
152 *resp = *resp*inv_sumw;
153 *xt0 = *xt0*inv_sumw;
154 *xt1 = *xt1*inv_sumw;
155 *xt2 = *xt2*inv_sumw;
156 }
157
158}
159void MapEta::GetData0(double x,double y,double* resp) const
160{
161 *resp=1;
162 if (m_nx==0 || m_ny ==0) return;
163 if (x<m_xmin ) x=m_xmin+0.01*m_deltax;
164 if (x>=m_xmax) x=m_xmax-0.01*m_deltax;
165 if (y<m_ymin ) y=m_ymin+0.01*m_deltay;
166 if (y>=m_ymax) y=m_ymax-0.01*m_deltay;
167
168 int ix,iy;
169 ix = (int) ((x-m_xmin)/m_deltax);
170 iy = (int) ((y-m_ymin)/m_deltay);
171 float x0 = ((float) ix)*m_deltax+m_xmin;
172 float x1 = x0+m_deltax;
173 float y0 = ((float) iy)*m_deltay+m_ymin;
174 float y1 = y0+m_deltay;
175
176 if (ix<0 || ix+1 >= m_nx || iy<0 || iy+1 >= m_ny) {
177 std::cout << "MapEta: Out of range " << ix << " " << iy << std::endl;
178 return;
179 }
180 double w[4];
181 w[0]=(x1-x)*(y1-y);
182 w[1]=(x-x0)*(y1-y);
183 w[2]=(x1-x)*(y-y0);
184 w[3]=(x-x0)*(y-y0);
185
186 double sumw=0.;
187 *resp = 0;
188 for (int i=0;i<2;i++) {
189 for (int j=0;j<2;j++) {
190 int n=ix+i+(iy+j)*m_nx;
191 int m=i+2*j;
192 sumw +=w[m];
193 *resp += m_resp[n]*w[m];
194 }
195 }
196 if (sumw>0.) *resp = *resp/sumw;
197 else *resp = 1;
198
199}
#define y
#define x
void GetData0(double x, double y, double *resp) const
Definition MapEta.cxx:159
float m_xmin
Definition MapEta.h:17
float m_deltax
Definition MapEta.h:18
float m_deltay
Definition MapEta.h:18
float * m_xt2
Definition MapEta.h:22
int m_nx
Definition MapEta.h:16
float m_ymin
Definition MapEta.h:17
void SetDirectory(const std::string &dir)
Definition MapEta.cxx:37
void Initialize(int isampling)
Definition MapEta.cxx:42
float m_ymax
Definition MapEta.h:17
int m_ny
Definition MapEta.h:16
float m_xmax
Definition MapEta.h:17
void GetData(double x, double y, double *resp, double *xt0, double *xt1, double *xt2) const
Definition MapEta.cxx:105
MapEta(int isampling)
Definition MapEta.cxx:15
std::string m_directory
Definition MapEta.h:14
float * m_xt0
Definition MapEta.h:20
int m_init
Definition MapEta.h:15
~MapEta()
Definition MapEta.cxx:28
float * m_resp
Definition MapEta.h:19
float * m_xt1
Definition MapEta.h:21
static std::string find_directory(const std::string &logical_file_name, const std::string &search_path)