1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15  """The file contains functions for building a Fit object. 
 16  """ 
 17  __id__ = "$Id: buildfit.py 6300 2011-03-10 21:34:27Z yshang $" 
 18  import diffpy.srrietveld.utility as UT 
 19  from diffpy.srrietveld.exceptions import SrrConfigError 
 20   
 22      """ BuildFit class is to build fit object based on the GUI inputs. """ 
 23 -    def __init__(self, enginename, strudict, instdict, datadict): 
  24          """ Initialization """ 
 25          self.engine = "diffpy.py" + enginename 
 26          self.strudict = strudict 
 27          self.instdict = instdict 
 28          self.datadict = datadict 
 29          return 
  30   
 40   
 42          """ Build phase """ 
 43          for phasekey, phasevalue in self.strudict.items(): 
 44              if phasekey.count("PHASE") == 1: 
 45                   
 46                  phase = UT.importClass(self.engine+".phase", "phase", "Phase", fit) 
 47                  atomdict = {} 
 48                  for key, value in phasevalue[0].items(): 
 49                      if key.startswith("ATOM"): 
 50                           
 51                          atom = UT.importClass(self.engine+".atom", "atom",  
 52                                                              "AtomCrystal", None) 
 53                          for akey, avalue in value[0].items(): 
 54                              if akey in ["Uiso", "Biso"]: 
 55                                  atomadp = UT.importClass(self.engine+".atom", "atom",  
 56                                             "AtomicDisplacementFactorIsotropic", None) 
 57                              elif akey in ["U11", "B11"]: 
 58                                  atomadp = UT.importClass(self.engine+".atom", "atom",  
 59                                          "AtomicDisplacementFactorAnisotropic", None) 
 60                              if akey.startswith("U") or akey.startswith("B"): 
 61                                  atomadp.set(akey, avalue) 
 62                              else: 
 63                                  atom.set(akey, avalue) 
 64                          atom.set("AtomicDisplacementFactor", atomadp) 
 65                          atomdict[key] = atom 
 66                      elif key in phase.ParamDict: 
 67                          phase.set(key, value) 
 68                  for key in sorted(atomdict.keys()): 
 69                      phase.set("Atom", atomdict[key]) 
 70                   
 71                  fit.set("Phase", phase) 
 72          return 
  73   
 75          """ Build pattern  
 76              FIXME: only for one bank now 
 77          """ 
 78          instname = self.instdict["Name"] 
 79          if instname in ["NPDF", "POWGEN", "TOF"]: 
 80              patternname = "PatternTOF" 
 81              radiationtype = "NeutronTOF" 
 82          elif instname in ["RAPDF", "NeutronCW", "Xray"]: 
 83              patternname = "Pattern2Theta" 
 84              radiationtype = "NeutronCW" 
 85              if instname in ["RAPDF", "Xray"]: 
 86                  radiationtype = "Xray" 
 87          else: 
 88              raise SrrConfigError("SrRietveld doesn't support %s!"%instname) 
 89           
 90          pattern = UT.importClass(self.engine+".pattern", "pattern", patternname, fit) 
 91           
 92          fit.set("Pattern", pattern) 
 93          pattern.setDataProperty([self.datadict.keys()[0],  
 94                  self.datadict.values()[0]["Name"]], radiationtype) 
 95          for patternkey, patternvalue in self.instdict.items(): 
 96               
 97              if patternkey in pattern.ParamDict: 
 98                  pattern.set(patternkey, patternvalue) 
 99              elif patternkey == "MEASUREMENT": 
100                   
101                  for mkey, mvalue in patternvalue[0].items(): 
102                      if mkey in pattern.ParamDict: 
103                          pattern.set(mkey, mvalue) 
104              elif patternkey == "BACKGROUND": 
105                   
106                  bgtype = patternvalue[0]["Type"] 
107                  background = UT.importClass(self.engine+".pattern",  
108                                                  "pattern", bgtype, pattern) 
109                  pattern.set("Background",background) 
110                  for bgkey, bgvalue in patternvalue[0].items(): 
111                      if bgkey == "Type": 
112                          continue 
113                      else: 
114                          background.set(bgkey, bgvalue) 
115              elif patternkey == "EXCLUDEDREGION": 
116                   
117                  exre = UT.importClass(self.engine+".pattern", "pattern",  
118                                                  "ExcludedRegion", pattern) 
119                  for key, value in patternvalue[0].items(): 
120                      exre.set(key, value) 
121                  pattern.set("ExcludedRegion", exre) 
122              elif patternkey == "ENERGY": 
123                  for key, value in patternvalue[0].items(): 
124                      pattern.set(key, value) 
125              elif patternkey == "LPFACTOR": 
126                  lpfactor = pattern.get("LPFactor") 
127                  for key, value in patternvalue[0].items(): 
128                      lpfactor.set(key, value) 
129               
130          return 
 131   
133          """ Build contribution """ 
134          phaselist = fit.get("Phase") 
135          patternlist = fit.get("Pattern") 
136           
137          for phase in phaselist: 
138              for pattern in patternlist: 
139                  classname = pattern.__class__.__name__ 
140                  contributionname = "Contribution" + classname.split("Pattern")[1] 
141                  contribution = UT.importClass(self.engine+".contribution",  
142                          "contribution", contributionname, fit, pattern, phase) 
143                  fit.set("Contribution", contribution) 
144   
145          for key, value in self.instdict["MEASUREMENT"][0].items(): 
146              if key in contribution.ParamDict.keys(): 
147                  contribution.set(key, value) 
148   
149          if "EXPDECAYFUNCTION" in self.instdict.keys(): 
150              expdecay = contribution.get("ExpDecayFunction") 
151              for key, value in self.instdict["EXPDECAYFUNCTION"][0].items(): 
152                  expdecay.set(key, value) 
153          else: 
154              pass 
155          return 
 156   
157   
159          """ Build peakprofile """ 
160          contributionlist = fit.get("Contribution") 
161          profile_id = -1 
162          for instkey, instvalue in self.instdict.items(): 
163              if instkey.count("PEAKPROFILE") == 1: 
164                  profile = UT.importClass(self.engine+".contribution",  
165                                          "contribution", instvalue[0]["Type"], None) 
166                  for key, value in instvalue[0].items(): 
167                      if key != "Type":    
168                          profile.set(key, value) 
169                  profile_id += 1 
170                  contribution = contributionlist[profile_id] 
171                  contribution.set("Profile", profile)  
172          return 
 173   
175          """ Add background points to fit """ 
176          patterns = fit.get("Pattern") 
177          for pattern in patterns: 
178              pattern.addBackgroundPoints(bkgdlist) 
179          return 
 180   
182          """ Add excludedregion to fit """ 
183          patterns = fit.get("Pattern") 
184          for pattern in patterns: 
185              pattern_id = patterns.index(pattern) + 1 
186              bankterm = "BANK" + str(pattern_id) 
187              if bankterm in exredict.keys():  
188                  exre = UT.importClass(self.engine+".pattern", "pattern",  
189                                                  "ExcludedRegion", pattern) 
190                  for key, value in exredict[bankterm][0].items(): 
191                      exre.set(key, value) 
192                  pattern.set("ExcludedRegion", exre) 
193          return 
  194