Powder CIF Output
The macros below are from Matthew Rowles and should produce full powder cifs in a journal-friendly format. There are recipes for multiple data sets, multiple strs, x-rays and neutrons and magnetic structures. The CIFs can be viewed in 2D and 3D using pdCIFplotter.py giving a proper record of the final fit. More details and refernces to follow. All the information on how to do things is in the macros. As it says, head to the bottom (“Some examples on how to use the Out_pdCIF macro:”) for info.
The whole file needs to be saved as cif.inc in your main topas directory and the line “#include cif.inc” added to your local.inc.
You can read the paper in J. Appl. Cryst. or more about the project at the IUCr powder commission pages. Please cite if you use.
You can download the windows version at from the IUCr page. It will be slow loading as it has to do a temporary install of all the python gubbins on your computer. There is a quicker version here
Install the python version with: pip install pdCIFplotter.
On windows you may need to preinstall PyCifRW. Follow the instructions on how to do this [https://pypi.org/project/pdCIFplotter/|here]].
Run the python version with: python -m pdCIFplotter
Update the python version with: pip install –upgrade pdCIFplotter (2 minus signs in front of upgrade).
More details at the links above. For me the python version works from the powershell but not a cmd prompt.
The minimum information you need to add to your topas INP file is: “local CIF_PHASE_ID 1” in each str section and “Out_pdCIF(output.cif)” at the end of the INP file.
#ifndef CIF_MACROS #define CIF_MACROS /* Updated 1 Apr 23 Written by Matthew Rowles. Inspiration taken from topas.inc and http://topas.dur.ac.uk/topaswiki/doku.php?id=out_out_general_cif_test Read the first sections for information only. Unless you want to build your own CIF file output. Best head on to the end of this file for the actual macros to use (and the comments immediately preceeding). To get maximum benefit, copy this file to your TOPAS directory and add the following line to your local.inc: #include cif.inc For updates, check http://topas.dur.ac.uk/topaswiki/doku.php?id=out_pdcif ----------- MIT License Copyright (c) 2022 Matthew Rowles Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ '##############################################################' 'Helper macros' macro TOF_ED_CW(tof,ed,cw) { /* This macro allows you to choose between three different things depending on whether or not the data is TOF, EDXRD, or constant wavelength */ if And(Obj_There(neutron), Or(Prm_There(pk_xo_exists), Obj_There(pk_xo))) { 'neutron TOF' tof } else if Obj_There(d_spacing_to_energy_in_eV_for_f1_f11) { 'energy-dispersive X-ray' ed } else { 'constant wavelength X-ray or neutron' cw } } macro & d_spacing_from_TOF(& t0, & t1, & t2) { ' This macro calculates d spacing from TOF' (-t1 + Sqrt(t1^2 - 4 t2 (t0 - X))) / (2 t2) } macro & d_spacing_from_EDXRD(& th2) { 'degrees' ' This macro calculates d spacing from EDXRD - th2 is the angle of the detector in degrees' 12398.41974 / ( 2 X Sin(th2 Deg_on_2)) ' X is eV' '= (h c / e) / (1x10^-10) -> eV per angstrom' } macro n_to_m(n,m) { #m_ifarg n "" 'do nothing' #m_else #m_ifarg m "" 'do nothing' #m_else n## to ##m #m_endif #m_endif } '##############################################################' ' Macros common to diffraction data and crystal structures' '##############################################################' macro Out_CIF_newfile(ciffile) { 'Opens a file for appending to.' out ciffile append } macro Out_CIF_section_break(comment) { 'Inserts a comment in the style of a section break' Out_String("\n#######\t") Out_String(comment) Out_String("\t#######") } macro Out_CIF_datablock(blocknamebase, id) { /* Create the start of an entry in a CIF file. All CIF files must contain at least one datablock. The name must be unique. blocknamebase: a string that you want to appear in the datablock name. No spaces! id: an identifier to be appended to the blocknamebase to ensure the datablock name is unique. No spaces! */ Out_String("\ndata_") Out(blocknamebase, "%s") Out(id, "_%V") } macro Out_CIF_datablock_dataname { Out_String("\ndata_") } macro Out_unique_phase_id(id) { if Prm_There(CIF_PHASE_BLOCK_ID) { Out(CIF_PHASE_BLOCK_ID, "%s") } else { Out(Get(phase_name), "%s") Out(id, "_%V") } } macro Out_unique_diffractogram_id(id) { if Prm_There(CIF_DIFFRACTOGRAM_BLOCK_ID) { Out(CIF_DIFFRACTOGRAM_BLOCK_ID, "%s") } else { Out(Get(xdd_path_name), "%s") Out(id, "_%V") } } macro Out_pdCIF_blockid(blockidbase, id) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_block_id.html _pd_block_id Used to assign a unique character string to a block. Note that this code is not intended to be parsed; the concatenation of several strings is used in order to generate a string that can reasonably be expected to be unique. Note: The pdCIF website for this dataname goes into extensive detail as to how this block_id is to be constructed. The implementation is this macro is extremely simplistic, and designed to be easily automated. */ Out_pdCIF_blockid_dataname Out(blockidbase, "%s") Out(id, "_%V") } macro Out_pdCIF_blockid_dataname { Out_String("\n_pd_block_id\t") } macro Out_CIF_wavelength { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Idiffrn_radiation_wavelength.html _diffrn_radiation_wavelength The radiation wavelength in angstroms. */ Out(Lam, "\n_diffrn_radiation_wavelength\t%.9f") } macro Out_CIF_free_text(text) { 'Inserts a string into the CIF. Must conform to CIF standards' Out_String(text) } '##############################################################' ' Macros for diffraction data ' '##############################################################' macro Out_pdCIF_scan_method(method) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_meas_scan_method.html _pd_meas_scan_method Code identifying the method for scanning reciprocal space. The designation 'fixed' should be used for measurements where film, a stationary position-sensitive or area detector or other non-moving detection mechanism is used to measure diffraction intensities. the value of "method" you pass in must be one of:- step : step scan cont : continuous scan tof : time of flight disp : energy dispersive fixed: stationary detector */ #m_ifarg method "" #m_else Out(method, "\n_pd_meas_scan_method\t%s") #m_endif } macro Out_pdCIF_instr_special_details(goniotype) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/index.html _pd_instr_special_details A brief description of the instrument giving details that cannot be given in other _pd_instr_ entries. */ Out(goniotype, "\n_pd_instr_special_details\n;%s\n;") } macro Out_pdCIF_datetime_initiated(datetime) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_meas_datetime_initiated.html _pd_meas_datetime_initiated The date and time of the data-set measurement. Entries follow the standard CIF format 'yyyy-mm-ddThh:mm:ss+zz'. Use of seconds and a time zone is optional, but use of hours and minutes is strongly encouraged. Where possible, give the time when the measurement was started rather than when it was completed. */ Out(datetime, "\n_pd_meas_datetime_initiated\t%s") } macro Out_CIF_temperature(temp) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Idiffrn_ambient_temperature.html _diffrn_ambient_temperature The mean temperature in kelvins at which the intensities were measured. */ Out(temp, "\n_diffrn_ambient_temperature\t%V") } macro Out_CIF_pressure(pres) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Idiffrn_ambient_pressure.html _diffrn_ambient_pressure The mean hydrostatic pressure in kilopascals at which the intensities were measured. */ Out(pres, "\n_diffrn_ambient_pressure\t%V") } macro Out_pdCIF_2theta_fixed(th2) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_meas_2theta_fixed.html _pd_meas_2theta_fixed The 2\q diffraction angle in degrees for measurements in a white-beam fixed-angle experiment. */ Out(th2, "\n_pd_meas_2theta_fixed\t%s") } macro Out_pdCIF_phase_block_id(phase_id, id) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_phase_block_id.html _pd_phase_block_id A block ID code identifying the phase contributing to the diffraction peak. The data block containing the crystallographic information for this phase will be identified with a _pd_block_id code matching the code in _pd_phase_block_id. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_phase_id.html _pd_phase_id A code for each crystal phase used to link with _pd_refln_phase_id. _pd_phase_mass_% Per cent composition of the specified crystal phase expressed as the total mass of the component with respect to the total mass of the specimen. _pd_calib_std_internal_mass_% Per cent presence of the internal standard specified by the data item _pd_calib_std_internal_name expressed as 100 times the ratio of the amount of standard added to the original sample mass. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_calib_std_internal_name.html _pd_calib_std_internal_name Identity of material(s) used as an internal intensity standard. **NOTE** the blockID is used here, rather than the phase name, for uniqueness. */ Out_String("\nloop_") Out_String("\n\t_pd_phase_id") Out_String("\n\t_pd_phase_block_id") Out_String("\n\t_pd_phase_mass_%") for strs { Out_String("\n") Out(phase_id, "%V\t") Out_unique_phase_id(id) if Obj_There(spiked_mwps) { Out(Get(corrected_weight_percent), "\t%V") } else { Out(Get(weight_percent), "\t%V") } } for strs { if Obj_There(spiked_mwp) { Out_String("\n_pd_calib_std_internal_mass_%") Out(Get(corrected_weight_percent), "\t%V") Out_String("\n_pd_calib_std_internal_name\t") Out_unique_phase_id(id) } } } macro Out_CIF_Rfactors { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefine_ls_goodness_of_fit_all.html _refine_ls_goodness_of_fit_all The least-squares goodness-of-fit parameter S for all reflections after the final cycle of refinement. Ideally, account should be taken of parameters restrained in the least-squares refinement. See also _refine_ls_restrained_S_ definitions. { sum { w [ Y(obs) - Y(calc) ]^2^ } }^1/2^ S = { ----------------------------------- } { Nref - Nparam } https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_ls_prof_.html _pd_proc_ls_prof_R_factor _pd_proc_ls_prof_wR_factor _pd_proc_ls_prof_wR_expected Rietveld/profile fit R factors. Note that the R factor computed for Rietveld refinements using the extracted reflection intensity values (often called the Rietveld or Bragg R factor, R~B~) is not properly a profile R factor. This R factor may be specified using _refine_ls_R_I_factor. (Some authors report _refine_ls_R_Fsqd_factor or _refine_ls_R_factor_all as the Rietveld or Bragg R factor. While it is appropriate to compute and report any or all of these R factors, the names "Rietveld or Bragg R factor" refer strictly to _refine_ls_R_I_factor.) _pd_proc_ls_prof_R_factor, often called R~p~, is an unweighted fitness metric for the agreement between the observed and computed diffraction patterns. R~p~ = sum~i~ | I~obs~(i) - I~calc~(i) | / sum~i~ ( I~obs~(i) ) _pd_proc_ls_prof_wR_factor, often called R~wp~, is a weighted fitness metric for the agreement between the observed and computed diffraction patterns. R~wp~ = SQRT { sum~i~ ( w(i) [ I~obs~(i) - I~calc~(i) ]^2^ ) / sum~i~ ( w(i) [I~obs~(i)]^2^ ) } _pd_proc_ls_prof_wR_expected, sometimes called the theoretical R~wp~ or R~exp~, is a weighted fitness metric for the statistical precision of the data set. For an idealized fit, where all deviations between the observed intensities and those computed from the model are due to statistical fluctuations, the observed R~wp~ should match the expected R factor. In reality, R~wp~ will always be higher than R~exp~. R~exp~ = SQRT { (n - p) / sum~i~ ( w(i) [I~obs~(i)]^2^ ) } Note that in the above equations, w(i) is the weight for the ith data point (see _pd_proc_ls_weight). I~obs~(i) is the observed intensity for the ith data point, sometimes referred to as y~i~(obs) or y~oi~. (See _pd_meas_counts_total, _pd_meas_intensity_total or _pd_proc_intensity_total.) I~calc~(i) is the computed intensity for the ith data point with background and other corrections applied to match the scale of the observed data set, sometimes referred to as y~i~(calc) or y~ci~. (See _pd_calc_intensity_total.) n is the total number of data points (see _pd_proc_number_of_points) less the number of data points excluded from the refinement. p is the total number of refined parameters. */ Out(Get(gof), "\n_refine_ls_goodness_of_fit_all\t%1.5f") Out(Get(r_p)/100, "\n_pd_proc_ls_prof_R_factor\t%1.5f") Out(Get(r_wp)/100, "\n_pd_proc_ls_prof_wR_factor\t%1.5f") Out(Get(r_exp)/100, "\n_pd_proc_ls_prof_wR_expected\t%1.5f") } /* These next set of groups of three macros are for outputting constant-wavelength angle-dispersive data, time-of-flight neutron data, and energy-dispersive X-ray data. meas denotes intensity measurements at the measurement point proc denotes intensity measurements that have been processed in some way at the measurement point */ macro Out_pdCIF_angle_dispersive_measured_data(ciffile) { Out_pdCIF_angle_dispersive_data(ciffile, meas, =Get(bkg);) } macro Out_pdCIF_angle_dispersive_processed_data(ciffile) { Out_pdCIF_angle_dispersive_data(ciffile, proc, =Get(bkg);) } macro Out_pdCIF_angle_dispersive_data(ciffile, type, bkg_eqn) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_meas_2theta_scan.html _pd_meas_2theta_scan 2\q diffraction angle (in degrees) for intensity points measured in a scanning method. The scan method used (e.g. continuous or step scan) should be specified in the item _pd_meas_scan_method. For fixed 2\q (white-beam) experiments, use _pd_meas_2theta_fixed. In the case of continuous-scan data sets, the 2\q value should be the value at the midpoint of the counting period. Associated with each _pd_meas_2theta_scan value will be _pd_meas_counts_ items. The 2\q values should not be corrected for nonlinearity, zero offset etc. Corrected values may be specified using _pd_proc_2theta_corrected. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_meas_intensity_.html _pd_meas_intensity_total Intensity measurements at the measurement point (see the definition of _pd_meas_2theta_). Use this entry for measurements where intensity values are not counts (use _pd_meas_counts_ for event-counting measurements where the standard uncertainty is estimated as the square root of the number of counts). Corrections for background, detector dead time etc., should not have been made to these values. Instead use _pd_proc_intensity_ for corrected diffractograms. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_intensity_.html _pd_proc_intensity_total This contains intensity values for the processed diffractogram for each data point where background, normalization and other corrections have not been applied. Inclusion of s.u. values for these values is strongly recommended. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_ls_weight.html _pd_proc_ls_weight Weight applied to each profile point. These values may be omitted if the weights are 1/u^2^, where u is the s.u. for the _pd_proc_intensity_net values. A weight value of zero is used to indicate a data point not used for refinement (see _pd_proc_info_excluded_regions). https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_calc_intensity_.html _pd_calc_intensity_total Intensity values for a computed diffractogram at each angle setting. Values should be computed at the same locations as the processed diffractogram, and thus the numbers of points will be defined by _pd_proc_number_of_points and point positions may be defined using _pd_proc_2theta_range_ or _pd_proc_2theta_corrected. Use _pd_calc_intensity_net if the computed diffractogram does not contain background or normalization corrections and thus is specified on the same scale as the _pd_proc_intensity_net values. Use _pd_calc_intensity_total if the computed diffraction pattern includes background or normalization corrections (or both) and thus is specified on the same scale as the observed intensities (_pd_meas_counts_ or _pd_meas_intensity_). If an observed pattern is included, _pd_calc_intensity_ should be looped with either _pd_proc_intensity_net, _pd_meas_counts_ or _pd_meas_intensity_. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_intensity_.html _pd_proc_intensity_bkg_calc This is intended to contain the background intensity for every data point where the background function has been fitted or estimated ciffile - string. The name of the cif file you want to write to. bkg_eqn - topas equation. The equation you arre using for your background. If you are using the built in bkg, then write "=Get(bkg);" (without the "") */ Out_CIF_newfile(ciffile) Out_String("\nloop_") Out_String("\n\t_pd_meas_2theta_scan") #if type == "meas"; Out_String("\n\t_pd_meas_intensity_total") #else Out_String("\n\t_pd_proc_intensity_total") #endif Out_String("\n\t_pd_proc_ls_weight") Out_String("\n\t_pd_calc_intensity_total") #m_ifarg bkg_eqn "" xdd_out ciffile append load out_record out_fmt out_eqn { "\n%11.6f " = X; " %11.6f " = Yobs; " %11.6f " = Get(weighting); " %11.6f " = Ycalc; } #m_else Out_String("\n\t_pd_proc_intensity_bkg_calc") xdd_out ciffile append load out_record out_fmt out_eqn { "\n%11.6f " = X; " %11.6f " = Yobs; " %11.6f " = Get(weighting); " %11.6f " = Ycalc; " %11.6f " bkg_eqn } #m_endif } macro Out_pdCIF_time_of_flight_measured_data(ciffile) { Out_pdCIF_time_of_flight_data(ciffile, meas, =Get(bkg);) } macro Out_pdCIF_time_of_flight_processed_data(ciffile) { Out_pdCIF_time_of_flight_data(ciffile, proc, =Get(bkg);) } macro Out_pdCIF_time_of_flight_data(ciffile, type, bkg_eqn) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_meas_time_of_flight.html _pd_meas_time_of_flight Measured time in microseconds for time-of-flight neutron measurements. Note that the flight distance may be specified using _pd_instr_dist_ values. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_d_spacing.html _pd_proc_d_spacing d-spacing corresponding to an intensity point from Braggs law, d = \l/(2 sin\q), in units of angstroms. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_meas_intensity_.html _pd_meas_intensity_total Intensity measurements at the measurement point (see the definition of _pd_meas_2theta_). Use this entry for measurements where intensity values are not counts (use _pd_meas_counts_ for event-counting measurements where the standard uncertainty is estimated as the square root of the number of counts). Corrections for background, detector dead time etc., should not have been made to these values. Instead use _pd_proc_intensity_ for corrected diffractograms. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_intensity_.html _pd_proc_intensity_total This contains intensity values for the processed diffractogram for each data point where background, normalization and other corrections have not been applied. Inclusion of s.u. values for these values is strongly recommended. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_ls_weight.html _pd_proc_ls_weight Weight applied to each profile point. These values may be omitted if the weights are 1/u^2^, where u is the s.u. for the _pd_proc_intensity_net values. A weight value of zero is used to indicate a data point not used for refinement (see _pd_proc_info_excluded_regions). https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_calc_intensity_.html _pd_calc_intensity_total Intensity values for a computed diffractogram at each angle setting. Values should be computed at the same locations as the processed diffractogram, and thus the numbers of points will be defined by _pd_proc_number_of_points and point positions may be defined using _pd_proc_2theta_range_ or _pd_proc_2theta_corrected. Use _pd_calc_intensity_net if the computed diffractogram does not contain background or normalization corrections and thus is specified on the same scale as the _pd_proc_intensity_net values. Use _pd_calc_intensity_total if the computed diffraction pattern includes background or normalization corrections (or both) and thus is specified on the same scale as the observed intensities (_pd_meas_counts_ or _pd_meas_intensity_). If an observed pattern is included, _pd_calc_intensity_ should be looped with either _pd_proc_intensity_net, _pd_meas_counts_ or _pd_meas_intensity_. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_intensity_.html _pd_proc_intensity_bkg_calc This is intended to contain the background intensity for every data point where the background function has been fitted or estimated */ Out_CIF_newfile(ciffile) Out_String("\nloop_") Out_String("\n\t_pd_meas_time_of_flight") Out_String("\n\t_pd_proc_d_spacing") #if type == "meas"; Out_String("\n\t_pd_meas_intensity_total") #else Out_String("\n\t_pd_proc_intensity_total") #endif Out_String("\n\t_pd_proc_ls_weight") Out_String("\n\t_pd_calc_intensity_total") #m_ifarg bkg_eqn "" xdd_out ciffile append load out_record out_fmt out_eqn { "\n%11.6f " = X; " %11.6f " = d_spacing_from_TOF(t0, t1, t2); " %11.6f " = Yobs; " %11.6f " = Get(weighting); " %11.6f " = Ycalc; } #m_else Out_String("\n\t_pd_proc_intensity_bkg_calc") xdd_out ciffile append load out_record out_fmt out_eqn { "\n%11.6f " = X; " %11.6f " = d_spacing_from_TOF(t0, t1, t2); " %11.6f " = Yobs; " %11.6f " = Get(weighting); " %11.6f " = Ycalc; " %11.6f " bkg_eqn } #m_endif } macro Out_pdCIF_energy_dispersive_measured_data { Out_pdCIF_energy_dispersive_data(meas, =Get(bkg);) } macro Out_pdCIF_energy_dispersive_processed_data { Out_pdCIF_energy_dispersive_data(proc, =Get(bkg);) } macro Out_pdCIF_energy_dispersive_data(ciffile, type, bkg_eqn) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_energy_.html _pd_proc_energy_incident Incident energy in electronvolts of the source computed from secondary calibration information (time-of-flight and synchrotron data). Detection energy in electronvolts selected by the analyser, if not the same as the incident energy (triple-axis or energy-dispersive data). This may be a single value or may vary for each data point (triple-axis and time-of-flight data). https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_d_spacing.html _pd_proc_d_spacing d-spacing corresponding to an intensity point from Braggs law, d = \l/(2 sin\q), in units of angstroms. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_meas_intensity_.html _pd_meas_intensity_total Intensity measurements at the measurement point (see the definition of _pd_meas_2theta_). Use this entry for measurements where intensity values are not counts (use _pd_meas_counts_ for event-counting measurements where the standard uncertainty is estimated as the square root of the number of counts). Corrections for background, detector dead time etc., should not have been made to these values. Instead use _pd_proc_intensity_ for corrected diffractograms. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_intensity_.html _pd_proc_intensity_total This contains intensity values for the processed diffractogram for each data point where background, normalization and other corrections have not been applied. Inclusion of s.u. values for these values is strongly recommended. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_ls_weight.html _pd_proc_ls_weight Weight applied to each profile point. These values may be omitted if the weights are 1/u^2^, where u is the s.u. for the _pd_proc_intensity_net values. A weight value of zero is used to indicate a data point not used for refinement (see _pd_proc_info_excluded_regions). https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_calc_intensity_.html _pd_calc_intensity_total Intensity values for a computed diffractogram at each angle setting. Values should be computed at the same locations as the processed diffractogram, and thus the numbers of points will be defined by _pd_proc_number_of_points and point positions may be defined using _pd_proc_2theta_range_ or _pd_proc_2theta_corrected. Use _pd_calc_intensity_net if the computed diffractogram does not contain background or normalization corrections and thus is specified on the same scale as the _pd_proc_intensity_net values. Use _pd_calc_intensity_total if the computed diffraction pattern includes background or normalization corrections (or both) and thus is specified on the same scale as the observed intensities (_pd_meas_counts_ or _pd_meas_intensity_). If an observed pattern is included, _pd_calc_intensity_ should be looped with either _pd_proc_intensity_net, _pd_meas_counts_ or _pd_meas_intensity_. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_proc_intensity_.html _pd_proc_intensity_bkg_calc This is intended to contain the background intensity for every data point where the background function has been fitted or estimated */ Out_CIF_newfile(ciffile) Out_String("\nloop_") Out_String("\n\t_pd_proc_energy_incident") Out_String("\n\t_pd_proc_d_spacing") #if type == "meas"; Out_String("\n\t_pd_meas_intensity_total") #else Out_String("\n\t_pd_proc_intensity_total") #endif Out_String("\n\t_pd_proc_ls_weight") Out_String("\n\t_pd_calc_intensity_total") #m_ifarg bkg_eqn "" xdd_out ciffile append load out_record out_fmt out_eqn { "\n%11.6f " = X; " %11.6f " = d_spacing_from_EDXRD(CIF_TH2_FIXED); " %11.6f " = Yobs; " %11.6f " = Get(weighting); " %11.6f " = Ycalc; } #m_else Out_String("\n\t_pd_proc_intensity_bkg_calc") xdd_out ciffile append load out_record out_fmt out_eqn { "\n%11.6f " = X; " %11.6f " = d_spacing_from_EDXRD(CIF_TH2_FIXED); " %11.6f " = Yobs; " %11.6f " = Get(weighting); " %11.6f " = Ycalc; " %11.6f " bkg_eqn } #m_endif } macro Out_pdCIF_hkls_header(ciffile) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_index_.html _refln_index_h _refln_index_k _refln_index_l Miller indices of the reflection. The values of the Miller indices in the REFLN category must correspond to the cell defined by the cell lengths and cell angles in the CELL category. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_d_spacing.html _refln_d_spacing The d spacing in angstroms for this reflection. This is related to the (sin theta)/lambda value by the expression _refln_d_spacing = 2/(_refln_sint/lambda) https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_F_squared_.html _refln_F_squared_calc _refln_F_squared_meas Calculated, measured and estimated standard uncertainty (derived from measurement) of the squared structure factors (in electrons squared for X-ray diffraction). */ Out_CIF_newfile(ciffile) Out_String("\nloop_") Out_String("\n\t_refln_index_h") Out_String("\n\t_refln_index_k") Out_String("\n\t_refln_index_l") Out_String("\n\t_pd_refln_phase_id") Out_String("\n\t_refln_d_spacing") Out_String("\n\t_refln_F_squared_calc") Out_String("\n\t_refln_F_squared_meas") } macro Out_pdCIF_hkls(ciffile, phase_id) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_index_.html _refln_index_h _refln_index_k _refln_index_l Miller indices of the reflection. The values of the Miller indices in the REFLN category must correspond to the cell defined by the cell lengths and cell angles in the CELL category. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_d_spacing.html _refln_d_spacing The d spacing in angstroms for this reflection. This is related to the (sin theta)/lambda value by the expression _refln_d_spacing = 2/(_refln_sint/lambda) https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_F_squared_.html _refln_F_squared_calc _refln_F_squared_meas Calculated, measured and estimated standard uncertainty (derived from measurement) of the squared structure factors (in electrons squared for X-ray diffraction). */ for strs { Out_CIF_newfile(ciffile) phase_out ciffile append load out_record out_fmt out_eqn { "\n%4.0f" = H; " %4.0f" = K; " %4.0f" = L; " %V" = phase_id; " %11.6f" = D_spacing; " %12.6f" = I_no_scale_pks; " %12.6f" = Iobs_no_scale_pks; } } } '############################################################## ' ' Macros for crystal structures ' '############################################################## ' macro Out_pdCIF_diffractogramid(diffractogramidbase, id) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_block_diffractogram_id.html _pd_block_diffractogram_id A block ID code (see _pd_block_id) that identifies diffraction data contained in a data block other than the current block. This will occur most frequently when more than one set of diffraction data is used for a structure determination. The data block containing the diffraction data will contain a _pd_block_id code matching the code in _pd_block_diffractogram_id. */ Out_pdCIF_diffractogramid_dataname Out(diffractogramidbase, "%s") Out(id, "_%V") } macro Out_pdCIF_diffractogramid_dataname { Out_String("\n_pd_block_diffractogram_id\t") } macro Out_pdCIF_phase_name { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_pd.dic/Ipd_phase_name.html _pd_phase_name The name of the crystal phase. */ Out(Get(phase_name), "\n_pd_phase_name\n;%s\n;") } macro Out_CIF_unit_cell_prms { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Icell_length_.html _cell_length_a _cell_length_b _cell_length_c Unit-cell lengths in angstroms corresponding to the structure reported. The values of _refln_index_h, *_k, *_l must correspond to the cell defined by these values and _cell_angle_ values. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Icell_angle_.html _cell_angle_alpha _cell_angle_beta _cell_angle_gamma Unit-cell angles of the reported structure in degrees. The values of _refln_index_h, *_k, *_l must correspond to the cell defined by these values and _cell_length_a, *_b and *_c. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Icell_volume.html _cell_volume Cell volume V in angstroms cubed */ Out(Get(a), "\n_cell_length_a %V") Out(Get(b), "\n_cell_length_b %V") Out(Get(c), "\n_cell_length_c %V") Out(Get(al), "\n_cell_angle_alpha %V") Out(Get(be), "\n_cell_angle_beta %V") Out(Get(ga), "\n_cell_angle_gamma %V") Out(Get(cell_volume), "\n_cell_volume %V") } macro Out_CIF_Z_molecular_weight(Z) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Icell_formula_units_Z.html _cell_formula_units_Z The number of the formula units in the unit cell as specified by _chemical_formula_structural, _chemical_formula_moiety or _chemical_formula_sum. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Ichemical_formula_weight.html _chemical_formula_weight Formula mass in daltons. This mass should correspond to the formulae given under _chemical_formula_structural, *_iupac, *_moiety or *_sum and, together with the Z value and cell parameters, should yield the density given as _exptl_crystal_density_diffrn. */ local #m_unique !formula_weight_for_CIF_output = Get(cell_mass) / Z; Out(Z, "\n_cell_formula_units_Z\t%3.0f") Out(formula_weight_for_CIF_output, "\n_chemical_formula_weight\t%V") } macro Out_CIF_chemical_formula(formula) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Ichemical_formula_sum.html _chemical_formula_sum See the _chemical_formula_[] category description for the rules for writing chemical formulae in which all discrete bonded residues and ions are summed over the constituent elements, following the ordering given in general rule (5) in the _chemical_formula_[] category description. Parentheses are not normally used. example 'C18 H19 N7 O8 S' */ Out(formula, "\n_chemical_formula_sum\n;%s\n;") } macro Out_CIF_diffrn_measurement_device_type(goniotype) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Idiffrn_measurement_device_type.html_cell_formula_units_Z _diffrn_measurement_device_type The make, model or name of the measurement device (goniometer) used. */ Out(goniotype, "\n_diffrn_measurement_device_type\n;%s\n;") } macro Out_CIF_space_group_crystal_system(system) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Ispace_group_crystal_system.html _space_group_crystal_system The name of the system of geometric crystal classes of space groups (crystal system) to which the space group belongs. Note that rhombohedral space groups belong to the trigonal system. triclinic monoclinic orthorhombic tetragonal trigonal hexagonal cubic */ Out(system, "\n_space_group_crystal_system\t%s") } macro Out_CIF_minmax_theta { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Icell_measurement_theta_.html _cell_measurement_theta_min _cell_measurement_theta_max The maximum and minimum theta angles of reflections used to measure the unit cell in degrees. */ Out((X1/2), "\n_cell_measurement_theta_min\t%V") Out((X2/2), "\n_cell_measurement_theta_max\t%V") } macro Out_CIF_density { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iexptl_crystal_density_diffrn.html _exptl_crystal_density_diffrn Density values calculated from the crystal cell and contents. The units are megagrams per cubic metre (grams per cubic centimetre). */ local #m_unique !density_only_for_CIF_output = (1.6605402 Get(cell_mass)) / Get(cell_volume); Out(density_only_for_CIF_output, "\n_exptl_crystal_density_diffrn\t%V") } macro Out_CIF_absorption { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iexptl_absorpt_coefficient_mu.html _exptl_absorpt_coefficient_mu The absorption coefficient mu in reciprocal millimetres calculated from the atomic content of the cell, the density and the radiation wavelength. */ local #m_unique !density_for_CIF_output = ((1.6605402 Get(cell_mass)) / Get(cell_volume)); local #m_unique !LAC_for_CIF_output = Get(phase_MAC) density_for_CIF_output / 10; Out(LAC_for_CIF_output, "\n_exptl_absorpt_coefficient_mu\t%V") } macro Out_CIF_cell_temperature(temp) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Icell_measurement_temperature.html _cell_measurement_temperature\ The temperature in kelvins at which the unit-cell parameters were measured (not the temperature of synthesis). */ Out(temp, "\n_cell_measurement_temperature\t%V") Out_CIF_temperature(temp) } macro Out_CIF_cell_pressure(pres) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Icell_measurement_pressure.html _cell_measurement_pressure The pressure in kilopascals at which the unit-cell parameters were measured (not the pressure at which the sample was synthesized). */ Out(pres, "\n_cell_measurement_pressure\t%V") Out_CIF_pressure(pres) } macro Out_CIF_space_group_with_id { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Ispace_group_name_H-M_alt.html _space_group_name_H-M_alt _space_group_name_H-M_alt allows any Hermann-Mauguin symbol to be given. The way in which this item is used is determined by the user and in general is not intended to be interpreted by computer. It may, for example, be used to give one of the extended Hermann-Mauguin symbols given in Table 4.3.2.1 of International Tables for Crystallography Vol. A (2002) or a Hermann-Mauguin symbol for a conventional or unconventional setting. Each component of the space-group name is separated by a space or an underscore. Subscripts should appear without special symbols. Bars should be given as negative signs before the numbers to which they apply. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Ispace_group_symop_id.html _space_group_symop_id An arbitrary identifier that uniquely labels each symmetry operation in the list. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Ispace_group_symop_operation_xyz.html _space_group_symop_operation_xyz A parsable string giving one of the symmetry operations of the space group in algebraic form. */ Out(Get(sp_grp_char), "\n_space_group_name_H-M_alt\n;%s\n;") Out_String("\nloop_") Out_String("\n\t_space_group_symop_id\n\t_space_group_symop_operation_xyz") Out(Get(sp_xyzs_txt_with_id), "%s") } macro Out_CIF_space_group_without_id { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Ispace_group_name_H-M_alt.html _space_group_name_H-M_alt _space_group_name_H-M_alt allows any Hermann-Mauguin symbol to be given. The way in which this item is used is determined by the user and in general is not intended to be interpreted by computer. It may, for example, be used to give one of the extended Hermann-Mauguin symbols given in Table 4.3.2.1 of International Tables for Crystallography Vol. A (2002) or a Hermann-Mauguin symbol for a conventional or unconventional setting. Each component of the space-group name is separated by a space or an underscore. Subscripts should appear without special symbols. Bars should be given as negative signs before the numbers to which they apply. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Ispace_group_symop_operation_xyz.html _space_group_symop_operation_xyz A parsable string giving one of the symmetry operations of the space group in algebraic form. */ Out(Get(sp_grp_char), "\n_space_group_name_H-M_alt\n;%s\n;") Out_String("\nloop_") Out_String("\n\t_space_group_symop_operation_xyz") Out(Get(sp_xyzs_txt), "%s") } macro Out_CIF_atom_coords(ciffile) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iatom_site_label.html _atom_site_label The _atom_site_label is a unique identifier for a particular site in the crystal. This code is made up of a sequence of up to seven components, _atom_site_label_component_0 to *_6, which may be specified as separate data items. Component 0 usually matches one of the specified _atom_type_symbol codes. This is not mandatory if an _atom_site_type_symbol item is included in the atom-site list. The _atom_site_type_symbol always takes precedence over an _atom_site_label in the identification of the atom type. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iatom_site_type_symbol.html _atom_site_type_symbol A code to identify the atom species (singular or plural) occupying this site. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iatom_site_site_symmetry_multiplicity.html _atom_site_site_symmetry_multiplicity The number of different sites that are generated by the application of the space-group symmetry to the coordinates given for this site. It is equal to the multiplicity given for this Wyckoff site in International Tables for Crystallography Vol. A (2002). https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iatom_site_fract_.html _atom_site_fract_x _atom_site_fract_y _atom_site_fract_z Atom-site coordinates as fractions of the _cell_length_ values. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iatom_site_occupancy.html _atom_site_occupancy The fraction of the atom type present at this site. The sum of the occupancies of all the atom types at this site may not significantly exceed 1.0 unless it is a dummy site. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iatom_site_B_iso_or_equiv.html _atom_site_B_iso_or_equiv Isotropic atomic displacement parameter, or equivalent isotropic atomic displacement parameter, B(equiv), in angstroms squared, calculated from anisotropic displacement components. B(equiv) = (1/3) sum~i~[sum~j~(B^ij^ a*~i~ a*~j~ a~i~ a~j~)] a = the real-space cell lengths a* = the reciprocal-space cell lengths B^ij^ = 8 pi^2^ U^ij^ Ref: Fischer, R. X. & Tillmanns, E. (1988). Acta Cryst. C44, 775-776. */ Out_CIF_newfile(ciffile) Out_String("\nloop_") Out_String("\n\t_atom_site_label") Out_String("\n\t_atom_site_type_symbol") Out_String("\n\t_atom_site_site_symmetry_multiplicity") Out_String("\n\t_atom_site_fract_x") Out_String("\n\t_atom_site_fract_y") Out_String("\n\t_atom_site_fract_z") Out_String("\n\t_atom_site_occupancy") Out_String("\n\t_atom_site_B_iso_or_equiv") atom_out ciffile append load out_record out_fmt out_eqn { "\n%s" = Get_From_String(Get(current_atom), site); " %s" = Get_From_String(Get(current_atom), atom); " %3.0f" = Get_From_String(Get(current_atom), num_posns); " %V" = Get_From_String(Get(current_atom), x); " %V" = Get_From_String(Get(current_atom), y); " %V" = Get_From_String(Get(current_atom), z); " %V" = Get_From_String(Get(current_atom), occ); " %V" = Get_From_String(Get(current_atom), beq); } } macro Out_CIF_hkls(ciffile) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_index_.html _refln_index_h _refln_index_k _refln_index_l Miller indices of the reflection. The values of the Miller indices in the REFLN category must correspond to the cell defined by the cell lengths and cell angles in the CELL category. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_d_spacing.html _refln_d_spacing The d spacing in angstroms for this reflection. This is related to the (sin theta)/lambda value by the expression _refln_d_spacing = 2/(_refln_sint/lambda) https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Irefln_F_squared_.html _refln_F_squared_calc _refln_F_squared_meas Calculated, measured and estimated standard uncertainty (derived from measurement) of the squared structure factors (in electrons squared for X-ray diffraction). */ Out_CIF_newfile(ciffile) Out_String("\nloop_") Out_String("\n\t_refln_index_h") Out_String("\n\t_refln_index_k") Out_String("\n\t_refln_index_l") Out_String("\n\t_refln_d_spacing") Out_String("\n\t_refln_F_squared_calc") Out_String("\n\t_refln_F_squared_meas") phase_out ciffile append load out_record out_fmt out_eqn { "\n%4.0f" = H; " %4.0f" = K; " %4.0f" = L; " %11.6f" = D_spacing; " %12.6f" = I_no_scale_pks; " %12.6f" = Iobs_no_scale_pks; } } macro Out_CIF_adps(ciffile) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iatom_site_aniso_label.html _atom_site_aniso_label Anisotropic atomic displacement parameters are usually looped in a separate list. If this is the case, this code must match the _atom_site_label of the associated atom in the atom coordinate list and conform with the same rules described in _atom_site_label. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Iatom_site_aniso_U_.html _atom_site_aniso_U_11 _atom_site_aniso_U_22 _atom_site_aniso_U_33 _atom_site_aniso_U_12 _atom_site_aniso_U_13 _atom_site_aniso_U_23 These are the standard anisotropic atomic displacement components in angstroms squared which appear in the structure-factor term T = exp{-2pi^2^ sum~i~ [sum~j~ (U^ij^ h~i~ h~j~ a*~i~ a*~j~) ] } h = the Miller indices a* = the reciprocal-space cell lengths The unique elements of the real symmetric matrix are entered by row. */ Out_CIF_newfile(ciffile) Out_String("\nloop_") Out_String("\n\t_atom_site_aniso_label") Out_String("\n\t_atom_site_aniso_U_11") Out_String("\n\t_atom_site_aniso_U_22") Out_String("\n\t_atom_site_aniso_U_33") Out_String("\n\t_atom_site_aniso_U_12") Out_String("\n\t_atom_site_aniso_U_13") Out_String("\n\t_atom_site_aniso_U_23") atom_out ciffile append load out_record out_fmt out_eqn { "\n%s" = Get_From_String(Get(current_atom), site); " %V" = Get_From_String(Get(current_atom), u11); " %V" = Get_From_String(Get(current_atom), u22); " %V" = Get_From_String(Get(current_atom), u33); " %V" = Get_From_String(Get(current_atom), u12); " %V" = Get_From_String(Get(current_atom), u13); " %V" = Get_From_String(Get(current_atom), u23); } } macro Out_CIF_bond_angles(ciffile) { /* https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Igeom_bond_atom_site_label_.html _geom_bond_atom_site_label_1 _geom_bond_atom_site_label_2 The labels of two atom sites that form a bond. These must match labels specified as _atom_site_label in the atom list. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Igeom_bond_distance.html _geom_bond_distance The intramolecular bond distance in angstroms. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Igeom_bond_site_symmetry_.html _geom_bond_site_symmetry_1 _geom_bond_site_symmetry_2 The symmetry code of each atom site as the symmetry-equivalent position number 'n' and the cell translation number 'klm'. These numbers are combined to form the code 'n klm' or n_klm. The character string n_klm is composed as follows: n refers to the symmetry operation that is applied to the coordinates stored in _atom_site_fract_x, _atom_site_fract_y and _atom_site_fract_z. It must match a number given in _space_group_symop_id. k, l and m refer to the translations that are subsequently applied to the symmetry-transformed coordinates to generate the atom used in calculating the bond. These translations (x,y,z) are related to (k,l,m) by the relations k = 5 + x l = 5 + y m = 5 + z By adding 5 to the translations, the use of negative numbers is avoided. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Igeom_angle_atom_site_label_.html _geom_angle_atom_site_label_1 _geom_angle_atom_site_label_2 _geom_angle_atom_site_label_3 The labels of the three atom sites which define the angle given by _geom_angle. These must match labels specified as _atom_site_label in the atom list. Label 2 identifies the site at the apex of the angle. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Igeom_angle.html _geom_angle Angle in degrees defined by the three sites _geom_angle_atom_site_label_1, *_2 and *_3. The site at *_2 is at the apex of the angle. https://www.iucr.org/__data/iucr/cifdic_html/1/cif_core.dic/Igeom_angle_site_symmetry_.html _geom_angle_site_symmetry_1 _geom_angle_site_symmetry_2 _geom_angle_site_symmetry_3 The symmetry code of each atom site as the symmetry-equivalent position number 'n' and the cell translation number 'klm'. These numbers are combined to form the code 'n klm' or n_klm. The character string n_klm is composed as follows: n refers to the symmetry operation that is applied to the coordinates stored in _atom_site_fract_x, _atom_site_fract_y and _atom_site_fract_z. It must match a number given in _space_group_symop_id. k, l and m refer to the translations that are subsequently applied to the symmetry-transformed coordinates to generate the atom used in calculating the angle. These translations (x,y,z) are related to (k,l,m) by the relations k = 5 + x l = 5 + y m = 5 + z By adding 5 to the translations, the use of negative numbers is avoided. */ Out_CIF_newfile(ciffile) consider_lattice_parameters 'this propagates errors from lattice parameters to the bonds and angles' Out(Get(cif_bonds_angles), "%s") } macro Out_magCIF_space_group_with_id { /* https://www.iucr.org/__data/iucr/cifdic_html/3/MAGNETIC_CIF/Ispace_group_magn.number_BNS.html _space_group_magn.number_BNS See _space_group_magn.number_OG for a description of magnetic space groups (MSGs). The Belov-Neronova-Smirnova (BNS) number for an MSG is composed of two positive integers separated by a period. The first integer lies in the range [1-230] and indicates the non-magnetic space group F for MSGs of types 1-3 or the non-magnetic space group of the subgroup D for MSGs of type 4. The second integer is sequential over all MSGs associated with the same crystal family. There are 1651 distinct equivalence classes of MSGs, each of which has a unique BNS number. These equivalence classes are most accurately referred to as magnetic space-group "types", following the usage in the International Tables for Crystallography. But the word "type" is also commonly used to indicate the four-fold classification of MSGs presented above. To avoid confusion, the word "type" is only used in the latter sense here. Analogous tags: symCIF:_space_group.number_IT Ref: 'Magnetic Group Tables' by D.B. Litvin at http://www.iucr.org/publ/978-0-9553602-2-0. ISO-MAG tables of H.T. Stokes and B.J. Campbell at http://iso.byu.edu. https://www.iucr.org/__data/iucr/cifdic_html/3/MAGNETIC_CIF/Ispace_group_symop_magn_operation.id.html _space_group_symop_magn_operation.id An arbitrary identifier that uniquely labels each symmetry operation in a looped list of magnetic space-group symmetry operations. Most commonly, a sequence of positive integers is used for this identification. The _space_group_symop_magn.id alias provides backwards compatibility with the established magCIF prototype. https://www.iucr.org/__data/iucr/cifdic_html/3/MAGNETIC_CIF/Ispace_group_symop_magn_operation.xyz.html _space_group_symop_magn_operation.xyz A parsable string giving one of the symmetry operations of the magnetic space group in algebraic form. The analogy between parsable labels for magnetic and non-magnetic symmetry operations is perfect except for the fact that a magnetic symop label ends with an additional piece of information ("-1" or "+1") indicating that the operation is or is not time-reversed, respectively. This tag is intended for use with the BNS-supercell description of a magnetic structure. Analogous tags: symCIF:_space_group_symop.operation_xyz Ref: 'Magnetic Group Tables' by D.B. Litvin at http://www.iucr.org/publ/978-0-9553602-2-0. ISO-MAG tables of H.T. Stokes and B.J. Campbell at http://iso.byu.edu. _space_group_symop.magn_operation.mxmymz I cannot find a definition in the magCIF for this column. _space_group_symop.magn_operation.timereversal Topas does not include the time reversal in the xyz output. It goes in its own column. */ Out(Get(sp_grp_char ), "\n_space_group_magn.number_BNS\n;%s\n;") Out_String("\nloop_") Out_String("\n\t_space_group_symop_magn_operation.id") Out_String("\n\t_space_group_symop_magn_operation.xyz") Out_String("\n\t_space_group_symop_magn_operation.mxmymz") Out_String("\n\t_space_group_symop_magn_operation.timereversal") Out(Get(mag_sp_xyzs_txt_with_id), "%s") } macro Out_mag_CIF_atom_site_moment(ciffile) { /* https://www.iucr.org/__data/iucr/cifdic_html/3/MAGNETIC_CIF/Iatom_site_moment.label.html _atom_site_moment.label https://www.iucr.org/__data/iucr/cifdic_html/3/MAGNETIC_CIF/Iatom_site_moment.crystalaxis_x.html _atom_site_moment.crystalaxis_x The component of the atom-site magnetic-moment vector parallel to the first unit-cell axis. See _atom_site_moment.crystalaxis. https://www.iucr.org/__data/iucr/cifdic_html/3/MAGNETIC_CIF/Iatom_site_moment.crystalaxis_y.html _atom_site_moment.crystalaxis_y The component of the atom-site magnetic-moment vector parallel to the second unit-cell axis. See _atom_site_moment.crystalaxis. https://www.iucr.org/__data/iucr/cifdic_html/3/MAGNETIC_CIF/Iatom_site_moment.crystalaxis_z.html _atom_site_moment.crystalaxis_z The component of the atom-site magnetic-moment vector parallel to the third unit-cell axis. See _atom_site_moment.crystalaxis. */ Out_CIF_newfile(ciffile) Out_String("\nloop_") Out_String("\n\t_atom_site_moment.label") Out_String("\n\t_atom_site_moment.crystalaxis_x") Out_String("\n\t_atom_site_moment.crystalaxis_y") Out_String("\n\t_atom_site_moment.crystalaxis_z") mag_atom_out ciffile append load out_record out_fmt out_eqn { "\n%s" = Get_From_String(Get(current_atom), site); " %11.5f" = Get(a) Get_From_String(Get(current_atom), mlx); " %11.5f" = Get(b) Get_From_String(Get(current_atom), mly); " %11.5f" = Get(c) Get_From_String(Get(current_atom), mlz); } } '##############################################################%####### ' ' These are the consolidiated macros to report structures and patterns ' '###################################################################### ' macro Out_pdCIF_xdd_setup { /* This macro sets up a workaround in how pk_xo behaves differently between v5-6 and v7 It also defines an ID prm, so you do not need to if there is only one xdd to worry about. */ if Or(Obj_There(pk_xo_prm),Obj_There(pk_xo)) { local !pk_xo_exists 0 } if Prm_There(CIF_ID) { 'do nothing' } else { if Prm_There(CIF_MULTI_DIFFRACTOGRAM_ID) { if Obj_There(num_runs) { local CIF_ID = Run_Number; } else { local CIF_ID 1 } } else { 'not a multi-pattern inp file' if Obj_There(range) { if Obj_There(num_runs) { local CIF_ID = 10000 Get(range) + Run_Number; } else { local CIF_ID = Get(range); } } else if Obj_There(num_runs) { local CIF_ID = Run_Number; } else { local CIF_ID 1 } } } } macro Out_pdCIF_STR(ciffile, phase_id, id) { Out_pdCIF_STR(ciffile, phase_id, id,,) } macro Out_pdCIF_STR(ciffile, phase_id, id, n, m) { /* This macro constructs a crystal structure in CIF format that is likely to pass checkCIF with minimal issues. Probably. The construction of the block_id is simply the concatenation of the phase_name and an identifier, most usually taken as the number of the xdd, either defined through the use of "Run_Number" if doing a sequential refinement using #list, or by setting a local variable in each xdd - local !id = 1; (and copying it and incrementing it in each xdd) The diffractogram_id of each diffraction pattern is simply the string "pattern_" with the id appended. This is also set to be the block id of the diffraction pattern in the diffraction pattern macro. The implementation of the block_id and diffractogram_id in is this macro is extremely simplistic, and designed to be easily automated. If you change how the _pd_block_id or _pd_diffractogram_id is implemented, make sure to change it in all the other places - see _pd_phase_block_id also. This macro can be placed into every str that you have, or better, placed at the end of the input file in a `for strs {}` construct. ciffile: the name of the file you want to write to. The data is appended. phase_id: a number uniquely identifying a str inside an xdd id: a number uniquely identifying an xdd If you want to report molecular weight for a str, you must define a local parameter defining the number of formula units. ie: local !CIF_Z = 6; You must name it "CIF_Z". */ Out_CIF_newfile(ciffile) Out_String("\n") Out_CIF_section_break("Begin powder crystal structure") Out_CIF_datablock_dataname Out_unique_phase_id(id) Out_pdCIF_blockid_dataname Out_unique_phase_id(id) if Prm_There(CIF_MULTI_DIFFRACTOGRAM_ID) { Out_String("\n# The diffractogram block id loop is at the end of the datablock.") } else { Out_pdCIF_diffractogramid_dataname Out_unique_diffractogram_id(id) } if Prm_There(CIF_DIFFRACTOMETER_NAME) { Out_CIF_diffrn_measurement_device_type(CIF_DIFFRACTOMETER_NAME) } Out_pdCIF_phase_name Out_CIF_unit_cell_prms if Prm_There(CIF_Z) { Out_CIF_Z_molecular_weight(CIF_Z) } if Prm_There(CIF_SUM_FORMULA) { Out_CIF_chemical_formula(CIF_SUM_FORMULA) } if Prm_There(CIF_TEMP) { Out_CIF_cell_temperature(CIF_TEMP) } if Prm_There(CIF_PRES) { Out_CIF_cell_pressure(CIF_PRES) } Out_CIF_density TOF_ED_CW(,, Out_CIF_absorption Out_CIF_wavelength Out_CIF_minmax_theta) if Prm_There(CIF_CRYSTAL_SYSTEM) { Out_CIF_space_group_crystal_system(CIF_CRYSTAL_SYSTEM) } if Prm_There(CIF_PHASE_TEXT) { Out_CIF_free_text(CIF_PHASE_TEXT) } if Obj_There(mag_sg) { Out_magCIF_space_group_with_id } else { Out_CIF_space_group_with_id } Out_CIF_atom_coords(ciffile) if Obj_There(adps) { Out_CIF_adps(ciffile) } if Obj_There(mag_sg) { Out_mag_CIF_atom_site_moment(ciffile) } Out_CIF_bond_angles(ciffile) Out_CIF_newfile(ciffile) if Prm_There(CIF_MULTI_DIFFRACTOGRAM_ID) { 'this is down here as there are TOPAS internal pointer details that do not allow it up there ^' Out_String("\nloop_") Out_pdCIF_diffractogramid_dataname for xdds n_to_m(n,m) { Out_String("\n\t") Out_unique_diffractogram_id(id) } 'Cannot have any references to str things after this for xdds loop.' } Out_CIF_newfile(ciffile) Out_CIF_section_break("End powder crystal structure") Out_String("\n") } macro Out_pdCIF_diffraction_data(ciffile, data_type, bkg_eqn, phase_id, id) { /* This macro constructs a powder diffraction pattern in CIF format. The construction of the block_id is simply the concatenation of the string "pattern" and an identifier, most usually taken as the number of the xdd, either defined through the use of "Run_Number" if doing a sequential refinement using #list, or by setting a local variable in each xdd - local !id = 1; (and copying it and incrementing it in each xdd) The implementation of the block_id in this macro is extremely simplistic, and designed to be easily automated. If you change how the _pd_block_id or _pd_diffractogram_id is implemented, make sure to change it in all the other places - see _pd_phase_block_id also. This macro can be placed into every xdd that you have, or if you have more, placed at the end of the input file in a `for xdds {}` construct. ciffile: the name of the file you want to write to. The data is appended. data_type: "meas" - data as-measured; "proc" - data has been processed before analysis bkg_eqn: an equation with the bkg you want to record phase_id: a number uniquely identifiying a str in an xdd is: a number uniquely identifying an xdd, or group of xdds in the case of a multi-pattern refinement */ Out_CIF_newfile(ciffile) Out_String("\n") Out_CIF_section_break("Begin powder diffraction data") Out_CIF_datablock_dataname Out_unique_diffractogram_id(id) Out_pdCIF_blockid_dataname Out_unique_diffractogram_id(id) if Prm_There(CIF_DATETIME) { Out_pdCIF_datetime_initiated(CIF_DATETIME) } Out_String("\n_pd_calc_method\tRietveld") if Obj_There(neutron) { Out_String("\n_diffrn_radiation_probe\tneutron") } else { Out_String("\n_diffrn_radiation_probe\tx-ray") } if Prm_There(CIF_DIFFRACTOMETER_NAME) { Out_pdCIF_instr_special_details(CIF_DIFFRACTOMETER_NAME) } TOF_ED_CW(Out_pdCIF_scan_method("tof"), Out_pdCIF_scan_method("disp"), if Prm_There(CIF_SCAN_METHOD) { Out_pdCIF_scan_method(CIF_SCAN_METHOD) } if Obj_There(lam) { Out_CIF_wavelength } ) if Prm_There(CIF_TEMP) { Out_CIF_temperature(CIF_TEMP) } if Prm_There(CIF_PRES) { Out_CIF_pressure(CIF_PRES) } Out_CIF_Rfactors if Prm_There(CIF_DIFFRACTOGRAM_TEXT) { Out_CIF_free_text(CIF_DIFFRACTOGRAM_TEXT) } if Obj_There(str) { Out_pdCIF_phase_block_id(phase_id, id) Out_pdCIF_hkls_header(ciffile) Out_pdCIF_hkls(ciffile, phase_id) } TOF_ED_CW(Out_pdCIF_time_of_flight_data(ciffile, data_type, bkg_eqn), Out_pdCIF_energy_dispersive_data(ciffile, data_type, bkg_eqn), Out_pdCIF_angle_dispersive_data(ciffile, data_type, bkg_eqn)) Out_CIF_newfile(ciffile) Out_CIF_section_break("End powder diffraction data") Out_String("\n") } '##############################################################%##################################### ' '#################################################################################################### ' '###################################################################################################### ' '###################################################################################################### ' '#################################################################################################### ' '#################################################################################################### ' /* The macros to use at the end of your input file (literally) to report structures and patterns is just after this comment! There are some helper macros that have fewer arguments, and make some choices about what to write in the CIF file for you. The use of these macros rely on you using some predefined parameters for specific items. You can use whatever name you want in your own calculations, and you only need to use them if you want to report on them, but they need to be defined somewhere with the following names: -Must be defined (eg local CIF_PHASE_ID 2 ) CIF_ID - (per xdd, or group of xdds) unique identifier to append to block ids to ensure everything is unique CIF_PHASE_ID - (per str) unique identifier to append to block ids of strs to ensure everything is unique t0, t1, t2 - (per xdd - only for tof) TOF calibration constants CIF_TH2_FIXED - (per xdd - only for edxrd) Detector angle in energy-dispersive XRD -Should be defined CIF_SCAN_METHOD - (per xdd) "step" - step scan; "cont" continuous scan; "fixed" stationary detector. This is only relevant for CW data. -Can be defined CIF_DATETIME xdd Date/time when data collection was initiated CIF_TEMP - (per xdd) Temperature (K) at which data were acquired. CIF_PRES - (per xdd) Pressure (kPa) at which data were acquired. CIF_Z - (per str) formula units per unit cell CIF_SUM_FORMULA - (per str) what is the chemical formula of the unit cell? CIF_CRYSTAL_SYSTEM - (per str) the crystal system of the space group CIF_DIFFRACTOMETER_NAME - (per xdd) short description of the diffractometer (If you use these next two, you are on your own wrt maintaining uniqueness CIF_DIFFRACTOGRAM_BLOCK_ID xdd Fully specified block ID for a diffraction pattern CIF_PHASE_BLOCK_ID str Fully specified block ID for a crystal structure CIF_DIFFRACTOGRAM_TEXT xdd Free-text entry that goes in the data block containing the diffraction data CIF_PHASE_TEXT str Free-text entry that goes in the data block containing the structure ciffile: the name of the file you want to write to. The data is appended. data_type: "meas" - data as-measured; or "proc" - data has been processed before analysis bkg_eqn: an equation defining your background function so it can be ouput in the CIF */ '######################################################################' macro Out_pdCIF_per_xdd(ciffile) { Out_pdCIF_per_xdd(ciffile, "proc", =Get(bkg);) } macro Out_pdCIF_per_xdd(ciffile, data_type) { Out_pdCIF_per_xdd(ciffile, data_type, =Get(bkg);) } macro Out_pdCIF_per_xdd(ciffile, data_type, bkq_eqn) { /* If you wish to change the output on a per-xdd basis, use this macro in each xdd. Otherwise, use Out_pdCIF() */ Out_pdCIF_xdd_setup if Obj_There(str) { for strs { Out_pdCIF_STR(ciffile, CIF_PHASE_ID, CIF_ID) } } Out_pdCIF_diffraction_data(ciffile, data_type, bkq_eqn, CIF_PHASE_ID, CIF_ID) } macro Out_pdCIF(ciffile) { Out_pdCIF(ciffile, "proc", =Get(bkg);) } macro Out_pdCIF(ciffile, data_type) { Out_pdCIF(ciffile, data_type, =Get(bkg);) } macro Out_pdCIF(ciffile, data_type, bkq_eqn) { Out_pdCIF(ciffile, data_type, bkq_eqn, , ) } macro Out_pdCIF(ciffile, data_type, bkq_eqn, n, m) { /* This is the macro to use if the structures in each xdd are independent of each other ie, they are not being co-refined on multiple datasets Some examples on how to use the Out_pdCIF macro: ----------------------------------------------- # 1: single pattern, many strs xdd ... str local CIF_PHASE_ID 1 local !CIF_Z = 2; ... str local CIF_PHASE_ID 2 ... str local CIF_PHASE_ID 3 ... macro CIF_OUTPUT_FILE { "filename.cif" } Out_pdCIF(CIF_OUTPUT_FILE) ----------------------------------------------- ----------------------------------------------- # 2: many patterns, many strs xdd local CIF_ID 1 local !CIF_SCAN_METHOD = "fixed"; local CIF_PRES 100 ... str local CIF_PHASE_ID 1 ... xdd local CIF_ID 2 local !CIF_SCAN_METHOD = "cont"; local CIF_PRES 400 ... str local CIF_PHASE_ID 1 ... str local CIF_PHASE_ID 2 local !CIF_Z 6 ... str local CIF_PHASE_ID 3 ... ... Out_pdCIF("filename.cif", meas) ----------------------------------------------- ----------------------------------------------- # 3: sequential refinement, multiple strs macro CIF_OUTPUT_FILE { "filename.cif" } num_runs 30 #list File_Name Temperature { file_01.xye 30 file_02.xye 45 ... } prm CIF_ID = Run_Number; prm CIF_TEMP = Temperature(Run_Number); prm CIF_SCAN_METHOD = "fixed"; xdd ... str local CIF_PHASE_ID 1 local !CIF_Z = 6; ... str local CIF_PHASE_ID 2 local !CIF_Z = 8; ... str local CIF_PHASE_ID 3 ... Out_pdCIF(CIF_OUTPUT_FILE, meas) ----------------------------------------------- */ for xdds n_to_m(n,m) { Out_pdCIF_per_xdd(ciffile, data_type, bkq_eqn) } } macro Out_pdCIF_multi(ciffile) { Out_pdCIF_multi(ciffile, "proc", =Get(bkg);) } macro Out_pdCIF_multi(ciffile, data_type) { Out_pdCIF_multi(ciffile, data_type, =Get(bkg);) } macro Out_pdCIF_multi(ciffile, data_type, bkg_eqn) { Out_pdCIF_multi(ciffile, data_type, bkg_eqn, 1, ) } macro Out_pdCIF_multi(ciffile, data_type, bkg_eqn, n, m) { /* This is the macro to use if the structures in each xdd are dependent of each other ie, all structures are being co-refined on all xdds and all structures are present in all xdds eg multi-bank TOF data. Some examples on how to use the Out_pdCIF_multi macro: ----------------------------------------------- # 1: multiple patterns, multiple strs prm CIF_ID 1 prm CIF_TEMP 5 xdd 'eg bank 1 of a tof dataset' ... str local CIF_PHASE_ID 1 ... str local CIF_PHASE_ID 2 ... str local CIF_PHASE_ID 3 ... xdd 'eg bank 2 of a tof dataset' ... str local CIF_PHASE_ID 1 ... str local CIF_PHASE_ID 2 local !CIF_Z 6 ... str local CIF_PHASE_ID 3 ... ... Out_pdCIF_multi("filename.cif", proc) ----------------------------------------------- ----------------------------------------------- # 2: sequential refinement, multiple strs, macro CIF_OUTPUT_FILE { "filename.cif" } num_runs 30 #list File_Name_b1 File_Name_b2 File_Name_b3 Temperature { file_b1_01.xye file_b2_01.xye file_b3_01.xye 30 file_b1_02.xye file_b2_02.xye file_b3_02.xye 35 ... } prm CIF_ID = Run_Number; prm CIF_TEMP = Temperature(Run_Number); xdd File_Name_b1(Run_Number) ... str ... str ... xdd File_Name_b2(Run_Number) ... str ... str ... xdd File_Name_b3(Run_Number) ... str ... str ... for xdds { local CIF_SCAN_METHOD = "cont"; for strs 1 to 1 { local CIF_PHASE_ID 1 local CIF_Z = 6; } for strs 2 to 2 { local CIF_PHASE_ID 2 local CIF_Z = 8; } } Out_pdCIF_multi(CIF_OUTPUT_FILE, meas) ----------------------------------------------- */ for xdds n_to_m(n,m) { Out_pdCIF_xdd_setup local CIF_MULTI_DIFFRACTOGRAM_ID 1 } Out_CIF_newfile(ciffile) for xdds n to n { if Obj_There(str) { for strs { Out_pdCIF_STR(ciffile, CIF_PHASE_ID, CIF_ID, n, m) } } } for xdds n_to_m(n,m) { Out_pdCIF_diffraction_data(ciffile, data_type, bkg_eqn, CIF_PHASE_ID, CIF_ID) } } #endif