ATLAS Offline Software
Loading...
Searching...
No Matches
LArG4GenShowerLib Class Reference

Class for shower library generation algorithm. More...

#include <LArG4GenShowerLib.h>

Inheritance diagram for LArG4GenShowerLib:
Collaboration diagram for LArG4GenShowerLib:

Public Member Functions

virtual StatusCode initialize () override
virtual StatusCode finalize () override
virtual StatusCode execute (const EventContext &ctx) override
 Execute method.
 AthAlgorithm (const std::string &name, ISvcLocator *pSvcLocator)
 Constructor.
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
 Get filter decision:
virtual void setFilterPassed (bool state, const EventContext &ctx) const
 Set filter decision:
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

virtual bool isReEntrant () const override final
 Legacy algorithms are not thread-safe.
void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef std::map< std::string, ShowerLib::IShowerLib * > libMap
typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

void clusterize (ShowerLib::StepInfoList *stepinfo)
const ShowerLib::StepInfoCollectiongetStepInfo ()
ShowerLib::StepInfoListcopyStepInfo (const ShowerLib::StepInfoCollection *stepinfo)
ShowerLib::StepInfoListcopyStepInfoZeroCleanup (const ShowerLib::StepInfoCollection *stepinfo)
void truncate (ShowerLib::StepInfoList *stepinfo)
HepMC::ConstGenParticlePtr getParticleFromMC ()
 return first MC truth particle for event
void calculateMoments (const ShowerLib::StepInfoCollection &eventSteps, double &weights, double &xavfra, double &yavfra, double &ravfra)
 calculate moments from StepInfoCollection
void addingTagsToLibrary ()
 adding tag information (release, detector description, ...) to library comment
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

DoubleProperty m_maxDistance
 property, see LArG4GenShowerLib::LArG4GenShowerLib
DoubleProperty m_maxRadius
 property, see LArG4GenShowerLib::LArG4GenShowerLib
DoubleProperty m_minEnergy
 property, see LArG4GenShowerLib::LArG4GenShowerLib
DoubleProperty m_containmentEnergy
 property, see LArG4GenShowerLib::LArG4GenShowerLib
DoubleProperty m_energyFraction
 property, see LArG4GenShowerLib::LArG4GenShowerLib
StringProperty m_physicslist_name
StringArrayProperty m_lib_struct_files
libMap m_libraries
 pointer to shower library
libMap m_libraries_by_filename
int m_stat_numshowers {0}
int m_stat_valid {0}
int m_stat_invalid {0}
int m_stat_nolib {0}
std::map< ShowerLib::IShowerLib *, int > m_stat_lib_saved
std::map< ShowerLib::IShowerLib *, int > m_stat_lib_notsaved
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Class for shower library generation algorithm.

Create shower library using geant hits

Author
Wolfgang Ehrenfeld, University of Hamburg, Germany
Sasha Glazov, DESY Hamburg, Germany
Version
Id
LArG4GenShowerLib.h 711210 2015-11-27 15:56:00Z jchapman

Definition at line 40 of file LArG4GenShowerLib.h.

Member Typedef Documentation

◆ libMap

typedef std::map<std::string, ShowerLib::IShowerLib*> LArG4GenShowerLib::libMap
private

Definition at line 85 of file LArG4GenShowerLib.h.

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Member Function Documentation

◆ addingTagsToLibrary()

void LArG4GenShowerLib::addingTagsToLibrary ( )
private

adding tag information (release, detector description, ...) to library comment

Definition at line 404 of file LArG4GenShowerLib.cxx.

