Changeset 941 for trunk/exports


Ignore:
Timestamp:
Jun 4, 2013 11:53:16 PM (8 years ago)
Author:
toby
Message:

fix Matts mac bug on switching phase tabs; start doc of phase contents; get major CIF data names (but not yet values) into export

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/exports/G2cif.py

    r938 r941  
    2525        def WriteCIFitem(name,value=''):
    2626            if value:
    27                 if "\n" in value or len(value)+len(name)+4 > 70:
     27                if "\n" in value or len(value)> 70:
    2828                    if name.strip(): print name
    2929                    print '; '+value
    3030                    print '; '
    3131                elif " " in value:
    32                     print name,'  ','"' + str(value) + '"'
     32                    if len(name)+len(value) > 65:
     33                        print name,'\n   ','"' + str(value) + '"'
     34                    else:
     35                        print name,'  ','"' + str(value) + '"'
    3336                else:
    34                     print name,'  ',value
     37                    if len(name)+len(value) > 65:
     38                        print name,'\n   ',value
     39                    else:
     40                        print name,'  ',value
    3541            else:
    3642                print name
     
    4854            '''TODO: Write out overall refinement information
    4955            '''
     56            WriteCIFitem('_pd_proc_info_datetime', self.CIFdate)
     57            WriteCIFitem('_pd_calc_method', 'Rietveld Refinement')
    5058            #WriteCIFitem('_refine_ls_shift/su_max',DAT1)
    5159            #WriteCIFitem('_refine_ls_shift/su_mean',DAT2)
     
    6371            # _refine_ls_restrained_S_all
    6472            # _refine_ls_restrained_S_obs
     73
    6574            # include an overall profile r-factor, if there is more than one powder histogram
    6675            if self.npowder > 1:
    67                 WriteCIFitem('# Overall powder R-factors')
     76                WriteCIFitem('\n# OVERALL POWDER R-FACTORS')
    6877                #WriteCIFitem('_pd_proc_ls_prof_R_factor',TEXT(11:20))
    6978                #WriteCIFitem('_pd_proc_ls_prof_wR_factor',TEXT(1:10))
     
    96105
    97106        def WritePhaseInfo(phasenam):
     107            # see writepha.for
    98108            print 'TODO: phase info for',phasenam,'goes here'
    99             phasedict = self.GroupedParms['Phases'][phasenam] # pointer to current phase info
    100             print phasedict.keys()
    101             # see WRITEPHASE
     109            # THINK: how to select publication flags for distances/angles?
     110            phasedict = self.GroupedParms['Phases'][phasenam] # pointer to current phase info           
     111            WriteCIFitem('_pd_phase_name', phasenam)
     112            text = '?'
     113            for lbl in 'a','b','c':
     114                WriteCIFitem('_cell_length_'+lbl,text)
     115            for lbl in 'alpha','beta ','gamma':
     116                WriteCIFitem('_cell_angle_'+lbl,text)
     117
     118            WriteCIFitem('_cell_volume',text)
     119
     120            #print phasedict['Histograms']
     121#            for key in phasedict['General']:
     122#                print key,'=',phasedict['General'][key]
     123#            print phasedict['pId']
     124
     125            #NSYS = (1,2,3,4,4,5,5,5,5,5,6,6,7,7)
     126            #SYST = ('','triclinic','monoclinic','orthorhombic','tetragonal','trigonal ','hexagonal','cubic')
     127
     128            WriteCIFitem('_symmetry_cell_setting',
     129                         phasedict['General']['SGData']['SGSys'])
     130
     131            spacegroup = phasedict['General']['SGData']['SpGrp'].strip()
     132            # regularize capitalization and remove trailing H/R
     133            spacegroup = spacegroup[0].upper() + spacegroup[1:].lower().rstrip('rh ')
     134            WriteCIFitem('_symmetry_space_group_name_H-M',spacegroup)
     135            # generate symmetry operations including centering and center of symmetry
     136            WriteCIFitem('loop_ _symmetry_equiv_pos_site_id _symmetry_equiv_pos_as_xyz')
     137
     138            # loop over histogram(s) used in this phase
     139            if not oneblock:
     140                # pointers to histograms used in this phase
     141                histlist = []
     142                for hist in self.GroupedParms['Phases'][phasenam]['Histograms']:
     143                    if self.GroupedParms['Phases'][phasenam]['Histograms'][hist]['Use']:
     144                        if phasebyhistDict.get(hist):
     145                            phasebyhistDict[hist].append(phasenam)
     146                        else:
     147                            phasebyhistDict[hist] = [phasenam,]
     148                        blockid = datablockidDict.get(hist)
     149                        if not blockid:
     150                            print "Internal error: no block for data. Phase "+str(
     151                                phasenam)+" histogram "+str(hist)
     152                            histlist = []
     153                            break
     154                        histlist.append(blockid)
     155
     156                if len(histlist) == 0:
     157                    WriteCIFitem('# Note: phase has no associated data')
     158                else:
     159                    WriteCIFitem('loop_  _pd_block_diffractogram_id')
     160                    for hist in histlist:
     161                        WriteCIFitem('',hist)
     162                        # TODO: sample/histogram profile information and other "HAP" info should be
     163                        # reported in this loop, such as
     164                        # _pd_proc_ls_pref_orient_corr
     165                        # _pd_proc_ls_profile_function
     166                        #txt = ' Spherical Harmonic ODF' + '\n spherical harmonic order='+'?'
     167                        #IF ( ISAMSYM.EQ.1 ) THEN
     168                        #txt += '\n No sample symmetry'
     169                #ELSE IF ( ISAMSYM.EQ.2 ) THEN
     170                #txt += ' The sample symmetry is: 2/m (shear texture)'
     171                #ELSE IF ( ISAMSYM.EQ.3 ) THEN
     172                #txt += ' The sample symmetry is: mmm (rolling texture)'
     173                #ELSE IF ( ISAMSYM.EQ.0 ) THEN
     174                #txt += ' The sample symmetry is: cylindrical (fiber texture)'
     175                #WriteCIFitem('_pd_proc_ls_pref_orient_corr',txt)
     176            else:
     177                # report all profile information here (include instrumental)
     178                # _pd_proc_ls_pref_orient_corr
     179                # _pd_proc_ls_profile_function
     180                pass
     181           
     182            WriteCIFitem('\n# ATOMIC COORDINATES AND DISPLACEMENT PARAMETERS')
     183     
     184            WriteCIFitem('loop_ '+
     185                         '\n\t_atom_site_type_symbol'+
     186                         '\n\t_atom_site_label'+
     187                         '\n\t_atom_site_fract_x'+
     188                         '\n\t_atom_site_fract_y'+
     189                         '\n\t_atom_site_fract_z'+
     190                         '\n\t_atom_site_occupancy'+
     191                         '\n\t_atom_site_thermal_displace_type'+
     192                         '\n\t_atom_site_U_iso_or_equiv'+
     193                         '\n\t_atom_site_symmetry_multiplicity')
     194
     195            WriteCIFitem('loop_' + '\n\t_atom_site_aniso_label' +
     196                         '\n\t_atom_site_aniso_U_11' + '\n\t_atom_site_aniso_U_12' +
     197                         '\n\t_atom_site_aniso_U_13' + '\n\t_atom_site_aniso_U_22' +
     198                         '\n\t_atom_site_aniso_U_23' + '\n\t_atom_site_aniso_U_33')
     199
     200            # process the chemical formula: pick a Z value & generate molecular weight
     201            # find the maximum possible Z value
     202
     203            # order the elements in "Hill" order: C, H, D, T & alphabetical or alphabetical
     204            if not oneblock: # in single block, this is combined with the scattering factors
     205                WriteCIFitem('loop_  _atom_type_symbol _atom_type_number_in_cell')
     206
     207            WriteCIFitem('# If you change Z, be sure to change all 3 of the following')
     208            WriteCIFitem( '_chemical_formula_sum',text)
     209            #WRITE(TEXT,'(F15.2)') ATMASS
     210            WriteCIFitem( '_chemical_formula_weight',text)
     211            #WRITE(TEXT,'(I4)') Z
     212            WriteCIFitem( '_cell_formula_units_Z',text)
     213
     214            #C now loop over interatomic distances for this phase
     215            WriteCIFitem('\n# MOLECULAR GEOMETRY')
     216            WriteCIFitem('loop_' +
     217                         '\n\t_geom_bond_atom_site_label_1' +
     218                         '\n\t_geom_bond_atom_site_label_2' +
     219                         '\n\t_geom_bond_distance' +
     220                         '\n\t_geom_bond_site_symmetry_1' +
     221                         '\n\t_geom_bond_site_symmetry_2' +
     222                         '\n\t_geom_bond_publ_flag')
     223
     224            #C now loop over interatomic angles for this phase
     225            WriteCIFitem('loop_' +
     226                         '\n\t_geom_angle_atom_site_label_1' +
     227                         '\n\t_geom_angle_atom_site_label_2' +
     228                         '\n\t_geom_angle_atom_site_label_3' +
     229                         '\n\t_geom_angle' +
     230                         '\n\t_geom_angle_site_symmetry_1' +
     231                         '\n\t_geom_angle_site_symmetry_2' +
     232                         '\n\t_geom_angle_site_symmetry_3' +
     233                         '\n\t_geom_angle_publ_flag')
    102234
    103235        def WritePowderData(histlbl):
     236            text = '?'
    104237            histblk = self.GroupedParms['PWDR'][histlbl]
    105238            print 'TODO: powder here data for',histblk["Sample Parameters"]['InstrName']
    106             # see WRPOWDHIST & WRREFLIST
    107 
     239            # see wrpowdhist.for & wrreflist.for
     240           
     241            refprx = '_refln.' # mm
     242            refprx = '_refln_' # normal
     243
     244            if not oneblock:
     245                if not phasebyhistDict.get(histlbl):
     246                    WriteCIFitem('\n# No phases associated with this data set')
     247                else:
     248                    WriteCIFitem('\n# PHASE TABLE')
     249                    WriteCIFitem('loop_' +
     250                                 '\n\t_pd_phase_id' +
     251                                 '\n\t_pd_phase_block_id' +
     252                                 '\n\t_pd_phase_mass_%')
     253                    for phasenam in phasebyhistDict.get(histlbl):
     254                        pass
     255
     256            WriteCIFitem('\n# SCATTERING FACTOR INFO')
     257            WriteCIFitem('_diffrn_radiation_wavelength' ,text)
     258            #WriteCIFitem('_diffrn_radiation_type',text)
     259            #C always assume Ka1 & Ka2 if two wavelengths are present
     260            #WriteCIFitem('loop_' +
     261            #             '\n\t_diffrn_radiation_wavelength' +
     262            #             '\n\t_diffrn_radiation_wavelength_wt' +
     263            #             '\n\t_diffrn_radiation_type' +
     264            #             '\n\t_diffrn_radiation_wavelength_id')
     265            #WRITE LAM1,1.0,'K\\a~1~',1, LAM2,ratio,'K\\a~2~',2
     266
     267            WriteCIFitem('_pd_proc_ls_prof_R_factor','?')
     268            WriteCIFitem('_pd_proc_ls_prof_wR_factor','?')
     269            WriteCIFitem('_pd_proc_ls_prof_wR_expected','?')
     270            WriteCIFitem('_refine_ls_R_Fsqd_factor','?')
     271           
     272            #WriteCIFitem('_pd_meas_2theta_fixed',text)
     273            WriteCIFitem('_diffrn_radiation_probe','x-ray')
     274            WriteCIFitem('_diffrn_radiation_probe','neutron')
     275            WriteCIFitem('_diffrn_radiation_polarisn_ratio','?')
     276           
     277            WriteCIFitem('loop_  _atom_type_symbol')
     278            if oneblock:
     279                WriteCIFitem('       _atom_type_number_in_cell')
     280            #IF (HTYP(2:2) .eq. 'X' .AND. HTYP(3:3) .ne. 'E') THEN
     281            WriteCIFitem('      _atom_type_scat_dispersion_real')
     282            WriteCIFitem('      _atom_type_scat_dispersion_imag')
     283            for lbl in ('a1','a2','a3', 'a4', 'b1', 'b2', 'b3', 'b4', 'c'):
     284                WriteCIFitem('      _atom_type_scat_Cromer_Mann_'+lbl)
     285            #ELSEIF (HTYP(2:2) .eq. 'N') THEN
     286            WriteCIFitem('      _atom_type_scat_length_neutron')
     287            #ENDIF
     288            WriteCIFitem('      _atom_type_scat_source')
     289
     290            #C document the background function used
     291            WriteCIFitem('_pd_proc_ls_background_function','?')
     292
     293            WriteCIFitem('_exptl_absorpt_process_details','?')
     294            WriteCIFitem('_exptl_absorpt_correction_T_min','?')
     295            WriteCIFitem('_exptl_absorpt_correction_T_max','?')
     296            #C extinction
     297            #WRITE(IUCIF,'(A)') '# Extinction correction'
     298            #CALL WRVAL(IUCIF,'_gsas_exptl_extinct_corr_T_min',TEXT(1:10))
     299            #CALL WRVAL(IUCIF,'_gsas_exptl_extinct_corr_T_max',TEXT(11:20))
     300
     301            if not oneblock:
     302                # instrumental profile terms go here
     303                WriteCIFitem('_pd_proc_ls_profile_function','?')
     304
     305            WriteCIFitem('\n# STRUCTURE FACTOR TABLE')           
     306            WriteCIFitem('loop_' +
     307                         '\n\t' + refprx + 'index_h' +
     308                         '\n\t' + refprx + 'index_k' +
     309                         '\n\t' + refprx + 'index_l' +
     310                         '\n\t_pd_refln_wavelength_id' +
     311                         '\n\t_pd_refln_phase_id' +
     312                         '\n\t' + refprx + 'status' +
     313                         '\n\t' + refprx + 'F_squared_meas' +
     314                         '\n\t' + refprx + 'F_squared_sigma' +
     315                         '\n\t' + refprx + 'F_squared_calc' +
     316                         '\n\t' + refprx + 'phase_calc' +
     317                         '\n\t_pd_refln_d_spacing' +
     318                         '\n\t_gsas_i100_meas')
     319
     320            WriteCIFitem('_reflns_number_total', text)
     321            WriteCIFitem('_reflns_limit_h_min', text)
     322            WriteCIFitem('_reflns_limit_h_max', text)
     323            WriteCIFitem('_reflns_limit_k_min', text)
     324            WriteCIFitem('_reflns_limit_k_max', text)
     325            WriteCIFitem('_reflns_limit_l_min', text)
     326            WriteCIFitem('_reflns_limit_l_max', text)
     327            WriteCIFitem('_reflns_d_resolution_high', text)
     328            WriteCIFitem('_reflns_d_resolution_low', text)
     329           
     330            WriteCIFitem('\n# POWDER DATA TABLE')
     331            # is data fixed step?
     332            fixedstep = False
     333            # are ESDs sqrt(I)
     334            countsdata = False
     335            zero = 0.01
     336            if fixedstep:
     337                WriteCIFitem('_pd_meas_2theta_range_min', text)
     338                WriteCIFitem('_pd_meas_2theta_range_max', text)
     339                WriteCIFitem('_pd_meas_2theta_range_inc', text)
     340                # zero correct
     341                if zero != 0.0:
     342                    WriteCIFitem('_pd_proc_2theta_range_min', text)
     343                    WriteCIFitem('_pd_proc_2theta_range_max', text)
     344                    WriteCIFitem('_pd_proc_2theta_range_inc', text)
     345            WriteCIFitem('loop_' +
     346                         '\n\t_pd_proc_d_spacing')
     347                         #'_pd_meas_time_of_flight'
     348            if not fixedstep:
     349                if zero != 0.0:
     350                    WriteCIFitem('\t_pd_proc_2theta_corrected')
     351                else:
     352                    WriteCIFitem('\t_pd_meas_2theta_scan')
     353            if countsdata:
     354                WriteCIFitem('\t_pd_meas_counts_total')
     355            else:
     356                WriteCIFitem('\t_pd_meas_intensity_total')
     357            WriteCIFitem('\t_pd_proc_ls_weight')
     358            WriteCIFitem('\t_pd_proc_intensity_bkg_calc')
     359            WriteCIFitem('\t_pd_calc_intensity_total')
     360            if zero != 0.0:
     361                WriteCIFitem('_pd_proc_number_of_points', text)
     362            else:
     363                WriteCIFitem('_pd_meas_number_of_points', text)
     364                         
    108365        def WriteSingleXtalData(histlbl):
    109366            histblk = self.GroupedParms['HKLF'][histlbl]
    110367            print 'TODO: single xtal here data for',histblk["Instrument Parameters"][0]['InstrName']
    111             # see WRREFLIST
    112 
     368            # see wrreflist.for
     369            refprx = '_refln.' # mm
     370            refprx = '_refln_' # normal
     371           
     372            WriteCIFitem('\n# STRUCTURE FACTOR TABLE')           
     373            WriteCIFitem('loop_' +
     374                         '\n\t' + refprx + 'index_h' +
     375                         '\n\t' + refprx + 'index_k' +
     376                         '\n\t' + refprx + 'index_l' +
     377                         '\n\t' + refprx + 'status' +
     378                         '\n\t' + refprx + 'F_squared_meas' +
     379                         '\n\t' + refprx + 'F_squared_sigma' +
     380                         '\n\t' + refprx + 'F_squared_calc' +
     381                         '\n\t' + refprx + 'phase_calc')
     382            WriteCIFitem('_reflns_number_total', text)
     383            WriteCIFitem('_reflns_number_observed', text)
     384            WriteCIFitem('_reflns_limit_h_min', text)
     385            WriteCIFitem('_reflns_limit_h_max', text)
     386            WriteCIFitem('_reflns_limit_k_min', text)
     387            WriteCIFitem('_reflns_limit_k_max', text)
     388            WriteCIFitem('_reflns_limit_l_min', text)
     389            WriteCIFitem('_reflns_limit_l_max', text)
     390            WriteCIFitem('_reflns_d_resolution_high', text)
     391            WriteCIFitem('_reflns_d_resolution_low', text)
     392
     393        #============================================================
    113394        # the export process starts here
    114395        self.loadTree()
     
    273554            WriteCIFitem('data_'+str(self.CIFname)+'_overall')
    274555            WriteOverall()
    275             WriteCIFitem('# pointers to phase and histogram blocks')
    276             # loop over future phase blocks
     556            #============================================================
     557            WriteCIFitem('# POINTERS TO PHASE AND HISTOGRAM BLOCKS')
     558            datablockidDict = {} # save block names here -- N.B. check for conflicts between phase & hist names (unlikely!)
     559            # loop over phase blocks
    277560            if self.nphase > 1:
    278561                loopprefix = ''
     
    280563            else:
    281564                loopprefix = '_pd_phase_block_id'
     565           
    282566            for i,phasenam in enumerate(sorted(self.GroupedParms['Phases'].keys())):
    283                 WriteCIFitem(loopprefix,
    284                              str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
    285                              'phase_'+ str(i) + '|' + str(self.shortauthorname))
    286             # loop over future data blocks, create and save block names
     567                datablockidDict[phasenam] = (str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
     568                             'phase_'+ str(i+1) + '|' + str(self.shortauthorname))
     569                WriteCIFitem(loopprefix,datablockidDict[phasenam])
     570            # loop over data blocks
    287571            i = 0
    288             datablockidDict = {}
    289572            if self.npowder + self.nsingle > 1:
    290573                loopprefix = ''
    291                 WriteCIFitem('loop_   _pd_block_diffractogramphase_id')
     574                WriteCIFitem('loop_   _pd_block_diffractogram_id')
    292575            else:
    293576                loopprefix = '_pd_block_diffractogram_id'
     
    302585                        instnam = histblk["Instrument Parameters"][0]['InstrName']
    303586                    instnam = instnam.replace(' ','')
     587                    if datablockidDict.get(key1):
     588                        print "Error: histogram name is duplicated: ",key1
     589                        return
    304590                    datablockidDict[key1] = (str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
    305591                                             str(self.shortauthorname) + "|" +
     
    307593                    WriteCIFitem(loopprefix,datablockidDict[key1])
    308594            #============================================================
    309             # export phase information
    310             for i,phasenam in enumerate(sorted(self.GroupedParms['Phases'].keys())):
     595            # loop over phases, exporting them
     596            phasebyhistDict = {} # create a cross-reference to phases by histogram
     597            for j,phasenam in enumerate(sorted(self.GroupedParms['Phases'].keys())):
     598                i = j + 1
    311599                WriteCIFitem('\ndata_'+self.CIFname+"_phase_"+str(i))
    312600                print "debug, processing ",phasenam
    313601                WriteCIFitem('# Information for phase '+str(i))
    314                 WriteCIFitem('_pd_block_id',
    315                              str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
    316                              'phase_'+ str(i) + '|' + str(self.shortauthorname))
    317                 # pointers to histograms used in this phase
    318                 histlist = []
    319                 for hist in self.GroupedParms['Phases'][phasenam]['Histograms']:
    320                     if self.GroupedParms['Phases'][phasenam]['Histograms'][hist]['Use']:
    321                         blockid = datablockidDict.get(hist)
    322                         if not blockid:
    323                             print "Internal error: no block for data. Phase "+str(
    324                                 phasenam)+" histogram "+str(hist)
    325                             histlist = []
    326                             break
    327                         histlist.append(blockid)
    328                 if len(histlist) == 0:
    329                     WriteCIFitem('# Note: phase has no associated data')
    330                 elif len(histlist) == 1:
    331                     WriteCIFitem('_pd_block_diffractogram_id',histlist[0])
    332                 else:
    333                     WriteCIFitem('loop_  _pd_block_diffractogram_id')
    334                     for hist in histlist:
    335                         WriteCIFitem('',hist)
     602                WriteCIFitem('_pd_block_id',datablockidDict[phasenam])
    336603                # report the phase
    337604                WritePhaseTemplate()
     
    339606
    340607            #============================================================
    341             # loop over histograms
     608            # loop over histograms, exporting them
     609            i = 0
    342610            for key in self.GroupedParms:
    343611                if key == 'Phases': continue
     
    346614                    histblk = self.GroupedParms[key][key1]
    347615                    if key == "PWDR":
    348                         WriteCIFitem('\ndata_'+self.CIFname+"_p_"+str(i))
     616                        WriteCIFitem('\ndata_'+self.CIFname+"_pwd_"+str(i))
    349617                    elif key == "HKLF":
    350                         WriteCIFitem('\ndata_'+self.CIFname+"_s_"+str(i))
     618                        WriteCIFitem('\ndata_'+self.CIFname+"_sx_"+str(i))
    351619                    WriteCIFitem('# Information for histogram '+str(i)+': '+
    352620                                 key1)
     
    358626                        WriteSnglXtalTemplate()
    359627                        WriteSingleXtalData(key1)
     628
     629        # TODO: how to report _pd_proc_ls_peak_cutoff?
    360630        WriteCIFitem('#--' + 15*'eof--' + '#')
     631
Note: See TracChangeset for help on using the changeset viewer.