createRTExp.py
340 lines
| 11.6 KiB
| text/x-python
|
PythonLexer
r0 | #!PYTHONEXE | |||
#$Id: createRTExp.py 7045 2019-10-07 19:56:46Z brideout $ | ||||
usage = """ | ||||
createRTExpWithFile.py is a script used to create a new Madrigal experiment | ||||
that will contain real-time files. These real-time files are assumed not to exist | ||||
yet. | ||||
Required arguments:: | ||||
--startDate - experiment start date in form YYYY-MM-DD | ||||
--inst - instrument code or 3-letter Madrigal mnenonic | ||||
--expTitle - experiment title. Use quotes if title contains spaces. | ||||
--rtFiles - comma-separated list of realtime file basenames to be created | ||||
--kindats - comma-separated list of ints or single int of kindats for each realtime file. | ||||
The length and order must be the same as rtFiles. If only one | ||||
given, it is assumed that all rtFiles have the same kindat. | ||||
--fileDescs - comma-separated list of file descriptions. If the file description contains spaces, | ||||
quotes must be used. | ||||
Optional argument:: | ||||
--numDays - number of days the experiment is estimated to run - if not given, and no start | ||||
and end times specified, defaults to one day. Error raised if endDate and endTime | ||||
also specified. | ||||
--startTime - start time in form HH:MM:DD. Defaults to 00:00:00 | ||||
--endDate - end day in form YYYY-MM-DD. endTime must also be specified | ||||
--endTime - end time in form HH:MM:DD. endDate must also be specified | ||||
--permissions - comma-separated list of 0 for public, 1 for private (restricted to certain IP range). | ||||
If only one given, it is assumed it applied to all. If this argument is not | ||||
given, it defaults to 0 (public) | ||||
--dirName - directory name to use for experiment. If not given, the directory | ||||
name will be the default name DDmmmYY[optChar]. Cannot contain "/" | ||||
--optChar - optional character to be added to experiment directory if no dirName | ||||
given. If dirName argument given, this argument ignored. optChar | ||||
is used if the default directory name DDmmmYY is used for | ||||
more than one experiment created for a given instrument on a given day. | ||||
For example, if --optChar=h for a MLH experiment on September 12, 2005, | ||||
then the experiment directory created would be experiments/2005/mlh/12sep05h. | ||||
--security - overall experiment access. 0 for public, 1 for private, -1 for ignore. | ||||
Defaults to public (0) | ||||
--experimentsDirNum - the number to be appended to the experiments directory, if experiments | ||||
directory being used is of the form experiments[0-9]* instead of just | ||||
experiments. For example, if experimentsDirNum is 7, then the experiment | ||||
would be created in MADROOT/experiments7 instead of MADROOT/experiments. | ||||
Default is to create in experiments directory. | ||||
--PI - set Principal Investigator for this experiment | ||||
--PIEmail - set PI email for this experiment | ||||
--fileAnalyst - set file analyst name for these files (no commas allowed). | ||||
This will default to blank. If a different | ||||
fileAnalyst is desired for each file, the names must be comma separated. | ||||
--fileAnalystEmail - set file analyst email for this file. This will default to blank. | ||||
If a different fileAnalyst email is desired for each file, the emails must be comma separated. | ||||
Example:: | ||||
createRTExp.py --startDate=2002-10-01 --numDays=2 --inst=mlh --expTitle="test experiment" | ||||
--rtFiles=mlh021001a.000,mlh021001b.000 --kindats=3410 | ||||
--fileDescs="preliminary - single pulse,preliminary - alternating code" | ||||
""" | ||||
import sys | ||||
import os, os.path | ||||
import getopt | ||||
import traceback | ||||
import time, datetime | ||||
import madrigal.admin | ||||
# parse command line | ||||
arglist = '' | ||||
longarglist = ['startDate=', | ||||
'numDays=', | ||||
'inst=', | ||||
'expTitle=', | ||||
'rtFiles=', | ||||
'kindats=', | ||||
'fileDescs=', | ||||
'startTime=', | ||||
'endDate=', | ||||
'endTime=', | ||||
'permissions=', | ||||
'dirName=', | ||||
'optChar=', | ||||
'experimentsDirNum=', | ||||
'PI=', | ||||
'PIEmail=', | ||||
'fileAnalyst=', | ||||
'fileAnalystEmail='] | ||||
optlist, args = getopt.getopt(sys.argv[1:], arglist, longarglist) | ||||
# set default values | ||||
startDate = None | ||||
numDays = None | ||||
inst = None | ||||
expTitle = None | ||||
rtFiles = None | ||||
kindats = None | ||||
startDate = None | ||||
startTime = None | ||||
endDate = None | ||||
endTime = None | ||||
fileDescs = None | ||||
permissions = None | ||||
dirName = None | ||||
security = 0 | ||||
optChar = '' | ||||
experimentsDirNum = None | ||||
PI = '' | ||||
PIEmail = '' | ||||
fileAnalyst = '' | ||||
fileAnalystEmail = '' | ||||
for opt in optlist: | ||||
if opt[0] == '--startDate': | ||||
startDate = opt[1] | ||||
elif opt[0] == '--numDays': | ||||
numDays = int(opt[1]) | ||||
elif opt[0] == '--inst': | ||||
inst = opt[1] | ||||
elif opt[0] == '--expTitle': | ||||
expTitle = opt[1] | ||||
elif opt[0] == '--rtFiles': | ||||
rtFiles = opt[1] | ||||
elif opt[0] == '--kindats': | ||||
kindats = opt[1] | ||||
elif opt[0] == '--startTime': | ||||
startTime = opt[1] | ||||
elif opt[0] == '--endDate': | ||||
endDate = opt[1] | ||||
elif opt[0] == '--endTime': | ||||
endTime = opt[1] | ||||
elif opt[0] == '--fileDescs': | ||||
fileDescs = opt[1] | ||||
elif opt[0] == '--permissions': | ||||
permissions = opt[1] | ||||
elif opt[0] == '--dirName': | ||||
dirName = opt[1] | ||||
elif opt[0] == '--security': | ||||
security = int(opt[1]) | ||||
elif opt[0] == '--optChar': | ||||
optChar = opt[1] | ||||
if len(optChar) != 1: | ||||
raise ValueError('optChar argument must contain exactly one character, not %s' % (optChar)) | ||||
elif opt[0] == '--experimentsDirNum': | ||||
experimentsDirNum = int(opt[1]) | ||||
elif opt[0] == '--PI': | ||||
PI = opt[1] | ||||
elif opt[0] == '--PIEmail': | ||||
PIEmail = opt[1] | ||||
elif opt[0] == '--fileAnalyst': | ||||
fileAnalyst = opt[1] | ||||
elif opt[0] == '--fileAnalystEmail': | ||||
fileAnalystEmail = opt[1] | ||||
else: | ||||
raise ValueError('Illegal option %s\n%s' % (opt[0], usage)) | ||||
# check that all required arguments passed in | ||||
if startDate == None: | ||||
print('--startDate argument required - must be experiment start date in form YYYY-MM-DD') | ||||
print(usage) | ||||
sys.exit(0) | ||||
if inst == None: | ||||
print('--inst argument required - must be instrument code or 3-letter Madrigal mnenonic') | ||||
sys.exit(0) | ||||
if expTitle == None: | ||||
print('--expTitle argument required - must be experiment title (use quotes if needed)') | ||||
sys.exit(0) | ||||
if expTitle.find('\n') != -1: | ||||
print('--expTitle argument cannot contain a new line character') | ||||
sys.exit(0) | ||||
if rtFiles == None: | ||||
print('--rtFiles argument required - must be one or comma-separated list of base file names') | ||||
sys.exit(0) | ||||
else: | ||||
rtFiles = rtFiles.split(',') | ||||
count = len(rtFiles) | ||||
for rtFile in rtFiles: | ||||
if rtFile.find('\n') != -1: | ||||
print('--rtFiles argument cannot contain a new line character') | ||||
sys.exit(0) | ||||
if kindats == None: | ||||
print('--kindats argument required - must be one or comma-separated list kindat codes') | ||||
sys.exit(0) | ||||
else: | ||||
tempList = kindats.split(',') | ||||
kindats = [] | ||||
if len(tempList) == 1 and count > 1: | ||||
for i in range(count): | ||||
kindats.append(int(tempList[0])) | ||||
elif len(tempList) != count: | ||||
print('number of kindats must equal number of realtime file names') | ||||
sys.exit(0) | ||||
else: | ||||
for i in range(count): | ||||
kindats.append(int(tempList[i])) | ||||
if fileDescs == None: | ||||
print('--fileDescs argument required - must be comma-separated list of file descriptions') | ||||
sys.exit(0) | ||||
else: | ||||
fileDescs = fileDescs.split(',') | ||||
for fileDesc in fileDescs: | ||||
if fileDesc.find('\n') != -1: | ||||
print('--fileDescs argument cannot contain a new line character') | ||||
sys.exit(0) | ||||
# deal with fileAnalyst and Emails | ||||
if fileAnalyst == '': | ||||
fileAnalystList = None | ||||
else: | ||||
tempList = fileAnalyst.split(',') | ||||
if len(tempList) not in (1, len(rtFiles)): | ||||
raise ValueError('wrong number of fileAnalyst given') | ||||
fileAnalystList = [] | ||||
for i in range(len(rtFiles)): | ||||
if len(tempList) == 1: | ||||
fileAnalystList.append(tempList[0]) | ||||
else: | ||||
fileAnalystList.append(tempList[i]) | ||||
if fileAnalystEmail == '': | ||||
fileAnalystEmailList = None | ||||
else: | ||||
tempList = fileAnalystEmail.split(',') | ||||
if len(tempList) not in (1, len(rtFiles)): | ||||
raise ValueError('wrong number of fileAnalystEmail given') | ||||
fileAnalystEmailList = [] | ||||
for i in range(len(rtFiles)): | ||||
if len(tempList) == 1: | ||||
fileAnalystEmailList.append(tempList[0]) | ||||
else: | ||||
fileAnalystEmailList.append(tempList[i]) | ||||
# deal with time arguments | ||||
if startTime == None: | ||||
startDate = datetime.datetime(int(startDate[0:4]), | ||||
int(startDate[5:7]), | ||||
int(startDate[8:]),0,0,0) | ||||
else: | ||||
hour = int(startTime[0:2]) | ||||
minute = int(startTime[3:5]) | ||||
second = int(startTime[6:]) | ||||
startDate = datetime.datetime(int(startDate[0:4]), | ||||
int(startDate[5:7]), | ||||
int(startDate[8:]), | ||||
hour, | ||||
minute, | ||||
second) | ||||
if numDays == None and endDate == None and endTime == None: | ||||
# default is 1 day | ||||
endDate = startDate + datetime.timedelta(1) | ||||
if endDate != None or endTime != None: | ||||
hour = int(endTime[0:2]) | ||||
minute = int(endTime[3:5]) | ||||
second = int(endTime[6:]) | ||||
endDate = datetime.datetime(int(endDate[0:4]), | ||||
int(endDate[5:7]), | ||||
int(endDate[8:]), | ||||
hour, | ||||
minute, | ||||
second) | ||||
if numDays != None and endDate == None and endTime == None: | ||||
if numDays < 1: | ||||
print('--numDays must be greater than zero, not %s' % (str(numDays))) | ||||
sys.exit(0) | ||||
endDate = startDate + datetime.timedelta(numDays) | ||||
if permissions == None: | ||||
permissions = [] | ||||
for i in range(count): | ||||
permissions.append(0) | ||||
else: | ||||
tempList = premissions.split(',') | ||||
premissions = [] | ||||
if len(tempList) == 1 and count > 1: | ||||
for i in range(count): | ||||
permissions.append(int(tempList[0])) | ||||
elif len(tempList) != count: | ||||
print('number of permissions must equal number of realtime file names') | ||||
sys.exit(0) | ||||
else: | ||||
for i in range(count): | ||||
permissions.append(int(tempList[i])) | ||||
adminObj = madrigal.admin.MadrigalDBAdmin() | ||||
expDir = adminObj.createRTExperiment(startDate, | ||||
numDays, | ||||
inst, | ||||
expTitle, | ||||
rtFiles, | ||||
kindats, | ||||
permissions, | ||||
fileDescs, | ||||
optChar, | ||||
endDate, | ||||
security, | ||||
dirName, | ||||
experimentsDirNum, | ||||
PI=PI, | ||||
PIEmail=PIEmail, | ||||
fileAnalystList=fileAnalystList, | ||||
fileAnalystEmailList=fileAnalystEmailList) | ||||
print('New realtime experiment successfully created at %s with file(s) %s - run updateMaster to register' % (expDir, | ||||
str(rtFiles))) | ||||