diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py index 84731d41042861ca46c91710c29ac40b07b3efc1..cb014385d016f385fb4b7ed11112de2fe5293b04 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 0000000000000000000000000000000000000000..7452e464071b140c4499e13455b4a596c97bc71c --- /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 d90c924050d3e9bd2ece475083e69cf599ea5842..3d55a48701f33752eb1f06655f465640d5f860ae 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 0000000000000000000000000000000000000000..d5969d178636ac75d709dba8540260858923a19a --- /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 8e0f8d550d2b796b8b35e0db4b6ee32e0f157488..969dde77ed4ec34d5a72eb43ee7277737bc3e10a 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 14b826d12921aa2a73a1555860f893ab86354dc5..109b471e3f124b889c958e4adca3a0dd22eef029 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 670a8b0d5442f81487cf1a15cb19fd6cd4cdb0fc..710bbd1e10b9ecbcd9905656f68858fb0d898ad2 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 ce1825cfd4b8fb8b925eccf079bc04f138c061d2..b79967ab029975b95bd9683e5c5020705fac74f9 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;