Ignore:
Timestamp:
Mar 4, 2017 8:34:05 AM (8 years ago)
Author:
vondreele
Message:

removed all "except Exception as detail" blocks from importers & G2export_CIF. Were in the way of effective debugging of import codes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/imports/G2sfact_CIF.py

    r2136 r2738  
    5656                      )
    5757
    58         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
     58#        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
    6363
    6464        Fcalcnames = ('_refln_f_calc','_refln.f_calc','_refln.f_calc_au',
     
    9090        rdbuffer = kwarg.get('buffer')
    9191        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
    92184        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
    119215                        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
    126219                        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
    150228                            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:
    219230                        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
    226232                            break
    227233                    break
    228234            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]
    242261                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]])
    269272                    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)
    311274                    try:
    312                         if Phdn:
    313                             ref[10+im] = float(item[itemkeys[Phdn]])
     275                        if F2cdn:
     276                            F2c = float(item[itemkeys[F2cdn]])
    314277                    except:
    315278                        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]])
    316306                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)
    319311#                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.