ATLAS Offline Software
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
MyPlots.MyPlots Class Reference
Inheritance diagram for MyPlots.MyPlots:
Collaboration diagram for MyPlots.MyPlots:

Public Member Functions

def __init__ (self)
 
def content (self, **args)
 
def configure (self)
 
def pageName (self)
 
def addPage (self, name, page, **attrs)
 
def addLink (self, name, alias, **attrs)
 
def addToPageHeader (self, snippet)
 
def index (self, **args)
 
def configureLinks (self)
 
def override (self)
 
def header (self, **args)
 
def navigation (self, **args)
 
def footer (self, **args)
 

Public Attributes

 pageConfig
 
 globalConfig
 
 isConfigured
 

Static Public Attributes

 exposed
 

Detailed Description

Definition at line 57 of file MyPlots.py.

Constructor & Destructor Documentation

◆ __init__()

def MyPlots.MyPlots.__init__ (   self)

Definition at line 59 of file MyPlots.py.

59  def __init__(self):
60  BeamSpotWebPage.__init__(self)
61  self.pageConfig['pageTitle'] = 'ATLAS Beam Spot Plots'
62 

Member Function Documentation

◆ addLink()

def WebPage.WebPage.addLink (   self,
  name,
  alias,
**  attrs 
)
inherited
Add a new link to the page tree. Links share page objects with
   other pages through aliasing. This allows using different links
   with different queries to the same page as if they were separate
   pages. For links, highlighting of the current page is disabled
   (if enabled, all links leading to the same page would be
   highlighted).

Definition at line 309 of file WebPage.py.

309  def addLink(self, name, alias, **attrs):
310  """Add a new link to the page tree. Links share page objects with
311  other pages through aliasing. This allows using different links
312  with different queries to the same page as if they were separate
313  pages. For links, highlighting of the current page is disabled
314  (if enabled, all links leading to the same page would be
315  highlighted)."""
316  self.globalConfig.pageList.append(name)
317  self.globalConfig.pageAttributes[name] = dict(attrs)
318  self.globalConfig.pageAttributes[name]['alias'] = alias
319 

◆ addPage()

def WebPage.WebPage.addPage (   self,
  name,
  page,
**  attrs 
)
inherited
Add a new web page to the page tree. All pages added via addPage
   share the same GlobalConfiguration object.

Definition at line 300 of file WebPage.py.

300  def addPage(self, name, page, **attrs):
301  """Add a new web page to the page tree. All pages added via addPage
302  share the same GlobalConfiguration object."""
303  page.globalConfig = self.globalConfig
304  page.pageConfig['pageName'] = name
305  self.globalConfig.pageList.append(name)
306  self.globalConfig.pageAttributes[name] = dict(attrs)
307  setattr(self,name,page) # Link page into page tree (for CherryPy)
308 

◆ addToPageHeader()

def WebPage.WebPage.addToPageHeader (   self,
  snippet 
)
inherited
Add a snippet of code to the page header. Use this e.g. to include JavaScript libraries.

Definition at line 320 of file WebPage.py.

320  def addToPageHeader(self, snippet):
321  """Add a snippet of code to the page header. Use this e.g. to include JavaScript libraries."""
322  self.pageConfig['pageHeaderSnippets'] += snippet
323 

◆ configure()

def BeamSpotWebPage.BeamSpotWebPage.configure (   self)
inherited
Final configuration of web application after all data is initialized.

Reimplemented from WebPage.WebPage.

Definition at line 49 of file BeamSpotWebPage.py.

49  def configure(self):
50  self.pageConfig['cssName'] = self.globalConfig.baseUrl+'/css/beamspot.css'
51  if not self.pageConfig.get('pageTitle',''):
52  self.pageConfig['pageTitle'] = 'ATLAS Beam Spot Web Page'
53  self.pageConfig['header'] = header
54  self.pageConfig['footer'] = footer
55  WebPage.configure(self)
56 
57 

◆ configureLinks()

def WebPage.WebPage.configureLinks (   self)
inherited
Based on configuration data, for each web page create two link entries in pageConfig:
   The first entry has the form url_PAGENAME and contains the complete URL to link to
   a page. The second entry is named href_PAGENAME and contains style information and a
   href= prefix with proper quotation marks in addition to the URL. These link entries
   should be used to generate links in HTML pages with snippets like <a %(href_PAGENAME)s>
   or <a href="%(url_PAGENAME)>. The link entries can only be generated once all
   configuration data is available, ie configureLinks must be called from configure
   and not from __init__.

Definition at line 353 of file WebPage.py.

353  def configureLinks(self):
354  """Based on configuration data, for each web page create two link entries in pageConfig:
355  The first entry has the form url_PAGENAME and contains the complete URL to link to
356  a page. The second entry is named href_PAGENAME and contains style information and a
357  href= prefix with proper quotation marks in addition to the URL. These link entries
358  should be used to generate links in HTML pages with snippets like <a %(href_PAGENAME)s>
359  or <a href="%(url_PAGENAME)>. The link entries can only be generated once all
360  configuration data is available, ie configureLinks must be called from configure
361  and not from __init__."""
362  for p in self.globalConfig.pageList:
363  page = self.globalConfig.pageAttributes[p].get('alias',p)
364  query = self.globalConfig.pageAttributes[p].get('query','')
365  style = self.globalConfig.pageAttributes[p].get('style',None)
366  self.pageConfig['url_'+p] = '%s/%s/%s' % (self.globalConfig.baseUrl,page,query)
367  if p==self.pageName():
368  self.pageConfig['href_'+p] = 'href="%s/%s/%s" class="%s"' % (self.globalConfig.baseUrl,page,query,self.pageConfig['css_currentLink'])
369  else:
370  if style:
371  self.pageConfig['href_'+p] = 'href="%s/%s/%s" class="%s"' % (self.globalConfig.baseUrl,page,query,style)
372  else:
373  self.pageConfig['href_'+p] = 'href="%s/%s/%s"' % (self.globalConfig.baseUrl,page,query)
374 

◆ content()

def MyPlots.MyPlots.content (   self,
**  args 
)
Generate the page content. Default value comes from self.pageConfig['content'].

Reimplemented from WebPage.WebPage.

Definition at line 63 of file MyPlots.py.

63  def content(self,**args):
64 
65  # Configuration and defaults
66  ntDir = self.globalConfig['ntDir']
67  periodDir = ntDir+'/DataPeriods'
68  cmd = self.globalConfig['wwwDir']+'/run-beamspotnt.sh'
69  if not os.path.exists(cmd):
70  return error('Configuration error: %s does not exist or unreadable' % cmd)
71  if not 'plotType' in args:
72  args['plotType'] = 'plot'
73 
74  # Start form
75  form = htmlPara('Select data and what to plot:', attr = 'class ="example"')
76 
77  # Project tag selection
78  projectList = sorted([ os.path.basename(p) for p in glob.glob(periodDir+'/data*')])
79  form += htmlSelect('Project tag','project', args, projectList, 'all data',
80  attr = 'onchange = "this.form.submit()"')
81 
82  # Period selection (only if project selected)
83  if 'project' in args and args['project']:
84  periodList = glob.glob(periodDir+'/'+args['project']+'/*')
85  periodList = sorted([ os.path.basename(p)[:-10] for p in periodList ])
86  if 'AllYear' in periodList:
87  periodList.remove('AllYear')
88  periodList.insert(0,'AllYear')
89  if not 'period' in args and periodList:
90  args['period'] = periodList[0]
91  form += htmlSelect('Period','period', args, periodList, attr='multiple size=5')
92 
93  # Fill and run number selection (only if no project selected)
94  if not args.get('project'):
95  form += htmlTextInput('or select fill', 'fillnr', args,6,6)
96  form += htmlTextInput('or run', 'runnr', args,6,6)
97 
98  # Ntuple selection
99  form += htmlPara()
100  form += htmlSelect('Ntuple', 'nt', args,
101  ['initial T0 processing::t0/beamspotnt-IndetBeampos-ES1-UPD2.root',
102  'latest data from COOL::cool/beamspotnt-COOL-Current.root'])
103 
104  # Plot type selection
105  form += htmlPara()
106  form += htmlSelect('Type of plot','plotType', args,
107  ['time evolution::plot', 'summary (slow)::summary', 'histogram::hist'],
108  attr = 'onchange = "this.form.submit()"')
109 
110  # Plot variable selection (except for summary plot)
111  if args['plotType']!='summary':
112  form += htmlSelect('for','varName', args,
113  ['posX','posY','posZ','sigmaX','sigmaY','sigmaZ','tiltX','tiltY','rhoXY','k'])
114 
115  # Plot options
116  form += htmlPara('Options:', attr='class ="example"')
117  if args['plotType']!='hist':
118  form += htmlCheckbox('Use LB instead of time on x axis','lbaxis',args)
119  form += htmlCheckbox('Predefined axis range','ydef', args)
120  form += htmlPara()
121  form += htmlTextInput('y axis scale expansion factor','yscale',args,6,6)
122  if args['plotType']=='plot':
123  form += htmlPara()
124  form += htmlTextInput('y axis minimum','ymin',args,6,6)
125  form += htmlTextInput('y axis maximum','ymax',args,6,6)
126  else:
127  form += htmlTextInput('x axis minimum','xmin',args,6,6)
128  form += htmlTextInput('x axis maximum','xmax',args,6,6)
129  form += htmlPara()
130  form += htmlCheckbox('Log y axis', 'logy', args)
131 
132  # Command line output option and submit button
133  form += htmlPara('Generate plot (depending on what parameters you choose, this may take a while.. please be patient):', attr='class ="example"')
134  form += htmlCheckbox('Show command line output','verbose',args)
135  form += htmlSubmit('Plot', 'doplot', attr = 'class="submit"')
136 
137  # Render selection form
138  page = htmlForm(form, attr='class="params"')
139 
140  # Output parameters for debugging
141  if 'debug' in args:
142  page += escape(str(args))
143 
144  # Plotting
145  if 'doplot' in args:
146 
147  # Unique file name
148  t = time.time()
149  ms = 1000.*(t-floor(t))
150  varName = args.get('varName', 'all')
151  baseName = 'beamspot-%s-%s' % (args['plotType'], varName)
152  baseName = time.strftime(baseName+'-%Y%m%d-%H%M%S',time.localtime())
153  baseName += '%03i' % ms
154 
155  # Assemble command and execute
156  cmd += ' -b'
157  cmd += ' -f %s/%s' % (ntDir,args['nt'])
158  cmd += ' -o %s/tmp/%s.gif,%s/tmp/%s.eps,%s/tmp/%s.pdf' % (self.globalConfig['wwwDir'],baseName,
159  self.globalConfig['wwwDir'],baseName,
160  self.globalConfig['wwwDir'],baseName)
161  if args.get('project'):
162  # NOTE: due to the defaults above, period will always be in args
163  selPeriodList = args['period'] if isinstance(args['period'],list) else [args['period']]
164  selPeriodString = ','.join([args['project']+'.'+p for p in selPeriodList])
165  cmd += ' --perioddef %s --period %s' % (periodDir,selPeriodString)
166  if args.get('fillnr'):
167  try:
168  cmd += ' --fill %i' % int(args['fillnr'])
169  except:
170  return page+error('Fill number must be an integer')
171  if args.get('runnr'):
172  try:
173  cmd += ' --run %i' % int(args['runnr'])
174  except:
175  return page+error('Run number must be an integer')
176  if not 'lbaxis' in args:
177  cmd += ' --timeaxis'
178  if 'logy' in args:
179  cmd += ' --logy'
180  if 'ydef' in args:
181  cmd += ' --ydef'
182  if args.get('yscale','')!='':
183  try:
184  dummy = float(args['yscale'])
185  cmd += ' --yscale %s' % args['yscale']
186  except:
187  return page+error('y axis scale expansion factor must be a number')
188  if args.get('ymin','')!='':
189  try:
190  dummy = float(args['ymin'])
191  cmd += ' --ymin %s' % args['ymin']
192  except:
193  return page+error('y axis minimum must be a number')
194  if args.get('ymax','')!='':
195  try:
196  dummy = float(args['ymax'])
197  cmd += ' --ymax %s' % args['ymax']
198  except:
199  return page+error('y axis maximum must be a number')
200  if args.get('xmin','')!='':
201  try:
202  dummy = float(args['xmin'])
203  cmd += ' --xmin %s' % args['xmin']
204  except:
205  return page+error('x axis minimum must be a number')
206  if args.get('xmax','')!='':
207  try:
208  dummy = float(args['xmax'])
209  cmd += ' --xmax %s' % args['xmax']
210  except:
211  return page+error('x axis maximum must be a number')
212  if args['plotType']=='summary':
213  cmd += ' summary'
214  else:
215  cmd += ' %s %s' % (args['plotType'], args['varName'])
216  (status,output) = subprocess.getstatusoutput(cmd)
217 
218  # Plot
219  if not status:
220  imageUrl = '%s/tmp/%s.gif' % (self.globalConfig.baseUrl,baseName)
221  epsUrl = '%s/tmp/%s.eps' % (self.globalConfig.baseUrl,baseName)
222  pdfUrl = '%s/tmp/%s.pdf' % (self.globalConfig.baseUrl,baseName)
223  page += image % (imageUrl,epsUrl,pdfUrl,imageUrl)
224 
225  # Command line output
226  if status or ('verbose' in args):
227  page += cmdoutput % (escape(cmd),status,escape(output))
228 
229  return page
230 
231 
232 # Code to test or run locally

◆ footer()

def WebPage.WebPage.footer (   self,
**  args 
)
inherited
Generate the footer. Default value comes from self.pageConfig['footer'].

Definition at line 395 of file WebPage.py.

395  def footer(self, **args):
396  """Generate the footer. Default value comes from self.pageConfig['footer']."""
397  return self.pageConfig['footer'] % self.pageConfig
398 
399 
400 # Example configuration file on how to run CherryPy with Apache mod_python:
401 #
402 # <Location "/">
403 # PythonPath "sys.path+['/whatever']"
404 # SetHandler python-program
405 # PythonHandler cherrypy._cpmodpy::handler
406 # PythonOption cherrypy.setup WebPage::setup_server
407 # PythonDebug On
408 # </Location>
409 #
410 #import cherrypy
411 #def setup_server():
412 # cherrypy.config.update({'environment': 'production',
413 # 'log.screen': False,
414 # 'server.socket_host': '127.0.0.1',
415 # 'log.error_file': '/tmp/site.log',
416 # 'show_tracebacks': False})
417 # cherrypy.tree.mount(WebPage())
418 
419 
420 # Test code

◆ header()

def WebPage.WebPage.header (   self,
**  args 
)
inherited
Generate the page header. Default value comes from self.pageConfig['header'].

Definition at line 383 of file WebPage.py.

383  def header(self, **args):
384  """Generate the page header. Default value comes from self.pageConfig['header']."""
385  return self.pageConfig['header'] % self.pageConfig
386 

◆ index()

def WebPage.WebPage.index (   self,
**  args 
)
inherited
Return the complete page.

Definition at line 324 of file WebPage.py.

324  def index(self, **args):
325  """Return the complete page."""
326  if not self.isConfigured:
327  self.configure()
328  s = self.override()
329  if not s:
330  self.pageConfig['timeStamp'] = time.strftime('%a %b %d %X %Z %Y')
331  contents = self.content(**args) # Make sure contents is run first (so it
332  # can change any pageConfig entries if desired
333  s = startPage % self.pageConfig
334  s = s + htmlDiv('header', self.header(**args),
335  keepEmptyDiv=self.pageConfig['keepEmptyHeader'])
336  s = s + htmlDiv('navigation', self.navigation(**args),
337  keepEmptyDiv=self.pageConfig['keepEmptyNavigation'])
338  s = s + htmlDiv('content', contents,
339  keepEmptyDiv=self.pageConfig['keepEmptyContent'])
340  s = s + htmlDiv('footer', self.footer(**args),
341  keepEmptyDiv=self.pageConfig['keepEmptyFooter'])
342  s = s + endPage
343  return s

◆ navigation()

def WebPage.WebPage.navigation (   self,
**  args 
)
inherited
Generate the navigation bar. Default value comes from self.pageConfig['navigation'].

Definition at line 387 of file WebPage.py.

387  def navigation(self, **args):
388  """Generate the navigation bar. Default value comes from self.pageConfig['navigation']."""
389  return self.pageConfig['navigation'] % self.pageConfig
390 

◆ override()

def WebPage.WebPage.override (   self)
inherited
Override provides a hook where code to generate or redirect to an alternative
   page can be placed by derived classes. If not override of the normal page is
   desired, override should return None. Otherwise it should either raise an
   appropriate exception or return a string containing the complete alternate page
   to display.

Definition at line 375 of file WebPage.py.

375  def override(self):
376  """Override provides a hook where code to generate or redirect to an alternative
377  page can be placed by derived classes. If not override of the normal page is
378  desired, override should return None. Otherwise it should either raise an
379  appropriate exception or return a string containing the complete alternate page
380  to display."""
381  return None
382 

◆ pageName()

def WebPage.WebPage.pageName (   self)
inherited
Short cut to retrieve the name (the last element in the URL)
   of the current page. This works only if the page has been
   added into the page tree using addPage.

Definition at line 294 of file WebPage.py.

294  def pageName(self):
295  """Short cut to retrieve the name (the last element in the URL)
296  of the current page. This works only if the page has been
297  added into the page tree using addPage."""
298  return self.pageConfig['pageName']
299 

Member Data Documentation

◆ exposed

WebPage.WebPage.exposed
staticinherited

Definition at line 345 of file WebPage.py.

◆ globalConfig

WebPage.WebPage.globalConfig
inherited

Definition at line 290 of file WebPage.py.

◆ isConfigured

WebPage.WebPage.isConfigured
inherited

Definition at line 291 of file WebPage.py.

◆ pageConfig

WebPage.WebPage.pageConfig
inherited

Definition at line 273 of file WebPage.py.


The documentation for this class was generated from the following file:
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
WebPage.htmlForm
def htmlForm(contents, action='', method='post', attr='')
Definition: WebPage.py:168
configure
bool configure(asg::AnaToolHandle< ITrigGlobalEfficiencyCorrectionTool > &tool, ToolHandleArray< IAsgElectronEfficiencyCorrectionTool > &electronEffToolsHandles, ToolHandleArray< IAsgElectronEfficiencyCorrectionTool > &electronSFToolsHandles, ToolHandleArray< CP::IMuonTriggerScaleFactors > &muonToolsHandles, ToolHandleArray< IAsgPhotonEfficiencyCorrectionTool > &photonEffToolsHandles, ToolHandleArray< IAsgPhotonEfficiencyCorrectionTool > &photonSFToolsHandles, const std::string &triggers, const std::map< std::string, std::string > &legsPerTool, unsigned long nToys, bool debug)
Definition: TrigGlobEffCorrValidation.cxx:514
BeamSpotWebPage.footer
string footer
Definition: BeamSpotWebPage.py:32
WebPage.htmlPara
def htmlPara(text='', attr='', escapeText=False)
Definition: WebPage.py:70
grepfile.content
string content
Definition: grepfile.py:56
DeMoGenerateWWW.addLink
def addLink(l)
When https is found in a character line, add a link in html If none, simply return the line unchanged...
Definition: DeMoGenerateWWW.py:68
WebPage.htmlTextInput
def htmlTextInput(labelText, parName, args, size=None, maxLength=None, labelAttr='', attr='')
Definition: WebPage.py:213
WebPage.htmlCheckbox
def htmlCheckbox(labelText, parName, args, labelAttr='', attr='')
Definition: WebPage.py:206
WebPage.htmlDiv
def htmlDiv(id, contents='', attr='', keepEmptyDiv=True)
Definition: WebPage.py:46
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename T::value_type > sorted(T begin, T end)
Helper function to create a sorted vector from an unsorted one.
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
python.processes.powheg.ZZ.ZZ.__init__
def __init__(self, base_directory, **kwargs)
Constructor: all process options are set here.
Definition: ZZ.py:18
DeMoScan.index
string index
Definition: DeMoScan.py:364
WebPage.htmlSelect
def htmlSelect(labelText, parName, args, choiceList, hint=None, descriptionSeparator='::', labelAttr='', attr='')
Definition: WebPage.py:183
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:127
str
Definition: BTagTrackIpAccessor.cxx:11
makeTOC.header
header
Definition: makeTOC.py:28
error
Definition: IImpactPoint3dEstimator.h:70
readCCLHist.float
float
Definition: readCCLHist.py:83
WebPage.htmlSubmit
def htmlSubmit(text, parName, attr='', onlyOnce=False)
Definition: WebPage.py:227