CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
cmsIgProf_Analysis.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 # Import statements. An '''Analogue''' of the include c++ statement,
4 # but really really not the same!
5 # In python everything is an object, even if we don't know.
6 # os and time will become 2 objects for us.
7 
8 import os,sys
9 import time
10 
11 IgProfProfile={'PERF_TICKS':'IgProfPerf',
12  'MEM_TOTAL':'IgProfMem',
13  'MEM_LIVE':'IgProfMem',
14  'MEM_MAX':'IgProfMem'
15  }
16 
17 def execute(command):
18  print '[IgAnalysis] %s ...' %command
19  sys.stdout.flush()
20  exitstate=os.system(command)
21  return exitstate
22 
23 def simple_igprof_analysis(profile_name,AnalysisType,output_type):
24 
25  """This function takes as arguments:
26  -a compressed (.gz) igprof output profile
27  -the output directory where to store the output
28  -the type of output wanted
29  Based on this information it automatically selects the igprof counter
30  (PERF_TICKS, MEM_TOTAL or MEM_LIVE) to use with igprof-analyse and it
31  performs the analysis.
32  If ASCII output_type is given, it keeps only the first seven lines of
33  the output file (the report) allowing quick access to the totals for
34  the counters in order to put together summary tables.
35  If SQLite3 output_type is given, it simply dumps the full reports in
36  sqlite3 format, ready to be browsed by igprof-navigator GUI (standalone
37  or cgi-bin).
38  """
39  #Use profile input file to determine the name of the output file adding the counter to it:
40  #outfile=profile_name[:-3]+"___"+AnalysisType+".res"
41  outfile=profile_name.split(".")[0].replace(IgProfProfile[AnalysisType],AnalysisType)+".res"
42  #Launch the 1 command:
43 
44  #command='igprof-analyse -d -v -g -r %s %s|tee -a \%s'%(AnalysisType,profile_name,outfile)
45  #Replacing tee: it is polluting the log files...
46 
47  #igprof-analyse command depends on the output type desired:
48  if output_type =="SQLite3":
49  #Case of dumping the igprof-analyse report in sqlite format to be igprof-navigator browseable
50  outfile= outfile[:-3]+"sql3" #NEED TO USE sql3 to be compatible with CGI-BIN igprof-navigator
51  command='igprof-analyse --sqlite -d -v -g -r %s %s |sqlite3 %s'%(AnalysisType,profile_name,outfile)
52  #Execute the igprof-analyse command
53  exit=execute(command)
54  elif output_type =="ASCII":
55  #We can keep this part of the igprof-analysis, to create the html table with the totals at each dump
56  command='igprof-analyse -d -v -g -r %s %s > %s'%(AnalysisType,profile_name,outfile)
57  #Execute the igprof-analyse command
58  exit=execute(command)
59  #Let's manipulate the ASCII output to only keep the top 7 lines:
60  # we open and read the txt ascii file
61  print "Reading the res file"
62  txt_file=open(outfile,'r')
63  txt_file_content=txt_file.readlines()#again:everything is an object
64  print "res file has %s lines!"%len(txt_file_content)
65  txt_file.close()
66  #overwrite the file to only save the first 7 lines:
67  print "Overwriting the res file, to reduce it to 7 lines"
68  out_file=open(outfile,'w')
69  line_num=0
70  for line in txt_file_content:
71  out_file.write(line)
72  line_num+=1
73  if line_num == 7:
74  break
75  out_file.close()
76 
77  return exit
78 
79 def diff_igprof_analysis(profile_name,regression_profile_name,AnalysisType):
80 
81  """
82  This function takes as arguments:
83  -a compressed (.gz) igprof output profile
84  -a second compressed (.gz) igprof output profile against which a regression analysis is intended to be done
85  -the output directory where to store the output of the regression analysis
86  Based on this information it automatically selects the igprof counter (PERF_TICKS, MEM_TOTAL or MEM_LIVE) to use
87  with igprof-analyse and it performs the regression analysis with SQLite3 output.
88  """
89  #Following Giulio's filename convention:
90  outfile=profile_name.split(".")[0].replace(IgProfProfile[AnalysisType],AnalysisType)+"_diff_"+regression_profile_name.split(".")[0].split("___")[-1]+".sql3"
91  command='igprof-analyse --sqlite -d -v -g --diff-mode -b %s -r %s %s |sqlite3 %s'%(regression_profile_name, AnalysisType,profile_name,outfile)
92  exit=execute(command)
93 
94  return exit
95 def library_igprof_analysis(profile_name,AnalysisType):
96 
97  """
98  This function takes as arguments:
99  -a compressed (.gz) igprof output profile
100  -the output directory where to store the output of the igprof-analysis merging the results by library
101  Based on this information it automatically selects the igprof counter (PERF_TICKS, MEM_TOTAL or MEM_LIVE) to use
102  with igprof-analyse and it performs the igprof-analyse analysis merging the results by library and saving the results
103  in the usual igprof-navigator browseable SQLite3 format.
104  """
105  #Following Giulio's filename convention:
106  outfile=profile_name.split(".")[0].replace(IgProfProfile[AnalysisType],AnalysisType)+"_merged"+".sql3"
107  #Regular Expression supplied by Giulio:
108  command="igprof-analyse --sqlite -d -v -g -r %s -ml -mr 's|.*/(.*)$|\\1|' %s |sqlite3 %s"%(AnalysisType,profile_name,outfile)
109  exit=execute(command)
110 
111  return exit
112 #-------------------------------------------------------------------------------
113 
114 # A procedure used for importing the function above with the import statement
115 # or to run it if the script is called: power python..
116 if __name__ == '__main__':
117 
118  import optparse
119 
120  # Here we define an option parser to handle commandline options..
121  usage='IgProf_Analysis.py <options>'
122  parser = optparse.OptionParser(usage)
123  parser.add_option('-i', '--in_ profile',
124  help='The profile to manipulate' ,
125  default='',
126  dest='profile')
127 
128  parser.add_option('-c', '--counter',
129  help='The IgProf counter for the analysis (PERF_TICKS,MEM_TOTAL,MEM_LIVE,MEM_MAX)' ,
130  default='UNKNOWN_COUNTER',
131  dest='counter')
132  parser.add_option('-t', '--output_type',
133  help='The type of the output file (ASCII or sqlite3)' ,
134  default='',
135  dest='output_type')
136  parser.add_option('-r', '--regression',
137  help='The IgProf output file to make a regression analysis against' ,
138  default='',
139  dest='regressionprofile')
140  parser.add_option('-l','--library',
141  help='Perform igprof-analyse merging the results by library',
142  action='store_true',
143  default=False,
144  dest='library')
145  (options,args) = parser.parse_args()
146 
147  # Now some fault control..If an error is found we raise an exception
148  if options.profile=='':
149  raise('Please select a profile, an output dir AND a type of output (ASCII or SQLITE3)!')
150 
151  if not os.path.exists(options.profile):
152  raise ('Input profile not present!')
153 
154  AnalysisType=options.counter
155 
156  print "Input file is %s and AnalysisType is %s"%(options.profile,AnalysisType)
157 
158  #launch the function!
159  if options.regressionprofile:
160  diff_igprof_analysis(options.profile,options.regressionprofile,AnalysisType)
161  elif options.library:
162  library_igprof_analysis(options.profile,AnalysisType)
163  else:
164  simple_igprof_analysis(options.profile,AnalysisType,options.output_type)
165 
double split
Definition: MVATrainer.cc:139