ATLAS Offline Software
Loading...
Searching...
No Matches
CP::TreeBranchHelpers::ElementBranchProcessor Class Reference

Class writing one variable from an xAOD object into a branch. More...

#include <TreeBranchHelpers.h>

Inheritance diagram for CP::TreeBranchHelpers::ElementBranchProcessor:
Collaboration diagram for CP::TreeBranchHelpers::ElementBranchProcessor:

Public Member Functions

StatusCode setup (TTree &tree, const BranchConfig &branchConfig, OutputBranchData &outputData, MsgStream &msg)
 Function setting up the object, and the branch.
StatusCode process (const SG::AuxElement &element, MsgStream &msg)
 Function processing the object, filling the variable.

Public Attributes

std::string m_branchName
 Name of the branch being written.
std::unique_ptr< SG::TypelessConstAccessorm_acc
 Object accessing the variable in question.
const SG::IAuxTypeVectorFactorym_factory = nullptr
 Pointer to the helper object that handles this variable.
std::unique_ptr< SG::IAuxTypeVectorm_data
 The object managing the memory of the written variable.
void * m_dataPtr = nullptr
 Helper variable, pointing at the object to be written.

Detailed Description

Class writing one variable from an xAOD object into a branch.

It is used for both setting up the branch in the outut TTree during the setup of the tree, and then to fill the "output variable" with the right payload during the event processing.

Note that since we may have a lot of such objects, I didn't want to make it inherit from asg::AsgMessaging. Which means that all of the class's functions need to receive its parent's message stream object to be able to log error messages "nicely".

Also note that since this is very much an internal class, all of its members are public. Since the owner of such objects should know perfectly well how they behave.

Definition at line 218 of file TreeBranchHelpers.h.

Member Function Documentation

◆ process()

StatusCode CP::TreeBranchHelpers::ElementBranchProcessor::process ( const SG::AuxElement & element,
MsgStream & msg )

Function processing the object, filling the variable.

This function is called by ElementProcessorRegular, to extract one variable from the standalone object, and move its payload into the memory address from which the output tree is writing its branch.

Parameters
elementThe standalone object to get the auxiliary variable from
msgReference to the parent's MsgStream object
Returns
The usual StatusCode values

Definition at line 683 of file TreeBranchHelpers.cxx.

684 {
685
686 // A security check.
687 if( ( ! m_acc ) || ( ! m_factory ) || ( ! m_data ) ) {
688 msg << MSG::FATAL << "Internal logic error detected" << endmsg;
689 return StatusCode::FAILURE;
690 }
691
692 // Get the data out of the xAOD object.
693 //const void* auxData = ( *m_acc )( element );
694
695 // Copy it into the output variable.
696 TempInterface dstiface (m_data->size(), m_acc->auxid(), m_data->toPtr());
697 m_factory->copy( m_acc->auxid(), dstiface, 0,
698 *element.container(), element.index(), 1 );
699
700 // Return gracefully.
701 return StatusCode::SUCCESS;
702 }
#define endmsg
std::unique_ptr< SG::IAuxTypeVector > m_data
The object managing the memory of the written variable.
const SG::IAuxTypeVectorFactory * m_factory
Pointer to the helper object that handles this variable.
std::unique_ptr< SG::TypelessConstAccessor > m_acc
Object accessing the variable in question.
const SG::AuxVectorData * container() const
Return the container holding this element.
size_t index() const
Return the index of this element within its container.
MsgStream & msg
Definition testRead.cxx:32

◆ setup()

StatusCode CP::TreeBranchHelpers::ElementBranchProcessor::setup ( TTree & tree,
const BranchConfig & branchConfig,
OutputBranchData & outputData,
MsgStream & msg )

Function setting up the object, and the branch.

This is pretty much the constructor of the class. I just decided to implement it as a regular function and not a "real" constructor, to be able to return a StatusCode value from the call. Since the setup of the object may very well fail.

Parameters
treeThe tree to set up the new branch in
auxNameThe name of the auxiliary variable to create a branch from
branchNameName of the branch to create in the tree
msgReference to the parent's MsgStream object
Returns
The usual StatusCode values

Definition at line 599 of file TreeBranchHelpers.cxx.

