31(
const std::string& t,
const std::string& n,
const IInterface* p)
42 StatusCode
sc = AlgTool::initialize();
74 m_treeName = (std::string(
"SeedTree_")+name());
119 return AlgTool::finalize();
130 data.trigger =
false;
135 double f[3], gP[3] ={10.,10.,0.};
142 if (fieldCondObj ==
nullptr) {
151 data.K = 2./(300.*f[2]);
153 data.K = 2./(300.* 5. );
156 data.i_spforseed = data.l_spforseed.begin();
165 if (!prd_to_track_map.
isValid()) {
168 prd_to_track_map_cptr = prd_to_track_map.
cptr();
176 if (spacepointsPixel.
isValid()) {
182 if (prd_to_track_map_cptr and
isUsed(
sp,*prd_to_track_map_cptr))
continue;
184 int ir =
static_cast<int>(sps->
radius()*irstep);
185 if (
ir>irmax)
ir = irmax;
186 data.r_Sorted[
ir].push_back(sps);
188 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
200 if (spacepointsSCT.
isValid()) {
206 if (prd_to_track_map_cptr and
isUsed(
sp,*prd_to_track_map_cptr))
continue;
208 int ir =
static_cast<int>(sps->
radius()*irstep);
209 if (
ir>irmax)
ir = irmax;
210 data.r_Sorted[
ir].push_back(sps);
212 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
221 if (spacepointsOverlap.
isValid()) {
226 if (prd_to_track_map_cptr &&
isUsed(
sp, *prd_to_track_map_cptr))
continue;
232 int ir =
static_cast<int>(sps->
radius()*irstep);
233 if (
ir>irmax)
ir = irmax;
234 data.r_Sorted[
ir].push_back(sps);
236 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
250(
const EventContext& ctx,
EventData& data,
251 const std::vector<IdentifierHash>& vPixel,
const std::vector<IdentifierHash>& vSCT)
const
255 data.trigger =
false;
261 double f[3], gP[3] ={10.,10.,0.};
268 if (fieldCondObj ==
nullptr) {
277 data.K = 2./(300.*f[2]);
279 data.K = 2./(300.* 5.);
282 data.i_spforseed = data.l_spforseed.begin();
289 if (
m_pixel && !vPixel.empty()) {
292 if (spacepointsPixel.
isValid()) {
297 const auto *w = spacepointsPixel->indexFindPtr(l);
298 if (w==
nullptr)
continue;
303 int ir =
static_cast<int>(sps->
radius()*irstep);
304 if (
ir>irmax)
ir = irmax;
305 data.r_Sorted[
ir].push_back(sps);
307 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
316 if (
m_sct && !vSCT.empty()) {
319 if (spacepointsSCT.
isValid()) {
324 const auto *w = spacepointsSCT->indexFindPtr(l);
325 if (w==
nullptr)
continue;
330 int ir =
static_cast<int>(sps->
radius()*irstep);
331 if (
ir>irmax)
ir = irmax;
332 data.r_Sorted[
ir].push_back(sps);
334 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
348(
const EventContext& ctx,
EventData& data,
349 const std::vector<IdentifierHash>& vPixel,
const std::vector<IdentifierHash>& vSCT,
364 data.izvertex = not lv.empty();
367 if (lv.begin()!=lv.end()) mode = 1;
370 if (newv || !data.state || data.nspoint!=2 || data.mode!=mode || data.nlist) {
372 data.i_seede = data.l_seeds.begin();
383 data.i_seed = data.l_seeds.begin();
400 data.izvertex = not lv.empty();
403 if (lv.begin()!=lv.end()) mode = 3;
406 if (newv || !data.state || data.nspoint!=3 || data.mode!=mode || data.nlist) {
408 data.i_seede = data.l_seeds.begin();
413 data.endlist = true ;
419 data.i_seed = data.l_seeds.begin();
443 if (lv.begin()!=lv.end()) mode = 6;
446 if (newv || !data.state || data.nspoint!=4 || data.mode!=mode || data.nlist) {
447 data.i_seede = data.l_seeds.begin();
452 data.endlist = true ;
458 data.i_seed = data.l_seeds.begin();
474 if (data.nprint)
return dumpEvent(data, out);
485 std::string s2;
for (
int i=0; i<n; ++i) s2.append(
" "); s2.append(
"|");
487 std::string s3;
for (
int i=0; i<n; ++i) s3.append(
" "); s3.append(
"|");
489 std::string s4;
for (
int i=0; i<n; ++i) s4.append(
" "); s4.append(
"|");
491 std::string s5;
for (
int i=0; i<n; ++i) s5.append(
" "); s5.append(
"|");
494 out<<
"|---------------------------------------------------------------------|"
508 <<std::setw(12)<<
m_sct
513 out<<
"| maxSizeSP | "
516 out<<
"| pTmin (mev) | "
517 <<std::setw(12)<<std::setprecision(5)<<
m_ptmin
519 out<<
"| pTmax (mev) | "
520 <<std::setw(12)<<std::setprecision(5)<<
m_ptmax
523 <<std::setw(12)<<std::setprecision(5)<<
m_etamax
525 out<<
"| max radius SP | "
526 <<std::setw(12)<<std::setprecision(5)<<
m_r_rmax
528 out<<
"| radius step | "
529 <<std::setw(12)<<std::setprecision(5)<<
m_r_rstep
531 out<<
"| min Z-vertex position | "
532 <<std::setw(12)<<std::setprecision(5)<<
m_zmin
534 out<<
"| max Z-vertex position | "
535 <<std::setw(12)<<std::setprecision(5)<<
m_zmax
537 out<<
"| min radius first SP(2) | "
538 <<std::setw(12)<<std::setprecision(5)<<
m_r1minv
540 out<<
"| min radius second SP(2) | "
541 <<std::setw(12)<<std::setprecision(5)<<
m_r2minv
543 out<<
"| max radius first SP(2) | "
544 <<std::setw(12)<<std::setprecision(5)<<
m_r1maxv
546 out<<
"| max radius second SP(2) | "
547 <<std::setw(12)<<std::setprecision(5)<<
m_r2maxv
549 out<<
"| min space points dR (b) | "
550 <<std::setw(12)<<std::setprecision(5)<<
m_drmin_b
552 out<<
"| min space points dR (t) | "
553 <<std::setw(12)<<std::setprecision(5)<<
m_drmin_t
555 out<<
"| max space points dR | "
556 <<std::setw(12)<<std::setprecision(5)<<
m_drmax
558 out<<
"| max dZ impact | "
559 <<std::setw(12)<<std::setprecision(5)<<
m_dzver
561 out<<
"| max dZ/dR impact | "
562 <<std::setw(12)<<std::setprecision(5)<<
m_dzdrver
564 out<<
"| max impact | "
565 <<std::setw(12)<<std::setprecision(5)<<
m_diver
567 out<<
"| max impact pps | "
568 <<std::setw(12)<<std::setprecision(5)<<
m_diverpps
570 out<<
"| max impact sss | "
571 <<std::setw(12)<<std::setprecision(5)<<
m_diversss
573 out<<
"|---------------------------------------------------------------------|"
575 out<<
"| Beam X center | "
576 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[0]
578 out<<
"| Beam Y center | "
579 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[0]
581 out<<
"| Beam Z center | "
582 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[0]
584 out<<
"| Beam X-axis direction | "
585 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[1]
586 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[2]
587 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[3]
589 out<<
"| Beam Y-axis direction | "
590 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[1]
591 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[2]
592 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[3]
594 out<<
"| Beam Z-axis direction | "
595 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[1]
596 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[2]
597 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[3]
599 out<<
"|---------------------------------------------------------------------|"
610 out<<
"|---------------------------------------------------------------------|"
613 <<std::setw(12)<<data.ns
615 out<<
"| data.nsaz | "
616 <<std::setw(12)<<data.nsaz
618 out<<
"| data.nsazv | "
619 <<std::setw(12)<<data.nsazv
622 <<std::setw(12)<<data.l_seeds.size()
624 out<<
"|---------------------------------------------------------------------|"
635 if (data.endlist)
return;
637 data.i_seede = data.l_seeds.begin();
642 data.i_seed = data.l_seeds.begin();
652 unsigned int s1 = data.l_vertex.size();
653 unsigned int s2 = lV.size();
655 if (s1==0 && s2==0)
return false;
657 data.l_vertex.clear();
660 data.l_vertex.insert(
static_cast<float>(v.position().z()));
689 constexpr float pi2 = 2.*
M_PI;
691 const float sFmax =
static_cast<float>(NFmax)/pi2;
692 const float sFmin = 100./60.;
696 else if (
m_sF < sFmin)
m_sF = sFmin;
703 const float sFvmax =
static_cast<float>(NFtmax)/pi2;
711 for (
int f=0; f<=
m_fNmax; ++f) {
775 int fb = f-1;
if (fb<0 ) fb=
m_fvNmax;
776 int ft = f+1;
if (ft>
m_fvNmax) ft=0;
812 double tx = std::tan(beamSpotHandle->beamTilt(0));
813 double ty = std::tan(beamSpotHandle->beamTilt(1));
815 double ph = atan2(ty,tx);
816 double th = acos(1./sqrt(1.+tx*tx+ty*ty));
817 double sint = sin(th);
818 double cost = cos(th);
819 double sinp = sin(ph);
820 double cosp = cos(ph);
822 data.xbeam[0] =
static_cast<float>(cb.x()) ;
823 data.xbeam[1] =
static_cast<float>(
cost*cosp*cosp+sinp*sinp);
824 data.xbeam[2] =
static_cast<float>(
cost*sinp*cosp-sinp*cosp);
825 data.xbeam[3] =-
static_cast<float>(sint*cosp );
827 data.ybeam[0] =
static_cast<float>(cb.y()) ;
828 data.ybeam[1] =
static_cast<float>(
cost*cosp*sinp-sinp*cosp);
829 data.ybeam[2] =
static_cast<float>(
cost*sinp*sinp+cosp*cosp);
830 data.ybeam[3] =-
static_cast<float>(sint*sinp );
832 data.zbeam[0] =
static_cast<float>(cb.z()) ;
833 data.zbeam[1] =
static_cast<float>(sint*cosp) ;
834 data.zbeam[2] =
static_cast<float>(sint*sinp) ;
835 data.zbeam[3] =
static_cast<float>(
cost) ;
845 r[0] =
static_cast<float>(
sp->globalPosition().
x())-data.xbeam[0];
846 r[1] =
static_cast<float>(
sp->globalPosition().
y())-data.ybeam[0];
847 r[2] =
static_cast<float>(
sp->globalPosition().
z())-data.zbeam[0];
856 constexpr float pi2 = 2.*
M_PI;
857 std::vector<InDet::SiSpacePointForSeed*>::iterator
r;
860 if (!data.r_map[i])
continue;
861 r = data.r_Sorted[i].begin();
863 while (
r!=data.r_Sorted[i].end()) {
867 float F = (*r)->phi();
870 int f =
static_cast<int>(
F*
m_sF);
880 Z< 250.?
z=5:Z< 450.?
z=6:Z< 925.?
z=7:Z< 1400.?
z=8:Z< 2500.?
z=9:
z=10;
882 Z>-250.?
z=5:Z>-450.?
z=4:Z>-925.?
z=3:Z>-1400.?
z=2:Z>-2500.?
z=1:
z= 0;
886 data.rfz_Sorted[n].push_back(*
r);
887 if (!data.rfz_map[n]++) data.rfz_index[data.nrfz++] = n;
889 if ((*r)->spacepoint->clusterList().second == 0 &&
z>=3 &&
z<=7) {
894 f =
static_cast<int>(
F*
m_sFv);
899 data.rfzv_Sorted[n].push_back(*
r);
900 if (!data.rfzv_map[n]++) data.rfzv_index[data.nrfzv++] = n;
902 r = data.r_Sorted[i].erase(
r);
916 for (
int i=0; i<data.nr; ++i) {
917 int n = data.r_index[i];
919 data.r_Sorted[n].clear();
922 for (
int i=0; i<data.nrfz; ++i) {
923 int n = data.rfz_index[i];
925 data.rfz_Sorted[n].clear();
928 for (
int i=0; i<data.nrfzv; ++i) {
929 int n = data.rfzv_index[i];
930 data.rfzv_map[n] = 0;
931 data.rfzv_Sorted[n].clear();
948 if (data.nsazv<2)
return;
950 std::vector<InDet::SiSpacePointForSeed*>::iterator r0,r0e,
r,
re;
955 for (
int f=data.fvNmin; f<=
m_fvNmax; ++f) {
960 if (!data.endlist)
z = data.zMin;
963 if (!data.rfzv_map[
a])
continue;
964 r0 = data.rfzv_Sorted[
a].begin();
965 r0e = data.rfzv_Sorted[
a].end ();
974 for (; r0!=r0e; ++r0) {
975 float X = (*r0)->x();
976 float Y = (*r0)->y();
977 float R = (*r0)->radius();
980 float Z = (*r0)->z();
987 for (
int i=0; i<NB; ++i) {
989 if (!data.rfzv_map[an])
continue;
991 r = data.rfzv_Sorted[an].begin();
992 re = data.rfzv_Sorted[an].end ();
995 float Rb =(*r)->radius();
1001 float dZ = Z-(*r)->z();
1003 if (Tz<m_dzdrmin || Tz>
m_dzdrmax)
continue;
1012 float dx =(*r)->x()-
X;
1013 float dy =(*r)->y()-Y;
1014 float x = dx*ax+dy*ay ;
1015 float y =-dx*ay+dy*ax ;
1016 float xy =
x*
x+
y*
y ;
if (xy == 0.)
continue;
1020 float UR = Ut*R+1. ;
if (UR == 0.)
continue;
1024 if (std::abs(B*data.K) >
m_ipt*std::sqrt(1.f+
A*
A))
continue;
1026 if (std::abs(B * data.K) <
m_iptmax * std::sqrt(1.f +
A *
A))
continue;
1028 newSeed(data, (*r)->spacepoint, (*r0)->spacepoint,Zo);
1040 data.endlist =
true;
1049 if (data.nsaz<3)
return;
1051 const int ZI[
SizeZ] = {5,6,7,8,9,10,4,3,2,1,0};
1052 std::vector<InDet::SiSpacePointForSeed*>::iterator rt[9],rte[9],rb[9],rbe[9];
1057 for (
int f=data.fNmin; f<=
m_fNmax; ++f) {
1061 if (!data.endlist)
z = data.zMin;
1065 if (!data.rfz_map[
a])
continue;
1069 if (!data.rfz_map[an])
continue;
1070 rb [NB] = data.rfz_Sorted[an].begin();
1071 rbe[NB++] = data.rfz_Sorted[an].end();
1075 if (!data.rfz_map[an])
continue;
1076 rt [NT] = data.rfz_Sorted[an].begin();
1077 rte[NT++] = data.rfz_Sorted[an].end();
1079 if (data.izvertex) {
1084 if (!data.endlist) {
1091 data.endlist =
true;
1100 std::vector<InDet::SiSpacePointForSeed*>::iterator* rb ,
1101 std::vector<InDet::SiSpacePointForSeed*>::iterator* rbe,
1102 std::vector<InDet::SiSpacePointForSeed*>::iterator* rt ,
1103 std::vector<InDet::SiSpacePointForSeed*>::iterator* rte,
1104 int NB,
int NT,
int& nseed)
const
1106 std::vector<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],
r;
1107 if (!data.endlist) {r0 = data.rMin; data.endlist =
true;}
1111 for (; r0!=rbe[0]; ++r0) {
1113 data.mapOneSeeds.erase(data.mapOneSeeds.begin(), data.mapOneSeeds.end());
1115 float R = (*r0)->radius();
1123 float X = (*r0)->x() ;
1124 float Y = (*r0)->y() ;
1125 float Z = (*r0)->z() ;
1130 for (
int i=0; i<NB; ++i) {
1131 for (
r=rb[i];
r!=rbe[i]; ++
r) {
1132 float Rb =(*r)->radius();
1139 if (dR >
m_drmax) {rb[i]=
r;
continue;}
1141 if ((*r)->sur()==sur0)
continue;
1143 float Tz = (Z-(*r)->z())/dR;
1145 if (Tz < m_dzdrmin || Tz >
m_dzdrmax)
continue;
1162 for (
int i=0; i<NT; ++i) {
1163 for (
r=rt[i];
r!=rte[i]; ++
r) {
1164 float Rt =(*r)->radius();
1175 if ( (*r)->sur()==sur0)
continue;
1177 float Tz = ((*r)->z()-Z)/dR;
1179 if (Tz < m_dzdrmin || Tz >
m_dzdrmax)
continue;
1192 if (!(Nt-Nb))
continue;
1194 float covr0 = (*r0)->covr();
1195 float covz0 = (*r0)->covz();
1200 for (
int i=0; i<Nt; ++i) {
1203 float dx =
sp->x()-
X ;
1204 float dy =
sp->y()-Y ;
1205 float dz =
sp->z()-Z ;
1206 float x = dx*ax+dy*ay ;
1207 float y =-dx*ay+dy*ax ;
1208 float r2 = 1.f/(
x*
x+
y*
y);
1209 float dr = std::sqrt(r2) ;
1211 if (i < Nb) tz = -tz;
1214 data.Zo[i] = Z-R*tz ;
1218 data.Er[i] = (covz0+
sp->covz()+tz*tz*(covr0+
sp->covr()))*r2;
1227 float ipt2K = ipt2/K2 ;
1228 float ipt2Kmax = ipt2max/K2;
1229 float ipt2C = ipt2*COF ;
1230 float COFK = COF*K2 ;
1235 for (
int b=0; b<Nb; ++b) {
1238 float Zob = data.Zo[b] ;
1239 float Tzb = data.Tz[b] ;
1240 float Rb2r = data.R [b]*covr0;
1241 float Rb2z = data.R [b]*covz0;
1242 float Erb = data.Er[b] ;
1243 float Vb = data.V [b] ;
1244 float Ub = data.U [b] ;
1245 float Tzb2 = (1.f+Tzb*Tzb) ;
1246 float CSA = Tzb2*COFK ;
1247 float ICSA = Tzb2*ipt2C ;
1249 float Iz = (dZ*dZ)/Tzb2 ;
1251 for (
int t=Nb; t<Nt; ++t) {
1252 float Ts = .5f*(Tzb+data.Tz[t]) ;
1253 float dt = Tzb-data.Tz[t] ;
1254 float dT = dt*dt-Erb-data.Er[t]-data.R[t]*(Ts*Ts*Rb2r+Rb2z);
1255 if ( dT > ICSA)
continue;
1256 float dU = data.U[t]-Ub;
if (dU == 0.) continue ;
1257 float A = (data.V[t]-Vb)/dU ;
1258 float S2 = 1.f+
A*
A ;
1261 if (B2 > ipt2K*
S2 || B2 < ipt2Kmax*S2 || dT*S2 > B2*CSA)
continue;
1262 float Im = std::abs((
A-B*R)*R) ;
1264 if ( Im > imc )
continue;
1266 newOneSeed(data, SPb, SP0, data.SP[t]->spacepoint, Zob, Im);
1269 float theta = std::atan(1.f / Ts);
1270 data.SP[t]->setEta(-std::log(std::tan(0.5f *
theta)));
1271 data.SP[t]->setPt(std::sqrt(
S2 / B2) / (1000.f * data.K));
1275 nseed += data.mapOneSeeds.size();
1293 std::vector<InDet::SiSpacePointForSeed*>::iterator* rb ,
1294 std::vector<InDet::SiSpacePointForSeed*>::iterator* rbe,
1295 std::vector<InDet::SiSpacePointForSeed*>::iterator* rt ,
1296 std::vector<InDet::SiSpacePointForSeed*>::iterator* rte,
1297 int NB,
int NT,
int& nseed)
const
1299 std::vector<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],
r;
1300 if (!data.endlist) {
1302 data.endlist =
true;
1307 for (; r0!=rbe[0]; ++r0) {
1309 data.mapOneSeeds.erase(data.mapOneSeeds.begin(), data.mapOneSeeds.end());
1311 float R = (*r0)->radius();
1320 float X = (*r0)->x() ;
1321 float Y = (*r0)->y() ;
1322 float Z = (*r0)->z() ;
1327 for (
int i=0; i<NB; ++i) {
1328 for (
r=rb[i];
r!=rbe[i]; ++
r) {
1329 float Rb =(*r)->radius();
1341 if ((*r)->sur()==sur0)
continue;
1342 if ( !
pix && !(*r)->spacepoint->clusterList().second)
continue;
1343 float Tz = (Z-(*r)->z())/dR;
1344 if (Tz < m_dzdrmin || Tz >
m_dzdrmax)
continue;
1361 for (
int i=0; i<NT; ++i) {
1362 for (
r=rt[i];
r!=rte[i]; ++
r) {
1363 float Rt =(*r)->radius();
1374 if ((*r)->sur()==sur0)
continue;
1375 float Tz = ((*r)->z()-Z)/dR;
1376 if (Tz < m_dzdrmin || Tz >
m_dzdrmax)
continue;
1389 if (!(Nt-Nb))
continue;
1391 float covr0 = (*r0)->covr();
1392 float covz0 = (*r0)->covz();
1397 for (
int i=0; i<Nt; ++i) {
1400 float dx =
sp->x()-
X ;
1401 float dy =
sp->y()-Y ;
1402 float dz =
sp->z()-Z ;
1403 float x = dx*ax+dy*ay ;
1404 float y =-dx*ay+dy*ax ;
1405 float r2 = 1.f/(
x*
x+
y*
y);
1406 float dr = std::sqrt(r2) ;
1408 if (i < Nb) tz = -tz;
1411 data.Zo[i] = Z-R*tz ;
1415 data.Er[i] = (covz0+
sp->covz()+tz*tz*(covr0+
sp->covr()))*r2;
1425 float ipt2K = ipt2/K2 ;
1426 float ipt2Kmax = ipt2max/K2;
1427 float ipt2C = ipt2*COF ;
1428 float COFK = COF*K2 ;
1434 for (
int b=0; b<Nb; ++b) {
1437 float Zob = data.Zo[b] ;
1438 float Tzb = data.Tz[b] ;
1439 float Rb2r = data.R [b]*covr0;
1440 float Rb2z = data.R [b]*covz0;
1441 float Erb = data.Er[b] ;
1442 float Vb = data.V [b] ;
1443 float Ub = data.U [b] ;
1444 float Tzb2 = (1.f+Tzb*Tzb) ;
1445 float CSA = Tzb2*COFK ;
1446 float ICSA = Tzb2*ipt2C ;
1448 for (
int t=Nb; t<Nt; ++t) {
1449 float Ts = .5f*(Tzb+data.Tz[t]) ;
1450 float dt = Tzb-data.Tz[t] ;
1451 float dT = dt*dt-Erb-data.Er[t]-data.R[t]*(Ts*Ts*Rb2r+Rb2z);
1452 if ( dT > ICSA)
continue;
1453 float dU = data.U[t]-Ub;
1454 if (dU == 0.)
continue;
1455 float A = (data.V[t]-Vb)/dU ;
1456 float S2 = 1.f+
A*
A ;
1459 if (B2 > ipt2K*
S2 || B2 < ipt2Kmax*S2 || dT*S2 > B2*CSA)
continue;
1460 float Im = std::abs((
A-B*R)*R) ;
1463 if ( Im > imc )
continue;
1464 if (data.SP[t]->spacepoint->clusterList().second && Im > imcs)
continue;
1468 newOneSeed(data, SPb, SP0, data.SP[t]->spacepoint, Zob, Im);
1471 float theta = std::atan(1.f / Ts);
1472 data.SP[t]->setEta(-std::log(std::tan(0.5f *
theta)));
1473 data.SP[t]->setPt(std::sqrt(
S2 / B2) / (1000.f * data.K));
1477 nseed += data.mapOneSeeds.size();
1499 data.OneSeeds[data.nOneSeeds].erase();
1500 data.OneSeeds[data.nOneSeeds].add(p1);
1501 data.OneSeeds[data.nOneSeeds].add(p2);
1502 data.OneSeeds[data.nOneSeeds].add(p3);
1503 data.OneSeeds[data.nOneSeeds].setZVertex(
static_cast<double>(
z));
1504 data.mapOneSeeds.insert(std::make_pair(q, &(data.OneSeeds[data.nOneSeeds])));
1507 std::multimap<float,InDet::SiSpacePointsSeed*>::reverse_iterator
1508 l = data.mapOneSeeds.rbegin();
1509 if ((*l).first <= q)
return;
1516 s->setZVertex(
static_cast<double>(
z));
1517 std::multimap<float,InDet::SiSpacePointsSeed*>::iterator
1518 i = data.mapOneSeeds.insert(std::make_pair(q,s));
1520 for (++i; i!=data.mapOneSeeds.end(); ++i) {
1521 if ((*i).second==s) {
1522 data.mapOneSeeds.erase(i);
1533 if (data.i_seed==data.i_seede) {
1536 if (data.i_seed==data.i_seede)
return nullptr;
1538 return &(*data.i_seed++);
1542(
EventData& data,
float& Zv,
float& R,
float& T)
const
1545 if (Zv < data.zCollisionMinimum || Zv > data.zCollisionMaximum)
return false;
1548 if (Zv < m_zmin || Zv >
m_zmax)
return false;
1550 if (!data.izvertex)
return true;
1552 float dZmin = std::numeric_limits<float>::max();
1553 for (
const float& v: data.l_vertex) {
1554 float dZ = std::abs(v-Zv);
1555 if (dZ<dZmin) dZmin=dZ;
1562 float dZm = std::numeric_limits<float>::max();
1563 for (
const float& v: data.l_vertex) {
1564 float dZ = std::abs(v-Z);
1565 if (dZ<dZm) dZm = dZ;
1579 std::array<float, 3>
r{0, 0, 0};
1582 if (data.i_spforseed!=data.l_spforseed.end()) {
1583 sps = &(*data.i_spforseed++);
1586 data.l_spforseed.emplace_back(
sp,
r);
1587 sps = &(data.l_spforseed.back());
1588 data.i_spforseed = data.l_spforseed.end();
1603 if (data.i_seede!=data.l_seeds.end()) {
1608 s->setZVertex(
static_cast<double>(
z));
1610 data.l_seeds.emplace_back(p1, p2,
z);
1611 data.i_seede = data.l_seeds.end();
1624 if (data.i_seede!=data.l_seeds.end()) {
1630 s->setZVertex(
static_cast<double>(
z));
1632 data.l_seeds.emplace_back(p1, p2, p3,
z);
1633 data.i_seede = data.l_seeds.end();
1643 std::multimap<float, InDet::SiSpacePointsSeed*>::iterator
1644 l = data.mapOneSeeds.begin(),
1645 le = data.mapOneSeeds.end ();
1646 for (; l!=le; ++l) {
1647 if (data.i_seede!=data.l_seeds.end()) {
1651 data.l_seeds.emplace_back(*(*l).second);
1652 data.i_seede = data.l_seeds.end();
1658 data.initialize(EventData::ToolType::HeavyIon,
1672 long eventNumber)
const
1678 if (track !=
nullptr) {
1679 m_trackPt = track->trackParameters()->front()->pT() / 1000.f;
1680 m_trackEta = std::abs(track->trackParameters()->front()->eta());
1686 const std::vector<const Trk::SpacePoint*>& sps = seed->spacePoints();
1689 m_z0 = seed->zVertex();
1690 m_eta = sps[0]->globalPosition().eta();
1691 m_x1 = sps[0]->globalPosition().x();
1692 m_x2 = sps[1]->globalPosition().x();
1693 m_x3 = sps[2]->globalPosition().x();
1694 m_y1 = sps[0]->globalPosition().y();
1695 m_y2 = sps[1]->globalPosition().y();
1696 m_y3 = sps[2]->globalPosition().y();
1697 m_z1 = sps[0]->globalPosition().z();
1698 m_z2 = sps[1]->globalPosition().z();
1699 m_z3 = sps[2]->globalPosition().z();
1700 m_r1 = sps[0]->globalPosition().perp();
1701 m_r2 = sps[1]->globalPosition().perp();
1702 m_r3 = sps[2]->globalPosition().perp();
1704 m_dzdr_b = ( sps[1]->globalPosition().
z() - sps[0]->globalPosition().
z() )/( sps[1]->globalPosition().
perp() - sps[0]->globalPosition().
perp());
1705 m_dzdr_t = ( sps[2]->globalPosition().
z() - sps[1]->globalPosition().
z()) / (sps[2]->globalPosition().
perp() - sps[1]->globalPosition().
perp());
1706 m_dr_b = sps[1]->globalPosition().perp() - sps[0]->globalPosition().perp();
1707 m_dr_t = sps[2]->globalPosition().perp() - sps[1]->globalPosition().perp();
1709 m_givesTrack = !(track ==
nullptr);
1710 m_eventNumber = eventNumber;
Scalar perp() const
perp method - perpendicular length
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
struct TBPatternUnitContext S2
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
Describes the API of the Region of Ineterest geometry.
This is a "hash" representation of an Identifier.
void set(const Trk::SpacePoint *, std::span< float const, 3 >)
virtual void writeNtuple(const SiSpacePointsSeed *seed, const Trk::Track *track, int seedType, long eventNumber) const override
BooleanProperty m_useOverlap
BooleanProperty m_useVertexPosition
float m_d0 ATLAS_THREAD_SAFE
virtual MsgStream & dump(EventData &data, MsgStream &out) const override
void initializeEventData(EventData &data) const
UnsignedIntegerProperty m_maxNumberVertices
virtual void newRegion(const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vSCT) const override
virtual StatusCode finalize() override
void newOneSeed(EventData &data, const Trk::SpacePoint *&, const Trk::SpacePoint *&, const Trk::SpacePoint *&, const float &, const float &) const
void fillLists(EventData &data) const
int m_rfzv_i[SizeRFZV][SizeIV]
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
static MsgStream & dumpEvent(EventData &data, MsgStream &out)
virtual StatusCode initialize() override
virtual bool getWriteNtupleBoolProperty() const override
bool isUsed(const Trk::SpacePoint *sp, const Trk::PRDtoTrackMap &prd_to_track_map) const
bool newVertices(EventData &data, const std::list< Trk::Vertex > &) const
bool isZCompatible(EventData &data, float &, float &, float &) const
void buildBeamFrameWork(const EventContext &ctx, EventData &data) const
IntegerProperty m_maxsize
virtual void newEvent(const EventContext &ctx, EventData &data, int iteration) const override
SG::ReadHandleKey< SpacePointOverlapCollection > m_spacepointsOverlap
void production2Sp(EventData &data) const
virtual const SiSpacePointsSeed * next(const EventContext &ctx, EventData &data) const override
IntegerProperty m_maxsizeSP
static void erase(EventData &data)
void production3Sp(EventData &data) const
virtual void find2Sp(EventData &data, const std::list< Trk::Vertex > &lv) const override
with two space points with or without vertex constraint
int m_rfz_ib[SizeRFZ][SizeI]
BooleanProperty m_writeNtuple
static void fillSeeds(EventData &data)
void findNext(EventData &data) const
static void convertToBeamFrameWork(EventData &data, const Trk::SpacePoint *const &, std::array< float, 3 > &)
static void newSeed(EventData &data, const Trk::SpacePoint *&, const Trk::SpacePoint *&, const float &)
static float dZVertexMin(EventData &data, float &)
MsgStream & dumpConditions(EventData &data, MsgStream &out) const
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
int m_rfz_it[SizeRFZ][SizeI]
SG::ReadHandleKey< SpacePointContainer > m_spacepointsSCT
virtual void findVSp(const EventContext &ctx, EventData &data, const std::list< Trk::Vertex > &lv) const override
ServiceHandle< ITHistSvc > m_thistSvc
SG::ReadHandleKey< SpacePointContainer > m_spacepointsPixel
void production3SpNoVertex(EventData &data, std::vector< InDet::SiSpacePointForSeed * >::iterator *, std::vector< InDet::SiSpacePointForSeed * >::iterator *, std::vector< InDet::SiSpacePointForSeed * >::iterator *, std::vector< InDet::SiSpacePointForSeed * >::iterator *, int, int, int &) const
IntegerProperty m_maxOneSize
SiSpacePointsSeedMaker_HeavyIon()=delete
static SiSpacePointForSeed * newSpacePoint(EventData &data, const Trk::SpacePoint *const &)
FloatProperty m_fieldScale
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
virtual void find3Sp(const EventContext &ctx, EventData &data, const std::list< Trk::Vertex > &lv) const override
with three space points with or without vertex constraint
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h).
bool solenoidOn() const
status of the magnets
void getFieldZR(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field valaue on the z-r plane at given position works only inside the solenoid.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const std::pair< const PrepRawData *, const PrepRawData * > & clusterList() const
return the pair of cluster pointers by reference
Abstract Base Class for tracking surfaces.
This class is a simplest representation of a vertex candidate.
int ir
counter of the current depth
int cost(std::vector< std::string > &files, node &n, const std::string &directory="", bool deleteref=false, bool relocate=false)
Eigen::Matrix< double, 3, 1 > Vector3D
hold the test vectors and ease the comparison