1
2
3
4 """
5 Reads given Fits key(s) from all FITS files for a given date
6 and reports value counts.
7
8 @author: E. Sutorius
9 @org: WFAU, IfA, University of Edinburgh
10
11 @newfield contributors: Contributors, Contributors (Alphabetical Order)
12 @contributors: R.S. Collins
13 """
14
15 from collections import defaultdict
16 import dircache
17 import os
18
19 from wsatools.CLI import CLI
20 import wsatools.FitsUtils as fits
21 from wsatools.DbConnect.IngIngester import IngestLogger as Logger
22 from wsatools.SystemConstants import SystemConstants
23 import wsatools.Utilities as utils
24
25
27 """ Checks FITS files for missing multiframe IDs or WSATimestamps.
28 """
29
30
31
32
33 dataArchive = "WSA"
34
35 sysc = SystemConstants()
36
37 versionStr = '1'
38
39 fitsKeys = ["%s_MFID" % dataArchive, "%s_TIME" % dataArchive]
40
41 writeToFile = False
42
43
44 - def run(self, startDate, endDate):
45 """ Runs the FITS file check.
46 """
47
48 fitsList = fits.FitsList(self.sysc, "rfk_")
49 fitsList.createFitsDateDict(
50 beginDateStr=startDate, endDateStr=endDate,
51 versionStr=self.versionStr)
52
53 fileDict = defaultdict(list)
54 for direc in fitsList.fitsDateDict:
55 for datumVersStr in fitsList.fitsDateDict[direc]:
56 path = os.path.join(direc, datumVersStr)
57 fileDict[datumVersStr] = [os.path.join(path, item)
58 for item in dircache.listdir(path) if item.endswith(".fit")]
59
60 for dateVersStr in sorted(fileDict):
61 keyDict = defaultdict(dict)
62 noKeyDict = defaultdict(list)
63 for fileName in fileDict[dateVersStr]:
64
65 phdr = fits.open(fileName)[0].header
66 keyList = []
67 for key in self.fitsKeys:
68 if phdr.has_key(key):
69 keyList.append(phdr[key])
70 else:
71 keyList.append('')
72 noKeyDict[tuple(self.fitsKeys)].append(fileName)
73
74 if tuple(keyList) in keyDict[tuple(self.fitsKeys)]:
75 keyDict[tuple(self.fitsKeys)][tuple(keyList)] += 1
76
77
78 else:
79 keyDict[tuple(self.fitsKeys)][tuple(keyList)] = 1
80
81
82 Logger.addMessage('*'*4+dateVersStr+'*'*4)
83 for key in keyDict:
84 header = ', '.join(key)+':'
85 Logger.addText(header)
86 Logger.addText('=' * len(header))
87 for val in sorted(keyDict[key]):
88 Logger.addText('%s: %d' % (str(val), keyDict[key][val]))
89
90 if self.writeToFile:
91 outFileName = "VSA_FitsKeys_%s.txt" % (
92 utils.makeTimeStamp().rpartition(':')[0].replace(' ','_'))
93 Logger.dump(file(outFileName , 'w'))
94 print "\nOutput written to: %s" % outFileName
95
96
97
98 if __name__ == '__main__':
99
100 CLI.progArgs += [
101 CLI.Argument("begindate", "20051225"),
102 CLI.Argument("enddate", "20061225"),
103 CLI.Argument("version", ReadFitsKeys.versionStr,
104 isValOK=lambda x: x.replace('.', '').isdigit()),
105 CLI.Argument("keys", ','.join(ReadFitsKeys.fitsKeys)),
106 ]
107 CLI.progOpts += [CLI.Option('f', "filename", "write output into file")]
108 cli = CLI(ReadFitsKeys, "$Revision: 7245 $")
109
110 task = ReadFitsKeys()
111 task.sysc = SystemConstants(cli.getArg("database"))
112 task.versionStr = cli.getArg("version")
113 task.fitsKeys = cli.getArg("keys").split(',')
114 task.writeToFile = cli.getOpt("filename")
115 task.run(cli.getArg("begindate"), cli.getArg("enddate"))
116
117
118
119
120