#!/usr/bin/env python
#**************************************************************************
# Copyright (C) 2008-2011 by Walter Brisken *
# *
# This program is free software; you can redistribute it and/or modify *
# it under the terms of the GNU General Public License as published by *
# the Free Software Foundation; either version 3 of the License, or *
# (at your option) any later version. *
# *
# This program is distributed in the hope that it will be useful, *
# but WITHOUT ANY WARRANTY; without even the implied warranty of *
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# GNU General Public License for more details. *
# *
# You should have received a copy of the GNU General Public License *
# along with this program; if not, write to the *
# Free Software Foundation, Inc., *
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
#**************************************************************************
#===========================================================================
# SVN properties (DO NOT CHANGE)
#
# $Id$
# $HeadURL: $
# $LastChangedRevision$
# $Author$
# $LastChangedDate$
#
#============================================================================
from sys import argv, exit
from glob import glob
from string import split, strip, find, rfind
import os
import stat
program = 'jobstatus'
version = '1.1'
verdate = '20091204'
author = 'Walter Brisken'
def usage():
print '\n%s ver. %s %s %s' % (program, version, verdate, author)
print '\nA program to list the status of DiFX job files\n'
print 'Usage: [options] [
[ [ ... ] ] ]\n'
print ' is a directory containing .input files. Many directories can be'
print ' listed. If no directory is listed, the current directory is assumed.\n'
print 'options can include:'
print ' -h or --help : print this usage information\n'
exit(0)
def getelapsed(file1, file2, N):
P = os.popen('head -c %d %s' % (256, file1), 'r')
D1 = P.read(256)
P.close()
P = os.popen('tail -c %d %s' % (N, file2), 'r')
D2 = P.read(N)
P.close()
p1 = find(D1, "MJD: ");
p2 = rfind(D2[:-50], "MJD: ");
if p1 < 0 or p2 < 0:
return -1;
S1 = split(D1[p1:p1+80], '\n')
S2 = split(D2[p2:p2+80], '\n')
m1 = int(strip(S1[0][5:]))
m2 = int(strip(S2[0][5:]))
s1 = float(strip(S1[1][9:]))
s2 = float(strip(S2[1][9:]))
return (m2-m1)*86400.0+s2-s1
def summarize(input):
s = split(input, '/')
data = open(input).readlines()
ants = []
nsec = 0
tInt = 1.0
trippel = ''
for d in data:
if d[:19] == 'EXECUTE TIME (SEC):':
nsec = int(d[20:])
if d[:14] == 'TELESCOPE NAME':
ants.append(strip(d[20:]))
if d[:11] == 'DATA FORMAT':
p = find(d[20:], '-')
if p > 0:
trippel = strip(d[p+21:])
if d[:14] == 'INT TIME (SEC)':
tInt = float(d[20:])
return [nsec, ants, trippel, tInt]
def gettimes(input):
difx = input[0:-6]+'.difx'
dir = glob(difx)
if len(dir) == 0:
return [-1, 0, 0]
file = glob(difx+'/*')
if len(file) == 0:
return [-1, 0, 0]
S = os.stat(dir[0])
dtime = S[stat.ST_MTIME]
S = os.stat(file[-1])
ftime = S[stat.ST_MTIME]
fsize = S[stat.ST_SIZE]
elapsed = getelapsed(file[0], file[-1], 10000)
return [float(ftime - dtime), fsize, float(elapsed)]
def run(path):
inputs = glob(path+'/*.input')
if len(inputs) == 0:
return
inputs.sort()
n = len(inputs)
SS = []
AA = []
su = []
sectot = 0.0
secdone = 0.0
ttot = 0.0
tdone = 0.0
wtime = 0.0
for i in range(n):
S = summarize(inputs[i])
A = gettimes(inputs[i])
nsta = len(S[1])
if A[2] > 0.0:
A[2] += S[3]
if A[2] > 0.9*S[0]:
A[2] += (S[3]*1.5)
if A[2] > S[0]:
A[2] = S[0]
if A[2] > 0.0 and A[0] > 0.0:
speedup = A[2]/A[0]
wtime += A[0]
else:
speedup = 0
sectot += nsta*S[0]
secdone += nsta*A[2]
ttot += S[0]
tdone += A[2]
su.append(speedup)
SS.append(S)
AA.append(A)
for i in range(n):
A = AA[i]
S = SS[i]
speedup = su[i]
nsta = len(S[1])
fn = split(inputs[i], '/')[-1][0:-6]
fraction = 100*A[2]/S[0]
sta = "%s %4.1f min %s ns=%2d su=%5.2f %3d%%" % (fn, S[0]/60.0, S[2], nsta, speedup, fraction)
if A[2] > 10 and fraction < 100:
tremain = S[0]*(1.0 - fraction/100.0)/speedup
sta += ' %4.1f min left' % (tremain/60.0)
print sta
fraction = int(100*secdone/sectot)
print "Total job time = %4.1f min" % (ttot/60.0)
print "Fraction complete = %3d%%" % fraction
jremain = ttot - tdone
if tdone > 0:
wremain = jremain*wtime/tdone
print "Job time remaining = %4.1f min" % (jremain/60.0)
print "Wall time remaining = %4.1f min" % (wremain/60.0)
print "Average speedup = %4.2f" % (tdone/wtime)
if len(argv) == 1:
paths = ['.']
else:
paths = []
for a in argv:
if a == '-h' or a == '--help':
usage()
elif a[0] == '-':
print 'Unknown option %s . Quitting' % a
exit(0)
else:
paths.append(a)
for p in paths:
run(p)