13 #include "GaudiKernel/ITHistSvc.h"
65 return StatusCode::SUCCESS;
69 if (m_extrapolationEngine.retrieve().isFailure()) {
71 return StatusCode::FAILURE;
72 }
else ATH_MSG_INFO(
"Successfully retrieved ExtrapolationEngine.");
74 if (!m_posmomWriter.empty() && m_posmomWriter.retrieve().isFailure()) {
75 ATH_MSG_FATAL(
"Could not retrieve position/momentum writer.");
76 return StatusCode::FAILURE;
77 }
else ATH_MSG_INFO(
"Successfully retrieved ExtrapolationEngine.");
82 return StatusCode::FAILURE;
88 return StatusCode::FAILURE;
94 return StatusCode::FAILURE;
101 return StatusCode::FAILURE;
106 return StatusCode::SUCCESS;
113 m_tree =
new TTree(m_treeName.value().c_str(), m_treeDescription.value().c_str());
115 m_tree->Branch(
"StartPosX", &m_startPositionX);
116 m_tree->Branch(
"StartPosY", &m_startPositionY);
117 m_tree->Branch(
"StartPosZ", &m_startPositionZ);
118 m_tree->Branch(
"StartPosR", &m_startPositionR);
119 m_tree->Branch(
"StartPhi", &m_startPhi);
120 m_tree->Branch(
"StartEta", &m_startEta);
121 m_tree->Branch(
"StartTheta", &m_startTheta);
122 m_tree->Branch(
"StartP", &m_startP);
123 m_tree->Branch(
"StartPt", &m_startPt);
124 if (m_parametersMode) m_tree->Branch(
"StartCharge", &m_charge);
126 m_tree->Branch(
"EndSuccessful", &m_endSuccessful);
127 m_tree->Branch(
"EndPosX", &m_endPositionX);
128 m_tree->Branch(
"EndPosY", &m_endPositionY);
129 m_tree->Branch(
"EndPosZ", &m_endPositionZ);
130 m_tree->Branch(
"EndPosR", &m_endPositionR);
131 m_tree->Branch(
"EndPhi", &m_endPhi);
132 m_tree->Branch(
"EndEta", &m_endEta);
133 m_tree->Branch(
"EndTheta", &m_endTheta);
134 m_tree->Branch(
"EndP", &m_endP);
135 m_tree->Branch(
"EndPt", &m_endPt);
137 m_tree->Branch(
"EndPathLength", &m_endPathLength);
139 if (m_backExtrapolation) {
140 m_tree->Branch(
"BackSuccessful", &m_backSuccessful);
141 m_tree->Branch(
"BackPosX", &m_backPositionX);
142 m_tree->Branch(
"BackPosY", &m_backPositionY);
143 m_tree->Branch(
"BackPosZ", &m_backPositionZ);
144 m_tree->Branch(
"BackPosR", &m_backPositionR);
145 m_tree->Branch(
"BackPhi", &m_backPhi);
146 m_tree->Branch(
"BackEta", &m_backEta);
147 m_tree->Branch(
"BackTheta", &m_backTheta);
148 m_tree->Branch(
"BackP", &m_backP);
149 m_tree->Branch(
"BackPt", &m_backPt);
153 m_parameterNames.emplace_back(
"Sensitive");
154 m_parameterNames.emplace_back(
"Passive");
155 m_parameterNames.emplace_back(
"Boundary");
156 for (
size_t ip = 0;
ip < m_parameterNames.size(); ++
ip) {
158 m_pPositionX.push_back(
new std::vector<float> );
159 m_pPositionY.push_back(
new std::vector<float> );
160 m_pPositionZ.push_back(
new std::vector<float> );
161 m_pPositionR.push_back(
new std::vector<float> );
162 m_pPhi.push_back(
new std::vector<float> );
163 m_pTheta.push_back(
new std::vector<float> );
164 m_pEta.push_back(
new std::vector<float> );
165 m_pP.push_back(
new std::vector<float> );
166 m_pPt.push_back(
new std::vector<float> );
169 m_tree->Branch(m_parameterNames[
ip] +
"PosX", m_pPositionX[
ip]);
170 m_tree->Branch(m_parameterNames[
ip] +
"PosY", m_pPositionY[
ip]);
171 m_tree->Branch(m_parameterNames[
ip] +
"PosZ", m_pPositionZ[
ip]);
172 m_tree->Branch(m_parameterNames[
ip] +
"PosR", m_pPositionR[
ip]);
173 m_tree->Branch(m_parameterNames[
ip] +
"Phi", m_pPhi[
ip]);
174 m_tree->Branch(m_parameterNames[
ip] +
"Eta", m_pTheta[
ip]);
175 m_tree->Branch(m_parameterNames[
ip] +
"Theta", m_pEta[
ip]);
176 m_tree->Branch(m_parameterNames[
ip] +
"P", m_pP[
ip]);
177 m_tree->Branch(m_parameterNames[
ip] +
"Pt", m_pPt[
ip]);
180 if (m_collectSensitive) {
181 m_sensitiveLayerIndex =
new std::vector< int >;
182 m_sensitiveSurfaceType =
new std::vector< int >;
183 m_sensitiveCenterPosX =
new std::vector< float >;
184 m_sensitiveCenterPosY =
new std::vector< float >;
185 m_sensitiveCenterPosZ =
new std::vector< float >;
186 m_sensitiveCenterPosR =
new std::vector< float >;
187 m_sensitiveCenterPosPhi =
new std::vector< float >;
188 m_sensitiveLocalPosX =
new std::vector< float >;
189 m_sensitiveLocalPosY =
new std::vector< float >;
190 m_sensitiveLocalPosR =
new std::vector< float >;
191 m_sensitiveLocalPosPhi =
new std::vector< float >;
192 m_sensitiveDetector =
new std::vector< int >;
193 m_sensitiveIsInnermost =
new std::vector< int >;
194 m_sensitiveIsNextToInnermost =
new std::vector< int >;
195 m_sensitiveBarrelEndcap =
new std::vector< int >;
196 m_sensitiveLayerDisc =
new std::vector< int >;
197 m_sensitiveEtaModule =
new std::vector< int >;
198 m_sensitivePhiModule =
new std::vector< int >;
199 m_sensitiveSide =
new std::vector< int >;
200 m_sensitiveNearBondGap =
new std::vector< int >;
201 m_sensitiveisInside =
new std::vector< int >;
202 m_sensitiveisInsideBound =
new std::vector< int >;
203 m_materialtInX0AccumulatedUpTo =
new std::vector< float >;
205 m_tree->Branch(
"SensitiveLayerIndex" , m_sensitiveLayerIndex);
206 m_tree->Branch(
"SensitiveSurfaceType" , m_sensitiveSurfaceType);
207 m_tree->Branch(
"SensitiveCenterPosX" , m_sensitiveCenterPosX);
208 m_tree->Branch(
"SensitiveCenterPosY" , m_sensitiveCenterPosY);
209 m_tree->Branch(
"SensitiveCenterPosZ" , m_sensitiveCenterPosZ);
210 m_tree->Branch(
"SensitiveCenterPosR" , m_sensitiveCenterPosR);
211 m_tree->Branch(
"SensitiveCenterPosPhi", m_sensitiveCenterPosPhi);
212 m_tree->Branch(
"SensitiveLocalPosX" , m_sensitiveLocalPosX);
213 m_tree->Branch(
"SensitiveLocalPosY" , m_sensitiveLocalPosY);
214 m_tree->Branch(
"SensitiveLocalPosR" , m_sensitiveLocalPosR);
215 m_tree->Branch(
"SensitiveLocalPosPhi" , m_sensitiveLocalPosPhi);
216 m_tree->Branch(
"SensitiveDetector" , m_sensitiveDetector);
217 m_tree->Branch(
"SensitiveIsInnermost" , m_sensitiveIsInnermost);
218 m_tree->Branch(
"SensitiveIsNextToInnermost" , m_sensitiveIsNextToInnermost);
219 m_tree->Branch(
"SensitiveBarrelEndcap", m_sensitiveBarrelEndcap);
220 m_tree->Branch(
"SensitiveLayerDisc" , m_sensitiveLayerDisc);
221 m_tree->Branch(
"SensitiveEtaModule" , m_sensitiveEtaModule);
222 m_tree->Branch(
"SensitivePhiModule" , m_sensitivePhiModule);
223 m_tree->Branch(
"SensitiveSide" , m_sensitiveSide);
224 m_tree->Branch(
"SensitiveNearBondGap" , m_sensitiveNearBondGap);
225 m_tree->Branch(
"SensitiveisInside" , m_sensitiveisInside);
226 m_tree->Branch(
"SensitiveisInsideBound", m_sensitiveisInsideBound);
227 m_tree->Branch(
"MaterialtInX0AccumulatedUpTo" , m_materialtInX0AccumulatedUpTo);
232 if (m_collectMaterial) {
233 m_materialThicknessInX0Accumulated =
new std::vector<float>;
234 m_materialThicknessInX0Steps =
new std::vector<float>;
235 m_materialThicknessInL0Steps =
new std::vector<float>;
236 m_materialPositionX =
new std::vector<float>;
237 m_materialPositionY =
new std::vector<float>;
238 m_materialPositionZ =
new std::vector<float>;
239 m_materialPositionR =
new std::vector<float>;
240 m_materialPositionP =
new std::vector<float>;
241 m_materialPositionPt =
new std::vector<float>;
242 m_materialScaling =
new std::vector<float>;
243 m_stepDirection =
new std::vector<int>;
244 m_tree->Branch(
"MaterialThicknessInX0", &m_materialThicknessInX0);
245 m_tree->Branch(
"MaterialThicknessInL0", &m_materialThicknessInL0);
246 m_tree->Branch(
"MaterialThicknessZARho", &m_materialThicknessZARho);
247 m_tree->Branch(
"MaterialEmulatedEloss", &m_materialEmulatedIonizationLoss);
248 m_tree->Branch(
"MaterialThicknessSensitiveInX0", &m_materialThicknessInX0Sensitive);
249 m_tree->Branch(
"MaterialThicknessPassiveInX0", &m_materialThicknessInX0Passive);
250 m_tree->Branch(
"MaterialThicknessBoundaryInX0", &m_materialThicknessInX0Boundary);
251 m_tree->Branch(
"MaterialThicknessCylinderInX0", &m_materialThicknessInX0Cylinder);
252 m_tree->Branch(
"MaterialThicknessDiscInX0", &m_materialThicknessInX0Disc);
253 m_tree->Branch(
"MaterialThicknessPlaneInX0", &m_materialThicknessInX0Plane);
254 m_tree->Branch(
"MaterialThicknessAccumulatedX0", m_materialThicknessInX0Accumulated);
255 m_tree->Branch(
"MaterialThicknessStepsInX0", m_materialThicknessInX0Steps);
256 m_tree->Branch(
"MaterialThicknessStepsInL0", m_materialThicknessInL0Steps);
257 m_tree->Branch(
"MaterialPosX", m_materialPositionX);
258 m_tree->Branch(
"MaterialPosY", m_materialPositionY);
259 m_tree->Branch(
"MaterialPosZ", m_materialPositionZ);
260 m_tree->Branch(
"MaterialPosR", m_materialPositionR);
261 m_tree->Branch(
"MaterialPosP", m_materialPositionP);
262 m_tree->Branch(
"MaterialPosPt", m_materialPositionPt);
263 m_tree->Branch(
"MaterialScaling", m_materialScaling);
264 m_tree->Branch(
"StepDirection", m_stepDirection);
267 if (m_stepwiseExtrapolation) {
268 m_tree->Branch(
"EndStepSuccessful", &m_endStepSuccessful);
269 m_tree->Branch(
"EndStepPosX", &m_endStepPositionX);
270 m_tree->Branch(
"EndStepPosY", &m_endStepPositionY);
271 m_tree->Branch(
"EndStepPosZ", &m_endStepPositionZ);
272 m_tree->Branch(
"EndStepPosR", &m_endStepPositionR);
273 m_tree->Branch(
"EndStepPhi", &m_endStepPhi);
274 m_tree->Branch(
"EndStepEta", &m_endStepEta);
275 m_tree->Branch(
"EndStepTheta", &m_endStepTheta);
276 m_tree->Branch(
"EndStepP", &m_endStepP);
277 m_tree->Branch(
"EndStepPt", &m_endStepPt);
278 m_tree->Branch(
"EndStepPathLength", &m_endStepPathLength);
279 m_tree->Branch(
"EndStepMaterialThicknessInX0", &m_endStepThicknessInX0);
283 SmartIF<ITHistSvc> tHistSvc{service(
"THistSvc")};
285 ATH_MSG_ERROR(
"initialize() Could not find Hist Service -> Switching Tree output off !");
289 if (tHistSvc && ((tHistSvc->regTree(m_treeFolder.value() + m_treeName.value(), m_tree)).isFailure())) {
290 ATH_MSG_ERROR(
"initialize() Could not register the validation Tree -> Switching Tree output off !");
294 return StatusCode::SUCCESS;
298 ATH_MSG_VERBOSE(
"Running the ExtrapolationEngineTest Test in parameters mode : " << m_parametersMode);
299 if (m_parametersMode == 0) {
300 return runTestT<Trk::NeutralParameters, Trk::NeutralPerigee>();
302 return runTestT<Trk::TrackParameters, Trk::Perigee>();
306 ATH_MSG_VERBOSE(
"Running the ExtrapolationEngineTest Test in scanning mode");
308 if (m_phiScans.empty()) {
309 ATH_MSG_VERBOSE(
"Running in scan mode: Phi scans not given. Automatically calculated.");
310 m_currentPhi = m_phiMin +
double(m_currentPhiStep + 1) * (m_phiMax - m_phiMin) /
double(m_stepsPhi);
313 if (m_currentPhiStep >=
int(m_phiScans.size())) m_currentPhiStep = 0;
314 m_currentPhi = m_phiScans[m_currentPhiStep];
318 if (m_etaScans.empty()) {
319 ATH_MSG_ERROR(
"Running in scan mode without specified eta values");
320 return StatusCode::FAILURE;
323 for (
auto etaValue : m_etaScans) {
324 m_currentEta = etaValue;
325 ATH_MSG_VERBOSE(
"Running the ExtrapolationEngineTest Test in parameters mode : " << m_parametersMode);
326 if (m_parametersMode == 0) {
327 if (runTestT<Trk::NeutralParameters, Trk::NeutralPerigee>().isFailure())
return StatusCode::FAILURE;
329 if (runTestT<Trk::TrackParameters, Trk::Perigee>().isFailure())
return StatusCode::FAILURE;
332 return StatusCode::SUCCESS;