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