Skip to content

Commit b5c51fc

Browse files
committed
DETECT card output is convered to ROOT
1 parent 5c53684 commit b5c51fc

File tree

2 files changed

+40
-12
lines changed

2 files changed

+40
-12
lines changed

mctools/fluka/detsuw2root.py

+33-12
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
#!/usr/bin/env python3
22

33
import sys, argparse, struct
4+
import numpy as np
45
from os import path
5-
# from mctools import fluka
66
from math import sqrt
77
from mctools.fluka.flair import fortran
88
import ROOT
99
ROOT.PyConfig.IgnoreCommandLineOptions = True
1010

1111
class DETECT:
1212
def __init__(self, fname):
13-
print(fname)
1413
self.f = open(fname, 'rb')
1514

1615
data = fortran.read(self.f)
@@ -19,28 +18,42 @@ def __init__(self, fname):
1918
self.runtit = self.runtit.decode('utf-8').strip()
2019
self.runtim = self.runtim.decode('utf-8').strip()
2120
assert self.runtim == "******** Sum file ********"
21+
self.nps = self.nctot + 1.0e9*self.mctot
2222

2323
def __del__(self):
2424
self.f.close()
2525

26+
def reset(self):
27+
self.chname = None
28+
self.nbin = None
29+
30+
self.ebins = []
31+
self.val = []
32+
self.err = []
33+
2634
def read(self):
35+
self.reset()
36+
2737
data = fortran.read(self.f)
2838
if data is None:
2939
return False
3040
size = len(data)
31-
ndet,chname,nbin,emin,ebin,ecut = struct.unpack("=i10si3f", data)
32-
chname = chname.decode('utf-8').strip()
33-
print(ndet,chname,nbin,emin,ebin,ecut)
41+
ndet,self.chname,self.nbin,emin,ebin,self.ecut = struct.unpack("=i10si3f", data)
42+
self.chname = self.chname.decode('utf-8').strip()
3443

3544
data = fortran.read(self.f)
3645
size = len(data)
37-
iv = struct.unpack("=%ii" % nbin, data)
38-
for i in range(nbin):
39-
ebnmin = emin + i * ebin
40-
ebnmax = emin + (i+1) * ebin
41-
weibin = iv[i] / (self.nctot + 1e9*self.mctot)
46+
iv = struct.unpack("=%ii" % self.nbin, data)
47+
48+
for i in range(self.nbin+1):
49+
self.ebins.append(emin + i * ebin)
50+
51+
for i in range(self.nbin):
52+
weibin = iv[i] / self.nps
4253
weierr = 1.0/sqrt(max(iv[i],1))
43-
print(ebnmin,ebnmax,weibin,weierr*100)
54+
self.val.append(weibin)
55+
self.err.append(weierr*weibin)
56+
4457
return True
4558

4659
def main():
@@ -65,9 +78,17 @@ def main():
6578
else:
6679
rootFileName = args.root
6780

81+
fout = ROOT.TFile(rootFileName, "recreate")
82+
6883
d = DETECT(args.detsuw)
6984
while d.read():
70-
pass
85+
h = ROOT.TH1F(d.chname, "nps = %g #bullet E_{cut} = %g GeV;Energy [GeV];Counts/primary" % (d.nps, d.ecut), d.nbin, np.array(d.ebins))
86+
for i in range(d.nbin):
87+
h.SetBinContent(i+1, d.val[i])
88+
h.SetBinError(i+1, d.err[i])
89+
h.Write()
90+
91+
fout.Close()
7192

7293

7394
if __name__=="__main__":

mctools/fluka/fluka2root.py

+7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def __init__(self, args):
5858
Estimator("USRBIN", "usbsuw"),
5959
Estimator("USRCOLL", "ustsuw"),
6060
Estimator("USRTRACK", "ustsuw"),
61+
Estimator("DETECT", "detsuw"),
6162
Estimator("RESNUCLE", "usrsuw")]
6263
self.opened = {} # dict of opened units (if any)
6364

@@ -177,6 +178,12 @@ def assignUnits(self):
177178
if unit<0: # we are interested in binary files only
178179
if not unit in self.estimators[e]:
179180
self.estimators[e].addUnit("%s" % unit)
181+
elif e.name == "DETECT":
182+
if re.search(r"\A%s" % e.name, line):
183+
unit = 17
184+
name = line[70:80].strip()
185+
if not unit in e.units:
186+
e.addUnit(unit)
180187
else:
181188
if re.search(r"\A%s" % e.name[:8], line) and not re.search(r"\&", line[70:80]):
182189
if e.name[:8] == "RESNUCLE":

0 commit comments

Comments
 (0)