[Openmadrigal-admin] Bug fix for updateMaster
William Rideout
brideout at haystack.mit.edu
Thu Jan 3 15:46:36 EST 2008
An HTML attachment was scrubbed...
URL: http://www.haystack.mit.edu/pipermail/openmadrigal-admin/attachments/20080103/28a81003/attachment.html
-------------- next part --------------
#!/bin/sh
# The madtclsh path is longer than 32 characters. So, we take advantage
# of the fact that a backslash continues a comment line in tcl \
exec MADROOT/bin/madtclsh "$0" ${1+"$@"}
# $Id: genTab,v 1.7 2008/01/03 14:10:23 brideout Exp $
# usage: genTab
# Loops over all the experiments in the local Madrigal database and
# writes master experiment, file and data tables. The master files,
# located in MADROOT/metadata, are just a concatenation of the
# corresponding files in the individual experiment directories except for
# the experiment ID, which is assigned sequentially in the master files.
# This script is normally invoked by updateMaster.
# modified by B. Rideout 9/21/2005 to overwrite metadata files from text in memory, so that
# there is only a short period of time when Madrigal has incomplete metadata files
proc initializeScanMadFiles {} {
# Set the glob pattern which determines which experiments are
# processed.
global madroot lMadroot siteID
global fileTabTxt expTabTxt dataTabTxt
set madroot MADROOT
set lMadroot [llength [split $madroot /]]
set siteID SITEID
set fileTabTxt ""
set expTabTxt ""
set dataTabTxt ""
set expbase $madroot/experiments
# Process all experiments
set station *
# Process all years
set yearPattern {[12][09][0-9][0-9]}
# Process all dates
set datePattern {[0-3][0-9][a-z][a-z][a-z][0-9][0-9]}
set expPattern $expbase/$yearPattern/$station/$datePattern*/
return $expPattern
}
proc processExperimentTable {experiment expID} {
# Assigns each column of the experiment table in the specified
# experiment directory to a variable, replaces the experiment ID with
# expID and appends the row to the master experiment table.
# Returns 1 if no problems are found, else 0.
# uses global expTabTxt to hold entire text of new expTab.txt
global fileTabTxt expTabTxt dataTabTxt
set expTabNames [list ExperimentID ExperimentURL ExperimentName SiteID \
StartDate StartTime EndDate EndTime \
InstrumentCode SecurityCode]
set expTab expTab.txt
if {![file exists [file join $experiment $expTab]]} {
processError "genTab Error: Missing [file join $experiment $expTab]"
return 0
}
set fe [open [file join $experiment $expTab] r]
gets $fe line
close $fe
set expTabEntries [split $line ,]
set lExpTabEntries [llength $expTabEntries]
if {$lExpTabEntries != 10} {
processError "genTab Error: [file join $experiment $expTab] contains $lExpTabEntries entries. There should be 10"
return 0
}
set i 0
foreach el $expTabEntries {
incr i
if {$i == 1} {
# Experiment ID's are assigned sequentially in output file
append expTabTxt "$expID,"
} elseif {$i == 10} {
# The remaining fields are unchanged
append expTabTxt $el "\n"
} else {
append expTabTxt "$el,"
}
}
return 1
}
proc processFileTable {experiment expID} {
# Assigns each column of the file table in the specified
# experiment directory to a variable, replaces the experiment ID with
# expID and appends the row to the master file table.
# Returns 1 if no problems are found, else 0.
# uses global fileTabTxt to hold entire text of new fileTab.txt
global fileTabTxt expTabTxt dataTabTxt
set fileTabNames [list FileName ExperimentID DataType Category \
Spare1 Spare2 Spare3 AnalysisDate AnalysisTime \
Spare4 Spare5]
set fileTab fileTab.txt
if {![file exists [file join $experiment $fileTab]]} {
processError "genTab Warning: Missing [file join $experiment $fileTab]"
return 0
}
set ff [open [file join $experiment $fileTab] r]
while {[gets $ff line] >= 0} {
set fileTabEntries [split $line ,]
set lFileTabEntries [llength $fileTabEntries]
if {$lFileTabEntries != 11} {
processError "genTab Error: [file join $experiment $fileTab] contains $lFileTabEntries entries. There should be 11"
return 0
}
set FileName [lindex $fileTabEntries 0]
set Category [lindex $fileTabEntries 3]
if {![file exists [file join $experiment $FileName]]} {
# this is only an error if not a realtime file
if {$Category != 4} {
processError "genTab Error: Missing [file join $experiment $FileName]"
return 0
}
}
set i 0
foreach el $fileTabEntries {
incr i
if {$i == 2} {
# Experiment ID's are assigned sequentially in output file
append fileTabTxt "$expID,"
} elseif {$i == 11} {
# The remaining fields are unchanged
append fileTabTxt $el "\n"
} else {
append fileTabTxt "$el,"
}
}
}
close $ff
return 1
}
proc processDataTable {experiment expID} {
# Assigns each column of the data table in the specified
# experiment directory to a variable, replaces the experiment ID with
# expID and appends the row to the master data table.
# Returns 1 if no problems are found, else 0.
# uses global dataTabTxt to hold entire text of new dataTab.txt
global fileTabTxt expTabTxt dataTabTxt
set dataTabNames [list Day ExperimentID DataType]
set dataTab dataTab.txt
if {![file exists [file join $experiment $dataTab]]} {
processError "genTab Warning: Missing [file join $experiment $dataTab]"
return 0
}
set fd [open [file join $experiment $dataTab] r]
while {[gets $fd line] >= 0} {
set dataTabEntries [split $line ,]
set lDataTabEntries [llength $dataTabEntries]
if {$lDataTabEntries != 3} {
processError "genTab Error: [file join $experiment $dataTab] contains $lDataTabEntries entries. There should be 3"
return 0
}
set i 0
foreach el $dataTabEntries {
incr i
if {$i == 2} {
# Experiment ID's are assigned sequentially in output file
append dataTabTxt "$expID,"
} elseif {$i == 3} {
# The remaining fields are unchanged
append dataTabTxt $el "\n"
} else {
append dataTabTxt "$el,"
}
}
}
close $fd
return 1
}
proc processError {message} {
# Process errors. In this example, the error message is simply
# printed.
puts $message
}
proc getDayno {experiment} {
# Computes day number yyymmdd from experiment directory name
# e.g.: /opt/madrigal/experiments/1999/mlh/08oct99/ -> 19990908
global madroot lMadroot
global months
set date [lindex [split $experiment /] [expr $lMadroot+3]]
set day [string trimleft [string range $date 0 1] 0]
set month [string range $date 2 4]
set year [string range $date 5 6]
scan $year %d yearNum
if {$yearNum >= 50} {
set yearNum [expr $yearNum + 1900]
} elseif {$yearNum < 50} {
set year [expr $yearNum + 2000]
}
for {set m 0} {$m < 12} {incr m} {
if {$month == [lindex $months $m]} {
break
}
}
set dayno [expr 10000*$yearNum + 100*$m + 1*$day]
return $dayno
}
proc dateCompare {experiment1 experiment2} {
# Sorting function for lsort
global madroot lMadroot
set expDir1 [split $experiment1 /]
set year1 [lindex $expDir1 [expr $lMadroot+1]]
set station1 [lindex $expDir1 [expr $lMadroot+2]]
set expDir2 [split $experiment2 /]
set year2 [lindex $expDir2 [expr $lMadroot+1]]
set station2 [lindex $expDir2 [expr $lMadroot+2]]
set d1 $year1$station1[getDayno $experiment1]
set d2 $year2$station2[getDayno $experiment2]
if {$d1 >= $d2} {
return 1
} else {
return -1
}
}
########################
# Start Execution Here #
########################
# Initialization
set months {jan feb mar apr may jun jul aug sep oct nov dec}
set expPattern [initializeScanMadFiles]
# Get list of experiments and sort by date
set experiments [lsort -increasing -command dateCompare [glob $expPattern]]
set expID [expr 10000000*$siteID]
foreach experiment $experiments {
incr expID
# Process the experiment table
# Every experiment must have an experiment table
if {![processExperimentTable $experiment $expID]} {
continue
}
# Process the data table
# Every experiment must have a data table
if {![processDataTable $experiment $expID]} {
continue
}
# Process the file table
# Experiments do not have to have a file table
processFileTable $experiment $expID
}
set feout [open [file join $madroot metadata expTab.txt] w]
set ffout [open [file join $madroot metadata fileTab.txt] w]
set fdout [open [file join $madroot metadata dataTab.txt] w]
puts -nonewline $feout $expTabTxt
puts -nonewline $ffout $fileTabTxt
puts -nonewline $fdout $dataTabTxt
close $feout
close $ffout
close $fdout
catch {file attributes [file join $madroot metadata expTab.txt] -permissions g+w}
catch {file attributes [file join $madroot metadata fileTab.txt] -permissions g+w}
catch {file attributes [file join $madroot metadata dataTab.txt] -permissions g+w}
exit
More information about the OpenMadrigal-admin
mailing list