List #list Command
#list is a new feature in v6. It's super-useful for running multiple refinements on different data sets or running multiple models against a single data set. Some things you can do are below. There are lots more!
Typical syntax is:
num_runs 5 Backup_INP #list pa_val { 0.1 0.2 0.3 0.4 0.5 } prm pa = pa_val(Run_Number);
By default refinement results aren't written to the INP file. This can be changed with the lines below, where inp_filename.inp is the name of your INP file. Note that out_file uses a “string equation”. The “Backup_INP” macro creates a backup of your input file. This is useful as if you mess up with #list you can write a blank .inp file (essentially deleting your .inp).
Backup_INP out_file ="inp_filename.inp";
If you step through a set of pa values and fit the data with each value Topas won't save the “best answer” by default. This can be changed with a simple macro:
macro Save_Best { #if (Run_Number == 0) prm Best_Rwp_ = 9999; #else prm Best_Rwp_ = #include Best_Rwp_.txt; #endif out Best_Rwp_.txt Out(If(Get(r_wp) < Best_Rwp_, Get(r_wp), Best_Rwp_)) out_file = If(Get(r_wp) < Best_Rwp_, Concat(String(INP_File), ".OUT"), ""); }
You can easily automate refinements using the #list command and string equations. Just give the filenames in the #list command and use something like “xdd filename(Run_Number)”. You can add experimental information like time/temperature/etc in the #list command.
For results files you can e.g. delete old files and write header lines with commands like the ones below. If you backup only for run 0 then you won't get annoying screen “flashes”:
#if (Run_Number == 0) Backup_INP system_before_save_OUT { del results.txt } out "results.txt" append Out_String(" 01_range 02_temp 03_time 04_r_wp 05_height 06_err 07_bval 08_err 09_perc_cubic \n") #endif
There's a step by step tutorial on using #list to refine a series of data sets sequentially here.
Here's an example of how to vary a specific parameter (the sample height) in the input file from Martin Fisch:
/* Copy paste this file to an .inp file and run with Topas 6 It shows how the #list command can be used to perform pattern simulations. In this case, specimen displacement is varied. Note that the list parameter (h_err) is used via a macro in order to use it in the file name of the saved scan. */ yobs_eqn = 0; min 20 max 150 del 0.01 num_runs 11 #list h_err { -0.25 -0.20 -0.15 -0.10 -0.05 0.00 0.05 0.10 0.15 0.20 0.25 } macro displacement { h_err(Run_Number) } Specimen_Displacement(, displacement ) lam ymin_on_ymax 0.0001 Lam_recs { 0.0159 1.534753 3.6854 0.5691 1.540596 0.4370 0.0762 1.541058 0.6000 0.2517 1.544410 0.5200 0.0871 1.544721 0.6200 } LP_Factor(0) Rp 240 Rs 240 Slit_Width(0.07) Divergence (0.25) axial_conv filament_length 12 sample_length 9.5 receiving_slit_length 15 primary_soller_angle 2.55 secondary_soller_angle 2.55 str phase_name "LaB6" a 4.1569162 b =Get(a); c =Get(a); space_group "Pm-3m" site La1 x 0 y 0 z 0 occ La 1 beq 0.5 site B1 x 0.5 y 0.5 z 0.19 occ B 1 beq 0.5 scale 0.0001 seed 10 xdd_out LaB6_Displacement_##displacement##.xy load out_record out_fmt out_eqn { " %11.6f " = X; " %11.6f\n " = Rand_Normal(Ycalc, Sqrt(Ycalc)); }
There's an example of how to name .out files by Run_Number at: Saving .out Files as a Function of Run Number