405{
406 char* atlasProject = getenv("AtlasProject");
407 char* atlasVersion = getenv("AtlasVersion");
408 std::string atlasReleaseTag = (atlasProject? std::string(atlasProject)+std::string("-") : std::string("Unknown-"));
409 if(atlasVersion) {
410 atlasReleaseTag += std::string(atlasVersion);
411 }
412 else {
413 atlasReleaseTag += std::string("Unknown");
414 }
415
416 libMap::iterator itr;
417 for (itr = m_libraries.begin();itr != m_libraries.end();++itr){
418 // release
419 (*itr).second->release(atlasReleaseTag);
420
421 // get geometry version
422 ServiceHandle<IGeoModelSvc> geoModelSvc("GeoModelSvc", this->name());
423 (*itr).second->geometry(geoModelSvc->atlasVersion());
424
425 // get Physics list
426 (*itr).second->physicsList(m_physicslist_name);
427
428 // get geant4 version and strip off CVS Name tag
429 std::string g4Version = G4Version;
430 size_t pos = g4Version.find("$Name: ");
431 if (pos != std::string::npos) {
432 g4Version.erase(pos, 7);
433 }
434 pos = g4Version.find(" $");
435 if (pos != std::string::npos) {
436 g4Version.erase(pos, 2);
437 }
438 (*itr).second->geantVersion(g4Version);
439 }
440}
if(pathvar)
libMap m_libraries
pointer to shower library
End of vector before end of string
Definition Arrayrep.cxx:228
std::string getenv(const std::string &variableName)
get an environment variable

◆ AthAlgorithm()

AthAlgorithm::AthAlgorithm ( const std::string & name,
ISvcLocator * pSvcLocator )

Constructor.

Definition at line 31 of file AthAlgorithm.cxx.

11 :
12 AthCommonAlgorithm<Gaudi::Algorithm>( name, pSvcLocator )
13{
14 // default cardinality for non-reentrant algorithms
15 setProperty( "Cardinality", 1 ).orThrow("Unable to set property 'Cardinality'", name);
16}
void setProperty(columnar::PythonToolHandle &self, const std::string &key, nb::object value)
AthCommonAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)

◆ calculateMoments()

void LArG4GenShowerLib::calculateMoments ( const ShowerLib::StepInfoCollection & eventSteps,
double & weights,
double & xavfra,
double & yavfra,
double & ravfra )
private

calculate moments from StepInfoCollection

Definition at line 482 of file LArG4GenShowerLib.cxx.

484{
485 double escal(0.);
486 double xav(0.), yav(0.), xav2(0.), yav2(0.);
487
488 for (ShowerLib::StepInfoCollection::const_iterator i=eventSteps.begin();i<eventSteps.end(); ++i) {
489 escal += (*i)->dep();
490 xav += (*i)->x()*(*i)->dep();
491 yav += (*i)->y()*(*i)->dep();
492 xav2 += (*i)->x()*(*i)->x()*(*i)->dep();
493 yav2 += (*i)->y()*(*i)->y()*(*i)->dep();
494 }
495
496 // Center of gravity:
497 const double inv_escal = escal == 0 ? 1 : 1. / escal;
498 xavfra = xav*inv_escal;
499 yavfra = yav*inv_escal;
500 // Second momentum:
501 ravfra = std::sqrt(std::abs((xav2*inv_escal-xavfra*xavfra) +
502 (yav2*inv_escal-yavfra*yavfra)));
503 // energy is used as weights
504 weights = escal;
505
506 return;
507}
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
const std::string weights

◆ clusterize()

void LArG4GenShowerLib::clusterize ( ShowerLib::StepInfoList * stepinfo)
private

Definition at line 319 of file LArG4GenShowerLib.cxx.

320{
321 typedef std::multimap<double,Dist> distMap;
322
323 distMap distances;
324
325 //fill the map
326 for (ShowerLib::StepInfoList::iterator i_h1(stepinfo->begin()); i_h1 != stepinfo->end(); ++i_h1) {
327 //iterate only the upper triangle of N*N matrix, since we do not want to create every distance twice
328 for (ShowerLib::StepInfoList::reverse_iterator i_h2(stepinfo->rbegin()); (*i_h2) != (*i_h1); ++i_h2) {
329 distances.insert(distMap::value_type((*i_h1)->diff2(**i_h2),Dist(*i_h1, *i_h2)));
330 }
331 }
332
333 const double rmin = m_maxRadius;
334
335 int cursize = stepinfo->size();
336
337
338 while (cursize > 1) {
339 distMap::iterator iter = distances.begin();
340 while ( !( (*iter).second.h1->valid() && (*iter).second.h2->valid() ) ) {
341 distances.erase(iter++); //find the first (i.e. closest) valid pair of hits, removing invalid
342 }
343
344 if ((*iter).first > rmin ) break; //if the closest already far enough - stop
345
346 ShowerLib::StepInfo* mergedHit = (*iter).second.merge(); //merge two closest hits
347
348 for (ShowerLib::StepInfoList::iterator i_h1(stepinfo->begin()); i_h1 != stepinfo->end(); ++i_h1) {
349 if ((*i_h1)->valid()){ //only for valid hits
350 distances.insert(distMap::value_type((*i_h1)->diff2(*mergedHit),Dist(*i_h1, mergedHit))); //calculate and store distances
351 }
352 }
353
354 stepinfo->push_back(mergedHit); //store the merged hit
355 cursize--; //merging == -1 valid hit
356 }
357
358 // remove invalid
359 for (ShowerLib::StepInfoList::iterator i = stepinfo->begin(); i != stepinfo->end();) {
360 if ((*i)->valid()) {
361 ++i;
362 } else {
363 delete (*i);
364 i = stepinfo->erase(i);
365 }
366 }
367
368}
DoubleProperty m_maxRadius
property, see LArG4GenShowerLib::LArG4GenShowerLib

