From 88f224733d022926f66572cd7ffeea356ecf7546 Mon Sep 17 00:00:00 2001 From: Walter Lampl <walter.lampl@cern.ch> Date: Wed, 2 May 2018 14:01:36 +0000 Subject: [PATCH] New style auto config --- .../python/AllConfigFlags.py | 21 ++++++++++++------- .../python/AutoConfigFlags.py | 20 ++++++++++++++++++ Tools/FilePeeker/python/FilePeeker.py | 6 ++++-- Tools/FilePeeker/python/__init__.py | 1 + Tools/FilePeeker/src/BSFilePeeker.cxx | 12 ++++++++++- Tools/FilePeeker/src/FileMetaData.cxx | 3 +++ Tools/FilePeeker/src/FileMetaData.h | 2 ++ Tools/FilePeeker/src/PoolFilePeeker.cxx | 9 ++++++++ 8 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 Control/AthenaConfiguration/python/AutoConfigFlags.py create mode 100644 Tools/FilePeeker/python/__init__.py diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py index 84731d41042..cb014385d01 100644 --- a/Control/AthenaConfiguration/python/AllConfigFlags.py +++ b/Control/AthenaConfiguration/python/AllConfigFlags.py @@ -2,30 +2,32 @@ from AthenaConfiguration.AthConfigFlags import AthConfigFlags from AthenaCommon.SystemOfUnits import TeV +from AthenaConfiguration.AutoConfigFlags import GetFileMD + def _createCfgFlags(): acf=AthConfigFlags() #Global Flags: - acf.addFlag('global.isMC',True) + acf.addFlag('global.InputFiles',["_ATHENA_GENERIC_INPUTFILE_NAME_",]) acf.addFlag('global.isOnline',False) acf.addFlag('global.GeoLayout',"atlas") - acf.addFlag('global.ProjectName',"data17_13TeV") - acf.addFlag('global.InputFiles',["_ATHENA_GENERIC_INPUTFILE_NAME_",]) + acf.addFlag('global.ProjectName',lambda prevFlags : GetFileMD(prevFlags.get("global.InputFiles")).get("Project","data17_13TeV")) + acf.addFlag('global.isMC',True) acf.addFlag('global.BunchSpacing',25) # Bunch spacing in ns acf.addFlag("global.NumberOfCollisions",0) #"Number of collisions per beam crossing. Should be 2.3*(L/10**33)*(bunchSpacing/25 ns) acf.addFlag("global.BeamType",'collisions') # "Specify data taking type: 'collisions' (default), 'singlebeam','cosmics'") - acf.addFlag("global.BeamEnergy",7*TeV) + acf.addFlag("global.BeamEnergy",lambda prevFlags : GetFileMD(prevFlags.get("global.InputFiles")).get("BeamEnergy",7*TeV)) acf.addFlag("global.estimatedLuminosity",lambda prevFlags : 1E33*(prevFlags.get("global.NumberOfCollisions")/2.3)* \ (25./prevFlags.get("global.BunchSpacing"))) - + #Geo Model Flags: - acf.addFlag("GeoModel.AtlasVersion","ATLAS-R2-2016-01-00-01") + acf.addFlag("GeoModel.AtlasVersion",lambda prevFlags : GetFileMD(prevFlags.get("global.InputFiles")).get("Geometry","ATLAS-R2-2016-01-00-01")) #IOVDbSvc Flags: - acf.addFlag("IOVDb.GlobalTag","CONDBR2-BLKPA-2017-05") + acf.addFlag("IOVDb.GlobalTag",lambda prevFlags : GetFileMD(prevFlags.get("global.InputFiles")).get("ConditionsTag","CONDBR2-BLKPA-2017-05")) from IOVDbSvc.IOVDbAutoCfgFlags import getDatabaseInstanceDefault acf.addFlag("IOVDb.DatabaseInstance",getDatabaseInstanceDefault) @@ -61,6 +63,11 @@ ConfigFlags=_createCfgFlags() del _createCfgFlags if __name__=="__main__": + import sys + if len(sys.argv)>1: + ConfigFlags.set("global.InputFiles",sys.argv[1:]) + else: + ConfigFlags.set("global.InputFiles",[ "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/CommonInputs/data16_13TeV.00311321.physics_Main.recon.AOD.r9264/AOD.11038520._000001.pool.root.1",]) ConfigFlags.initAll() ConfigFlags.dump() diff --git a/Control/AthenaConfiguration/python/AutoConfigFlags.py b/Control/AthenaConfiguration/python/AutoConfigFlags.py new file mode 100644 index 00000000000..7452e464071 --- /dev/null +++ b/Control/AthenaConfiguration/python/AutoConfigFlags.py @@ -0,0 +1,20 @@ +from AthenaConfiguration.CfgLogMsg import cfgLogMsg +from FilePeeker.FilePeeker import PeekFiles + + +#Module level cache of file-metadata: +_fileMetaData=dict() + +def GetFileMD(filenames): + filename=filenames[0] + if not filename in _fileMetaData: + msg=cfgLogMsg + if len(filenames)>1: + msg.info("Multiple input files. Use the first one for auto-configuration") + msg.info("Obtaining metadata of auto-configuration by peeking into %s" % filename) + thisFileMD=PeekFiles([filename,]) + _fileMetaData.update(thisFileMD) + + return _fileMetaData[filename] + + diff --git a/Tools/FilePeeker/python/FilePeeker.py b/Tools/FilePeeker/python/FilePeeker.py index d90c924050d..3d55a48701f 100644 --- a/Tools/FilePeeker/python/FilePeeker.py +++ b/Tools/FilePeeker/python/FilePeeker.py @@ -4,7 +4,7 @@ import os,sys from subprocess import check_output -def PeekFile(inputfiles): +def PeekFiles(inputfiles): bsfiles=[] poolfiles=[] @@ -46,6 +46,8 @@ def PeekFile(inputfiles): elif (k=="SGkeys"): result[k]=set(sgk for sgk in v.split()) + elif (k=="isMC"): + result[k]=bool(int(v)) else: result[k]=v @@ -54,6 +56,6 @@ def PeekFile(inputfiles): if __name__=="__main__": - print PeekFile(sys.argv[1:]) + print PeekFiles(sys.argv[1:]) diff --git a/Tools/FilePeeker/python/__init__.py b/Tools/FilePeeker/python/__init__.py new file mode 100644 index 00000000000..d5969d17863 --- /dev/null +++ b/Tools/FilePeeker/python/__init__.py @@ -0,0 +1 @@ +__all__=["FilePeeker",] diff --git a/Tools/FilePeeker/src/BSFilePeeker.cxx b/Tools/FilePeeker/src/BSFilePeeker.cxx index 8e0f8d550d2..969dde77ed4 100644 --- a/Tools/FilePeeker/src/BSFilePeeker.cxx +++ b/Tools/FilePeeker/src/BSFilePeeker.cxx @@ -32,7 +32,7 @@ bool BSFilePeeker::extractValue(const std::string& source, const std::string& ke return false; } else { - value=source.substr(sep); + value=source.substr(sep+1); return true; } } @@ -75,15 +75,25 @@ BSFilePeeker::BSFilePeeker(const std::string& fName) { m_fmd.m_beamType="collisions"; break; default: + std::cerr << "WARNING: Unexpected beam type integer in BS file. Got " << bt << std::endl; m_fmd.m_beamType="unknown"; } + + m_fmd.m_isMC=false; //Generaly, BS-files are real data const std::vector<std::string> fmds=pDR->freeMetaDataStrings(); + std::string eventTypeMD; for (const std::string& fm : fmds) { extractValue(fm,"GeoAtlas",m_fmd.m_geoTag); extractValue(fm,"IOVDbGlobalTag",m_fmd.m_condTag); + extractValue(fm,"Event type",eventTypeMD); + } + + if (eventTypeMD.find("is sim")!=std::string::npos) { + m_fmd.m_isMC=true; //This is a simulated bytestream file } + m_fmd.m_valid=true; delete pDR; } diff --git a/Tools/FilePeeker/src/FileMetaData.cxx b/Tools/FilePeeker/src/FileMetaData.cxx index 14b826d1292..109b471e3f1 100644 --- a/Tools/FilePeeker/src/FileMetaData.cxx +++ b/Tools/FilePeeker/src/FileMetaData.cxx @@ -41,6 +41,8 @@ void FileMetaData::dump(std::ostream& out) const { out << "Number of events: " << m_nEvents << std::endl; + out << "is MC:" << (m_isMC ? "True" : "False") << std::endl; + return; } @@ -71,6 +73,7 @@ void FileMetaData::keyValueDump(std::ostream& out) const { out << "NEvents: " << m_nEvents << std::endl; + out << "isMC:" << (m_isMC ? "1" : "0") << std::endl; out << "SGKeys: "; for (const std::string& k : m_sgKeys) {out << k << " ";} diff --git a/Tools/FilePeeker/src/FileMetaData.h b/Tools/FilePeeker/src/FileMetaData.h index 670a8b0d544..710bbd1e10b 100644 --- a/Tools/FilePeeker/src/FileMetaData.h +++ b/Tools/FilePeeker/src/FileMetaData.h @@ -32,6 +32,8 @@ class FileMetaData { unsigned m_beamEnergy=0.0; std::string m_beamType; + bool m_isMC=true; + bool m_valid=false; std::vector<std::string> m_sgKeys; diff --git a/Tools/FilePeeker/src/PoolFilePeeker.cxx b/Tools/FilePeeker/src/PoolFilePeeker.cxx index ce1825cfd4b..b79967ab029 100644 --- a/Tools/FilePeeker/src/PoolFilePeeker.cxx +++ b/Tools/FilePeeker/src/PoolFilePeeker.cxx @@ -167,6 +167,7 @@ PoolFilePeeker::PoolFilePeeker(const char* filename, const bool vbs) { std::set<unsigned> bmc_runNumbers; if (bmdc.first) { if (vbs) std::cout << " Got ByteStreamMetadataContainer" << std::endl; + m_fmd.m_isMC=false; //The presence of a ByteStreamMetaDataContainer indicates real data for (const auto& bmd : *bmdc.second) { bmc_runNumbers.insert(bmd.m_runNumber); if (m_fmd.m_stream.size()==0) { @@ -185,6 +186,14 @@ PoolFilePeeker::PoolFilePeeker(const char* filename, const bool vbs) { m_fmd.m_project << " and " << bmd.m_project << std::endl; m_fmd.m_valid=false; } + + const std::vector<std::string>& freeMDs=bmd.m_freeMetaDataStrings; + for (const std::string& freeMD : freeMDs) { + if (freeMD.compare(0,11,"Event type:")==0 && freeMD.find("is sim")!=std::string::npos) { + m_fmd.m_isMC=true; //This is made of a simulated bytestream file + break; + } + } } delete bmdc.second; bmdc.second=nullptr; -- GitLab