600 {
601
602 // Remember the branch name.
603 m_branchName = outputData.branchName;
604
605 // Create the accessor.
606 m_acc.reset( new SG::TypelessConstAccessor( *branchConfig.auxType, outputData.auxName ) );
607
608 // Get a pointer to the vector factory.
609 m_factory = branchConfig.auxFactory;
610
611 // Create the data object.
612 m_data = m_factory->create( m_acc->auxid(), 1, 1, false );
613
614 // Pointer to the branch, to be created.
615 TBranch* br = nullptr;
616
617 // Decide whether we're dealing with a "primitive" or an "object" branch.
618 if( strlen( branchConfig.auxType->name() ) == 1 ) {
619
620 // This is a "primitive" variable...
621
622 // Get the type identifier for it that ROOT will understand.
623 const char rType = rootType( branchConfig.auxType->name()[ 0 ], msg );
624 if( rType == '\0' ) {
625 msg << MSG::ERROR << "Type not recognised for variable: "
626 << outputData.branchName << endmsg;
627 return StatusCode::FAILURE;
628 }
629
630 // Construct the type description.
631 std::ostringstream typeDesc;
632 typeDesc << outputData.branchName << "/" << rType;
633
634 // Create the primitive branch.
635 br = tree.Branch( outputData.branchName.c_str(), m_data->toPtr(),
636 typeDesc.str().c_str() );
637 if (branchConfig.basketSize.has_value())
638 br->SetBasketSize(branchConfig.basketSize.value());
639
640 } else {
641
642 // This is an "object" variable...
643
644 // Get a proper type name for the variable.
645 const std::string typeName = SG::normalizedTypeinfoName( *branchConfig.auxType );
646
647 // Access the dictionary for the type.
648 TClass* cl = TClass::GetClass( *branchConfig.auxType );
649 if( ! cl ) {
650 cl = TClass::GetClass( typeName.c_str() );
651 }
652 if( ! cl ) {
653 msg << MSG::ERROR << "Couldn't find dictionary for type: "
654 << typeName << endmsg;
655 return StatusCode::FAILURE;
656 }
657 if( ! cl->GetStreamerInfo() ) {
658 msg << MSG::ERROR << "No streamer info available for type: "
659 << cl->GetName() << endmsg;
660 return StatusCode::FAILURE;
661 }
662
663 // Create the object branch.
664 m_dataPtr = m_data->toPtr();
665 br = tree.Branch( outputData.branchName.c_str(), cl->GetName(), &m_dataPtr );
666 if (branchConfig.basketSize.has_value())
667 br->SetBasketSize(branchConfig.basketSize.value());
668
669 }
670
671 // Check that the branch creation succeeded.
672 if( ! br ) {
673 msg << MSG::ERROR << "Failed to create branch: " << outputData.branchName
674 << endmsg;
675 return StatusCode::FAILURE;
676 }
677
678 // Return gracefully.
679 return StatusCode::SUCCESS;
680 }
void * m_dataPtr
Helper variable, pointing at the object to be written.
std::string m_branchName
Name of the branch being written.
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...
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
char rootType(char typeidType)
This function is used internally in the code when creating primitive dynamic auxiliary branches.
TChain * tree

Member Data Documentation

◆ m_acc

std::unique_ptr< SG::TypelessConstAccessor > CP::TreeBranchHelpers::ElementBranchProcessor::m_acc

Object accessing the variable in question.

Definition at line 255 of file TreeBranchHelpers.h.

◆ m_branchName

std::string CP::TreeBranchHelpers::ElementBranchProcessor::m_branchName

Name of the branch being written.

Definition at line 253 of file TreeBranchHelpers.h.

◆ m_data

std::unique_ptr< SG::IAuxTypeVector > CP::TreeBranchHelpers::ElementBranchProcessor::m_data

The object managing the memory of the written variable.

Definition at line 259 of file TreeBranchHelpers.h.

◆ m_dataPtr

void* CP::TreeBranchHelpers::ElementBranchProcessor::m_dataPtr = nullptr

Helper variable, pointing at the object to be written.

Definition at line 261 of file TreeBranchHelpers.h.

◆ m_factory

const SG::IAuxTypeVectorFactory* CP::TreeBranchHelpers::ElementBranchProcessor::m_factory = nullptr

Pointer to the helper object that handles this variable.

Definition at line 257 of file TreeBranchHelpers.h.


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