9
9
import json
10
10
11
11
12
- def _add_quality_report (directory , pif , inline = True ):
12
+ def _add_quality_report (parser , pif , inline = True ):
13
13
import tarfile
14
14
15
- # Use VaspParser to identify OUTCAR and POSCAR files
16
- parser = VaspParser (directory )
17
-
18
- # If we do not have an INCAR, we cannot run the quality report
15
+ # if the parser lacks an INCAR, return None
19
16
if parser .incar is None :
20
- print ("Unable to generate quality report; directory lacks an INCAR file" )
21
- return
17
+ return None
22
18
23
19
# Create the tar file
24
20
tar = tarfile .open ("tmp.tar" , "w" )
25
- tar .add (os . path . join ( directory , "OUTCAR" ) )
26
- tar .add (os . path . join ( directory , "INCAR" ) )
21
+ tar .add (parser . outcar , arcname = "OUTCAR" )
22
+ tar .add (parser . incar , arcname = "INCAR" )
27
23
tar .close ()
28
24
29
25
import requests
@@ -44,7 +40,7 @@ def _add_quality_report(directory, pif, inline=True):
44
40
if inline :
45
41
setattr (pif , "quality_report" , report )
46
42
else :
47
- report_file = os .path .join (directory , "quality_report.txt" )
43
+ report_file = os .path .join (os . path . dirname ( parser . outcar ) , "quality_report.txt" )
48
44
with open (report_file , "w" ) as f :
49
45
f .write (report )
50
46
if report_file [0 :2 ] == "./" :
@@ -59,6 +55,7 @@ def _add_quality_report(directory, pif, inline=True):
59
55
60
56
return pif
61
57
58
+
62
59
def tarfile_to_pif (filename , temp_root_dir = '' , verbose = 0 ):
63
60
"""
64
61
Process a tar file that contains DFT data.
@@ -81,8 +78,8 @@ def tarfile_to_pif(filename, temp_root_dir='', verbose=0):
81
78
for i in os .listdir (temp_dir ):
82
79
cur_dir = temp_dir + '/' + i
83
80
if os .path .isdir (cur_dir ):
84
- return directory_to_pif (cur_dir , verbose )
85
- return directory_to_pif (temp_dir , verbose )
81
+ return directory_to_pif (cur_dir , verbose = verbose )
82
+ return directory_to_pif (temp_dir , verbose = verbose )
86
83
finally :
87
84
shutil .rmtree (temp_dir )
88
85
@@ -104,14 +101,13 @@ def archive_to_pif(filename, verbose=0):
104
101
raise Exception ('Cannot process file type' )
105
102
106
103
107
- def directory_to_pif ( directory , verbose = 0 , quality_report = True , inline = True ):
104
+ def files_to_pif ( files , verbose = 0 , quality_report = True , inline = True ):
108
105
'''Given a directory that contains output from
109
106
a DFT calculation, parse the data and return
110
107
a pif object
111
108
112
109
Input:
113
- directory - String, path to directory containing
114
- DFT results
110
+ files - [str] list of files from which the parser is allowed to read.
115
111
verbose - int, How much status messages to print
116
112
117
113
Output:
@@ -123,7 +119,7 @@ def directory_to_pif(directory, verbose=0, quality_report=True, inline=True):
123
119
found_parser = False
124
120
for possible_parser in [PwscfParser , VaspParser ]:
125
121
try :
126
- parser = possible_parser (directory )
122
+ parser = possible_parser (files )
127
123
found_parser = True
128
124
break
129
125
except InvalidIngesterException :
@@ -195,12 +191,29 @@ def directory_to_pif(directory, verbose=0, quality_report=True, inline=True):
195
191
chem .properties .append (prop )
196
192
197
193
# Check to see if we should add the quality report
198
- if quality_report and isinstance (parser , VaspParser ) :
199
- _add_quality_report (directory , chem )
194
+ if quality_report and isinstance (parser , VaspParser ):
195
+ _add_quality_report (parser , chem )
200
196
201
197
return chem
202
198
203
- def convert (files = [], ** kwargs ):
199
+
200
+ def directory_to_pif (directory , ** kwargs ):
201
+ """
202
+ Convert a directory to a pif
203
+ :param directory: Directory to convert to a pif
204
+ :param kwargs: any additional keyword arguments. (See `files_to_pif`)
205
+ :return: the created pif
206
+ """
207
+
208
+ # Get the files
209
+ files = [os .path .join (directory , f ) for f in os .listdir (directory )
210
+ if os .path .isfile (os .path .join (directory , f ))]
211
+
212
+ # Run the pif
213
+ return files_to_pif (files , ** kwargs )
214
+
215
+
216
+ def convert (files , ** kwargs ):
204
217
"""
205
218
Wrap directory to pif as a dice extension
206
219
:param files: a list of files, which must be non-empty
@@ -213,10 +226,8 @@ def convert(files=[], **kwargs):
213
226
214
227
if len (files ) == 1 :
215
228
if os .path .isfile (files [0 ]):
216
- return directory_to_pif ( os . path . dirname ( files [ 0 ]) , ** kwargs )
229
+ return files_to_pif ( files , ** kwargs )
217
230
else :
218
231
return directory_to_pif (files [0 ], ** kwargs )
219
232
else :
220
- prefix = os .path .join ("." , os .path .commonprefix (files ))
221
- print ("Trying to use prefix {} from {}" .format (prefix , os .getcwd ()))
222
- return directory_to_pif (prefix , ** kwargs )
233
+ return files_to_pif (files , ** kwargs )
0 commit comments