◆ copyStepInfo()

ShowerLib::StepInfoList * LArG4GenShowerLib::copyStepInfo ( const ShowerLib::StepInfoCollection * stepinfo)
private

Definition at line 277 of file LArG4GenShowerLib.cxx.

278{
280 ShowerLib::StepInfo *copy = nullptr;
281
282 for (ShowerLib::StepInfoCollection::const_iterator iter = stepinfo->begin(); iter!=stepinfo->end(); ++iter) {
283 copy = new ShowerLib::StepInfo(*(*iter));
284 rez->push_back(copy);
285 }
286
287 return rez;
288}
std::list< StepInfo * > StepInfoList
bool copy
Definition calibdata.py:26

◆ copyStepInfoZeroCleanup()

ShowerLib::StepInfoList * LArG4GenShowerLib::copyStepInfoZeroCleanup ( const ShowerLib::StepInfoCollection * stepinfo)
private

Definition at line 290 of file LArG4GenShowerLib.cxx.

291{
293
294 const double dsame = 1.; // 1mm^2
295 ShowerLib::StepInfo *i1 = nullptr;
296 ShowerLib::StepInfo *i2 = nullptr;
297
298 for (ShowerLib::StepInfoCollection::const_iterator i = stepinfo->begin(); i!=stepinfo->end(); ++i) {
299 if(i1 == nullptr) {
300 i1 = new ShowerLib::StepInfo(*(*i));
301 rez->push_back(i1);
302 }
303 else {
304 i2 = new ShowerLib::StepInfo(*(*i));
305 // if distance below cut off, combined and erase
306 if ( (i1)->diff2(*i2) < dsame) {
307 *i1 += *i2;
308 delete i2;
309 } else {
310 rez->push_back(i2);
311 i1 = i2;
312 }
313 }
314 }
315
316 return rez;
317}

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode LArG4GenShowerLib::execute ( const EventContext & ctx)
overridevirtual

Execute method.

Implements AthAlgorithm.

Definition at line 125 of file LArG4GenShowerLib.cxx.

