Source code for bsmart.tools.SModelS2
"""
Tool to run SModelS version 2 (kept as legacy)
"""
__meta__ = {
"name": "SModelS2",
"requires": ["smodels", "unum", "pyslha"],
"settings": {
"Path": "Path to SModelS",
"Cache": "Path to cache",
"Parameter file": "Path to parameters",
"QNUMBERS file": "Path to QNUMBERS"
}
}
import os
import sys
import shutil
#import subprocess
from bsmart import debug
import importlib
from bsmart.HEPRun import HepTool, DataPoint
try:
from imp import reload
except:
try:
from importlib import reload
except Exception as e:
raise NameError("Failed to import SModelS reload from importlib: "+str(e))
from bsmart import zslha
# def noshell_command_log_withpid(command, wdir, log):
# log.debug('Terminal command: %s' % command)
# command_line = subprocess.Popen(command, shell=False, cwd=wdir,
# stdout=subprocess.PIPE,
# stderr=subprocess.PIPE)
# pid=command_line.pid
# out, err = command_line.communicate()
# # log.debug(out)
# if err != b'':
# log.error(err.decode("utf-8"))
# return str(pid)
[docs]
class NewTool(HepTool):
""" overload the init to initialise the DM limit calculator, but name and settings are already given in HepTool """
def __init__(self, name, settings,global_settings=None):
HepTool.__init__(self, name, settings,global_settings)
if 'Path' in self.settings:
#self.SModelS_path=self.settings['Path']
#sys.path.insert(0,self.SModelS_path)
sys.path.insert(0,self.settings['Path'])
if 'Cache' in self.settings:
os.environ['SMODELS_CACHEDIR']=self.settings['Cache']
#import logging
#logging.basicConfig(level=logging.CRITICAL)
try:
#from smodels.installation import installDirectory, version
#from smodels.tools import modelTester
self.modelTester = importlib.import_module('smodels.tools.modelTester')
#from smodels.tools import crashReport
#self.crashReport=importlib.import_module('smodels.tools.crashReport')
#from smodels.tools import smodelsLogging
self.smodelsLogging=importlib.import_module('smodels.tools.smodelsLogging')
#from smodels.tools import runtime
self.runtime=importlib.import_module('smodels.tools.runtime')
#from smodels import particlesLoader
self.runtime.modelFile=self.settings['QNUMBERS file']
self.particlesLoader= importlib.import_module('smodels.particlesLoader')
except Exception as e:
raise NameError('Cannot import necessary SModelS packages, error '+str(e))
self.smodelsLogging.setLogLevel('error')
""" Read and check parameter file, exit parameterFile does not exist """
#self.parser = modelTester.getParameters(self.settings['Parameter file'])
self.parameterFile=self.settings['Parameter file']
self.parser = self.modelTester.getParameters(self.parameterFile)
""" Determine particles module from ini file, if necessary """
#if parser.has_option("particles","model"):
# runtime.modelFile = parser.get( "particles", "model" )
# reload(particlesLoader)
self.runtime.modelFile=self.settings['QNUMBERS file']
reload(self.particlesLoader)
db=None
""" Check database location and load database, exit if not found """
self.database, self.databaseVersion = self.modelTester.loadDatabase(self.parser, db)
""" Get list of input files to be tested """
#fileList, inDir = modelTester.getAllInputFiles(inFile)
""" Create output directory if missing """
#if not os.path.isdir(outputDir): os.mkdir(outputDir)
""" Load analysis database, print list """
self.listOfExpRes = self.modelTester.loadDatabaseResults(self.parser, self.database)
self.timeout=120 ## allow one minute to run ...
self.development=False
#self.smodelsLogging.setLogLevel('error')
## Add path to smodels here
## import database
[docs]
def run(self, spc_file, temp_dir, log,data_point):
""" Test all input points """
#modelTester.testPoints(fileList, inDir, outputDir, parser, databaseVersion,
# listOfExpRes, timeout, development, parameterFile )
#fileList, inDir = modelTester.getAllInputFiles(spc_file)
#modelTester.testPoints(fileList, inDir, temp_dir, self.parser, self.databaseVersion,
# self.listOfExpRes, self.timeout, self.development, sefl.parameterFile )
#runSingleFile(inputFile, outputDir, parser, databaseVersion, listOfExpRes,
# timeout, development, parameterFile):
try:
#self.smodelsLogging.setLogLevel('error')
smodels_results=self.modelTester.runSingleFile(spc_file, temp_dir, self.parser, self.databaseVersion, self.listOfExpRes,
self.timeout, self.development, self.parameterFile)
except Exception as e:
raise NameError('SModelS exception '+str(e))
#import logging
#logging.basicConfig(level=logging.CRITICAL)
rmax=0
best_analysis='None'
#for rrr in smodels_results[spc_file]['python']:
# print('Smodels result: '+str(rrr))
# #print(smodels_results[rrr])
if spc_file in smodels_results and 'python' in smodels_results[spc_file] and 'ExptRes' in smodels_results[spc_file]['python']:
for rrr in smodels_results[spc_file]['python']['ExptRes']:
#print(rrr['AnalysisID']+str(': ')+str(rrr['r']))
if 'r' in rrr:
if rrr['r'] > rmax:
rmax=rrr['r']
best_analysis=rrr['AnalysisID']
""" now append to the spectrum file """
with open(spc_file,"a") as OF:
OF.write('BLOCK SMODELS # Best analysis:'+best_analysis+' \n')
OF.write(' 1 %10.6E # Best R ratio (observed)\n' % float(rmax))
OF.write(' 2 %10.6E # r - 1: > 0 if excluded, < 0 if allowed\n' % (rmax-1.0))
if data_point.spc is None:
data_point.spc=zslha.read(spc_file)
else:
#if data_point.spc is not None:
data_point.spc.blocks['SMODELS']={'1': float(rmax), '2':float(rmax-1.0)}
data_point.spc.blockcomments['SModelS']={'1': 'Best R ratio (observed)','2': 'r - 1: > 0 if excluded, < 0 if allowed'}