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 215 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 647 of file TreeBranchHelpers.cxx.

648 {
649
650 // A security check.
651 if( ( ! m_acc ) || ( ! m_factory ) || ( ! m_data ) ) {
652 msg << MSG::FATAL << "Internal logic error detected" << endmsg;
653 return StatusCode::FAILURE;
654 }
655
656 // Get the data out of the xAOD object.
657 //const void* auxData = ( *m_acc )( element );
658
659 // Copy it into the output variable.
660 TempInterface dstiface (m_data->size(), m_acc->auxid(), m_data->toPtr());
661 m_factory->copy( m_acc->auxid(), dstiface, 0,
662 *element.container(), element.index(), 1 );
663
664 // Return gracefully.
665 return StatusCode::SUCCESS;
666 }
#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 567 of file TreeBranchHelpers.cxx.

568 {
569
570 // Remember the branch name.
571 m_branchName = outputData.branchName;
572
573 // Create the accessor.
574 m_acc.reset( new SG::TypelessConstAccessor( *branchConfig.auxType, outputData.auxName ) );
575
576 // Get a pointer to the vector factory.
577 m_factory = branchConfig.auxFactory;
578
579 // Create the data object.
580 m_data = m_factory->create( m_acc->auxid(), 1, 1, false );
581
582 // Pointer to the branch, to be created.
583 TBranch* br = nullptr;
584
585 // Decide whether we're dealing with a "primitive" or an "object" branch.
586 if( strlen( branchConfig.auxType->name() ) == 1 ) {
587
588 // This is a "primitive" variable...
589
590 // Get the type identifier for it that ROOT will understand.
591 const char rType = rootType( branchConfig.auxType->name()[ 0 ], msg );
592 if( rType == '\0' ) {
593 msg << MSG::ERROR << "Type not recognised for variable: "
594 << outputData.branchName << endmsg;
595 return StatusCode::FAILURE;
596 }
597
598 // Construct the type description.
599 std::ostringstream typeDesc;
600 typeDesc << outputData.branchName << "/" << rType;
601
602 // Create the primitive branch.
603 br = tree.Branch( outputData.branchName.c_str(), m_data->toPtr(),
604 typeDesc.str().c_str() );
605
606 } else {
607
608 // This is an "object" variable...
609
610 // Get a proper type name for the variable.
611 const std::string typeName = SG::normalizedTypeinfoName( *branchConfig.auxType );
612
613 // Access the dictionary for the type.
614 TClass* cl = TClass::GetClass( *branchConfig.auxType );
615 if( ! cl ) {
616 cl = TClass::GetClass( typeName.c_str() );
617 }
618 if( ! cl ) {
619 msg << MSG::ERROR << "Couldn't find dictionary for type: "
620 << typeName << endmsg;
621 return StatusCode::FAILURE;
622 }
623 if( ! cl->GetStreamerInfo() ) {
624 msg << MSG::ERROR << "No streamer info available for type: "
625 << cl->GetName() << endmsg;
626 return StatusCode::FAILURE;
627 }
628
629 // Create the object branch.
630 m_dataPtr = m_data->toPtr();
631 br = tree.Branch( outputData.branchName.c_str(), cl->GetName(), &m_dataPtr );
632
633 }
634
635 // Check that the branch creation succeeded.
636 if( ! br ) {
637 msg << MSG::ERROR << "Failed to create branch: " << outputData.branchName
638 << endmsg;
639 return StatusCode::FAILURE;
640 }
641
642 // Return gracefully.
643 return StatusCode::SUCCESS;
644 }
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 252 of file TreeBranchHelpers.h.

◆ m_branchName

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

Name of the branch being written.

Definition at line 250 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 256 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 258 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 254 of file TreeBranchHelpers.h.


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