From fa1271c181ec6ccbfb7935be56a61cb166a34e7e Mon Sep 17 00:00:00 2001 From: Will Buttinger <William.Buttinger@cern.ch> Date: Sun, 23 Oct 2016 11:48:38 +0200 Subject: [PATCH] 'changes to test thresholds again, and cleanup jobopts' (POOLRootAccess-00-00-20) move to a lower threshold for failure of test, and moved full athena test to use same test file as in 2.4.X ... will need latest xAODRootAccess to work in release 21 onwards .. needs TrigValTools-04-34 or later Removed POOL and xAOD-specific jobopts files since these extras are now handled inside the TEvent class * Tagging POOLRootAccess-00-00-20 2016-10-22 scott snyder <snyder@bnl.gov> * Tagging POOLRootAccess-00-00-19. * test/POOLRootAccess.xml: Raise threshold for reporting test failures due to timing, since it is currently failing more often than not. 2016-09-26 Will Buttinger <will@cern.ch> * Fixed cmake compilation * Tagging POOLRootAccess-00-00-18 2016-09-19 will buttinger <will@cern.ch> * Put rootmonitor.py back into test * added new basic.opts and made setup for POOL/xAOD factorised from this minimal setup * Tagging POOLRootAccess-00-00-17 ... (Long ChangeLog diff - truncated) --- PhysicsAnalysis/POOLRootAccess/CMakeLists.txt | 11 +-- .../POOLRootAccess/POOLRootAccess/TEvent.h | 13 +-- .../POOLRootAccess/cmt/requirements | 5 ++ .../share/{basicxAOD.opts => basic.opts} | 5 +- .../POOLRootAccess/share/basicPOOL.opts | 29 ------- PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx | 83 ++++++++++--------- .../POOLRootAccess/test/POOLRootAccess.xml | 13 ++- .../POOLRootAccess/test/ut_basicRead_test.cxx | 12 ++- .../POOLRootAccess/test/ut_basicRead_test.py | 13 ++- .../test/ut_basicxAODRead_test.cxx | 10 ++- 10 files changed, 106 insertions(+), 88 deletions(-) rename PhysicsAnalysis/POOLRootAccess/share/{basicxAOD.opts => basic.opts} (89%) delete mode 100644 PhysicsAnalysis/POOLRootAccess/share/basicPOOL.opts diff --git a/PhysicsAnalysis/POOLRootAccess/CMakeLists.txt b/PhysicsAnalysis/POOLRootAccess/CMakeLists.txt index ead38b41fbf5..9580c889c409 100644 --- a/PhysicsAnalysis/POOLRootAccess/CMakeLists.txt +++ b/PhysicsAnalysis/POOLRootAccess/CMakeLists.txt @@ -13,6 +13,7 @@ atlas_depends_on_subdirs( PUBLIC Control/StoreGateBindings PRIVATE Control/xAODRootAccess + Control/AthAnalysisBaseComps Event/xAOD/xAODBase Event/xAOD/xAODEventInfo ) @@ -23,9 +24,9 @@ find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread ) atlas_add_library( POOLRootAccess src/*.cxx PUBLIC_HEADERS POOLRootAccess - PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} xAODRootAccess - PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel StoreGateLib SGtests StoreGateBindings ) + PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} xAODRootAccess AthAnalysisBaseCompsLib StoreGateLib + PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel SGtests StoreGateBindings ) atlas_add_dictionary( POOLRootAccessDict POOLRootAccess/POOLRootAccessDict.h @@ -36,12 +37,12 @@ atlas_add_dictionary( POOLRootAccessDict atlas_add_executable( ut_basicRead_test test/ut_basicRead_test.cxx INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} POOLRootAccess xAODBase xAODEventInfo ) + LINK_LIBRARIES ${ROOT_LIBRARIES} POOLRootAccess xAODEventInfo ) atlas_add_executable( ut_basicxAODRead_test test/ut_basicxAODRead_test.cxx INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} POOLRootAccess xAODBase xAODEventInfo ) + LINK_LIBRARIES ${ROOT_LIBRARIES} POOLRootAccess xAODEventInfo ) # Install files from the package: atlas_install_joboptions( share/*.opts ) diff --git a/PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h b/PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h index e2115431fab2..b4e0a2ba33e7 100644 --- a/PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h +++ b/PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h @@ -20,10 +20,15 @@ class TFile; class TChain; +//Bootstraps the minimal gaudi environment + a few extra defaults (see basic.opts) +namespace Gaudi { + IAppMgrUI* Init(); +} + namespace POOL { ///Bootstraps (creates and configures) the Gaudi Application with the provided options file - IAppMgrUI* Init( const char* options = "POOLRootAccess/basicPOOL.opts" ); + IAppMgrUI* Init( const char* options = "POOLRootAccess/basic.opts" ); class TEvent { @@ -36,11 +41,9 @@ namespace POOL { kUndefinedAccess = 3 }; - static IAppMgrUI* Init( const char* options ) { return POOL::Init(options); } - static IAppMgrUI* InitPOOL() { return POOL::Init("POOLRootAccess/basicPOOL.opts"); } - static IAppMgrUI* InitxAOD() { return POOL::Init("POOLRootAccess/basicxAOD.opts"); } + static IAppMgrUI* Init( const char* options = "POOLRootAccess/basic.opts" ) { return POOL::Init(options); } + - //use selectorType="Athena::xAODEventSelector" for fast xAOD TEvent( const std::string& name = "StoreGateSvc" ); TEvent( EReadMode mode, const std::string& name = "StoreGateSvc" ); diff --git a/PhysicsAnalysis/POOLRootAccess/cmt/requirements b/PhysicsAnalysis/POOLRootAccess/cmt/requirements index 538a95a5e58f..7a6965d77476 100644 --- a/PhysicsAnalysis/POOLRootAccess/cmt/requirements +++ b/PhysicsAnalysis/POOLRootAccess/cmt/requirements @@ -2,6 +2,7 @@ package POOLRootAccess author will + ## for athena policies: this has to be the first use statement use AtlasPolicy AtlasPolicy-* @@ -14,6 +15,9 @@ use StoreGateBindings StoreGateBindings-* Control private use AtlasROOT AtlasROOT-* External + +use AthAnalysisBaseComps AthAnalysisBaseComps-* Control + end_private ## @@ -42,3 +46,4 @@ macro_append ut_basicRead_test_dependencies " POOLRootAccess " application ut_basicxAODRead_test ../test/ut_basicxAODRead_test.cxx macro_append ut_basicxAODRead_test_dependencies " POOLRootAccess " end_private + diff --git a/PhysicsAnalysis/POOLRootAccess/share/basicxAOD.opts b/PhysicsAnalysis/POOLRootAccess/share/basic.opts similarity index 89% rename from PhysicsAnalysis/POOLRootAccess/share/basicxAOD.opts rename to PhysicsAnalysis/POOLRootAccess/share/basic.opts index f8f2aa962bc6..f939e83477ea 100644 --- a/PhysicsAnalysis/POOLRootAccess/share/basicxAOD.opts +++ b/PhysicsAnalysis/POOLRootAccess/share/basic.opts @@ -2,6 +2,8 @@ #pragma print off //do not print ApplicationMgr.OutputLevel = 0; //NIL ... so ApplicationMgr is silent //MessageSvc.OutputLevel = 5; //ERROR +ApplicationMgr.EventLoop = "MinimalEventLoopMgr"; //for minimal service creation + EventPersistencySvc.CnvServices = {"Athena::xAODCnvSvc","AthenaPoolCnvSvc"}; ProxyProviderSvc.ProviderNames = {"MetaDataSvc"}; MetaDataSvc.MetaDataContainer = "MetaDataHdr"; @@ -13,9 +15,6 @@ MessageSvc.Format = "% F%30W%S%7W%R%T %0W%M"; ChronoStatSvc.ChronoPrintOutTable = false; ChronoStatSvc.PrintUserTime = false; -//we hijack the joboptionsvc to signal to POOLTEvent we want to use this event selector type -TEvent.EventSelectorType = "Athena::xAODEventSelector"; - //The following settings silence some services (although not entirely, sadly) //need to keep this here because a reinit will override the setWarning settings of MessageSvc HistogramPersistencySvc.OutputLevel = 5; diff --git a/PhysicsAnalysis/POOLRootAccess/share/basicPOOL.opts b/PhysicsAnalysis/POOLRootAccess/share/basicPOOL.opts deleted file mode 100644 index fbb9111ac8e0..000000000000 --- a/PhysicsAnalysis/POOLRootAccess/share/basicPOOL.opts +++ /dev/null @@ -1,29 +0,0 @@ - -#pragma print off //do not print -ApplicationMgr.OutputLevel = 0; //NIL ... so ApplicationMgr is silent -//MessageSvc.OutputLevel = 5; //ERROR -EventPersistencySvc.CnvServices = {"AthenaPoolCnvSvc"}; -ProxyProviderSvc.ProviderNames = {"AthenaPoolAddressProviderSvc", "MetaDataSvc"}; -MetaDataSvc.MetaDataContainer = "MetaDataHdr"; - -//make the MessageSvc display a bit wider -MessageSvc.Format = "% F%30W%S%7W%R%T %0W%M"; - -//disable chrono table in finalize -ChronoStatSvc.ChronoPrintOutTable = false; -ChronoStatSvc.PrintUserTime = false; - -//The following settings silence some services (although not entirely, sadly) -//need to keep this here because a reinit will override the setWarning settings of MessageSvc -HistogramPersistencySvc.OutputLevel = 5; -ClassIDSvc.OutputLevel = 5; -PoolSvc.OutputLevel = 5; -AthDictLoaderSvc.OutputLevel = 5; -ChronoStatSvc.OutputLevel = 5; -AthenaPoolAddressProviderSvc.OutputLevel = 5; -ProxyProviderSvc.OutputLevel = 5; -DBReplicaSvc.OutputLevel = 5; -EventPersistencySvc.OutputLevel = 5; -TagMetaDataStore.OutputLevel = 5; - -MessageSvc.setWarning = {"HistogramPersistencySvc","ClassIDSvc","PoolSvc","AthDictLoaderSvc","AthenaPoolAddressProviderSvc","ProxyProviderSvc","DBReplicaSvc","MetaDataSvc","MetaDataStore","InputMetaDataStore","AthenaPoolCnvSvc","TagMetaDataStore"}; diff --git a/PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx b/PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx index 903b2feec247..f5c63af037b7 100644 --- a/PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx +++ b/PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx @@ -15,29 +15,35 @@ #include "TFile.h" #include "TChain.h" +#include "AthAnalysisBaseComps/AthAnalysisHelper.h" +namespace Gaudi { + IAppMgrUI* Init() { + return AAH::initGaudi("POOLRootAccess/basic.opts"); + } +} namespace POOL { IAppMgrUI* Init( const char* options ) { - IAppMgrUI* theApp = Gaudi::createApplicationMgr(); - //check if already configured - if(theApp->FSMState() != Gaudi::StateMachine::OFFLINE) return theApp; - //set the joboptions - SmartIF<IProperty> propMgr(theApp); - propMgr->setProperty("JobOptionsPath",options); - //configure and return - theApp->configure(); - propMgr->setProperty("OutputLevel","3"); //INFO - theApp->initialize(); - return theApp; + return AAH::initGaudi(options); //see AthAnalysisHelper } TEvent::~TEvent() { - //need to destroy my storegate, selector, and loop - if(m_evtLoop.isSet()) m_evtLoop.release(); - if(m_evtSelect.isSet()) m_evtSelect.release(); - if(m_evtStore.isSet()) m_evtStore.release(); + //need to destroy my storegate, selector, and loop + //take refcounts down to 1 before handle release, to ensure services are destroyed + if(m_evtLoop.isSet()) { + //while(m_evtLoop->refCount()>1) m_evtLoop->release(); //CRASH + m_evtLoop.release(); + } + if(m_evtSelect.isSet()) { + //while(m_evtSelect->refCount()>1) m_evtSelect->release(); + m_evtSelect.release(); + } + if(m_evtStore.isSet()) { + //while(m_evtStore->refCount()>1) m_evtStore->release(); + m_evtStore.release(); + } } TEvent::TEvent(const std::string& name ) : TEvent( kPOOLAccess , name ) { } @@ -50,16 +56,20 @@ TEvent::TEvent(EReadMode mode, const std::string& name) : m_activeStoreSvc("ActiveStoreSvc","TEvent"+name), m_inputMetaStore("InputMetaDataStore","TEvent"+name) /*fixme, when reading multiple files at once?*/ { + Gaudi::Init(); + //FIXME: Should protect against attempt to mix POOL with nonPOOL if(mode==kPOOLAccess) { - InitPOOL(); + //add the AthenaPoolAddressProviderSvc to ProxyProviderSvc + ServiceHandle<IService> ppSvc("ProxyProviderSvc","TEvent"+name); + AAH::setProperty( ppSvc , "ProviderNames", "['MetaDataSvc', 'AthenaPoolAddressProviderSvc']" ); } else { - InitxAOD(); - //add the access mode property to catalog - m_joSvc->addPropertyToCatalogue( m_evtSelect.name() , IntegerProperty( "AccessMode" , int(mode) ) ); + //switch selector type to xAODEventSelector: + m_evtSelect.setTypeAndName("Athena::xAODEventSelector/"+name+"_EventSelector"); } //check if a SelectorType has been specified in the joSvc + //should retire this code at some point (hangover from basicxAOD.opts) auto properties = m_joSvc->getProperties("TEvent"); if(properties) { for(auto prop : *properties) { @@ -67,20 +77,22 @@ TEvent::TEvent(EReadMode mode, const std::string& name) : } } - m_joSvc->addPropertyToCatalogue( m_evtLoop.name() , StringProperty( "ClearStorePolicy" , "BeginEvent") ); - m_joSvc->addPropertyToCatalogue( m_evtLoop.name() , StringProperty( "EvtSel" , m_evtSelect.typeAndName() ) ); - m_joSvc->addPropertyToCatalogue( m_evtLoop.name() , StringProperty( "EvtStore" , m_evtStore.typeAndName() ) ); - m_joSvc->addPropertyToCatalogue( m_evtLoop.name() , StringProperty( "EventPrintoutInterval" , "999999999" ) ); + AAH::setProperty( m_evtLoop , "ClearStorePolicy", "BeginEvent" ); //for interactive use of storegate + AAH::setProperty( m_evtLoop , "EvtSel", m_evtSelect.typeAndName() ); //connect loop to selector + AAH::setProperty( m_evtLoop , "EvtStore", m_evtStore.typeAndName() );//connect loop to store + AAH::setProperty( m_evtLoop , "EventPrintoutInterval", 999999999 ); //disable printout (speeds up loop) if(m_evtSelect.type()=="Athena::xAODEventSelector") { - m_joSvc->addPropertyToCatalogue( m_evtSelect.name() , BooleanProperty( "ReadMetaDataWithPool" , true) ); + AAH::setProperty( m_evtSelect , "ReadMetaDataWithPool" , true); //uses hybrid xAOD reading by default + AAH::setProperty( m_evtSelect , "AccessMode" , int(mode) ); //sets the mode } //set outputlevels to WARNING - m_joSvc->addPropertyToCatalogue( m_evtLoop.name() , IntegerProperty( "OutputLevel" , 4 ) ); - m_joSvc->addPropertyToCatalogue( m_evtSelect.name() , IntegerProperty( "OutputLevel" , 4 ) ); - m_joSvc->addPropertyToCatalogue( m_evtStore.name() , IntegerProperty( "OutputLevel" , 4 ) ); - m_joSvc->addPropertyToCatalogue( m_activeStoreSvc.name() , IntegerProperty( "OutputLevel" , 4 ) ); + AAH::setProperty( m_evtLoop, "OutputLevel", 4 ); + AAH::setProperty( m_evtSelect, "OutputLevel", 4 ); + AAH::setProperty( m_evtStore, "OutputLevel", 4 ); + AAH::setProperty( m_activeStoreSvc, "OutputLevel", 4 ); + //suppress messages below WARNING too //do this here to stop some pre initialize INFO messages from showing ServiceHandle<IProperty> messageSvc("MessageSvc",""); @@ -119,8 +131,7 @@ StatusCode TEvent::readFrom( const char* file ) { std::cout << "Unable to change file after already reading" << std::endl; return StatusCode::FAILURE; } - std::string prop = "["; - bool hasFile(false); + std::vector<std::string> myFiles; //see if contains wildcard //separate by comma TString sFileIn(file); @@ -133,20 +144,14 @@ StatusCode TEvent::readFrom( const char* file ) { std::unique_ptr<TObjArray> theFiles(gSystem->GetFromPipe(("ls " + std::string(file)).c_str()).Tokenize("\n")); for(int i=0;i<theFiles->GetEntries();i++) { //std::cout << "Adding " << dynamic_cast<TObjString*>(theFiles->At(i))->String().Data() << std::endl; - if(i != 0) prop += " , "; - prop += "'"; prop += gSystem->ExpandPathName(dynamic_cast<TObjString*>(theFiles->At(i))->String().Data()); prop += "'"; + myFiles.push_back(gSystem->ExpandPathName(dynamic_cast<TObjString*>(theFiles->At(i))->String().Data())); } } else { - if(hasFile) prop += " , "; - prop += "'"; prop += gSystem->ExpandPathName(sFile.Data()); prop += "'"; + myFiles.push_back( gSystem->ExpandPathName(sFile.Data()) ); } - hasFile=true; } - - prop += "]"; - //std::cout << prop << std::endl; - return m_joSvc->addPropertyToCatalogue( m_evtSelect.name() , StringProperty( "InputCollections" , prop ) ); + return AAH::setProperty( m_evtSelect , "InputCollections" , myFiles ); } StatusCode TEvent::readFrom(TChain* files) { diff --git a/PhysicsAnalysis/POOLRootAccess/test/POOLRootAccess.xml b/PhysicsAnalysis/POOLRootAccess/test/POOLRootAccess.xml index a4fff4ffbe32..392dc2f954f5 100644 --- a/PhysicsAnalysis/POOLRootAccess/test/POOLRootAccess.xml +++ b/PhysicsAnalysis/POOLRootAccess/test/POOLRootAccess.xml @@ -13,9 +13,20 @@ <errorMessage>FAILURE (ERROR)</errorMessage> <returnValue>0</returnValue> </expectations> - <postscript>rootmonitor.py --html ut_basicxAODRead_test.results.root</postscript> + <postscript>rootmonitor.py --lower='{"speed1":50,"speed2":3200}' --html ut_basicxAODRead_test.results.root</postscript> </TEST> + <TEST name="POOLRootAccess_python_basicRead_test" type="script" suite="ASG"> + <options_atn>python ${ATN_PACKAGE}/test/ut_basicRead_test.py</options_atn> + <timelimit>10</timelimit> + <author> Will Buttinger </author> + <mailto> will@cern.ch </mailto> + <expectations> + <errorMessage>FAILURE (ERROR)</errorMessage> + <returnValue>0</returnValue> + </expectations> + </TEST> + </atn> </unifiedTestConfiguration> diff --git a/PhysicsAnalysis/POOLRootAccess/test/ut_basicRead_test.cxx b/PhysicsAnalysis/POOLRootAccess/test/ut_basicRead_test.cxx index 6d9665d3b137..ce0f591d72fe 100644 --- a/PhysicsAnalysis/POOLRootAccess/test/ut_basicRead_test.cxx +++ b/PhysicsAnalysis/POOLRootAccess/test/ut_basicRead_test.cxx @@ -12,9 +12,11 @@ #include "xAODRootAccess/Init.h" #include "xAODRootAccess/TEvent.h" +#include "AthAnalysisBaseComps/AthAnalysisHelper.h" + int main(int argc, char* argv[]) { - std::string whatToRead = "/r04/atlas/will/xAOD/data15_13TeV.periodD.physics_Main.PhysCont.DAOD_HIGG2D2.grp15_v01_p2425/*"; + std::string whatToRead = "$ASG_TEST_FILE_MC"; if(argc>1) whatToRead = argv[1]; std::cout << "reading: " << whatToRead << std::endl; @@ -47,6 +49,12 @@ int main(int argc, char* argv[]) { //evt.setEvtSelProperty( "OutputLevel" , 3 ); int maxEvt = evt.getEntries(); evt.getEntry(0); + + //just a quick example of retrieving metadata + float beam_energy(0); + AAH::retrieveMetadata("/TagInfo","beam_energy",beam_energy,evt.inputMetaStore()); + std::cout << "Beam energy = " << beam_energy << std::endl; + TStopwatch st; st.Start(); for(int i=0; i< maxEvt; i++) { @@ -62,4 +70,4 @@ int main(int argc, char* argv[]) { return 0; -} \ No newline at end of file +} diff --git a/PhysicsAnalysis/POOLRootAccess/test/ut_basicRead_test.py b/PhysicsAnalysis/POOLRootAccess/test/ut_basicRead_test.py index c2c5b53baba2..45bc85025c33 100644 --- a/PhysicsAnalysis/POOLRootAccess/test/ut_basicRead_test.py +++ b/PhysicsAnalysis/POOLRootAccess/test/ut_basicRead_test.py @@ -6,9 +6,20 @@ import ROOT evt = ROOT.POOL.TEvent() #evt = ROOT.POOL.TEvent(ROOT.POOL.TEvent.kClassAccess) #for faster xAOD reading -evt.readFrom("$ASG_TEST_FILE_MC") +import os +if os.environ.has_key("ASG_TEST_FILE_MC"): + fname = "$ASG_TEST_FILE_MC" +else: + fname = "/afs/cern.ch/atlas/maxidisk/d33/referencefiles/aod/AOD-devval-20160812/AOD-devval-20160812-full.pool.root" +evt.readFrom(fname) for i in range(0,10): #use evt.getEntries() to read all evt.getEntry(i); + + #normal retrieve method types a 'type' and 'key' ei = evt.retrieve("xAOD::EventInfo","EventInfo") print ei.eventNumber() + + #possible (but slower) to retrieve just by 'key' + els = evt.get_item("Electrons") + for el in els: ROOT.xAOD.dump(el) diff --git a/PhysicsAnalysis/POOLRootAccess/test/ut_basicxAODRead_test.cxx b/PhysicsAnalysis/POOLRootAccess/test/ut_basicxAODRead_test.cxx index fbeecff748f5..d4a75dd14ce7 100644 --- a/PhysicsAnalysis/POOLRootAccess/test/ut_basicxAODRead_test.cxx +++ b/PhysicsAnalysis/POOLRootAccess/test/ut_basicxAODRead_test.cxx @@ -24,7 +24,11 @@ int main(int argc, char* argv[]) { xAOD::TEvent::EAuxMode accessMode2 = xAOD::TEvent::kClassAccess; POOL::TEvent::EReadMode accessMode = POOL::TEvent::kClassAccess; - std::string whatToRead = "$ASG_TEST_FILE_MC"; + std::string whatToRead; + if (getenv("ASG_TEST_FILE_MC") != nullptr) + whatToRead = "$ASG_TEST_FILE_MC"; + else + whatToRead = "/afs/cern.ch/user/a/asgbase/patspace/xAODs/r7725/mc15_13TeV.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.merge.AOD.e3698_s2608_s2183_r7725_r7676/AOD.07915862._000100.pool.root.1"; if(argc>1) whatToRead = argv[1]; std::cout << "reading: " << whatToRead << std::endl; @@ -116,7 +120,7 @@ int main(int argc, char* argv[]) { } TFile f1("ut_basicxAODRead_test.results.root","RECREATE"); - TH1F* speed1 = new TH1F("speed1","xAODRootAcess Speed [Hz]",1,0,1);speed1->Sumw2(); + TH1F* speed1 = new TH1F("speed1","xAODRootAccess Speed [Hz]",1,0,1);speed1->Sumw2(); TH1F* speed2 = new TH1F("speed2","POOLRootAccess Speed [Hz]",1,0,1);speed2->Sumw2(); speed1->SetBinContent(1,double(maxEvt2)/st2.RealTime());speed1->SetBinError(1,0.0001); speed2->SetBinContent(1,double(maxEvt)/st.RealTime());speed2->SetBinError(1,0.0001); @@ -127,4 +131,4 @@ int main(int argc, char* argv[]) { return 0; -} \ No newline at end of file +} -- GitLab