47{
48
50
51 SG::WriteCondHandle<TRT_DetElementsRoadData_xk> writeHandle{
m_writeKey, ctx};
54 return StatusCode::SUCCESS;
55 }
56
57
58 EventIDRange rangeTrt;
59
60 SG::ReadCondHandle<InDetDD::TRT_DetElementContainer> trtDetEleHandle(
m_trtDetEleContKey, ctx);
61 if (not trtDetEleHandle.isValid()) {
63 return StatusCode::FAILURE;
64 }
65
66 const InDetDD::TRT_Numerology* trtNum = trtDetEleHandle->getTRTNumerology();
67 if (trtNum==nullptr){
69 }
70
72
73 if (not trtDetEleHandle.range(rangeTrt)) {
74 ATH_MSG_FATAL(
"Failed to retrieve validity range for " << trtDetEleHandle.key());
75 return StatusCode::FAILURE;
76 }
77
78
79 double P[33], Wf = 0.,Wz = 0.;
80 double mzmin [3] ;
81 double mzmax [3] ;
82 double mrmin [3] ;
83 double mrmax [3] ;
84
85
86
88
91
92 mrmin[
N] = 100000.; mrmax[
N] =-100000.;
93 mzmin[
N] = 100000.; mzmax[
N] =-100000.;
94
95 std::vector<const InDetDD::TRT_BaseElement*> pE;
96 pE.reserve(NPhi*2);
97
98 for(int ring = 0; ring!=Rings; ++ring) {
99
101
102 for(int nsl=0; nsl!=NSlayers; ++nsl) {
103
104 InDet::TRT_DetElementsLayer_xk
layer;
105 double rmin = 100000., rmax =-100000.;
106 double zmin = 100000.,
zmax =-100000.;
107 double dfm = 0.;
108
109 pE.clear();
110 for(
int f=0;
f!=NPhi; ++
f) {
111 pE.push_back(trtDetEleHandle->getBarrelDetElement(0,ring,f,nsl));
112 pE.push_back(trtDetEleHandle->getBarrelDetElement(1,ring,f,nsl));
113 }
114
115 std::sort(pE.begin(),pE.end(),InDet::compTRTDetElements_AZ());
116 for(auto & j : pE) {
117
118 if (j) {
119
122 Wf = sqrt(
P[20] *
P[20] +
P[21] *
P[21]);
123 Wz = sqrt(
P[22] *
P[22] +
P[23] *
P[23]);
126 if (
P[10] > mrmax[N])
128 if (
P[11] < mzmin[N])
130 if (
P[12] > mzmax[N])
132
141
142 double df1 = std::abs(
P[13] -
P[2]);
144 df1 = std::abs(df1 - pi2);
145 double df2 = std::abs(
P[14] -
P[2]);
147 df2 = std::abs(df2 - pi2);
148 if (df1 > dfm)
149 dfm = df1;
150 if (df2 > dfm)
151 dfm = df2;
152 layer.add(InDet::TRT_DetElementLink_xk(j,
P));
153 }
154 }
155 double r =(rmax+rmin)*.5;
156 double dr =(rmax-rmin)*.5;
159 layer.set(
r,dr,
z,dz,dfm,Wf,Wz);
160 (layerVectors.at(N)).push_back(std::move(layer));
161
162 }
163 }
164
165
166
169 if(Wheels ) {
170
171 for(N=0;
N<3;
N+=2) {
172
173 mrmin[
N] = 100000.; mrmax[
N] =-100000.;
174 mzmin[
N] = 100000.; mzmax[
N] =-100000.;
175
177 for(
int wh = 0;
wh!=Wheels; ++
wh) {
178
180 for(
int s = 0;
s!=
ns; ++
s) {
181
182 InDet::TRT_DetElementsLayer_xk
layer;
183 double rmin = 100000., rmax =-100000.;
184 double zmin = 100000.,
zmax =-100000.;
185 double dfm = 0.;
186 pE.clear();
187
188 for(
int f=0;
f!=NPhi; ++
f) {
189 pE.push_back(trtDetEleHandle->getEndcapDetElement(side,wh,s,f));
190 }
191 std::sort(pE.begin(),pE.end(),InDet::compTRTDetElements_A());
192
193 for(auto & j : pE) {
194
195 if(j) {
196
198 Wf = sqrt(
P[20]*
P[20]+
P[21]*
P[21]);
199 Wz = sqrt(
P[22]*
P[22]+
P[23]*
P[23]);
200
201 if(
P[ 9] < mrmin[N] ) mrmin[
N] =
P[ 9];
202 if(
P[10] > mrmax[N] ) mrmax[
N] =
P[10];
203 if(
P[11] < mzmin[N] ) mzmin[
N] =
P[11];
204 if(
P[12] > mzmax[N] ) mzmax[
N] =
P[12];
205
206 if(
P[ 9] < rmin ) rmin =
P[ 9];
207 if(
P[10] > rmax ) rmax =
P[10];
208 if(
P[11] < zmin )
zmin =
P[11];
209 if(
P[12] > zmax )
zmax =
P[12];
210
211 double df1 = std::abs(
P[13]-
P[2]);
if(df1>
pi) df1 = std::abs(df1-pi2);
212 double df2 = std::abs(
P[14]-
P[2]);
if(df2>
pi) df2 = std::abs(df2-pi2);
213 if(df1>dfm) dfm = df1;
214 if(df2>dfm) dfm = df2;
215
216 layer.add(InDet::TRT_DetElementLink_xk(j,
P));
217 }
218 }
219 double r =(rmax+rmin)*.5;
220 double dr =(rmax-rmin)*.5;
223 layer.set(
r,dr,
z,dz,dfm,Wf,Wz);
224 (layerVectors.at(N)).push_back(std::move(layer));
225 }
226 }
227 }
228 }
229
230 double zmi = +100000.;
231 double zma = -100000.;
232 double rma = -100000.;
233 double rmi = +100000.;
234 for(
int i=0;
i!=3; ++
i) {
235 if(!layerVectors[i].
empty()) {
236 if(mzmin[i]<zmi) zmi=mzmin[
i];
237 if(mzmax[i]>zma) zma=mzmax[
i];
238 if(mrmax[i]>rma) rma=mrmax[
i];
239 if(mrmin[i]<rmi) rmi=mrmin[
i];
240 }
241 }
242
243 double hz = std::abs(zma);
244 if(hz<std::abs(zmi))
hz = std::abs(zmi);
245
246 const Trk::CylinderBounds
CB(rma+20.,hz+20.);
247 std::unique_ptr<InDet::TRT_DetElementsRoadData_xk> writeCdo{std::make_unique<InDet::TRT_DetElementsRoadData_xk>()};
248 writeCdo->setTRTLayerVectors(std::move(layerVectors));
249 writeCdo->setBounds(CB,rmi);
250
251 if (writeHandle.
record(rangeTrt, std::move(writeCdo)).isFailure()) {
253 << " with EventRange " << rangeTrt
254 << " into Conditions Store");
255 return StatusCode::FAILURE;
256 }
257 ATH_MSG_DEBUG(
"recorded new CDO " << writeHandle.
key() <<
" with range " << rangeTrt <<
" into Conditions Store");
258
259 return StatusCode::SUCCESS;
260}
static const Attributes_t empty
unsigned int getNEndcapWheels() const
unsigned int getNEndcapPhi() const
unsigned int getNBarrelPhi() const
unsigned int getNBarrelRings() const
unsigned int getNBarrelLayers(unsigned int iMod) const
unsigned int getNEndcapLayers(unsigned int iWheel) const
SG::ReadCondHandleKey< InDetDD::TRT_DetElementContainer > m_trtDetEleContKey
SG::WriteCondHandleKey< TRT_DetElementsRoadData_xk > m_writeKey
std::vector< std::vector< InDet::TRT_DetElementsLayer_xk > > TRT_DetElementsLayerVectors_xk
const std::string & key() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const
void detElementInformation(const InDetDD::TRT_BaseElement &E, double *P)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.