====== GrainSpotter loop for NaCoF3 post-perovskite ======
Below is an example of a GrainSpotter loop for NaCoF3 post-perovskite. You can run it by typing
gsLoop.sh > gsLoop.log
The output of the loop will be saved in ''gsLoop.log'', with multiple outputs, one for each indexing.
===== Main idea =====
The loop can run //nLoops// indexings (typically 3). Indexing are run in parallel. If you ask for 20 copies of indexings, they will run simultaneously. Make sure you do not overrun the capabilities of your computer otherwise it will become very slow!
For each, the loop runs
* 20 iterations of 10000 GrainSpotter orientation searches with the following threshold
* minNPeaks = 25
* minCompleteness = 0.5
* Δ2θ = 0.05°
* Δη = 1.2°
* Δω = 1.2°
* maximum deviation nσ = 2
* 20 iterations of 10000 GrainSpotter orientation searches with
* minNPeaks = 25
* minCompleteness = 0.5
* Δ2θ = 0.07°
* Δη = 2°
* Δω = 2°
* maximum deviation nσ = 2
* 20 iterations of 10000 GrainSpotter orientation searches with
* minNPeaks = 15
* minCompleteness = 0.3
* Δ2θ = 0.05°
* Δη = 1.2°
* Δω = 1.2°
* maximum deviation nσ = 2
* 20 iterations of 10000 GrainSpotter orientation searches with
* minNPeaks = 15
* minCompleteness = 0.3
* Δ2θ = 0.07°
* Δη = 2°
* Δω = 2°
* maximum deviation nσ = 2
At the end of the loop, all results for the corresponding loop number are saved in a folder called ''Indexing-$loop'', where ''$loop'' is the loop number. Merged grains are in a file called ''merge-grains.log'' and their Euler angles in ''merge-grains-euler.txt''.
===== Getting some idea on indexing capabilities =====
There is now a dedicated TIMEleSS tool to [[evaluation:evaluate_indexing_statistics|evaluate your indexing performance]].
===== The loop =====
You wanted it?! Here is the source code for the loop above
#!/bin/bash
# Starting GVE file
startGVE=../HTC_04_02_3D_03_merge.gve
# Starting GVE file
crystalSymmetryCode=3
# Number of indexings
nLoops=3
# Threshold for considering 2 grains are the same (in degrees)
matchgrainThreshold=1
# Step in omega, in degrees
omegastep=0.25
# 2 theta range
min2theta=4.0
max2theta=17.0
# Wavelength
wave=0.3738
# Update parameters above as well as in
# - create_GS_init
# - fine details in indexing_loop
# Location of executables
GrainSpotter=/usr/local/bin/GrainSpotter.0.90
clearGVE=/usr/bin/timelessClearGVEGrains
mergeGrains=/usr/bin/timelessGrainSpotterMerge
extractEuler=/usr/bin/timelessExtractEulerAngles
indexingStatistics=/usr/bin/timelessGSIndexingStatistics
# Global parameter. Used to pass list of files between functions
#grainlist=""
#-----------------------------------------------------------------------------------------------
#
# Call to create GrainSpotter input
# 3 parameters
# - first: name of GrainSpotter output file
# - second: name gve file
# - third: name of grain output file
# - forth : min_measurments
# - fifth : min_completeness
# - sixth : sigma_tth
# - seventh : sigma_eta
# - eighth : sigma_omega
#
#-----------------------------------------------------------------------------------------------
create_GS_init () {
cat > $1 <<- EOM
spacegroup 63 ! spacegroup [space group nr]
etarange 0 360 ! etarange [min max]
! dsrange 0.0 2.0 ! dsrange [min max], reciprocal d-spacing range, multiple ranges can be specified
tthrange $min2theta $max2theta ! tthrange [min max], multiple ranges can be specified
domega $omegastep ! domega [stepsize] in omega, degrees
omegarange -29.0 30.0 ! omegarange [min max] degrees, multiple ranges can be specified
filespecs $2 $3 ! [gvecsfile grainsfile]
cuts $4 $5 1.0 ! cuts [min_measuments min_completeness min_uniqueness]
eulerstep 3 ! eulerstep [stepsize] : angle step size in Euler space
uncertainties $6 $7 $8 ! uncertainties [sigma_tth sigma_eta sigma_omega] in degrees
nsigmas 2 ! nsigmas [Nsig] : maximal deviation in sigmas
!Nhkls_in_indexing 31 ! Nhkls_in_indexing [Nfamilies] : use first Nfamilies in indexing
random $9 ! random sampling of orientation space trying 10000 sample points
minfracg 0.99 ! stop search when minfracg (0..1) of the gvectors have been assigned to grains
! positionfit ! fit the position of the grain
! genhkl ! generate list of hkl's based on space group and cell parameters in gve file
EOM
}
#-----------------------------------------------------------------------------------------------
#
# Actual indexing loop
# Runs tens of GrainSpotter iterations with decreasing tolerances
# Runs in the current folder
#
#-----------------------------------------------------------------------------------------------
indexing_loop () {
local grainlist="" # Declaring this variable as local to be able to run multiple indexings in parallel
echo "#"
echo "#"
echo "# Running first GS iteration. Starting from $startGVE, GS parameters in index-0.ini, grains saved in grains0.log"
echo "#"
echo "#"
create_GS_init index-0.ini ../$startGVE grains-0.log 25 0.5 0.05 1.2 1.2 10000
$GrainSpotter index-0.ini
echo "#"
echo "#"
echo "# Done with iteration 0. New list of GVE will be peaks_after_step-0.gve"
echo "#"
echo "#"
$clearGVE grains-0.log ../$startGVE peaks_after_step-0.gve
grainlist="grains-0.log"
for i in {1..20}
do
j="$((i - 1))"
echo "#"
echo "#"
echo "# Running GS iteration $i. Starting from peaks_after_step-$j.gve, GS parameters in index$i.ini, grains saved in grains-$i.log"
echo "#"
echo "#"
# Use from previous step and create grains$i.log
create_GS_init index-$i.ini peaks_after_step-$j.gve grains-$i.log 25 0.5 0.05 1.2 1.2 10000
$GrainSpotter index-$i.ini
echo "#"
echo "#"
echo "# Done with iteration $i. New list of GVE will be peaks_after_step-$i.gve"
echo "#"
echo "#"
$clearGVE grains-$i.log peaks_after_step-$j.gve peaks_after_step-$i.gve
grainlist="$grainlist grains-$i.log"
rm peaks_after_step-$j.gve
done
for i in {21..40}
do
j="$((i - 1))"
echo "#"
echo "#"
echo "# Running GS iteration $i. Starting from peaks_after_step-$j.gve, GS parameters in index$i.ini, grains saved in grains-$i.log"
echo "#"
echo "#"
# Use from previous step and create grains$i.log
create_GS_init index-$i.ini peaks_after_step-$j.gve grains-$i.log 25 0.5 0.07 2.0 2.0 10000
$GrainSpotter index-$i.ini
echo "#"
echo "#"
echo "# Done with iteration $i. New list of GVE will be peaks_after_step-$i.gve"
echo "#"
echo "#"
$clearGVE grains-$i.log peaks_after_step-$j.gve peaks_after_step-$i.gve
grainlist="$grainlist grains-$i.log"
rm peaks_after_step-$j.gve
done
for i in {41..60}
do
j="$((i - 1))"
echo "#"
echo "#"
echo "# Running GS iteration $i. Starting from peaks_after_step-$j.gve, GS parameters in index$i.ini, grains saved in grains-$i.log"
echo "#"
echo "#"
# Use from previous step and create grains$i.log
create_GS_init index-$i.ini peaks_after_step-$j.gve grains-$i.log 15 0.3 0.05 1.2 1.2 10000
$GrainSpotter index-$i.ini
echo "#"
echo "#"
echo "# Done with iteration $i. New list of GVE will be peaks_after_step-$i.gve"
echo "#"
echo "#"
$clearGVE grains-$i.log peaks_after_step-$j.gve peaks_after_step-$i.gve
grainlist="$grainlist grains-$i.log"
rm peaks_after_step-$j.gve
done
for i in {61..80}
do
j="$((i - 1))"
echo "#"
echo "#"
echo "# Running GS iteration $i. Starting from peaks_after_step-$j.gve, GS parameters in index$i.ini, grains saved in grains-$i.log"
echo "#"
echo "#"
# Use from previous step and create grains$i.log
create_GS_init index-$i.ini peaks_after_step-$j.gve grains-$i.log 15 0.3 0.07 2.0 2.0 10000
$GrainSpotter index-$i.ini
echo "#"
echo "#"
echo "# Done with iteration $i. New list of GVE will be peaks_after_step-$i.gve"
echo "#"
echo "#"
$clearGVE grains-$i.log peaks_after_step-$j.gve peaks_after_step-$i.gve
grainlist="$grainlist grains-$i.log"
rm peaks_after_step-$j.gve
done
rm peaks_after_step-80.gve
$mergeGrains -c $crystalSymmetryCode -m $matchgrainThreshold -o merge $grainlist
$extractEuler -o merge-grains-euler.txt merge-grains.log
$indexingStatistics -i index-80.ini -l merge-grains.log -g ../$startGVE -w $wave
}
#-----------------------------------------------------------------------------------------------
#
# Indexing loop, runs tens of GrainSpotter iterations with decreasing tolerances
# Runs in the current folder
#
#-----------------------------------------------------------------------------------------------
for (( loop=1; loop<=$nLoops; loop++ ))
do
echo "#----------------------------------------------------------------------------------------"
echo "#"
echo "# Full indexing loop number $loop"
echo "# Data saved in folder: Indexing-$loop"
echo "#"
echo "#----------------------------------------------------------------------------------------"
echo ""
folder="Indexing-$loop"
\rm -rf $folder
mkdir $folder
cd $folder
indexing_loop > "../indexing-$loop.log" &
cd ..
echo ""
echo ""
echo "#"
echo "# Done starting the indexing loop number $loop"
echo "# Data saved in folder: Indexing-$loop"
echo "# Log file is indexing-$loop.log"
echo "#"
echo "#----------------------------------------------------------------------------------------"
echo ""
echo ""
done
exit