24#include <TVirtualCollectionProxy.h>
25#include "Math/Vector4D.h"
27using ROOT::Math::PtEtaPhiEVector;
28using ROOT::Math::PtEtaPhiMVector;
29using ROOT::Math::PxPyPzEVector;
30using ROOT::Math::PxPyPzMVector;
50 TempInterface (
size_t size) : m_size (
size) {}
54 setCache (auxid, ptr);
57 using AuxVectorData::setStore;
59 size_t size_v()
const override {
return m_size; }
60 size_t capacity_v()
const override {
return m_size; }
96 if( ! evtStore.
retrieve( c, key ).isSuccess() ) {
97 msg << MSG::ERROR <<
"Couldn't retrieve container with key \"" <<
key
102 if( holder !=
nullptr ) {
107 cl = TClass::GetClass( *ti );
111 cl = TClass::GetClass(
typeid( *c ) );
113 if( ( allowMissing ==
false ) && ( cl ==
nullptr ) ) {
115 <<
"Couldn't find TClass dictionary for container \"" <<
key
144 if( ! evtStore.
retrieve( e, key ).isSuccess() ) {
145 msg << MSG::ERROR <<
"Couldn't retrieve object with key \"" <<
key
155 class ProxyWithName {
158 typedef const SG::DataProxy* argument_type;
160 ProxyWithName(
const std::string& name ) : m_name(
name ) {}
162 bool operator()( argument_type proxy )
const {
163 return (
proxy->name() == m_name );
188 auto proxies = evtStore.
proxies();
190 std::not_fn( ProxyWithName( key ) ) ),
202 <<
"Couldn't access data object as a data bucket?!?" <<
endmsg;
206 cl = TClass::GetClass( bucket->
tinfo() );
208 if(
msg.level() <= MSG::VERBOSE ) {
209 msg << MSG::VERBOSE <<
"No dictionary found for: "
215 if( !
cl->InheritsFrom(
"SG::AuxVectorBase" ) ) {
216 if(
msg.level() <= MSG::VERBOSE ) {
217 msg << MSG::VERBOSE <<
"Object \"" <<
key <<
"/" <<
cl->GetName()
218 <<
"\" does not inherit from SG::AuxVectorBase" <<
endmsg;
229 if( ! allowMissing ) {
230 msg << MSG::ERROR <<
"Couldn't retrieve object \"" <<
key
231 <<
"\" as SG::AuxVectorBase" <<
endmsg;
254 if( !evtStore.
retrieve( e, key ).isSuccess() ) {
256 msg << MSG::ERROR <<
"Couldn't retrieve object with key \"" <<
key
277 switch( typeidType ) {
315 msg << MSG::ERROR <<
"Received an unknown type: " << typeidType
327 StatusCode BranchConfig ::
339 static const std::regex
340 re(
"\\s*([\\w%]+)\\.([\\w%]+)\\s*->\\s*([\\w%]+)(\\s+type=([\\w%]+))?(\\s+metTerm=([\\w%]+))?(\\s+basketSize=([\\w%]+))?" );
345 msg << MSG::ERROR <<
"Expression \"" <<
branchDecl <<
"\" doesn't match \"<object>.<variable> -> <branch>\"" <<
endmsg;
346 return StatusCode::FAILURE;
354 if (
match[9].matched) {
357 }
catch (
const std::exception& ) {
358 msg << MSG::ERROR <<
"Could not parse basket size value: " <<
match[9] <<
endmsg;
359 return StatusCode::FAILURE;
362 return StatusCode::SUCCESS;
367 StatusCode BranchConfig ::
368 configureTypes (std::set<std::string>& decosWithoutType, MsgStream&
msg)
370 std::string nominalAuxName =
auxName;
371 if (
auto pos = nominalAuxName.find (
"%SYS%"); pos != std::string::npos)
372 nominalAuxName.replace (pos, 5,
"NOSYS");
385 else if (
typeName ==
"unsigned_char")
387 else if (
typeName ==
"unsigned_long")
389 else if (
typeName ==
"unsigned_long_long")
407 else if (
typeName ==
"vector_float")
409 else if (
typeName ==
"vector_uint8")
413 else if (
typeName ==
"vector_string")
415 else if (
typeName ==
"vector_vector_float")
417 else if (
typeName ==
"vector_vector_int")
419 else if (
typeName ==
"PtEtaPhiEVector")
421 else if (
typeName ==
"PtEtaPhiMVector")
423 else if (
typeName ==
"PxPyPzEVector")
425 else if (
typeName ==
"PxPyPzMVector")
427 else if (
typeName ==
"vector_PtEtaPhiEVector")
429 else if (
typeName ==
"vector_PtEtaPhiMVector")
431 else if (
typeName ==
"vector_PxPyPzEVector")
433 else if (
typeName ==
"vector_PxPyPzMVector")
435 else if (
typeName ==
"vector_vector_PtEtaPhiEVector")
437 else if (
typeName ==
"vector_vector_PtEtaPhiMVector")
439 else if (
typeName ==
"vector_vector_PxPyPzEVector")
441 else if (
typeName ==
"vector_vector_PxPyPzMVector")
445 unsigned line = __LINE__ - 2;
446 std::string
file = __FILE__;
448 msg << MSG::ERROR <<
"Unknown type requested, please extend " <<
file <<
" near line " << line <<
" for type " <<
typeName <<
endmsg;
449 return StatusCode::FAILURE;
458 decosWithoutType.insert (nominalAuxName);
459 msg << MSG::DEBUG <<
"No aux ID found for auxiliary variable: " << nominalAuxName <<
endmsg;
461 return StatusCode::SUCCESS;
470 <<
"No std::type_info available for aux-store variable: "
471 << nominalAuxName <<
endmsg;
472 return StatusCode::FAILURE;
481 <<
"No std::type_info available for aux-store variable: "
482 << nominalAuxName <<
endmsg;
483 return StatusCode::FAILURE;
492 <<
"No factory found for auxiliary variable: "
493 << nominalAuxName <<
endmsg;
494 return StatusCode::FAILURE;
497 return StatusCode::SUCCESS;
502 StatusCode BranchConfig ::
505 if (
sgName.find (
"%SYS%") == std::string::npos &&
506 auxName.find (
"%SYS%") == std::string::npos &&
507 branchName.find (
"%SYS%") == std::string::npos)
513 if (
branchName.find (
"%SYS%") == std::string::npos)
515 msg << MSG::ERROR <<
"Branch with systematics without %SYS% in branch name: "
517 return StatusCode::FAILURE;
519 if (
sgName.find (
"%SYS%") == std::string::npos &&
520 auxName.find (
"%SYS%") == std::string::npos)
522 msg << MSG::ERROR <<
"Branch with systematics without %SYS% in SG or aux name: "
524 return StatusCode::FAILURE;
526 if (
auxName.find (
"NOSYS") != std::string::npos)
528 msg << MSG::ERROR <<
"Branch with systematics with NOSYS in aux name: "
530 return StatusCode::FAILURE;
532 if (
sgName.find (
"NOSYS") != std::string::npos &&
auxName.find (
"%SYS%") == std::string::npos)
534 msg << MSG::ERROR <<
"Branch with NOSYS in SG name but without %SYS% in aux name: "
536 return StatusCode::FAILURE;
539 if (
sgName.find (
"%SYS%") != std::string::npos)
542 if (
auxName.find (
"%SYS%") != std::string::npos)
544 if (
auto pos =
sgName.find (
"NOSYS"); pos == std::string::npos)
552 std::string sgNameSys =
sgName;
553 sgNameSys.replace (pos, 5,
"%SYS%");
562 for (
auto& variation : allSys)
564 if (objectSys.find (variation) == objectSys.end())
576 return StatusCode::SUCCESS;
581 StatusCode OutputBranchData ::
586 if (
branchConfig.sgName.find (
"%SYS%") != std::string::npos)
590 return StatusCode::FAILURE;
592 return StatusCode::FAILURE;
593 if (!matching.
empty())
598 if (
branchConfig.auxName.find (
"%SYS%") != std::string::npos)
602 return StatusCode::FAILURE;
604 return StatusCode::FAILURE;
605 if (!matching.
empty())
610 if (
branchConfig.branchName.find (
"%SYS%") != std::string::npos)
614 return StatusCode::FAILURE;
616 return StatusCode::FAILURE;
619 msg << MSG::FATAL <<
"Branch \"" <<
branchName <<
"\" is not affected by any of the requested systematics but is not nominal." <<
endmsg;
620 return StatusCode::FAILURE;
627 msg << MSG::FATAL <<
"Branch \"" <<
branchName <<
"\" without systematics is evaluated in a non-nominal context." <<
endmsg;
628 return StatusCode::FAILURE;
632 return StatusCode::SUCCESS;
645 m_acc = std::make_unique<SG::TypelessConstAccessor>( *branchConfig.
auxType, outputData.
auxName );
654 TBranch* br =
nullptr;
657 if( strlen( branchConfig.
auxType->name() ) == 1 ) {
662 const char rType = rootType( branchConfig.
auxType->name()[ 0 ],
msg );
663 if( rType ==
'\0' ) {
664 msg << MSG::ERROR <<
"Type not recognised for variable: "
666 return StatusCode::FAILURE;
670 std::ostringstream typeDesc;
671 typeDesc << outputData.
branchName <<
"/" << rType;
675 typeDesc.str().c_str() );
678 msg << MSG::ERROR <<
"Failed to create branch: " << outputData.
branchName
680 return StatusCode::FAILURE;
684 br->SetBasketSize(branchConfig.
basketSize.value());
694 TClass* cl = TClass::GetClass( *branchConfig.
auxType );
696 cl = TClass::GetClass( typeName.c_str() );
699 msg << MSG::ERROR <<
"Couldn't find dictionary for type: "
701 return StatusCode::FAILURE;
703 if( ! cl->GetStreamerInfo() ) {
704 msg << MSG::ERROR <<
"No streamer info available for type: "
705 << cl->GetName() <<
endmsg;
706 return StatusCode::FAILURE;
714 msg << MSG::ERROR <<
"Failed to create branch: " << outputData.
branchName
716 return StatusCode::FAILURE;
720 br->SetBasketSize(branchConfig.
basketSize.value());
725 return StatusCode::SUCCESS;
734 msg << MSG::FATAL <<
"Internal logic error detected" <<
endmsg;
735 return StatusCode::FAILURE;
741 *element.container(), element.index(), 1 );
744 return StatusCode::SUCCESS;
749 msg << MSG::ERROR <<
"ElementBranchProcessor::setup for RNTuple should not be called" <<
endmsg;
750 return StatusCode::FAILURE;
760 m_acc = std::make_unique<SG::TypelessConstAccessor>( *branchConfig.
auxType, outputData.
auxName );
772 TClass* cl = TClass::GetClass( *branchConfig.
auxVecType );
774 cl = TClass::GetClass( typeName.c_str() );
777 msg << MSG::ERROR <<
"Couldn't find dictionary for type: "
779 return StatusCode::FAILURE;
781 if( ! cl->GetStreamerInfo() ) {
782 msg << MSG::ERROR <<
"No streamer info available for type: "
783 << cl->GetName() <<
endmsg;
784 return StatusCode::FAILURE;
789 TBranch* br =
tree.Branch( outputData.
branchName.c_str(), cl->GetName(),
792 msg << MSG::ERROR <<
"Failed to create branch: " << outputData.
branchName
794 return StatusCode::FAILURE;
797 br->SetBasketSize(branchConfig.
basketSize.value());
800 return StatusCode::SUCCESS;
808 msg << MSG::FATAL <<
"Internal logic error detected" <<
endmsg;
809 return StatusCode::FAILURE;
817 return StatusCode::SUCCESS;
825 msg << MSG::FATAL <<
"Internal logic error detected" <<
endmsg;
826 return StatusCode::FAILURE;
832 *element.container(), element.index(), 1 );
835 return StatusCode::SUCCESS;
840 msg << MSG::ERROR <<
"ContainerBranchProcessor::setup for RNTuple should not be called" <<
endmsg;
841 return StatusCode::FAILURE;
847 :
asg::
AsgMessaging( (
"CP::TreeBranchHelpers::ElementProcessorRegular/" + sgName).c_str() ),
856 static const bool ALLOW_MISSING =
false;
859 ALLOW_MISSING,
msg() );
863 return StatusCode::FAILURE;
873 return StatusCode::SUCCESS;
880 m_branches.emplace_back(std::make_unique<ElementBranchProcessor>());
884 return StatusCode::SUCCESS;
889 ATH_MSG_ERROR(
"ElementProcessorRegular::addBranch for RNTuple should not be called");
890 return StatusCode::FAILURE;
894 :
asg::
AsgMessaging( (
"CP::TreeBranchHelpers::ContainerProcessorRegular/" + sgName).c_str() ),
903 static const bool ALLOW_MISSING =
false;
904 const TClass* cl =
nullptr;
907 ALLOW_MISSING, cl,
msg() );
911 return StatusCode::FAILURE;
923 return StatusCode::FAILURE;
928 static const TClass*
const auxElementClass =
931 m_collProxy->GetValueClass()->GetBaseClassOffset( auxElementClass );
935 <<
"\" doesn't seem to inherit from \""
936 << auxElementClass->GetName() <<
"\"" );
937 return StatusCode::FAILURE;
944 const_cast< void*
>(
static_cast< const void*
>( &container ) );
945 TVirtualCollectionProxy::TPushPop helper(
m_collProxy, cPtr );
954 for( UInt_t i = 0; i < cSize; ++i ) {
957 char* elPtr =
static_cast< char*
>(
m_collProxy->At( i ) );
959 ATH_MSG_ERROR(
"Failed to get element " << i <<
" from container" );
960 return StatusCode::FAILURE;
973 return StatusCode::SUCCESS;
980 m_branches.emplace_back(std::make_unique<ContainerBranchProcessor>());
984 return StatusCode::SUCCESS;
989 ATH_MSG_ERROR(
"ContainerProcessorRegular::addBranch for RNTuple should not be called");
990 return StatusCode::FAILURE;
994 :
asg::
AsgMessaging( (
"CP::TreeBranchHelpers::ElementProcessorMet/" + sgName).c_str() ),
1006 if( term ==
nullptr ) {
1008 return StatusCode::FAILURE;
1017 return StatusCode::SUCCESS;
1024 m_branches.emplace_back(std::make_unique<ElementBranchProcessor>());
1028 return StatusCode::SUCCESS;
1033 ATH_MSG_ERROR(
"ElementProcessorMet::addBranch for RNTuple should not be called");
1034 return StatusCode::FAILURE;
1039 StatusCode ProcessorList ::
1040 setupTree(
const std::vector<std::string>& branches, std::unordered_set<std::string> nonContainers,
ISystematicsSvc& sysSvc, TTree&
tree) {
1044 std::vector<BranchConfig> branchConfigs;
1045 branchConfigs.reserve( branches.size() );
1046 for (
const std::string& branchDecl : branches ) {
1047 branchConfigs.emplace_back();
1048 ATH_CHECK( branchConfigs.back().parse( branchDecl,
msg() ) );
1049 if (!branchConfigs.back().basketSize.has_value())
1058 std::set<std::string> decosWithoutType;
1059 for (
auto& branchConfig : branchConfigs) {
1060 ATH_CHECK ( branchConfig.configureTypes (decosWithoutType,
msg()) );
1062 if (!decosWithoutType.empty()) {
1063 msg() << MSG::ERROR <<
"The following decorations have no type information:";
1064 for (
const auto& deco : decosWithoutType) {
1065 msg() <<
" " << deco;
1068 return StatusCode::FAILURE;
1072 for (
auto& branchConfig : branchConfigs) {
1073 ATH_CHECK ( branchConfig.configureSystematics (sysSvc,
msg()) );
1078 if (!sysVector.at(0).empty()) {
1079 ATH_MSG_ERROR (
"The first systematic in the list is not nominal!");
1080 return StatusCode::FAILURE;
1084 std::vector<OutputBranchData> outputBranches;
1087 std::unordered_set<std::string> allBranches;
1090 for(
const auto& branchConfig : branchConfigs ) {
1093 std::unordered_set<std::string> branchesForRule;
1096 for(
const auto& sys : sysVector ) {
1098 if (branchConfig.nominalOnly && !sys.empty())
continue;
1101 outputData.
sysIndex = &sys - &sysVector.front();
1107 if (branchesForRule.contains(outputData.
branchName))
1109 ANA_MSG_VERBOSE (
"Branch \"" << outputData.
branchName <<
"\" for rule \"" << branchConfig.branchDecl <<
"\" and systematic \"" << sys.name() <<
"\" already exists, skipping." );
1112 branchesForRule.insert(outputData.
branchName);
1116 if (allBranches.contains(outputData.
branchName))
1119 return StatusCode::FAILURE;
1122 outputBranches.push_back(std::move(outputData));
1131 return a.sysIndex < b.sysIndex; });
1133 for (
auto &outputData : outputBranches)
1137 return StatusCode::SUCCESS;
1143 branchConfig, outputData ) );
1145 <<
"\" from container/variable \"" << outputData.
sgName
1146 <<
"." << outputData.
auxName <<
"\"" );
1149 return StatusCode::SUCCESS;
1152 StatusCode ProcessorList ::
1161 return StatusCode::SUCCESS;
1167 getObjectProcessor(
const BranchConfig& branchConfig,
const std::string& sgName )
1169 std::string processorName = sgName;
1171 processorName +=
":metTerm=" + branchConfig.
metTermName;
1174 return *iter->second;
1177 return *
m_processors.emplace (processorName, std::make_unique<ElementProcessorMet>(sgName, branchConfig.
metTermName)).first->second;
1180 return *
m_processors.emplace (processorName, std::make_unique<ElementProcessorRegular>(sgName)).first->second;
1182 return *
m_processors.emplace (processorName, std::make_unique<ContainerProcessorRegular>(sgName)).first->second;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
Base class for elements of a container that can have aux data.
Manage index tracking and synchronization of auxiliary data.
std::vector< size_t > vec
Interface providing I/O for a generic auxiliary store.
Interface for factory objects that create vectors.
static HEPVis_BooleanProcessor processor
size_t size() const
Number of registered mappings.
#define ATLAS_NOT_CONST_THREAD_SAFE
the interface for the central systematics service
virtual CP::SystematicSet getObjectSystematics(const std::string &name) const =0
get the systematics for the given object in the event store
virtual std::vector< CP::SystematicSet > makeSystematicsVector() const =0
get the list of systematics
virtual CP::SystematicSet getDecorSystematics(const std::string &objectName, const std::string &decorName) const =0
get the systematics for the given object in the event store
virtual StatusCode makeSystematicsName(std::string &result, const std::string &name, const CP::SystematicSet &sys) const =0
make the name for the given systematics
Class to wrap a set of SystematicVariations.
bool empty() const
returns: whether the set is empty
static StatusCode filterForAffectingSystematics(const SystematicSet &systConfig, const SystematicSet &affectingSystematics, SystematicSet &filteredSystematics)
description: filter the systematics for the affected systematics returns: success guarantee: strong f...
std::string m_branchName
Name of the branch being written.
StatusCode resize(size_t size, MsgStream &msg)
Function (re)sizing the variable for a new event.
std::unique_ptr< SG::IAuxTypeVector > m_data
The object managing the memory of the written variable.
StatusCode process(const SG::AuxElement &element, size_t index, MsgStream &msg)
Function processing the object, filling the variable.
std::unique_ptr< SG::TypelessConstAccessor > m_acc
Object accessing the variable in question.
virtual StatusCode setup(TTree &tree, const BranchConfig &branchConfig, OutputBranchData &outputData, MsgStream &msg) override
Function setting up the object, and the branch.
const SG::IAuxTypeVectorFactory * m_factory
Pointer to the helper object that handles this variable.
void * m_dataPtr
Helper variable, pointing at the object to be written.
TVirtualCollectionProxy * m_collProxy
Collection proxy used for iterating over the container.
std::string m_sgName
Name of the object in the event store.
int m_auxElementOffset
Offset of the element type to SG::AuxElement.
virtual StatusCode retrieveProcess(StoreType &evtStore) override
retrieve and process the object
virtual StatusCode addBranch(TTree &tree, const BranchConfig &branchConfig, OutputBranchData &outputData) override
Add one branch to the output tree.
std::vector< std::unique_ptr< ContainerBranchProcessor > > m_branches
List of branch processors set up for this xAOD object.
ContainerProcessorRegular(const std::string &sgName)
Default constructor.
std::unique_ptr< SG::IAuxTypeVector > m_data
The object managing the memory of the written variable.
void * m_dataPtr
Helper variable, pointing at the object to be written.
const SG::IAuxTypeVectorFactory * m_factory
Pointer to the helper object that handles this variable.
std::string m_branchName
Name of the branch being written.
virtual StatusCode setup(TTree &tree, const BranchConfig &branchConfig, OutputBranchData &outputData, MsgStream &msg) override
Function setting up the object, and the branch.
std::unique_ptr< SG::TypelessConstAccessor > m_acc
Object accessing the variable in question.
StatusCode process(const SG::AuxElement &element, MsgStream &msg)
Function processing the object, filling the variable.
std::vector< std::unique_ptr< ElementBranchProcessor > > m_branches
List of branch processors set up for this xAOD object.
std::string m_termName
Name of the MET term to retrieve.
virtual StatusCode addBranch(TTree &tree, const BranchConfig &branchConfig, OutputBranchData &outputData) override
Add one branch to the output tree.
ElementProcessorMet(const std::string &sgName, const std::string &termName)
Default constructor.
virtual StatusCode retrieveProcess(StoreType &evtStore) override
retrieve and process the object
std::string m_sgName
Name of the object in the event store.
virtual StatusCode retrieveProcess(StoreType &evtStore) override
retrieve and process the object
virtual StatusCode addBranch(TTree &tree, const BranchConfig &branchConfig, OutputBranchData &outputData) override
Add one branch to the output tree.
std::string m_sgName
Name of the object in the event store.
ElementProcessorRegular(const std::string &sgName)
Default constructor.
std::vector< std::unique_ptr< ElementBranchProcessor > > m_branches
List of branch processors set up for this xAOD object.
the interface class for classes reading an object from the event store and processing it
virtual StatusCode addBranch(TTree &, const BranchConfig &, OutputBranchData &)=0
Add one branch to the output tree.
StatusCode setupBranch(const BranchConfig &branchConfig, OutputBranchData &outputData, TTree &tree)
Function setting up an individual branch on the first event.
std::unordered_set< std::string > m_nonContainers
the non-containers
IObjectProcessor & getObjectProcessor(const BranchConfig &branchConfig, const std::string &sgName)
std::optional< int > defaultBasketSize
the default basket size
std::unordered_map< std::string, std::unique_ptr< IObjectProcessor > > m_processors
object processors
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
virtual void * object()=0
virtual const std::type_info & tinfo() const =0
Return the type_info for the stored object.
virtual std::vector< const SG::DataProxy * > proxies() const =0
Return the list of all current proxies in store.
Handle mappings between names and auxid_t.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Manage index tracking and synchronization of auxiliary data.
Manage lookup of vectors of auxiliary data.
Helper class to provide constant type-safe access to aux data.
DataObject * accessData()
Access DataObject on-demand using conversion service.
The Athena Transient Store API.
StatusCode retrieve(const T *&ptr) const
Retrieve the default object into a const T*.
MsgStream & msg() const
The standard message stream.
MsgStream & msg() const
The standard message stream.
AsgMessaging(const std::string &name)
Constructor with a name.
Wrapper for Event to make it look like StoreGate.
bool contains(const std::string &name) const
Check if an object is available for constant access.
xAOD::TStore * tds() const
Return the underlying transient data store.
T * retrieve(const std::string &name) const
Function retrieving a constant or non-constant object.
This class takes care of holding EDM objects in memory.
const std::type_info * getTypeInfo() const
const THolder * holder(const std::string &key) const
return holder for key
bool match(std::string s1, std::string s2)
match the individual directories of two strings
a namespace for helper functions and objects for filling tree branches
StoreGateSvc StoreType
the type of the event store in the current environment
Select isolated Photons, Electrons and Muons.
std::string normalizedTypeinfoName(const std::type_info &info)
Convert a type_info to a normalized string representation (matching the names used in the root dictio...
static const auxid_t null_auxid
To signal no aux data item.
AuxElement(SG::AuxVectorData *container, size_t index)
Base class for elements of a container that can have aux data.
virtual const IAuxTypeVector * getVector(SG::auxid_t auxid) const override
Return vector interface for one aux data item.
size_t auxid_t
Identifier for a particular aux data item.
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
void stable_sort(DataModel_detail::iterator< DVL > beg, DataModel_detail::iterator< DVL > end)
Specialization of stable_sort for DataVector/List.
DataModel_detail::iterator< DVL > remove_if(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end, Predicate pred)
Specialization of remove_if for DataVector/List.
char rootType(char typeidType)
This function is used internally in the code when creating primitive dynamic auxiliary branches.
MissingET_v1 MissingET
Version control by type defintion.
MissingETContainer_v1 MissingETContainer
Convert a type_info to a normalized string representation (matching the names used in the root dictio...
the user configuration of an output branch
std::string branchDecl
the original user configuration string
std::string sgName
the SG name of the object to read from
const SG::IAuxTypeVectorFactory * auxFactory
pointer to the aux vector factory
std::string auxName
the aux data variable name to read from
const std::type_info * auxVecType
the vector type of the decoration we read
std::optional< int > basketSize
the basket size for this branch
CP::SystematicSet auxNameFilterSys
the affecting systematics for the auxName
CP::SystematicSet sgNameFilterSys
the affecting systematics for the sgName
CP::SystematicSet branchNameFilterSys
the affecting systematics for the branchName
const std::type_info * auxType
the type of the decoration we read
SG::auxid_t nominalAuxId
the aux-id for the nominal decoration
std::string branchName
the name of the output branch
std::string metTermName
MET ONLY: the name of the MET term to write out.
bool nominalOnly
whether we only want to write out the nominal
std::string typeName
the name of the type (or empty to read from aux-registry)
the data for a single output branch
bool isNominal
whether this is unaffected by systematics (i.e. nominal)
const BranchConfig * branchConfig
the BranchConfig we are based on
std::size_t sysIndex
the index in the systematics list
StatusCode configureNames(const BranchConfig &branchConfig, const CP::SystematicSet &sys, ISystematicsSvc &sysSvc, MsgStream &msg)
configure names for systematics
std::string auxName
the name of the decoration in the aux-store
std::string sgName
the SG name of the object to read from
std::string branchName
the name of the output branch