17 #include "GaudiKernel/MsgStream.h"
18 #include "GaudiKernel/EventContext.h"
31 m_tracksName(
"InDetTrackParticles"),
32 m_InDetConversionOutputName(
"InDetConversion"),
33 m_EMExtrapolationTool(
"EMExtrapolationTools"),
34 m_doExtrapolation(false)
38 declareProperty(
"InDetConversionOutputName", m_InDetConversionOutputName);
39 declareProperty(
"ExtrapolationTool", m_EMExtrapolationTool,
"Handle of the extrapolation tool");
43 ConversionFinder::~ConversionFinder()=
default;
47 ATH_CHECK( m_VertexFinderTool.retrieve() );
49 m_doExtrapolation &= !m_EMExtrapolationTool.name().empty();
50 ATH_CHECK( m_EMExtrapolationTool.retrieve( EnableTool {m_doExtrapolation} ) );
53 ATH_CHECK( m_InDetConversionOutputName.initialize() );
56 return StatusCode::SUCCESS;
63 std::cout<<
"------------------------------------------------------------"<<std::endl;
64 std::cout<<
"Processed: " << m_events_processed<<
" events " <<std::endl;
65 std::cout<<
"Stored : " << m_Gamma_stored<<
" Conversions " <<std::endl;
66 std::cout<<
"------------------------------------------------------------"<<std::endl;
67 std::cout<<
"| Double Conversions Si-Si Si-TRT TRT-TRT |"<<std::endl;
69 std::setw(10)<<m_Double_Conversions<<
70 std::setw(18)<<m_SiSi_Conversions<<
71 std::setw(11)<<m_SiTrt_Conversions<<
72 std::setw(13)<<m_TrtTrt_Conversions<<
" |"<<
74 std::cout<<
"------------------------------------------------------------" <<std::endl;
75 std::cout<<
"| Single Conversions Si TRT |"<<std::endl;
77 std::setw(10)<<m_Single_Conversions<<
78 std::setw(25)<<m_Si_Conversions<<
79 std::setw(19)<<m_Trt_Conversions<<
" |"<<
81 std::cout<<
"------------------------------------------------------------" <<std::endl;
83 return StatusCode::SUCCESS;
86 void ConversionFinder::resetStatistics() {
87 m_events_processed = 0;
89 m_Double_Conversions = 0;
90 m_Single_Conversions = 0;
91 m_SiSi_Conversions = 0;
92 m_SiTrt_Conversions = 0;
93 m_TrtTrt_Conversions = 0;
95 m_Trt_Conversions = 0;
99 class cleanup_pair :
public std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
104 : std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>(a_pair)
126 const EventContext& ctx =Algorithm::getContext();
127 m_events_processed++;
130 if ( !trackParticleCollection.isValid())
132 ATH_MSG_WARNING(
"Could not find xAOD::TrackParticleContainer " << m_tracksName <<
" in StoreGate.");
134 return StatusCode::SUCCESS;
137 cleanup_pair conversions( m_VertexFinderTool->findVertex ( trackParticleCollection.cptr() ) );
139 if (!conversions.first || !conversions.second)
142 return StatusCode::SUCCESS;
144 ATH_MSG_DEBUG(
"New conversion container size: " << conversions.first->size());
146 m_Gamma_stored += conversions.first->size();
151 if(m_doExtrapolation){
152 float etaAtCalo = -9999., phiAtCalo = -9999.;
157 for (
unsigned int i = 0;
i <
vertex->nTrackParticles(); ++
i){
158 momentum += m_EMExtrapolationTool->getMomentumAtVertex(ctx,*
vertex,
i);
166 if (!m_EMExtrapolationTool->getEtaPhiAtCalo(ctx,
vertex, &etaAtCalo, &phiAtCalo)) {
173 acceta(*
vertex) = etaAtCalo;
174 accphi(*
vertex) = phiAtCalo;
178 analyzeResults(conversions.first);
181 if (
output.record( std::unique_ptr<xAOD::VertexContainer>(conversions.releaseFirst()) ,
182 std::unique_ptr<xAOD::VertexAuxContainer>(conversions.releaseSecond())).isFailure()) {
183 ATH_MSG_ERROR(
"Failed to record conversion vertices " << m_InDetConversionOutputName.key());
184 return StatusCode::FAILURE;
187 return StatusCode::SUCCESS;
192 for (
auto fz : *convContainer){
194 int numTracksPerVertex = fz->nTrackParticles();
195 if (numTracksPerVertex == 2) m_Double_Conversions++;
196 else m_Single_Conversions++;
198 bool isTrt1 =
false;
bool isSi1 =
false;
bool isTrt2 =
false;
bool isSi2 =
false;
199 for (
unsigned int i = 0;
i < fz->nTrackParticles() ; ++
i) {
200 const auto *trackParticle = fz->trackParticle(
i );
201 if(!trackParticle)
continue;
210 if(ncl>0) isSi1 =
true;
211 if(ncl==0 && ntrt>0) isTrt1 =
true;
214 if(ncl>0) isSi2 =
true;
215 if(ncl==0 && ntrt>0) isTrt2 =
true;
219 if(numTracksPerVertex==2){
220 if (isSi1 && isSi2) m_SiSi_Conversions++;
221 else if(isTrt1 && isTrt2) m_TrtTrt_Conversions++;
222 else m_SiTrt_Conversions++;
224 if(numTracksPerVertex==1){
225 if(isSi1) m_Si_Conversions++;
226 if(isTrt1) m_Trt_Conversions++;