126{
127 const ShowerLib::StepInfoCollection* eventStepsES = getStepInfo();
128
129 auto theParticle = getParticleFromMC();
130 if (!theParticle) {
131 ATH_MSG_ERROR ( "Couldn't get truth particle" );
132 return StatusCode::FAILURE;
133 }
134
136
137 double fraction = eventStepsES->invalid_energy/theParticle->momentum().e();
138 if (fraction > m_energyFraction) {
139 ATH_MSG_WARNING ( "Shower deposited too much energy outside the calorimeter region (" << (int)(fraction*100) << "%), ignoring" );
140 m_stat_invalid += 1;
141 return StatusCode::SUCCESS;
142 }
143 //otherwise shower is valid. even if it ultimately wont go to any library
144 m_stat_valid += 1;
145
146 ShowerLib::StepInfoList* eventSteps;
147
148 if (eventStepsES->size()>500) {
149 eventSteps = copyStepInfoZeroCleanup(eventStepsES);
150 } else {
151 eventSteps = copyStepInfo(eventStepsES);
152 }
153
154 double etot = 0.;
155 for (ShowerLib::StepInfoList::const_iterator iter = eventSteps->begin();iter != eventSteps->end();++iter) {
156 etot += (*iter)->dep();
157 }
158
159 std::stringstream location;
160
161 location << eventStepsES->detector << "/" << theParticle->pdg_id();
162
163 if (m_libraries.find(location.str()) == m_libraries.end()) {
164 ATH_MSG_WARNING ( "No library structure for " << location.str() );
165
166 for (ShowerLib::StepInfoList::iterator i(eventSteps->begin());i != eventSteps->end(); ++i) {
167 delete (*i);
168 }
169 delete eventSteps;
170 m_stat_nolib += 1;
171 return StatusCode::SUCCESS; //not really an error, just lost time
172 }
173
174 Hep3Vector origin(theParticle->production_vertex()->position().x(),
175 theParticle->production_vertex()->position().y(),
176 theParticle->production_vertex()->position().z());
177
178 // Also save direction vector. By default shower lib is created in
179 // the direction of the input particle.
180 Hep3Vector DirectionShower(theParticle->momentum().px(),
181 theParticle->momentum().py(),
182 theParticle->momentum().pz());
183 DirectionShower /= DirectionShower.mag();
184 Hep3Vector OrthoShower = DirectionShower.orthogonal();
185 OrthoShower /= OrthoShower.mag();
186 Hep3Vector CrossShower = DirectionShower.cross(OrthoShower);
187 CrossShower /= CrossShower.mag();
188
189 // Rotate the hit such that Z direction is along the shower direction
190 for (ShowerLib::StepInfoList::iterator i(eventSteps->begin()); i != eventSteps->end(); ++i) {
191 Hep3Vector HitDir = (*i)->position() - origin;
192
193 (*i)->setX(HitDir*OrthoShower);
194 (*i)->setY(HitDir*CrossShower);
195 (*i)->setZ(HitDir*DirectionShower);
196 }
197
198 ATH_MSG_VERBOSE ( "Size of input shower: " << eventSteps->size() );
199
200 clusterize(eventSteps);
201
202 ATH_MSG_VERBOSE ( "Size after clusterization: " << eventSteps->size() );
203
204 if (eventSteps->size() > 10) {
205 truncate(eventSteps);
206 ATH_MSG_VERBOSE ( "Size after truncation: " << eventSteps->size() );
207 }
208
209 double maxZ = 0, maxR = 0;
210 double edep = 0.;
211
212 double containmentEnergy = m_containmentEnergy * etot;
213
214 // sort the hits by R, make the border where 95% is deposited
215 eventSteps->sort(stepInfoDistCompare(stepInfoDistCompare::R));
216 ShowerLib::StepInfoList::const_iterator iter = eventSteps->begin();
217 for (;(iter != eventSteps->end()) && (edep < containmentEnergy);++iter) {
218 edep += (*iter)->dep();
219 maxR = (*iter)->position().r();
220 }
221
222 edep = 0.;
223 // sort the hits by Z, make the border where 95% is deposited
224 eventSteps->sort(stepInfoDistCompare(stepInfoDistCompare::Z));
225 iter = eventSteps->begin();
226 for (;(iter != eventSteps->end()) && (edep < containmentEnergy);++iter) {
227 edep += (*iter)->dep();
228 maxZ = (*iter)->position().z();
229 }
230
231 ShowerLib::Shower* shower = new ShowerLib::Shower();
232 shower->setZSize(maxZ);
233 shower->setRSize(maxR);
234
235 for (ShowerLib::StepInfoList::iterator i(eventSteps->begin());i != eventSteps->end(); ++i) {
236
237 shower->push_back(new ShowerLib::ShowerEnergySpot(G4ThreeVector((*i)->x(), (*i)->y(), (*i)->z()),(*i)->dep(),(*i)->time()));
238
239 delete (*i);
240 }
241
242 delete eventSteps;
243
244 if ((*m_libraries.find(location.str())).second->storeShower(std::move(theParticle), shower)) {
245 m_stat_lib_saved[(*m_libraries.find(location.str())).second] += 1;
246 } else {
247 ATH_MSG_WARNING ( "Wasn't able to store shower (" << location.str() << ")" );
248 m_stat_lib_notsaved[(*m_libraries.find(location.str())).second] += 1;
249 }
250
251 ATH_MSG_VERBOSE ( "Successfully finished" );
252
253 return StatusCode::SUCCESS;
254}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
size_type size() const noexcept
Returns the number of elements in the collection.
DoubleProperty m_containmentEnergy
property, see LArG4GenShowerLib::LArG4GenShowerLib
DoubleProperty m_energyFraction
property, see LArG4GenShowerLib::LArG4GenShowerLib
std::map< ShowerLib::IShowerLib *, int > m_stat_lib_notsaved
void truncate(ShowerLib::StepInfoList *stepinfo)
std::map< ShowerLib::IShowerLib *, int > m_stat_lib_saved
void clusterize(ShowerLib::StepInfoList *stepinfo)
ShowerLib::StepInfoList * copyStepInfo(const ShowerLib::StepInfoCollection *stepinfo)
HepMC::ConstGenParticlePtr getParticleFromMC()
return first MC truth particle for event
const ShowerLib::StepInfoCollection * getStepInfo()
ShowerLib::StepInfoList * copyStepInfoZeroCleanup(const ShowerLib::StepInfoCollection *stepinfo)
void setZSize(const float zsize)
Definition Shower.h:64
void setRSize(const float rsize)
Definition Shower.h:65

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 89 of file AthCommonAlgorithm.cxx.

