33(
const std::string& t,
const std::string& n,
const IInterface* p)
34 : base_class(t, n, p),
48 StatusCode
sc = AlgTool::initialize();
68 if (msgLvl(MSG::DEBUG)) {
79 m_treeName = (std::string(
"SeedTree_")+name());
124 return AlgTool::finalize();
136 data.trigger =
false;
140 data.iteration = iteration;
141 if (iteration <=0) data.iteration = 0;
149 if (data.iteration == 0) {
155 double magField[3]{0,0,0};
156 double globalPos[3] ={10.,10.,0.};
162 if (fieldCondObj ==
nullptr) {
181 data.K = 2.f/(300.f*float(magField[2]));
183 data.K = 2.f/(300.f* 5.f );
189 data.ipt2K =
m_ipt2/(data.K*data.K);
192 data.COFK =
m_COF*(data.K*data.K);
195 data.i_spforseed = data.l_spforseed.begin();
216 data.checketa = data.dzdrmin > 1.;
228 for (
int i=0; i<data.nr; ++i) {
229 int n = data.r_index[i];
231 data.r_Sorted[n].clear();
233 data.ns = data.nr = 0;
240 if (!prd_to_track_map.
isValid()) {
243 prd_to_track_map_cptr = prd_to_track_map.
cptr();
257 if (spacepointsPixel.
isValid()) {
264 if ((prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr)) ||
sp->r() >
m_r_rmax)
continue;
270 if (!de || de->
isDBM())
continue;
282 int radiusBin =
static_cast<int>(sps->
radius()*oneOverBinSizeR);
284 if (radiusBin>maxBinR) radiusBin = maxBinR;
287 data.r_Sorted[radiusBin].push_back(sps);
289 ++data.r_map[radiusBin];
292 if (data.r_map[radiusBin]==1) data.r_index[data.nr++] = radiusBin;
294 if (radiusBin > data.r_first) data.r_first = radiusBin;
307 if (spacepointsSCT.
isValid()) {
313 if ((prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr)) ||
sp->r() >
m_r_rmax)
continue;
321 int radiusBin =
static_cast<int>(sps->
radius()*oneOverBinSizeR);
322 if (radiusBin>maxBinR) radiusBin = maxBinR;
324 data.r_Sorted[radiusBin].push_back(sps);
326 ++data.r_map[radiusBin];
328 if (data.r_map[radiusBin]==1) data.r_index[data.nr++] = radiusBin;
339 if (spacepointsOverlap.
isValid()) {
343 if ((prd_to_track_map_cptr &&
isUsed(
sp, *prd_to_track_map_cptr)) ||
sp->r() >
m_r_rmax)
continue;
350 int radiusBin =
static_cast<int>(sps->
radius()*oneOverBinSizeR);
351 if (radiusBin>maxBinR) radiusBin = maxBinR;
353 data.r_Sorted[radiusBin].push_back(sps);
355 ++data.r_map[radiusBin];
357 if (data.r_map[radiusBin]==1) data.r_index[data.nr++] = radiusBin;
366 if (iteration < 0) data.r_first = 0;
379(
const EventContext& ctx,
EventData& data,
380 const std::vector<IdentifierHash>& vPixel,
const std::vector<IdentifierHash>& vSCT)
const
385 data.trigger =
false;
397 double magField[3]{0,0,0};
398 double globalPos[3] ={10.,10.,0.};
405 if (fieldCondObj ==
nullptr) {
415 data.K = 2.f/(300.f*float(magField[2]));
417 data.K = 2.f/(300.f* 5.f );
420 data.ipt2K =
m_ipt2/(data.K*data.K);
422 data.COFK =
m_COF*(data.K*data.K);
424 data.i_spforseed = data.l_spforseed.begin();
430 data.checketa =
false;
432 for (
int i=0; i<data.nr; ++i) {
433 int n = data.r_index[i];
435 data.r_Sorted[n].clear();
437 data.ns = data.nr = 0;
441 if (
m_pixel && !vPixel.empty()) {
444 if ( spacepointsPixel.
isValid() ) {
449 const auto *w = spacepointsPixel->indexFindPtr(l);
450 if (w==
nullptr)
continue;
455 int ir =
static_cast<int>(sps->
radius()*oneOverBinSizeR);
456 if (
ir>maxBinR)
ir = maxBinR;
457 data.r_Sorted[
ir].push_back(sps);
459 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
468 if (
m_sct && !vSCT.empty()) {
471 if (spacepointsSCT.
isValid()) {
476 const auto *w = spacepointsSCT->indexFindPtr(l);
477 if (w==
nullptr)
continue;
482 int ir =
static_cast<int>(sps->
radius()*oneOverBinSizeR);
483 if (
ir>maxBinR)
ir = maxBinR;
484 data.r_Sorted[
ir].push_back(sps);
486 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
500(
const EventContext& ctx,
EventData& data,
501 const std::vector<IdentifierHash>& vPixel,
const std::vector<IdentifierHash>& vSCT,
504 constexpr float twoPi = 2.*
M_PI;
511 double dzdrmin = 1./std::tan(2.*std::atan(std::exp(-IRD.
etaMinus())));
512 double dzdrmax = 1./std::tan(2.*std::atan(std::exp(-IRD.
etaPlus ())));
514 data.zminB = IRD.
zedMinus()-data.zbeam[0];
515 data.zmaxB = IRD.
zedPlus ()-data.zbeam[0];
516 data.zminU = data.zminB+550.f*float(dzdrmin);
517 data.zmaxU = data.zmaxB+550.f*float(dzdrmax);
520 if (fmin > fmax) fmin -= twoPi;
521 data.ftrig = (fmin+fmax)*.5f;
522 data.ftrigW = (fmax-fmin)*.5f;
538 if (lv.begin()!=lv.end()) mode = 1;
541 if (newv || !data.state || data.nspoint!=2 || data.mode!=mode || data.nlist) {
542 data.i_seede_Pro = data.l_seeds_Pro.begin();
553 data.i_seed_Pro = data.l_seeds_Pro.begin();
556 if (msgLvl(MSG::DEBUG)) {
576 if (lv.begin()!=lv.end()) mode = 3;
583 if (newv || !data.state || data.nspoint!=3 || data.mode!=mode || data.nlist) {
584 data.i_seede_Pro = data.l_seeds_Pro.begin();
597 data.i_seed_Pro = data.l_seeds_Pro.begin();
600 if (msgLvl(MSG::DEBUG)) {
617 data.zminU = ZVertex[0];
619 data.zmaxU = ZVertex[1];
624 if (lv.begin()!=lv.end()) mode = 3;
631 if (newv || !data.state || data.nspoint!=3 || data.mode!=mode || data.nlist) {
632 data.i_seede_Pro = data.l_seeds_Pro.begin();
645 data.i_seed_Pro = data.l_seeds_Pro.begin();
647 if (msgLvl(MSG::DEBUG)) {
667 if (lv.begin()!=lv.end()) mode = 6;
670 if (newv || !data.state || data.nspoint!=4 || data.mode!=mode || data.nlist) {
671 data.i_seede_Pro = data.l_seeds_Pro.begin();
682 data.i_seed_Pro = data.l_seeds_Pro.begin();
684 if (msgLvl(MSG::DEBUG)) {
698 if (data.nprint)
return dumpEvent(data, out);
710 for (
int i=0; i<n; ++i) s2.append(
" ");
714 for (
int i=0; i<n; ++i) s3.append(
" ");
718 for (
int i=0; i<n; ++i) s4.append(
" ");
722 for (
int i=0; i<n; ++i) s5.append(
" ");
725 out<<
"|---------------------------------------------------------------------|"
739 <<std::setw(12)<<
m_sct
744 out<<
"| maxSizeSP | "
747 out<<
"| pTmin (mev) | "
748 <<std::setw(12)<<std::setprecision(5)<<
m_ptmin
750 out<<
"| max radius SP | "
751 <<std::setw(12)<<std::setprecision(5)<<
m_r_rmax
753 out<<
"| radius step | "
754 <<std::setw(12)<<std::setprecision(5)<<
m_binSizeR
756 out<<
"| min Z-vertex position | "
757 <<std::setw(12)<<std::setprecision(5)<<
m_zmin
759 out<<
"| max Z-vertex position | "
760 <<std::setw(12)<<std::setprecision(5)<<
m_zmax
762 out<<
"| min radius first SP(2) | "
763 <<std::setw(12)<<std::setprecision(5)<<
m_r1minv
765 out<<
"| min radius second SP(2) | "
766 <<std::setw(12)<<std::setprecision(5)<<
m_r2minv
768 out<<
"| max radius first SP(2) | "
769 <<std::setw(12)<<std::setprecision(5)<<
m_r1maxv
771 out<<
"| max radius second SP(2) | "
772 <<std::setw(12)<<std::setprecision(5)<<
m_r2maxv
774 out<<
"| min space points dR | "
775 <<std::setw(12)<<std::setprecision(5)<<
m_drmin
777 out<<
"| max space points dR | "
778 <<std::setw(12)<<std::setprecision(5)<<
m_drmax
780 out<<
"| max dZ impact | "
781 <<std::setw(12)<<std::setprecision(5)<<
m_dzver
783 out<<
"| max dZ/dR impact | "
784 <<std::setw(12)<<std::setprecision(5)<<
m_dzdrver
786 out<<
"| max impact | "
789 out<<
"| max impact sss | "
792 out<<
"|---------------------------------------------------------------------|"
794 out<<
"| Beam X center | "
795 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[0]
797 out<<
"| Beam Y center | "
798 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[0]
800 out<<
"| Beam Z center | "
801 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[0]
803 out<<
"| Beam X-axis direction | "
804 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[1]
805 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[2]
806 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[3]
808 out<<
"| Beam Y-axis direction | "
809 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[1]
810 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[2]
811 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[3]
813 out<<
"| Beam Z-axis direction | "
814 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[1]
815 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[2]
816 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[3]
818 out<<
"|---------------------------------------------------------------------|"
829 out<<
"|---------------------------------------------------------------------|"
832 <<std::setw(12)<<data.ns
835 <<std::setw(12)<<data.nsaz
838 <<std::setw(12)<<data.nsazv
841 <<std::setw(12)<<data.l_seeds_Pro.size()
843 out<<
"|---------------------------------------------------------------------|"
854 if (data.endlist)
return;
856 data.i_seede_Pro = data.l_seeds_Pro.begin();
862 data.i_seed_Pro = data.l_seeds_Pro.begin();
872 unsigned int s1 = data.l_vertex.size();
873 unsigned int s2 = lV.size();
876 data.isvertex =
false;
879 if (s1==0 && s2==0)
return false;
882 data.l_vertex.clear();
884 if (s2 == 0)
return false;
887 data.isvertex =
true;
889 data.l_vertex.insert(
static_cast<float>(v.position().z()));
894 data.zminU = (*data.l_vertex. begin())-20.f;
896 data.zmaxU = (*data.l_vertex.rbegin())+20.f;
946 constexpr float twoPi = 2.f*
M_PI;
950 const float inverseSizePhiMax =
static_cast<float>(nPhiBinsMax)/twoPi;
959 constexpr float inverseSizePhiMin = 100./60.;
969 constexpr float radiusPixelStart = 33.;
970 constexpr float radiusPixelEnd = 150.;
976 constexpr float radiusSctStart = 295.; ;
977 constexpr float radiusSctEnd = 560.;
1003 const float inverseBinSizePhiVertexMax =
static_cast<float>(nPhiBinsVertexMax)/twoPi;
1014 for (
int phiBin=0; phiBin<=
m_maxPhiBin; ++phiBin) {
1016 int phiBelow = phiBin-1;
1019 int phiAbove = phiBin+1;
1131 int phiBinBelow = phiBin-1;
1134 int phiBinTop = phiBin+1;
1141 int twoDbinLowerPhi = phiBinBelow*
arraySizeZV+zbin;
1142 int twoDbinHigherPhi = phiBinTop*
arraySizeZV+zbin;
1177 double tx = std::tan(beamSpotHandle->beamTilt(0));
1178 double ty = std::tan(beamSpotHandle->beamTilt(1));
1180 double phi = std::atan2(ty,tx);
1181 double theta = std::acos(1./std::sqrt(1.+tx*tx+ty*ty));
1182 double sinTheta = std::sin(
theta);
1183 double cosTheta = std::cos(
theta);
1184 double sinPhi = std::sin(
phi);
1185 double cosPhi = std::cos(
phi);
1187 data.xbeam[0] =
static_cast<float>(bsCentre.x());
1188 data.xbeam[1] =
static_cast<float>(cosTheta*cosPhi*cosPhi+sinPhi*sinPhi);
1189 data.xbeam[2] =
static_cast<float>(cosTheta*sinPhi*cosPhi-sinPhi*cosPhi);
1190 data.xbeam[3] =-
static_cast<float>(sinTheta*cosPhi );
1192 data.ybeam[0] =
static_cast<float>(bsCentre.y());
1193 data.ybeam[1] =
static_cast<float>(cosTheta*cosPhi*sinPhi-sinPhi*cosPhi);
1194 data.ybeam[2] =
static_cast<float>(cosTheta*sinPhi*sinPhi+cosPhi*cosPhi);
1195 data.ybeam[3] =-
static_cast<float>(sinTheta*sinPhi );
1197 data.zbeam[0] =
static_cast<float>(bsCentre.z());
1198 data.zbeam[1] =
static_cast<float>(sinTheta*cosPhi);
1199 data.zbeam[2] =
static_cast<float>(sinTheta*sinPhi);
1200 data.zbeam[3] =
static_cast<float>(cosTheta);
1210 r[0] =
static_cast<float>(
sp->globalPosition().
x())-data.xbeam[0];
1211 r[1] =
static_cast<float>(
sp->globalPosition().
y())-data.ybeam[0];
1212 r[2] =
static_cast<float>(
sp->globalPosition().
z())-data.zbeam[0];
1221 constexpr float twoPi = 2.*
M_PI;
1223 int firstRadialBin = 0;
1239 const std::map<float, int> ztoBin{
1253 for (
int radialBin=data.r_first; radialBin<
m_nBinsR; ++radialBin) {
1256 if (!data.r_map[radialBin])
continue;
1258 if (firstRadialBin == 0) firstRadialBin = radialBin;
1261 if (data.iteration) {
1268 if (!data.r_Sorted[radialBin].front()->spacepoint->clusterList().second) {
1283 else if (radialBin > 175) {
1292 float Phi = SP->phi();
1293 if (Phi<0.) Phi+=twoPi;
1310 auto bound = ztoBin.lower_bound(Z);
1312 if (bound == ztoBin.end()){
1323 data.rfz_Sorted[twoDbin].push_back(SP);
1327 if (!data.rfz_map[twoDbin]++) data.rfz_index[data.nrfz++] = twoDbin;
1351 float Rm = pTmin/.6f;
1359 float worstCaseD0 = maxd0;
1360 if (maxd0 > Rmin) worstCaseD0 = Rmin;
1362 float sI = std::abs(std::asin(worstCaseD0/Rmin) - std::asin(worstCaseD0/Rmax));
1363 float sF = std::abs(std::asin(std::min(1.f,Rmax/(2.f*Rm))) -
1364 std::asin(std::min(1.f,Rmin/(2.f*Rm))));
1376 for (
int i=0; i<data.nrfz; ++i) {
1377 int n = data.rfz_index[i];
1378 data.rfz_map[n] = 0;
1379 data.rfz_Sorted[n].clear();
1382 for (
int i=0; i<data.nrfzv; ++i) {
1383 int n = data.rfzv_index[i];
1384 data.rfzv_map[n] = 0;
1385 data.rfzv_Sorted[n].clear();
1406 if (data.nsazv<2)
return;
1408 std::vector<InDet::SiSpacePointForSeed*>::iterator r0,r0e,
r,
re;
1418 if (!data.endlist)
z = data.zMin;
1422 if (!data.rfzv_map[
a])
continue;
1423 r0 = data.rfzv_Sorted[
a].begin();
1424 r0e = data.rfzv_Sorted[
a].end ();
1426 if (!data.endlist) {
1428 data.endlist =
true;
1433 for (; r0!=r0e; ++r0) {
1435 float X = (*r0)->x();
1436 float Y = (*r0)->y();
1437 float R = (*r0)->radius();
1440 float Z = (*r0)->z();
1447 for (
int i=0; i<numberBottomCells; ++i) {
1450 if (!data.rfzv_map[an])
continue;
1452 r = data.rfzv_Sorted[an].begin();
1453 re = data.rfzv_Sorted[an].end();
1455 for (;
r!=
re; ++
r) {
1457 float Rb =(*r)->radius();
1463 float dZ = Z-(*r)->z();
1465 if (Tz<data.dzdrmin || Tz>data.dzdrmax)
continue;
1474 float dx =(*r)->x()-
X;
1475 float dy =(*r)->y()-Y;
1476 float x = dx*ax+dy*ay;
1477 float y =-dx*ay+dy*ax;
1479 if (xy == 0.)
continue;
1483 float UR = Ut*R+1.f;
1484 if (UR == 0.)
continue;
1487 if (std::abs(B*data.K) >
m_ipt*std::sqrt(1.f+
A*
A))
continue;
1501 data.endlist =
true;
1512 if (data.nsaz<3)
return;
1535 const std::array<int,arraySizeZ> zBinIndex {5,6,7,8,9,10,4,3,2,1,0};
1542 std::array<std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> iter_endBottomCands;
1547 data.endlist =
true;
1550 for (
int phiBin=data.fNmin; phiBin<=
m_maxPhiBin; ++phiBin) {
1555 if (!data.endlist)
z = data.zMin;
1565 if (!data.rfz_map[phiZbin])
continue;
1569 int numberBottomCells = 0;
1570 int numberTopCells = 0;
1576 for (
int neighbourCellNumber=0; neighbourCellNumber<
m_nNeighbourCellsBottom[phiZbin]; ++neighbourCellNumber) {
1580 if (!data.rfz_map[theNeighbourCell])
continue;
1583 iter_bottomCands [numberBottomCells] = data.rfz_Sorted[theNeighbourCell].begin();
1585 iter_endBottomCands[numberBottomCells++] = data.rfz_Sorted[theNeighbourCell].end();
1592 for (
int neighbourCellNumber=0; neighbourCellNumber<
m_nNeighbourCellsTop[phiZbin]; ++neighbourCellNumber) {
1596 if (!data.rfz_map[theNeighbourCell])
continue;
1599 iter_topCands [numberTopCells] = data.rfz_Sorted[theNeighbourCell].begin();
1601 iter_endTopCands[numberTopCells++] = data.rfz_Sorted[theNeighbourCell].end();
1605 if (!data.trigger)
production3Sp (data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed,zBinIndex[
z]);
1606 else production3SpTrigger(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1617 data.fNmin = phiBin+1;
1622 data.endlist =
true;
1631 std::array <std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> & iter_bottomCands ,
1632 std::array <std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> & iter_endBottomCands,
1633 std::array <std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> & iter_topCands ,
1634 std::array <std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> & iter_endTopCands,
1635 const int numberBottomCells,
const int numberTopCells,
int& nseed,
const int zbin)
const
1644 std::vector<InDet::SiSpacePointForSeed*>::iterator iter_centralSP=iter_bottomCands[0];
1645 std::vector<InDet::SiSpacePointForSeed*>::iterator iter_otherSP;
1654 bool isStrip = ((*iter_centralSP)->spacepoint->clusterList().second);
1658 bool isBarrelRegion = (zbin >=4 && zbin <= 6);
1659 bool isTransitionRegion = (zbin == 3 || zbin == 7);
1663 if (isBarrelRegion){
1671 if (isBarrelRegion){
1675 else if (isTransitionRegion){
1683 for(; iter_centralSP!=iter_endBottomCands[0]; ++iter_centralSP) {
1684 if((*iter_centralSP)->radius() > rmin)
break;
1689 iter_topCands[0] = iter_centralSP;
1693 const float ipt2K = data.ipt2K;
1694 const float ipt2C = data.ipt2C;
1695 const float COFK = data.COFK;
1698 const float zmin = data.zminU;
1699 const float zmax = data.zmaxU;
1700 const float dzdrmax = data.dzdrmax;
1701 const float dzdrmin = data.dzdrmin;
1706 size_t SPcapacity = data.SP.size();
1709 for (; iter_centralSP!=iter_endBottomCands[0]; ++iter_centralSP) {
1711 const float& R = (*iter_centralSP)->radius();
1715 const float&
X = (*iter_centralSP)->x();
1716 const float& Y = (*iter_centralSP)->y();
1717 const float& Z = (*iter_centralSP)->z();
1721 double absZ = std::abs(Z);
1723 if (isStrip && absZ > 2650. )
continue;
1725 if (!isStrip && absZ > 600.)
continue;
1727 if (isStrip && isTransitionRegion && absZ < 750. && R > 450.)
continue;
1735 for (
int cell=0; cell<numberBottomCells; ++cell) {
1737 for (iter_otherSP=iter_bottomCands[cell]; iter_otherSP!=iter_endBottomCands[cell]; ++iter_otherSP) {
1740 const float& Rb =(*iter_otherSP)->radius();
1746 iter_bottomCands[cell]=iter_otherSP;
1751 if (dR <
m_drmin || (data.iteration && (*iter_otherSP)->spacepoint->clusterList().second))
break;
1754 const float dZdR = (Z-(*iter_otherSP)->z())/dR;
1756 const float absdZdR = std::abs(dZdR);
1758 if (absdZdR < dzdrmin or absdZdR > dzdrmax)
continue;
1762 const float z0 = Z-R*dZdR;
1763 if(z0 > zmax || z0 < zmin)
continue;
1765 data.SP[Nb] = (*iter_otherSP);
1770 if (++Nb==SPcapacity){
1771 data.resizeSPCont();
1772 SPcapacity=data.SP.size();
1788 for (
int cell=0; cell<numberTopCells; ++cell) {
1790 for (iter_otherSP=iter_topCands[cell];iter_otherSP!=iter_endTopCands[cell]; ++iter_otherSP) {
1793 float Rt =(*iter_otherSP)->radius();
1798 iter_topCands[cell]=iter_otherSP;
1805 float dZdR = ((*iter_otherSP)->z()-Z)/dR;
1806 float absdZdR = std::abs(dZdR);
1807 if (absdZdR < dzdrmin or absdZdR > dzdrmax)
continue;
1811 float z0 = Z-R*dZdR;
1812 if(z0 > zmax || z0 < zmin)
continue;
1814 data.SP[Nt] = (*iter_otherSP);
1819 if (++Nt==SPcapacity) {
1820 data.resizeSPCont();
1821 SPcapacity=data.SP.size();
1827 if (!(Nt-Nb))
continue;
1830 float covr0 = (*iter_centralSP)->covr ();
1831 float covz0 = (*iter_centralSP)->covz ();
1839 for (
size_t i=0; i<Nt; ++i) {
1845 float dx =
sp->x()-
X;
1846 float dy =
sp->y()-Y;
1847 float dz =
sp->z()-Z;
1848 float x = dx*ax+dy*ay;
1849 float y = dy*ax-dx*ay;
1852 float r2 = 1.f/(
x*
x+
y*
y);
1854 float dr = std::sqrt(r2);
1861 if (i < Nb) tz = -tz;
1865 data.Zo[i] = Z-R*tz;
1869 data.Er[i] = ((covz0+
sp->covz())+(tz*tz)*(covr0+
sp->covr()))*r2;
1873 data.mapOneSeeds_Pro.clear();
1877 for (
size_t b=0; b<Nb; ++b) {
1880 float Zob = data.Zo[b];
1881 float Tzb = data.Tz[b];
1882 float Erb = data.Er[b];
1883 float Vb = data.V [b];
1884 float Ub = data.U [b];
1885 float Tzb2 = (1.f+Tzb*Tzb);
1886 float sTzb2 = std::sqrt(Tzb2);
1887 float sigmaSquaredScatteringPtDependent = Tzb2*COFK;
1888 float sigmaSquaredScatteringMinPt = Tzb2*ipt2C;
1891 float d0max = maxd0cut;
1893 if (data.SP[b]->spacepoint->clusterList().second) d0max = maxd0cutstrips;
1896 for (
size_t t=Nb; t<Nt; ++t) {
1904 float meanOneOverTanTheta = (Tzb+data.Tz[t])/2.f;
1908 theta = std::atan(1.f/meanOneOverTanTheta);
1911 float sigmaSquaredSpacePointErrors = Erb+data.Er[t]
1912 + 2.f * covz0 * data.R[t]*data.R[b]
1913 + 2.f * covr0 * data.R[t]*data.R[b] * meanOneOverTanTheta * meanOneOverTanTheta;
1915 float remainingSquaredDelta = (Tzb-data.Tz[t])*(Tzb-data.Tz[t]) - sigmaSquaredSpacePointErrors;
1919 if (remainingSquaredDelta - sigmaSquaredScatteringMinPt > 0 )
continue;
1942 float deltaU = data.U[t]-Ub;
1943 if (deltaU == 0.)
continue;
1944 float A = (data.V[t]-Vb)/deltaU;
1946 float onePlusAsquare = 1.f+
A*
A;
1947 float BSquare = B*B;
1961 if (BSquare > ipt2K*onePlusAsquare || remainingSquaredDelta*onePlusAsquare > BSquare*sigmaSquaredScatteringPtDependent)
continue;
1979 if(std::abs(B) < 1e-10) d0 = std::abs((
A-B*R)*R);
1982 float x0 = -
A/(2.f*B);
1983 float rTrack = std::sqrt(onePlusAsquare/BSquare)*.5f;
1984 d0 = std::abs(-rTrack + std::sqrt(rTrack*rTrack +2.f*x0*R +R*R));
1990 float dr = data.R[b];
1991 if (data.R[t] < data.R[b]) dr = data.R[t];
1995 data.SP[t]->setScorePenalty(std::abs((Tzb-data.Tz[t])/(dr*sTzb2)));
1996 data.SP[t]->setParam(d0);
2000 data.SP[t]->setEta(-std::log(std::tan(0.5f*
theta)));
2001 data.SP[t]->setPt(std::sqrt(onePlusAsquare/BSquare)/(1000.f*data.K));
2004 data.CmSp.emplace_back(B/std::sqrt(onePlusAsquare), data.SP[t]);
2011 if (!data.CmSp.empty()) {
2017 nseed += data.fillOneSeeds;
2032 const int numberBottomCells,
const int numberTopCells,
int& nseed)
const
2034 constexpr float twoPi = 2.*
M_PI;
2036 std::vector<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],
r;
2040 if((*r0)->spacepoint->clusterList().second) {
2045 for(; r0!=rbe[0]; ++r0) {
if((*r0)->radius() > rmin)
break;}
2046 rt[0] = r0; ++rt[0];
2048 float ipt2K = data.ipt2K;
2049 float ipt2C = data.ipt2C;
2050 float COFK = data.COFK;
2058 for (; r0!=rbe[0]; ++r0) {
2061 data.mapOneSeeds_Pro.clear();
2063 float R = (*r0)->radius();
2067 float X = (*r0)->x();
2068 float Y = (*r0)->y();
2069 float Z = (*r0)->z();
2074 for (
int i=0; i<numberBottomCells; ++i) {
2076 for (
r=rb[i];
r!=rbe[i]; ++
r) {
2078 float Rb =(*r)->radius();
2085 if ((*r)->sur()==sur0)
continue;
2087 if (dR <
m_drmin || (data.iteration && (*r)->spacepoint->clusterList().second))
break;
2091 float Tz = (Z-(*r)->z())/dR;
2093 if (Zo < data.zminB || Zo > data.zmaxB)
continue;
2094 float Zu = Z+(550.f-R)*Tz;
2095 if (Zu < data.zminU || Zu > data.zmaxU)
continue;
2106 for (
int i=0; i<numberTopCells; ++i) {
2108 for (
r=rt[i];
r!=rte[i]; ++
r) {
2110 float Rt =(*r)->radius();
2118 if ((*r)->sur()==sur0)
continue;
2122 float Tz = ((*r)->z()-Z)/dR;
2124 if (Zo < data.zminB || Zo > data.zmaxB)
continue;
2125 float Zu = Z+(550.f-R)*Tz;
2126 if (Zu < data.zminU || Zu > data.zmaxU)
continue;
2133 if (!(Nt-Nb))
continue;
2134 float covr0 = (*r0)->covr ();
2135 float covz0 = (*r0)->covz ();
2140 for (
int i=0; i<Nt; ++i) {
2144 float dx =
sp->x()-
X;
2145 float dy =
sp->y()-Y;
2146 float dz =
sp->z()-Z;
2147 float x = dx*ax+dy*ay;
2148 float y = dy*ax-dx*ay;
2149 float r2 = 1.f/(
x*
x+
y*
y);
2150 float dr = std::sqrt(r2);
2152 if (i < Nb) tz = -tz;
2155 data.Zo[i] = Z-R*tz;
2159 data.Er[i] = ((covz0+
sp->covz())+(tz*tz)*(covr0+
sp->covr()))*r2;
2166 for (
int b=0; b<Nb; ++b) {
2168 float Zob = data.Zo[b];
2169 float Tzb = data.Tz[b];
2170 float Rb2r = data.R [b]*covr0;
2171 float Rb2z = data.R [b]*covz0;
2172 float Erb = data.Er[b];
2173 float Vb = data.V [b];
2174 float Ub = data.U [b];
2175 float Tzb2 = (1.f+Tzb*Tzb);
2176 float CSA = Tzb2*COFK;
2177 float ICSA = Tzb2*ipt2C;
2178 float d0max = maxd0cut;
2179 if (data.SP[b]->spacepoint->clusterList().second) d0max = maxd0cutstrips;
2181 for (
int t=Nb; t<Nt; ++t) {
2183 float dT = ((Tzb-data.Tz[t])*(Tzb-data.Tz[t])-data.R[t]*Rb2z-(Erb+data.Er[t]))-(data.R[t]*Rb2r)*((Tzb+data.Tz[t])*(Tzb+data.Tz[t]));
2184 if ( dT > ICSA)
continue;
2186 float deltaU = data.U[t]-Ub;
2187 if (deltaU == 0.)
continue;
2188 float A = (data.V[t]-Vb)/deltaU;
2189 float onePlusAsquare = 1.f+
A*
A;
2191 float BSquare = B*B;
2192 if (BSquare > ipt2K*onePlusAsquare || dT*onePlusAsquare > BSquare*CSA)
continue;
2194 float Im = std::abs((
A-B*R)*R);
2195 if (Im > d0max)
continue;
2200 float x = 2.f*B*R-
A;
2201 float df = std::abs(std::atan2(ay*
y-ax*
x,ax*
y+ay*
x)-data.ftrig);
2202 if (df >
M_PI) df = twoPi-df;
2203 if (df > data.ftrigW)
continue;
2204 data.CmSp.emplace_back(B/std::sqrt(onePlusAsquare), data.SP[t]);
2205 data.SP[t]->setParam(Im);
2207 if (!data.CmSp.empty()) {
2212 nseed += data.fillOneSeeds;
2226 float worstQualityInMap = std::numeric_limits<float>::min();
2228 if (!data.mapOneSeeds_Pro.empty()) {
2229 std::multimap<float,InDet::SiSpacePointsProSeed*>::reverse_iterator l = data.mapOneSeeds_Pro.rbegin();
2230 worstQualityInMap = (*l).first;
2231 worstSeedSoFar = (*l).second;
2235 if (data.nOneSeeds < data.maxSeedsPerSP
2238 || (data.keepAllConfirmedSeeds && worstQualityInMap <= seedCandidateQuality &&
isConfirmedSeed(p1,p3,seedCandidateQuality) && data.nOneSeeds < data.seedPerSpCapacity)
2241 || (data.keepAllConfirmedSeeds && worstQualityInMap > seedCandidateQuality && worstSeedSoFar
2244 data.OneSeeds_Pro[data.nOneSeeds].set(p1,p2,p3,
z);
2245 data.mapOneSeeds_Pro.insert(std::make_pair(seedCandidateQuality, &data.OneSeeds_Pro[data.nOneSeeds]));
2249 else if (worstSeedSoFar && (worstQualityInMap > seedCandidateQuality)){
2251 worstSeedSoFar->
set(p1,p2,p3,
z);
2253 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator
2254 i = data.mapOneSeeds_Pro.insert(std::make_pair(seedCandidateQuality,worstSeedSoFar));
2256 for (++i; i!=data.mapOneSeeds_Pro.end(); ++i) {
2257 if ((*i).second==worstSeedSoFar) {
2258 data.mapOneSeeds_Pro.erase(i);
2270 float computeEta(
float r,
float z) {
2271 if (
r <= 10e-9)
return 0;
2272 auto asinh = [] (
double x) {
return std::log (std::sqrt (
x*
x+1) +
x); };
2273 return asinh (
z /
r);
2280 constexpr float curvatureInterval = .00003;
2283 float bottomSPQuality = SPb->
quality();
2284 float centralSPQuality = SP0->
quality();
2289 float bottomR=SPb->
radius();
2290 float bottomZ=SPb->
z();
2292 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>
::iterator it_otherSP;
2293 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>
::iterator it_commonTopSP = data.CmSp.begin(), ie = data.CmSp.end();
2294 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>
::iterator it_startInnerLoop=it_commonTopSP;
2297 for (; it_commonTopSP!=ie; ++it_commonTopSP) {
2300 float seedIP = (*it_commonTopSP).second->param();
2301 float seedQuality = seedIP + (*it_commonTopSP).second->scorePenalty();
2302 float originalSeedQuality = seedQuality;
2310 float topR=(*it_commonTopSP).second->radius();
2311 float topZ=(*it_commonTopSP).second->z();
2313 float Zot = std::abs(topR - bottomR) > 10e-9 ?
2314 bottomZ - (bottomR - originalSeedQuality) * ((topZ - bottomZ) / (topR - bottomR)) : bottomZ;
2316 float eta1 = computeEta(topR - bottomR, topZ - bottomZ);
2317 float eta0 = computeEta(seedIP, Zot);
2319 float deltaEta=std::abs(eta1-eta0);
2321 float f=std::min(0.5f,originalSeedQuality/200.f);
2322 seedQuality*=(1.f-f)/300.f;
2323 seedQuality+=f*deltaEta/2.5f;
2326 bool topSPisPixel = !(*it_commonTopSP).second->spacepoint->clusterList().second;
2329 const Trk::Surface* surfaceTopSP = (*it_commonTopSP).second->sur ();
2330 float radiusTopSP = (*it_commonTopSP).second->radius();
2332 float minCurvature =(*it_commonTopSP).first-curvatureInterval;
2333 float maxCurvature =(*it_commonTopSP).first+curvatureInterval;
2354 for (it_otherSP=it_startInnerLoop; it_otherSP!=ie; ++it_otherSP) {
2356 if ( it_otherSP == it_commonTopSP )
continue;
2359 if ( (*it_otherSP).first < minCurvature ) {
2360 it_startInnerLoop=it_otherSP;
2361 ++it_startInnerLoop;
2365 if ( (*it_otherSP).first > maxCurvature )
break;
2367 if ( (*it_otherSP).second->sur()==surfaceTopSP)
continue;
2369 float radiusOtherSP = (*it_otherSP).second->radius();
2370 if (std::abs(radiusOtherSP-radiusTopSP) <
m_drmin)
continue;
2378 if (seedQuality > data.maxScore)
continue;
2382 if (bottomSPisPixel!=topSPisPixel) {
2383 if (seedQuality > 0. ||
2384 (seedQuality > bottomSPQuality && seedQuality > centralSPQuality && seedQuality > (*it_commonTopSP).second->quality())
2394 if (seedIP > maxdImpact)
continue;
2397 newOneSeed(data, SPb, SP0, (*it_commonTopSP).second, Zob, seedQuality);
2409 data.fillOneSeeds = 0;
2411 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_firstSeedCandidate = data.mapOneSeeds_Pro.begin();
2412 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_seedCandidate = data.mapOneSeeds_Pro.begin();
2413 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_endSeedCandidates = data.mapOneSeeds_Pro.end();
2416 if (it_seedCandidate==it_endSeedCandidates)
return;
2421 for (; it_seedCandidate!=it_endSeedCandidates; ++it_seedCandidate) {
2424 float quality = (*it_seedCandidate).first;
2425 theSeed = (*it_seedCandidate).second;
2432 if (data.i_seede_Pro!=data.l_seeds_Pro.end()) {
2433 theSeed = &(*data.i_seede_Pro++);
2434 *theSeed = *(*it_seedCandidate).second;
2437 data.l_seeds_Pro.emplace_back(*(*it_seedCandidate).second);
2440 data.i_seede_Pro = data.l_seeds_Pro.end();
2443 ++data.fillOneSeeds;
2452 if (data.nspoint==3) {
2455 if (data.i_seed_Pro==data.i_seede_Pro) {
2463 if (data.i_seed_Pro==data.i_seede_Pro)
return nullptr;
2466 }
while (!(*data.i_seed_Pro++).set3(data.seedOutput));
2469 return &data.seedOutput;
2472 if (data.i_seed_Pro==data.i_seede_Pro) {
2475 if (data.i_seed_Pro==data.i_seede_Pro)
return nullptr;
2477 (*data.i_seed_Pro++).set2(data.seedOutput);
2478 return &data.seedOutput;
2491 if(track !=
nullptr) {
2492 m_trackPt = (track->trackParameters()->front()->pT())/1000.f;
2493 m_trackEta = std::abs(track->trackParameters()->front()->eta());
2500 m_z0 = seed->zVertex();
2501 m_eta = seed->eta();
2515 m_dzdr_b = seed->dzdr_b();
2516 m_dzdr_t = seed->dzdr_t();
2518 m_givesTrack = !(track ==
nullptr);
2519 m_eventNumber = eventNumber;
2530(
EventData& data,
const float Zv,
const float R,
const float T)
const
2532 if (Zv < data.zminU or Zv > data.zmaxU)
return false;
2533 if (not data.isvertex)
return true;
2534 if (data.l_vertex.empty())
return false;
2536 float dZmin = std::numeric_limits<float>::max();
2537 for (
const float& v: data.l_vertex) {
2538 float dZ = std::abs(v-Zv);
2539 if (dZ >= dZmin)
break;
2559 std::array<float,3>
r{0,0,0};
2563 if (data.checketa) {
2565 float x =
r[0]*data.dzdrmin;
2566 float y =
r[1]*data.dzdrmin;
2567 if ((
z*
z )<(
x*
x+
y*
y))
return sps;
2572 if (data.i_spforseed!=data.l_spforseed.end()) {
2574 sps = &(*data.i_spforseed++);
2580 data.l_spforseed.emplace_back(
sp,
r);
2582 sps = &(data.l_spforseed.back());
2584 data.i_spforseed = data.l_spforseed.end();
2599 if (data.i_seede_Pro!=data.l_seeds_Pro.end()) {
2601 s->set(p1, p2, p3,
z);
2603 data.l_seeds_Pro.emplace_back(p1, p2, p3,
z);
2604 data.i_seede_Pro = data.l_seeds_Pro.end();
2611 data.initialize(EventData::ToolType::ATLxk,
2633 else return (quality < 0.);
Scalar phi() const
phi method
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.
Define macros for attributes used to control the static checker.
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.
virtual double phiPlus() const =0
extreme phi values
virtual double zedPlus() const =0
the zed and eta values at the most forward and most rear ends of the RoI
virtual double phiMinus() const =0
virtual double zedMinus() const =0
virtual double etaMinus() const =0
virtual double etaPlus() const =0
This is a "hash" representation of an Identifier.
Class to hold geometrical description of a silicon detector element.
const Trk::SpacePoint * spacepoint
float quality() const
penalty term in the seed score
void set(const Trk::SpacePoint *, std::span< float const, 3 >)
SiSpacePointForSeed * spacepoint0()
void set(SiSpacePointForSeed *&, SiSpacePointForSeed *&, SiSpacePointForSeed *&, float)
SiSpacePointForSeed * spacepoint2()
FloatProperty m_maxScore
Maximum score to accept.
float m_dzdrmax0
implicitly store eta cut
float m_d0 ATLAS_THREAD_SAFE
FloatProperty m_dImpactCutSlopeUnconfirmedPPP
virtual bool getWriteNtupleBoolProperty() const override
FloatProperty m_maxdImpactSSS
static void newSeed(EventData &data, SiSpacePointForSeed *&p1, SiSpacePointForSeed *&p2, float z)
SG::ReadHandleKey< SpacePointContainer > m_spacepointsSCT
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
void newOneSeed(EventData &data, SiSpacePointForSeed *&p1, SiSpacePointForSeed *&p2, SiSpacePointForSeed *&p3, float z, float quality) const
This inserts a seed into the set of saved seeds.
std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZV > m_neighboursVertexPhiZ
virtual void newRegion(const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vSCT) const override
Initialize tool for new region.
void fillSeeds(EventData &data) const
fills the seeds from the mapOneSeeds_Pro member into the l_seeds_Pro member of the data object,...
int m_maxPhiBin
number of bins in phi
FloatProperty m_seedScoreBonusSSS
virtual void find2Sp(EventData &data, const std::list< Trk::Vertex > &lv) const override
With two space points with or without vertex constraint.
float m_seedScoreThresholdPPPConfirmationSeed
Seed score thresholds defined based on the modifiers defined as configurables above.
FloatProperty m_seedScoreBonusConfirmationSeed
IntegerProperty m_maxsizeSP
SG::ReadHandleKey< SpacePointContainer > m_spacepointsPixel
FloatProperty m_fieldScale
int m_maxBinPhiVertex
number of bins in phi for vertices
void buildFrameWork()
prepare several data members with cached cut values, conversion factors, binnings,...
BooleanProperty m_optimisePhiBinning
This flag will make the buildFrameWork method determine an optimal phi binning of the search regions ...
bool newVertices(EventData &data, const std::list< Trk::Vertex > &lV) const
This method updates the EventData based on the passed list of vertices.
BooleanProperty m_alwaysKeepConfirmedStripSeeds
FloatProperty m_maxdImpactDecays
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
SiSpacePointsSeedMaker_ATLxk()=delete
std::array< int, arraySizePhiZ > m_nNeighbourCellsBottom
arrays associating bins to each other for SP formation
FloatProperty m_dImpactCutSlopeUnconfirmedSSS
these flags allow to dynamically tighten the d0 cut on non-confirmed seeds based on the penalty score...
void production2Sp(EventData &data) const
BooleanProperty m_checketa
void fillLists(EventData &data) const
this method populates the data object's "histograms" (implemented as nested vectors).
MsgStream & dumpConditions(EventData &data, MsgStream &out) const
Dumps conditions information into the MsgStream.
void production3SpTrigger(EventData &data, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rb, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rbe, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rt, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rte, const int numberBottomCells, const int numberTopCells, int &nseed) const
as above, but for the trigger
void findNext(EventData &data) const
This method is called within next() when we are out of vertices.
static void convertToBeamFrameWork(EventData &data, const Trk::SpacePoint *const &sp, std::array< float, 3 > &r)
This method popualtes the r array with the space point's coordinates relative to the beam spot.
SiSpacePointForSeed * newSpacePoint(EventData &data, const Trk::SpacePoint *const &sp) const
Create a SiSpacePointForSeed from the space point.
static constexpr float m_radiusCutIBL
We detect IBL hits via the seed radial location.
IntegerProperty m_maxsize
virtual void findVSp(const EventContext &ctx, EventData &data, const std::list< Trk::Vertex > &lv) const override
with variable number space points with or without vertex constraint Variable means (2,...
float m_seedScoreThresholdSSSConfirmationSeed
max (score is assigned negative sign) score for SSS seeds with confirmation seed requirement.
FloatProperty m_seedScoreBonusPPP
Scoring modifiers applied when ranking seeds.
bool isConfirmedSeed(const InDet::SiSpacePointForSeed *bottomSP, const InDet::SiSpacePointForSeed *topSP, float quality) const
Helper method to determine if a seed is 'confirmed' - this means that a second seed exists with compa...
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
Read handle for conditions object to get the field cache.
float m_inverseBinSizePhiVertex
as above but for vertex
BooleanProperty m_useOverlap
std::array< int, arraySizePhiZV > m_nNeighboursVertexPhiZ
FloatProperty m_maxdImpact
IntegerProperty m_maxOneSizePPP
SG::ReadHandleKey< SpacePointOverlapCollection > m_spacepointsOverlap
virtual void newEvent(const EventContext &ctx, EventData &data, int iteration) const override
Initialize tool for new event.
float m_inverseBinSizePhi
cache the inverse bin size in phi which we use - needed to evaluate phi bin locations
static void erase(EventData &data)
BooleanProperty m_alwaysKeepConfirmedPixelSeeds
This flag will lead to all confirmed seeds (seeds where a second compatible seed with a different top...
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsBottom
mapping of neighbour cells in the 2D phi-z binning to consider for the "bottom SP" search for central...
bool isUsed(const Trk::SpacePoint *sp, const Trk::PRDtoTrackMap &prd_to_track_map) const
int m_nBinsR
number of bins in the radial coordinate
virtual StatusCode initialize() override
Initialisation.
IntegerProperty m_maxOneSizeSSS
maximum number of seeds to keep per central space point.
void buildBeamFrameWork(EventData &data) const
Initiate beam frame work for seed generator.
float m_ipt2
inverse square of 90% of the pt min cut
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
virtual StatusCode finalize() override
Finalize.
static constexpr float m_COF
appears to be an approximated term related to multiple-scattering of particles traversing the ID duri...
void initializeEventData(EventData &data) const
void newOneSeedWithCurvaturesComparison(EventData &data, SiSpacePointForSeed *&SPb, SiSpacePointForSeed *&SP0, float Zob) const
This creates all possible seeds with the passed central and bottom SP, using all top SP candidates wh...
ServiceHandle< ITHistSvc > m_thistSvc
virtual const SiSpacePointsSeed * next(const EventContext &ctx, EventData &data) const override
This method will update the data.seedOutput member to be the next seed pointed at by the data....
virtual MsgStream & dump(EventData &data, MsgStream &out) const override
Dumps relevant information into the MsgStream.
std::array< int, arraySizePhiZ > m_nNeighbourCellsTop
number of neighbouring phi-z bins to consider when looking for "top SP" candidates for each phi-z bin
bool isZCompatible(EventData &data, const float Zv, const float R, const float T) const
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsTop
mapping of neighbour cells in the 2D phi-z binning to consider for the "top SP" search for central SP...
Gaudi::Property< bool > m_writeNtuple
Flag to write validation ntuples. Turned off by default.
float m_ipt
inverse of 90% of the ptmin cut
@ arraySizeZV
array size in z for vertexing
@ arraySizePhiZ
capacity for the 2D phi-z arrays
@ arraySizePhi
capacity of the 1D phi arrays
@ arraySizeNeighbourBins
array size to store neighbouring phi-z-regions in the seed finding
@ arraySizeZ
capacity of the 1D z arrays
@ arraySizePhiZV
array size in phi-Z 2D for the vertexing
@ arraySizePhiV
array size in phi for vertexing
void production3Sp(EventData &data) const
Top-level method for 3-SP seed production.
static MsgStream & dumpEvent(EventData &data, MsgStream &out)
Dumps event information into the MsgStream.
float m_dzdrmin0
conversion factors and cached cut values
static float azimuthalStep(const float pTmin, const float maxd0, const float Rmin, const float Rmax)
Determine the expected azimuthal trajectory displacement in phi in presence of the magnetic field for...
virtual void writeNtuple(const SiSpacePointsSeed *seed, const Trk::Track *track, int seedType, long eventNumber) const override
This method is called by the SiSPSeededTrackFinder algorithm to fill ntuples for seeds seen by the al...
SiSpacePointsSeedMakerEventData EventData
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
Eigen::Matrix< double, 3, 1 > Vector3D
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
hold the test vectors and ease the comparison
Tell the compiler to optimize assuming that FP may trap.
#define CXXUTILS_TRAPPING_FP