Skip to content

Commit 20b7a65

Browse files
Merge pull request #236 from Mu2e/pyutils-dev
Pyutils: first round of pyutils for v6
2 parents f926b87 + 338e9ba commit 20b7a65

18 files changed

Lines changed: 1110 additions & 380 deletions

.muse

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ ROOT_LIBRARY_PATH
33

44
PYTHONPATH utils
55
PYTHONPATH utils/helper
6+
PYTHONPATH utils/pyutils
67
PATH bin

example-analysis-scripts/PythonScript.py

Lines changed: 0 additions & 82 deletions
This file was deleted.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#! /usr/bin/env python
2+
import pyimport as evn
3+
import pyvector as vec
4+
import pyplot as plot
5+
import pyprint as prnt
6+
from pyselect import Select as slct
7+
8+
import awkward as ak
9+
def main():
10+
""" simple test function to run some of the utils """
11+
12+
# import the files
13+
myevn = evn.Import("/exp/mu2e/data/users/sophie/ensembles/MDS1/MDS1av0.root", "EventNtuple", "ntuple")
14+
15+
# import code and extract branch
16+
ntuple = myevn.ImportTree()
17+
18+
# make a pyselect object
19+
mysel = slct()
20+
21+
# check if it is an electron
22+
is_elec = mysel.isElectron(nutple)
23+
24+
# import branches associated with trk fits
25+
trksegs = myevn.ImportBranches(ntuple,['trksegs','trksegpars_lh'])
26+
27+
# check if fit is going down stream
28+
is_down = mysel.isDownstream(trksegs)
29+
30+
# is trk entrance
31+
trkent_mask = (trksegs['trksegs']['sid']==0)
32+
33+
# is in time
34+
trksegs_mask = (trksegs['trksegs']['time'] > 640) & (trksegs['trksegs']['time'] < 1650)
35+
36+
# check trk pars
37+
trkpars_mask = (trksegs['trksegpars_lh']['t0err'] < 0.9) & (trksegs['trksegpars_lh']['maxr'] < 680) & (trksegs['trksegpars_lh']['maxr'] > 450)
38+
39+
40+
# these are deprecated cuts
41+
oldtrkpar_mask = (trksegs['trksegpars_lh']['tanDip'] > 0.5) & (trksegs['trksegpars_lh']['tanDip'] < 1.0) & (trksegs['trksegpars_lh']['d0'] > -100) & (trksegs['trksegpars_lh']['d0'] < 100)
42+
43+
# check trk quality
44+
trkqual = ntuple["trkqual"]
45+
mytrkqual = trkqual.arrays(library='ak')
46+
trkqual_mask = (mytrkqual['trkqual.result']> 0.2)
47+
48+
# check for crv coincidences
49+
crvs = ntuple["crvcoincs"]
50+
mycrvs = crvs.arrays(library='ak')
51+
crv_mask = mysel.hasTrkCrvCoincs( trksegs, mycrvs, 150)
52+
53+
# apply joint mask
54+
mytrksegs = trksegs['trksegs'].mask[(is_elec) & (is_down) & (trkent_mask) & (trksegs_mask) & (crv_mask) &(oldtrkpar_mask) & (active_mask) & (trkqual_mask) & (trkpars_mask) ]
55+
56+
# plot time before and after cuts:
57+
myhist = plot.Plot()
58+
flatarraytime = ak.flatten(trksegs['trksegs']['time'], axis=None)
59+
flatarraycut = ak.flatten(mytrksegs['time'], axis=None)
60+
dictarrays = { "no cut" : flatarraytime, "with cut" : flatarraycut }
61+
myhist.Plot1DOverlay(dictarrays, 100, 450, 1695, "Mu2e Example", "fit time at Trk Ent [ns]", "#events per bin", 'timecut.pdf', 'best', 300,False, True, True)
62+
63+
# plot the momentum before and after the cuts
64+
myvect = vec.Vector()
65+
electrksegs = trkentall['trksegs'].mask[(is_elec) & (is_down)]
66+
vector_all = myvect.GetVectorXYZFromLeaf(electrksegs, 'mom')
67+
magnitude_all = myvect.Mag(vector_all)
68+
69+
vector_cut = myvect.GetVectorXYZFromLeaf(mytrksegs, 'mom')
70+
magnitude_cut = myvect.Mag(vector_cut)
71+
72+
flatarraymom_all = ak.flatten(magnitude_all, axis=None)
73+
flatarraymom_cut = ak.flatten(magnitude_cut, axis=None)
74+
75+
myhist.Plot1D(flatarraymom_cut , None, 100, 95, 115, "Mu2e Example", "fit mom at Trk Ent [MeV/c]", "#events per bin", 'black', 'best', 'momcut.pdf', 300, True, False, True, False, True, True, True)
76+
77+
dictarrays = { "all dem" : flatarraymom_all, "dem + trkcuts" : flatarraymom_cut }
78+
myhist.Plot1DOverlay(dictarrays, 100, 95,115, "Mu2e Example", "fit mom at Trk Ent [ns]", "#events per bin", 'momcutcompare.pdf', 'best', 300,False, True, True)
79+
80+
81+
82+
83+
84+
85+
if __name__ == "__main__":
86+
main()
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#! /usr/bin/env python
2+
import pyimport as evn
3+
import pyvector as vec
4+
import pyplot as plot
5+
import pyprint as prnt
6+
from pyselect import Select as slct
7+
import awkward as ak
8+
9+
def main():
10+
""" simple test function to run some of the utils """
11+
12+
# import the files
13+
test_evn = evn.Import("/exp/mu2e/data/users/sophie/ensembles/MDS1/MDS1av2.root", "EventNtuple", "ntuple")
14+
15+
# import code and extract branch
16+
ntuple = test_evn.ImportTree()
17+
18+
# make a pyselect object
19+
mysel = slct()
20+
21+
# import branches associated with trk fits
22+
trksegs = test_evn.ImportBranches(ntuple,['trksegs','trksegpars_lh'])
23+
24+
# check if it is an electron going downstream
25+
is_elec = mysel.isElectron(ntuple)
26+
is_down = mysel.isDownstream(trksegs)
27+
28+
# active hits
29+
active_mask = mysel.SelectHits(ntuple, 20)
30+
31+
# check trk quality
32+
trkqual_mask = mysel.SelectTrkQual(ntuple, 0.2)
33+
34+
# check for crv coincidences
35+
crv_mask = mysel.hasTrkCrvCoincs( trksegs, ntuple, 150)
36+
37+
# set of trkseg cuts
38+
treenames = [ 'trksegs', 'trksegs', 'trksegpars_lh', 'trksegpars_lh', 'trksegpars_lh', 'trksegpars_lh']
39+
leaves = [ 'sid', 'time', 't0err','maxr','tanDip','d0']
40+
equals = [True, False, False, False, False, False]
41+
v1s = [0, 640, 0, 450, 0.5, -100]
42+
v2s = [None, 1650, 0.9, 680, 1.0, 100]
43+
44+
# make a list of masks
45+
trkseg_mask_list = mysel.MakeMaskList(trksegs, treenames, leaves, equals, v1s, v2s)
46+
47+
# FIXME apply joint mask --> can we make this tidier? like a loop or somethin?
48+
mytrksegs = trksegs['trksegs'].mask[(is_elec) & (is_down) & (trkqual_mask) & (crv_mask) & (active_mask) & (trkseg_mask_list[0]) & (trkseg_mask_list[1]) & (trkseg_mask_list[2]) & (trkseg_mask_list[3]) & (trkseg_mask_list[4]) & (trkseg_mask_list[5]) ]
49+
50+
# make some plots to compare before/after cuts
51+
myhist = plot.Plot()
52+
53+
# plot the momentum before and after the cuts
54+
myvect = vec.Vector()
55+
electrksegs = trksegs['trksegs'].mask[(is_elec) & (is_down)]
56+
vector_all = myvect.GetVectorXYZFromLeaf(electrksegs, 'mom')
57+
magnitude_all = myvect.Mag(vector_all)
58+
59+
vector_cut = myvect.GetVectorXYZFromLeaf(mytrksegs, 'mom')
60+
magnitude_cut = myvect.Mag(vector_cut)
61+
62+
flatarraymom_all = ak.flatten(magnitude_all, axis=None)
63+
flatarraymom_cut = ak.flatten(magnitude_cut, axis=None)
64+
65+
myhist.Plot1D(flatarraymom_cut , None, 100, 95, 115, "Mu2e Example", "fit mom at Trk Ent [MeV/c]", "#events per bin", 'black', 'best', 'momcut.pdf', 300, True, False, True, False, True, True, True)
66+
67+
dictarrays = { "all dem" : flatarraymom_all, "dem + trkcuts" : flatarraymom_cut }
68+
myhist.Plot1DOverlay(dictarrays, 100, 95,115, "Mu2e Example", "fit mom at Trk Ent [ns]", "#events per bin", 'momcutcompare.pdf', 'best', 300,False, True, True)
69+
70+
if __name__ == "__main__":
71+
main()
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#! /usr/bin/env python
2+
import pyimport as evn
3+
import pyvector as vec
4+
import pyplot as plot
5+
import pyprint as prnt
6+
import awkward as ak
7+
8+
def main():
9+
""" simple test function to run some of the utils """
10+
11+
# import the files
12+
myevn = evn.Import(None, "EventNtuple", "ntuple")
13+
14+
#import a list of files
15+
filepath = "/exp/mu2e/data/users/sophie/ensembles/MDS1/file.list"
16+
17+
# import code and extract branch
18+
treename = 'trksegs'
19+
branchname = 'time'
20+
surface_id = 0 # tracker entrance FIXME - we need a better way for this
21+
branch = myevn.ImportTreeFromFileList(filepath, treename)
22+
23+
# find fit at chosen ID
24+
trkent = myevn.SelectSurfaceID(branch, treename, surface_id)
25+
26+
# make 1D plot
27+
myhist = plot.Plot()
28+
flatarraytime = ak.flatten(trkent[str(branchname)], axis=None)
29+
myhist.Plot1D(flatarraytime, None, 100, 450, 1695, "Mu2e Example", "fit time at Trk Ent [ns]", "#events per bin", 'black', 'best', 'time_merged.pdf', 300, True, False, False, False, True, True, True)
30+
31+
if __name__ == "__main__":
32+
main()
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#! /usr/bin/env python
2+
import pyimport as evn
3+
import pyvector as vec
4+
import pyplot as plot
5+
import pyprint as prnt
6+
import pyselect as slct
7+
import awkward as ak
8+
def main():
9+
""" simple test function to run some of the utils """
10+
11+
# import the files
12+
test_evn = evn.Import("/exp/mu2e/data/users/sophie/ensembles/MDS1/MDS1av0.root", "EventNtuple", "ntuple")
13+
14+
# import code and extract branch
15+
treename = 'trksegs'
16+
branchname = 'time'
17+
surface_id = 0 # tracker entrance FIXME - we need a better way for this
18+
ntuple = test_evn.ImportTree()
19+
branch = test_evn.ImportBranches(ntuple,[str(treename)])
20+
21+
# find fit at chosen ID
22+
mysel = slct.Select()
23+
trkent = mysel.SelectSurfaceID(branch, treename, surface_id)
24+
25+
# print out the first 10 events:
26+
myprnt = prnt.Print()
27+
myprnt.PrintNEvents(branch,10)
28+
29+
# make 1D plot
30+
myhist = plot.Plot()
31+
flatarraytime = ak.flatten(trkent[str(branchname)], axis=None)
32+
myhist.Plot1D(flatarraytime, None, 100, 450, 1695, "Mu2e Example", "fit time at Trk Ent [ns]", "#events per bin", 'black', 'best', 'time.pdf', 300, True, False, False, False, True, True, True)
33+
34+
# access vectors
35+
myvect = vec.Vector()
36+
vecbranchname = 'mom'
37+
trkentall = mysel.SelectSurfaceID(branch, treename, surface_id)
38+
vector_test = myvect.GetVectorXYZFromLeaf(trkentall, vecbranchname)
39+
magnitude = myvect.Mag(vector_test)
40+
41+
# make 1D plot of magnitudes
42+
flatarraymom = ak.flatten(magnitude, axis=None)
43+
44+
# 2D mom time plot
45+
myhist.Plot2D( flatarraymom, flatarraytime, None, 100, 95, 115, 100, 450, 1650, "Mu2e Example", "fit mom at Trk Ent [MeV/c]", "fit time at Trk Ent [ns]", None, 'timevmom.pdf', 'inferno',300,False, False, False, True,True)
46+
47+
48+
if __name__ == "__main__":
49+
main()
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# mu2e.mplstyle
2+
3+
# Generic figure tweaks
4+
axes.prop_cycle: cycler("color", ['red','blue','green','orange','violet','cyan','pink','gray','yellow'])
5+
6+
mathtext.default: regular
7+
font.size: 18
8+
axes.labelsize: medium
9+
axes.unicode_minus: False
10+
axes.labelpad: 10
11+
axes.titlesize: 15
12+
axes.linewidth: 2
13+
grid.alpha: 0.8
14+
grid.linestyle: :
15+
savefig.transparent: False
16+
17+
xaxis.labellocation: right
18+
yaxis.labellocation: top
19+
xtick.labelsize: small
20+
ytick.labelsize: small
21+
xtick.direction: in
22+
xtick.major.size: 12
23+
xtick.minor.size: 6
24+
xtick.major.pad: 6
25+
xtick.top: True
26+
xtick.major.top: True
27+
xtick.major.bottom: True
28+
xtick.minor.top: True
29+
xtick.minor.bottom: True
30+
xtick.minor.visible: True
31+
ytick.direction: in
32+
ytick.major.size: 12
33+
ytick.minor.size: 6.0
34+
ytick.right: True
35+
ytick.major.left: True
36+
ytick.major.right: True
37+
ytick.minor.left: True
38+
ytick.minor.right: True
39+
ytick.minor.visible: True
40+
41+
legend.fontsize: small
42+
legend.handlelength: 1.5
43+
legend.borderpad: 0.5
44+
legend.frameon: False
45+

0 commit comments

Comments
 (0)