import ROOT
import random, math
import sys
import os
import glob
import MPF.pyrootHelpers as PH
from MPF.commonHelpers.logger import logger
logger = logger.getChild(__name__)
# Do some dummy plots
[docs]def histogramFromList(myList, nbins):
xmin = min(myList, key=lambda x: x[0])
xmax = max(myList, key=lambda x: x[0])
logger.debug(xmin)
logger.debug(xmax)
histo = ROOT.TH1D(next(PH.tempNames), '', nbins, float(xmin[0]), float(xmax[0]))
histo.Sumw2()
for entry, value in myList:
histo.Fill(entry, value)
return histo
[docs]def randHist():
histo = ROOT.TH1D(next(PH.tempNames), '', 10, 0, 1)
for i in range(10):
for j in range(i*2):
histo.Fill(random.random())
histo.SetDirectory(0)
return histo
[docs]def sampleFunc(func, **kwargs):
histo = ROOT.TH1D(next(PH.tempNames), '', 10, 0, 10)
stats = kwargs.get('simulateStats', 0)
for i in range(10):
val = func(i)
if val < 0:
logger.error('sampling negative values not properly supported')
if stats > 0:
for j in range(int(math.ceil(val/stats))):
histo.Fill(i, stats)
else:
histo.Fill(i, val)
return histo
[docs]def loadExampleTreeCode():
if not ROOT.gROOT.GetClass("TGenPhaseSpace"):
ROOT.gSystem.Load("libPhysics")
try:
ROOT.exampleTree
except AttributeError:
cxxFile = os.path.join(os.path.dirname(__file__), "exampleTree.cxx")
compileFiles = os.path.join(os.path.dirname(__file__), "exampleTree_cxx*")
# clean up previously existing files
for filename in glob.glob(compileFiles):
logger.debug("deleting {}".format(filename))
os.unlink(filename)
logger.debug("loading {}".format(cxxFile))
# i don't know why, but if i put the "+" here there are
# sometimes problems with the loaded classes for multihistdraw
# (after there temporary files got deleted)
# Note: we do atexit deletion again ... anyways - probably don't need the "+" here
# ROOT.gROOT.ProcessLine(".L {}+".format(cxxFile))
# so lets do it without "+"
ROOT.gROOT.ProcessLine(".L {}".format(cxxFile))
[docs]def createExampleTrees(filename):
loadExampleTreeCode()
exampleTree = ROOT.exampleTree()
f = ROOT.TFile.Open(filename, "RECREATE")
exampleTree.makeWTree(80., "w1", 100000)
exampleTree.makeWTree(100., "w2", 100000)
exampleTree.makeWTree(150., "w3", 100000)
exampleTree.makeWTree(2000., "w4", 100000)
f.Write()
f.Close()
[docs]def createExampleSignalGrid(filename,
nevents=1000,
m1range=(1000, 2000, 100),
m2range=(1000, 2000, 100)):
loadExampleTreeCode()
exampleTree = ROOT.exampleTree()
f = ROOT.TFile.Open(filename, "RECREATE")
for m1 in range(*m1range):
for m2 in range(*m2range):
if m2 >= m1:
continue
exampleTree.makeWTree(m1, "w_{}_{}".format(m1, m2), nevents, 0., m2)
f.Write()
f.Close()
[docs]def parseExampleArgs():
import argparse
parser = argparse.ArgumentParser(description='Run the MPF examples')
parser.add_argument('--log', help='logging level')
args = parser.parse_args()
if args.log:
import logging
logger.parent.setLevel(getattr(logging, args.log.upper()))