27(
const std::string& t,
const std::string& n,
const IInterface* p)
38 StatusCode
sc = AlgTool::initialize();
75 return AlgTool::finalize();
89 data.i_spforseed = data.l_spforseed.begin();
92 std::array<float, 4> errorsc = {16.,16.,100.,16.};
98 if (!prd_to_track_map.
isValid()) {
101 prd_to_track_map_cptr=prd_to_track_map.
cptr();
109 if (spacepointsPixel.
isValid()) {
116 if (prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr))
continue;
118 int ir =
static_cast<int>((
sp->globalPosition().
y()+
m_r_rmax)*irstep);
120 data.r_Sorted[
ir].push_back(sps);
122 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
134 if (spacepointsSCT.
isValid()) {
141 if (prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr))
continue;
143 int ir =
static_cast<int>((
sp->globalPosition().
y()+
m_r_rmax)*irstep);
145 data.r_Sorted[
ir].push_back(sps);
147 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
158 if (spacepointsOverlap.
isValid()) {
164 if (prd_to_track_map_cptr &&
isUsed(
sp, *prd_to_track_map_cptr))
continue;
166 int ir =
static_cast<int>((
sp->globalPosition().
y()+
m_r_rmax)*irstep);
168 data.r_Sorted[
ir].push_back(sps);
170 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
184(
const EventContext& ctx,
EventData& data,
185 const std::vector<IdentifierHash>& vPixel,
const std::vector<IdentifierHash>& vSCT)
const
191 data.i_spforseed = data.l_spforseed.begin();
194 std::array<float, 4> errorsc = {16.,16.,100.,16.};
200 if (!prd_to_track_map.
isValid()) {
203 prd_to_track_map_cptr = prd_to_track_map.
cptr();
208 if (
m_pixel && !vPixel.empty()) {
211 if (spacepointsPixel.
isValid()) {
215 const auto *w = spacepointsPixel->indexFindPtr(l);
216 if (w==
nullptr)
continue;
220 if (prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr))
continue;
222 int ir =
static_cast<int>((
sp->globalPosition().
y()+
m_r_rmax)*irstep);
224 data.r_Sorted[
ir].push_back(sps);
226 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
235 if (
m_sct && !vSCT.empty()) {
238 if (spacepointsSCT.
isValid()) {
243 const auto *w = spacepointsSCT->indexFindPtr(l);
244 if (w==
nullptr)
continue;
248 if (prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr))
continue;
250 int ir =
static_cast<int>((
sp->globalPosition().
y()+
m_r_rmax)*irstep);
252 data.r_Sorted[
ir].push_back(sps);
254 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
268(
const EventContext& ctx,
EventData& data,
269 const std::vector<IdentifierHash>& vPixel,
const std::vector<IdentifierHash>& vSCT,
const IRoiDescriptor&)
const
284 if (lv.begin()!=lv.end()) mode = 1;
287 data.l_seeds_map.erase(data.l_seeds_map.begin(),data.l_seeds_map.end());
289 if ( !data.state || data.nspoint!=2 || data.mode!=mode || data.nlist) {
301 data.i_seed_map = data.l_seeds_map.begin();
302 data.i_seede_map = data.l_seeds_map.end ();
320 if (lv.begin()!=lv.end()) mode = 3;
323 data.l_seeds_map.erase(data.l_seeds_map.begin(),data.l_seeds_map.end());
325 if (!data.state || data.nspoint!=3 || data.mode!=mode || data.nlist) {
331 data.endlist = true ;
337 data.i_seed_map = data.l_seeds_map.begin();
338 data.i_seede_map = data.l_seeds_map.end ();
362 if (lv.begin()!=lv.end()) mode = 6;
364 if (!data.state || data.nspoint!=4 || data.mode!=mode || data.nlist) {
370 data.endlist = true ;
376 data.i_seed_map = data.l_seeds_map.begin();
377 data.i_seede_map = data.l_seeds_map.end ();
393 if (data.nprint)
return dumpEvent(data, out);
404 std::string s2;
for (
int i=0; i<n; ++i) s2.append(
" "); s2.append(
"|");
406 std::string s3;
for (
int i=0; i<n; ++i) s3.append(
" "); s3.append(
"|");
408 std::string s4;
for (
int i=0; i<n; ++i) s4.append(
" "); s4.append(
"|");
411 out<<
"|---------------------------------------------------------------------|"
423 <<std::setw(12)<<
m_sct
428 out<<
"| maxSizeSP | "
431 out<<
"| pTmin (mev) | "
432 <<std::setw(12)<<std::setprecision(5)<<
m_ptmin
435 <<std::setw(12)<<std::setprecision(5)<<
m_etamax
437 out<<
"| max radius SP | "
438 <<std::setw(12)<<std::setprecision(5)<<
m_r_rmax
440 out<<
"| radius step | "
441 <<std::setw(12)<<std::setprecision(5)<<
m_r_rstep
443 out<<
"| min space points dR | "
444 <<std::setw(12)<<std::setprecision(5)<<
m_drmin
446 out<<
"| max space points dR | "
447 <<std::setw(12)<<std::setprecision(5)<<
m_drmax
449 out<<
"|---------------------------------------------------------------------|"
460 out<<
"|---------------------------------------------------------------------|"
463 <<std::setw(12)<<data.ns
465 out<<
"| data.nsaz | "
466 <<std::setw(12)<<data.nsaz
469 <<std::setw(12)<<data.l_seeds_map.size()
471 out<<
"|---------------------------------------------------------------------|"
492 constexpr float pi2 = 2.*
M_PI;
494 const float sFmax =
static_cast<float>(NFmax)/pi2;
495 const float sFmin = 50./60.;
499 else if (
m_sF < sFmin)
m_sF = sFmin;
505 for (
int f=0; f<=
m_fNmax; ++f) {
506 int fb = f-1;
if (fb<0 ) fb=
m_fNmax;
507 int ft = f+1;
if (ft>
m_fNmax) ft=0;
579 constexpr float pi2 = 2.*
M_PI;
582 if (!data.r_map[i])
continue;
593 data.rf_Sorted[f].push_back(
r);
594 if (!data.rf_map[f]++) data.rf_index[data.nrf++] = f;
601 Z< 250.?
z=5:Z< 450.?
z=6:Z< 925.?
z=7:Z< 1400.?
z=8:Z< 2500.?
z=9:
z=10;
603 Z>-250.?
z=5:Z>-450.?
z=4:Z>-925.?
z=3:Z>-1400.?
z=2:Z>-2500.?
z=1:
z= 0;
607 data.rfz_Sorted[n].push_back(
r);
608 if (!data.rfz_map[n]++) data.rfz_index[data.nrfz++] = n;
610 data.r_Sorted[i].clear();
623 for (
int i=0; i<data.nr; ++i) {
624 int n = data.r_index[i];
626 data.r_Sorted[n].erase(data.r_Sorted[n].begin(), data.r_Sorted[n].end());
629 for (
int i=0; i>data.nrf; ++i) {
630 int n = data.rf_index[i];
632 data.rf_Sorted[n].erase(data.rf_Sorted[n].begin(), data.rf_Sorted[n].end());
635 for (
int i=0; i<data.nrfz; ++i) {
636 int n = data.rfz_index[i];
638 data.rfz_Sorted[n].erase(data.rfz_Sorted[n].begin(), data.rfz_Sorted[n].end());
664 if (data.nsaz<3)
return;
668 double f[3], gP[3] ={10.,10.,0.};
674 if (fieldCondObj ==
nullptr) {
687 float ipt = 100000000.;
690 const int ZI[
SizeZ]= {5,6,7,8,9,10,4,3,2,1,0};
691 std::vector<InDet::SiSpacePointForSeed*>::iterator rt[9],rte[9],rb[9],rbe[9];
695 for (
int f=data.fNmin; f<=
m_fNmax; ++f) {
699 if (!data.endlist)
z = data.zMin;
703 if (!data.rfz_map[
a])
continue;
708 if (!data.rfz_map[an])
continue;
709 rb [NB] = data.rfz_Sorted[an].begin();
710 rbe[NB++] = data.rfz_Sorted[an].end();
714 if (!data.rfz_map[an])
continue;
715 rt [NT] = data.rfz_Sorted[an].begin();
716 rte[NT++] = data.rfz_Sorted[an].end();
719 if (!data.endlist) {data.fNmin=f; data.zMin =
z;
return;}
732 float ipt = 100000000.;
734 const int ZI[
SizeZ]= {5,6,7,8,9,10,4,3,2,1,0};
735 std::vector<InDet::SiSpacePointForSeed*>::iterator rt[9],rte[9],rb[9],rbe[9];
739 for (
int f=data.fNmin; f<=
m_fNmax; ++f) {
743 if (!data.endlist)
z = data.zMin;
747 if (!data.rfz_map[
a])
continue;
751 if (!data.rfz_map[an])
continue;
752 rb [NB] = data.rfz_Sorted[an].begin();
753 rbe[NB++] = data.rfz_Sorted[an].end();
757 if (!data.rfz_map[an])
continue;
758 rt [NT] = data.rfz_Sorted[an].begin();
759 rte[NT++] = data.rfz_Sorted[an].end();
762 if (!data.endlist) {data.fNmin=f; data.zMin =
z;
return;}
774 std::vector<InDet::SiSpacePointForSeed*>::iterator* rb ,
775 std::vector<InDet::SiSpacePointForSeed*>::iterator* rbe,
776 std::vector<InDet::SiSpacePointForSeed*>::iterator* rt ,
777 std::vector<InDet::SiSpacePointForSeed*>::iterator* rte,
778 int NB,
int NT,
float K,
float ipt)
const
780 const float COF = 134*.05*9.;
782 std::vector<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],
r;
783 if (!data.endlist) {r0 = data.rMin; data.endlist =
true;}
787 for (; r0!=rbe[0]; ++r0) {
789 if ((*r0)->spacepoint->clusterList().second)
pix =
false;
790 float R = (*r0)->radius();
792 float X = (*r0)->x() ;
793 float Y = (*r0)->y() ;
794 float Z = (*r0)->z() ;
797 float covr0 = (*r0)->covr ();
798 float covz0 = (*r0)->covz ();
803 for (
int i=0; i<NB; ++i) {
804 for (
r=rb[i];
r!=rbe[i]; ++
r) {
805 float dy = (*r)->y()-Y ;
807 if (-dy >
m_drmax || (*r)->sur()==sur0)
continue;
809 if (!
pix && !(*r)->spacepoint->clusterList().second)
continue;
810 if (
pix && (*r)->spacepoint->clusterList().second)
continue;
812 float dx = (*r)->x()-X;
813 float dz = (*r)->z()-Z;
815 float x = dx*ax+dy*ay ;
816 float y =-dx*ay+dy*ax ;
817 float r2 = 1.f/(
x*
x+
y*
y);
818 float dr = std::sqrt(r2);
819 data.Tz[Nb] = -dz*dr;
826 data.Er[Nb] = (covz0+data.SP[Nb]->covz()+data.Tz[Nb]*data.Tz[Nb]*(covr0+data.SP[Nb]->covr()))*r2;
838 for (
int i=0; i<NT; ++i) {
839 for (
r=rt[i];
r!=rte[i]; ++
r) {
840 float dy = (*r)->y()-Y ;
841 if (dy <
m_drmin) {rt[i]=
r;
continue;}
843 if ((*r)->sur()==sur0)
continue;
845 if (
pix && (*r)->spacepoint->clusterList().second)
continue;
846 if (!
pix && !(*r)->spacepoint->clusterList().second)
continue;
848 float dx = (*r)->x()-X;
849 float dz = (*r)->z()-Z;
851 float x = dx*ax+dy*ay;
852 float y =-dx*ay+dy*ax;
853 float r2 = 1.f/(
x*
x+
y*
y);
854 float dr = std::sqrt(r2);
861 data.Er[Nt] = (covz0+data.SP[Nt]->covz()+data.Tz[Nt]*data.Tz[Nt]*(covr0+data.SP[Nt]->covr()))*r2;
869 if (!(Nt-Nb))
continue;
873 for (
int b=Nb-1; b>=0; --b) {
874 float SA = 1.+data.Tz[b]*data.Tz[b];
875 for (
int t=Nb; t<Nt; ++t) {
876 float Ts = .5f*(data.Tz[b]+data.Tz[t]);
877 float dt = data.Tz[b]-data.Tz[t] ;
878 float dT = dt*dt-data.Er[b]-data.Er[t]-2.*data.R[b]*data.R[t]*(Ts*Ts*covr0+covz0);
879 if ( dT > 0. && dT > (ipt*ipt)*COF*SA )
continue;
880 float dU = data.U[t]-data.U[b];
if (dU == 0.)
continue;
881 float A = (data.V[t]-data.V[b])/dU ;
882 float B = data.V[t]-
A*data.U[t] ;
884 float S = std::sqrt(
S2) ;
885 float BK = std::abs(B*K) ;
886 if (BK > ipt*S) continue ;
887 dT -= ((BK*BK)*COF*SA/
S2) ;
888 if (dT > 0.) continue ;
889 dT*= ((data.R[b]*data.R[t])/(data.R[b]+data.R[t]));
891 newSeed(data, data.SP[b]->spacepoint,(*r0)->spacepoint,data.SP[t]->spacepoint,dT);
903 std::vector<InDet::SiSpacePointForSeed*>::iterator* rb ,
904 std::vector<InDet::SiSpacePointForSeed*>::iterator* rbe,
905 std::vector<InDet::SiSpacePointForSeed*>::iterator* rt ,
906 std::vector<InDet::SiSpacePointForSeed*>::iterator* rte,
907 int NB,
int NT,
float ipt)
const
909 const float COF = 134*.05*9.;
910 const float dFcut = .96 ;
912 std::vector<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],
r;
913 if (!data.endlist) {r0 = data.rMin; data.endlist =
true;}
917 for (; r0!=rbe[0]; ++r0) {
919 if ((*r0)->spacepoint->clusterList().second)
pix =
false;
921 float X = (*r0)->x() ;
922 float Y = (*r0)->y() ;
923 float Z = (*r0)->z() ;
924 float covr0 = (*r0)->covr ();
925 float covz0 = (*r0)->covz ();
931 for (
int i=0; i<NB; ++i) {
932 for (
r=rb[i];
r!=rbe[i]; ++
r) {
933 float dy = Y-(*r)->y() ;
935 if ( dy >
m_drmax || (*r)->sur()==sur0)
continue;
937 if (!
pix && !(*r)->spacepoint->clusterList().second)
continue;
938 if (
pix && (*r)->spacepoint->clusterList().second)
continue;
940 float dx = X-(*r)->x();
941 float dz = Z-(*r)->z();
942 float r2 = 1.f/(dx*dx+dy*dy);
943 float dr = std::sqrt(r2);
950 data.Er[Nb] = (covz0+data.SP[Nb]->covz()+data.Tz[Nb]*data.Tz[Nb]*(covr0+data.SP[Nb]->covr()))*r2;
962 for (
int i=0; i<NT; ++i) {
963 for (
r=rt[i];
r!=rte[i]; ++
r) {
964 float dy = (*r)->y()-Y ;
965 if (dy <
m_drmin) {rt[i]=
r;
continue;}
967 if ((*r)->sur()==sur0)
continue;
969 if (
pix && (*r)->spacepoint->clusterList().second)
continue;
970 if (!
pix && !(*r)->spacepoint->clusterList().second)
continue;
972 float dx = (*r)->x()-X;
973 float dz = (*r)->z()-Z;
974 float r2 = 1.f/(dx*dx+dy*dy);
975 float dr = std::sqrt(r2);
982 data.Er[Nt] = (covz0+data.SP[Nt]->covz()+data.Tz[Nt]*data.Tz[Nt]*(covr0+data.SP[Nt]->covr()))*r2;
990 if (!(Nt-Nb))
continue;
994 for (
int b=Nb-1; b>=0; --b) {
995 float SA = 1.f+data.Tz[b]*data.Tz[b];
996 for (
int t=Nb; t<Nt; ++t) {
999 float dF = data.U[b]*data.U[t]+data.V[b]*data.V[t];
1000 if (dF < dFcut)
continue;
1004 float Ts = .5f*(data.Tz[b]+data.Tz[t]);
1005 float dT = data.Tz[b]-data.Tz[t] ;
1006 dT = dT*dT-data.Er[b]-data.Er[t]-2.f*data.R[b]*data.R[t]*(Ts*Ts*covr0+covz0);
1007 dT -= (ipt*ipt)*COF*SA ;
1008 if ( dT > 0. ) continue ;
1010 dT*= ((data.R[b]*data.R[t])/(data.R[b]+data.R[t]));
1012 newSeed(data, data.SP[b]->spacepoint,(*r0)->spacepoint,data.SP[t]->spacepoint,dT);
1026 if (data.i_seed_map==data.i_seede_map)
return nullptr;
1041 std::array<float, 3>
r = {
static_cast<float>(
sp->globalPosition().
x()),
1042 static_cast<float>(
sp->globalPosition().
y()),
1043 static_cast<float>(
sp->globalPosition().
z())};
1045 if (data.i_spforseed!=data.l_spforseed.end()) {
1046 sps = &(*data.i_spforseed++);
1049 data.l_spforseed.emplace_back(
sp,
r);
1050 sps = &(data.l_spforseed.back());
1051 data.i_spforseed = data.l_spforseed.end();
1066 std::array<float,3>
r;
1067 r[0]=
sp->globalPosition().x();
1068 r[1]=
sp->globalPosition().y();
1069 r[2]=
sp->globalPosition().z();
1071 if (data.i_spforseed!=data.l_spforseed.end()) {
1072 sps = &(*data.i_spforseed++);
1075 data.l_spforseed.emplace_back(
sp,
r,
sc);
1076 sps = &(data.l_spforseed.back());
1077 data.i_spforseed = data.l_spforseed.end();
1090 const float&
z)
const
1093 data.seeds[data.nseeds].erase ( );
1094 data.seeds[data.nseeds].add (p1);
1095 data.seeds[data.nseeds].add (p2);
1096 data.seeds[data.nseeds].setZVertex(0.);
1097 data.l_seeds_map.insert(std::make_pair(
z, &(data.seeds[data.nseeds])));
1100 std::multimap<float,InDet::SiSpacePointsSeed*>::reverse_iterator l = data.l_seeds_map.rbegin();
1101 if ((*l).first <=
z)
return;
1103 data.l_seeds_map.erase((*l).first);
1109 data.l_seeds_map.insert(std::make_pair(
z,s));
1123 data.seeds[data.nseeds].erase ( );
1124 data.seeds[data.nseeds].add (p1);
1125 data.seeds[data.nseeds].add (p2);
1126 data.seeds[data.nseeds].add (p3);
1127 data.seeds[data.nseeds].setZVertex(0.);
1128 data.l_seeds_map.insert(std::make_pair(
z, &(data.seeds[data.nseeds])));
1131 std::multimap<float,InDet::SiSpacePointsSeed*>::reverse_iterator l = data.l_seeds_map.rbegin();
1132 if ((*l).first <=
z)
return;
1134 data.l_seeds_map.erase((*l).first);
1141 data.l_seeds_map.insert(std::make_pair(
z,s));
1146 data.initialize(EventData::ToolType::Cosmic,
#define ATH_CHECK
Evaluate an expression and check for errors.
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 >)
int m_rfz_ib[SizeRFZ][SizeI]
void production3Sp(const EventContext &ctx, EventData &data) const
virtual StatusCode initialize() override
virtual void newEvent(const EventContext &ctx, EventData &data, int iteration) const override
static void erase(EventData &data)
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
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,...
FloatProperty m_fieldScale
IntegerProperty m_maxsizeSP
virtual MsgStream & dump(EventData &data, MsgStream &out) const override
MsgStream & dumpConditions(MsgStream &out) const
void production3SpWithoutField(EventData &data) const
SG::ReadHandleKey< SpacePointContainer > m_spacepointsPixel
static void production2Sp(EventData &data)
BooleanProperty m_useOverlap
void newSeed(EventData &data, const Trk::SpacePoint *&, const Trk::SpacePoint *&, const float &) const
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
static SiSpacePointForSeed * newSpacePoint(EventData &data, const Trk::SpacePoint *const &)
IntegerProperty m_maxsize
void fillLists(EventData &data) const
virtual void writeNtuple(const SiSpacePointsSeed *seed, const Trk::Track *track, int seedType, long eventNumber) const override
virtual const SiSpacePointsSeed * next(const EventContext &ctx, EventData &data) const override
virtual bool getWriteNtupleBoolProperty() const override
static MsgStream & dumpEvent(EventData &data, MsgStream &out)
virtual void find2Sp(EventData &data, const std::list< Trk::Vertex > &lv) const override
with two space points with or without vertex constraint
bool isUsed(const Trk::SpacePoint *, const Trk::PRDtoTrackMap &prd_to_track_map) const
SG::ReadHandleKey< SpacePointContainer > m_spacepointsSCT
SiSpacePointsSeedMaker_Cosmic()=delete
virtual StatusCode finalize() override
void initializeEventData(EventData &data) const
int m_rfz_it[SizeRFZ][SizeI]
virtual void newRegion(const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vSCT) const override
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
SG::ReadHandleKey< SpacePointOverlapCollection > m_spacepointsOverlap
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.
Abstract Base Class for tracking surfaces.
int ir
counter of the current depth
hold the test vectors and ease the comparison