|
|
#!PYTHONEXE
|
|
|
|
|
|
#$Id: updateExpTimes.py 7046 2019-10-07 19:57:14Z brideout $
|
|
|
|
|
|
usage = """
|
|
|
updateExpTimes.py [experiment_directory]
|
|
|
|
|
|
updateExpTimes.py is a script that updates experiment start and end times in the metadata
|
|
|
file expTab.txt based on data found in the default files. If optional argument
|
|
|
experiment_directory given, then it will only update experiments found in that directory.
|
|
|
Default is to update the entire database.
|
|
|
"""
|
|
|
|
|
|
import sys
|
|
|
import os, os.path
|
|
|
import traceback
|
|
|
import datetime
|
|
|
|
|
|
import madrigal.metadata
|
|
|
import madrigal.data
|
|
|
import madrigal.admin
|
|
|
|
|
|
madDB = madrigal.metadata.MadrigalDB()
|
|
|
expRoot = os.path.join(madDB.getMadroot(), 'experiments')
|
|
|
|
|
|
if len(sys.argv) == 2:
|
|
|
expDir = sys.argv[1]
|
|
|
if not os.access(expDir, os.R_OK):
|
|
|
print('Unable to access directory %s' % (expDir))
|
|
|
print(usage)
|
|
|
if expDir.find(expRoot) == -1:
|
|
|
print('Specified directory must be under root directory %s, not %s' % (expRoot, expDir))
|
|
|
print(usage)
|
|
|
|
|
|
elif len(sys.argv) == 1:
|
|
|
expDir = None
|
|
|
|
|
|
else:
|
|
|
print('Too many arguments: %s' % (str(sys.argv[1:])))
|
|
|
print(usage)
|
|
|
|
|
|
|
|
|
# loop through every experiment
|
|
|
madExpObj = madrigal.metadata.MadrigalExperiment(madDB)
|
|
|
madFileObj = madrigal.metadata.MadrigalMetaFile(madDB)
|
|
|
|
|
|
expModifiedCount = 0
|
|
|
expSkippedCount = 0
|
|
|
|
|
|
for i in range(madExpObj.getExpCount()):
|
|
|
thisExpDir = madExpObj.getExpDirByPosition(i)
|
|
|
|
|
|
# check whether we need to skip it
|
|
|
if expDir != None:
|
|
|
if thisExpDir.find(expDir) == -1:
|
|
|
continue
|
|
|
|
|
|
expId = madExpObj.getExpIdByPosition(i)
|
|
|
|
|
|
sy, sm, sd, sh, sM, ss, v1, v2, v3 = madExpObj.getExpStartDateTimeByPosition(i)
|
|
|
expStartTime = datetime.datetime(sy, sm, sd, sh, sM, ss)
|
|
|
ey, em, ed, eh, eM, es, v1, v2, v3 = madExpObj.getExpEndDateTimeByPosition(i)
|
|
|
expEndTime = datetime.datetime(ey, em, ed, eh, eM, es)
|
|
|
|
|
|
|
|
|
# loop through every default or realtime experiment file
|
|
|
startTime = None
|
|
|
endTime = None
|
|
|
# use default if available
|
|
|
startTimeDefault = None
|
|
|
endTimeDefault = None
|
|
|
|
|
|
for j in range(madFileObj.getFileCount()):
|
|
|
if madFileObj.getExpIdByPosition(j) != expId:
|
|
|
continue
|
|
|
thisCategory = madFileObj.getCategoryByPosition(j)
|
|
|
if thisCategory not in (1, 4):
|
|
|
continue
|
|
|
|
|
|
filename = os.path.join(thisExpDir, madFileObj.getFilenameByPosition(j))
|
|
|
|
|
|
# get start and end time of file
|
|
|
try:
|
|
|
fileObj = madrigal.data.MadrigalFile(filename, madDB)
|
|
|
except:
|
|
|
print('Corrupt file %s - skipping' % (filename))
|
|
|
continue
|
|
|
|
|
|
sy, sm, sd, sh, sM, ss = fileObj.getEarliestTime()
|
|
|
ey, em, ed, eh, eM, es = fileObj.getLatestTime()
|
|
|
|
|
|
thisStartTime = datetime.datetime(sy, sm, sd, sh, sM, ss)
|
|
|
thisEndTime = datetime.datetime(ey, em, ed, eh, eM, es)
|
|
|
|
|
|
if startTime == None:
|
|
|
startTime = thisStartTime
|
|
|
endTime = thisEndTime
|
|
|
if thisCategory == 1:
|
|
|
startTimeDefault = thisStartTime
|
|
|
endTimeDefault = thisEndTime
|
|
|
continue
|
|
|
|
|
|
if thisStartTime < startTime:
|
|
|
startTime = thisStartTime
|
|
|
|
|
|
if thisEndTime > endTime:
|
|
|
endTime = thisEndTime
|
|
|
|
|
|
if thisCategory == 1:
|
|
|
if not startTimeDefault:
|
|
|
startTimeDefault = thisStartTime
|
|
|
endTimeDefault = thisEndTime
|
|
|
continue
|
|
|
if thisStartTime < startTimeDefault:
|
|
|
startTimeDefault = thisStartTime
|
|
|
|
|
|
if thisEndTime > endTimeDefault:
|
|
|
endTimeDefault = thisEndTime
|
|
|
|
|
|
if startTime == None:
|
|
|
print('No default or realtime files found in experiment %s - not setting times' % (thisExpDir))
|
|
|
expSkippedCount += 1
|
|
|
continue
|
|
|
|
|
|
# see if dates need resetting
|
|
|
if startTimeDefault != None:
|
|
|
if startTimeDefault != expStartTime or endTimeDefault != expEndTime:
|
|
|
print('Resetting dates from %s - %s to %s - %s in exp %s' % (expStartTime.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
expEndTime.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
startTimeDefault.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
endTimeDefault.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
thisExpDir))
|
|
|
|
|
|
expInfo = madrigal.metadata.MadrigalExperiment(madDB, os.path.join(thisExpDir, 'expTab.txt'))
|
|
|
expInfo.setExpStartDateTimeByPosition(startTimeDefault)
|
|
|
expInfo.setExpEndDateTimeByPosition(endTimeDefault)
|
|
|
expInfo.writeMetadata()
|
|
|
expModifiedCount += 1
|
|
|
else:
|
|
|
if startTime != expStartTime or endTime != expEndTime:
|
|
|
print('Resetting dates from %s - %s to %s - %s in exp %s' % (expStartTime.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
expEndTime.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
startTime.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
endTime.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
thisExpDir))
|
|
|
|
|
|
expInfo = madrigal.metadata.MadrigalExperiment(madDB, os.path.join(thisExpDir, 'expTab.txt'))
|
|
|
expInfo.setExpStartDateTimeByPosition(startTime)
|
|
|
expInfo.setExpEndDateTimeByPosition(endTime)
|
|
|
expInfo.writeMetadata()
|
|
|
expModifiedCount += 1
|
|
|
|
|
|
print('%i experiments modified, %i experiments skipped due to no default or realtime files' % (expModifiedCount,
|
|
|
expSkippedCount))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|