Changeset 2738 for trunk/imports/G2sfact_CIF.py
- Timestamp:
- Mar 4, 2017 8:34:05 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/imports/G2sfact_CIF.py ¶
r2136 r2738 56 56 ) 57 57 58 Idatanames = ('_refln_intensity_meas','_refln.intensity_meas',59 ) # not used yet60 61 Isignames = ('_refln_intensity_meas_sigma','_refln.intensity_meas_sigma',62 ) # not used yet58 # Idatanames = ('_refln_intensity_meas','_refln.intensity_meas', 59 # ) # not used yet 60 # 61 # Isignames = ('_refln_intensity_meas_sigma','_refln.intensity_meas_sigma', 62 # ) # not used yet 63 63 64 64 Fcalcnames = ('_refln_f_calc','_refln.f_calc','_refln.f_calc_au', … … 90 90 rdbuffer = kwarg.get('buffer') 91 91 cf = None 92 if self.repeat and rdbuffer is not None: 93 cf = rdbuffer.get('lastcif') 94 print 'Reusing previously parsed CIF' 95 if cf is None: 96 self.ShowBusy() # this can take a while 97 cf = G2IO.ReadCIF(filename) 98 self.DoneBusy() 99 # scan blocks for reflections 100 self.errors = 'Error during scan of blocks for datasets' 101 blklist = [] 102 for blk in cf.keys(): # scan for reflections, F or F2 values and cell lengths. 103 # Ignore blocks that do not have structure factors and a cell 104 blkkeys = [k.lower() for k in cf[blk].keys()] 105 gotFo = False 106 im = 0 107 for i in range(2): 108 if hklitems[i][3] in blkkeys: #Super lattice reflections h,k,l,m 109 im = 1 110 if hklitems[i][0] in blkkeys and hklitems[i][1] in blkkeys and hklitems[i][2] in blkkeys: 111 dnIndex = i 112 break 113 else: 114 break # no reflections 115 for dn in Fdatanames: 116 if dn in blkkeys: 117 blklist.append(blk) 118 gotFo = True 119 break 120 if gotFo: break 121 for dn in F2datanames: 122 if dn in blkkeys: 123 blklist.append(blk) 124 break 125 else: 126 break 127 if not blklist: 128 selblk = None # no block to choose 129 elif len(blklist) == 1: # only one choice 130 selblk = 0 131 else: # choose from options 132 choice = [] 133 for blknm in blklist: 134 choice.append('') 135 # accumulate some info about this phase 136 choice[-1] += blknm + ': ' 137 for i in phasenamefields: # get a name for the phase 138 name = cf[blknm].get(i) 139 if name is None or name == '?' or name == '.': 140 continue 141 else: 142 choice[-1] += name.strip()[:20] + ', ' 143 break 144 s = '' 145 fmt = "%.2f," 146 for i,key in enumerate(cellitems[dnIndex]): 147 if i == 3: fmt = "%.f," 148 if i == 5: fmt = "%.f" 149 val = cf[blknm].get(key) 150 if val is None: break 151 s += fmt % cif.get_number_with_esd(val)[0] 152 if s: choice[-1] += ', cell: ' + s 153 for dn in SGdataname: 154 sg = cf[blknm].get(dn) 155 if sg: 156 choice[-1] += ', (' + sg.strip() + ')' 157 break 158 choice.append('Import all of the above') 159 if self.repeat: # we were called to repeat the read 160 selblk = self.repeatcount 161 self.repeatcount += 1 162 if self.repeatcount >= len(blklist): self.repeat = False 163 else: 164 selblk = self.BlockSelector( 165 choice, 166 ParentFrame=ParentFrame, 167 title='Select a dataset from one the CIF data_ blocks below', 168 size=(600,100), 169 header='Dataset Selector') 170 self.errors = 'Error during reading of selected block' 171 if selblk is None: 172 return False # no block selected or available 173 if selblk >= len(blklist): # all blocks selected 174 selblk = 0 175 self.repeat = True 176 if rdbuffer is not None: 177 rdbuffer['lastcif'] = cf # save the parsed cif for the next loop 178 self.repeatcount = 1 179 blknm = blklist[selblk] 180 blk = cf[blklist[selblk]] 181 self.objname = os.path.basename(filename)+':'+str(blknm) 182 self.errors = 'Error during reading of reflections' 183 # read in reflections 92 184 try: 93 if self.repeat and rdbuffer is not None: 94 cf = rdbuffer.get('lastcif') 95 print 'Reusing previously parsed CIF' 96 if cf is None: 97 self.ShowBusy() # this can take a while 98 try: 99 cf = G2IO.ReadCIF(filename) 100 except Exception as detail: 101 self.errors = "Parse or reading of file failed in pyCifRW; check syntax of file in enCIFer or CheckCIF" 102 return False 103 finally: 104 self.DoneBusy() 105 # scan blocks for reflections 106 self.errors = 'Error during scan of blocks for datasets' 107 blklist = [] 108 for blk in cf.keys(): # scan for reflections, F or F2 values and cell lengths. 109 # Ignore blocks that do not have structure factors and a cell 110 blkkeys = [k.lower() for k in cf[blk].keys()] 111 gotFo = False 112 gotFo2 = False 113 im = 0 114 for i in range(2): 115 if hklitems[i][3] in blkkeys: #Super lattice reflections h,k,l,m 116 im = 1 117 if hklitems[i][0] in blkkeys and hklitems[i][1] in blkkeys and hklitems[i][2] in blkkeys: 118 dnIndex = i 185 refloop = blk.GetLoop(hklitems[0][0]) 186 dnIndex = 0 187 except KeyError: 188 try: 189 refloop = blk.GetLoop(hklitems[1][0]) 190 dnIndex = 1 191 except KeyError: 192 self.errors += "\nUnexpected: '_refln[-.]index_h not found!" 193 return False 194 itemkeys = {} 195 # prepare an index to the CIF reflection loop 196 for i,key in enumerate(refloop.keys()): 197 itemkeys[key.lower()] = i 198 199 # scan for data names: 200 F2dn = None 201 Fdn = None 202 F2cdn = None 203 Fcdn = None 204 F2sdn = None 205 Fsdn = None 206 Phdn = None 207 FcalcPresent = False 208 for dn in F2datanames: 209 if dn in itemkeys: 210 F2dn = dn 211 for dm in F2calcnames: 212 if dm in itemkeys: 213 F2cdn = dm 214 FcalcPresent = True 119 215 break 120 else: 121 break # no reflections 122 for dn in Fdatanames: 123 if dn in blkkeys: 124 blklist.append(blk) 125 gotFo = True 216 for dm in F2signames: 217 if dm in itemkeys: 218 F2sdn = dm 126 219 break 127 if gotFo: break 128 for dn in F2datanames: 129 if dn in blkkeys: 130 blklist.append(blk) 131 break 132 else: 133 break 134 if not blklist: 135 selblk = None # no block to choose 136 elif len(blklist) == 1: # only one choice 137 selblk = 0 138 else: # choose from options 139 choice = [] 140 for blknm in blklist: 141 choice.append('') 142 # accumulate some info about this phase 143 choice[-1] += blknm + ': ' 144 for i in phasenamefields: # get a name for the phase 145 name = cf[blknm].get(i) 146 if name is None or name == '?' or name == '.': 147 continue 148 else: 149 choice[-1] += name.strip()[:20] + ', ' 220 break 221 else: 222 for dn in Fdatanames: 223 if dn in itemkeys: 224 Fdn = dn 225 for dm in Fcalcnames: 226 if dm in itemkeys: 227 Fcdn = dm 150 228 break 151 s = '' 152 fmt = "%.2f," 153 for i,key in enumerate(cellitems[dnIndex]): 154 if i == 3: fmt = "%.f," 155 if i == 5: fmt = "%.f" 156 val = cf[blknm].get(key) 157 if val is None: break 158 s += fmt % cif.get_number_with_esd(val)[0] 159 if s: choice[-1] += ', cell: ' + s 160 for dn in SGdataname: 161 sg = cf[blknm].get(dn) 162 if sg: 163 choice[-1] += ', (' + sg.strip() + ')' 164 break 165 choice.append('Import all of the above') 166 if self.repeat: # we were called to repeat the read 167 selblk = self.repeatcount 168 self.repeatcount += 1 169 if self.repeatcount >= len(blklist): self.repeat = False 170 else: 171 selblk = self.BlockSelector( 172 choice, 173 ParentFrame=ParentFrame, 174 title='Select a dataset from one the CIF data_ blocks below', 175 size=(600,100), 176 header='Dataset Selector') 177 self.errors = 'Error during reading of selected block' 178 if selblk is None: 179 return False # no block selected or available 180 if selblk >= len(blklist): # all blocks selected 181 selblk = 0 182 self.repeat = True 183 if rdbuffer is not None: 184 rdbuffer['lastcif'] = cf # save the parsed cif for the next loop 185 self.repeatcount = 1 186 blknm = blklist[selblk] 187 blk = cf[blklist[selblk]] 188 self.objname = os.path.basename(filename)+':'+str(blknm) 189 self.errors = 'Error during reading of reflections' 190 # read in reflections 191 try: 192 refloop = blk.GetLoop(hklitems[0][0]) 193 dnIndex = 0 194 except KeyError: 195 try: 196 refloop = blk.GetLoop(hklitems[1][0]) 197 dnIndex = 1 198 except KeyError: 199 self.errors += "\nUnexpected: '_refln[-.]index_h not found!" 200 return False 201 itemkeys = {} 202 # prepare an index to the CIF reflection loop 203 for i,key in enumerate(refloop.keys()): 204 itemkeys[key.lower()] = i 205 206 # scan for data names: 207 F2dn = None 208 Fdn = None 209 F2cdn = None 210 Fcdn = None 211 F2sdn = None 212 Fsdn = None 213 Phdn = None 214 FcalcPresent = False 215 for dn in F2datanames: 216 if dn in itemkeys: 217 F2dn = dn 218 for dm in F2calcnames: 229 for dm in Fsignames: 219 230 if dm in itemkeys: 220 F2cdn = dm 221 FcalcPresent = True 222 break 223 for dm in F2signames: 224 if dm in itemkeys: 225 F2sdn = dm 231 Fsdn = dm 226 232 break 227 233 break 228 234 else: 229 for dn in Fdatanames: 230 if dn in itemkeys: 231 Fdn = dn 232 for dm in Fcalcnames: 233 if dm in itemkeys: 234 Fcdn = dm 235 FcalcPresent = True 236 break 237 for dm in Fsignames: 238 if dm in itemkeys: 239 Fsdn = dm 240 break 241 break 235 msg = "\nno F or F2 loop value found in file\n" 236 msg += "A CIF reflection file needs to have at least one of\n" 237 for dn in F2datanames+Fdatanames: 238 msg += dn + ', ' 239 self.errors += msg 240 return False 241 for dn in phasenames: 242 if dn in itemkeys: 243 Phdn = dn 244 break 245 246 # loop over all reflections 247 for item in refloop: 248 F2c = 0.0 249 sigF2 = 0.0 250 HKL = [] 251 try: 252 for i in hklitems[dnIndex][:3+im]: # '_refln[._]index_[hkl]' 253 num = itemkeys.get(i) 254 try: 255 HKL.append(int(item[num])) 256 except: 257 HKL.append('.') 258 #h,k,l,tw,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,Ext 259 if im: 260 ref = HKL+[1,0,0,0,1, 0,0,0,0,0, 0,0] 242 261 else: 243 msg = "\nno F or F2 loop value found in file\n" 244 msg += "A CIF reflection file needs to have at least one of\n" 245 for dn in F2datanames+Fdatanames: 246 msg += dn + ', ' 247 self.errors += msg 248 return False 249 for dn in phasenames: 250 if dn in itemkeys: 251 Phdn = dn 252 break 253 254 # loop over all reflections 255 for item in refloop: 256 F2c = 0.0 257 sigF2 = 0.0 258 HKL = [] 259 try: 260 for i in hklitems[dnIndex][:3+im]: # '_refln[._]index_[hkl]' 261 num = itemkeys.get(i) 262 try: 263 HKL.append(int(item[num])) 264 except: 265 HKL.append('.') 266 #h,k,l,tw,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,Ext 267 if im: 268 ref = HKL+[1,0,0,0,1, 0,0,0,0,0, 0,0] 262 ref = HKL+[1,0,0,1,0, 0,0,0,0,0, 0] 263 if F2dn: 264 F2 = item[itemkeys[F2dn]] 265 if '(' in F2: 266 F2, sigF2 = cif.get_number_with_esd(F2) 267 F2 = float(F2) 268 sigF2 = float(sigF2) 269 elif F2sdn: 270 F2 = float(F2) 271 sigF2 = float(item[itemkeys[F2sdn]]) 269 272 else: 270 ref = HKL+[1,0,0,1,0, 0,0,0,0,0, 0] 271 if F2dn: 272 F2 = item[itemkeys[F2dn]] 273 if '(' in F2: 274 F2, sigF2 = cif.get_number_with_esd(F2) 275 F2 = float(F2) 276 sigF2 = float(sigF2) 277 elif F2sdn: 278 F2 = float(F2) 279 sigF2 = float(item[itemkeys[F2sdn]]) 280 else: 281 F2 = float(F2) 282 try: 283 if F2cdn: 284 F2c = float(item[itemkeys[F2cdn]]) 285 except: 286 pass 287 else: 288 F = item[itemkeys[Fdn]] 289 if '(' in F: 290 F, sig = cif.get_number_with_esd(F) 291 elif Fsdn: 292 F = float(F) 293 sig = float(item[itemkeys[Fsdn]]) 294 else: 295 F = float(F) 296 sig = 0.0 297 F2 = F**2 298 sigF2 = 2.0*F*sig 299 try: 300 if Fcdn: 301 Fc = float(item[itemkeys[Fcdn]]) 302 F2c = Fc*Fc 303 except: 304 pass 305 306 ref[8+im] = F2 307 ref[5+im] = F2 308 ref[6+im] = sigF2 309 ref[9+im] = F2c 310 ref[7+im] = F2c 273 F2 = float(F2) 311 274 try: 312 if Phdn:313 ref[10+im] = float(item[itemkeys[Phdn]])275 if F2cdn: 276 F2c = float(item[itemkeys[F2cdn]]) 314 277 except: 315 278 pass 279 else: 280 F = item[itemkeys[Fdn]] 281 if '(' in F: 282 F, sig = cif.get_number_with_esd(F) 283 elif Fsdn: 284 F = float(F) 285 sig = float(item[itemkeys[Fsdn]]) 286 else: 287 F = float(F) 288 sig = 0.0 289 F2 = F**2 290 sigF2 = 2.0*F*sig 291 try: 292 if Fcdn: 293 Fc = float(item[itemkeys[Fcdn]]) 294 F2c = Fc*Fc 295 except: 296 pass 297 298 ref[8+im] = F2 299 ref[5+im] = F2 300 ref[6+im] = sigF2 301 ref[9+im] = F2c 302 ref[7+im] = F2c 303 try: 304 if Phdn: 305 ref[10+im] = float(item[itemkeys[Phdn]]) 316 306 except: 317 continue # skip over incompletely parsed reflections 318 self.RefDict['RefList'].append(ref) 307 pass 308 except: 309 continue # skip over incompletely parsed reflections 310 self.RefDict['RefList'].append(ref) 319 311 # self.RefDict['FF'].append({}) 320 self.RefDict['RefList'] = np.array(self.RefDict['RefList']) 321 self.errors = 'Error during reading of dataset parameters' 322 Type = 'SXC' 323 if blk.get('_diffrn_radiation_probe'): 324 if blk['_diffrn_radiation_probe'] == 'neutron': 325 Type = 'SNC' 326 elif blk.get('_diffrn_radiation.probe'): 327 if blk['_diffrn_radiation.probe'] == 'neutron': 328 Type = 'SNC' 329 self.RefDict['Type'] = Type 330 self.RefDict['Super'] = im 331 if blk.get('_diffrn_radiation_wavelength'): 332 wave = float(blk['_diffrn_radiation_wavelength']) 333 elif blk.get('_diffrn_radiation.wavelength'): 334 wave = float(blk['_diffrn_radiation.wavelength']) 335 else: 336 wave = 0.70926 337 self.UpdateParameters(Type=Type,Wave=wave) # histogram type 338 return True 339 except Exception as detail: 340 self.errors += '\n '+str(detail) 341 print self.formatName+' read error:'+str(detail) # for testing 342 import traceback 343 traceback.print_exc(file=sys.stdout) 344 return False 312 self.RefDict['RefList'] = np.array(self.RefDict['RefList']) 313 self.errors = 'Error during reading of dataset parameters' 314 Type = 'SXC' 315 if blk.get('_diffrn_radiation_probe'): 316 if blk['_diffrn_radiation_probe'] == 'neutron': 317 Type = 'SNC' 318 elif blk.get('_diffrn_radiation.probe'): 319 if blk['_diffrn_radiation.probe'] == 'neutron': 320 Type = 'SNC' 321 self.RefDict['Type'] = Type 322 self.RefDict['Super'] = im 323 if blk.get('_diffrn_radiation_wavelength'): 324 wave = float(blk['_diffrn_radiation_wavelength']) 325 elif blk.get('_diffrn_radiation.wavelength'): 326 wave = float(blk['_diffrn_radiation.wavelength']) 327 else: 328 wave = 0.70926 329 self.UpdateParameters(Type=Type,Wave=wave) # histogram type 330 return True
Note: See TracChangeset
for help on using the changeset viewer.