107 for (
int i=0; i<n; ++i) s1.append(
" ");
110 std::string fieldmode[9] = {
"NoField" ,
"ConstantField",
"SolenoidalField",
111 "ToroidalField" ,
"Grid3DField" ,
"RealisticField" ,
112 "UndefinedField",
"AthenaField" ,
"?????" };
127 if (mode<0 || mode>8) mode = 8;
129 n = 62-fieldmode[mode].size();
131 for (
int i=0; i<n; ++i) s3.append(
" ");
136 for (
int i=0; i<n; ++i) s5.append(
" ");
141 for (
int i=0; i<n; ++i) s6.append(
" ");
144 const EventContext& ctx = Gaudi::Hive::currentContext();
146 const SiDetElementsLayerVectors_xk &layer = *
getLayers(ctx);
149 if (!layer[0].
empty()) ++maps;
150 if (!layer[1].
empty()) ++maps;
151 if (!layer[2].
empty()) ++maps;
152 auto prec = out.precision();
153 out<<
"|----------------------------------------------------------------------"
154 <<
"-------------------|"
157 out<<
"| SCT detector manager | "<<
m_sct <<s5<<
"\n";
160 out<<
"| Pixel detector manager | "<<
m_pix <<s6<<
"\n";
162 out<<
"| Tool for propagation | "<<
m_proptool.type() <<s1<<
"\n";
163 out<<
"| Magnetic field mode | "<<fieldmode[mode] <<s3<<
"\n";
164 out<<
"| Width of the road (mm) | "
165 <<std::setw(12)<<std::setprecision(5)<<
m_width
167 out<<
"|----------------------------------------------------------------------"
168 <<
"-------------------|"
173 if (!layer[1].
empty()) {
174 int nl = layer[1].size();
176 for (
const auto & i : layer[1]) nc+=i.nElements();
177 out<<
"|----------------------------------------------------------------|"
179 out<<
"| Barrel map contains "
180 <<std::setw(3)<<nl<<
" layers and"
181 <<std::setw(5)<<nc<<
" elements |"
183 out<<
"|------|-----------|------------|------------|------------|------|"
185 out<<
"| n | R | Z min | Z max | max dF | nEl |"
187 out<<
"|------|-----------|------------|------------|------------|------|"
189 for (
unsigned int i=0; i!=layer[1].size(); ++i) {
190 double zmin = layer[1].at(i).z()-layer[1].at(i).dz();
191 double zmax = layer[1].at(i).z()+layer[1].at(i).dz();
193 <<std::setw(4)<<i<<
" |"
194 <<std::setw(10)<<std::setprecision(4)<< layer[1].at(i).r ()<<
" | "
195 <<std::setw(10)<<std::setprecision(4)<< zmin<<
" | "
196 <<std::setw(10)<<std::setprecision(4)<< zmax<<
" | "
197 <<std::setw(10)<<std::setprecision(4)<< layer[1].at(i).dfe()<<
" | "
198 <<std::setw(4)<<layer[1].at(i).nElements()<<
" | "
201 out<<
"|------|-----------|------------|------------|------------|------|"
205 if (!layer[0].
empty()) {
206 int nl = layer[0].size();
208 for (
const auto & i : layer[0]) nc+=i.nElements();
209 out<<
"|----------------------------------------------------------------|"
211 out<<
"| L.Endcap map contains"
212 <<std::setw(3)<<nl<<
" layers and"
213 <<std::setw(5)<<nc<<
" elements |"
216 out<<
"|------|-----------|------------|------------|------------|------|"
218 out<<
"| n | Z | R min | R max | max dF | nEl |"
220 out<<
"|------|-----------|------------|------------|------------|------|"
222 for (
unsigned int i=0; i!=layer[0].size(); ++i) {
223 double rmin = layer[0].at(i).r()-layer[0].at(i).dr();
224 double rmax = layer[0].at(i).r()+layer[0].at(i).dr();
226 <<std::setw(4)<<i<<
" |"
227 <<std::setw(10)<<std::setprecision(4)<< layer[0].at(i).z()<<
" | "
228 <<std::setw(10)<<std::setprecision(4)<< rmin<<
" | "
229 <<std::setw(10)<<std::setprecision(4)<< rmax<<
" | "
230 <<std::setw(10)<<std::setprecision(4)<<layer[0].at(i).dfe()<<
" | "
231 <<std::setw(4)<<layer[0].at(i).nElements()<<
" | "
234 out<<
"|------|-----------|------------|------------|------------|------|"
237 if (!layer[2].
empty()) {
238 int nl = layer[2].size();
240 for (
const auto & i : layer[2]) nc+=i.nElements();
241 out<<
"|----------------------------------------------------------------|"
243 out<<
"| R.Endcap map contains"
244 <<std::setw(3)<<nl<<
" layers and"
245 <<std::setw(5)<<nc<<
" elements |"
247 out<<
"|------|-----------|------------|------------|------------|------|"
249 out<<
"| n | Z | R min | R max | max dF | nEl |"
251 out<<
"|------|-----------|------------|------------|------------|------|"
253 for (
unsigned int i=0; i!=layer[2].size(); ++i) {
254 double rmin = layer[2].at(i).r()-layer[2].at(i).dr();
255 double rmax = layer[2].at(i).r()+layer[2].at(i).dr();
257 <<std::setw(4)<<i<<
" |"
258 <<std::setw(10)<<std::setprecision(4)<< layer[2].at(i).z()<<
" | "
259 <<std::setw(10)<<std::setprecision(4)<< rmin<<
" | "
260 <<std::setw(10)<<std::setprecision(4)<< rmax<<
" | "
261 <<std::setw(10)<<std::setprecision(4)<<layer[2].at(i).dfe()<<
" | "
262 <<std::setw(4)<<layer[2].at(i).nElements()<<
" | "
265 out<<
"|------|-----------|------------|------------|------------|------|"
308(std::deque<Amg::Vector3D>& globalPositions,
309 std::vector<const InDetDD::SiDetectorElement*>& Road,
312 const EventContext& ctx)
const
327 const SiDetElementsLayerVectors_xk &layer = *
getLayers(ctx);
330 std::deque<Amg::Vector3D>::iterator currentPosition=globalPositions.begin(), endPositions=globalPositions.end();
334 std::array<float,6> par_startingPoint{
static_cast<float>((*currentPosition).x()),
335 static_cast<float>((*currentPosition).y()),
336 static_cast<float>((*currentPosition).z()),
337 static_cast<float>(sqrt((*currentPosition).x()*(*currentPosition).x()+(*currentPosition).y()*(*currentPosition).y())),
345 for (; n0!=
static_cast<int>(layer[0].size()); ++n0) {
346 if (par_startingPoint[2] > layer[0][n0].
z())
break;
353 for (; n1!=
static_cast<int>(layer[1].size()); ++n1) {
354 if (par_startingPoint[3] < layer[1][n1].
r())
break;
359 for (; n2!=
static_cast<int>(layer[2].size()); ++n2) {
360 if (par_startingPoint[2] < layer[2][n2].
z())
break;
377 std::vector<InDet::SiDetElementLink_xk::ElementWay> lDE;
381 while (currentPosition!=endPositions) {
383 std::array<float,4> par_targetPoint{
static_cast<float>((*currentPosition).x()),
384 static_cast<float>((*currentPosition).y()),
385 static_cast<float>((*currentPosition).z()),
386 static_cast<float>(sqrt((*currentPosition).x()*(*currentPosition).x()+(*currentPosition).y()*(*currentPosition).y()))
390 float dx = par_targetPoint[0]-par_startingPoint[0];
391 float dy = par_targetPoint[1]-par_startingPoint[1];
392 float dz = par_targetPoint[2]-par_startingPoint[2];
393 float dist3D = std::sqrt(dx*dx+dy*dy+dz*dz);
398 float inverseDistance = 1./dist3D;
400 std::array<float,3> searchDirection{dx*inverseDistance, dy*inverseDistance, dz*inverseDistance};
405 float unitSepTransverseComp = searchDirection[0]*searchDirection[0]+searchDirection[1]*searchDirection[1];
407 if (unitSepTransverseComp!=0.) {
410 float sm = -( searchDirection[0]*par_startingPoint[0] +
411 searchDirection[1]*par_startingPoint[1])
412 /unitSepTransverseComp;
419 if (sm > 1. && sm < dist3D) {
420 par_targetPoint[0] = par_startingPoint[0]+searchDirection[0]*sm;
421 par_targetPoint[1] = par_startingPoint[1]+searchDirection[1]*sm;
422 par_targetPoint[2] = par_startingPoint[2]+searchDirection[2]*sm;
423 par_targetPoint[3] = std::sqrt(par_targetPoint[0]*par_targetPoint[0]+par_targetPoint[1]*par_targetPoint[1]);
439 if (par_targetPoint[3]>par_startingPoint[3]) {
441 for (; n1<static_cast<int>(layer[1].
size()); ++n1) {
443 if (par_targetPoint[3] < layer[1][n1].
r())
break;
447 else layer[1][n1].getBarrelDetElements(par_startingPoint, searchDirection, lDE, roadMakerData.
elementUsageTracker[1][n1]);
451 for (--n1; n1>=0; --n1) {
453 if (par_targetPoint[3] > layer[1][n1].
r()+dr)
break;
457 else layer[1][n1].getBarrelDetElements(par_startingPoint, searchDirection, lDE, roadMakerData.
elementUsageTracker[1][n1]);
465 if (par_targetPoint[2]>par_startingPoint[2]) {
466 for (; n2<static_cast<int>(layer[2].
size()); ++n2) {
467 if (par_targetPoint[2] < layer[2][n2].
z())
break;
471 else layer[2][n2].getEndcapDetElements(par_startingPoint, searchDirection, lDE,roadMakerData.
elementUsageTracker[2][n2]);
474 for (--n2; n2>=0; --n2) {
475 if (par_targetPoint[2] > layer[2][n2].
z())
break;
479 else layer[2][n2].getEndcapDetElements(par_startingPoint, searchDirection, lDE, roadMakerData.
elementUsageTracker[2][n2]);
486 if (par_targetPoint[2]<par_startingPoint[2]) {
487 for (; n0<static_cast<int>(layer[0].
size()); ++n0) {
488 if (par_targetPoint[2] > layer[0][n0].
z())
break;
492 else layer[0][n0].getEndcapDetElements(par_startingPoint, searchDirection, lDE,roadMakerData.
elementUsageTracker[0][n0]);
495 for (--n0; n0>=0; --n0) {
496 if (par_targetPoint[2] < layer[0][n0].
z())
break;
500 else layer[0][n0].getEndcapDetElements(par_startingPoint, searchDirection, lDE,roadMakerData.
elementUsageTracker[0][n0]);
505 par_startingPoint[0] = par_targetPoint[0];
506 par_startingPoint[1] = par_targetPoint[1];
507 par_startingPoint[2] = par_targetPoint[2];
508 par_startingPoint[3] = par_targetPoint[3];
510 par_startingPoint[5]+= dist3D;
515 Road.reserve(lDE.size());
516 for (
auto & d : lDE){
517 if (testDirection && d.way() < 0) {
continue;}
518 Road.push_back(d.link()->detElement());
617 sc = detStore()->retrieve(pixmgr,
m_pix);
618 if (
sc.isFailure() || !pixmgr) {
628 sc = detStore()->retrieve(sctmgr,
m_sct);
629 if (
sc.isFailure() || !sctmgr) {
636 const SCT_ID* IDs =
nullptr;
638 if (
m_usePIX && detStore()->retrieve(IDp,
"PixelID").isFailure()) {
642 if (
m_useSCT && detStore()->retrieve(IDs,
"SCT_ID").isFailure()) {
647 if (!IDs && !IDp)
return;
650 std::vector<InDetDD::SiDetectorElement const*> pW[3];
659 if ((*s)->isBarrel() ) pW[1].push_back((*s));
660 else if ((*s)->center().z() > 0.) pW[2].push_back((*s));
661 else pW[0].push_back((*s));
672 if ((*s)->isBarrel() ) pW[1].push_back((*s));
673 else if ((*s)->center().z() > 0.) pW[2].push_back((*s));
674 else pW[0].push_back((*s));
678 int nel = pW[0].size()+pW[1].size()+pW[2].size();
689 bool has[3] {
false,
false,
false};
691 for (
int N=0; N!=3; ++N) {
693 int im =
static_cast<int>(pW[N].size()-1);
702 for (
int i = 0; i<= im; ++i) {
705 if (
P[ 9] < mrmin[N]) mrmin[N] =
P[ 9];
706 if (
P[10] > mrmax[N]) mrmax[N] =
P[10];
707 if (
P[11] < mzmin[N]) mzmin[N] =
P[11];
708 if (
P[12] > mzmax[N]) mzmax[N] =
P[12];
714 if (fabs(
r-r0) > 10.) {
719 if (fabs(
z-z0) > 10.) {
740 double zmi = +100000;
741 double zma = -100000;
742 double rma = -100000;
743 for (
int i=0; i!=3; ++i) {
745 if (mzmin[i]<zmi) zmi=mzmin[i];
746 if (mzmax[i]>zma) zma=mzmax[i];
747 if (mrmax[i]>rma) rma=mrmax[i];
751 double hz = fabs(zma);
752 if (hz<fabs(zmi)) hz = fabs(zmi);