Files
geant4/examples/advanced/Tiara/source/py_modules/dpsManip.py
T
2016-06-09 10:49:58 +02:00

91 lines
2.6 KiB
Python

# $Id: dpsManip.py,v 1.2 2003/06/16 17:06:44 dressel Exp $
# -------------------------------------------------------------------
# GEANT4 tag $Name: geant4-05-02-patch-01 $
# -------------------------------------------------------------------
#
import math
# functions to manipulate a DPS (data point set)
def getScaledDPS(hSrc, scale, df, name):
"Create a scaled DPS from a histogramm."
hSrc.scale(scale)
dp = df.create(name, hSrc)
setDPSErrorsToZero(dp, 0)
hSrc.scale(1./scale)
return dp
def setDPSErrorsToZero(dps, coNum):
"Set errors of a DPS to zero."
for i in range(dps.size()):
p = dps.point(i)
co = p.coordinate(coNum)
co.setErrorMinus(coNum)
co.setErrorPlus(coNum)
def copyDPS(dSrc, df, name):
"Make a copy of a DPS using the data point set factory df."
dp = df.create(name, dSrc.dimension ())
for i in range( dSrc.size() ):
dp.addPoint()
pNew = dp.point(i)
pOld = dSrc.point(i)
for d in range(dSrc.dimension ()):
cOld = pOld.coordinate(d)
cNew = pNew.coordinate(d)
cNew.setValue(cOld.value())
em = cOld.errorMinus()
ep = cOld.errorPlus()
cNew.setErrorMinus(em)
cNew.setErrorPlus(ep)
return dp
def dLogWeightDPS(dSrc, df, name, binEdges):
"""Create a dps with the coordinate 1 scaled by 1/dlog(coordinate 0).
"""
dp = copyDPS(dSrc, df, name)
for i in range(len(binEdges) - 1):
s = math.log(binEdges[i+1]) - math.log(binEdges[i])
c = dp.point(i).coordinate (1)
value = dSrc.point(i).coordinate(1).value()
errorMinus = dSrc.point(i).coordinate(1).errorMinus()
errorPlus = dSrc.point(i).coordinate(1).errorPlus()
c.setValue(value / s)
c.setErrorMinus(errorMinus / s)
c.setErrorPlus(errorPlus / s)
return dp
def createScaledDPS(coNum, pDataO, df, name, scale):
"""Create a scaled DPS from a DPS.
The coordinate \'coNum\' of the source DPS \'pDataO\' is scaled by
\'scale\'. The result is returned in the DPS created by the given
data point set factory \'df\' named \'name\'.
"""
dp = copyDPS(pDataO, df, name)
for i in range( dp.size() ):
p = dp.point(i)
co = p.coordinate(coNum)
co.setValue(co.value()*scale)
co.setErrorMinus(co.errorMinus()*scale)
co.setErrorPlus(co.errorPlus()*scale)
return dp
def getBinEdges(h):
"Get bin edges of a histogramm."
binEdges = []
a = h.axis ()
for i in range(a.bins ()):
binEdges.append(a.binLowerEdge(i))
binEdges.append(a.binUpperEdge(a.bins () - 1))
return binEdges