CMS 3D CMS Logo

plot_hgcal_utils.py
Go to the documentation of this file.
1 from __future__ import print_function
2 from ROOT import TStyle, kWhite, kTRUE
3 from ROOT import gROOT, gStyle
4 from ROOT import kGray, kAzure, kMagenta, kOrange, kWhite
5 from ROOT import kRed, kBlue, kGreen, kPink, kYellow
6 from ROOT import TLine, TLatex, TColor
7 
8 from collections import namedtuple, OrderedDict
9 from math import sin, cos, tan, atan, exp, pi
10 from array import array
11 
12 from Validation.Geometry.plot_utils import Plot_params
13 
14 plots = {}
15 plots.setdefault('x_vs_eta', Plot_params(10, '#eta', 'x/X_{0}', 0.0, 145., -4.0, 4.0, '', 0, 0., 0., 0, 1))
16 plots.setdefault('x_vs_phi', Plot_params(20, '#varphi [rad]', 'x/X_{0}', 0.0, 6.2, -4.0, 4.0, '', 0, 0., 0., 0, 1))
17 plots.setdefault('x_vs_R', Plot_params(40, 'R [cm]', 'x/X_{0}', 0.0, 70.0, 0.0, 1200.0, '', 0, 0., 0., 0, 1))
18 plots.setdefault('l_vs_eta', Plot_params(10010, '#eta', 'x/#lambda_{I}', 0.0, 22.8, -4.0, 4.0, '', 0, 0., 0., 0, 1))
19 plots.setdefault('l_vs_phi', Plot_params(10020, '#varphi [rad]', 'x/#lambda_{I}', 0.0, 1.2, -4.0, 4.0, '', 0, 0., 0., 0, 1))
20 plots.setdefault('l_vs_R', Plot_params(10040, 'R [cm]', 'x/#lambda_{I}', 0.0, 7.5, 0.0, 1200.0, '', 0, 0., 0., 0, 1))
21 plots.setdefault('x_vs_eta_vs_phi', Plot_params(30, '#eta', '#varphi', 0., 0., 0., 0., 'x/X_{0}', 0, -1., -1., 0, 1))
22 plots.setdefault('l_vs_eta_vs_phi', Plot_params(10030, '#eta', '#varphi', 0., 0., 0., 0., 'x/#lambda_{I}', 0, -1, -1, 0, 1))
23 plots.setdefault('x_vs_z_vs_Rsum', Plot_params(50, 'z [mm]', 'R [mm]', 0., 0., 0., 0., '#Sigmax/X_{0}', 1, -1., -1., 0, 0))
24 plots.setdefault('x_vs_z_vs_Rsumcos', Plot_params(52, 'z [mm]', 'R [mm]', 0., 0., 0., 0., '#Sigmax/X_{0}', 1, -1., -1., 0, 0))
25 #plots.setdefault('x_vs_z_vs_R', Plot_params(60, 'z [mm]', 'R [mm]', 0., 0., 0., 0., '1/X_{0}', 1, -1., -1., 0, 0))
26 plots.setdefault('x_vs_z_vs_Rloc', Plot_params(70, 'z [mm]', 'R [mm]', 0., 0., 0., 0., 'x/X_{0}', 1, -1., -1., 0, 0))
27 plots.setdefault('x_vs_z_vs_Rloccos', Plot_params(72, 'z [mm]', 'R [mm]', 0., 0., 0., 0., 'x/X_{0}', 1, -1., -1., 0, 0))
28 plots.setdefault('l_vs_z_vs_Rsum', Plot_params(10050, 'z [mm]', 'R [mm]', 0., 0., 0., 0., '#Sigmax/#lambda_{I}', 1, -1., -1., 0, 0))
29 plots.setdefault('l_vs_z_vs_Rsumcos', Plot_params(10052, 'z [mm]', 'R [mm]', 0., 0., 0., 0., '#Sigmax/#lambda_{I}', 1, -1., -1., 0, 0))
30 plots.setdefault('l_vs_z_vs_R', Plot_params(10060, 'z [mm]', 'R [mm]', 0., 0., 0., 0., '1/#lambda_{I}', 1, -1., -1., 0, 0))
31 plots.setdefault('l_vs_z_vs_Rloc', Plot_params(10070, 'z [mm]', 'R [mm]', 0., 0., 0., 0., 'x/#lambda_{I}', 1, -1., -1., 0, 0))
32 plots.setdefault('l_vs_z_vs_Rloccos', Plot_params(10072, 'z [mm]', 'R [mm]', 0., 0., 0., 0., 'x/#lambda_{I}', 1, -1., -1., 0, 0))
33 plots.setdefault('x_over_l_vs_eta', Plot_params(10, '#eta', '(x/X_{0})/(x/#lambda_{I})', 0., 0., 0., 0., '', 0, -1, -1, 0, 0))
34 plots.setdefault('x_over_l_vs_phi', Plot_params(20, '#varphi [rad]', '(x/X_{0})/(x/#lambda_{I})', 0., 0., 0., 0., '', 0, -1, -1, 0, 0))
35 
36 # Conversion name from the label (key) to the components in CMSSW/Geometry
37 _LABELS2COMPS = {'BeamPipe': 'BEAM',
38  'Tracker': 'Tracker',
39  'EndcapTimingLayer + Thermal Screen': 'CALOECTSFront',
40  'Neutron Moderator + Thermal Screen' : 'CALOECTSMiddle',
41  'HGCal + HGCal Service + Thermal Screen' : 'CALOECTSRear',
42  'Solenoid Magnet' : 'MGNT',
43  'Muon Wheels and Cables' : 'MB',
44  'ECAL': 'ECAL',
45  'HCal': 'HCal',
46  'FromVertexToBackOfHGCal' : ['BEAM','Tracker','ECAL','HCal','CALOECTSFront','CALOECTSMiddle','CALOECTSRear','MGNT','MB'],
47  'HGCal': 'HGCal',
48  'HGCalEE': 'HGCalEE',
49  'HGCalHE': ['HGCalHEsil', 'HGCalHEmix']
50  }
51 
52 # Compounds are used to stick together different part of the HGCal
53 # detector, so that their cumulative material description can be
54 # derived. The key name can be generic, while the names in the
55 # associated list must be such that an appropriate material
56 # description file, in ROOT format, is present while producing the
57 # cumulative plot. A missing element will invalidate the full
58 # procedure.
59 COMPOUNDS = OrderedDict()
60 COMPOUNDS["HGCal"] = ["HGCal"]
61 COMPOUNDS["HGCalEE"] = ["HGCalEE"]
62 COMPOUNDS["HGCalHE"] = ["HGCalHEsil", "HGCalHEmix"]
63 COMPOUNDS["FromVertexToBackOfHGCal"] = ["BeamPipe","Tracker","ECAL","HCal","EndcapTimingLayer + Thermal Screen","Neutron Moderator + Thermal Screen","HGCal + HGCal Service + Thermal Screen","Solenoid Magnet","Muon Wheels and Cables"]
64 
65 # The DETECTORS must be the single component of the HGCal for which
66 # the user can ask for the corresponding material description.
67 # BE CAREFUL: When running on a single detector and not through all
68 # only uncomment that one below. e.g. when running on HGCal only you should
69 # have only:
70 # DETECTORS["HGCal"] = kAzure-5
71 # and others should be commented out.
72 DETECTORS = OrderedDict()
73 DETECTORS["BeamPipe"] = kGray+2
74 DETECTORS["Tracker"] = 9 #kAzure-5
75 DETECTORS["ECAL"] = 2 #kOrange+10
76 DETECTORS["HCal"] = 6 #kMagenta-2
77 DETECTORS["EndcapTimingLayer + Thermal Screen"] = 7#kAzure-9
78 DETECTORS["Neutron Moderator + Thermal Screen"] = 46#kOrange+5
79 DETECTORS["HGCal + HGCal Service + Thermal Screen"] = 5#kOrange-2
80 DETECTORS["Solenoid Magnet"] = 4#kGray+5
81 DETECTORS["Muon Wheels and Cables"] = 28
82 #When running to get the R vs z sum of all subdetectors comment out above and
83 #uncomment the next line
84 #DETECTORS["FromVertexToBackOfHGCal"] = 30
85 
86 
87 # sDETS are the label of the HGCal elements in the Reconstruction
88 # geometry. They are all used to derive the reconstruction material
89 # profile to be compared to the one obtained directly from the
90 # simulation. A missing key in the real reconstruction geometry is not
91 # a problem, since this will imply that the corresponding plotting
92 # routine will skip that missing part. For this reason this map can be
93 # made as inclusive as possible with respect to the many
94 # reconstruction geometries in CMSSW.
95 sDETS = OrderedDict()
96 #sDETS["HGCalEE"] = kRed
97 #sDETS["HGCalHEsil"] = kBlue
98 #sDETS["HGCalHEmix"] = kGreen
99 sDETS["ECAL"] = kBlue
100 sDETS["HCal"] = kOrange
101 #sDETS[""] = kYellow
102 #sDETS[""] = kOrange
103 #sDETS[""] = kPink
104 
105 # hist_label_to_num contains the logical names of the HGCal detector
106 # that holds material. They are therefore not aware of which detector
107 # they belong to, but they are stored in specific plots in all the
108 # mat*root files produced. The numbering of the plots is identical
109 # across all files.
110 hist_label_to_num = OrderedDict()
111 hist_label_to_num['COP'] = [100, 2, 'Copper'] # Index first, color second, legend label third
112 hist_label_to_num['SCI'] = [200, 3, 'Scintillator']
113 hist_label_to_num['CAB'] = [300, 4, 'Cables']
114 hist_label_to_num['MNE'] = [400, 5, 'HGC_G10-FR4']
115 hist_label_to_num['SIL'] = [500, 6, 'Silicon']
116 hist_label_to_num['OTH'] = [600, 7, 'Other']
117 hist_label_to_num['AIR'] = [700, 8, 'Air']
118 hist_label_to_num['SST'] = [800, 9, 'Stainless Steel']
119 hist_label_to_num['WCU'] = [900, 28, 'WCu']
120 hist_label_to_num['LEA'] = [1000, 12, 'Lead']
121 hist_label_to_num['EPX'] = [1100, 46, 'Epoxy']
122 hist_label_to_num['KAP'] = [1200, 49, 'Kapton']
123 hist_label_to_num['ALU'] = [1300, 33, 'Aluminium']
124 
125 def TwikiPrintout(plotname, label, zoom):
126  """The plots in the twiki are already too much and to avoid mistakes
127  we will try to automatize the procedure
128  """
129 
130  #Twiki will strip out spaces
131  label = label.replace(" ", "_")
132 
133  zoomstring = ""
134 
135  if zoom == "all":
136  zoomstring = ""
137  zoomtitle = "in all HGCal"
138  zoomdir = "%s/" % label
139  elif zoom == "zplus":
140  zoomstring = "_ZplusZoom"
141  zoomtitle = "in Z+ endcap of HGCal"
142  zoomdir = "%s/ZPlusZoom/" % label
143  elif zoom == "zminus":
144  zoomstring = "_ZminusZoom"
145  zoomtitle = "in Z- endcap of HGCal"
146  zoomdir = "%s/ZMinusZoom/" % label
147  else :
148  print("WRONG OPTION")
149 
150 
151  #Here for the hide button
152  if plotname == "x_vs_z_vs_Rsum":
153  print("%%TWISTY{ mode=\"div\" showlink=\"Click to see the %s plots %s \" hidelink=\"Hide %s %s\" showimgright=\"%%ICONURLPATH{toggleopen-small}%%\" hideimgright=\"%%ICONURLPATH{toggleclose-small}%%\"}%%" % (label,zoomtitle, label, zoomtitle))
154 
155  if "Rsum" in plotname and "x_vs" in plotname and not "cos" in plotname:
156  print("| <img alt=\"HGCal_%s%s%s.png\" height=\"300\" width=\"550\" src=\"http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.png\" /> | The plot on the left shows the 2D profile histogram for *%s* %s that displays the mean value of the material budget in units of radiation length in each R-z cell. R-z cell is 1 cm x 1 mm. The plot depicts the accumulated material budget as seen by the track, as the track travels throughout the detector.[[http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.pdf][Click to enlarge plot]] |" % (plotname,label,zoomstring,zoomdir,plotname,label,zoomstring, label, zoomtitle,zoomdir,plotname,label,zoomstring))
157 
158  if "Rsum" in plotname and "l_vs" in plotname and not "cos" in plotname:
159  print("| <img alt=\"HGCal_%s%s%s.png\" height=\"300\" width=\"550\" src=\"http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.png\" /> | The plot on the left shows the 2D profile histogram for *%s* %s that displays the mean value of the material budget in units of interaction length in each R-z cell. R-z cell is 1 cm x 1 mm. The plot depicts the accumulated material budget as seen by the track, as the track travels throughout the detector.[[http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.pdf][Click to enlarge plot]] |" % (plotname,label,zoomstring,zoomdir,plotname,label,zoomstring, label, zoomtitle,zoomdir,plotname,label,zoomstring))
160 
161  if "Rsumcos" in plotname and "x_vs" in plotname:
162  print("| <img alt=\"HGCal_%s%s%s.png\" height=\"300\" width=\"550\" src=\"http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.png\" /> | The plot on the left shows the 2D profile histogram for *%s* %s that displays the mean value of the material budget in units of radiation length in each R-z cell. R-z cell is 1 cm x 1 mm. The plot depicts the orthogonal accumulated material budget, that is cos(theta) what the track sees.[[http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.pdf][Click to enlarge plot]] |" % (plotname,label,zoomstring,zoomdir,plotname,label,zoomstring, label, zoomtitle,zoomdir,plotname,label,zoomstring))
163 
164  if "Rsumcos" in plotname and "l_vs" in plotname:
165  print("| <img alt=\"HGCal_%s%s%s.png\" height=\"300\" width=\"550\" src=\"http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.png\" /> | The plot on the left shows the 2D profile histogram for *%s* %s that displays the mean value of the material budget in units of interaction length in each R-z cell. R-z cell is 1 cm x 1 mm. The plot depicts the orthogonal accumulated material budget, that is cos(theta) what the track sees.[[http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.pdf][Click to enlarge plot]] |" % (plotname,label,zoomstring,zoomdir,plotname,label,zoomstring, label, zoomtitle,zoomdir,plotname,label,zoomstring))
166 
167  if "Rloc" in plotname and "x_vs" in plotname and not "cos" in plotname:
168  print("| <img alt=\"HGCal_%s%s%s.png\" height=\"300\" width=\"550\" src=\"http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.png\" /> | The plot on the left shows the 2D profile histogram for *%s* %s that displays the local mean value of the material budget in units of radiation length in each R-z cell. R-z cell is 1 cm x 1 mm. The plot depicts the local material budget as seen by the track, as the track travels throughout the detector.[[http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.pdf][Click to enlarge plot]] |" % (plotname,label,zoomstring,zoomdir,plotname,label,zoomstring, label, zoomtitle,zoomdir,plotname,label,zoomstring))
169 
170  if "Rloc" in plotname and "l_vs" in plotname and not "cos" in plotname:
171  print("| <img alt=\"HGCal_%s%s%s.png\" height=\"300\" width=\"550\" src=\"http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.png\" /> | The plot on the left shows the 2D profile histogram for *%s* %s that displays the local mean value of the material budget in units of interaction length in each R-z cell. R-z cell is 1 cm x 1 mm. The plot depicts the local material budget as seen by the track, as the track travels throughout the detector.[[http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.pdf][Click to enlarge plot]] |" % (plotname,label,zoomstring,zoomdir,plotname,label,zoomstring, label, zoomtitle,zoomdir,plotname,label,zoomstring))
172 
173  #Here again for the closing of the hide button
174  if plotname == "l_vs_z_vs_Rloc":
175  print("%ENDTWISTY%")
176 
177  """
178  I won't put the local cos plots for now, only the sum cos above
179  if "Rloccos" in plotname and "x_vs" in plotname:
180  print "| <img alt=\"HGCal_%s%s%s.png\" height=\"300\" width=\"550\" src=\"http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.png\" /> | The plot on the left shows the 2D profile histogram for *%s* %s that displays the local mean value of the material budget in units of radiation length in each R-z cell. R-z cell is 1 cm x 1 mm. The plot depicts the orthogonal accumulated material budget, that is cos(theta) what the track sees.[[http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.pdf][Click to enlarge plot]] |" % (plotname,label,zoomstring,zoomdir,plotname,label,zoomstring, label, zoomtitle,zoomdir,plotname,label,zoomstring)
181 
182  if "Rloccos" in plotname and "l_vs" in plotname:
183  print "| <img alt=\"HGCal_%s%s%s.png\" height=\"300\" width=\"550\" src=\"http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.png\" /> | The plot on the left shows the 2D profile histogram for *%s* %s that displays the local mean value of the material budget in units of interaction length in each R-z cell. R-z cell is 1 cm x 1 mm. The plot depicts the orthogonal accumulated material budget, that is cos(theta) what the track sees.[[http://apsallid.web.cern.ch/apsallid/HGCalMaterial/%sHGCal_%s%s%s.pdf][Click to enlarge plot]] |" % (plotname,label,zoomstring,zoomdir,plotname,label,zoomstring, label, zoomtitle,zoomdir,plotname,label,zoomstring)
184  """
185 
187  NRGBs = 7
188  NCont = 100
189  ncolors = array('i', [])
190  gStyle.SetNumberContours(NCont);
191  stops = [ 0.00, 0.10, 0.25, 0.45, 0.60, 0.75, 1.00 ]
192  red = [ 1.00, 0.00, 0.00, 0.00, 0.97, 0.97, 0.10 ]
193  green = [ 1.00, 0.97, 0.30, 0.40, 0.97, 0.00, 0.00 ]
194  blue = [ 1.00, 0.97, 0.97, 0.00, 0.00, 0.00, 0.00 ]
195  stopsArray = array('d', stops)
196  redArray = array('d', red)
197  greenArray = array('d', green)
198  blueArray = array('d', blue)
199  first_color_number = TColor.CreateGradientColorTable(NRGBs, stopsArray, redArray, greenArray, blueArray, NCont);
200  gStyle.SetNumberContours(NCont)
201 
202 
203  palsize = NCont
204  palette = []
205  for i in range(palsize):
206  palette.append(first_color_number+i)
207  palarray = array('i',palette)
208 
209  gStyle.SetPalette(palsize,palarray)
210 
211 
212 #In MeV/mm
213 dEdx = OrderedDict()
214 #--------
215 #Some elements necessary to build our materials
216 dEdx['Fe'] = 1.143
217 dEdx['Mn'] = 1.062
218 dEdx['Cr'] = 1.046
219 dEdx['Ni'] = 1.307
220 dEdx['C'] = 0.3952
221 dEdx['0'] = 0. # 2.398E-04 -> essentially zero
222 dEdx['H'] = 0. #3.437E-05 -> essentially zero
223 dEdx['Br'] = 0. #9.814E-04 -> essentially zero
224 dEdx['W'] = 2.210
225 dEdx['Al'] = 0.4358
226 #--------
227 
228 dEdx['Copper'] = 1.257
229 #http://cmslxr.fnal.gov/source/Geometry/CMSCommonData/data/materials.xml#1996
230 dEdx['H_Scintillator'] = 0.91512109*dEdx['C'] + 0.084878906*dEdx['H']
231 dEdx['Silicon'] = 0.3876
232 #http://cmslxr.fnal.gov/source/Geometry/CMSCommonData/data/materials.xml#2730
233 dEdx['HGC_G10-FR4'] = 0.18077359*dEdx['Silicon'] + 0.4056325*dEdx['0'] + 0.27804208*dEdx['C'] + 0.068442752*dEdx['H'] + 0.067109079*dEdx['Br']
234 dEdx['Other'] = 0.
235 #http://cmslxr.fnal.gov/source/Geometry/CMSCommonData/data/materials.xml#0290
236 dEdx['Air'] = 0.
237 #http://cmslxr.fnal.gov/source/Geometry/CMSCommonData/data/materials.xml#3692
238 dEdx['StainlessSteel'] = 0.6996*dEdx['Fe']+0.01*dEdx['Mn']+0.19*dEdx['Cr']+0.1*dEdx['Ni']+0.0004*dEdx['C'];
239 #http://cmslxr.fnal.gov/source/Geometry/CMSCommonData/data/materials.xml#0568
240 dEdx['WCu'] = 0.75*dEdx['W']+0.25*dEdx['Copper']
241 #--------
242 dEdx['Lead'] = 1.274 #Pb
243 dEdx['Epoxy'] = 0.53539691*dEdx['C'] + 0.13179314*dEdx['H'] + 0.33280996*dEdx['0']
244 dEdx['Kapton'] = 0.59985105*dEdx['C'] + 0.080541353*dEdx['H'] + 0.31960759*dEdx['0']
245 #Composition of cable as Sunanda uses them is here:
246 #http://cmslxr.fnal.gov/source/Geometry/CMSCommonData/data/materials.xml#2841
247 dEdx['Cables'] = 0.586*dEdx['Copper'] + 0.259*dEdx['C'] + 0.138*dEdx['0'] + 0.017*dEdx['H']
248 
249 #In mm
250 MatXo = OrderedDict()
251 MatXo['Copper'] = 14.3559
252 MatXo['H_Scintillator'] = 425.393
253 MatXo['Cables'] = 66.722
254 MatXo['HGC_G10-FR4'] = 175.056
255 MatXo['Silicon'] = 93.6762
256 MatXo['Other'] = 0.
257 MatXo['Air'] = 301522.
258 MatXo['StainlessSteel'] = 17.3555
259 MatXo['WCu'] = 5.1225
260 MatXo['Lead'] = 5.6118
261 MatXo['Epoxy'] = 315.901
262 MatXo['Kapton'] = 365.309
263 
265  """Function to draw the eta.
266  Function to draw the eta references on top of an already existing
267  TCanvas. The lines and labels drawn are collected inside a list and
268  the list is returned to the user to extend the live of the objects
269  contained, otherwise no lines and labels will be drawn, since they
270  will be garbage-collected as soon as this function returns.
271  """
272 
273  # Add eta labels
274  keep_alive = []
275  etas = [ 0.2*i for i in range(0,18) ]
276 
277  etax = 2850.#6850.
278  etay = 1240.#5200.
279  lineL = 110#8600.
280  offT = 10.
281 
282  for ieta in etas:
283  th = 2*atan(exp(-ieta))
284  talign = 21
285 
286  #IP
287  lineh = TLine(-20.,0.,20.,0.)
288  lineh.Draw()
289  linev = TLine(0.,-10.,0.,10.)
290  linev.Draw()
291  keep_alive.append(lineh)
292  keep_alive.append(linev)
293 
294  x1 = 0
295  y1 = 0
296  if ieta>-1.6 and ieta<1.6:
297  x1 = etay/tan(th)
298  y1 = etay
299  elif ieta <=-1.6:
300  x1 = -etax
301  y1 = -etax*tan(th)
302  talign = 11
303  elif ieta>=1.6:
304  x1 = etax
305  y1 = etax*tan(th)
306  talign = 31
307  x2 = x1+lineL*cos(th)
308  y2 = y1+lineL*sin(th)
309  xt = x2
310  yt = y2+offT
311 
312  line1 = TLine(x1,y1,x2,y2)
313  line1.Draw()
314  keep_alive.append(line1)
315 
316  text = "%3.1f" % ieta
317  t1 = TLatex(xt, yt, '%s' % ('#eta = 0' if ieta == 0 else text))
318  t1.SetTextSize(0.03)
319  t1.SetTextAlign(talign)
320  t1.Draw()
321  keep_alive.append(t1)
322  return keep_alive
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
def TwikiPrintout(plotname, label, zoom)