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