2323
2424#include " TError.h"
2525#include " TFile.h"
26- #include " TTree.h"
2726
2827#include " ROOT/RNTuple.hxx"
2928#include " ROOT/RNTupleReader.hxx"
@@ -440,31 +439,31 @@ void ProvenanceDumper::dumpEventFilteringParameterSets(edm::EventSelectionIDVect
440439}
441440
442441void ProvenanceDumper::dumpEventFilteringParameterSets_ (TFile* file, ProcessSimpleIDsType const & processSimpleIDs) {
443- TTree* history = dynamic_cast <TTree*>( file->Get (edm::poolNames::eventHistoryTreeName ().c_str () ));
444- if (history != nullptr ) {
445- edm::History h ;
446- edm::History* ph = &h;
447-
448- history-> SetBranchAddress ( edm::poolNames::eventHistoryBranchName (). c_str (), &ph) ;
449- if (history-> GetEntry ( 0 ) <= 0 ) {
450- std::cout << " No event filtering information is available; the event history tree has no entries \n " ;
451- } else {
452- dumpEventFilteringParameterSets (h. eventSelectionIDs (), processSimpleIDs);
453- }
454- } else {
455- TTree* events = dynamic_cast <TTree*>(file-> Get ( edm::poolNames::eventTreeName (). c_str ())) ;
456- assert (events != nullptr );
457- TBranch* eventSelectionsBranch = events-> GetBranch ( edm::poolNames::eventSelectionsBranchName (). c_str ());
458- if (eventSelectionsBranch == nullptr )
459- return ;
442+ auto eventsRNTuple = file->Get <ROOT::RNTuple> (edm::poolNames::eventTreeName ().c_str ());
443+ assert (eventsRNTuple != nullptr );
444+ auto eventsReader = ROOT::RNTupleReader::Open (*eventsRNTuple) ;
445+
446+ if (eventsReader-> GetNEntries () == 0 ) {
447+ std::cout << " No event filtering information is available; the event selections branch has no entries \n " ;
448+ return ;
449+ }
450+
451+ if (eventsReader-> GetModel (). GetFieldNames (). find ( edm::poolNames::eventSelectionsBranchName ()) ==
452+ eventsReader-> GetModel (). GetFieldNames (). end ()) {
453+ std::cout << " No event filtering information is available; the event selections field is not present \n " ;
454+ return ;
455+ }
456+
457+ try {
458+ auto entry = eventsReader-> GetModel (). CreateEntry () ;
460459 edm::EventSelectionIDVector ids;
461- edm::EventSelectionIDVector* pids = &ids;
462- eventSelectionsBranch-> SetAddress (&pids );
463- if (eventSelectionsBranch-> GetEntry ( 0 ) <= 0 ) {
464- std::cout << " No event filtering information is available; the event selections branch has no entries \n " ;
465- } else {
466- dumpEventFilteringParameterSets (ids, processSimpleIDs) ;
467- }
460+ entry-> BindRawPtr ( edm::poolNames::eventSelectionsBranchName (), &ids) ;
461+ eventsReader-> LoadEntry ( 0 , *entry );
462+ dumpEventFilteringParameterSets (ids, processSimpleIDs);
463+ } catch (ROOT::RException const & iExcept) {
464+ std::cout << " The following exception occured while reading the event filtering information: \n "
465+ << iExcept. what () << std::endl ;
466+ return ;
468467 }
469468}
470469
@@ -681,49 +680,76 @@ ProvenanceDumper::makeBranchIDListHelper() {
681680 return {};
682681 }
683682
684- TTree* metaTree = dynamic_cast <TTree*>(inputFile_->Get (edm::poolNames::metaDataTreeName ().c_str ()));
685- if (nullptr == metaTree) {
686- // std::cerr << "Did not find " << edm::poolNames::metaDataTreeName() << " tree" << std::endl;
683+ // Read BranchIDLists from metadata RNTuple
684+ auto metaRNTuple = inputFile_->Get <ROOT::RNTuple>(edm::poolNames::metaDataTreeName ().c_str ());
685+ if (nullptr == metaRNTuple) {
686+ std::cerr << " Did not find " << edm::poolNames::metaDataTreeName () << " RNTuple" << std::endl;
687687 return {};
688688 }
689689
690- TBranch* branchIDListsBranch = metaTree->GetBranch (edm::poolNames::branchIDListBranchName ().c_str ());
691- if (nullptr == branchIDListsBranch) {
692- /*
690+ auto metaReader = ROOT::RNTupleReader::Open (*metaRNTuple);
691+ if (metaReader->GetNEntries () == 0 ) {
692+ std::cerr << " No entries in " << edm::poolNames::metaDataTreeName () << " RNTuple" << std::endl;
693+ return {};
694+ }
695+
696+ // Check if the required field exists in the metadata RNTuple
697+ auto metaFieldNames = metaReader->GetModel ().GetFieldNames ();
698+ if (metaFieldNames.find (edm::poolNames::branchIDListBranchName ()) == metaFieldNames.end ()) {
693699 std::cerr << " Did not find " << edm::poolNames::branchIDListBranchName () << " from "
694- << edm::poolNames::metaDataTreeName() << " tree" << std::endl;
695- */
700+ << edm::poolNames::metaDataTreeName () << " RNTuple" << std::endl;
696701 return {};
697702 }
698703
699704 edm::BranchIDLists branchIDLists;
700- edm::BranchIDLists* branchIDListsPtr = &branchIDLists;
701- branchIDListsBranch->SetAddress (&branchIDListsPtr);
702- if (branchIDListsBranch->GetEntry (0 ) <= 0 ) {
703- // std::cerr << "Failed to read an entry from " << edm::poolNames::branchIDListBranchName() << std::endl;
705+ try {
706+ auto metaEntry = metaReader->GetModel ().CreateEntry ();
707+ metaEntry->BindRawPtr (edm::poolNames::branchIDListBranchName (), &branchIDLists);
708+ metaReader->LoadEntry (0 , *metaEntry);
709+ } catch (ROOT::RException const & iExcept) {
710+ std::cerr << " The following exception occurred while reading " << edm::poolNames::branchIDListBranchName ()
711+ << " from " << edm::poolNames::metaDataTreeName () << " RNTuple:\n "
712+ << iExcept.what () << std::endl;
704713 return {};
705714 }
706715
707716 edm::BranchIDListHelper branchIDListHelper;
708717 branchIDListHelper.updateFromInput (branchIDLists);
709718
710- TTree* events = dynamic_cast <TTree*>(inputFile_->Get (edm::poolNames::eventTreeName ().c_str ()));
711- assert (events != nullptr );
712- TBranch* branchListIndexesBranch = events->GetBranch (edm::poolNames::branchListIndexesBranchName ().c_str ());
713- if (nullptr == branchListIndexesBranch) {
714- /*
719+ // Read BranchListIndexes from events RNTuple
720+ auto eventsRNTuple = inputFile_->Get <ROOT::RNTuple>(edm::poolNames::eventTreeName ().c_str ());
721+ assert (eventsRNTuple != nullptr );
722+ auto eventsReader = ROOT::RNTupleReader::Open (*eventsRNTuple);
723+
724+ if (eventsReader->GetNEntries () <= static_cast <ROOT::NTupleSize_t>(productIDEntry_)) {
725+ std::cerr << " Requested entry " << productIDEntry_ << " but only " << eventsReader->GetNEntries () << " entries in "
726+ << edm::poolNames::eventTreeName () << " RNTuple" << std::endl;
727+ return {};
728+ }
729+
730+ // Check if the required field exists in the events RNTuple
731+ auto eventsFieldNames = eventsReader->GetModel ().GetFieldNames ();
732+ if (eventsFieldNames.find (edm::poolNames::branchListIndexesBranchName ()) == eventsFieldNames.end ()) {
715733 std::cerr << " Did not find " << edm::poolNames::branchListIndexesBranchName () << " from "
716- << edm::poolNames::eventTreeName() << " tree" << std::endl;
717- */
734+ << edm::poolNames::eventTreeName () << " RNTuple" << std::endl;
718735 return {};
719736 }
737+
720738 edm::BranchListIndexes branchListIndexes;
721- edm::BranchListIndexes* pbranchListIndexes = &branchListIndexes;
722- branchListIndexesBranch->SetAddress (&pbranchListIndexes);
723- if (branchListIndexesBranch->GetEntry (productIDEntry_) <= 0 or branchListIndexes.empty ()) {
739+ try {
740+ auto eventsEntry = eventsReader->GetModel ().CreateEntry ();
741+ eventsEntry->BindRawPtr (edm::poolNames::branchListIndexesBranchName (), &branchListIndexes);
742+ eventsReader->LoadEntry (productIDEntry_, *eventsEntry);
743+ } catch (ROOT::RException const & iExcept) {
744+ std::cerr << " The following exception occurred while reading " << edm::poolNames::branchListIndexesBranchName ()
745+ << " from " << edm::poolNames::eventTreeName () << " RNTuple:\n "
746+ << iExcept.what () << std::endl;
747+ return {};
748+ }
749+
750+ if (branchListIndexes.empty ()) {
724751 /*
725- std::cerr << "Failed to read entry from " << edm::poolNames::branchListIndexesBranchName() << ", or it is empty"
726- << std::endl;
752+ std::cerr << "BranchListIndexes is empty" << std::endl;
727753 */
728754 return {};
729755 }
@@ -741,7 +767,6 @@ ProvenanceDumper::makeBranchIDListHelper() {
741767
742768void ProvenanceDumper::work_ () {
743769 auto metaRNTuple = inputFile_->Get <ROOT::RNTuple>(edm::poolNames::metaDataTreeName ().c_str ());
744- // TTree* meta = dynamic_cast<TTree*>(inputFile_->Get(edm::poolNames::metaDataTreeName().c_str()));
745770 assert (metaRNTuple);
746771
747772 auto reader = ROOT::RNTupleReader::Open (*metaRNTuple);
@@ -755,7 +780,7 @@ void ProvenanceDumper::work_() {
755780 assert (rntuple);
756781 auto psets = ROOT::RNTupleReader::Open (*rntuple);
757782 assert (psets.get ());
758- auto entry = psets->GetModel ().CreateBareEntry ();
783+ auto entry = psets->GetModel ().CreateEntry ();
759784
760785 std::pair<edm::ParameterSetID, edm::ParameterSetBlob> idToBlob;
761786 entry->BindRawPtr (" IdToParameterSetsBlobs" , &idToBlob);
@@ -817,74 +842,72 @@ void ProvenanceDumper::work_() {
817842 std::map<edm::BranchID, std::set<edm::ParentageID>> perProductParentage;
818843
819844 if (showDependencies_ || extendedAncestors_ || extendedDescendants_) {
820- TTree* parentageTree = dynamic_cast <TTree*>( inputFile_->Get (edm::poolNames::parentageTreeName ().c_str () ));
821- if (nullptr == parentageTree ) {
822- std::cerr << " ERROR, no Parentage tree available so cannot show dependencies, ancestors, or descendants.\n " ;
845+ auto parentageRNTuple = inputFile_->Get <ROOT::RNTuple> (edm::poolNames::parentageTreeName ().c_str ());
846+ if (nullptr == parentageRNTuple ) {
847+ std::cerr << " ERROR, no Parentage RNTuple available so cannot show dependencies, ancestors, or descendants.\n " ;
823848 std::cerr << " Possibly this is not a standard EDM format file. For example, dependency, ancestor, and\n " ;
824849 std::cerr << " descendant options to edmProvDump will not work with nanoAOD format files.\n\n " ;
825850 showDependencies_ = false ;
826851 extendedAncestors_ = false ;
827852 extendedDescendants_ = false ;
828853 } else {
829- edm::ParentageRegistry& registry = * edm::ParentageRegistry::instance ( );
854+ auto parentageReader = ROOT::RNTupleReader::Open (*parentageRNTuple );
830855
831- std::vector<edm::ParentageID> orderedParentageIDs;
832- orderedParentageIDs.reserve (parentageTree->GetEntries ());
833- for (Long64_t i = 0 , numEntries = parentageTree->GetEntries (); i < numEntries; ++i) {
834- edm::Parentage parentageBuffer;
835- edm::Parentage* pParentageBuffer = &parentageBuffer;
836- parentageTree->SetBranchAddress (edm::poolNames::parentageBranchName ().c_str (), &pParentageBuffer);
837- parentageTree->GetEntry (i);
838- registry.insertMapped (parentageBuffer);
839- orderedParentageIDs.push_back (parentageBuffer.id ());
840- }
841- parentageTree->SetBranchAddress (edm::poolNames::parentageBranchName ().c_str (), nullptr );
842-
843- TTree* eventMetaTree =
844- dynamic_cast <TTree*>(inputFile_->Get (edm::BranchTypeToMetaDataTreeName (edm::InEvent).c_str ()));
845- if (nullptr == eventMetaTree) {
846- eventMetaTree = dynamic_cast <TTree*>(inputFile_->Get (edm::BranchTypeToProductTreeName (edm::InEvent).c_str ()));
847- }
848- if (nullptr == eventMetaTree) {
849- std::cerr << " ERROR, no '" << edm::BranchTypeToProductTreeName (edm::InEvent)
850- << " ' Tree in file so can not show dependencies\n " ;
856+ // Check if the required field exists in the parentage RNTuple
857+ auto parentageFieldNames = parentageReader->GetModel ().GetFieldNames ();
858+ if (parentageFieldNames.find (edm::poolNames::parentageBranchName ()) == parentageFieldNames.end ()) {
859+ std::cerr << " ERROR, no '" << edm::poolNames::parentageBranchName ()
860+ << " ' field in Parentage RNTuple so cannot show dependencies\n " ;
851861 showDependencies_ = false ;
852862 extendedAncestors_ = false ;
853863 extendedDescendants_ = false ;
854864 } else {
855- TBranch* storedProvBranch =
856- eventMetaTree->GetBranch (edm::BranchTypeToProductProvenanceBranchName (edm::InEvent).c_str ());
857-
858- if (nullptr != storedProvBranch) {
859- std::vector<edm::StoredProductProvenance> info;
860- std::vector<edm::StoredProductProvenance>* pInfo = &info;
861- storedProvBranch->SetAddress (&pInfo);
862- for (Long64_t i = 0 , numEntries = eventMetaTree->GetEntries (); i < numEntries; ++i) {
863- storedProvBranch->GetEntry (i);
864- for (auto const & item : info) {
865- edm::BranchID bid (item.branchID_ );
866- perProductParentage[bid].insert (orderedParentageIDs.at (item.parentageIDIndex_ ));
867- }
868- }
865+ edm::ParentageRegistry& registry = *edm::ParentageRegistry::instance ();
866+
867+ std::vector<edm::ParentageID> orderedParentageIDs;
868+ orderedParentageIDs.reserve (parentageReader->GetNEntries ());
869+
870+ auto parentageEntry = parentageReader->GetModel ().CreateEntry ();
871+ edm::Parentage parentageBuffer;
872+ parentageEntry->BindRawPtr (edm::poolNames::parentageBranchName (), &parentageBuffer);
873+
874+ for (ROOT::NTupleSize_t i = 0 , numEntries = parentageReader->GetNEntries (); i < numEntries; ++i) {
875+ parentageReader->LoadEntry (i, *parentageEntry);
876+ registry.insertMapped (parentageBuffer);
877+ orderedParentageIDs.push_back (parentageBuffer.id ());
878+ }
879+
880+ auto eventsRNTuple = inputFile_->Get <ROOT::RNTuple>(edm::BranchTypeToProductTreeName (edm::InEvent).c_str ());
881+ if (nullptr == eventsRNTuple) {
882+ std::cerr << " ERROR, no '" << edm::BranchTypeToProductTreeName (edm::InEvent)
883+ << " ' RNTuple in file so can not show dependencies\n " ;
884+ showDependencies_ = false ;
885+ extendedAncestors_ = false ;
886+ extendedDescendants_ = false ;
869887 } else {
870- // backwards compatible check
871- TBranch* productProvBranch =
872- eventMetaTree->GetBranch (edm::BranchTypeToBranchEntryInfoBranchName (edm::InEvent).c_str ());
873- if (nullptr != productProvBranch) {
874- std::vector<edm::ProductProvenance> info;
875- std::vector<edm::ProductProvenance>* pInfo = &info;
876- productProvBranch->SetAddress (&pInfo);
877- for (Long64_t i = 0 , numEntries = eventMetaTree->GetEntries (); i < numEntries; ++i) {
878- productProvBranch->GetEntry (i);
879- for (auto const & item : info) {
880- perProductParentage[item.branchID ()].insert (item.parentageID ());
881- }
882- }
883- } else {
884- std::cerr << " ERROR, could not find provenance information so can not show dependencies\n " ;
888+ auto eventsReader = ROOT::RNTupleReader::Open (*eventsRNTuple);
889+
890+ // Check if the required field exists in the events RNTuple
891+ auto eventsFieldNames = eventsReader->GetModel ().GetFieldNames ();
892+ if (eventsFieldNames.find (edm::BranchTypeToProductProvenanceBranchName (edm::InEvent)) ==
893+ eventsFieldNames.end ()) {
894+ std::cerr << " ERROR, no '" << edm::BranchTypeToProductProvenanceBranchName (edm::InEvent)
895+ << " ' field in events RNTuple so cannot show dependencies\n " ;
885896 showDependencies_ = false ;
886897 extendedAncestors_ = false ;
887898 extendedDescendants_ = false ;
899+ } else {
900+ auto eventsEntry = eventsReader->GetModel ().CreateEntry ();
901+ std::vector<edm::StoredProductProvenance> info;
902+ eventsEntry->BindRawPtr (edm::BranchTypeToProductProvenanceBranchName (edm::InEvent), &info);
903+
904+ for (ROOT::NTupleSize_t i = 0 , numEntries = eventsReader->GetNEntries (); i < numEntries; ++i) {
905+ eventsReader->LoadEntry (i, *eventsEntry);
906+ for (auto const & item : info) {
907+ edm::BranchID bid (item.branchID_ );
908+ perProductParentage[bid].insert (orderedParentageIDs.at (item.parentageIDIndex_ ));
909+ }
910+ }
888911 }
889912 }
890913 }
0 commit comments