28(
const std::string& t,
const std::string& n,
const IInterface* p)
39 StatusCode
sc = AlgTool::initialize();
79 return AlgTool::finalize();
95 double f[3], gP[3] ={10.,10.,0.};
101 if (fieldCondObj ==
nullptr) {
110 data.K = 2./(300.*f[2]);
112 data.K = 2./(300.* 5. );
115 data.i_spforseed = data.l_spforseed.begin();
124 if (!prd_to_track_map.
isValid()) {
127 prd_to_track_map_cptr = prd_to_track_map.
cptr();
135 if (spacepointsPixel.
isValid()) {
141 if (prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr))
continue;
143 int ir =
static_cast<int>(
r*irstep);
145 data.r_Sorted[
ir].push_back(sps);
147 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
159 if (spacepointsSCT.
isValid()) {
165 if (prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr))
continue;
167 int ir =
static_cast<int>(
r*irstep);
169 data.r_Sorted[
ir].push_back(sps);
171 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
182 if (spacepointsOverlap.
isValid()) {
188 if (prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr))
continue;
190 int ir =
static_cast<int>(
r*irstep);
192 data.r_Sorted[
ir].push_back(sps);
194 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
208(
const EventContext& ctx,
EventData& data,
209 const std::vector<IdentifierHash>& vPixel,
const std::vector<IdentifierHash>& vSCT)
const
218 double f[3], gP[3] ={10.,10.,0.};
224 if (fieldCondObj ==
nullptr) {
233 data.K = 2./(300.*f[2]);
235 data.K = 2./(300.* 5. );
238 data.i_spforseed = data.l_spforseed.begin();
246 if (!prd_to_track_map.
isValid()) {
249 prd_to_track_map_cptr = prd_to_track_map.
cptr();
254 if (
m_pixel && !vPixel.empty()) {
257 if (spacepointsPixel.
isValid()) {
262 const auto *w = spacepointsPixel->indexFindPtr(l);
263 if (w==
nullptr)
continue;
267 if (prd_to_track_map_cptr &&
isUsed(
sp, *prd_to_track_map_cptr))
continue;
268 int ir =
static_cast<int>(
r*irstep);
270 data.r_Sorted[
ir].push_back(sps);
272 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
281 if (
m_sct && !vSCT.empty()) {
284 if (spacepointsSCT.
isValid()) {
288 const auto *w = spacepointsSCT->indexFindPtr(l);
289 if (w==
nullptr)
continue;
293 if (prd_to_track_map_cptr &&
isUsed(
sp,*prd_to_track_map_cptr))
continue;
294 int ir =
static_cast<int>(
r*irstep);
296 data.r_Sorted[
ir].push_back(sps);
298 if (data.r_map[
ir]==1) data.r_index[data.nr++] =
ir;
313(
const EventContext& ctx,
EventData& data,
314 const std::vector<IdentifierHash>& vPixel,
const std::vector<IdentifierHash>& vSCT,
const IRoiDescriptor&)
const
329 if (lv.begin()!=lv.end()) mode = 1;
331 if (!data.state || data.nspoint!=2 || data.mode!=mode || data.nlist) {
332 data.i_seede = data.l_seeds.begin();
342 data.i_seed = data.l_seeds.begin();
360 if (lv.begin()!=lv.end()) mode = 3;
362 if (!data.state || data.nspoint!=3 || data.mode!=mode || data.nlist) {
363 data.i_seede = data.l_seeds.begin();
373 data.i_seed = data.l_seeds.begin();
396 if (lv.begin()!=lv.end()) mode = 6;
398 if (!data.state || data.nspoint!=4 || data.mode!=mode || data.nlist) {
399 data.i_seede = data.l_seeds.begin();
409 data.i_seed = data.l_seeds.begin();
425 if (data.nprint)
return dumpEvent(data, out);
436 std::string s2;
for (
int i=0; i<n; ++i) s2.append(
" "); s2.append(
"|");
438 std::string s3;
for (
int i=0; i<n; ++i) s3.append(
" "); s3.append(
"|");
440 std::string s4;
for (
int i=0; i<n; ++i) s4.append(
" "); s4.append(
"|");
442 std::string s5;
for (
int i=0; i<n; ++i) s5.append(
" "); s5.append(
"|");
445 out<<
"|---------------------------------------------------------------------|"
459 <<std::setw(12)<<
m_sct
464 out<<
"| maxSizeSP | "
467 out<<
"| pTmin (mev) | "
468 <<std::setw(12)<<std::setprecision(5)<<
m_ptmin
471 <<std::setw(12)<<std::setprecision(5)<<
m_etamax
473 out<<
"| max radius SP | "
474 <<std::setw(12)<<std::setprecision(5)<<
m_r_rmax
476 out<<
"| radius step | "
477 <<std::setw(12)<<std::setprecision(5)<<
m_r_rstep
479 out<<
"| min Z-vertex position | "
480 <<std::setw(12)<<std::setprecision(5)<<
m_zmin
482 out<<
"| max Z-vertex position | "
483 <<std::setw(12)<<std::setprecision(5)<<
m_zmax
485 out<<
"| min radius first SP(3) | "
486 <<std::setw(12)<<std::setprecision(5)<<
m_r1min
488 out<<
"| min radius second SP(3) | "
489 <<std::setw(12)<<std::setprecision(5)<<
m_r2min
491 out<<
"| min radius last SP(3) | "
492 <<std::setw(12)<<std::setprecision(5)<<
m_r3min
494 out<<
"| max radius first SP(3) | "
495 <<std::setw(12)<<std::setprecision(4)<<
m_r1max
497 out<<
"| max radius second SP(3) | "
498 <<std::setw(12)<<std::setprecision(5)<<
m_r2max
500 out<<
"| max radius last SP(3) | "
501 <<std::setw(12)<<std::setprecision(5)<<
m_r3max
503 out<<
"| min space points dR | "
504 <<std::setw(12)<<std::setprecision(5)<<
m_drmin
506 out<<
"| max space points dR | "
507 <<std::setw(12)<<std::setprecision(5)<<
m_drmax
509 out<<
"| max impact | "
510 <<std::setw(12)<<std::setprecision(5)<<
m_diver
512 out<<
"| max impact pps | "
513 <<std::setw(12)<<std::setprecision(5)<<
m_diverpps
515 out<<
"|---------------------------------------------------------------------|"
517 out<<
"| Beam X center | "
518 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[0]
520 out<<
"| Beam Y center | "
521 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[0]
523 out<<
"| Beam Z center | "
524 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[0]
526 out<<
"| Beam X-axis direction | "
527 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[1]
528 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[2]
529 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[3]
531 out<<
"| Beam Y-axis direction | "
532 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[1]
533 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[2]
534 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[3]
536 out<<
"| Beam Z-axis direction | "
537 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[1]
538 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[2]
539 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[3]
541 out<<
"|---------------------------------------------------------------------|"
552 out<<
"|---------------------------------------------------------------------|"
555 <<std::setw(12)<<data.ns
558 <<std::setw(12)<<data.nsaz
561 <<std::setw(12)<<data.l_seeds.size()
563 out<<
"|---------------------------------------------------------------------|"
574 if (data.endlist)
return;
576 data.i_seede = data.l_seeds.begin();
581 data.i_seed = data.l_seeds.begin();
605 constexpr float pi2 = 2.*
M_PI;
607 const float sFmax =
static_cast<float>(NFmax)/pi2;
608 const float sFmin = 100./60.;
612 else if (
m_sF < sFmin)
m_sF = sFmin;
618 for (
int f=0; f<=
m_fNmax; ++f) {
620 int fb = f-1;
if (fb<0 ) fb=
m_fNmax;
621 int ft = f+1;
if (ft>
m_fNmax) ft=0;
685 double tx = std::tan(beamSpotHandle->beamTilt(0));
686 double ty = std::tan(beamSpotHandle->beamTilt(1));
688 double ph = atan2(ty,tx);
689 double th = acos(1./sqrt(1.+tx*tx+ty*ty));
690 double sint = sin(th);
691 double cost = cos(th);
692 double sinp = sin(ph);
693 double cosp = cos(ph);
695 data.xbeam[0] =
static_cast<float>(cb.x());
696 data.xbeam[1] =
static_cast<float>(
cost*cosp*cosp+sinp*sinp);
697 data.xbeam[2] =
static_cast<float>(
cost*sinp*cosp-sinp*cosp);
698 data.xbeam[3] =-
static_cast<float>(sint*cosp );
700 data.ybeam[0] =
static_cast<float>(cb.y());
701 data.ybeam[1] =
static_cast<float>(
cost*cosp*sinp-sinp*cosp);
702 data.ybeam[2] =
static_cast<float>(
cost*sinp*sinp+cosp*cosp);
703 data.ybeam[3] =-
static_cast<float>(sint*sinp );
705 data.zbeam[0] =
static_cast<float>(cb.z());
706 data.zbeam[1] =
static_cast<float>(sint*cosp);
707 data.zbeam[2] =
static_cast<float>(sint*sinp);
708 data.zbeam[3] =
static_cast<float>(
cost);
718 float x =
static_cast<float>(
sp->globalPosition().
x())-data.xbeam[0];
719 float y =
static_cast<float>(
sp->globalPosition().
y())-data.ybeam[0];
720 float z =
static_cast<float>(
sp->globalPosition().
z())-data.zbeam[0];
721 r[0] = data.xbeam[1]*
x+data.xbeam[2]*
y+data.xbeam[3]*
z;
722 r[1] = data.ybeam[1]*
x+data.ybeam[2]*
y+data.ybeam[3]*
z;
723 r[2] = data.zbeam[1]*
x+data.zbeam[2]*
y+data.zbeam[3]*
z;
732 constexpr float pi2 = 2.*
M_PI;
734 std::vector<InDet::SiSpacePointForSeed*>::iterator
r;
738 if (!data.r_map[i])
continue;
739 r = data.r_Sorted[i].begin();
742 float F = spacePoint->phi();
747 int f =
static_cast<int>(
F *
m_sF);
754 data.rf_Sorted[f].push_back(spacePoint);
755 if (!data.rf_map[f]++) {
756 data.rf_index[data.nrf++] = f;
759 const float Z = spacePoint->z();
778 const int n = f *
SizeZ +
z;
780 data.rfz_Sorted[n].push_back(spacePoint);
781 if (!data.rfz_map[n]++) {
782 data.rfz_index[data.nrfz++] = n;
786 data.r_Sorted[i].clear();
799 for (
int i=0; i!=data.nr; ++i) {
800 int n = data.r_index[i];
802 data.r_Sorted[n].erase(data.r_Sorted[n].begin(), data.r_Sorted[n].end());
805 for (
int i=0; i!=data.nrf; ++i) {
806 int n = data.rf_index[i];
808 data.rf_Sorted[n].erase(data.rf_Sorted[n].begin(), data.rf_Sorted[n].end());
811 for (
int i=0; i!=data.nrfz; ++i) {
812 int n = data.rfz_index[i];
814 data.rfz_Sorted[n].erase(data.rfz_Sorted[n].begin(), data.rfz_Sorted[n].end());
840 if (data.nsaz<3)
return;
842 const int ZI[
SizeZ]= {5,6,7,8,9,10,4,3,2,1,0};
843 std::vector<InDet::SiSpacePointForSeed*>::iterator rt[9],rte[9],rb[9],rbe[9];
848 for (
int f=data.fNmin; f<=
m_fNmax; ++f) {
853 if (!data.endlist)
z = data.zMin;
857 int a = f *
SizeZ+ZI[
z];
if (!data.rfz_map[
a])
continue;
862 if (!data.rfz_map[an])
continue;
863 rb [NB] = data.rfz_Sorted[an].begin();
864 rbe[NB++] = data.rfz_Sorted[an].end();
869 if (!data.rfz_map[an])
continue;
870 rt [NT] = data.rfz_Sorted[an].begin();
871 rte[NT++] = data.rfz_Sorted[an].end();
876 data.zMin =
z;
return;
889 std::vector<InDet::SiSpacePointForSeed*>::iterator* rb ,
890 std::vector<InDet::SiSpacePointForSeed*>::iterator* rbe,
891 std::vector<InDet::SiSpacePointForSeed*>::iterator* rt ,
892 std::vector<InDet::SiSpacePointForSeed*>::iterator* rte,
893 int NB,
int NT,
int& nseed)
const
895 std::vector<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],
r;
903 for (; r0!=rbe[0]; ++r0) {
906 data.mapOneSeeds.erase(data.mapOneSeeds.begin(), data.mapOneSeeds.end());
908 float R = (*r0)->radius();
917 float X = (*r0)->x();
918 float Y = (*r0)->y();
919 float Z = (*r0)->z();
924 for (
int i=0; i!=NB; ++i) {
926 for (
r=rb[i];
r!=rbe[i]; ++
r) {
928 float Rb =(*r)->radius();
929 if (Rb<
m_r1min) {rb[i]=
r;
continue;}
935 if (dR >
m_drmax || (*r)->sur()==sur0)
continue;
937 if ( !
pix && !(*r)->spacepoint->clusterList().second)
continue;
939 float Tz = (Z-(*r)->z())/dR;
941 if (Tz < m_dzdrmin || Tz >
m_dzdrmax)
continue;
949 data.SP[Nb] = (*r);
if (++Nb==
m_maxsizeSP)
goto breakb;
958 for (
int i=0; i!=NT; ++i) {
960 for (
r=rt[i];
r!=rte[i]; ++
r) {
962 float Rt =(*r)->radius();
967 if ( (*r)->sur()==sur0)
continue;
969 float Tz = ((*r)->z()-Z)/dR;
971 if (Tz < m_dzdrmin || Tz >
m_dzdrmax)
continue;
978 data.SP[Nt] = (*r);
if (++Nt==
m_maxsizeSP)
goto breakt;
983 if (!(Nt-Nb))
continue;
985 float covr0 = (*r0)->covr();
986 float covz0 = (*r0)->covz();
991 for (
int i=0; i!=Nt; ++i) {
995 float dx =
sp->x()-X;
996 float dy =
sp->y()-Y;
997 float dz =
sp->z()-Z;
998 float x = dx*ax+dy*ay;
999 float y =-dx*ay+dy*ax;
1000 float r2 = 1.f/(
x*
x+
y*
y);
1001 float dr = std::sqrt(r2);
1002 float tz = dz*dr;
if (i < Nb) tz = -tz;
1005 data.Zo[i] = Z-R*tz;
1009 data.Er[i] = (covz0+
sp->covz()+tz*tz*(covr0+
sp->covr()))*r2;
1018 float ipt2K = ipt2/K2;
1019 float ipt2C = ipt2*COF;
1020 float COFK = COF*K2;
1026 for (
int b=0; b!=Nb; ++b) {
1030 float Zob = data.Zo[b];
1031 float Tzb = data.Tz[b];
1032 float Rb2r = data.R [b]*covr0;
1033 float Rb2z = data.R [b]*covz0;
1034 float Erb = data.Er[b];
1035 float Vb = data.V [b];
1036 float Ub = data.U [b];
1037 float Tzb2 = (1.f+Tzb*Tzb);
1038 float CSA = Tzb2*COFK;
1039 float ICSA = Tzb2*ipt2C;
1041 for (
int t=Nb; t!=Nt; ++t) {
1043 float Ts = .5f*(Tzb+data.Tz[t]);
1044 float dt = Tzb-data.Tz[t];
1045 float dT = dt*dt-Erb-data.Er[t]-data.R[t]*(Ts*Ts*Rb2r+Rb2z);
1046 if ( dT > ICSA)
continue;
1047 float dU = data.U[t]-Ub;
if (dU == 0. )
continue;
1048 float A = (data.V[t]-Vb)/dU;
1052 if (B2 > ipt2K*
S2 || dT*
S2 > B2*CSA)
continue;
1053 float Im = std::abs((
A-B*R)*R);
1056 if ( Im > imc )
continue;
1057 if (data.SP[t]->spacepoint->clusterList().second && Im > imcs)
continue;
1059 newOneSeed(data, SPb, SP0, data.SP[t]->spacepoint, Zob, Im);
1062 nseed += data.mapOneSeeds.size();
1088 data.OneSeeds[data.nOneSeeds].erase();
1089 data.OneSeeds[data.nOneSeeds].add(p1);
1090 data.OneSeeds[data.nOneSeeds].add(p2);
1091 data.OneSeeds[data.nOneSeeds].add(p3);
1092 data.OneSeeds[data.nOneSeeds].setZVertex(
static_cast<double>(
z));
1093 data.mapOneSeeds.insert(std::make_pair(q, &(data.OneSeeds[data.nOneSeeds])));
1096 std::multimap<float,InDet::SiSpacePointsSeed*>::reverse_iterator
1097 l = data.mapOneSeeds.rbegin();
1098 if ((*l).first <= q)
return;
1104 s->setZVertex(
static_cast<double>(
z));
1105 std::multimap<float,InDet::SiSpacePointsSeed*>::iterator
1106 i = data.mapOneSeeds.insert(std::make_pair(q, s));
1108 for (++i; i!=data.mapOneSeeds.end(); ++i) {
1109 if ((*i).second==s) {
1110 data.mapOneSeeds.erase(i);
1121 if (data.i_seed==data.i_seede) {
1124 if (data.i_seed==data.i_seede)
return nullptr;
1126 return &(*data.i_seed++);
1146 if (data.i_spforseed!=data.l_spforseed.end()) {
1147 sps = &(*data.i_spforseed++);
1150 data.l_spforseed.emplace_back(
sp,
r);
1151 sps = &(data.l_spforseed.back());
1152 data.i_spforseed = data.l_spforseed.end();
1167 if (data.i_seede!=data.l_seeds.end()) {
1172 s->setZVertex(
static_cast<double>(
z));
1174 data.l_seeds.emplace_back(p1, p2,
z);
1175 data.i_seede = data.l_seeds.end();
1188 if (data.i_seede!=data.l_seeds.end()) {
1194 s->setZVertex(
static_cast<double>(
z));
1196 data.l_seeds.emplace_back(p1, p2, p3,
z);
1197 data.i_seede = data.l_seeds.end();
1207 std::multimap<float,InDet::SiSpacePointsSeed*>::iterator
1208 l = data.mapOneSeeds.begin(),
1209 le = data.mapOneSeeds.end ();
1211 for (; l!=le; ++l) {
1212 if (data.i_seede!=data.l_seeds.end()) {
1216 data.l_seeds.emplace_back(*(*l).second);
1217 data.i_seede = data.l_seeds.end();
1223 data.initialize(EventData::ToolType::BeamGas,
#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 >)
static void convertToBeamFrameWork(EventData &data, const Trk::SpacePoint *const &sp, float *r)
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
BooleanProperty m_useOverlap
virtual void newRegion(const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vSCT) const override
virtual void find2Sp(EventData &data, const std::list< Trk::Vertex > &lv) const override
void buildBeamFrameWork(EventData &data) const
virtual StatusCode initialize() override
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
virtual void newEvent(const EventContext &ctx, EventData &data, int iteration) const override
virtual void writeNtuple(const SiSpacePointsSeed *seed, const Trk::Track *track, int seedType, long EventNumber) const override
virtual MsgStream & dump(EventData &data, MsgStream &out) 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
static void erase(EventData &data)
static SiSpacePointForSeed * newSpacePoint(EventData &data, const Trk::SpacePoint *const &)
virtual StatusCode finalize() override
static MsgStream & dumpEvent(EventData &data, MsgStream &out)
SG::ReadHandleKey< SpacePointContainer > m_spacepointsSCT
void newOneSeed(EventData &data, const Trk::SpacePoint *&, const Trk::SpacePoint *&, const Trk::SpacePoint *&, const float &, const float &) const
IntegerProperty m_maxsizeSP
SiSpacePointsSeedMaker_BeamGas()=delete
void production3Sp(EventData &data) const
virtual bool getWriteNtupleBoolProperty() const override
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
SG::ReadHandleKey< SpacePointContainer > m_spacepointsPixel
void findNext(EventData &data) const
IntegerProperty m_maxsize
IntegerProperty m_maxOneSize
MsgStream & dumpConditions(EventData &data, MsgStream &out) const
static void fillSeeds(EventData &data)
virtual const SiSpacePointsSeed * next(const EventContext &ctx, EventData &data) const override
static void production2Sp(EventData &data)
void fillLists(EventData &data) const
FloatProperty m_fieldScale
int m_rfz_ib[SizeRFZ][SizeI]
bool isUsed(const Trk::SpacePoint *sp, const Trk::PRDtoTrackMap &prd_to_track_map) const
bool isZCompatible(float &) const
SG::ReadHandleKey< SpacePointOverlapCollection > m_spacepointsOverlap
static void newSeed(EventData &data, const Trk::SpacePoint *&, const Trk::SpacePoint *&, const float &)
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,...
void initializeEventData(EventData &data) const
int m_rfz_it[SizeRFZ][SizeI]
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.
int ir
counter of the current depth
int cost(std::vector< std::string > &files, node &n, const std::string &directory="", bool deleteref=false, bool relocate=false)
Eigen::Matrix< double, 3, 1 > Vector3D
hold the test vectors and ease the comparison