54{
55 // If we didn't find any symlinks to add, just return the collection
56 // from the base class. Otherwise, return the extended collection.
57 if (!m_extendedExtraObjects.empty()) {
59 }
61}
Common base class for algorithms.

◆ filterPassed()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Get filter decision:

Definition at line 93 of file AthCommonAlgorithm.h.

93 {
94 return execState( ctx ).filterPassed();
95 }
virtual bool filterPassed(const EventContext &ctx) const
Get filter decision:

◆ finalize()

StatusCode LArG4GenShowerLib::finalize ( )
overridevirtual

Definition at line 443 of file LArG4GenShowerLib.cxx.

444{
445
446 // add condition tags
448
449 libMap::iterator itr;
450 for (itr = m_libraries_by_filename.begin();itr != m_libraries_by_filename.end();++itr){
451 ATH_MSG_DEBUG ( "Writing shower library to file " << (*itr).first );
452
453 TFile libr((*itr).first.c_str(),"RECREATE");
454
455 if (!(*itr).second->writeToROOT(&libr)) {
456 ATH_MSG_ERROR ( "Wasn't able to write " << (*itr).first << ". Probably empty lib." );
457 }
458
459 libr.Close();
460 }
461 if (m_stat_numshowers> 0) {
462 ATH_MSG_DEBUG ( "********Statistics for GenShowerLib********" );
463 ATH_MSG_DEBUG ( "Total number of showers: " << m_stat_numshowers
464 << ", valid: "<< m_stat_valid << " (" << (m_stat_valid*100)/m_stat_numshowers << "%)"
465 << ", invalid: " << m_stat_invalid << " (" << (m_stat_invalid*100)/m_stat_numshowers << "%)" );
466 for (itr = m_libraries.begin();itr != m_libraries.end();++itr){
467 ATH_MSG_DEBUG ( "*******************************************" );
468 std::stringstream ss((*itr).second->statistics());
469 for(std::string line; std::getline(ss,line);)
470 ATH_MSG_DEBUG ( line );
471 ATH_MSG_DEBUG ( "Saved: " << m_stat_lib_saved[(*itr).second] << " Rejected: " << m_stat_lib_notsaved[(*itr).second] );
472 }
473 ATH_MSG_DEBUG ( "*******************************************" );
474 ATH_MSG_DEBUG ( "Showers with no corresponding library: " << m_stat_nolib << " (" << (m_stat_nolib*100)/m_stat_numshowers << "%)" );
475 }
476 ATH_MSG_DEBUG ( "Finalized." );
477
478 return StatusCode::SUCCESS;
479}
#define ATH_MSG_DEBUG(x)
static Double_t ss
void addingTagsToLibrary()
adding tag information (release, detector description, ...) to library comment

◆ getParticleFromMC()

HepMC::ConstGenParticlePtr LArG4GenShowerLib::getParticleFromMC ( )
private

return first MC truth particle for event

Definition at line 256 of file LArG4GenShowerLib.cxx.

257{
258 const McEventCollection* mcEvent;
259 if (evtStore()->retrieve(mcEvent,"GEN_EVENT").isFailure()) return nullptr;
260
261 // Return the last particle of the event.
262 if (mcEvent)
263 return !mcEvent->at(0)->particles().empty() ? mcEvent->at(0)->particles().back() : nullptr;
264
265 return nullptr;
266}
ServiceHandle< StoreGateSvc > & evtStore()
const T * at(size_type n) const
Access an element, as an rvalue.

