ATLAS Offline Software
Loading...
Searching...
No Matches
AFP_Geometry.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <algorithm>
6#include <cstdio>
7#include <cstdlib>
8#include <fstream>
9
11#include "GaudiKernel/MsgStream.h"
14
15#include <CLHEP/Matrix/Matrix.h>
16#include <CLHEP/Matrix/Vector.h>
17
19
20
21
23 : m_CfgParams (*pCfgParams)
24{
27
28 for(int nStationID=0; nStationID<=3; ++nStationID){
29 eAFPStation eStation=(eAFPStation)nStationID;
30 for(int nPlateID=0; nPlateID<getSIDPlatesCnt(eStation); ++nPlateID){
31 if(!(m_MapSIDTransToGlobal.find(eStation)!=m_MapSIDTransToGlobal.end() && m_MapSIDTransToGlobal[eStation].find(nPlateID)!=m_MapSIDTransToGlobal[eStation].end()))
32 {
33 char szStationName[8];
34 sprintf(szStationName,"AFP%02i",(int)eStation);
35 HepGeom::Transform3D Aux=getSIDTransform(ESTT_SENSORGLOBAL,szStationName,nPlateID);
36 m_MapSIDTransToGlobal[eStation][nPlateID]=Aux;
37 }
38
39 if(!(m_MapSIDTransToLocal.find(eStation)!=m_MapSIDTransToLocal.end() && m_MapSIDTransToLocal[eStation].find(nPlateID)!=m_MapSIDTransToLocal[eStation].end()))
40 {
41 char szStationName[8];
42 sprintf(szStationName,"AFP%02i",(int)eStation);
43 HepGeom::Transform3D Aux=getSIDTransform(ESTT_SENSORLOCAL,szStationName,nPlateID);
44 m_MapSIDTransToLocal[eStation][nPlateID]=Aux;
45 }
46 }
47 }
48}
49
54
55HepGeom::Transform3D AFP_Geometry::getStationTransform(const char* pszStationName) const
56{
57 HepGeom::Transform3D ReqTransform;
58 eAFPStation eStation=parseStationName(pszStationName);
59
60 switch(eStation)
61 {
62 case EAS_AFP00:
63 ReqTransform=HepGeom::Translate3D(LHCXOFFSET, 0.0*CLHEP::mm, m_CfgParams.vecStatNominalZPos[0]);
64 break;
65 case EAS_AFP01:
66 ReqTransform=HepGeom::Translate3D(LHCXOFFSET, 0.0*CLHEP::mm, m_CfgParams.vecStatNominalZPos[1]);
67 break;
68 case EAS_AFP02:
69 ReqTransform=HepGeom::Translate3D(LHCXOFFSET, 0.0*CLHEP::mm, m_CfgParams.vecStatNominalZPos[2]) * HepGeom::RotateX3D(180*CLHEP::deg);
70 break;
71 case EAS_AFP03:
72 ReqTransform=HepGeom::Translate3D(LHCXOFFSET, 0.0*CLHEP::mm, m_CfgParams.vecStatNominalZPos[3]) * HepGeom::RotateX3D(180*CLHEP::deg);
73 break;
74 default:
75 break;
76 }
77
78 return ReqTransform;
79}
80
81HepGeom::Transform3D
82AFP_Geometry::getStationElementTransform(const char* pszStationName, eStationElement eElement, const int nPlateID) const
83{
84 HepGeom::Transform3D ReqTransform;
85 eAFPStation eStation=parseStationName(pszStationName);
86 if (eStation == eAFPStation::EAS_UNKNOWN ){ //EAS_UNKNOWN is -1
87 return ReqTransform;
88 }
89 AFP_TDCONFIGURATION tdcfg=m_CfgParams.tdcfg.at(eStation);
90 AFP_SIDCONFIGURATION sidcfg=m_CfgParams.sidcfg.at(eStation);
91
92 double xComponent = -m_CfgParams.vecRPotFloorDistance[eStation];
93 double yComponent = m_CfgParams.vecRPotYPos[eStation];
94
95 double xStag = 0.0;
96 if(eElement==ESE_SID && nPlateID!=AFP_CONSTANTS::Stat_GlobalVacuumSensorID)
97 xStag = (nPlateID>-1) ? -sidcfg.vecXStaggering[nPlateID] : 0.0;
98
99 switch(eStation)
100 {
101 case EAS_AFP00:
102 if(eElement==ESE_RPOT)
103 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0);
104 else if(eElement==ESE_TOF)
105 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0)*HepGeom::Translate3D(-tdcfg.fXFloorDistance,tdcfg.fYPosInRPot,tdcfg.fZPosInRPot-sidcfg.fZDistanceInRPot);
106 else if(eElement==ESE_SID)
107 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0)*HepGeom::Translate3D( xStag,0.0,-sidcfg.fZDistanceInRPot);
108 else {};
109 break;
110 case EAS_AFP01:
111 if(eElement==ESE_RPOT)
112 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0);
113 else if(eElement==ESE_SID)
114 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0)*HepGeom::TranslateX3D( xStag);
115 else {};
116 break;
117 case EAS_AFP02:
118 if(eElement==ESE_RPOT)
119 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0);
120 else if(eElement==ESE_SID)
121 ReqTransform=HepGeom::Translate3D(xComponent, yComponent ,0.0)*HepGeom::TranslateX3D( xStag);
122 else {};
123 break;
124 case EAS_AFP03:
125 if(eElement==ESE_RPOT)
126 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0);
127 else if(eElement==ESE_TOF)
128 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0)*HepGeom::Translate3D(-tdcfg.fXFloorDistance,tdcfg.fYPosInRPot,tdcfg.fZPosInRPot-sidcfg.fZDistanceInRPot);
129 else if(eElement==ESE_SID)
130 ReqTransform=HepGeom::Translate3D(xComponent, yComponent, 0.0)*HepGeom::Translate3D( xStag,0.0,-sidcfg.fZDistanceInRPot);
131 break;
132 default:
133 break;
134 }
135
136 return ReqTransform;
137}
138
139HepGeom::Transform3D AFP_Geometry::getSIDTransform(const eSIDTransformType eType, const char* pszStationName, const int nPlateID) const
140{
141 HepGeom::Transform3D ReqTransform=HepGeom::Transform3D();
142
143 std::string Station=std::string(pszStationName);
144 eAFPStation eStation=parseStationName(pszStationName);
145 AFP_SIDCONFIGURATION sidcfg=m_CfgParams.sidcfg.at(eStation);
146 double falpha = sidcfg.fSlope;
147
148 double fzm=0.0;
149
150 if(eType==ESTT_VACUUMSENSOR)
151 {
153 {
154 double fxm=-(sidcfg.vecChipXPos[nPlateID]+0.5*sidcfg.vecChipXLength[nPlateID])*std::cos(falpha);
155 double fZCorrOffset=(DETXSIDE==+1 || falpha==0)? -0:4*AFP_CONSTANTS::SiT_CorrZOffset;
156 HepGeom::Transform3D TransInMotherVolume=getStationElementTransform(pszStationName,ESE_SID,nPlateID);
157 HepGeom::Transform3D NominalPosInPocket=HepGeom::Translate3D(0.0*CLHEP::mm,0.0*CLHEP::mm, (fzm-fZCorrOffset));
158
160 ReqTransform=TransInMotherVolume*NominalPosInPocket*HepGeom::Translate3D(fxm, 0.0*CLHEP::mm, nPlateID*sidcfg.fLayerSpacing/std::cos(falpha))*HepGeom::RotateY3D(falpha)*ReqTransform;
161 }
162 else
163 {
165 {
166 if(eStation==EAS_AFP00) ReqTransform=HepGeom::TranslateZ3D(-AFP_CONSTANTS::Stat_GlobalVacuumSensorZOffset);
167 else if(eStation==EAS_AFP01) ReqTransform=HepGeom::TranslateZ3D(-AFP_CONSTANTS::Stat_GlobalVacuumSensorZOffset);
168 else if(eStation==EAS_AFP02) ReqTransform=HepGeom::TranslateZ3D(-AFP_CONSTANTS::Stat_GlobalVacuumSensorZOffset);
169 else if(eStation==EAS_AFP03) ReqTransform=HepGeom::TranslateZ3D(-AFP_CONSTANTS::Stat_GlobalVacuumSensorZOffset);
170 }
171 }
172
173 return ReqTransform;
174 }
175
176 double fxm=-(sidcfg.vecChipXPos[nPlateID]+0.5*sidcfg.vecChipXLength[nPlateID])*std::cos(falpha);
177 double fZCorrOffset=(DETXSIDE==+1 || falpha==0)? -0:4*AFP_CONSTANTS::SiT_CorrZOffset;
178 HepGeom::Transform3D TransInMotherVolume=getStationElementTransform(pszStationName,ESE_SID,nPlateID);
179 HepGeom::Transform3D NominalPosInPocket=HepGeom::Translate3D(0.0*CLHEP::mm,0.0*CLHEP::mm, (fzm-fZCorrOffset));
180
181 HepGeom::Transform3D TransMotherInWorld=getStationTransform(pszStationName);
182
183 //staggering of sensor shift in its plane - correction to cosinus needed fo x-staggering to transform to staggering in LHC CS
184 HepGeom::Transform3D TransStaggering=HepGeom::Translate3D(sidcfg.vecXStaggering[nPlateID]*std::cos(falpha),sidcfg.vecYStaggering[nPlateID], 0.0*CLHEP::mm);
185 HepGeom::Transform3D TotTransform=TransInMotherVolume*TransStaggering*NominalPosInPocket;
186
187 HepGeom::Transform3D PlateTotTrans=TotTransform*HepGeom::Translate3D(fxm,0.0*CLHEP::mm, nPlateID*sidcfg.fLayerSpacing/std::cos(falpha))*HepGeom::RotateY3D(falpha);
188 HepGeom::Transform3D TransFEI4=PlateTotTrans*HepGeom::Translate3D(sidcfg.vecChipXPos[nPlateID], sidcfg.vecChipYPos[nPlateID], 0.5*AFP_CONSTANTS::SiT_Plate_Main_thickness+0.5*AFP_CONSTANTS::SiT_Chip_thickness)*HepGeom::RotateZ3D(sidcfg.vecChipRotAngle[nPlateID]);
189 HepGeom::Transform3D TransSID=TotTransform*HepGeom::Translate3D(fxm,0.0*CLHEP::mm, nPlateID*sidcfg.fLayerSpacing/std::cos(falpha)) * HepGeom::Translate3D(sidcfg.vecChipXPos[nPlateID]+sidcfg.vecSensorXPos[nPlateID], sidcfg.vecChipYPos[nPlateID]+sidcfg.vecSensorYPos[nPlateID], (0.5*AFP_CONSTANTS::SiT_Plate_Main_thickness+AFP_CONSTANTS::SiT_Chip_thickness+0.5*AFP_CONSTANTS::SiT_Pixel_thickness))*HepGeom::RotateY3D(falpha) * HepGeom::RotateZ3D(sidcfg.vecChipRotAngle[nPlateID]);
190 HepGeom::Transform3D TotTransSIDInWorld=TransMotherInWorld*TransSID;
191
192 switch(eType)
193 {
194 case ESTT_PLATE:
195 ReqTransform=PlateTotTrans;
196 break;
197 case ESTT_SENSOR:
198 ReqTransform=TransSID;
199 break;
200 case ESTT_FEI4CHIP: //CHANGE
201 ReqTransform=TransFEI4;
202 break;
203 case ESTT_SENSORLOCAL:
204 ReqTransform=TotTransSIDInWorld.inverse();
205 break;
207 ReqTransform=TotTransSIDInWorld;
208 break;
209
210 default:
211 break;
212 }
213
214 return ReqTransform;
215}
216
217eAFPStation AFP_Geometry::parseStationName(const char* pszStationName) const
218{
219 eAFPStation eStation=EAS_UNKNOWN;
220
221 if(!strcmp(pszStationName,"AFP00")) eStation=EAS_AFP00;
222 else if(!strcmp(pszStationName,"AFP01")) eStation=EAS_AFP01;
223 else if(!strcmp(pszStationName,"AFP02")) eStation=EAS_AFP02;
224 else if(!strcmp(pszStationName,"AFP03")) eStation=EAS_AFP03;
225 else eStation=EAS_UNKNOWN;
226
227 return eStation;
228}
229
230StatusCode AFP_Geometry::getPointInSIDSensorLocalCS(const int nStationID, const int nPlateID, const HepGeom::Point3D<double>& GlobalPoint, HepGeom::Point3D<double>& LocalPoint) const
231{
232 StatusCode Status=StatusCode::FAILURE;
233 LocalPoint=HepGeom::Point3D<double>();
234 eAFPStation eStation=(eAFPStation)nStationID;
235
236 AFP_TDCONFIGURATION tdcfg=m_CfgParams.tdcfg.at(eStation);
237
238 if(nStationID>=0 && nStationID<=3){
239 if(nPlateID>=0 && nPlateID<getSIDPlatesCnt(eStation)){
240 LocalPoint=m_MapSIDTransToLocal.at(eStation).at(nPlateID)*GlobalPoint-HepGeom::Point3D<double>(0.5*AFP_CONSTANTS::SiT_Pixel_length_totx,0.5*AFP_CONSTANTS::SiT_Pixel_length_toty,0.5*AFP_CONSTANTS::SiT_Pixel_thickness);
241 Status=StatusCode::SUCCESS;
242 }
243 }
244
245 return Status;
246}
247
248StatusCode AFP_Geometry::getPointInSIDSensorGlobalCS(const int nStationID, const int nPlateID, const HepGeom::Point3D<double>& LocalPoint, HepGeom::Point3D<double>& GlobalPoint) const
249{
250 StatusCode Status=StatusCode::FAILURE;
251 GlobalPoint=HepGeom::Point3D<double>();
252 eAFPStation eStation=(eAFPStation)nStationID;
253
254 if(nStationID>=0 && nStationID<=3){
255 if(nPlateID>=0 && nPlateID<getSIDPlatesCnt(eStation)){
256 GlobalPoint=m_MapSIDTransToGlobal.at(eStation).at(nPlateID)*static_cast<HepGeom::Point3D<double> >(LocalPoint+HepGeom::Point3D<double>(0.5*AFP_CONSTANTS::SiT_Pixel_length_totx,0.5*AFP_CONSTANTS::SiT_Pixel_length_toty,0.5*AFP_CONSTANTS::SiT_Pixel_thickness));
257 Status=StatusCode::SUCCESS;
258 }
259 }
260
261 return Status;
262}
263
264
265//-----------------------------------------------------------------
266
267void AFP_Geometry::getPixelLocalPosition(const eAFPStation eStation, const int nPixelID, double* pfX1Pos, double* pfX2Pos) const
268{
269 int i,j;
270 AFP_TDCONFIGURATION TofCfg=m_CfgParams.tdcfg.at(eStation);
271
272 i=getPixelRow(nPixelID)-1;
273 j=getPixelColumn(nPixelID)-1;
274
275 if(pfX1Pos) *pfX1Pos = -i * m_CfgParams.tdcfg.at(eStation).fPixelX1Dim;
276 if(pfX2Pos) *pfX2Pos = j * m_CfgParams.tdcfg.at(eStation).fPixelX2Dim;
277}
278
280{
281 int i,j,nTrainOfBar11,nRefTrainID,nTrainID,nTrainCnt;
282 AFPTOF_LBARDIMENSIONS BarDims;
283 double fRadLength11, fLGuideLength11, fRadLength, fLGuideLength;
284
285 AFP_TDCONFIGURATION tdcfg=m_CfgParams.tdcfg.at(eStation);
286 AFPTOF_LBARREFDIMENSIONS RefBarDims=tdcfg.RefBarDims;
287
288 nTrainCnt=nTrainOfBar11=tdcfg.nX1PixCnt;
289
291
292 //calculate dimensions for bar (1,1), move from (refx1,refx2)
293 nRefTrainID = nTrainCnt-(RefBarDims.nBarX1ID-1); //reference train
294 fRadLength11 = (RefBarDims.fRadLength+tdcfg.mapTrainInfo.at(nRefTrainID).fTaperOffset)+(1-RefBarDims.nBarX1ID)*tdcfg.fPixelX1Dim; // move to (refx1,1)
295 fRadLength11 += (tdcfg.mapTrainInfo.at(nRefTrainID).fPerpShiftInPixel-tdcfg.mapTrainInfo.at(nTrainOfBar11).fPerpShiftInPixel)+0.5*(tdcfg.mapTrainInfo.at(nTrainOfBar11).fLGuideWidth-tdcfg.mapTrainInfo.at(nRefTrainID).fLGuideWidth);
296 fRadLength11 -= ((1-RefBarDims.nBarX2ID)*tdcfg.fPixelX2Dim)/std::tan(tdcfg.fAlpha); //move to (1,1)
297 for(fLGuideLength11=RefBarDims.fLGuideLength,i=RefBarDims.nBarX1ID-1;i>=1;i--){
298 nTrainID = nTrainCnt-(i-1);
299 fLGuideLength11 -= AFP_CONSTANTS::ToF_LGuideTrainOffset+(tdcfg.mapTrainInfo.at(nTrainID).fLGuideWidth-tdcfg.mapTrainInfo.at(nTrainID).fTaperOffset);
300 }
301
302 //calculate length of light guides
303 std::vector<double> vecLGLengths;
304 vecLGLengths.resize(tdcfg.nX1PixCnt);
305 vecLGLengths[0]=fLGuideLength11;
306 for(i=2;i<=tdcfg.nX1PixCnt;i++){
307 nTrainID=nTrainCnt-(i-1);
308 vecLGLengths[i-1]=vecLGLengths[i-2]+AFP_CONSTANTS::ToF_LGuideTrainOffset+tdcfg.mapTrainInfo.at(nTrainID+1).fLGuideWidth-tdcfg.mapTrainInfo.at(nTrainID+1).fTaperOffset;
309 }
310
311 tdcfg.mapBarDims.clear();
312 for(i=0;i<tdcfg.nX1PixCnt;i++){
313 nTrainID=tdcfg.nX1PixCnt-i;
314
315 for(j=0;j<tdcfg.nX2PixCnt;j++){
316 int k = j;
317 if(eStation==EAS_AFP02 || eStation==EAS_AFP03){
318 k = tdcfg.nX2PixCnt-1 - j;
319 }
320
321 fRadLength=fRadLength11+i*tdcfg.fPixelX1Dim-k*tdcfg.fPixelX2Dim/std::tan(tdcfg.fAlpha);
322 fRadLength+=(tdcfg.mapTrainInfo.at(nTrainOfBar11).fPerpShiftInPixel-tdcfg.mapTrainInfo.at(nTrainID).fPerpShiftInPixel);
323 fRadLength+=0.5*(tdcfg.mapTrainInfo.at(nTrainID).fLGuideWidth-tdcfg.mapTrainInfo.at(nTrainOfBar11).fLGuideWidth);
324 fLGuideLength=vecLGLengths[i];
325
326 BarDims.nBarX1ID=i+1;
327 BarDims.nBarX2ID=j+1;
328 BarDims.nTrainID=nTrainID;
329 BarDims.fLGuideLength=fLGuideLength;
330 BarDims.fLBarThickness=RefBarDims.fLBarThickness;
331 BarDims.fRadLength=fRadLength-tdcfg.mapTrainInfo.at(BarDims.nTrainID).fTaperOffset;
332 BarDims.fRadYDim=tdcfg.mapTrainInfo.at(nTrainID).fLGuideWidth-tdcfg.mapTrainInfo.at(BarDims.nTrainID).fTaperOffset;
333 BarDims.fLGuideWidth=tdcfg.mapTrainInfo.at(nTrainID).fLGuideWidth;
334
335 if(j==0) tdcfg.mapTrainInfo.at(nTrainCnt-i).fLength=fLGuideLength+0.5*BarDims.fRadYDim;
336 tdcfg.mapBarDims[10*(i+1)+(k + 1)]=BarDims;
337 }
338 }
339}
eSIDTransformType
@ ESTT_SENSORLOCAL
@ ESTT_PLATE
@ ESTT_FEI4CHIP
@ ESTT_SENSORGLOBAL
@ ESTT_VACUUMSENSOR
@ ESTT_SENSOR
eAFPStation
@ EAS_AFP02
@ EAS_AFP03
@ EAS_UNKNOWN
@ EAS_AFP00
@ EAS_AFP01
eStationElement
@ ESE_RPOT
@ ESE_TOF
@ ESE_SID
#define LHCXOFFSET
#define DETXSIDE
int getPixelColumn(const int nPixelID) const
HepGeom::Transform3D getStationElementTransform(const char *pszStationName, eStationElement eElement, const int nPlateID=-1) const
void getPixelLocalPosition(const eAFPStation eStation, const int nPixelID, double *pfX1Pos, double *pfX2Pos) const
eAFPStation parseStationName(const char *pszStationName) const
std::map< eAFPStation, std::map< int, HepGeom::Transform3D > > m_MapSIDTransToGlobal
std::map< eAFPStation, std::map< int, HepGeom::Transform3D > > m_MapSIDTransToLocal
void setupLBarsDims(const eAFPStation eStation)
AFP_CONFIGURATION m_CfgParams
StatusCode getPointInSIDSensorLocalCS(const int nStationID, const int nPlateID, const HepGeom::Point3D< double > &GlobalPoint, HepGeom::Point3D< double > &LocalPoint) const
StatusCode getPointInSIDSensorGlobalCS(const int nStationID, const int nPlateID, const HepGeom::Point3D< double > &LocalPoint, HepGeom::Point3D< double > &GlobalPoint) const
int getPixelRow(const int nPixelID) const
HepGeom::Transform3D getSIDTransform(const eSIDTransformType eType, const char *pszStationName, const int nPlateID) const
HepGeom::Transform3D getStationTransform(const char *pszStationName) const
int getSIDPlatesCnt(const eAFPStation eStation) const
singleton-like access to IMessageSvc via open function and helper
static constexpr double SiT_Pixel_length_totx
static constexpr double SiT_Plate_Main_thickness
static constexpr double Stat_GlobalVacuumSensorThickness
static constexpr int Stat_GlobalVacuumSensorID
static constexpr double SiT_Pixel_length_toty
static constexpr double SiT_CorrZOffset
static constexpr double SiT_Chip_thickness
static constexpr double SiT_Pixel_thickness
static constexpr double ToF_LGuideTrainOffset
static constexpr double ToF_MinBarGap
static constexpr double Stat_GlobalVacuumSensorZOffset
static constexpr double SiT_Chip_length_x
static constexpr double SiT_Plate_Main_length_x
std::vector< double > vecChipXLength
std::vector< double > vecChipYPos
std::vector< double > vecSensorXPos
std::vector< double > vecYStaggering
std::vector< double > vecChipRotAngle
std::vector< double > vecChipXPos
std::vector< double > vecSensorYPos
std::vector< double > vecXStaggering
std::map< int, AFPTOF_LBARDIMENSIONS > mapBarDims
std::map< int, AFPTOF_TRAININFO > mapTrainInfo
AFPTOF_LBARREFDIMENSIONS RefBarDims