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);
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);
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);
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);
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);
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());
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());
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;
370 data.endlist = true ;
376 data.i_seed_map =
data.l_seeds_map.begin();
377 data.i_seede_map =
data.l_seeds_map.end ();
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);
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];
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();
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];
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();
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]);
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;
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 ;
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) {
1000 if (dF < dFcut)
continue;
1004 float Ts = .5f*(
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 ;
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
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));
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.
char data[hepevt_bytes_allocation_ATLAS]
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