◆ getStepInfo()

const ShowerLib::StepInfoCollection * LArG4GenShowerLib::getStepInfo ( )
private

Definition at line 268 of file LArG4GenShowerLib.cxx.

269{
270 const ShowerLib::StepInfoCollection* eventStepsES;
271 if (evtStore()->retrieve(eventStepsES, "EventSteps").isFailure()) return nullptr;
272
273 return eventStepsES;
274
275}

◆ initialize()

StatusCode LArG4GenShowerLib::initialize ( )
overridevirtual

Definition at line 84 of file LArG4GenShowerLib.cxx.

85{
86 ATH_MSG_DEBUG ( "Initializing" );
87
88 ShowerLib::IShowerLib* library = nullptr;
89
90 std::vector< std::string >::const_iterator nameiter;
91
92 ATH_MSG_DEBUG ( "Starting struct files iteration" );
93 for (nameiter = m_lib_struct_files.value().begin(); nameiter != m_lib_struct_files.value().end(); ++nameiter ) {
94
95 ATH_MSG_DEBUG ( "Struct file: " << (*nameiter) );
96
97 library = ShowerLib::iterateStruct(*nameiter);
98
99 if (library == nullptr) {
100 ATH_MSG_WARNING ( "Library structure file " << (*nameiter) << " doesn't describe a valid library" );
101 continue;
102 }
103
104 std::stringstream location;
105 location << library->detector() << "/" << library->particle_id();
106 m_libraries[location.str()] = library;
107 m_libraries_by_filename[(*nameiter)+".root"] = library;
108 m_stat_lib_saved[library]=0;
109 m_stat_lib_notsaved[library]=0;
110
111 ATH_MSG_VERBOSE ( "Library named " << (*nameiter)+".root" << "is stored at the location " << location.str() );
112
113 }
114
115 if (m_libraries.empty()) {
116 ATH_MSG_ERROR ( "No valid library structure files found. Further execution is pointless." );
117 return StatusCode::FAILURE;
118 }
119
120 ATH_MSG_DEBUG ( "LArG4GenShowerLib " << this->name() << " initialized" );
121
122 return StatusCode::SUCCESS;
123}
StringArrayProperty m_lib_struct_files
virtual int particle_id() const
get particle tag
Definition IShowerLib.h:124
virtual const std::string detector() const
get detector tag
Definition IShowerLib.h:121
IShowerLib * iterateStruct(const std::string &fname)

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::isClonable ( ) const
inlineoverridevirtualinherited

Specify if the algorithm is clonable.

Only relevant for non-reentrant algorithms. Actual number of clones needs to be set via the "Cardinality" property.

Reimplemented in AFP_DigiTop, AlgB, AlgT, BCM_Digitization, CscDigitBuilder, CscDigitToCscRDO, G4AtlasAlg, G4RunAlg, HGTD_Digitization, HiveAlgBase, InDet::GNNSeedingTrackMaker, InDet::SCT_Clusterization, InDet::SiSPGNNTrackMaker, InDet::SiSPSeededTrackFinder, InDet::SiTrackerSpacePointFinder, ISF::SimKernelMT, ITk::StripDigitization, ITkPixelCablingAlg, ITkStripCablingAlg, LArHitEMapMaker, LArTTL1Maker, LUCID_DigiTop, LVL1::L1TopoSimulation, MergeCalibHits, MergeGenericMuonSimHitColl, MergeHijingPars, MergeMcEventCollection, MergeTrackRecordCollection, MergeTruthJets, MergeTruthParticles, MuonDigitizer, PileUpMTAlg, PixelDigitization, RoIBResultToxAOD, SCT_ByteStreamErrorsTestAlg, SCT_CablingCondAlgFromCoraCool, SCT_CablingCondAlgFromText, SCT_ConditionsParameterTestAlg, SCT_ConditionsSummaryTestAlg, SCT_ConfigurationConditionsTestAlg, SCT_Digitization, SCT_FlaggedConditionTestAlg, SCT_LinkMaskingTestAlg, SCT_MajorityConditionsTestAlg, SCT_ModuleVetoTestAlg, SCT_MonitorConditionsTestAlg, SCT_PrepDataToxAOD, SCT_RawDataToxAOD, SCT_ReadCalibChipDataTestAlg, SCT_ReadCalibDataTestAlg, SCT_RODVetoTestAlg, SCT_SensorsTestAlg, SCT_SiliconConditionsTestAlg, SCT_StripVetoTestAlg, SCT_TdaqEnabledTestAlg, SCT_TestCablingAlg, SCTEventFlagWriter, SCTRawDataProvider, SCTSiLorentzAngleTestAlg, SCTSiPropertiesTestAlg, SGInputLoader, Simulation::BeamEffectsAlg, TileHitVecToCnt, TileMuonFitter, TilePulseForTileMuonReceiver, TileRawChannelMaker, TRTDigitization, and ZDC_DigiTop.

