Warning: Trying to access array offset on value of type null in /home/site/wwwroot/lib/plugins/move/action/rename.php on line 42

Warning: Cannot modify header information - headers already sent by (output started at /home/site/wwwroot/lib/plugins/move/action/rename.php:42) in /home/site/wwwroot/inc/Action/Export.php on line 106

Warning: Cannot modify header information - headers already sent by (output started at /home/site/wwwroot/lib/plugins/move/action/rename.php:42) in /home/site/wwwroot/inc/Action/Export.php on line 106
out_mem

Table of Contents

Macro to output .mem file and .prf file for MEM analysis in Dysnomia

The macros in this page output .mem file and .prf file for Dysnomia to calculate electron density in unit cell based on Maximum Entropy Method (MEM) analysis. The format of .mem and .prf files are based on the Dysnomia example files.

This macro calls other macros “Atomic_Number” and “sg_num”.

This macro has been tested working in TOPAS v6.

The macros

Out_MEM

This macro exports the real part and imaginary part of observed structure factors, and their errors for each reflection. This macro also calls “Out_PRF” macro to export a Preference file .prf for Dysnomia to perform MEM analysis. The macro parameter “sgs”, Space Group Symbel needs be in lower case without any gap nor underscore, but needs be quoted by double quotes, e.g. “r-3c”

macro Out_MEM(phasename, sgs) {  'space group symbel 'sgs' needs be lower case without gap nor underscore, but with double quotes, e.g. "r-3c"
 	#if (Run_Number == 0)
		out phasename##_dys.mem append 
		Out_String("# Title (up to 70 character) \n")
		Out(Get(phase_name), "%s ( Powder X-ray Data )\n")
		Out_String("#        a         b         c     alpha      beta     gamma\n")
		Out(Get(a), "%10.5f")
		Out(Get(b), "%10.5f")
		Out(Get(c), "%10.5f")
		Out(Get(al), "%10.5f")
		Out(Get(be), "%10.5f")
		Out(Get(ga), "%10.5f\n")
		Out_String("# P.O. correction\n")
		Out_String("# When TORAYA & MARUMO type function is used add P option.\n")
		Out_String("# IPTYP : -1 = No Correction   0 = Plate Like   1 = Needle Like\n")
		Out_String("#          POP1           POP2  IPTYP  JPH  JPK  JPL\n")
		Out_String("      0.0000000      0.0000000     -1    0    0    0     P\n")
		Out_String("# SPG  ORG   NX   NY   NZ\n")
		Out(sg_num(sgs), "  %.0f    1   ")
		Out(6(Round(Get(a)/0.07/6)+1), "%.0f  ")
		Out(6(Round(Get(b)/0.07/6)+1), "%.0f  ")
		Out(6(Round(Get(c)/0.07/6)+1), "%.0f\n")
		Out_String("#  Total charge         lambda\n")
		Out(Total_e_in_Cell, "%14.7f")
		Out_String("      0.0010000\n")
		Out_String("# NREF1 need to count manually\n")
		Out_String("   64\n")
		Out_String("#   h    k    l          Fo(R)          Fo(I)       sigma(F)")
		phase_out phasename##_dys.mem append 
		load out_record out_fmt out_eqn
		            {  "\n%5.0f" = H;
		               " %4.0f" = K;
		               " %4.0f" = L;
			      '" %4.0f" = M;
			      '" %12.2f" = I_no_scale_pks/M/Get(scale);  '|F|^2
			      '" %11.4f" = A01-B11; 'Real
			      '" %11.4f" = A11+B01; 'Imaginary
		               " %14.7f" = Sqrt(Iobs_no_scale_pks/M/Get(scale)) Cos(If((A01-B11)>0, ArcTan((A11+B01)/(A01-B11)), ArcTan((A11+B01)/(A01-B11)) +Pi));
		               " %14.7f" = Sqrt(Iobs_no_scale_pks/M/Get(scale)) Sin(If((A01-B11)>0, ArcTan((A11+B01)/(A01-B11)), ArcTan((A11+B01)/(A01-B11)) +Pi));
		               " %14.7f" = Sqrt(Iobs_no_scale_pks)/Get(scale) Sqrt((Iobs_no_scale_pks_err/Iobs_no_scale_pks)^2+ (Error(scf)/Get(scale))^2 )/2 /Sqrt(M/Get(scale));
		            }
		Out_PRF(phasename)
	#else
		out phasename##_dys.mem append             
		Out_String("\n# NREF2 fix to 0\n")
		Out_String("    0\n")
		Out_String("# NREF3 need to count manually\n")
		Out_String("   11\n")
		Out_String("#   h    k    l")
		phase_out phasename##_dys.mem append 
		load out_record out_fmt out_eqn
		{  "\n%5.0f" = H;
		   " %4.0f" = K;
                   " %4.0f" = L; }
	#endif	
}				

