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;
1582 iter_bottomCands [numberBottomCells] = data.rfz_Sorted[theNeighbourCell].begin();
1583 iter_endBottomCands[numberBottomCells++] = data.rfz_Sorted[theNeighbourCell].end();
1590 for (
int neighbourCellNumber=0; neighbourCellNumber<
m_nNeighbourCellsTop[phiZbin]; ++neighbourCellNumber) {
1594 if (!data.rfz_map[theNeighbourCell])
continue;
1596 iter_topCands [numberTopCells] = data.rfz_Sorted[theNeighbourCell].begin();
1597 iter_endTopCands[numberTopCells++] = data.rfz_Sorted[theNeighbourCell].end();
1601 if (!data.trigger)
production3Sp (data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed,zBinIndex[
z]);
1602 else production3SpTrigger(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1613 data.fNmin = phiBin+1;
1618 data.endlist =
true;
1627 std::array <std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> & iter_bottomCands ,
1628 std::array <std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> & iter_endBottomCands,
1629 std::array <std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> & iter_topCands ,
1630 std::array <std::vector<InDet::SiSpacePointForSeed*>::iterator,
arraySizeNeighbourBins> & iter_endTopCands,
1631 const int numberBottomCells,
const int numberTopCells,
int& nseed,
const int zbin)
const
1640 std::vector<InDet::SiSpacePointForSeed*>::iterator iter_centralSP=iter_bottomCands[0];
1641 std::vector<InDet::SiSpacePointForSeed*>::iterator iter_otherSP;
1650 bool isStrip = ((*iter_centralSP)->spacepoint->clusterList().second);
1654 bool isBarrelRegion = (zbin >=4 && zbin <= 6);
1655 bool isTransitionRegion = (zbin == 3 || zbin == 7);
1659 if (isBarrelRegion){
1667 if (isBarrelRegion){
1671 else if (isTransitionRegion){
1679 for(; iter_centralSP!=iter_endBottomCands[0]; ++iter_centralSP) {
1680 if((*iter_centralSP)->radius() > rmin)
break;
1685 iter_topCands[0] = iter_centralSP;
1689 const float ipt2K = data.ipt2K;
1690 const float ipt2C = data.ipt2C;
1691 const float COFK = data.COFK;
1694 const float zmin = data.zminU;
1695 const float zmax = data.zmaxU;
1696 const float dzdrmax = data.dzdrmax;
1697 const float dzdrmin = data.dzdrmin;
1702 size_t SPcapacity = data.SP.size();
1705 for (; iter_centralSP!=iter_endBottomCands[0]; ++iter_centralSP) {
1707 const float& R = (*iter_centralSP)->radius();
1711 const float& X = (*iter_centralSP)->x();
1712 const float& Y = (*iter_centralSP)->y();
1713 const float& Z = (*iter_centralSP)->z();
1717 double absZ = std::abs(Z);
1719 if (isStrip && absZ > 2650. )
continue;
1721 if (!isStrip && absZ > 600.)
continue;
1723 if (isStrip && isTransitionRegion && absZ < 750. && R > 450.)
continue;
1731 for (
int cell=0; cell<numberBottomCells; ++cell) {
1733 for (iter_otherSP=iter_bottomCands[cell]; iter_otherSP!=iter_endBottomCands[cell]; ++iter_otherSP) {
1736 const float& Rb =(*iter_otherSP)->radius();
1742 iter_bottomCands[cell]=iter_otherSP;
1747 if (dR <
m_drmin || (data.iteration && (*iter_otherSP)->spacepoint->clusterList().second))
break;
1750 const float dZdR = (Z-(*iter_otherSP)->z())/dR;
1752 const float absdZdR = std::abs(dZdR);
1754 if (absdZdR < dzdrmin or absdZdR > dzdrmax)
continue;
1758 const float z0 = Z-R*dZdR;
1759 if(z0 > zmax || z0 < zmin)
continue;
1761 data.SP[Nb] = (*iter_otherSP);
1766 if (++Nb==SPcapacity){
1767 data.resizeSPCont();
1768 SPcapacity=data.SP.size();
1784 for (
int cell=0; cell<numberTopCells; ++cell) {
1786 for (iter_otherSP=iter_topCands[cell];iter_otherSP!=iter_endTopCands[cell]; ++iter_otherSP) {
1789 float Rt =(*iter_otherSP)->radius();
1794 iter_topCands[cell]=iter_otherSP;
1801 float dZdR = ((*iter_otherSP)->z()-Z)/dR;
1802 float absdZdR = std::abs(dZdR);
1803 if (absdZdR < dzdrmin or absdZdR > dzdrmax)
continue;
1807 float z0 = Z-R*dZdR;
1808 if(z0 > zmax || z0 < zmin)
continue;
1810 data.SP[Nt] = (*iter_otherSP);
1815 if (++Nt==SPcapacity) {
1816 data.resizeSPCont();
1817 SPcapacity=data.SP.size();
1823 if (!(Nt-Nb))
continue;
1826 float covr0 = (*iter_centralSP)->covr ();
1827 float covz0 = (*iter_centralSP)->covz ();
1835 for (
size_t i=0; i<Nt; ++i) {
1841 float dx =
sp->x()-X;
1842 float dy =
sp->y()-Y;
1843 float dz =
sp->z()-Z;
1844 float x = dx*ax+dy*ay;
1845 float y = dy*ax-dx*ay;
1848 float r2 = 1.f/(
x*
x+
y*
y);
1850 float dr = std::sqrt(r2);
1857 if (i < Nb) tz = -tz;
1861 data.Zo[i] = Z-R*tz;
1865 data.Er[i] = ((covz0+
sp->covz())+(tz*tz)*(covr0+
sp->covr()))*r2;
1869 data.mapOneSeeds_Pro.clear();
1873 for (
size_t b=0; b<Nb; ++b) {
1876 float Zob = data.Zo[b];
1877 float Tzb = data.Tz[b];
1878 float Erb = data.Er[b];
1879 float Vb = data.V [b];
1880 float Ub = data.U [b];
1881 float Tzb2 = (1.f+Tzb*Tzb);
1882 float sTzb2 = std::sqrt(Tzb2);
1883 float sigmaSquaredScatteringPtDependent = Tzb2*COFK;
1884 float sigmaSquaredScatteringMinPt = Tzb2*ipt2C;
1887 float d0max = maxd0cut;
1889 if (data.SP[b]->spacepoint->clusterList().second) d0max = maxd0cutstrips;
1892 for (
size_t t=Nb; t<Nt; ++t) {
1900 float meanOneOverTanTheta = (Tzb+data.Tz[t])/2.f;
1904 theta = std::atan(1.f/meanOneOverTanTheta);
1907 float sigmaSquaredSpacePointErrors = Erb+data.Er[t]
1908 + 2.f * covz0 * data.R[t]*data.R[b]
1909 + 2.f * covr0 * data.R[t]*data.R[b] * meanOneOverTanTheta * meanOneOverTanTheta;
1911 float remainingSquaredDelta = (Tzb-data.Tz[t])*(Tzb-data.Tz[t]) - sigmaSquaredSpacePointErrors;
1915 if (remainingSquaredDelta - sigmaSquaredScatteringMinPt > 0 )
continue;
1938 float deltaU = data.U[t]-Ub;
1939 if (deltaU == 0.)
continue;
1940 float A = (data.V[t]-Vb)/deltaU;
1942 float onePlusAsquare = 1.f+
A*
A;
1943 float BSquare = B*B;
1957 if (BSquare > ipt2K*onePlusAsquare || remainingSquaredDelta*onePlusAsquare > BSquare*sigmaSquaredScatteringPtDependent)
continue;
1975 if(std::abs(B) < 1e-10) d0 = std::abs((
A-B*R)*R);
1978 float x0 = -
A/(2.f*B);
1979 float rTrack = std::sqrt(onePlusAsquare/BSquare)*.5f;
1980 d0 = std::abs(-rTrack + std::sqrt(rTrack*rTrack +2.f*x0*R +R*R));
1986 float dr = data.R[b];
1987 if (data.R[t] < data.R[b]) dr = data.R[t];
1991 data.SP[t]->setScorePenalty(std::abs((Tzb-data.Tz[t])/(dr*sTzb2)));
1992 data.SP[t]->setParam(d0);
1996 data.SP[t]->setEta(-std::log(std::tan(0.5f*
theta)));
1997 data.SP[t]->setPt(std::sqrt(onePlusAsquare/BSquare)/(1000.f*data.K));
2000 data.CmSp.emplace_back(B/std::sqrt(onePlusAsquare), data.SP[t]);
2007 if (!data.CmSp.empty()) {
2013 nseed += data.fillOneSeeds;
2028 const int numberBottomCells,
const int numberTopCells,
int& nseed)
const
2030 constexpr float twoPi = 2.*
M_PI;
2032 std::vector<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],
r;
2036 if((*r0)->spacepoint->clusterList().second) {
2041 for(; r0!=rbe[0]; ++r0) {
if((*r0)->radius() > rmin)
break;}
2042 rt[0] = r0; ++rt[0];
2044 float ipt2K = data.ipt2K;
2045 float ipt2C = data.ipt2C;
2046 float COFK = data.COFK;
2054 for (; r0!=rbe[0]; ++r0) {
2057 data.mapOneSeeds_Pro.clear();
2059 float R = (*r0)->radius();
2063 float X = (*r0)->x();
2064 float Y = (*r0)->y();
2065 float Z = (*r0)->z();
2070 for (
int i=0; i<numberBottomCells; ++i) {
2072 for (
r=rb[i];
r!=rbe[i]; ++
r) {
2074 float Rb =(*r)->radius();
2081 if ((*r)->sur()==sur0)
continue;
2083 if (dR <
m_drmin || (data.iteration && (*r)->spacepoint->clusterList().second))
break;
2087 float Tz = (Z-(*r)->z())/dR;
2089 if (Zo < data.zminB || Zo > data.zmaxB)
continue;
2090 float Zu = Z+(550.f-R)*Tz;
2091 if (Zu < data.zminU || Zu > data.zmaxU)
continue;
2102 for (
int i=0; i<numberTopCells; ++i) {
2104 for (
r=rt[i];
r!=rte[i]; ++
r) {
2106 float Rt =(*r)->radius();
2114 if ((*r)->sur()==sur0)
continue;
2118 float Tz = ((*r)->z()-Z)/dR;
2120 if (Zo < data.zminB || Zo > data.zmaxB)
continue;
2121 float Zu = Z+(550.f-R)*Tz;
2122 if (Zu < data.zminU || Zu > data.zmaxU)
continue;
2129 if (!(Nt-Nb))
continue;
2130 float covr0 = (*r0)->covr ();
2131 float covz0 = (*r0)->covz ();
2136 for (
int i=0; i<Nt; ++i) {
2140 float dx =
sp->x()-X;
2141 float dy =
sp->y()-Y;
2142 float dz =
sp->z()-Z;
2143 float x = dx*ax+dy*ay;
2144 float y = dy*ax-dx*ay;
2145 float r2 = 1.f/(
x*
x+
y*
y);
2146 float dr = std::sqrt(r2);
2148 if (i < Nb) tz = -tz;
2151 data.Zo[i] = Z-R*tz;
2155 data.Er[i] = ((covz0+
sp->covz())+(tz*tz)*(covr0+
sp->covr()))*r2;
2162 for (
int b=0; b<Nb; ++b) {
2164 float Zob = data.Zo[b];
2165 float Tzb = data.Tz[b];
2166 float Rb2r = data.R [b]*covr0;
2167 float Rb2z = data.R [b]*covz0;
2168 float Erb = data.Er[b];
2169 float Vb = data.V [b];
2170 float Ub = data.U [b];
2171 float Tzb2 = (1.f+Tzb*Tzb);
2172 float CSA = Tzb2*COFK;
2173 float ICSA = Tzb2*ipt2C;
2174 float d0max = maxd0cut;
2175 if (data.SP[b]->spacepoint->clusterList().second) d0max = maxd0cutstrips;
2177 for (
int t=Nb; t<Nt; ++t) {
2179 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]));
2180 if ( dT > ICSA)
continue;
2182 float deltaU = data.U[t]-Ub;
2183 if (deltaU == 0.)
continue;
2184 float A = (data.V[t]-Vb)/deltaU;
2185 float onePlusAsquare = 1.f+
A*
A;
2187 float BSquare = B*B;
2188 if (BSquare > ipt2K*onePlusAsquare || dT*onePlusAsquare > BSquare*CSA)
continue;
2190 float Im = std::abs((
A-B*R)*R);
2191 if (Im > d0max)
continue;
2196 float x = 2.f*B*R-
A;
2197 float df = std::abs(std::atan2(ay*
y-ax*
x,ax*
y+ay*
x)-data.ftrig);
2198 if (df >
M_PI) df = twoPi-df;
2199 if (df > data.ftrigW)
continue;
2200 data.CmSp.emplace_back(B/std::sqrt(onePlusAsquare), data.SP[t]);
2201 data.SP[t]->setParam(Im);
2203 if (!data.CmSp.empty()) {
2208 nseed += data.fillOneSeeds;
2222 float worstQualityInMap = std::numeric_limits<float>::min();
2224 if (!data.mapOneSeeds_Pro.empty()) {
2225 std::multimap<float,InDet::SiSpacePointsProSeed*>::reverse_iterator l = data.mapOneSeeds_Pro.rbegin();
2226 worstQualityInMap = (*l).first;
2227 worstSeedSoFar = (*l).second;
2231 if (data.nOneSeeds < data.maxSeedsPerSP
2234 || (data.keepAllConfirmedSeeds && worstQualityInMap <= seedCandidateQuality &&
isConfirmedSeed(p1,p3,seedCandidateQuality) && data.nOneSeeds < data.seedPerSpCapacity)
2237 || (data.keepAllConfirmedSeeds && worstQualityInMap > seedCandidateQuality && worstSeedSoFar
2240 data.OneSeeds_Pro[data.nOneSeeds].set(p1,p2,p3,
z);
2241 data.mapOneSeeds_Pro.insert(std::make_pair(seedCandidateQuality, &data.OneSeeds_Pro[data.nOneSeeds]));
2245 else if (worstSeedSoFar && (worstQualityInMap > seedCandidateQuality)){
2247 worstSeedSoFar->
set(p1,p2,p3,
z);
2249 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator
2250 i = data.mapOneSeeds_Pro.insert(std::make_pair(seedCandidateQuality,worstSeedSoFar));
2252 for (++i; i!=data.mapOneSeeds_Pro.end(); ++i) {
2253 if ((*i).second==worstSeedSoFar) {
2254 data.mapOneSeeds_Pro.erase(i);
2266 float computeEta(
float r,
float z) {
2267 if (
r <= 10e-9)
return 0;
2268 auto asinh = [] (
double x) {
return std::log (std::sqrt (
x*
x+1) +
x); };
2269 return asinh (
z /
r);
2276 constexpr float curvatureInterval = .00003;
2279 float bottomSPQuality = SPb->
quality();
2280 float centralSPQuality = SP0->
quality();
2285 float bottomR=SPb->
radius();
2286 float bottomZ=SPb->
z();
2288 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>
::iterator it_otherSP;
2289 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>
::iterator it_commonTopSP = data.CmSp.begin(), ie = data.CmSp.end();
2290 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>
::iterator it_startInnerLoop=it_commonTopSP;
2293 for (; it_commonTopSP!=ie; ++it_commonTopSP) {
2296 float seedIP = (*it_commonTopSP).second->param();
2297 float seedQuality = seedIP + (*it_commonTopSP).second->scorePenalty();
2298 float originalSeedQuality = seedQuality;
2306 float topR=(*it_commonTopSP).second->radius();
2307 float topZ=(*it_commonTopSP).second->z();
2309 float Zot = std::abs(topR - bottomR) > 10e-9 ?
2310 bottomZ - (bottomR - originalSeedQuality) * ((topZ - bottomZ) / (topR - bottomR)) : bottomZ;
2312 float eta1 = computeEta(topR - bottomR, topZ - bottomZ);
2313 float eta0 = computeEta(seedIP, Zot);
2315 float deltaEta=std::abs(eta1-eta0);
2317 float f=std::min(0.5f,originalSeedQuality/200.f);
2318 seedQuality*=(1.f-f)/300.f;
2319 seedQuality+=f*deltaEta/2.5f;
2322 bool topSPisPixel = !(*it_commonTopSP).second->spacepoint->clusterList().second;
2325 const Trk::Surface* surfaceTopSP = (*it_commonTopSP).second->sur ();
2326 float radiusTopSP = (*it_commonTopSP).second->radius();
2328 float minCurvature =(*it_commonTopSP).first-curvatureInterval;
2329 float maxCurvature =(*it_commonTopSP).first+curvatureInterval;
2350 for (it_otherSP=it_startInnerLoop; it_otherSP!=ie; ++it_otherSP) {
2352 if ( it_otherSP == it_commonTopSP )
continue;
2355 if ( (*it_otherSP).first < minCurvature ) {
2356 it_startInnerLoop=it_otherSP;
2357 ++it_startInnerLoop;
2361 if ( (*it_otherSP).first > maxCurvature )
break;
2363 if ( (*it_otherSP).second->sur()==surfaceTopSP)
continue;
2365 float radiusOtherSP = (*it_otherSP).second->radius();
2366 if (std::abs(radiusOtherSP-radiusTopSP) <
m_drmin)
continue;
2374 if (seedQuality > data.maxScore)
continue;
2378 if (bottomSPisPixel!=topSPisPixel) {
2379 if (seedQuality > 0. ||
2380 (seedQuality > bottomSPQuality && seedQuality > centralSPQuality && seedQuality > (*it_commonTopSP).second->quality())
2390 if (seedIP > maxdImpact)
continue;
2393 newOneSeed(data, SPb, SP0, (*it_commonTopSP).second, Zob, seedQuality);
2405 data.fillOneSeeds = 0;
2407 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_firstSeedCandidate = data.mapOneSeeds_Pro.begin();
2408 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_seedCandidate = data.mapOneSeeds_Pro.begin();
2409 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_endSeedCandidates = data.mapOneSeeds_Pro.end();
2412 if (it_seedCandidate==it_endSeedCandidates)
return;
2417 for (; it_seedCandidate!=it_endSeedCandidates; ++it_seedCandidate) {
2420 float quality = (*it_seedCandidate).first;
2421 theSeed = (*it_seedCandidate).second;
2428 if (data.i_seede_Pro!=data.l_seeds_Pro.end()) {
2429 theSeed = &(*data.i_seede_Pro++);
2430 *theSeed = *(*it_seedCandidate).second;
2433 data.l_seeds_Pro.emplace_back(*(*it_seedCandidate).second);
2436 data.i_seede_Pro = data.l_seeds_Pro.end();
2439 ++data.fillOneSeeds;
2448 if (data.nspoint==3) {
2451 if (data.i_seed_Pro==data.i_seede_Pro) {
2459 if (data.i_seed_Pro==data.i_seede_Pro)
return nullptr;
2462 }
while (!(*data.i_seed_Pro++).set3(data.seedOutput));
2465 return &data.seedOutput;
2468 if (data.i_seed_Pro==data.i_seede_Pro) {
2471 if (data.i_seed_Pro==data.i_seede_Pro)
return nullptr;
2473 (*data.i_seed_Pro++).set2(data.seedOutput);
2474 return &data.seedOutput;
2487 if(track !=
nullptr) {
2488 m_trackPt = (track->trackParameters()->front()->pT())/1000.f;
2489 m_trackEta = std::abs(track->trackParameters()->front()->eta());
2496 m_z0 = seed->zVertex();
2497 m_eta = seed->eta();
2511 m_dzdr_b = seed->dzdr_b();
2512 m_dzdr_t = seed->dzdr_t();
2514 m_givesTrack = !(track ==
nullptr);
2515 m_eventNumber = eventNumber;
2526(
EventData& data,
const float Zv,
const float R,
const float T)
const
2528 if (Zv < data.zminU or Zv > data.zmaxU)
return false;
2529 if (not data.isvertex)
return true;
2530 if (data.l_vertex.empty())
return false;
2532 float dZmin = std::numeric_limits<float>::max();
2533 for (
const float& v: data.l_vertex) {
2534 float dZ = std::abs(v-Zv);
2535 if (dZ >= dZmin)
break;
2555 std::array<float,3>
r{0,0,0};
2559 if (data.checketa) {
2561 float x =
r[0]*data.dzdrmin;
2562 float y =
r[1]*data.dzdrmin;
2563 if ((
z*
z )<(
x*
x+
y*
y))
return sps;
2568 if (data.i_spforseed!=data.l_spforseed.end()) {
2570 sps = &(*data.i_spforseed++);
2576 data.l_spforseed.emplace_back(
sp,
r);
2578 sps = &(data.l_spforseed.back());
2580 data.i_spforseed = data.l_spforseed.end();
2595 if (data.i_seede_Pro!=data.l_seeds_Pro.end()) {
2597 s->set(p1, p2, p3,
z);
2599 data.l_seeds_Pro.emplace_back(p1, p2, p3,
z);
2600 data.i_seede_Pro = data.l_seeds_Pro.end();
2607 data.initialize(EventData::ToolType::ATLxk,
2629 else return (quality < 0.);
Scalar phi() const
phi method
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
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