diff --git a/DDDigi/include/DDDigi/DigiData.h b/DDDigi/include/DDDigi/DigiData.h index 02c6b4804078a2ac899de672ff84dd400c4e7675..72d63000f3d21538b5bae5393a2de3c22ec509e4 100644 --- a/DDDigi/include/DDDigi/DigiData.h +++ b/DDDigi/include/DDDigi/DigiData.h @@ -55,6 +55,9 @@ namespace dd4hep { key_type key; /// Second union entry to use for discrimination struct { + // Ordering is important here: + // We want to group the containers by item ie. by container name + // and not by mask itemkey_type item; mask_type mask; mask_type spare; @@ -85,6 +88,14 @@ namespace dd4hep { key_type toLong() const { return key; } + /// Project the mask part of the key + itemkey_type item() { + return this->values.item; + } + /// Project the item part of the key + mask_type mask() { + return this->values.mask; + } /// Generate key using hash algorithm void set(const std::string& name, int mask); @@ -96,6 +107,14 @@ namespace dd4hep { static mask_type mask(key_type k) { return Key(k).values.mask; } + /// Project the mask part of the key + static itemkey_type item(Key k) { + return k.values.item; + } + /// Project the item part of the key + static mask_type mask(Key k) { + return k.values.mask; + } /// Access key name (if registered properly) static std::string key_name(const Key& key); }; @@ -265,6 +284,43 @@ namespace dd4hep { { } + /// Energy deposit vector definition for digitization + /** Energy deposit vector definition for digitization + * + * \author M.Frank + * \version 1.0 + * \ingroup DD4HEP_DIGITIZATION + */ + class DepositVector : public std::vector<std::pair<CellID, EnergyDeposit> > { + public: + std::string name { }; + Key key { 0x0 }; + + public: + /// Initializing constructor + DepositVector(const std::string& name, Key::mask_type mask); + /// Default constructor + DepositVector() = default; + /// Disable move constructor + DepositVector(DepositVector&& copy) = default; + /// Disable copy constructor + DepositVector(const DepositVector& copy) = default; + /// Default destructor + virtual ~DepositVector() = default; + /// Disable move assignment + DepositVector& operator=(DepositVector&& copy) = default; + /// Disable copy assignment + DepositVector& operator=(const DepositVector& copy) = default; + /// Merge new deposit map onto existing map (not thread safe!) + std::size_t merge(DepositVector&& updates); + }; + + /// Initializing constructor + inline DepositVector::DepositVector(const std::string& n, Key::mask_type mask) + : name(n), key(mask, n) + { + } + /// Energy deposit mapping definition for digitization /** Energy deposit mapping definition for digitization * @@ -292,7 +348,6 @@ namespace dd4hep { DepositMapping& operator=(DepositMapping&& copy) = default; /// Disable copy assignment DepositMapping& operator=(const DepositMapping& copy) = default; - /// Merge new deposit map onto existing map (not thread safe!) std::size_t merge(DepositMapping&& updates); }; diff --git a/DDDigi/include/DDDigi/DigiInputAction.h b/DDDigi/include/DDDigi/DigiInputAction.h index ab41c5e2bd2911be65e63078dee31dad701c5112..ca3690b12550fbd401242e3c569ed1203f9c0fd4 100644 --- a/DDDigi/include/DDDigi/DigiInputAction.h +++ b/DDDigi/include/DDDigi/DigiInputAction.h @@ -56,6 +56,7 @@ namespace dd4hep { DigiInputAction(const DigiKernel& kernel, const std::string& nam); /// Default destructor virtual ~DigiInputAction(); + /// Callback to read event input virtual void execute(DigiContext& context) const override; }; diff --git a/DDDigi/include/DDDigi/DigiKernel.h b/DDDigi/include/DDDigi/DigiKernel.h index 29fb36891d37228a091dd7a898ddfdd6d3ef9870..0bd549d99aa01412e0e9afcaf5fe522d22dd5344 100644 --- a/DDDigi/include/DDDigi/DigiKernel.h +++ b/DDDigi/include/DDDigi/DigiKernel.h @@ -42,6 +42,20 @@ namespace dd4hep { typedef std::map<std::string,int> ClientOutputLevels; typedef std::pair<void*, const std::type_info*> UserFramework; + class CallWrapper { + public: + CallWrapper* worker { nullptr }; + public: + CallWrapper(CallWrapper* worker); + CallWrapper() = default; + CallWrapper(CallWrapper&& copy) = default; + CallWrapper(const CallWrapper& copy) = default; + CallWrapper& operator=(CallWrapper&& copy) = delete; + CallWrapper& operator=(const CallWrapper& copy) = delete; + virtual ~CallWrapper() = default; + virtual void operator()() const; + }; + private: class Internals; class Processor; @@ -148,20 +162,40 @@ namespace dd4hep { DigiActionSequence& eventAction() const; /// Access to the main output action sequence from the kernel object DigiActionSequence& outputAction() const; + + /// Submit a bunch of actions to be executed in parallel + virtual void submit (const std::vector<CallWrapper*>& algorithms) const; + /// Submit a bunch of actions to be executed serially + virtual void execute(const std::vector<CallWrapper*>& algorithms) const; + /// Submit a bunch of actions to be executed in parallel virtual void submit (const DigiAction::Actors<DigiEventAction>& algorithms, DigiContext& context) const; /// Submit a bunch of actions to be executed serially virtual void execute(const DigiAction::Actors<DigiEventAction>& algorithms, DigiContext& context) const; + /// If running multithreaded: wait until the thread-group finished execution virtual void wait(DigiContext& context) const; + }; + + inline DigiKernel::CallWrapper::CallWrapper(CallWrapper* w) + : worker(w) + { + } + + inline void DigiKernel::CallWrapper::operator()() const { + if ( this->worker ) { + (*this->worker)(); + } + } + /// Declare property - template <typename T> DigiKernel& DigiKernel::declareProperty(const std::string& nam, T& val) { + template <typename T> inline DigiKernel& DigiKernel::declareProperty(const std::string& nam, T& val) { properties().add(nam, val); return *this; } /// Declare property - template <typename T> DigiKernel& DigiKernel::declareProperty(const char* nam, T& val) { + template <typename T> inline DigiKernel& DigiKernel::declareProperty(const char* nam, T& val) { properties().add(nam, val); return *this; } diff --git a/DDDigi/include/DDDigi/DigiMultiContainerProcessor.h b/DDDigi/include/DDDigi/DigiMultiContainerProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..1b0c7c0ed9d21f33801591472f510902fac7aa3a --- /dev/null +++ b/DDDigi/include/DDDigi/DigiMultiContainerProcessor.h @@ -0,0 +1,140 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : M.Frank +// +//========================================================================== +#ifndef DDDIGI_DIGIMULTICONTAINERPROCESSOR_H +#define DDDIGI_DIGIMULTICONTAINERPROCESSOR_H + +// Framework include files +#include <DDDigi/DigiData.h> +#include <DDDigi/DigiKernel.h> +#include <DDDigi/DigiActionSequence.h> + +/// C/C++ include files +#include <set> + +/// Namespace for the AIDA detector description toolkit +namespace dd4hep { + + /// Namespace for the Digitization part of the AIDA detector description toolkit + namespace digi { + + /// Wrapper class to submit bulk actions + /** + * + * \author M.Frank + * \version 1.0 + * \ingroup DD4HEP_SIMULATION + */ + template <typename ACTION_TYPE, typename OPTIONS> + class DigiParallelWorker : public DigiKernel::CallWrapper { + ACTION_TYPE* processor { nullptr }; + public: + OPTIONS options; + + public: + DigiParallelWorker(ACTION_TYPE* p, const OPTIONS& opts); + DigiParallelWorker() = default; + DigiParallelWorker(DigiParallelWorker&& copy) = default; + DigiParallelWorker(const DigiParallelWorker& copy) = delete; + DigiParallelWorker& operator=(DigiParallelWorker&& copy) = delete; + DigiParallelWorker& operator=(const DigiParallelWorker& copy) = delete; + virtual ~DigiParallelWorker(); + const char* name() const { return processor->name().c_str(); } + virtual void operator()() const override final; + }; + + template <typename ACTION_TYPE, typename OPTIONS> + DigiParallelWorker<ACTION_TYPE, OPTIONS>::DigiParallelWorker(ACTION_TYPE* p, const OPTIONS& opts) + : processor(p), options(opts) + { + processor->addRef(); + } + + template <typename ACTION_TYPE, typename OPTIONS> + DigiParallelWorker<ACTION_TYPE, OPTIONS>::~DigiParallelWorker() { + if ( processor ) { + processor->release(); + processor = nullptr; + } + } + + + /// Worker base class to analyse containers from the input segment in parallel + class DigiContainerProcessor : public DigiAction { + + public: + using WorkItems = std::vector<std::pair<Key, std::any*> >; + + public: + /// Property: Input data segment name + std::string m_input_segment { "inputs" }; + /// Property: event masks to be handled + std::vector<int> m_input_masks { }; + /// Item keys required by this worker + std::vector<Key> m_work_keys; + + public: + /// Standard constructor + DigiContainerProcessor(const DigiKernel& kernel, const std::string& name); + /// Main functional callback if specific work is known + virtual void execute(DigiContext& context, WorkItems& work) const; + }; + + + /// Sequencer class to analyse containers from the input segment in parallel + /** + * + * \author M.Frank + * \version 1.0 + * \ingroup DD4HEP_SIMULATION + */ + class DigiMultiContainerProcessor : public DigiEventAction { + public: + using WorkItems = DigiContainerProcessor::WorkItems; + struct ProcessorOptions { + DigiContext* context { nullptr }; + WorkItems* work { nullptr }; + std::vector<Key> keys { }; + }; + using Worker = DigiParallelWorker<DigiContainerProcessor,ProcessorOptions>; + using Workers = std::vector<std::unique_ptr<Worker> >; + using Callers = std::vector<DigiKernel::CallWrapper*>; + + protected: + /// Property: Input data segment name + std::string m_input_segment { "inputs" }; + /// Property: event masks to be handled + std::vector<int> m_input_masks { }; + /// Property: Allow for multiple workers accessing same container + bool m_allow_duplicates { true }; + + std::set<Key> m_work_items; + Workers m_workers; + Callers m_callers; + + protected: + /// Define standard assignments and constructors + DDDIGI_DEFINE_ACTION_CONSTRUCTORS(DigiMultiContainerProcessor); + /// Default destructor + virtual ~DigiMultiContainerProcessor(); + + public: + /// Standard constructor + DigiMultiContainerProcessor(const DigiKernel& kernel, const std::string& name); + /// Adopt new parallel worker + void adopt_processor(DigiContainerProcessor* action, const std::vector<std::string>& containers); + /// Main functional callback + virtual void execute(DigiContext& context) const; + }; + } // End namespace digi +} // End namespace dd4hep +#endif // DDDIGI_DIGIMULTICONTAINERPROCESSOR_H diff --git a/DDDigi/include/DDDigi/DigiSegmentAction.h b/DDDigi/include/DDDigi/DigiSegmentAction.h new file mode 100644 index 0000000000000000000000000000000000000000..ab265c7849152670c44fc6e7df9042a92c91704d --- /dev/null +++ b/DDDigi/include/DDDigi/DigiSegmentAction.h @@ -0,0 +1,70 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : M.Frank +// +//========================================================================== +#ifndef DDDIGI_DIGISEGMENTACTION_H +#define DDDIGI_DIGISEGMENTACTION_H + +// Framework include files +#include <DDDigi/DigiData.h> +#include <DDDigi/DigiEventAction.h> + +/// Namespace for the AIDA detector description toolkit +namespace dd4hep { + + /// Namespace for the Digitization part of the AIDA detector description toolkit + namespace digi { + + /// Forward declarations + class DigiSegmentAction; + class DigiSegmentContext; + class DigiSegmentationSplitter; + + /// Default base class for all Digitizer actions and derivates thereof. + /** + * This is a utility class supporting properties, output and access to + * event and run objects through the context. + * + * \author M.Frank + * \version 1.0 + * \ingroup DD4HEP_SIMULATION + */ + class DigiSegmentAction : public DigiEventAction { + private: + friend class DigiSegmentationSplitter; + + /// Implementation declaration +#if defined(G__ROOT) || defined(__CLING__) || defined(__ROOTCLING__) + typedef long internals_t; +#else + class internals_t; +#endif + /// Reference to the implementation + std::unique_ptr<internals_t> internals; + + /// Define standard assignments and constructors + DDDIGI_DEFINE_ACTION_CONSTRUCTORS(DigiSegmentAction); + + public: + /// Standard constructor + DigiSegmentAction(const DigiKernel& kernel, const std::string& name); + /// Default destructor + virtual ~DigiSegmentAction(); + /// Main functional callback + virtual void execute(DigiContext& context) const final; + /// Main functional callback. Default implementnation is noop. + virtual DepositVector handleSegment(DigiContext& context, + const DigiSegmentContext& segment, + const DepositMapping& deposits) const; + }; + } // End namespace digi +} // End namespace dd4hep +#endif // DDDIGI_DIGISEGMENTACTION_H diff --git a/DDDigi/include/DDDigi/DigiSegmentationSplitter.h b/DDDigi/include/DDDigi/DigiSegmentationSplitter.h index 3c9e72a24d99e145f3bc0e5a530bd6748669eb53..f380de57e43ee8241055169d344ecbbad9be9aa5 100644 --- a/DDDigi/include/DDDigi/DigiSegmentationSplitter.h +++ b/DDDigi/include/DDDigi/DigiSegmentationSplitter.h @@ -14,8 +14,7 @@ #define DDDIGI_DIGISEGMENTATIONSPLITTER_H // Framework include files -#include <DDDigi/DigiData.h> -#include <DDDigi/DigiEventAction.h> +#include <DDDigi/DigiSegmentAction.h> #include <DDDigi/DigiActionSequence.h> #include <DDDigi/DigiSegmentationTool.h> @@ -25,47 +24,6 @@ namespace dd4hep { /// Namespace for the Digitization part of the AIDA detector description toolkit namespace digi { - /// Forward declarations - class DigiSegmentAction; - class DigiSegmentContext; - class DigiSegmentationSplitter; - - /// Default base class for all Digitizer actions and derivates thereof. - /** - * This is a utility class supporting properties, output and access to - * event and run objects through the context. - * - * \author M.Frank - * \version 1.0 - * \ingroup DD4HEP_SIMULATION - */ - class DigiSegmentAction : public DigiEventAction { - private: - friend class DigiSegmentationSplitter; - - /// Implementation declaration - class internals_t; - /// Reference to the implementation - std::unique_ptr<internals_t> internals; - - /// Define standard assignments and constructors - DDDIGI_DEFINE_ACTION_CONSTRUCTORS(DigiSegmentAction); - - public: - /// Standard constructor - DigiSegmentAction(const DigiKernel& kernel, const std::string& name); - /// Default destructor - virtual ~DigiSegmentAction(); - - /// Main functional callback - virtual void execute(DigiContext& context) const final; - /// Main functional callback - std::vector<std::pair<Key::key_type, std::any> > - handleSegment(DigiContext& context, - const DigiSegmentContext& segment, - const DepositMapping& deposits) const; - }; - /// Default base class for all Digitizer actions and derivates thereof. /** * This is a utility class supporting properties, output and access to @@ -107,8 +65,6 @@ namespace dd4hep { std::vector<Key> m_data_keys; protected: - /// Define standard assignments and constructors - DDDIGI_DEFINE_ACTION_CONSTRUCTORS(DigiSegmentationSplitter); /// Default destructor virtual ~DigiSegmentationSplitter(); diff --git a/DDDigi/include/DDDigi/DigiSegmentationTool.h b/DDDigi/include/DDDigi/DigiSegmentationTool.h index 8d1b1ffa74c0c5f1f8dfc7c4f2e4112fa95fea0e..0e4858ab1b19b32e54b21ae48324815ea6154c68 100644 --- a/DDDigi/include/DDDigi/DigiSegmentationTool.h +++ b/DDDigi/include/DDDigi/DigiSegmentationTool.h @@ -14,6 +14,7 @@ #define DDDIGI_DIGISEGMENTATIONTOOL_H // Framework include files +#include <DDDigi/DigiData.h> #include <DD4hep/Detector.h> #include <DD4hep/DetElement.h> @@ -55,16 +56,20 @@ namespace dd4hep { /// Split field name const char* cname() const; /// Get the identifier of the cell to be split - uint32_t split_id(uint64_t cell_id) const { - return int( (cell_id & this->split_mask) >> this->offset ); + uint32_t split_id(uint64_t cell) const { + return int( (cell & this->split_mask) >> this->offset ); } /// The CELL ID part of the identifier - uint64_t cell_id(uint64_t cell_id) const { - return ( (cell_id & this->cell_mask) >> (this->offset + width) ); + uint64_t cell_id(uint64_t cell) const { + return ( (cell & this->cell_mask) >> (this->offset + width) ); } /// The identifier of the parent detector - uint64_t detector_id(uint64_t cell_id) const { - return (cell_id & this->det_mask); + uint64_t detector_id(uint64_t cell) const { + return (cell & this->det_mask); + } + /// Check a given cell id if it matches this selection + bool matches(uint64_t cell) const { + return this->split_id(cell) == this->id; } }; diff --git a/DDDigi/include/DDDigi/noise/DigiExponentialNoise.h b/DDDigi/include/DDDigi/noise/DigiExponentialNoise.h index 1a489961c1c3d351065f467316bd08d3b8c27a37..29be3beefb23f6d6a7fc1ec56de7235e9d236fed 100644 --- a/DDDigi/include/DDDigi/noise/DigiExponentialNoise.h +++ b/DDDigi/include/DDDigi/noise/DigiExponentialNoise.h @@ -10,8 +10,8 @@ // Author : M.Frank // //========================================================================== -#ifndef DDDIGI_DIGIEXPONENTIALNOISE_H -#define DDDIGI_DIGIEXPONENTIALNOISE_H +#ifndef DDDIGI_NOISE_DIGIEXPONENTIALNOISE_H +#define DDDIGI_NOISE_DIGIEXPONENTIALNOISE_H /// Framework include files #include <DDDigi/DigiSignalProcessor.h> @@ -47,4 +47,4 @@ namespace dd4hep { }; } // End namespace digi } // End namespace dd4hep -#endif // DDDIGI_DIGIEXPONENTIALNOISE_H +#endif // DDDIGI_NOISE_DIGIEXPONENTIALNOISE_H diff --git a/DDDigi/include/DDDigi/noise/DigiGaussianNoise.h b/DDDigi/include/DDDigi/noise/DigiGaussianNoise.h index 177d2397afc1807a11d48311a31412e205901295..ad8f7b23d83f84d968ee22706739af6139111676 100644 --- a/DDDigi/include/DDDigi/noise/DigiGaussianNoise.h +++ b/DDDigi/include/DDDigi/noise/DigiGaussianNoise.h @@ -10,8 +10,8 @@ // Author : M.Frank // //========================================================================== -#ifndef DDDIGI_DIGIGAUSSIANNOISE_H -#define DDDIGI_DIGIGAUSSIANNOISE_H +#ifndef DDDIGI_NOISE_DIGIGAUSSIANNOISE_H +#define DDDIGI_NOISE_DIGIGAUSSIANNOISE_H /// Framework include files #include <DDDigi/DigiSignalProcessor.h> @@ -54,4 +54,4 @@ namespace dd4hep { }; } // End namespace digi } // End namespace dd4hep -#endif // DDDIGI_DIGIGAUSSIANNOISE_H +#endif // DDDIGI_NOISE_DIGIGAUSSIANNOISE_H diff --git a/DDDigi/include/DDDigi/noise/DigiLandauNoise.h b/DDDigi/include/DDDigi/noise/DigiLandauNoise.h index 42eaf0dc89a134db74413b658249136217cb5033..f69ff79719611c7e518c2d92aaf23f73d9d900d2 100644 --- a/DDDigi/include/DDDigi/noise/DigiLandauNoise.h +++ b/DDDigi/include/DDDigi/noise/DigiLandauNoise.h @@ -10,8 +10,8 @@ // Author : M.Frank // //========================================================================== -#ifndef DDDIGI_DIGILANDAUNOISE_H -#define DDDIGI_DIGILANDAUNOISE_H +#ifndef DDDIGI_NOISE_DIGILANDAUNOISE_H +#define DDDIGI_NOISE_DIGILANDAUNOISE_H /// Framework include files #include <DDDigi/DigiSignalProcessor.h> @@ -54,4 +54,4 @@ namespace dd4hep { }; } // End namespace digi } // End namespace dd4hep -#endif // DDDIGI_DIGILANDAUNOISE_H +#endif // DDDIGI_NOISE_DIGILANDAUNOISE_H diff --git a/DDDigi/include/DDDigi/noise/DigiPoissonNoise.h b/DDDigi/include/DDDigi/noise/DigiPoissonNoise.h index bb7d848b910a5e7e3e023de2dc602c1278d3962f..bd61aceb062bb3284b03b12b3287f77381827095 100644 --- a/DDDigi/include/DDDigi/noise/DigiPoissonNoise.h +++ b/DDDigi/include/DDDigi/noise/DigiPoissonNoise.h @@ -10,8 +10,8 @@ // Author : M.Frank // //========================================================================== -#ifndef DDDIGI_DIGIPOISSONNOISE_H -#define DDDIGI_DIGIPOISSONNOISE_H +#ifndef DDDIGI_NOISE_DIGIPOISSONNOISE_H +#define DDDIGI_NOISE_DIGIPOISSONNOISE_H /// Framework include files #include <DDDigi/DigiSignalProcessor.h> @@ -52,4 +52,4 @@ namespace dd4hep { }; } // End namespace digi } // End namespace dd4hep -#endif // DDDIGI_DIGIPOISSONNOISE_H +#endif // DDDIGI_NOISE_DIGIPOISSONNOISE_H diff --git a/DDDigi/include/DDDigi/noise/DigiRandomNoise.h b/DDDigi/include/DDDigi/noise/DigiRandomNoise.h index 75e637e024f74953c77ef84207a16b137b1413ef..3e20a878f93c0713f8b26594dedbba3815d468d2 100644 --- a/DDDigi/include/DDDigi/noise/DigiRandomNoise.h +++ b/DDDigi/include/DDDigi/noise/DigiRandomNoise.h @@ -10,8 +10,8 @@ // Author : M.Frank // //========================================================================== -#ifndef DDDIGI_DIGIRANDOMNOISE_H -#define DDDIGI_DIGIRANDOMNOISE_H +#ifndef DDDIGI_NOISE_DIGIRANDOMNOISE_H +#define DDDIGI_NOISE_DIGIRANDOMNOISE_H /// Framework include files #include <DDDigi/DigiSignalProcessor.h> @@ -68,4 +68,4 @@ namespace dd4hep { }; } // End namespace digi } // End namespace dd4hep -#endif // DDDIGI_DIGIRANDOMNOISE_H +#endif // DDDIGI_NOISE_DIGIRANDOMNOISE_H diff --git a/DDDigi/include/DDDigi/noise/DigiSignalProcessorSequence.h b/DDDigi/include/DDDigi/noise/DigiSignalProcessorSequence.h index 947ac6c0bc9f878a9fd498921c4ab4010c5404e3..3a137477ee8b1725968f8d010647ee6575f6c289 100644 --- a/DDDigi/include/DDDigi/noise/DigiSignalProcessorSequence.h +++ b/DDDigi/include/DDDigi/noise/DigiSignalProcessorSequence.h @@ -10,8 +10,8 @@ // Author : M.Frank // //========================================================================== -#ifndef DDDIGI_DIGISIGNALPROCESSORSEQUENCE_H -#define DDDIGI_DIGISIGNALPROCESSORSEQUENCE_H +#ifndef DDDIGI_NOISE_DIGISIGNALPROCESSORSEQUENCE_H +#define DDDIGI_NOISE_DIGISIGNALPROCESSORSEQUENCE_H // Framework include files #include <DDDigi/DigiSignalProcessor.h> @@ -62,4 +62,4 @@ namespace dd4hep { } // End namespace digi } // End namespace dd4hep -#endif // DDDIGI_DIGISIGNALPROCESSORSEQUENCE_H +#endif // DDDIGI_NOISE_DIGISIGNALPROCESSORSEQUENCE_H diff --git a/DDDigi/include/DDDigi/noise/DigiSubdetectorSequence.h b/DDDigi/include/DDDigi/noise/DigiSubdetectorSequence.h index dc58cd62b986637c205e48af4b6132ad2d862f68..c2a68bdafeb14b60fe90fba24f2364aa104049ec 100644 --- a/DDDigi/include/DDDigi/noise/DigiSubdetectorSequence.h +++ b/DDDigi/include/DDDigi/noise/DigiSubdetectorSequence.h @@ -10,8 +10,8 @@ // Author : M.Frank // //========================================================================== -#ifndef DDDIGI_DIGISUBDETECTORSEQUENCE_H -#define DDDIGI_DIGISUBDETECTORSEQUENCE_H +#ifndef DDDIGI_NOISE_DIGISUBDETECTORSEQUENCE_H +#define DDDIGI_NOISE_DIGISUBDETECTORSEQUENCE_H // Framework include files #include <DDDigi/DigiActionSequence.h> @@ -110,4 +110,4 @@ namespace dd4hep { } // End namespace digi } // End namespace dd4hep -#endif // DDDIGI_DIGISUBDETECTORSEQUENCE_H +#endif // DDDIGI_NOISE_DIGISUBDETECTORSEQUENCE_H diff --git a/DDDigi/include/DDDigi/noise/DigiUniformNoise.h b/DDDigi/include/DDDigi/noise/DigiUniformNoise.h index 2b8dcceb1bd039f79a1e7f1a215c7a48c53ce2e5..70aa8ecc93e21dc00a31dc3bc2a5aa0c013672a1 100644 --- a/DDDigi/include/DDDigi/noise/DigiUniformNoise.h +++ b/DDDigi/include/DDDigi/noise/DigiUniformNoise.h @@ -10,8 +10,8 @@ // Author : M.Frank // //========================================================================== -#ifndef DDDIGI_DIGIUNIFORMNOISE_H -#define DDDIGI_DIGIUNIFORMNOISE_H +#ifndef DDDIGI_NOISE_DIGIUNIFORMNOISE_H +#define DDDIGI_NOISE_DIGIUNIFORMNOISE_H /// Framework include files #include <DDDigi/DigiSignalProcessor.h> @@ -49,4 +49,4 @@ namespace dd4hep { }; } // End namespace digi } // End namespace dd4hep -#endif // DDDIGI_DIGIUNIFORMNOISE_H +#endif // DDDIGI_NOISE_DIGIUNIFORMNOISE_H diff --git a/DDDigi/include/DDDigi/noise/FalphaNoise.h b/DDDigi/include/DDDigi/noise/FalphaNoise.h index a52688f127caac708d2dc49d842af158fb76b545..a97032482351260339319a6b13110b999005f62a 100644 --- a/DDDigi/include/DDDigi/noise/FalphaNoise.h +++ b/DDDigi/include/DDDigi/noise/FalphaNoise.h @@ -47,8 +47,8 @@ // //========================================================================== -#ifndef DDDIGI_FALPHANOISE_H -#define DDDIGI_FALPHANOISE_H +#ifndef DDDIGI_NOISE_FALPHANOISE_H +#define DDDIGI_NOISE_FALPHANOISE_H /// C/C++ include files #include <vector> @@ -171,4 +171,4 @@ namespace dd4hep { } } // End namespace detail } // End namespace dd4hep -#endif // DDDIGI_FALPHANOISE_H +#endif // DDDIGI_NOISE_FALPHANOISE_H diff --git a/DDDigi/plugins/Components.cpp b/DDDigi/plugins/Components.cpp index c277b79c0c7bd3df6038ca5dd872c110df3d99ed..9d998f509ebfa1f78c9f26369029aa05dbce5f83 100644 --- a/DDDigi/plugins/Components.cpp +++ b/DDDigi/plugins/Components.cpp @@ -57,6 +57,10 @@ DECLARE_DIGIEVENTACTION_NS(dd4hep::digi,DigiContainerCombine) DECLARE_DIGISEGMENTACTION_NS(dd4hep::digi,DigiSegmentAction) DECLARE_DIGIEVENTACTION_NS(dd4hep::digi,DigiSegmentationSplitter) +#include <DDDigi/DigiMultiContainerProcessor.h> +DECLARE_DIGIEVENTACTION_NS(dd4hep::digi,DigiMultiContainerProcessor) +DECLARE_DIGIACTION_NS(dd4hep::digi,DigiContainerProcessor) + /// Basic entry point static long dummy(dd4hep::Detector&, int, char**) { return 0; diff --git a/DDDigi/plugins/DigiSegmentDepositPrint.cpp b/DDDigi/plugins/DigiSegmentDepositPrint.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c247267e0a2780b549d76ed4e80eaf547e0b1b1b --- /dev/null +++ b/DDDigi/plugins/DigiSegmentDepositPrint.cpp @@ -0,0 +1,59 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : M.Frank +// +//========================================================================== + +// Framework include files +#include <DDDigi/DigiContext.h> +#include <DDDigi/DigiSegmentationSplitter.h> + +/// Namespace for the AIDA detector description toolkit +namespace dd4hep { + + /// Namespace for the Digitization part of the AIDA detector description toolkit + namespace digi { + + /// Helper class to print energy deposits pre-selected by the segment splitter + /** Helper class to print energy deposits pre-selected by the segment splitter + * + * \author M.Frank + * \version 1.0 + * \ingroup DD4HEP_SIMULATION + */ + class DigiSegmentDepositPrint : public DigiSegmentAction { + public: + /// Constructors used of base class + using DigiSegmentAction::DigiSegmentAction; + + /// Main functional callback + virtual DepositVector + handleSegment(DigiContext& context, + const DigiSegmentContext& segment, + const DepositMapping& deposits) const override final { + char format[256]; + ::snprintf(format, sizeof(format), + "%s[%s] %s-id: %%d [processor:%d] Cell: %%016lX mask: %016lX hist:%%4ld entries deposit: %%f", + context.event->id(), segment.idspec.name(), segment.cname(), segment.id, segment.split_mask); + for( const auto& d : deposits ) { + if ( segment.matches(d.first) ) { + auto cell = d.first; + auto& depo = d.second; + info(format, segment.split_id(cell), cell, depo.history.size(), depo.deposit); + } + } + return {}; + } + }; + } // End namespace digi +} // End namespace dd4hep + +#include <DDDigi/DigiFactories.h> +DECLARE_DIGISEGMENTACTION_NS(dd4hep::digi,DigiSegmentDepositPrint) diff --git a/DDDigi/python/DDDigiDict.C b/DDDigi/python/DDDigiDict.C index 10f6d167f837dd6748889eecaf631fa88b482835..4eb4e9a4c2b79aec77d5f138c1a809584f7458e2 100644 --- a/DDDigi/python/DDDigiDict.C +++ b/DDDigi/python/DDDigiDict.C @@ -39,7 +39,9 @@ #include <DDDigi/DigiSynchronize.h> #include <DDDigi/DigiEventAction.h> #include <DDDigi/DigiInputAction.h> +#include <DDDigi/DigiSegmentAction.h> #include <DDDigi/DigiActionSequence.h> +#include <DDDigi/DigiMultiContainerProcessor.h> #include <DDDigi/DigiSignalProcessor.h> struct DDDigiDict {}; @@ -70,6 +72,8 @@ namespace dd4hep { ACTIONHANDLE(Action); ACTIONHANDLE(EventAction); ACTIONHANDLE(InputAction); + ACTIONHANDLE(SegmentAction); + ACTIONHANDLE(ContainerProcessor); ACTIONHANDLE(ActionSequence); ACTIONHANDLE(Synchronize); @@ -102,6 +106,9 @@ namespace dd4hep { static InputActionHandle createInputAction(KernelHandle& kernel, const std::string& name_type) { return cr<InputActionHandle,DigiHandle<DigiInputAction> >(kernel,name_type); } + static SegmentActionHandle createSegmentAction(KernelHandle& kernel, const std::string& name_type) + { return cr<SegmentActionHandle,DigiHandle<DigiSegmentAction> >(kernel,name_type); } + static ActionSequenceHandle createSequence(KernelHandle& kernel, const std::string& name_type) { return cr<ActionSequenceHandle,DigiHandle<DigiActionSequence> >(kernel,name_type); } @@ -109,15 +116,19 @@ namespace dd4hep { { return cr<SynchronizeHandle,DigiHandle<DigiSynchronize> >(kernel,name_type); } static DigiAction* toAction(DigiAction* f) { return f; } +#if 0 static DigiAction* toAction(DigiEventAction* f) { return f; } static DigiAction* toAction(DigiInputAction* f) { return f; } + static DigiAction* toAction(DigiSegmentAction* f) { return f; } + static DigiAction* toAction(DigiContainerProcessor* f) { return f; } static DigiAction* toAction(DigiActionSequence* f) { return f; } static DigiAction* toAction(DigiSynchronize* f) { return f; } static DigiAction* toAction(DigiSignalProcessor* f) { return f; } - +#endif static DigiAction* toAction(ActionHandle f) { return f.action; } static DigiAction* toAction(EventActionHandle f) { return f.action; } static DigiAction* toAction(InputActionHandle f) { return f.action; } + static DigiAction* toAction(SegmentActionHandle f) { return f.action; } static DigiAction* toAction(ActionSequenceHandle f) { return f.action; } static DigiAction* toAction(SynchronizeHandle f) { return f.action; } static DigiAction* toAction(SignalProcessorHandle f) { return f.action; } @@ -179,6 +190,9 @@ using namespace std; #pragma link C++ class dd4hep::digi::DigiInputAction; #pragma link C++ class dd4hep::digi::InputActionHandle; +#pragma link C++ class dd4hep::digi::DigiSegmentAction; +#pragma link C++ class dd4hep::digi::SegmentActionHandle; + #pragma link C++ class dd4hep::digi::DigiActionSequence; #pragma link C++ class dd4hep::digi::ActionSequenceHandle; @@ -188,6 +202,9 @@ using namespace std; #pragma link C++ class dd4hep::digi::DigiSignalProcessor; #pragma link C++ class dd4hep::digi::SignalProcessorHandle; +#pragma link C++ class dd4hep::digi::DigiContainerProcessor; +#pragma link C++ class dd4hep::digi::DigiMultiContainerProcessor; + /// Digi data item wrappers #pragma link C++ class dd4hep::digi::DigiEvent; #pragma link C++ class dd4hep::digi::EnergyDeposit+; diff --git a/DDDigi/python/dddigi.py b/DDDigi/python/dddigi.py index 94bb896d4f2803b8e28a0f6bc77094b066b0e218..dfd1b041c38eceb07292edd6204426ea544e8e6b 100644 --- a/DDDigi/python/dddigi.py +++ b/DDDigi/python/dddigi.py @@ -172,13 +172,20 @@ ActionHandle = digi.ActionHandle # --------------------------------------------------------------------------- -def Action(kernel, nam, parallel=False): - obj = Interface.createAction(kernel, str(nam)) - obj.parallel = parallel +def TestAction(kernel, nam, sleep=0): + obj = Interface.createEventAction(kernel, str('DigiTestAction/' + nam)) + if sleep != 0: + obj.sleep = sleep return obj +# --------------------------------------------------------------------------- +def Action(kernel, nam): + obj = Interface.createAction(kernel, str(nam)) + return obj # --------------------------------------------------------------------------- + + def EventAction(kernel, nam, parallel=False): obj = Interface.createEventAction(kernel, str(nam)) obj.parallel = parallel @@ -186,10 +193,9 @@ def EventAction(kernel, nam, parallel=False): # --------------------------------------------------------------------------- -def TestAction(kernel, nam, sleep=0): - obj = Interface.createEventAction(kernel, str('DigiTestAction/' + nam)) - if sleep != 0: - obj.sleep = sleep +def SegmentAction(kernel, nam, parallel=False): + obj = Interface.createSegmentAction(kernel, str(nam)) + obj.parallel = parallel return obj # --------------------------------------------------------------------------- @@ -208,14 +214,14 @@ def Synchronize(kernel, nam, parallel=False): # --------------------------------------------------------------------------- -def _setup(obj): - def _adopt(self, action): - getattr(self,'__adopt')(action.get()) +def _default_adopt(self, action): + getattr(self, '__adopt')(action.get()) + +def _setup(obj, call='adopt', py_call=_default_adopt): _import_class('digi', obj) cls = getattr(current, obj) - setattr(cls, '__adopt', getattr(cls, 'adopt')) - setattr(cls, 'adopt', _adopt) - # setattr(cls,'add',_adopt) + setattr(cls, '__'+call, getattr(cls, call)) + setattr(cls, call, py_call) return cls @@ -279,12 +285,19 @@ def adopt_sequence_action(self, name, **options): return action +def _adopt_processor(self, action, containers): + getattr(self, '__adopt_processor')(action.get(), containers) + + _props('DigiSynchronize') _props('DigiActionSequence', adopt_action=adopt_sequence_action) _props('DigiParallelActionSequence', adopt_action=adopt_sequence_action) _props('DigiSequentialActionSequence', adopt_action=adopt_sequence_action) +_setup('DigiMultiContainerProcessor', call='adopt_processor', py_call=_adopt_processor) + + # Need to import digitize late, since it cross includes dddigi Digitize = None try: diff --git a/DDDigi/python/digitize.py b/DDDigi/python/digitize.py index e7170f94df23494714a54fedcb88e6af9c27f2f5..b77dfe6cd5a33b4d562836a3c391af930e2e3720 100644 --- a/DDDigi/python/digitize.py +++ b/DDDigi/python/digitize.py @@ -54,6 +54,12 @@ class Digitize(dd4hep.Logger): self._main_processor.parallel = self._parallel return self._main_processor + def create_action(self, name, **options): + action = dddigi.Action(self._kernel, name) + for option in options.items(): + setattr(action, option[0], option[1]) + return action + def new_action(self, name, **options): action = dddigi.EventAction(self._kernel, name) for option in options.items(): @@ -75,7 +81,7 @@ class Digitize(dd4hep.Logger): self._input_processor.adopt(act) return act - def event_action(self, name=None, **options): + def event_action(self, name=None, register=True, **options): """ Append a new action to the kernel's main event action sequence """ @@ -87,7 +93,8 @@ class Digitize(dd4hep.Logger): return self._event_processor action = self.new_action(name, **options) - self._event_processor.adopt(action) + if register: + self._event_processor.adopt(action) return action def output_action(self, name=None, **options): diff --git a/DDDigi/src/DigiContainerCombine.cpp b/DDDigi/src/DigiContainerCombine.cpp index e36d49f3b0bb7dddaad9c8753b887738cff92cb6..0bfdd89e8e6073fd8261282d0ce62b4e7bf75efd 100644 --- a/DDDigi/src/DigiContainerCombine.cpp +++ b/DDDigi/src/DigiContainerCombine.cpp @@ -28,7 +28,7 @@ public: /// Property: Container names to be loaded std::vector<std::string> containers { }; /// Property: event masks to be handled - std::vector<int> masks { }; + std::vector<int> input_masks { }; /// Property: Output container dressing std::string output_name_flag; /// Property: Input data segment name @@ -59,18 +59,18 @@ public: for ( const auto& c : this->containers ) { Key key(0x0, c); this->cont_keys.emplace(key.key); - if ( this->masks.empty() ) { + if ( this->input_masks.empty() ) { this->keys.emplace(key.key); continue; } - for ( int m : this->masks ) { + for ( int m : this->input_masks ) { key.values.mask = m; this->keys.emplace(key.key); } } this->container_selector = [this](Key::key_type k) { - const auto& m = this->masks; + const auto& m = this->input_masks; bool use = m.empty() || this->keys.empty(); if ( !use ) { if ( !this->cont_keys.empty() ) @@ -90,7 +90,7 @@ dd4hep::digi::DigiContainerCombine::DigiContainerCombine(const DigiKernel& krnl, { this->internals = std::make_unique<internals_t>(); this->declareProperty("containers", this->internals->containers); - this->declareProperty("masks", this->internals->masks); + this->declareProperty("input_masks", this->internals->input_masks); this->declareProperty("input_segment", this->internals->input = "inputs"); this->declareProperty("output_segment", this->internals->output = "deposits"); this->declareProperty("deposit_mask", this->internals->deposit_mask); @@ -104,6 +104,29 @@ dd4hep::digi::DigiContainerCombine::~DigiContainerCombine() { InstanceCount::decrement(this); } +struct work_definition { + using Key = dd4hep::digi::Key; + using DigiEvent = dd4hep::digi::DigiEvent; + using DataSegment = dd4hep::digi::DataSegment; + std::size_t cnt_depos = 0; + std::size_t cnt_parts = 0; + std::size_t cnt_conts = 0; + std::vector<Key> keys; + std::vector<std::any*> work; + std::set<Key::itemkey_type> items; + Key depo_key; + char format[128]; + DigiEvent& event; + DataSegment& inputs; + DataSegment& outputs; + work_definition(DigiEvent& e, DataSegment& i, DataSegment& o) + : event(e), inputs(i), outputs(o) {} +}; +struct DigiCombineAction : public dd4hep::digi::DigiEventAction { +public: + work_definition work; +}; + /// Combine selected containers to one single deposit container template <typename PREDICATE> std::size_t dd4hep::digi::DigiContainerCombine::combine_containers(DigiEvent& event, @@ -111,89 +134,83 @@ dd4hep::digi::DigiContainerCombine::combine_containers(DigiEvent& event, DataSegment& outputs, const PREDICATE& predicate) const { - std::size_t cnt_depos = 0; - std::size_t cnt_parts = 0; - std::size_t cnt_conts = 0; - std::vector<Key> keys; - std::vector<std::any*> work; std::set<Key::itemkey_type> items; - - keys.reserve(inputs.size()); - work.reserve(inputs.size()); - for( auto& i : inputs ) { + work_definition def(event, inputs, outputs); + def.depo_key.values.mask = internals->deposit_mask; + def.keys.reserve(inputs.size()); + def.work.reserve(inputs.size()); + for( auto& i : def.inputs ) { if ( predicate(i.first) ) { - keys.emplace_back(i.first); - work.emplace_back(&i.second); + def.keys.emplace_back(i.first); + def.work.emplace_back(&i.second); items.insert(Key(i.first).values.item); } } - Key depo_key; - depo_key.values.mask = internals->deposit_mask; + + ::snprintf(def.format, sizeof(def.format), + "%s+++ %%-32s Mask: $%04X Input: $%%04X Merged %%6ld %%s", + event.id(), def.depo_key.values.mask); + for(auto itm : items) { - for( std::size_t i=0; i < keys.size(); ++i ) { - if ( keys[i].values.item != itm ) + for( std::size_t i=0; i < def.keys.size(); ++i ) { + if ( def.keys[i].values.item != itm ) continue; - auto* output = work[i]; - depo_key.values.item = itm; + auto* output = def.work[i]; + def.depo_key.values.item = itm; /// Merge deposit mapping if ( DepositMapping* depos = std::any_cast<DepositMapping>(output) ) { if ( !internals->output_name_flag.empty() ) depos->name = depos->name+"/"+internals->output_name_flag; - cnt_depos += depos->size(); - cnt_conts++; - this->info("%s+++ %-32s Mask: $%04X Input: $%04X Merged %6ld deposits", - event.id(), depos->name.c_str(), depo_key.values.mask, - keys[i].values.mask, depos->size()); - for( std::size_t j=i+1; j < keys.size(); ++j ) { - if ( keys[j].values.item == itm ) { - DepositMapping* next = std::any_cast<DepositMapping>(work[j]); - cnt_depos += next->size(); - cnt_conts++; + def.cnt_depos += depos->size(); + def.cnt_conts++; + this->info(def.format, depos->name.c_str(), + def.keys[i].values.mask, depos->size(), "deposits"); + for( std::size_t j=i+1; j < def.keys.size(); ++j ) { + if ( def.keys[j].values.item == itm ) { + DepositMapping* next = std::any_cast<DepositMapping>(def.work[j]); std::size_t cnt = depos->merge(std::move(*next)); - this->info("%s+++ %-32s Mask: $%04X Input: $%04X Merged %6ld deposits", - event.id(), depos->name.c_str(), depo_key.values.mask, - keys[j].values.mask, cnt); - cnt_depos += cnt; - cnt_conts++; - work[j]->reset(); + this->info(def.format, next->name.c_str(), + def.keys[j].values.mask, cnt, "deposits"); + def.cnt_depos += cnt; + def.cnt_conts++; + def.work[j]->reset(); } } - outputs.emplace(depo_key, std::move(*output)); + def.outputs.emplace(def.depo_key, std::move(*output)); break; } + /// Merge particle container else if ( ParticleMapping* parts = std::any_cast<ParticleMapping>(output) ) { if ( !internals->output_name_flag.empty() ) parts->name = parts->name+"/"+internals->output_name_flag; - cnt_parts += parts->size(); - cnt_conts++; - - this->info("%s+++ %-32s Mask: $%04X Input: $%04X Merged %6ld particles", - event.id(), parts->name.c_str(), depo_key.values.mask, - keys[i].values.mask, parts->size()); - for( std::size_t j=i+1; j < keys.size(); ++j ) { - if ( keys[j].values.item == itm ) { - ParticleMapping* next = std::any_cast<ParticleMapping>(work[j]); + def.cnt_parts += parts->size(); + def.cnt_conts++; + + this->info(def.format, parts->name.c_str(), + def.keys[i].values.mask, parts->size(), "particles"); + for( std::size_t j=i+1; j < def.keys.size(); ++j ) { + if ( def.keys[j].values.item == itm ) { + ParticleMapping* next = std::any_cast<ParticleMapping>(def.work[j]); std::size_t cnt = parts->merge(std::move(*next)); - this->info("%s+++ %-32s Mask: $%04X Input: $%04X Merged %6ld particles", - event.id(), parts->name.c_str(), depo_key.values.mask, - keys[j].values.mask, cnt); - cnt_parts += cnt; - cnt_conts++; - work[j]->reset(); + this->info(def.format, next->name.c_str(), + def.keys[j].values.mask, cnt, "particles"); + def.cnt_parts += cnt; + def.cnt_conts++; + def.work[j]->reset(); } } - outputs.emplace(depo_key, std::move(*output)); + def.outputs.emplace(def.depo_key, std::move(*output)); break; } } } if ( this->internals->erase_combined ) { - inputs.erase(keys); + inputs.erase(def.keys); } this->info("%s+++ Merged %ld particles and %ld deposits from %ld containers", - event.id(), cnt_parts, cnt_depos, cnt_conts); - return cnt_depos; + event.id(), def.cnt_parts, def.cnt_depos, def.cnt_conts); + return def.cnt_depos; } /// Main functional callback diff --git a/DDDigi/src/DigiData.cpp b/DDDigi/src/DigiData.cpp index 371e219d6009d21f527caf1bff481341a997480a..cf7bff4f63f3c30b341666f058280dc97d7477be 100644 --- a/DDDigi/src/DigiData.cpp +++ b/DDDigi/src/DigiData.cpp @@ -41,7 +41,7 @@ void Key::set(const std::string& name, int mask) { except("DDDigi::Key", "+++ No key name was specified -- this is illegal!"); } this->key = 0; - this->values.mask = (unsigned char)(0xFF&mask); + this->values.mask = (Key::mask_type)(0xFFFF&mask); this->values.item = detail::hash32(name); std::lock_guard<std::mutex> lock(_k.lock); _k.map[this->key] = name; @@ -62,6 +62,15 @@ std::string Key::key_name(const Key& k) { return "UNKNOWN"; } +/// Merge new deposit map onto existing map +std::size_t DepositVector::merge(DepositVector&& updates) { + std::size_t update_size = updates.size(); + for( auto& c : updates ) { + this->emplace_back(c); + } + return update_size; +} + /// Merge new deposit map onto existing map std::size_t DepositMapping::merge(DepositMapping&& updates) { std::size_t update_size = updates.size(); @@ -85,7 +94,9 @@ std::size_t ParticleMapping::merge(ParticleMapping&& updates) { std::size_t update_size = updates.size(); for( ParticleMapping::value_type& c : updates ) { Particle part(std::move(c.second)); +#if defined(__GNUC__) && (__GNUC__ >= 10) this->push(c.first, std::move(part)); +#endif } return update_size; } @@ -167,12 +178,12 @@ void DataSegment::print_keys() const { /// Call on failed any-casts during data requests std::string DataSegment::invalid_cast(Key key, const std::type_info& type) const { return dd4hep::format(0, "Invalid segment data cast. Key:%ld type:%s", - key, typeName(type).c_str()); + key.key, typeName(type).c_str()); } /// Call on failed data requests during data requests std::string DataSegment::invalid_request(Key key) const { - return dd4hep::format(0, "Invalid segment data requested. Key:%ld",key); + return dd4hep::format(0, "Invalid segment data requested. Key:%ld",key.key); } /// Access data item by key diff --git a/DDDigi/src/DigiHandle.cpp b/DDDigi/src/DigiHandle.cpp index 1099d011d975f2741a0e9e615d60c79b26370ec5..45f7e8e1d814127adde45317923a8e36bc007f21 100644 --- a/DDDigi/src/DigiHandle.cpp +++ b/DDDigi/src/DigiHandle.cpp @@ -21,6 +21,7 @@ #include <DDDigi/DigiInputAction.h> #include <DDDigi/DigiEventAction.h> #include <DDDigi/DigiSignalProcessor.h> +#include <DDDigi/DigiSegmentationSplitter.h> // C/C++ include files #include <stdexcept> @@ -68,6 +69,10 @@ namespace dd4hep { return PluginService::Create<DigiAction*>(t, &kernel, n); } + template <> DigiSegmentAction* _raw_create<DigiSegmentAction>(const std::string& t, const DigiKernel& kernel, const std::string& n) { + return PluginService::Create<DigiSegmentAction*>(t, &kernel, n); + } + template <> DigiSignalProcessor* _raw_create<DigiSignalProcessor>(const std::string& t, const DigiKernel& kernel, const std::string& n) { return PluginService::Create<DigiSignalProcessor*>(t, &kernel, n); } @@ -197,6 +202,7 @@ namespace dd4hep { template class DigiHandle<DigiAction>; template class DigiHandle<DigiInputAction>; template class DigiHandle<DigiEventAction>; + template class DigiHandle<DigiSegmentAction>; template class DigiHandle<DigiSynchronize>; template class DigiHandle<DigiActionSequence>; template class DigiHandle<DigiSignalProcessor>; diff --git a/DDDigi/src/DigiKernel.cpp b/DDDigi/src/DigiKernel.cpp index e20a471839102fb2cecaec8d1d45c15a9cf48398..1c41cba4f35c62f706f0f7ce56a9dd1fa07e4f1e 100644 --- a/DDDigi/src/DigiKernel.cpp +++ b/DDDigi/src/DigiKernel.cpp @@ -100,7 +100,7 @@ public: * \version 1.0 * \ingroup DD4HEP_DIGITIZATION */ -class DigiKernel::Wrapper { +class DigiKernel::Wrapper : public CallWrapper { public: DigiContext& context; DigiEventAction* action = 0; @@ -317,6 +317,28 @@ DigiActionSequence& DigiKernel::outputAction() const { return *internals->outputAction; } +/// Submit a bunch of actions to be executed in parallel +void DigiKernel::submit (const std::vector<CallWrapper*>& actions) const { + bool parallel = 0 != internals->tbbInit && internals->numThreads>0; +#ifdef DD4HEP_USE_TBB + if ( parallel ) { + tbb::task_group que; + for ( auto* algo : actions ) + que.run( *algo ); + que.wait(); + return; + } +#endif + for ( auto* algo : actions ) + (*algo)(); +} + +/// Submit a bunch of actions to be executed serially +void DigiKernel::execute(const std::vector<CallWrapper*>& actions) const { + for ( auto* algo : actions ) + (*algo)(); +} + void DigiKernel::submit(const DigiAction::Actors<DigiEventAction>& actions, DigiContext& context) const { std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); bool parallel = 0 != internals->tbbInit && internals->numThreads>0; @@ -324,7 +346,7 @@ void DigiKernel::submit(const DigiAction::Actors<DigiEventAction>& actions, Digi if ( parallel ) { tbb::task_group que; for ( auto* i : actions ) - que.run(Wrapper(context, i)); + que.run( Wrapper(context, i) ); que.wait(); goto print_stamp; } diff --git a/DDDigi/src/DigiMultiContainerProcessor.cpp b/DDDigi/src/DigiMultiContainerProcessor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9e1f648cc03afbc2129826872f90b4b4f51bed33 --- /dev/null +++ b/DDDigi/src/DigiMultiContainerProcessor.cpp @@ -0,0 +1,116 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : M.Frank +// +//========================================================================== + +// Framework include files +#include <DD4hep/InstanceCount.h> + +#include <DDDigi/DigiData.h> +#include <DDDigi/DigiContext.h> +#include <DDDigi/DigiMultiContainerProcessor.h> + +/// C/C++ include files +#include <set> +#include <sstream> + +using namespace dd4hep::digi; + +template <> void DigiParallelWorker<DigiContainerProcessor, DigiMultiContainerProcessor::ProcessorOptions>::operator()() const { + processor->execute(*options.context, *options.work); +} + +/// Standard constructor +DigiMultiContainerProcessor::DigiMultiContainerProcessor(const DigiKernel& krnl, const std::string& nam) + : DigiEventAction(krnl, nam) +{ + this->declareProperty("input_masks", m_input_masks); + this->declareProperty("input_segment", m_input_segment); + this->declareProperty("allow_duplicates", m_allow_duplicates); + InstanceCount::increment(this); +} + +/// Default destructor +DigiMultiContainerProcessor::~DigiMultiContainerProcessor() { + InstanceCount::decrement(this); +} + +void DigiMultiContainerProcessor::adopt_processor(DigiContainerProcessor* action, const std::vector<std::string>& containers) { + if ( !action ) { + except("+++ Attempt to use invalid processor. Request FAILED."); + } + else if ( containers.empty() ) { + except("+++ Processor %s is defined, but no workload was assigned. Request FAILED."); + } + const char* aname = action->name().c_str(); + std::stringstream str; + std::vector<Key> keys; + for(const auto& c : containers) { + Key key(0x0, c); + if ( !m_allow_duplicates ) { + for(const auto& w : m_workers) { + if ( std::find(m_work_items.begin(), m_work_items.end(), key.item()) != m_work_items.end() ) { + error("+++ Container %s has already a worker action attached: %s", + c.c_str(), w->name()); + except("+++ Need to set property allow_duplicates=True to allow such behavior."); + } + } + } + keys.push_back(key); + m_work_items.insert(key.item()); + str << c << " "; + } + action->m_work_keys = keys; + Worker* w = new Worker(action, {nullptr, nullptr, keys}); + m_callers.emplace_back(new DigiKernel::CallWrapper(w)); + m_workers.emplace_back(std::unique_ptr<Worker>(w)); + info("+++ Use processor: %-32s for processing: %s", aname, str.str().c_str()); +} + +/// Main functional callback +void DigiMultiContainerProcessor::execute(DigiContext& context) const { + WorkItems work_items; + auto& msk = m_input_masks; + auto& event = *context.event; + auto& inputs = event.get_segment(m_input_segment); + + work_items.reserve(inputs.size()); + for( auto& i : inputs ) { + Key in_key(i.first); + bool use = msk.empty() || std::find(msk.begin(), msk.end(), in_key.mask()) != msk.end(); + if ( use ) { + use = m_work_items.find(in_key.item()) != m_work_items.end(); + if ( use ) { + work_items.emplace_back(std::make_pair(i.first, &i.second)); + } + } + } + if ( !work_items.empty() ) { + for(std::size_t i=0; i < m_workers.size(); ++i) { + m_workers[i]->options.context = &context; + m_workers[i]->options.work = &work_items; + } + m_kernel.submit(m_callers); + } +} + +/// Standard constructor +DigiContainerProcessor::DigiContainerProcessor(const DigiKernel& kernel, const std::string& name) + : DigiAction(kernel, name) +{ + this->declareProperty("input_masks", m_input_masks); + this->declareProperty("input_segment", m_input_segment); +} + +/// Main functional callback if specific work is known +void DigiContainerProcessor::execute(DigiContext& context, WorkItems& data) const { + info("Hello there %p", (void*)&data); +} diff --git a/DDDigi/src/DigiSegmentationSplitter.cpp b/DDDigi/src/DigiSegmentationSplitter.cpp index f4d1bfb0adbcede22e77e832b574b8e20fe876ee..28d860af728d4473973995677089cb745aab105c 100644 --- a/DDDigi/src/DigiSegmentationSplitter.cpp +++ b/DDDigi/src/DigiSegmentationSplitter.cpp @@ -23,9 +23,9 @@ using namespace dd4hep::digi; class DigiSegmentAction::internals_t { public: - DigiSegmentContext split { }; - std::vector<std::pair<Key::key_type, std::any> > output; - const DepositMapping* input { nullptr }; + DigiSegmentContext split { }; + DepositVector output { }; + const DepositMapping* input { nullptr }; }; class DigiSegmentationSplitter::internals_t { @@ -49,8 +49,9 @@ public: }; /// Standard constructor -DigiSegmentationSplitter::DigiSegmentationSplitter(const DigiKernel& krnl, const std::string& nam) - : DigiActionSequence(krnl, nam), m_split_tool(krnl.detectorDescription()) +DigiSegmentationSplitter::DigiSegmentationSplitter(const DigiKernel& kernel, const std::string& nam) + : DigiActionSequence(kernel, nam), + m_split_tool(kernel.detectorDescription()) { this->internals = std::make_unique<internals_t>(this); declareProperty("detector", this->m_detector_name); @@ -72,7 +73,6 @@ DigiSegmentationSplitter::~DigiSegmentationSplitter() { void DigiSegmentationSplitter::initialize() { char text[256]; std::size_t count = 0; - DigiSegmentAction* proc; this->m_split_tool.set_detector(this->m_detector_name); this->m_split_context = this->m_split_tool.split_context(this->m_split_by); @@ -83,7 +83,15 @@ void DigiSegmentationSplitter::initialize() { for( auto& p : this->m_splits ) { ::snprintf(text, sizeof(text), "_%05X", m_split_context.split_id(p.first)); std::string nam = this->name() + text; - proc = PluginService::Create<DigiSegmentAction*>(m_processor_type, &m_kernel, nam); + auto* eproc = PluginService::Create<DigiEventAction*>(m_processor_type, &m_kernel, nam); + if ( !eproc ) { + except("+++ Failed to create split worker: %s/%s", m_processor_type.c_str(), nam.c_str()); + } + auto* proc = dynamic_cast<DigiSegmentAction*>(eproc); + if ( !proc ) { + except("+++ Split worker: %s/%s is not of type DigiSegmentAction!", + m_processor_type.c_str(), nam.c_str()); + } proc->internals = std::make_unique<DigiSegmentAction::internals_t>(); proc->internals->split = this->m_split_context; proc->internals->split.detector = p.second.first; @@ -102,6 +110,8 @@ void DigiSegmentationSplitter::execute(DigiContext& context) const { auto* hits = input.pointer<DepositMapping>(k); if ( hits ) { /// prepare processors for execution + info("+++ Got hit collection %04X %08X. Prepare processors.", + Key::mask(k), Key::item(k)); for ( auto* a : this->m_actors ) { auto* proc = (DigiSegmentAction*)a; proc->internals->input = hits; @@ -127,23 +137,13 @@ DigiSegmentAction::~DigiSegmentAction() { void DigiSegmentAction::execute(DigiContext& context) const { auto& imp = *this->internals; - auto ret = this->handleSegment(context, imp.split, *imp.input); - imp.output = std::move(ret); + imp.output = this->handleSegment(context, imp.split, *imp.input); } /// Main functional callback -std::vector<std::pair<Key::key_type, std::any> > -DigiSegmentAction::handleSegment(DigiContext& context, - const DigiSegmentContext& segment, - const DepositMapping& deposits) const { - for( const auto& depo : deposits ) { - if ( segment.split_id(depo.first) == segment.id ) { - auto cell = depo.first; - const auto& d = depo.second; - info("%s[%s] %s-id: %d [processor:%d] Cell: %016lX mask: %016lX hist:%4ld entries deposit: %f", - context.event->id(), segment.idspec.name(), segment.cname(), - segment.split_id(cell), segment.id, cell, segment.split_mask, d.history.size(), d.deposit); - } - } +DepositVector +DigiSegmentAction::handleSegment(DigiContext& /* context */, + const DigiSegmentContext& /* segment */, + const DepositMapping& /* depos */) const { return {}; } diff --git a/DDDigi/src/DigiStoreDump.cpp b/DDDigi/src/DigiStoreDump.cpp index 50c8d29787ef058476fbb8eadf68efaebe053e98..b93ed8a26f2464a26c9f3909002d7ee834d9c934 100644 --- a/DDDigi/src/DigiStoreDump.cpp +++ b/DDDigi/src/DigiStoreDump.cpp @@ -55,10 +55,15 @@ void dd4hep::digi::DigiStoreDump::dump(const std::string& tag, std::size_t idx = typ.find(", std::less<long long>, std::allocator<std::pair"); if ( idx != std::string::npos ) typ = str_replace(typ, typ.substr(idx), ">"); typ = str_replace(str_replace(typ,"std::",""),"dd4hep::digi::",""); - if ( const auto* hits = std::any_cast<DepositMapping>(&data) ) { + if ( const auto* mapping = std::any_cast<DepositMapping>(&data) ) { str = this->format("%s|---- %4X %08X %-32s: %6ld hits [%s]", event.id(), key.values.mask, key.values.item, - nam.c_str(), hits->size(), typ.c_str()); + nam.c_str(), mapping->size(), typ.c_str()); + } + else if ( const auto* vector = std::any_cast<DepositVector>(&data) ) { + str = this->format("%s|---- %4X %08X %-32s: %6ld hits [%s]", + event.id(), key.values.mask, key.values.item, + nam.c_str(), vector->size(), typ.c_str()); } else if ( const auto* parts = std::any_cast<ParticleMapping>(&data) ) { str = this->format("%s|---- %4X %08X %-32s: %6ld particles [%s]", diff --git a/DDDigi/src/noise/DigiExponentialNoise.cpp b/DDDigi/src/noise/DigiExponentialNoise.cpp index ff456171f1cf680dba55985a6ef1dfb4f90aafb8..83bc2ad4c6b703cdc1b998de7cb1ca22663f1a39 100644 --- a/DDDigi/src/noise/DigiExponentialNoise.cpp +++ b/DDDigi/src/noise/DigiExponentialNoise.cpp @@ -15,7 +15,7 @@ #include <DD4hep/InstanceCount.h> #include <DDDigi/DigiSegmentation.h> #include <DDDigi/DigiRandomGenerator.h> -#include <DDDigi/DigiExponentialNoise.h> +#include <DDDigi/noise/DigiExponentialNoise.h> using namespace dd4hep::digi; diff --git a/DDDigi/src/noise/DigiGaussianNoise.cpp b/DDDigi/src/noise/DigiGaussianNoise.cpp index dc10c3aa9ad1dbd21bedfe686ec2a64127a890cb..362104ccd2a6c6c2eed17c57b0b484d1e74377c6 100644 --- a/DDDigi/src/noise/DigiGaussianNoise.cpp +++ b/DDDigi/src/noise/DigiGaussianNoise.cpp @@ -15,7 +15,7 @@ #include <DD4hep/InstanceCount.h> #include <DDDigi/DigiSegmentation.h> #include <DDDigi/DigiRandomGenerator.h> -#include <DDDigi/DigiGaussianNoise.h> +#include <DDDigi/noise/DigiGaussianNoise.h> using namespace dd4hep::digi; diff --git a/DDDigi/src/noise/DigiLandauNoise.cpp b/DDDigi/src/noise/DigiLandauNoise.cpp index 11188203bec55ef5ced5411e160c7ea96dba4246..8de50b2bc4bc91d43b388c3dfefb956d315d2cfc 100644 --- a/DDDigi/src/noise/DigiLandauNoise.cpp +++ b/DDDigi/src/noise/DigiLandauNoise.cpp @@ -13,7 +13,7 @@ // Framework include files #include <DD4hep/InstanceCount.h> -#include <DDDigi/DigiLandauNoise.h> +#include <DDDigi/noise/DigiLandauNoise.h> #include <DDDigi/DigiSegmentation.h> #include <DDDigi/DigiRandomGenerator.h> diff --git a/DDDigi/src/noise/DigiPoissonNoise.cpp b/DDDigi/src/noise/DigiPoissonNoise.cpp index 85f4ff81cb7b6f3f5199690e1b4d40258c22a168..3143ea3c6525a776fa02d8fc5d7ddcc1e1445830 100644 --- a/DDDigi/src/noise/DigiPoissonNoise.cpp +++ b/DDDigi/src/noise/DigiPoissonNoise.cpp @@ -13,7 +13,7 @@ // Framework include files #include <DD4hep/InstanceCount.h> -#include <DDDigi/DigiPoissonNoise.h> +#include <DDDigi/noise/DigiPoissonNoise.h> #include <DDDigi/DigiSegmentation.h> #include <DDDigi/DigiRandomGenerator.h> diff --git a/DDDigi/src/noise/DigiRandomNoise.cpp b/DDDigi/src/noise/DigiRandomNoise.cpp index 458c0d7a8b316ef0dcec67a7b0cba6a7253129fa..2869a3b649078908af6029dba7351b1d913d1217 100644 --- a/DDDigi/src/noise/DigiRandomNoise.cpp +++ b/DDDigi/src/noise/DigiRandomNoise.cpp @@ -13,7 +13,7 @@ // Framework include files #include <DD4hep/InstanceCount.h> -#include <DDDigi/DigiRandomNoise.h> +#include <DDDigi/noise/DigiRandomNoise.h> using namespace dd4hep::digi; diff --git a/DDDigi/src/noise/DigiSignalProcessorSequence.cpp b/DDDigi/src/noise/DigiSignalProcessorSequence.cpp index b7001f8ad2e41658c29bf7d7eba5b8484d943c9d..25aec3071d13c336034e933295c933119c7f833e 100644 --- a/DDDigi/src/noise/DigiSignalProcessorSequence.cpp +++ b/DDDigi/src/noise/DigiSignalProcessorSequence.cpp @@ -14,7 +14,7 @@ // Framework include files #include <DD4hep/InstanceCount.h> #include <DDDigi/DigiSegmentation.h> -#include <DDDigi/DigiSignalProcessorSequence.h> +#include <DDDigi/noise/DigiSignalProcessorSequence.h> // C/C++ include files #include <stdexcept> diff --git a/DDDigi/src/noise/DigiSubdetectorSequence.cpp b/DDDigi/src/noise/DigiSubdetectorSequence.cpp index a46bd2a73096fbbc7165042fa19cc6086817b419..9d9fc3ab59e373d16e67fee990204bd819d19ab6 100644 --- a/DDDigi/src/noise/DigiSubdetectorSequence.cpp +++ b/DDDigi/src/noise/DigiSubdetectorSequence.cpp @@ -12,7 +12,7 @@ //========================================================================== // Framework include files -#include <DDDigi/DigiSubdetectorSequence.h> +#include <DDDigi/noise/DigiSubdetectorSequence.h> #include <DDDigi/DigiSegmentation.h> #include <DDDigi/DigiKernel.h> #include <DDDigi/DigiContext.h> diff --git a/DDDigi/src/noise/DigiUniformNoise.cpp b/DDDigi/src/noise/DigiUniformNoise.cpp index d4dd6d190e681b1b122b423bc82160de6013b21c..78fc7a3da6677c2b91dbe78f76e40db80f049ffa 100644 --- a/DDDigi/src/noise/DigiUniformNoise.cpp +++ b/DDDigi/src/noise/DigiUniformNoise.cpp @@ -14,7 +14,7 @@ // Framework include files #include <DD4hep/InstanceCount.h> #include <DDDigi/DigiRandomGenerator.h> -#include <DDDigi/DigiUniformNoise.h> +#include <DDDigi/noise/DigiUniformNoise.h> using namespace dd4hep::digi; diff --git a/DDDigi/src/noise/FalphaNoise.cpp b/DDDigi/src/noise/FalphaNoise.cpp index 70946b8168bb545d58ef10d3f94315a359c92e16..6155579999859011e751216ebdc46049c688504a 100644 --- a/DDDigi/src/noise/FalphaNoise.cpp +++ b/DDDigi/src/noise/FalphaNoise.cpp @@ -12,7 +12,7 @@ //========================================================================== /// Framework include files -#include <DDDigi/FalphaNoise.h> +#include <DDDigi/noise/FalphaNoise.h> /// C/C++ include files #include <cmath> diff --git a/examples/DDDigi/scripts/DigiTest.py b/examples/DDDigi/scripts/DigiTest.py index b47182e09478e548eca02b99bf09ffdfb0221a9a..84cf2d952feca4ab101c1642999d50bb09eef57f 100644 --- a/examples/DDDigi/scripts/DigiTest.py +++ b/examples/DDDigi/scripts/DigiTest.py @@ -70,12 +70,22 @@ class Test(dddigi.Digitize): 'CLICSiD_2022-10-05_14-40.root'] self.used_inputs = [] + def segment_action(self, nam, **options): + obj = dddigi.Interface.createSegmentAction(self.kernel(), str(nam)) + return obj + def load_geo(self): - install_dir = os.environ['DD4hepINSTALL'] - fname = "file:" + install_dir + "/DDDetectors/compact/SiD.xml" + fname = "file:" + os.environ['DD4hepINSTALL'] + "/DDDetectors/compact/SiD.xml" self.kernel().loadGeometry(str(fname)) self.printDetectors() + def data_containers(self): + return list(self.attenuation.keys()) + + def containers(self, first, last): + keys = list(self.attenuation.keys()) + return keys[first:last] + def check_creation(self, objs): for o in objs: if o is None: diff --git a/examples/DDDigi/scripts/TestInput.py b/examples/DDDigi/scripts/TestInput.py index 6615e5d473e82335319d9974aff8373b10f0c49b..a35b18f93453a19c97ebb0d2a84eb632b3df02f4 100644 --- a/examples/DDDigi/scripts/TestInput.py +++ b/examples/DDDigi/scripts/TestInput.py @@ -14,7 +14,7 @@ from __future__ import absolute_import def run(): import DigiTest digi = DigiTest.Test(geometry=None) - read = digi.input_action('DigiROOTInput/SignalReader', mask=0x1, input=['CLICSiD_2022-10-05_13-21.root']) + read = digi.input_action('DigiROOTInput/SignalReader', mask=0x0, input=['CLICSiD_2022-10-05_13-21.root']) dump = digi.event_action('DigiStoreDump/StoreDump') digi.check_creation([read, dump]) digi.run_checked(num_events=5, num_threads=5, parallel=3) diff --git a/examples/DDDigi/scripts/TestMultiContainerParallel.py b/examples/DDDigi/scripts/TestMultiContainerParallel.py new file mode 100644 index 0000000000000000000000000000000000000000..150143cd31d4bb9ef2c6c4957fef92190fb53abb --- /dev/null +++ b/examples/DDDigi/scripts/TestMultiContainerParallel.py @@ -0,0 +1,43 @@ +# ========================================================================== +# AIDA Detector description implementation +# -------------------------------------------------------------------------- +# Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +# All rights reserved. +# +# For the licensing terms see $DD4hepINSTALL/LICENSE. +# For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +# +# ========================================================================== +from __future__ import absolute_import +import dddigi + +def run(): + import DigiTest + digi = DigiTest.Test(geometry=None) + #digi.load_geo() + input = digi.input_action('DigiParallelActionSequence/READER') + # ======================================================================== + digi.info('Created SIGNAL input') + signal = input.adopt_action('DigiROOTInput/SignalReader', mask=0x0, input=[digi.next_input()]) + digi.check_creation([signal]) + # ======================================================================== + event = digi.event_action('DigiSequentialActionSequence/EventAction') + proc = event.adopt_action('DigiMultiContainerProcessor/ContainerProc', + input_masks=[0x0, 0x1, 0x2, 0x3]) + cont = digi.data_containers() + num = int((len(cont)+2)/3) + for i in range(num): + #merge = digi.event_action('DigiSegmentDepositPrint/SegmentPrint_%03d'%(i,), register=None) + merge = dddigi.Action(digi.kernel(), 'DigiContainerProcessor/SegmentPrint_%03d'%(i,)); + conts = digi.containers(i*3,(i+1)*3) + proc.adopt_processor(merge, conts) + + #dump = event.adopt_action('DigiStoreDump/StoreDump') + #digi.check_creation([combine, dump, splitter]) + #digi.info('Created event.dump') + # ======================================================================== + digi.run_checked(num_events=1, num_threads=5, parallel=3) + + +if __name__ == '__main__': + run() diff --git a/examples/DDDigi/scripts/TestMultiInteractions.py b/examples/DDDigi/scripts/TestMultiInteractions.py index 0637e1c9706e17b16e10625b29130e674a79629e..223e18e673d85fba4f6ff69240d317e5cf9216ba 100644 --- a/examples/DDDigi/scripts/TestMultiInteractions.py +++ b/examples/DDDigi/scripts/TestMultiInteractions.py @@ -42,7 +42,7 @@ def run(): digi.info('Created input.overlay75') # ======================================================================================================== event = digi.event_action('DigiSequentialActionSequence/EventAction') - combine = event.adopt_action('DigiContainerCombine/Combine', masks=[0x0, 0x1, 0x2, 0x3], deposit_mask=0xFEED) + combine = event.adopt_action('DigiContainerCombine/Combine', input_masks=[0x0, 0x1, 0x2, 0x3], deposit_mask=0xFEED) combine.erase_combined = True # Not thread-safe! only do in SequentialActionSequence dump = event.adopt_action('DigiStoreDump/StoreDump') digi.check_creation([combine, dump]) diff --git a/examples/DDDigi/scripts/TestSegmentationSplit.py b/examples/DDDigi/scripts/TestSegmentationSplit.py index e5acd8ab868153b5537e7b61daeb3909a17a0115..2707b1769d71e4f742c8b01fcb0dc5f8f2f7f280 100644 --- a/examples/DDDigi/scripts/TestSegmentationSplit.py +++ b/examples/DDDigi/scripts/TestSegmentationSplit.py @@ -22,14 +22,14 @@ def run(): digi.check_creation([signal]) # ======================================================================== event = digi.event_action('DigiSequentialActionSequence/EventAction') - combine = event.adopt_action('DigiContainerCombine/Combine', masks=[0x0, 0x1, 0x2, 0x3], deposit_mask=0xFEED) + combine = event.adopt_action('DigiContainerCombine/Combine', input_masks=[0x0, 0x1, 0x2, 0x3], deposit_mask=0xFEED) combine.erase_combined = True # Not thread-safe! only do in SequentialActionSequence splitter = event.adopt_action('DigiSegmentationSplitter/Splitter', input='deposits', mask=0xFEED, detector='SiTrackerBarrel', split_by='layer', - processor_type='DigiSegmentAction') + processor_type='DigiSegmentDepositPrint') splitter.parallel = True dump = event.adopt_action('DigiStoreDump/StoreDump') digi.check_creation([combine, dump, splitter]) diff --git a/examples/DDDigi/scripts/TestSpillover.py b/examples/DDDigi/scripts/TestSpillover.py index 7e1fe1530a30736a26aa94471c3b6773a5251ab9..59471682d41ee49e06197db70d77eff9b07153db 100644 --- a/examples/DDDigi/scripts/TestSpillover.py +++ b/examples/DDDigi/scripts/TestSpillover.py @@ -76,7 +76,9 @@ def run(): digi.info('Created input.spillover75') # ======================================================================================================== event = digi.event_action('DigiSequentialActionSequence/EventAction') - combine = event.adopt_action('DigiContainerCombine/Combine', masks=[0x0, 0x1, 0x2, 0x3], deposit_mask=0xFEED) + combine = event.adopt_action('DigiContainerCombine/Combine', + input_masks=[0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6], + deposit_mask=0xFEED) combine.erase_combined = True # Not thread-safe! only do in SequentialActionSequence evtdump = event.adopt_action('DigiStoreDump/StoreDump') digi.check_creation([combine, evtdump])