Out_PRF

The “Out_PRF” macro from below link generate a .prf preference file for Dysnomia to execute. For some reason, this TOPAS Wiki site does not display certain Out_String function, so I have to place it on my google drive:

https://drive.google.com/file/d/1wH5K6pJriHAAQyXCOpRfOQiowZXpKYGf/view?usp=sharing

Application Example: Working .inp to export .mem and .prf files

To use this function, please save the macros “Out_MEM”(on this page), “Out_PRF”(on this page), “Atomic_Number” and “sg_num” into your TOPAS' local.inc, or #include them in your .inp files.

Below example .inp file will be executed twice automatically.

The first run performs conventional Rietveld refinement and export information for the measured hkls.

The second run exports Miller indexes of unmeasured d-spacing reflections of higher spacing resolution, down to 0.7 Angstrom.

num_runs 2 
 
'r_p    0	r_p_dash    0 
'r_wp   0	r_wp_dash   0 
'r_exp  0	r_exp_dash  0 
'gof    0 
'weighted_Durbin_Watson   0 
 
	#if (Run_Number == 0)
		RAW(corundum)  
		do_errors 
   	        CuKa5(0.001)			' Radiation used to measure the data
   	        out DMIN.txt Out(Lam /2/Sin(X2 Deg/2)) 'Export the min d_obs
        #else
   	        iters 0
   	        yobs_eqn = 1;	min 1	max 180	del 0.01
   	        MoKa2(0.001)			' Dummy hard radiation to generate high Miller hkls 
		prm DMIN = #include DMIN.txt;
		start_X = 2 ArcSin(Lam /2 /DMIN) Rad;  'calculate only the range between min d_obs to 0.7 Angstrom  
		finish_X = 2 ArcSin(Lam /2 /0.7) Rad;  'The limit 0.7 Angstrom can be adapted according to your phase
        #endif
 
        Radius(173)
        LP_Factor(26.6)
        Full_Axial_Model(12, 15, 12, 4.6, 4.6)
        Slit_Width(0.3)
        Divergence(1)
 
        Absorption(@, 30) 
        ZE(@,0)     
        One_on_X(@, 1000) 
        bkg  @ 0 0 0 0 0 0
 
        STR(R_-3_C) 
		phase_name "Corundum" 
		prm Total_e_in_Cell = Al_electrons + O_electrons;:0  ' Total Number of Electron in Unit Cell
		Trigonal(@  4.75847, @  12.99036) 
		site Al num_posns 0 x 0    y 0   z @ 0.35228`_0.00003 occ Al 1 beq @ 0.29860`_0.00866 prm Al_electrons =Get(num_posns) * Atomic_Number("Al");
		site O  num_posns 0 x @ 0.30607`_0.00014 y 0 z   0.25 occ O  1 beq @ 0.16724`_0.01427 prm O_electrons =Get(num_posns) * Atomic_Number("O");
		scale scf 0.00208062929`_5.482e-06  'name the scale factor as "scf" to export its error.
		CS_L(@, 274.753078`_7.43125129) 
		Strain_L(@, 0.0166526397`_0.00141211878)
		r_bragg  3.76972174
 
 
 		Out_MEM(Corundum,"r-3c")

N.B.: the number of reflections “NREF1” and “NREF3” need be manually count and updated in the generated .mem file.

N.B.2: According to the Dysnomia examples, it seems do not need F_imaginary part for MEM analysis, therefore the imaginary part can be set to 0 in the generated .mem file.

N.B.3: Reflections of zero Fo(R) should be avoided, otherwise Dysnomia won't work.

If any user in our open TOPAS community has suggestion or idea, or bug report on these macros, please kindly let me know and I am happy to learn from you: tony.wang@qut.edu.au

Thanks for Dr. Koichi Momma's inspiring education in the IUCr Crystallographic Computing School (Melbourne, 2023). :)