Definition at line 68 of file AthCommonAlgorithm.h.

68 {
69 return true;
70 }

◆ isReEntrant()

virtual bool AthAlgorithm::isReEntrant ( ) const
inlinefinaloverrideprotectedvirtualinherited

Legacy algorithms are not thread-safe.

Definition at line 47 of file AthAlgorithm.h.

47{ return false; }

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Set filter decision:

Reimplemented in AthFilterAlgorithm.

Definition at line 99 of file AthCommonAlgorithm.h.

99 {
101 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Set filter decision:

◆ sysExecute()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Reimplemented in AthAnalysisAlgorithm.

Definition at line 80 of file AthCommonAlgorithm.cxx.

41{
42 return BaseAlg::sysExecute (ctx);
43}

◆ sysInitialize()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthFilterAlgorithm, AthHistogramAlgorithm, HypoBase, InputMakerBase, and PyAthena::Alg.

Definition at line 60 of file AthCommonAlgorithm.cxx.

71 {
73
74 if (sc.isFailure()) {
75 return sc;
76 }
77
78 ServiceHandle<ICondSvc> cs("CondSvc",name());
79 for (auto h : outputHandles()) {
80 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
81 // do this inside the loop so we don't create the CondSvc until needed
82 if ( cs.retrieve().isFailure() ) {
83 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
85 }
86 if (cs->regHandle(this,*h).isFailure()) {
88 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
89 << " with CondSvc");
90 }
91 }
92 }
93 return sc;
94}
virtual StatusCode sysInitialize() override
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ truncate()

void LArG4GenShowerLib::truncate ( ShowerLib::StepInfoList * stepinfo)
private

Definition at line 370 of file LArG4GenShowerLib.cxx.

371{
372 double etot = 0;
373 stepinfo->sort(stepInfoDistCompare(stepInfoDistCompare::RHO));
374
375 for (ShowerLib::StepInfoList::const_iterator i(stepinfo->begin()); i != stepinfo->end(); ++i) {
376 etot += (*i)->dep();
377 }
378
379 double minEnergy = m_minEnergy * etot;
380 double rsum = 0.;
381 ShowerLib::StepInfoList::iterator iterCut;
382 //we're continuing our cycle if (we're not at the end yet) && ( (the current hit is still inside maxDistance radius) || (the total energy still less then the threshold) )
383 for (iterCut = stepinfo->begin(); (iterCut != stepinfo->end()) && (((*iterCut)->position().mag2() < m_maxDistance) || (rsum < minEnergy));++iterCut) {
384 rsum += (*iterCut)->dep();
385 }
386
387 if (iterCut == stepinfo->end()) {
388 return;
389 }
390
391 stepinfo->erase(iterCut,stepinfo->end());
392
393 if (rsum == 0) { //WTF?
394 return;
395 }
396
397 const double inv_rsum = 1. / rsum;
398 for (iterCut = stepinfo->begin(); iterCut != stepinfo->end(); ++iterCut){
399 (*iterCut)->setE((*iterCut)->dep() * etot*inv_rsum);
400 }
401
402}
DoubleProperty m_maxDistance
property, see LArG4GenShowerLib::LArG4GenShowerLib
DoubleProperty m_minEnergy
property, see LArG4GenShowerLib::LArG4GenShowerLib

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_containmentEnergy

DoubleProperty LArG4GenShowerLib::m_containmentEnergy
private
Initial value:
{this, "ContainmentEnergy", 0.95
, "energy fraction that will be inside containment borders"}

