CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
timeStructure.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 ##########################################################################
4 # Creates a histogram where the the names of the structures are present
5 # as humanreadable text. Multiple MillePedeUser TTrees are used to
6 # get a time dependent plot.
7 ##
8 
9 import logging
10 
11 from ROOT import (TH1F, TCanvas, TGraph, TImage, TLegend, TPaveLabel,
12  TPaveText, TTree, gROOT, gStyle)
13 
14 from Alignment.MillePedeAlignmentAlgorithm.mpsvalidate.classes import PedeDumpData, OutputData, PlotData
15 from Alignment.MillePedeAlignmentAlgorithm.mpsvalidate.geometry import Alignables, Structure
16 from Alignment.MillePedeAlignmentAlgorithm.mpsvalidate.style import identification
17 
18 
19 def plot(treeFile, alignables, config):
20  logger = logging.getLogger("mpsvalidate")
21 
22  for mode in ["xyz", "rot"]:
23 
24  time = PlotData(mode)
25 
26  # list of all avaible TTrees
27  listMillePedeUser = []
28  MillePedeUser = []
29  for i in range(config.firsttree, 101):
30  if (treeFile.GetListOfKeys().Contains("MillePedeUser_{0}".format(i))):
31  listMillePedeUser.append(i)
32 
33  # load MillePedeUser_X TTrees
34  for i in listMillePedeUser:
35  MillePedeUser.append(treeFile.Get("MillePedeUser_{0}".format(i)))
36 
37  ######################################################################
38  # remove TTrees without results
39  #
40 
41  # check if there is a TTree without any results
42  # therefor search for the first alignable
43  first = 0
44  newlistMillePedeUser = []
45  # find first alignable
46  for line in MillePedeUser[0]:
47  if (line.ObjId != 1 and any(abs(line.Par[time.data[i]]) != 999999 for i in [0, 1, 2])):
48  first = line.Id
49  newlistMillePedeUser.append(config.firsttree)
50  break
51 
52  # check the following TTrees
53  for ttreeNumber, ttree in enumerate(MillePedeUser[1:]):
54  for line in ttree:
55  if (line.Id == first):
56  if (any(abs(line.Par[time.data[i]]) != 999999 for i in [0, 1, 2])):
57  # note that the first tree was checked
58  newlistMillePedeUser.append(
59  ttreeNumber + config.firsttree + 1)
60  break
61 
62  listMillePedeUser = newlistMillePedeUser
63 
64  # reload MillePedeUser_X TTrees
65  MillePedeUser = []
66  for i in listMillePedeUser:
67  MillePedeUser.append(treeFile.Get("MillePedeUser_{0}".format(i)))
68 
69  if not listMillePedeUser:
70  logger.error("Timeplots: no TTrees found")
71  return
72 
73  if not MillePedeUser:
74  logger.error("Timeplots: no TTree could be opened")
75  return
76 
77  ######################################################################
78  # initialize data hierarchy
79  #
80 
81  plots = []
82  # objids which were found in the TTree
83  objids = []
84 
85  # loop over first tree to initialize
86  for line in MillePedeUser[0]:
87  if (line.ObjId != 1 and any(abs(line.Par[time.data[i]]) != 999999 for i in [0, 1, 2])):
88  plots.append(PlotData(mode))
89 
90  # new objid?
91  if (line.ObjId not in objids):
92  objids.append(line.ObjId)
93 
94  # initialize histograms
95  for i in range(3):
96  plots[-1].histo.append(TH1F("Time Structure {0} {1} {2} {3}".format(mode, alignables.get_name_by_objid(
97  line.ObjId), len(plots), i), "", len(listMillePedeUser), 0, len(listMillePedeUser)))
98  plots[-1].label = line.Id
99  plots[-1].objid = line.ObjId
100 
101  if (time.unit!=""):
102  plots[-1].histo[i].SetYTitle("#Delta"+time.xyz[i]+" ["+time.unit+"]")
103  else:
104  plots[-1].histo[i].SetYTitle("#Delta"+time.xyz[i])
105  plots[-1].histo[i].SetXTitle("IOV")
106  plots[-1].histo[i].SetStats(0)
107  plots[-1].histo[i].SetMarkerStyle(21)
108  # bigger labels for the text
109  plots[-1].histo[i].GetXaxis().SetLabelSize(0.08)
110  plots[-1].histo[i].GetYaxis().SetTitleOffset(1.6)
111 
112  ######################################################################
113  # fill histogram
114  #
115 
116  # loop over TTrees
117  for treeNumber, tree in enumerate(MillePedeUser):
118  for line in tree:
119  if (line.ObjId != 1 and any(abs(line.Par[time.data[i]]) != 999999 for i in [0, 1, 2])):
120  # find the right plot
121  for plot in plots:
122  if (plot.label == line.Id):
123  for i in range(3):
124  # note that the first bin is referenced by 1
125  plot.histo[i].GetXaxis().SetBinLabel(
126  treeNumber + 1, str(listMillePedeUser[treeNumber]))
127  # transform xyz data from cm to #mu m
128  if (mode == "xyz"):
129  plot.histo[i].SetBinContent(
130  treeNumber + 1, 10000 * line.Par[plot.data[i]])
131  else:
132  plot.histo[i].SetBinContent(
133  treeNumber + 1, line.Par[plot.data[i]])
134 
135  ######################################################################
136  # find maximum/minimum
137  #
138 
139  maximum = [[0, 0, 0] for x in range(len(objids))]
140  minimum = [[0, 0, 0] for x in range(len(objids))]
141 
142  for index, objid in enumerate(objids):
143  for plot in plots:
144  if (plot.objid == objid):
145  for i in range(3):
146  # maximum
147  if (plot.histo[i].GetMaximum() > maximum[index][i]):
148  maximum[index][i] = plot.histo[i].GetMaximum()
149  # minimum
150  if (plot.histo[i].GetMinimum() < minimum[index][i]):
151  minimum[index][i] = plot.histo[i].GetMinimum()
152 
153  ######################################################################
154  # make the plots
155  #
156 
157  # loop over all objids
158  for index, objid in enumerate(objids):
159 
160  canvas = TCanvas("canvasTimeBigStrucutres_{0}_{1}".format(
161  mode, alignables.get_name_by_objid(objid)), "Parameter", 300, 0, 800, 600)
162  canvas.Divide(2, 2)
163 
164  # add text
165  title = TPaveLabel(0.1, 0.8, 0.9, 0.9, "{0} over time {1}".format(
166  alignables.get_name_by_objid(objid), mode))
167 
168  legend = TLegend(0.05, 0.1, 0.95, 0.75)
169 
170  # draw on canvas
171  canvas.cd(1)
172  title.Draw()
173 
174  # draw identification
175  ident = identification(config)
176  ident.Draw()
177 
178  # TGraph copies to hide outlier
179  copy = []
180 
181  # reset y range of first plot
182  # two types of ranges
183  for i in range(3):
184  for plot in plots:
185  if (plot.objid == objid):
186  # 1. show all
187  if (config.rangemodeHL == "all"):
188  plot.usedRange[i] = max(
189  abs(maximum[index][i]), abs(minimum[index][i]))
190 
191  # 2. use given values
192  if (config.rangemodeHL == "given"):
193  # loop over coordinates
194  if (mode == "xyz"):
195  valuelist = config.rangexyzHL
196  if (mode == "rot"):
197  valuelist = config.rangerotHL
198  # loop over given values
199  # without last value
200  for value in valuelist:
201  # maximum smaller than given value
202  if (max(abs(maximum[index][i]), abs(minimum[index][i])) < value):
203  plot.usedRange[i] = value
204  break
205  # if not possible, force highest
206  if (max(abs(maximum[index][i]), abs(minimum[index][i])) > valuelist[-1]):
207  plot.usedRange[i] = valuelist[-1]
208 
209  # draw plots on canvas
210  for i in range(3):
211  canvas.cd(2 + i)
212 
213  number = 1
214 
215  for plot in plots:
216  if (plot.objid == objid):
217  # all the same range
218  if (config.samerangeHL == 1):
219  plot.usedRange[i] = max(map(abs, plot.usedRange))
220 
221  # set new range
222  plot.histo[i].GetYaxis(
223  ).SetRangeUser(-1.2 * abs(plot.usedRange[i]), 1.2 * abs(plot.usedRange[i]))
224 
225  plot.histo[i].SetLineColorAlpha(number + 2, 0.5)
226  plot.histo[i].SetMarkerColorAlpha(number + 2, 1)
227 
228  # option "AXIS" to only draw the axis
229  plot.histo[i].SetLineColor(0)
230  plot.histo[i].Draw("PSAME")
231 
232  # TGraph object to hide outlier
233  copy.append(TGraph(plot.histo[i]))
234  # set the new range
235  copy[-1].SetMaximum(1.2 * abs(plot.usedRange[i]))
236  copy[-1].SetMinimum(-1.2 * abs(plot.usedRange[i]))
237  # draw the data
238  copy[-1].SetLineColorAlpha(number + 2, 0.5)
239  copy[-1].Draw("LPSAME")
240 
241  if (i == 0):
242  legend.AddEntry(
243  plot.histo[i], "{0}".format(number))
244  number += 1
245 
246  canvas.cd(1)
247  legend.Draw()
248 
249  canvas.Update()
250 
251  # save as pdf
252  canvas.Print("{0}/plots/pdf/timeStructures_{1}_{2}.pdf".format(
253  config.outputPath, mode, alignables.get_name_by_objid(objid)))
254 
255  # export as png
256  image = TImage.Create()
257  image.FromPad(canvas)
258  image.WriteImage("{0}/plots/png/timeStructures_{1}_{2}.png".format(
259  config.outputPath, mode, alignables.get_name_by_objid(objid)))
260 
261  # add to output list
262  output = OutputData(plottype="time", name=alignables.get_name_by_objid(
263  objid), parameter=mode, filename="timeStructures_{0}_{1}".format(mode, alignables.get_name_by_objid(objid)))
264  config.outputList.append(output)
def identification
creates the identification text in the top left corner
Definition: style.py:16
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:34
Abs< T >::type abs(const T &t)
Definition: Abs.h:22