4 from __future__
import print_function
13 from importlib
import import_module
14 from argparse
import ArgumentParser, RawTextHelpFormatter
17 import pluginCondDBV2PyInterface
18 pluginCondDBV2PyInterface.CMSSWInit()
24 Temporarily disables stdout and stderr so that printouts from the plot
25 plugin does not compromise the purity of our ssh stream if
26 args.suppress_output is true
28 def decorated( *fargs, **fkwargs ):
30 suppress = args.suppress_output
37 saved_stdout = os.dup( 1 )
38 saved_stderr = os.dup( 2 )
41 devnull = os.open(
'/dev/null', os.O_WRONLY )
48 result =
f( *fargs, **fkwargs )
56 os.dup2( saved_stdout, 1 )
57 os.dup2( saved_stderr, 2 )
66 ''' Deserializes given iovs data and returns plot coordinates '''
68 output(
'Starting to deserialize iovs: ',
'')
70 output(
'plugin name: ', plugin_name)
71 output(
'plot name: ', plot_name)
73 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)
94 if input_params
is not None:
95 plot.setInputParamValues( input_params )
97 modv = getattr(plugin_base,
'ModuleVersion')
100 if modv.label ==
'1.0':
102 success = plot.process(db_name, tags[0][0], time_type,
int(tags[0][1]),
int(tags[0][2]) )
104 success = plot.processTwoTags(db_name, tags[0][0], tags[1][0],
int(tags[0][1]),
int(tags[1][1]) )
105 elif modv.label ==
'2.0':
106 success = plot.process(db_name, tags)
108 output(
'plot processed data successfully: ', success)
113 output(
'deserialized data: ', result)
117 ''' Returns a list of Payload Inspector plugin names
119 ['pluginBasicPayload_PayloadInspector', 'pluginBeamSpot_PayloadInspector', 'pluginSiStrip_PayloadInspector']
121 architecture = os.environ.get(
'SCRAM_ARCH',
None)
122 output(
'architecture: ', architecture)
126 os.environ.get(
'CMSSW_BASE',
None),
127 os.environ.get(
'CMSSW_RELEASE_BASE',
None)
134 path = os.path.join(r,
'lib', architecture)
135 output(
'* full release path: ', path)
137 plugins += glob.glob(path +
'/plugin*_PayloadInspector.so' )
138 output(
'found plugins: ', plugins)
147 result.append(p.split(
'/')[-1].
replace(
'.so',
''))
149 output(
'discovered plugins: ', result)
153 ''' Discovers object types and plots for a given cmssw release
157 {"plot": "plot_BeamSpot_x", "plot_type": "History",
158 "single_iov": false, "plugin_name": "pluginBeamSpot_PayloadInspector",
159 "title": "x vs run number"},
165 plugin_base = import_module(
'pluginModule_PayloadInspector')
166 modv = getattr(plugin_base,
'ModuleVersion')
169 output(
' - plugin name: ', plugin_name)
170 plugin_obj = import_module(plugin_name)
171 output(
'*** PI plugin object: ', plugin_obj)
172 for plot
in dir(plugin_obj):
173 if 'plot_' not in plot:
continue
174 output(
' - plot name: ', plot)
175 plot_method= getattr(plugin_obj, plot)()
176 output(
' - plot object: ', plot_method)
177 payload_type = plot_method.payloadType()
178 output(
' - payload type: ', payload_type)
179 plot_title = plot_method.title()
180 output(
' - plot title: ', plot_title)
181 plot_type = plot_method.type()
182 output(
' - plot type: ', plot_type)
183 single_iov = plot_method.isSingleIov()
184 output(
' - is single iov: ', single_iov)
185 two_tags = plot_method.isTwoTags()
186 output(
' - is Two Tags: ', two_tags)
187 plot_dict = {
'plot': plot,
'plugin_name': plugin_name,
'title': plot_title,
'plot_type': plot_type,
'single_iov': single_iov,
'two_tags': two_tags }
192 result.setdefault(payload_type, []).
append( plot_dict )
193 output(
'currently discovered info: ', result)
194 output(
'*** final output:',
'')
195 return json.dumps(result)
200 print(description, param)
202 if __name__ ==
'__main__':
205 Payload Inspector - data visualisation tool which is integrated into the cmsDbBrowser.
206 It allows to display plots and monitor the calibration and alignment data.
208 You can access Payload Inspector with a link below:
209 https://cms-conddb.cern.ch/cmsDbBrowser/payload_inspector/Prod
211 This script is a part of the Payload Inspector service and is responsible for:
212 a) discovering PI objects that are available in a given cmssw release
213 b) deserializing payload data which is later used as plot coordinates
214 c) testing new PI objects which are under development
216 To test new PI objects please do the following:
217 a) run ./getPayloadData.py --discover
218 to check if your newly created object is found by the script.
219 Please note that we strongly rely on naming conventions so if you don't
220 see your object listed you probably misnamed it in objectType() method.
221 Also all plot methods should start with "plot_" prefix.
223 b) second step is to test if it returns data correctly:
224 run ./getPayloadData.py --plugin YourPIPluginName --plot YourObjectPlot --tag tagName --time_type Run --iovs '{"start_iov": "201", "end_iov": "801"}' --db Prod --test
226 Here is an example for BasicPayload object:
227 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
229 c) if it works correctly please make a pull request and once it's accepted
230 go to cmsDbBrowser and wait for the next IB to test it.
233 parser = ArgumentParser(description=description, formatter_class=RawTextHelpFormatter)
234 parser.add_argument(
"-d",
"--discover", help=
"discovers object types and plots \nfor a given cmssw release", action=
"store_true")
235 parser.add_argument(
"-i",
"--iovs", help=
"deserializes given iovs data encoded in base64 and returns plot coordinates also encoded in base64")
236 parser.add_argument(
"-i2",
"--iovstwo", help=
"deserializes given iovs data encoded in base64 and returns plot coordinates also encoded in base64")
237 parser.add_argument(
"-o",
"--plugin", help=
"Payload Inspector plugin name needed for iovs deserialization")
238 parser.add_argument(
"-p",
"--plot", help=
"plot name needed for iovs deserialization")
239 parser.add_argument(
"-t",
"--tag", help=
"tag name needed for iovs deserialization")
240 parser.add_argument(
"-t2",
"--tagtwo", help=
"tag name needed for iovs deserialization")
241 parser.add_argument(
"-tt",
"--time_type", help=
"tag time type name needed for iovs deserialization")
242 parser.add_argument(
"-b",
"--db", help=
"db (Prod or Prep) needed for iovs deserialization")
243 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")
244 parser.add_argument(
"-v",
"--verbose", help=
"verbose mode. Shows more information", action=
"store_true")
245 parser.add_argument(
"-ip",
"--image_plot", help=
"Switch telling the script that this plot type is of type Image", action=
"store_true")
246 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")
247 parser.add_argument(
"-is",
"--input_params", help=
"Plot input parameters ( dictionary, JSON serialized into string )" )
250 if len(sys.argv) == 1:
254 args = parser.parse_args()
261 if args.input_params
is not None:
262 input_params = yaml.safe_load(args.input_params)
266 iovDict = yaml.safe_load( args.iovs )
267 tags.append( (args.tag, iovDict[
'start_iov'], iovDict[
'end_iov'] ) )
269 iovDict = yaml.safe_load( args.iovstwo )
270 tags.append( (args.tagtwo, iovDict[
'start_iov'], iovDict[
'end_iov'] ) )
272 result =
deserialize_iovs(args.db, args.plugin, args.plot, tags, args.time_type, input_params)
276 os.write( 1, json.dumps( json.loads( result ), indent=4 ))
279 elif args.image_plot:
284 filename = json.loads( result )[
'file']
286 except ValueError, e:
287 os.write( 2,
'Value error when getting image name: %s\n' %
str( e ))
289 os.write( 2,
'Key error when getting image name: %s\n' %
str( e ))
291 if not filename
or not os.path.isfile( filename ):
292 os.write( 2,
'Error: Generated image file (%s) not found\n' % filename )
295 with open( filename,
'r' )
as f:
296 shutil.copyfileobj( f, sys.stdout )
298 os.write( 2,
'IO error when streaming image: %s' %
str( e ))
300 os.remove( filename )
305 os.write( 1, result.encode(
'base64' ))