1 | # -*- coding: utf-8 -*- |
---|
2 | ########### SVN repository information ################### |
---|
3 | # $Date: 2017-04-12 15:12:45 -0500 (Wed, 12 Apr 2017) $ |
---|
4 | # $Author: vondreele $ |
---|
5 | # $Revision: 2777 $ |
---|
6 | # $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/GSASIIscriptable.py $ |
---|
7 | # $Id: GSASIIIO.py 2777 2017-04-12 20:12:45Z vondreele $ |
---|
8 | ########### SVN repository information ################### |
---|
9 | """ |
---|
10 | |
---|
11 | """ |
---|
12 | import os.path as ospath |
---|
13 | import sys |
---|
14 | import cPickle |
---|
15 | def LoadDictFromProjFile(ProjFile): |
---|
16 | ''''Read a GSAS-II project file and load items to dictionary |
---|
17 | :param: str ProjFile: GSAS-II project (name.gpx) full file name |
---|
18 | :returns: dict Project: representation of gpx file following the GSAS-II tree struture |
---|
19 | for each item: key = tree name (e.g. 'Controls','Restraints',etc.), data is dict |
---|
20 | data dict = {'data':item data whch may be list, dict or None,'subitems':subdata (if any)} |
---|
21 | :returns: list nameList: names of main tree entries & subentries used to reconstruct project file |
---|
22 | Example for fap.gpx: |
---|
23 | Project = { #NB:dict order is not tree order |
---|
24 | u'Phases':{'data':None,'fap':{phase dict}}, |
---|
25 | u'PWDR FAP.XRA Bank 1':{'data':[histogram data list],'Comments':comments,'Limits':limits, etc}, |
---|
26 | u'Rigid bodies':{'data': {rigid body dict}}, |
---|
27 | u'Covariance':{'data':{covariance data dict}}, |
---|
28 | u'Controls':{'data':{controls data dict}}, |
---|
29 | u'Notebook':{'data':[notebook list]}, |
---|
30 | u'Restraints':{'data':{restraint data dict}}, |
---|
31 | u'Constraints':{'data':{constraint data dict}}]} |
---|
32 | nameList = [ #NB: reproduces tree order |
---|
33 | [u'Notebook',], |
---|
34 | [u'Controls',], |
---|
35 | [u'Covariance',], |
---|
36 | [u'Constraints',], |
---|
37 | [u'Restraints',], |
---|
38 | [u'Rigid bodies',], |
---|
39 | [u'PWDR FAP.XRA Bank 1', |
---|
40 | u'Comments', |
---|
41 | u'Limits', |
---|
42 | u'Background', |
---|
43 | u'Instrument Parameters', |
---|
44 | u'Sample Parameters', |
---|
45 | u'Peak List', |
---|
46 | u'Index Peak List', |
---|
47 | u'Unit Cells List', |
---|
48 | u'Reflection Lists'], |
---|
49 | [u'Phases', |
---|
50 | u'fap']] |
---|
51 | ''' |
---|
52 | if not ospath.exists(ProjFile): |
---|
53 | print ('\n*** Error attempt to open project file that does not exist:\n '+ |
---|
54 | str(ProjFile)) |
---|
55 | return |
---|
56 | file = open(ProjFile,'rb') |
---|
57 | print 'loading from file: ',ProjFile |
---|
58 | Project = {} |
---|
59 | nameList = [] |
---|
60 | try: |
---|
61 | while True: |
---|
62 | try: |
---|
63 | data = cPickle.load(file) |
---|
64 | except EOFError: |
---|
65 | break |
---|
66 | datum = data[0] |
---|
67 | Project[datum[0]] = {'data':datum[1]} |
---|
68 | nameList.append([datum[0],]) |
---|
69 | for datus in data[1:]: |
---|
70 | Project[datum[0]][datus[0]] = datus[1] |
---|
71 | nameList[-1].append(datus[0]) |
---|
72 | file.close() |
---|
73 | print('project load successful') |
---|
74 | except: |
---|
75 | print("Error reading file "+str(ProjFile)+". This is not a GSAS-II .gpx file") |
---|
76 | return None |
---|
77 | return Project,nameList |
---|
78 | |
---|
79 | def SaveDictToProjFile(Project,nameList,ProjFile): |
---|
80 | 'Save a GSAS-II project file from dictionary/nameList created by LoadDictFromProjFile' |
---|
81 | file = open(ProjFile,'wb') |
---|
82 | print 'save to file: ',ProjFile |
---|
83 | for name in nameList: |
---|
84 | print name |
---|
85 | data = [] |
---|
86 | item = Project[name[0]] |
---|
87 | print item |
---|
88 | data.append([name[0],item['data']]) |
---|
89 | for item2 in name[1:]: |
---|
90 | data.append([item2,item[item2]]) |
---|
91 | cPickle.dump(data,file,1) |
---|
92 | file.close() |
---|
93 | print('project save successful') |
---|
94 | |
---|
95 | def main(): |
---|
96 | 'Needs a doc string' |
---|
97 | arg = sys.argv |
---|
98 | print arg |
---|
99 | if len(arg) > 1: |
---|
100 | GPXfile = arg[1] |
---|
101 | if not ospath.exists(GPXfile): |
---|
102 | print 'ERROR - ',GPXfile," doesn't exist!" |
---|
103 | exit() |
---|
104 | Project,nameList = LoadDictFromProjFile(GPXfile) |
---|
105 | SaveDictToProjFile(Project,nameList,'testout.gpx') |
---|
106 | else: |
---|
107 | print 'ERROR - missing filename' |
---|
108 | exit() |
---|
109 | print "Done" |
---|
110 | |
---|
111 | if __name__ == '__main__': |
---|
112 | main() |
---|