User Tools

Site Tools


processing:indexing_with_imaged11

This is an old revision of the document!


Indexing with ImageD11

ImageD11 can also do indexing, using a completely different philosophy from that of GrainSpotter.

The idea is based on the following:

  • Select 2 diffraction rings from your sample
  • For each pair of peaks (one on each ring)
    • Test whether a grain could have those 2 peaks
    • If so, calculate the corresponding grain orientation.
  • For each test orientation, generated above, look for for more peaks that could be assigned to this grain. If a given threshold is reached, accept the grain as a true grain.

Grain indexing with ImageD11

First, get a gve file from ImageD11 as seen before.

Then go in ImageD11 > Indexing > load g-vectors and choose your gve file. Use Assign peaks to powder rings. This command will show all the theoretical peaks of the unit cell (for the phase you define in transformation > parameters) and the number of measured peaks it assigns at each theoretical peaks.

Choose 2 peaks in the list : better peaks have low multiplicity and a lots of peaks expected. Use the indexing > edit parameters menu and enter the index of these rings in ring_1 and ring_2. In hit indexing > generate trial orientation then indexing > score trial orientation. At the end it give you the number of grains indexed.

From here you need to save the ubi file, go : indexing > save UBI matrices.

Then you can use :

makemap.py -p parameters.prm -f peaks_to.flt -u to.ubi -U t0.map –omega_slop=.25 -t .03

This will first assign peaks to grains but the first grains will get all the peaks they can have and the last grains will have what is left. To correct that, the scrippt will then come back on the indexation and compare the peaks of the indexed grains to distribute them more equally and to the best fitting grains, while refining the UBI matrices.

Automatization of this indexing process

you can copy the commands in a batch file like the idx_0.py we made. In that script, you need to load your gve file (from ImageD11), your parameters file (from ImageD11) and your peaks file (from peaksearch). Don't forget to specify the name of the ouput file. In the line myindexer.parameterobject.set_parameters, you can set the indexing parameters (mainly minpks and hkl_tol). To specify the rings you want to use for the indexation, copy the list of peaks from Assign peaks to powder rings in the bloc below rings = [] and enter in that rings = [] list the index of the rings you want to use. This script will pair every ring with all the other to index the peaks in grains. At the end, it will give you the number of grains it found. Once it is finish, the indexed grains are stored in a ubi file and you can get back the not indexed grains to run idx.py again with more generous parameters and try to found more grains with the left peaks.

Plot the results

To have a look at what you indexed, you can plot different things : (command for plot were written in a Xterm terminal)

-the number of peaks in grains vs the error : go in ImageD11 indexing > histogram fit quality

-the number of peaks in a grain vs the intensity : from ImageD11.columnfile import * c = columnfile(“peaks_t0.flt.new”) c.parameters.loadparameters(“parameters.prm”) c.updateGeometry() clf() c.filter(c.tth<13) % we only keep the rings below 13° cause after it's too low intensity plot(c.tth[~(c.labels>=0)], log(c.sum_intensity[~(c.labels>=0)]),“,”) or : plot(c.labels, log(c.sum_intensity),“,”) to save it : c.writefile(“t0la.flt”)

-plot tth vs intensity : plot(d.tth, d.sum_intensity,“o”,ms=5) (with d the variable containing the peaks)

-??

plotgrainhist.py peaks_t0.flt parameters.prm t0.map .05 10 .25

Using only the best rings

We run into the problem that in simulated datasets, a large number of peaks have an intensity below 1 and when saving the images, these intensities are rounded at 0. Consequently, these peaks are not detected anymore by the software. To resolve this issue, we want to consider only peaks with large intensity. So, to select the rings we want to use :

python pickrings.py ../Simulation/simu_FoCIF_omega-28-28_1000grains.flt parameters.prm fewr_ideal.flt

After that, run again the indexation (idx_0.py) with your new flt file.

For now, we still miss grains…

Using only the peaks of the selected phase

This script is able to select the 2 theta corresponding to a certain phase and save only the peaks on these angles in a peaks file (.flt)

First, get the script from github :

git clone http://github.com/FABLE-3DXRD/ImageD11

cp ImageD11/sandbox/ringselect.py .

Then open ImageD11 and load the peaks file, the parameters, plot tth/eta and hit the Add unit cell peaks button. The plot show the whole data set.

Now you can run the script :

python ringselect.py peaks_t100.flt CEns_parameters.prm 0.05 7 ringselect.flt 0 100000

the inputs are :

  • the peaks file you used in ImageD11;
  • the parameters you used in ImageD11;
  • the tth tolerance;
  • the tth max
  • a name for the output file (with the extension .flt at the end);
  • the minimum number of peaks intensity (in pixels) you want for the cut (zero if you want to use all peaks);
  • the number of peaks per ring (put a really large number to be sure to have them all)

It should show a plot of the whole data set vs the peaks it will keep. If you have problem with the plot output, you must set up your matplot configuaration :

~/.config/matplotlib/matplotlibrc

vi ~/.config/matplotlib/matplotlibrc

and then activate the TKAgg backend.

When you import the new peaks file in ImageD11 tth/eta plot, you will have only the selected peaks.

The idea of this script is to index one phase after another and be able to remove the peaks of the grains indexed. This will avoid reusing already indexed peaks and made easier the indexing of the weaker phases.

processing/indexing_with_imaged11.1558104833.txt.gz · Last modified: 2019/05/17 14:53 by estelle