property, see LArG4GenShowerLib::LArG4GenShowerLib

Definition at line 76 of file LArG4GenShowerLib.h.

76 {this, "ContainmentEnergy", 0.95
77 , "energy fraction that will be inside containment borders"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_energyFraction

DoubleProperty LArG4GenShowerLib::m_energyFraction
private
Initial value:
{this, "EnergyFraction", .02
, "the allowed amount of energy that can be deposited outside calorimeter region"}

property, see LArG4GenShowerLib::LArG4GenShowerLib

Definition at line 78 of file LArG4GenShowerLib.h.

78 {this, "EnergyFraction", .02
79 , "the allowed amount of energy that can be deposited outside calorimeter region"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 108 of file AthCommonAlgorithm.h.

◆ m_lib_struct_files

StringArrayProperty LArG4GenShowerLib::m_lib_struct_files
private
Initial value:
{this, "LibStructFiles", {}
, "List of files to read library structures from"}

Definition at line 82 of file LArG4GenShowerLib.h.

82 {this, "LibStructFiles", {}
83 , "List of files to read library structures from"};

◆ m_libraries

libMap LArG4GenShowerLib::m_libraries
private

pointer to shower library

Definition at line 86 of file LArG4GenShowerLib.h.

◆ m_libraries_by_filename

libMap LArG4GenShowerLib::m_libraries_by_filename
private

Definition at line 87 of file LArG4GenShowerLib.h.

◆ m_maxDistance

DoubleProperty LArG4GenShowerLib::m_maxDistance
private
Initial value:
{this, "MaxDistance", 50000.
, "max distance squared after which the hits will be truncated"}

property, see LArG4GenShowerLib::LArG4GenShowerLib

Definition at line 70 of file LArG4GenShowerLib.h.

70 {this, "MaxDistance", 50000.
71 , "max distance squared after which the hits will be truncated"};

◆ m_maxRadius

DoubleProperty LArG4GenShowerLib::m_maxRadius
private
Initial value:
{this, "MaxRadius", 25.
, "maximal radius squared until two hits will be combined"}

property, see LArG4GenShowerLib::LArG4GenShowerLib

Definition at line 72 of file LArG4GenShowerLib.h.

72 {this, "MaxRadius", 25.
73 , "maximal radius squared until two hits will be combined"};

◆ m_minEnergy

DoubleProperty LArG4GenShowerLib::m_minEnergy
private
Initial value:
{this, "MinEnergy", .99
, "energy border, that truncation won't cross"}

property, see LArG4GenShowerLib::LArG4GenShowerLib

Definition at line 74 of file LArG4GenShowerLib.h.

74 {this, "MinEnergy", .99
75 , "energy border, that truncation won't cross"};

◆ m_physicslist_name

StringProperty LArG4GenShowerLib::m_physicslist_name
private
Initial value:
{this, "PhysicsList", "FTFP_BERT"
, "Geant4 PhysicsList used in the simulation"}

Definition at line 80 of file LArG4GenShowerLib.h.

80 {this, "PhysicsList", "FTFP_BERT"
81 , "Geant4 PhysicsList used in the simulation"};

◆ m_stat_invalid

int LArG4GenShowerLib::m_stat_invalid {0}
private

Definition at line 91 of file LArG4GenShowerLib.h.

91{0};

◆ m_stat_lib_notsaved

std::map<ShowerLib::IShowerLib*, int> LArG4GenShowerLib::m_stat_lib_notsaved
private

Definition at line 95 of file LArG4GenShowerLib.h.

◆ m_stat_lib_saved

std::map<ShowerLib::IShowerLib*, int> LArG4GenShowerLib::m_stat_lib_saved
private

Definition at line 94 of file LArG4GenShowerLib.h.

◆ m_stat_nolib

int LArG4GenShowerLib::m_stat_nolib {0}
private

Definition at line 92 of file LArG4GenShowerLib.h.

92{0};

◆ m_stat_numshowers

int LArG4GenShowerLib::m_stat_numshowers {0}
private

Definition at line 89 of file LArG4GenShowerLib.h.

89{0};

◆ m_stat_valid

int LArG4GenShowerLib::m_stat_valid {0}
private

Definition at line 90 of file LArG4GenShowerLib.h.

90{0};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: