4 from __future__
import print_function
12 from importlib
import import_module
13 from argparse
import ArgumentParser, RawTextHelpFormatter
16 import pluginCondDBV2PyInterface
17 pluginCondDBV2PyInterface.CMSSWInit()
23 Temporarily disables stdout and stderr so that printouts from the plot 24 plugin does not compromise the purity of our ssh stream if 25 args.suppress_output is true 27 def decorated( *fargs, **fkwargs ):
29 suppress = args.suppress_output
36 saved_stdout = os.dup( 1 )
37 saved_stderr = os.dup( 2 )
40 devnull = os.open(
'/dev/null', os.O_WRONLY )
47 result =
f( *fargs, **fkwargs )
55 os.dup2( saved_stdout, 1 )
56 os.dup2( saved_stderr, 2 )
65 ''' Deserializes given iovs data and returns plot coordinates ''' 67 output(
'Starting to deserialize iovs: ',
'')
69 output(
'plugin name: ', plugin_name)
70 output(
'plot name: ', plot_name)
72 output(
'tag time type: ', time_type)
75 plugin_base = import_module(
'pluginModule_PayloadInspector')
76 output(
'PI plugin base: ', plugin_base)
78 plugin_obj = import_module(plugin_name)
79 output(
'PI plugin object: ', plugin_obj)
82 plot = getattr(plugin_obj, plot_name)()
83 output(
'plot object: ', plot)
86 db_name =
'frontier://FrontierProd/CMS_CONDITIONS' 88 db_name =
'frontier://FrontierPrep/CMS_CONDITIONS' 92 output(
'full DB name: ', db_name)
95 success = plot.process(db_name, tag, time_type,
int(iovs[
'start_iov']),
int(iovs[
'end_iov']))
96 output(
'plot processed data successfully: ', success)
102 output(
'deserialized data: ', result)
106 ''' Deserializes given iovs data and returns plot coordinates ''' 110 output(
'Starting to deserialize iovs: ',
'')
112 output(
'plugin name: ', plugin_name)
113 output(
'plot name: ', plot_name)
115 output(
'tagtwo name: ', tagtwo)
118 output(
'iovstwo: ', iovstwo)
120 plugin_base = import_module(
'pluginModule_PayloadInspector')
121 output(
'PI plugin base: ', plugin_base)
123 plugin_obj = import_module(plugin_name)
124 output(
'PI plugin object: ', plugin_obj)
127 plot = getattr(plugin_obj, plot_name)()
128 output(
'plot object: ', plot)
130 db_name =
'oracle://cms_orcon_adg/CMS_CONDITIONS' if db ==
'Prod' else 'oracle://cms_orcoff_prep/CMS_CONDITIONS' 131 output(
'full DB name: ', db_name)
134 success = plot.processTwoTags(db_name, tag,tagtwo,
int(iovs[
'start_iov']),
int(iovstwo[
'end_iov']))
136 output(
'plot processed data successfully: ', success)
142 output(
'deserialized data: ', result)
146 ''' Returns a list of Payload Inspector plugin names 148 ['pluginBasicPayload_PayloadInspector', 'pluginBeamSpot_PayloadInspector', 'pluginSiStrip_PayloadInspector'] 150 architecture = os.environ.get(
'SCRAM_ARCH',
None)
151 output(
'architecture: ', architecture)
155 os.environ.get(
'CMSSW_BASE',
None),
156 os.environ.get(
'CMSSW_RELEASE_BASE',
None)
163 path = os.path.join(r,
'lib', architecture)
164 output(
'* full release path: ', path)
166 plugins += glob.glob(path +
'/plugin*_PayloadInspector.so' )
167 output(
'found plugins: ', plugins)
176 result.append(p.split(
'/')[-1].
replace(
'.so',
''))
178 output(
'discovered plugins: ', result)
182 ''' Discovers object types and plots for a given cmssw release 186 {"plot": "plot_BeamSpot_x", "plot_type": "History", 187 "single_iov": false, "plugin_name": "pluginBeamSpot_PayloadInspector", 188 "title": "x vs run number"}, 194 plugin_base = import_module(
'pluginModule_PayloadInspector')
197 output(
' - plugin name: ', plugin_name)
198 plugin_obj = import_module(plugin_name)
199 output(
'*** PI plugin object: ', plugin_obj)
200 for plot
in dir(plugin_obj):
201 if 'plot_' not in plot:
continue 202 output(
' - plot name: ', plot)
203 plot_method= getattr(plugin_obj, plot)()
204 output(
' - plot object: ', plot_method)
205 payload_type = plot_method.payloadType()
206 output(
' - payload type: ', payload_type)
207 plot_title = plot_method.title()
208 output(
' - plot title: ', plot_title)
209 plot_type = plot_method.type()
210 output(
' - plot type: ', plot_type)
211 single_iov = plot_method.isSingleIov()
212 output(
' - is single iov: ', single_iov)
213 two_tags = plot_method.isTwoTags()
214 output(
' - is Two Tags: ', two_tags)
215 result.setdefault(payload_type, []).
append({
'plot': plot,
'plugin_name': plugin_name,
'title': plot_title,
'plot_type': plot_type,
'single_iov': single_iov,
'two_tags': two_tags})
216 output(
'currently discovered info: ', result)
217 output(
'*** final output:',
'')
218 return json.dumps(result)
223 print(description, param)
225 if __name__ ==
'__main__':
228 Payload Inspector - data visualisation tool which is integrated into the cmsDbBrowser. 229 It allows to display plots and monitor the calibration and alignment data. 231 You can access Payload Inspector with a link below: 232 https://cms-conddb.cern.ch/cmsDbBrowser/payload_inspector/Prod 234 This script is a part of the Payload Inspector service and is responsible for: 235 a) discovering PI objects that are available in a given cmssw release 236 b) deserializing payload data which is later used as plot coordinates 237 c) testing new PI objects which are under development 239 To test new PI objects please do the following: 240 a) run ./getPayloadData.py --discover 241 to check if your newly created object is found by the script. 242 Please note that we strongly rely on naming conventions so if you don't 243 see your object listed you probably misnamed it in objectType() method. 244 Also all plot methods should start with "plot_" prefix. 246 b) second step is to test if it returns data correctly: 247 run ./getPayloadData.py --plugin YourPIPluginName --plot YourObjectPlot --tag tagName --time_type Run --iovs '{"start_iov": "201", "end_iov": "801"}' --db Prod --test 249 Here is an example for BasicPayload object: 250 run ./getPayloadData.py --plugin pluginBasicPayload_PayloadInspector --plot plot_BasicPayload_data0 --tag BasicPayload_v2 --time_type Run --iovs '{"start_iov": "201", "end_iov": "801"}' --db Prod --test 252 c) if it works correctly please make a pull request and once it's accepted 253 go to cmsDbBrowser and wait for the next IB to test it. 256 parser = ArgumentParser(description=description, formatter_class=RawTextHelpFormatter)
257 parser.add_argument(
"-d",
"--discover", help=
"discovers object types and plots \nfor a given cmssw release", action=
"store_true")
258 parser.add_argument(
"-i",
"--iovs", help=
"deserializes given iovs data encoded in base64 and returns plot coordinates also encoded in base64")
259 parser.add_argument(
"-i2",
"--iovstwo", help=
"deserializes given iovs data encoded in base64 and returns plot coordinates also encoded in base64")
260 parser.add_argument(
"-o",
"--plugin", help=
"Payload Inspector plugin name needed for iovs deserialization")
261 parser.add_argument(
"-p",
"--plot", help=
"plot name needed for iovs deserialization")
262 parser.add_argument(
"-t",
"--tag", help=
"tag name needed for iovs deserialization")
263 parser.add_argument(
"-t2",
"--tagtwo", help=
"tag name needed for iovs deserialization")
264 parser.add_argument(
"-tt",
"--time_type", help=
"tag time type name needed for iovs deserialization")
265 parser.add_argument(
"-b",
"--db", help=
"db (Prod or Prep) needed for iovs deserialization")
266 parser.add_argument(
"-test",
"--test", help=
"add this flag if you want to test the deserialization function and want to see a readable output", action=
"store_true")
267 parser.add_argument(
"-v",
"--verbose", help=
"verbose mode. Shows more information", action=
"store_true")
268 parser.add_argument(
"-ip",
"--image_plot", help=
"Switch telling the script that this plot type is of type Image", action=
"store_true")
269 parser.add_argument(
"-s",
"--suppress-output", help=
"Supresses output from so that stdout and stderr can be kept pure for the ssh transmission", action=
"store_true")
272 if len(sys.argv) == 1:
276 args = parser.parse_args()
289 a=json.loads(args.iovs)
291 b=json.loads(args.iovstwo)
296 os.write( 1, json.dumps( json.loads( result ), indent=4 ))
300 filename = json.loads( result )[
'file']
302 except ValueError
as e:
303 os.write( 2,
'Value error when getting image name: %s\n' %
str( e ))
304 except KeyError
as e:
305 os.write( 2,
'Key error when getting image name: %s\n' %
str( e ))
307 if not filename
or not os.path.isfile( filename ):
308 os.write( 2,
'Error: Generated image file (%s) not found\n' % filename )
311 with open( filename,
'r' ) as f: 312 shutil.copyfileobj( f, sys.stdout ) 314 os.write( 2,
'IO error when streaming image: %s' %
str( e ))
316 os.remove( filename )
321 result =
deserialize_iovs(args.db, args.plugin, args.plot, args.tag, args.time_type, json.loads(args.iovs))
325 os.write( 1, json.dumps( json.loads( result ), indent=4 ))
328 elif args.image_plot:
333 filename = json.loads( result )[
'file']
335 except ValueError, e:
336 os.write( 2,
'Value error when getting image name: %s\n' %
str( e ))
338 os.write( 2,
'Key error when getting image name: %s\n' %
str( e ))
340 if not filename
or not os.path.isfile( filename ):
341 os.write( 2,
'Error: Generated image file (%s) not found\n' % filename )
344 with open( filename,
'r' ) as f: 345 shutil.copyfileobj( f, sys.stdout ) 347 os.write( 2,
'IO error when streaming image: %s' %
str( e ))
349 os.remove( filename )
354 os.write( 1, result.encode(
'base64' ))
def output(description, param)
def replace(string, replacements)
S & print(S &os, JobReport::InputFile const &f)
def deserialize_twoiovs(db, plugin_name, plot_name, tag, tagtwo, iovs, iovstwo)
def deserialize_iovs(db, plugin_name, plot_name, tag, time_type, iovs)