From c2da79d2dc459a8bb0fe024b620f1f6d8bc1b6d1 Mon Sep 17 00:00:00 2001 From: Tomasz Bold <tomasz.bold@gmail.com> Date: Mon, 4 Jun 2018 21:46:52 +0200 Subject: [PATCH] First version of the MET alg and tool --- .../TrigEFMissingET/CMakeLists.txt | 6 + .../TrigEFMissingET/share/testMET.py | 57 +++++++++ .../TrigEFMissingET/src/EFMissingETAlgMT.cxx | 95 ++++++++++++++ .../TrigEFMissingET/src/EFMissingETAlgMT.h | 43 +++++++ .../src/EFMissingETFromCellsMT.cxx | 117 ++++++++++++++++++ .../src/EFMissingETFromCellsMT.h | 59 +++++++++ .../TrigEFMissingET/src/IMissingETTool.h | 35 ++++++ .../components/TrigEFMissingET_entries.cxx | 4 + .../TrigEFMissingET/test/test_met_fexes.sh | 5 + 9 files changed, 421 insertions(+) create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/share/testMET.py create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.cxx create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.h create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.cxx create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.h create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/IMissingETTool.h create mode 100755 Trigger/TrigAlgorithms/TrigEFMissingET/test/test_met_fexes.sh diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/CMakeLists.txt b/Trigger/TrigAlgorithms/TrigEFMissingET/CMakeLists.txt index 429d944448d..cb8f0088e3b 100644 --- a/Trigger/TrigAlgorithms/TrigEFMissingET/CMakeLists.txt +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/CMakeLists.txt @@ -65,3 +65,9 @@ atlas_add_component( TrigEFMissingET # Install files from the package: atlas_install_python_modules( python/*.py ) +atlas_install_joboptions( share/*.py ) + +atlas_add_test( METFexes + SCRIPT test/test_met_fexes.sh + PROPERTIES TIMEOUT 500 + ) diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/share/testMET.py b/Trigger/TrigAlgorithms/TrigEFMissingET/share/testMET.py new file mode 100644 index 00000000000..468ea41cd63 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/share/testMET.py @@ -0,0 +1,57 @@ +# +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# + +include("TrigUpgradeTest/testHLT_MT.py") + +from AthenaCommon.AlgSequence import AlgSequence +topSequence = AlgSequence() + +isData = False +if globalflags.InputFormat.is_bytestream(): + isData = True + + + +import math +from TrigT2CaloCommon.TrigT2CaloCommonConf import TrigCaloDataAccessSvc#, TestCaloDataAccess +from AthenaMonitoring.GenericMonitoringTool import GenericMonitoringTool, defineHistogram + +mon = GenericMonitoringTool("CaloDataAccessSvcMon") +mon.Histograms += [defineHistogram( "TIME_locking_LAr_RoI", title="Time spent in unlocking the LAr collection", xbins=100, xmin=0, xmax=100 ), + defineHistogram( "roiROBs_LAr", title="Number of ROBs unpacked in RoI requests", xbins=20, xmin=0, xmax=20 ), + defineHistogram( "TIME_locking_LAr_FullDet", title="Time spent in unlocking the LAr collection", xbins=100, xmin=0, xmax=100 ), + defineHistogram( "roiEta_LAr,roiPhi_LAr", type="TH2F", title="Geometric usage", xbins=50, xmin=-5, xmax=5, ybins=64, ymin=-math.pi, ymax=math.pi )] + +svcMgr += TrigCaloDataAccessSvc() +svcMgr.TrigCaloDataAccessSvc.MonTool = mon +svcMgr.TrigCaloDataAccessSvc.OutputLevel=INFO + +from TrigCaloRec.TrigCaloRecConf import HLTCaloCellMaker +cellMakerAlgo = HLTCaloCellMaker("CellMakerMT", roiMode=True) +cellMakerAlgo.RoIs="METRoIs" +cellMakerAlgo.OutputLevel=VERBOSE +cellMakerAlgo.CellsName="cells" +topSequence += cellMakerAlgo + +from TrigEFMissingET.TrigEFMissingETConf import EFMissingETAlgMT, EFMissingETFromCellsMT + +cellTool = EFMissingETFromCellsMT( name="METFromCellsTool" ) +cellTool.CellsCollection = "cells" + +metAlg = EFMissingETAlgMT( name="EFMET" ) +metAlg.METTools=[ cellTool ] +metAlg += cellTool +topSequence += metAlg + +# from TrigCaloRec.TrigCaloRecConfig import TrigCaloClusterMakerMT_topo + +# # clusterMakerAlgo = TrigCaloClusterMakerMT_topo(name="ClustermakerMT_topo",cells="cells",doMoments=True,doLC=True) +# # Get conditions error using TrigLocalCalib tool, so set doLC=False +# clusterMakerAlgo = TrigCaloClusterMakerMT_topo(name="ClustermakerMT_topo",cells="cells",doMoments=True,doLC=False) +# clusterMakerAlgo.OutputLevel=VERBOSE +# topSequence += clusterMakerAlgo + +# print ToolSvc + + diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.cxx b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.cxx new file mode 100644 index 00000000000..c112085c3e3 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.cxx @@ -0,0 +1,95 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ +#include <cmath> +#include "xAODTrigMissingET/TrigMissingETAuxContainer.h" +#include "TrigEFMissingET/EFMissingETHelper.h" +#include "AthenaMonitoring/MonitoredScope.h" +#include "EFMissingETAlgMT.h" + + + +EFMissingETAlgMT::EFMissingETAlgMT( const std::string& name, + ISvcLocator* pSvcLocator ) + : AthReentrantAlgorithm( name, pSvcLocator ) {} + +EFMissingETAlgMT::~EFMissingETAlgMT() {} + +StatusCode EFMissingETAlgMT::initialize() { + CHECK( m_metTools.retrieve() ); + CHECK( m_metContainerKey.initialize() ); + CHECK( m_monTool.retrieve() ); + return StatusCode::SUCCESS; +} + + +//!< Converts from MeV to GeV and them log10, preserving the sign, the minimum dictated by monitoring histograms +double toLogGeV( double x, double fallback = 0, double epsilon = 1.189 ) { + const double absXGeV = std::fabs( x * 1.e-3 ); + if ( absXGeV < epsilon ) + return fallback; + return std::copysign( std::log10( absXGeV ), x ); +} + +//!< converts to from MeV to GeV if above threshold, else falback value +double toLinGeV( double x, double fallback = 0, double epsilon = 1e-6 ) { + const double xGeV = x * 1.e-3; + if ( xGeV < epsilon ) + return fallback; + return xGeV; +} + + +StatusCode EFMissingETAlgMT::execute_r( const EventContext& context ) const { + ATH_MSG_DEBUG ( "Executing " << name() << "..." ); + using namespace Monitored; + auto totalTimer = MonitoredTimer::declare( "Total" ); + auto loopTimer = MonitoredTimer::declare( "Loop" ); + + auto metContainer = std::make_unique<xAOD::TrigMissingETContainer>(); + auto metAuxContainer = std::make_unique<xAOD::TrigMissingETAuxContainer>(); + metContainer->setStore( metAuxContainer.get() ); + + auto met = new xAOD::TrigMissingET(); + metContainer->push_back( met ); + + TrigEFMissingEtHelper metHelper(42); + + loopTimer.start(); + for ( auto& t: m_metTools ) { + ATH_MSG_DEBUG( "Invoking tool " << t->name() << " to update the MET obejct" ); + t->update( met, &metHelper ); + } + loopTimer.stop(); + + + auto EF_MEx_log = MonitoredScalar::declare( "EF_MEx_log", toLogGeV( met->ex() ) ); + auto EF_MEy_log = MonitoredScalar::declare( "EF_MEy_log", toLogGeV( met->ey() ) ); + auto EF_MEz_log = MonitoredScalar::declare( "EF_MEz_log", toLogGeV( met->ez() ) ); + auto EF_MET_log = MonitoredScalar::declare( "EF_MET_log", toLogGeV( std::hypot( met->ex(), met->ey() ) ) ); + auto EF_ME_log = MonitoredScalar::declare( "EF_ME_log", toLogGeV( std::hypot( std::hypot(met->ex(), met->ey()), met->ez() ) ) ); + auto EF_SumEt_log = MonitoredScalar::declare( "EF_SumEt_log", toLogGeV( met->sumEt() ) ); + auto EF_SumE_log = MonitoredScalar::declare( "EF_SumE_log", toLogGeV( met->sumE(), -9e9 ) ); + + auto EF_MEx_lin = MonitoredScalar::declare( "EF_MEx_lin", toLinGeV( met->ex() ) ); + auto EF_MEy_lin = MonitoredScalar::declare( "EF_MEy_lin", toLinGeV( met->ey() ) ); + auto EF_MEz_lin = MonitoredScalar::declare( "EF_MEz_lin", toLinGeV( met->ez() ) ); + auto EF_MET_lin = MonitoredScalar::declare( "EF_MET_lin", toLinGeV( std::hypot( met->ex(), met->ey() ) ) ); + auto EF_ME_lin = MonitoredScalar::declare( "EF_ME_lin", toLinGeV( std::hypot( std::hypot(met->ex(), met->ey()), met->ez() ) ) ); + auto EF_SumEt_lin = MonitoredScalar::declare( "EF_SumEt_lin", toLinGeV( met->sumEt() ) ); + auto EF_SumE_lin = MonitoredScalar::declare( "EF_SumE_lin", toLinGeV( met->sumE(), -9e9 ) ); + auto EF_XS = MonitoredScalar::declare( "EF_XS", toLinGeV( std::hypot( met->ex(), met->ey() ) ) / toLinGeV( met->sumEt() ) ); + auto EF_MET_phi = MonitoredScalar::declare( "EF_MET_phi", std::atan2( met->ey(), met->ex() ) ); + + auto monitorIt = MonitoredScope::declare( m_monTool, + totalTimer, loopTimer, + EF_MEx_log, EF_MEy_log, EF_MEz_log, EF_MET_log, EF_ME_log, EF_ME_log, EF_SumE_log, + EF_MEx_lin, EF_MEy_lin, EF_MEz_lin, EF_MET_lin, EF_ME_lin, EF_SumEt_lin, EF_SumE_lin, + EF_XS, EF_MET_phi); + + auto handle = SG::makeHandle( m_metContainerKey, context ); + CHECK( handle.record( std::move( metContainer ), std::move ( metAuxContainer ) ) ); + return StatusCode::SUCCESS; +} + + diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.h b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.h new file mode 100644 index 00000000000..d281a585ee4 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGEFMISSINGET_EFMISSINGETALGMT_H +#define TRIGEFMISSINGET_EFMISSINGETALGMT_H 1 + +#include <string> +#include "GaudiKernel/Property.h" +#include "AthenaBaseComps/AthReentrantAlgorithm.h" +#include "AthenaMonitoring/GenericMonitoringTool.h" +#include "xAODTrigMissingET/TrigMissingETContainer.h" + +#include "./IMissingETTool.h" + + +/** + * @class HLT MET algorithm + * @brief It is responsible for creation of the MET object and execution of number of MET tools filling it + **/ + +class EFMissingETAlgMT : public ::AthReentrantAlgorithm +{ + public: + + EFMissingETAlgMT( const std::string& name, ISvcLocator* pSvcLocator ); + + virtual ~EFMissingETAlgMT(); + + + //EFMissingETMT &operator=(const EFMissingETMT &alg); + + virtual StatusCode initialize() override; + virtual StatusCode execute_r(const EventContext& context) const override; + + private: + + SG::WriteHandleKey<xAOD::TrigMissingETContainer> m_metContainerKey { this, "METContainerKey", "HLT_MET", "Name of the output collection" }; + ToolHandleArray<IMissingETTool> m_metTools { this, "METTools", {}, "Tools to fille MET object" }; + ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" }; +}; + + +#endif //> !TRIGEFMISSINGET_EFMISSINGETMT_H diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.cxx b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.cxx new file mode 100644 index 00000000000..60c16a34fab --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.cxx @@ -0,0 +1,117 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ +// FrameWork includes +#include "AthenaMonitoring/MonitoredScope.h" +#include "GaudiKernel/IToolSvc.h" + +// TrigEFMissingET includes +#include "EFMissingETFromCellsMT.h" + + +EFMissingETFromCellsMT::EFMissingETFromCellsMT( const std::string& type, + const std::string& name, + const IInterface* parent ) + : base_class( type, name, parent ) { + //declareProperty( "Property", m_nProperty ); +} + +StatusCode EFMissingETFromCellsMT::initialize() +{ + ATH_MSG_INFO ("Initializing " << name() << "..."); + CHECK( m_cellsKey.initialize() ); + + m_maxThreshold = m_rmsOneSided; + if ( m_rmsOneSided < fabsf( m_rmsTwoSided ) ) m_maxThreshold = fabsf( m_rmsTwoSided ); + + return StatusCode::SUCCESS; +} + +StatusCode EFMissingETFromCellsMT::update( xAOD::TrigMissingET */*met*/, + TrigEFMissingEtHelper *metHelper ) const { + using namespace Monitored; + auto totalTimer = MonitoredTimer::declare( "Total" ); + const EventContext context{ Gaudi::Hive::currentContext() }; + auto caloCellsHandle = SG::makeHandle( m_cellsKey ); + + auto loopTimer = MonitoredTimer::declare( "Loop" ); + auto countUsedCells = MonitoredScalar::declare<unsigned>( "UsedCells", 0 ); + + // now it is time to iterate over the cells + for ( const CaloCell* cell: *caloCellsHandle ) { + const CaloDetDescrElement* cDDE = cell->caloDDE(); + if (cDDE == 0) { + ATH_MSG_WARNING( "cannot get CaloDetDescrElement from cell " << cell->ID() ); + continue; + } + + TrigEFMissingEtComponent *metComp = metHelper->GetComponent( cDDE->getSampling() ); + if (metComp == 0) { + ATH_MSG_FATAL( "Cannot find calo sampling!" ); + return StatusCode::FAILURE; + } + + //TB not sure about skipping logic, looks incorrect in the original code + // + + if ( m_noiseTool ) { // == noise suppression required + const bool noiseCutPassed = true; // noiseCut( cell ); + if ( not noiseCutPassed ) + continue; + } + + countUsedCells = countUsedCells + 1; + + double E = cell->e(); + double et = E * cDDE->sinTh(); + double ez = E * cDDE->cosTh(); + double sinPhi = cDDE->sinPhi(); + double cosPhi = cDDE->cosPhi(); + metComp->m_ex -= et*cosPhi; + metComp->m_ey -= et*sinPhi; + metComp->m_ez -= ez; + metComp->m_sumEt += et; + metComp->m_sumE += E; + metComp->m_usedChannels += 1; + + if( cell->quality() > m_MaxLArQ ) metComp->m_sumBadEt += et; + // if (BSerrors) metComp->m_status |= m_maskErrBSconv; // | m_maskCompErrors; + metComp->m_sumOfSigns += static_cast<short int>(floor(copysign(1.0,E) + 0.5)); + + // 5. auxiliary quantities for robustness checks + if ( not m_makeRobustness) continue; + if ( not m_doCellNoiseSupp || (m_doCellNoiseSupp && + m_MinCellSNratio[cDDE->getSampling()] > m_maxThreshold)) { + if (fabs(E) < m_MinCellSNratio[cDDE->getSampling()] * + m_noiseTool->getNoise( cell, ICalorimeterNoiseTool::TOTALNOISE)) + continue; + } + + float time = cell->time() * 1e-3; // ns + float quality = cell->quality(); + if (time < metComp->m_minTime) metComp->m_minTime = time; + if (time > metComp->m_maxTime) metComp->m_maxTime = time; + if (quality > metComp->m_maxQlty) metComp->m_maxQlty = quality; + if (E < metComp->m_minE) metComp->m_minE = E; + if (E > metComp->m_maxE) metComp->m_maxE = E; + + } + + return StatusCode::SUCCESS; +} + + + + + + + + + + + + + + + + diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.h b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.h new file mode 100644 index 00000000000..eab14e2f0ac --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGEFMISSINGET_EFMISSINGETFROMCELLSMT_H +#define TRIGEFMISSINGET_EFMISSINGETFROMCELLSMT_H 1 + +// FrameWork includes +#include "AthenaBaseComps/AthAlgTool.h" +#include "GaudiKernel/ServiceHandle.h" + +#include "CaloEvent/CaloCellContainer.h" +#include "CaloInterface/ICalorimeterNoiseTool.h" + +// TrigEFMissingET includes +#include "./IMissingETTool.h" + + + +/** + * @class Tool for calculations of MET from bare cells + * @brief + **/ + +class EFMissingETFromCellsMT: public extends<AthAlgTool, IMissingETTool> { + + public: + + EFMissingETFromCellsMT( const std::string& type, + const std::string& name, + const IInterface* parent ); + + virtual ~EFMissingETFromCellsMT(){} + + virtual StatusCode initialize(); + + virtual StatusCode update( xAOD::TrigMissingET *met, + TrigEFMissingEtHelper *metHelper ) const override; + + private: + EFMissingETFromCellsMT(); + + Gaudi::Property<bool>m_doCellNoiseSupp { this, "DoCellNoiseSuppression", false, "switch on/off cell noise suppression" }; + Gaudi::Property<bool>m_useFullColl { this, "useFullCollection", true, "switch on/off fast access via LoadFullCollection" }; + Gaudi::Property<bool>m_makeRobustness { this, "makeRobustness", true , "switch on/off robustness checks" }; + Gaudi::Property<float>m_rmsOneSided { this, "CaloNoiseOneSidedCut", 3.0, "1-sided noise suppression (unit = rms }" }; + Gaudi::Property<float>m_rmsTwoSided { this, "CaloNoiseTwoSidedCut", 2.0, "2-sided noise suppression (unit = rms }" }; + float m_maxThreshold; //<! maximum between the previous ones + Gaudi::Property<int>m_MaxLArQ { this, "MaxLArQ", 4000, "Max Q LAr Cell value" }; + Gaudi::Property<int>m_MaxTileQ { this, "MaxTileQ", 254, "Max Q Tile Cell value" }; + Gaudi::Property<std::vector<float> >m_MinCellSNratio { this, "MinCellSNratio", std::vector<float>(24, 3.0), "(vector) min cell |energy|/rms for robustness checks" }; + + SG::ReadHandleKey<CaloCellContainer> m_cellsKey { this, "CellsCollection", "CaloCells", "Collection containg all cels" }; + + ToolHandle<ICalorimeterNoiseTool> m_noiseTool { this, "CaloNoiseTool", "", "Tool Handle for noise tool" }; + +}; + + +#endif //> !TRIGEFMISSINGET_EFMISSINGETFROMCELLSMT_H diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/IMissingETTool.h b/Trigger/TrigAlgorithms/TrigEFMissingET/src/IMissingETTool.h new file mode 100644 index 00000000000..d8bb4431adc --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/IMissingETTool.h @@ -0,0 +1,35 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGEFMISSINGET_IMISSINGETTOOL_H +#define TRIGEFMISSINGET_IMISSINGETTOOL_H 1 + +#include "GaudiKernel/IAlgTool.h" + +#include "TrigEFMissingET/EFMissingETHelper.h" +#include "xAODTrigMissingET/TrigMissingET.h" + +/** + * @class Adds info the the missing ET object + * @brief Specific implementations may use various input data types + **/ + +class IMissingETTool : virtual public ::IAlgTool { + +public: + DeclareInterfaceID( IMissingETTool, 1, 0 ); + virtual ~IMissingETTool(){} + + /** + * a method to update the met object (and met helper object) + * The API deliberately does not include EventContext as it is only needed + * in one implementation when input is not taken from the regular store. + **/ + virtual StatusCode update( xAOD::TrigMissingET *met, + TrigEFMissingEtHelper *metHelper ) const = 0; + +}; + + + +#endif //> !TRIGEFMISSINGET_IMISSINGETTOOL_H diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/components/TrigEFMissingET_entries.cxx b/Trigger/TrigAlgorithms/TrigEFMissingET/src/components/TrigEFMissingET_entries.cxx index 0363d82acd3..40f5811c903 100644 --- a/Trigger/TrigAlgorithms/TrigEFMissingET/src/components/TrigEFMissingET_entries.cxx +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/components/TrigEFMissingET_entries.cxx @@ -10,6 +10,8 @@ //#include "TrigEFMissingET/EFMissingETFromLvl1Ppr.h" #include "TrigEFMissingET/EFMissingETFlags.h" #include "TrigEFMissingET/EFMissingETFromHelper.h" +#include "../EFMissingETAlgMT.h" +#include "../EFMissingETFromCellsMT.h" DECLARE_COMPONENT( EFMissingET ) DECLARE_COMPONENT( EFMissingETBaseTool ) @@ -23,4 +25,6 @@ DECLARE_COMPONENT( EFMissingETFromTrackAndJets ) //DECLARE_COMPONENT( EFMissingETFromLvl1Ppr ) DECLARE_COMPONENT( EFMissingETFlags ) DECLARE_COMPONENT( EFMissingETFromHelper ) +DECLARE_COMPONENT( EFMissingETAlgMT ) +DECLARE_COMPONENT( EFMissingETFromCellsMT ) diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/test/test_met_fexes.sh b/Trigger/TrigAlgorithms/TrigEFMissingET/test/test_met_fexes.sh new file mode 100755 index 00000000000..56bb5d60845 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigEFMissingET/test/test_met_fexes.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# art-type: build +# art-ci: master + +athena --threads=1 --evtMax=10 --filesInput="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1" TrigEFMissingET/testMET.py \ No newline at end of file -- GitLab