Please click here to go to the tutorial for DIALS 2.2.
Refining multi-tile detector metrology with DIALS¶
Warning
This tutorial is out of date! Default parameters and output have changed.
Introduction¶
At the end of the Processing in Detail, we showed plots from dials.analyse_output, including images of the positional residuals as a function of position on the detector face. There were clearly some systematic effects, suggesting whole-tile shifts or rotations. Generally, these are small (typically much less than the pixel size) and are expected. DECTRIS provides calibration tables from factory metrology experiments, which XDS can use. Currently we are not applying the correction tables to reflection positions in DIALS. In some situations we may have to work with a much less well calibrated or characterised detector than the Pilatus instruments installed at Diamond. Nevertheless, the multi-panel detector models in DIALS allow us to discover the appropriate corrections assuming we have good diffraction data to refine against.
Here we have access to a thaumatin dataset collected with low dose to avoid radiation damage and with the detector 400 mm from the sample to ensure the coverage of reflections extends right out towards the corners of the images.
Preparing for multi-tile refinement¶
Usually multi-panel detectors like the Pilatus P6M are treated as if they were single panels (with dead regions) in DIALS. Clearly, if we are to make corrections to the relative positions and orientations of the panels, we need a more detailed detector model in which the panels are treated separately. Currently there isn’t really a neat way to switch between the single and multiple panel models, but until we have a native mechanism for doing this in DIALS there is a hidden workaround that does this. We just need to set an environment variable:
export P6M_60_PANEL=1
With that in place, we start as usual by importing the dataset:
dials.import Thaum_M10S15_3_*.cbf
The fact that the multiple panel detector model was used is clear from the output of:
dials.show imported.expt
We can now inspect images from the dataset with:
dials.image_viewer imported.expt
However, the dataset is at such low dose that it can be difficult to find the spots. It might be helpful to us a more mature image viewer such as ADXV or Albula for this.
We have to run spot finding throughout the dataset. It is a 360 degree sequence so this will take a little while:
dials.find_spots imported.expt min_spot_size=3
Here we chose to set min_spot_size=3
, which overrides the default of 6 used
for this detector model. We did this because otherwise this weakly diffracting
dataset produces rather few strong spots, whereas we want as much coverage as
we can get, right out to the corners
Now to index the data. Although it is a well-diffracting crystal, running indexing with defaults finds an approximate supercell with the a and b lengths slightly more than doubled. Inspection of the found spots with dials.reciprocal_lattice_viewer shows curved lines of spots rather than a regular grid, indicating a poor starting model. There are plenty of things that can be done to get indexing to find the correct cell here. If you have time you might like to try a few options out. However, if not, we won’t worry too much about it, because if we pass in the known unit cell for thaumatin then it works just fine. We also chose to apply tetragonal symmetry immediately:
dials.index imported.expt strong.refl space_group="P 4" unit_cell="58 58 150 90 90 90"
The output of refinement in the highest resolution macrocycle is as follows:
################################################################################
Starting refinement (macro-cycle 5)
################################################################################
Summary statistics for observations matched to predictions:
--------------------------------------------------------------------------
| | Min | Q1 | Med | Q3 | Max |
--------------------------------------------------------------------------
| Xc - Xo (mm) | -2.492 | -0.04261 | -0.0004832 | 0.0424 | 2.131 |
| Yc - Yo (mm) | -1.697 | -0.03481 | 0.001733 | 0.03682 | 1.656 |
| Phic - Phio (deg) | -0.9645 | -0.06454 | -0.0007655 | 0.06379 | 0.8353 |
| X weights | 80.55 | 127.8 | 131.8 | 133.9 | 135.2 |
| Y weights | 77.02 | 127.6 | 131.8 | 134 | 135.2 |
| Phi weights | 26.58 | 32.59 | 32.65 | 32.65 | 32.65 |
--------------------------------------------------------------------------
Refinement steps:
-------------------------------------------------
| Step | Nref | RMSD_X | RMSD_Y | RMSD_Phi |
| | | (mm) | (mm) | (deg) |
-------------------------------------------------
| 0 | 18025 | 0.067273 | 0.063827 | 0.086195 |
| 1 | 18025 | 0.067369 | 0.063706 | 0.086197 |
| 2 | 18025 | 0.067439 | 0.063629 | 0.086155 |
| 3 | 18025 | 0.067531 | 0.063529 | 0.086115 |
| 4 | 18025 | 0.067587 | 0.063456 | 0.086122 |
| 5 | 18025 | 0.067607 | 0.063419 | 0.086155 |
| 6 | 18025 | 0.067617 | 0.063401 | 0.086176 |
| 7 | 18025 | 0.06762 | 0.063395 | 0.086181 |
-------------------------------------------------
RMSD no longer decreasing
RMSDs by experiment:
----------------------------------------------
| Exp | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
----------------------------------------------
| 0 | 18025 | 0.39314 | 0.36858 | 0.24623 |
----------------------------------------------
RMSDs by panel:
-----------------------------------------------
| Panel | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
-----------------------------------------------
| 0 | 10 | 0.53322 | 0.82846 | 0.14379 |
| 1 | 140 | 0.37822 | 0.43153 | 0.26887 |
| 2 | 297 | 0.41585 | 0.40848 | 0.26118 |
| 3 | 146 | 0.5563 | 0.40867 | 0.27493 |
| 4 | 17 | 0.49115 | 0.43483 | 0.21656 |
| 5 | 44 | 0.41713 | 0.46071 | 0.27804 |
| 6 | 405 | 0.44932 | 0.51832 | 0.26569 |
| 7 | 758 | 0.33153 | 0.28766 | 0.25461 |
| 8 | 478 | 0.38555 | 0.40525 | 0.26244 |
| 9 | 96 | 0.47338 | 0.45054 | 0.24652 |
| 10 | 152 | 0.40191 | 0.959 | 0.2976 |
| 11 | 701 | 0.31004 | 0.3035 | 0.24597 |
| 12 | 1128 | 0.37366 | 0.24303 | 0.24016 |
| 13 | 802 | 0.33404 | 0.32094 | 0.24614 |
| 14 | 201 | 0.50746 | 0.47124 | 0.27169 |
| 15 | 231 | 0.40185 | 0.56122 | 0.3029 |
| 16 | 745 | 0.21926 | 0.30075 | 0.21426 |
| 17 | 831 | 0.17864 | 0.17706 | 0.2176 |
| 18 | 778 | 0.36795 | 0.21167 | 0.20696 |
| 19 | 269 | 0.44757 | 0.40028 | 0.23809 |
| 20 | 205 | 0.48078 | 0.65283 | 0.34241 |
| 21 | 467 | 0.37577 | 0.35789 | 0.20992 |
| 22 | 370 | 0.22329 | 0.29697 | 0.20943 |
| 23 | 447 | 0.36708 | 0.22722 | 0.20176 |
| 24 | 231 | 0.28466 | 0.52795 | 0.31729 |
| 25 | 3 | 0.36377 | 1.1547 | 0.70452 |
| 26 | 28 | 0.14842 | 0.29869 | 0.23437 |
| 27 | 22 | 0.13375 | 0.2666 | 0.17175 |
| 28 | 17 | 0.1222 | 0.14108 | 0.17261 |
| 29 | 4 | 0.40725 | 0.85708 | 0.42044 |
| 30 | 145 | 0.60805 | 0.57195 | 0.43388 |
| 31 | 281 | 0.18353 | 0.21351 | 0.2061 |
| 32 | 250 | 0.19984 | 0.15417 | 0.1993 |
| 33 | 294 | 0.15006 | 0.27665 | 0.21823 |
| 34 | 158 | 0.44084 | 0.50436 | 0.38365 |
| 35 | 203 | 0.86526 | 0.47248 | 0.32568 |
| 36 | 525 | 0.54992 | 0.31614 | 0.19036 |
| 37 | 521 | 0.22611 | 0.12494 | 0.21894 |
| 38 | 624 | 0.23105 | 0.20793 | 0.22246 |
| 39 | 259 | 0.43408 | 0.43312 | 0.2724 |
| 40 | 134 | 0.55289 | 0.3935 | 0.26933 |
| 41 | 557 | 0.29543 | 0.24331 | 0.23127 |
| 42 | 771 | 0.46252 | 0.19655 | 0.2348 |
| 43 | 658 | 0.24901 | 0.31232 | 0.24217 |
| 44 | 199 | 0.44994 | 0.43547 | 0.28695 |
| 45 | 54 | 0.5679 | 0.44719 | 0.23983 |
| 46 | 333 | 0.44117 | 0.44019 | 0.24586 |
| 47 | 592 | 0.3056 | 0.44653 | 0.24795 |
| 48 | 411 | 0.67885 | 0.39219 | 0.2588 |
| 49 | 93 | 0.45355 | 0.5659 | 0.2611 |
| 50 | 5 | 1.0009 | 0.46232 | 0.21423 |
| 51 | 162 | 0.72162 | 0.36619 | 0.23884 |
| 52 | 324 | 0.51574 | 0.48569 | 0.2488 |
| 53 | 224 | 0.41145 | 0.40151 | 0.2671 |
| 54 | 16 | 0.5362 | 0.50568 | 0.21454 |
| 55 | 1 | 0.85351 | 0.57076 | 0.24389 |
| 56 | 37 | 0.72428 | 0.38373 | 0.27121 |
| 57 | 106 | 0.80208 | 0.98469 | 0.27939 |
| 58 | 61 | 0.5144 | 1.3281 | 0.30346 |
| 59 | 4 | 0.33371 | 0.50058 | 0.24425 |
-----------------------------------------------
Final refined crystal models:
model 1 (192715 reflections):
Crystal:
Unit cell: (57.834, 57.834, 150.022, 90.000, 90.000, 90.000)
Space group: P 4
U matrix: {{ 0.4122, -0.9018, 0.1299},
{ 0.2361, -0.0320, -0.9712},
{ 0.8800, 0.4310, 0.1997}}
B matrix: {{ 0.0173, 0.0000, 0.0000},
{ 0.0000, 0.0173, 0.0000},
{ 0.0000, 0.0000, 0.0067}}
A = UB: {{ 0.0071, -0.0156, 0.0009},
{ 0.0041, -0.0006, -0.0065},
{ 0.0152, 0.0075, 0.0013}}
This refinement was performed moving all the panels as a rigid block, as usual.
With overall positional RMSDs within 40% of the pixel size and a
quarter of the image width in \(\phi\) we can see straight away that we are
dealing with a fairly good quality
dataset. There are a few outliers of well over 1 mm on the detector surface and nearly
1 degree in \(\phi\) though, which we would prefer not to include in
refinement. The outliers are not as bad if we had kept min_spot_size=6
,
but the detector coverage is worse in that case. Although from the indexing results
it seems that coverage of reflections on the outer panels is rather low, so far
we let refinement take a random subset of the data in order to index quicker,
so there’s no need to worry about that yet.
Now we will refine the detector as a rigid block again, turning on outlier
rejection and requesting to use all reflections to get the best we can out
of the dataset. We will also keep the refined reflections file for analysis.
The final parameter here, close_to_spindle_cutoff=0.01
allows reflections
closer to the spindle to be included in refinement (default value is 0.05, and
if set to 0.0 no reflections will be rejected for being too close).
Without this option, the central panels are very sparse:
dials.refine indexed.refl indexed.expt \
outlier.algorithm=tukey use_all_reflections=true close_to_spindle_cutoff=0.01 \
output.reflections=refined_lev0.refl \
output.experiments=refined_lev0.expt
Here is the output:
The following parameters have been modified:
output {
reflections = refined_lev0.refl
experiments = refined_lev0.expt
}
refinement {
reflections {
use_all_reflections = true
close_to_spindle_cutoff = 0.01
outlier {
algorithm = null *tukey
}
}
}
input {
experiments = indexed.expt
reflections = indexed.refl
}
Configuring refiner
Summary statistics for observations matched to predictions:
-----------------------------------------------------------------------
| | Min | Q1 | Med | Q3 | Max |
-----------------------------------------------------------------------
| Xc - Xo (mm) | -2.487 | -0.04174 | 0.000276 | 0.0424 | 2.128 |
| Yc - Yo (mm) | -1.75 | -0.03468 | 0.00168 | 0.03656 | 1.654 |
| Phic - Phio (deg) | -5.549 | -0.06627 | -0.002108 | 0.063 | 3.27 |
| X weights | 80.55 | 127.9 | 131.9 | 134 | 135.2 |
| Y weights | 77.02 | 127.7 | 131.9 | 134 | 135.2 |
| Phi weights | 25.97 | 32.57 | 32.65 | 32.65 | 32.65 |
-----------------------------------------------------------------------
6375 reflections have been rejected as outliers
Summary statistics for observations matched to predictions:
--------------------------------------------------------------------------
| | Min | Q1 | Med | Q3 | Max |
--------------------------------------------------------------------------
| Xc - Xo (mm) | -0.2933 | -0.04128 | -3.167e-05 | 0.04112 | 0.3725 |
| Yc - Yo (mm) | -0.4707 | -0.03376 | 0.001821 | 0.03588 | 0.4945 |
| Phic - Phio (deg) | -0.6965 | -0.06574 | -0.002213 | 0.06229 | 0.7919 |
| X weights | 80.55 | 128 | 132 | 134 | 135.2 |
| Y weights | 77.02 | 127.8 | 131.9 | 134.1 | 135.2 |
| Phi weights | 26.58 | 32.57 | 32.65 | 32.65 | 32.65 |
--------------------------------------------------------------------------
Performing refinement...
Refinement steps:
--------------------------------------------------
| Step | Nref | RMSD_X | RMSD_Y | RMSD_Phi |
| | | (mm) | (mm) | (deg) |
--------------------------------------------------
| 0 | 186203 | 0.064091 | 0.057786 | 0.086136 |
| 1 | 186203 | 0.064045 | 0.057829 | 0.08608 |
| 2 | 186203 | 0.063949 | 0.05791 | 0.086068 |
| 3 | 186203 | 0.063825 | 0.058023 | 0.086026 |
| 4 | 186203 | 0.063734 | 0.058114 | 0.085958 |
| 5 | 186203 | 0.063682 | 0.058167 | 0.085909 |
| 6 | 186203 | 0.063654 | 0.058198 | 0.085887 |
| 7 | 186203 | 0.063645 | 0.058208 | 0.085882 |
| 8 | 186203 | 0.063644 | 0.05821 | 0.085882 |
--------------------------------------------------
RMSD no longer decreasing
RMSDs by experiment:
-----------------------------------------------
| Exp | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
-----------------------------------------------
| 0 | 186203 | 0.37002 | 0.33843 | 0.24538 |
-----------------------------------------------
RMSDs by panel:
-----------------------------------------------
| Panel | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
-----------------------------------------------
| 0 | 63 | 0.47216 | 0.59331 | 0.22352 |
| 1 | 1363 | 0.35019 | 0.46301 | 0.26549 |
| 2 | 3076 | 0.4128 | 0.40658 | 0.26659 |
| 3 | 1630 | 0.46232 | 0.39692 | 0.25547 |
| 4 | 112 | 0.39711 | 0.42575 | 0.23841 |
| 5 | 394 | 0.35145 | 0.51263 | 0.25474 |
| 6 | 3489 | 0.3238 | 0.48667 | 0.25694 |
| 7 | 6172 | 0.30869 | 0.27402 | 0.25323 |
| 8 | 3908 | 0.37309 | 0.38322 | 0.25577 |
| 9 | 680 | 0.46698 | 0.44533 | 0.24812 |
| 10 | 1178 | 0.33544 | 0.51129 | 0.26289 |
| 11 | 5690 | 0.28409 | 0.29009 | 0.24376 |
| 12 | 9385 | 0.36731 | 0.23495 | 0.23873 |
| 13 | 6878 | 0.31962 | 0.31088 | 0.23691 |
| 14 | 1749 | 0.43068 | 0.47078 | 0.25696 |
| 15 | 1870 | 0.29306 | 0.46181 | 0.26494 |
| 16 | 6328 | 0.19137 | 0.29002 | 0.21465 |
| 17 | 7599 | 0.17418 | 0.1739 | 0.22093 |
| 18 | 7072 | 0.36776 | 0.18662 | 0.20821 |
| 19 | 2609 | 0.37377 | 0.42663 | 0.24206 |
| 20 | 1806 | 0.40342 | 0.57026 | 0.32007 |
| 21 | 4247 | 0.35488 | 0.34512 | 0.19181 |
| 22 | 3558 | 0.21403 | 0.30996 | 0.20695 |
| 23 | 4103 | 0.36559 | 0.19154 | 0.17851 |
| 24 | 2270 | 0.25744 | 0.48077 | 0.26616 |
| 25 | 480 | 0.38505 | 1.0035 | 0.73284 |
| 26 | 930 | 0.15033 | 0.26661 | 0.34611 |
| 27 | 971 | 0.11836 | 0.19105 | 0.18709 |
| 28 | 975 | 0.11907 | 0.25901 | 0.30046 |
| 29 | 549 | 0.41024 | 0.95027 | 0.72705 |
| 30 | 1478 | 0.56625 | 0.3835 | 0.34664 |
| 31 | 3216 | 0.16373 | 0.19856 | 0.19257 |
| 32 | 2826 | 0.20149 | 0.14689 | 0.19485 |
| 33 | 3285 | 0.12942 | 0.30274 | 0.20848 |
| 34 | 1965 | 0.38874 | 0.45564 | 0.38875 |
| 35 | 1934 | 0.61707 | 0.35339 | 0.25067 |
| 36 | 5875 | 0.55413 | 0.29556 | 0.19246 |
| 37 | 5992 | 0.2137 | 0.12029 | 0.21502 |
| 38 | 6589 | 0.2254 | 0.21047 | 0.21193 |
| 39 | 2763 | 0.39851 | 0.41673 | 0.27272 |
| 40 | 1512 | 0.50654 | 0.36893 | 0.25051 |
| 41 | 6476 | 0.28308 | 0.21635 | 0.22668 |
| 42 | 9212 | 0.40577 | 0.18283 | 0.2252 |
| 43 | 7521 | 0.22936 | 0.29881 | 0.23864 |
| 44 | 2392 | 0.40816 | 0.42881 | 0.2751 |
| 45 | 611 | 0.56917 | 0.48084 | 0.26191 |
| 46 | 4379 | 0.42672 | 0.42447 | 0.25285 |
| 47 | 7749 | 0.29309 | 0.4378 | 0.24631 |
| 48 | 5470 | 0.67537 | 0.37528 | 0.25187 |
| 49 | 1210 | 0.42778 | 0.53938 | 0.27266 |
| 50 | 127 | 0.92194 | 0.45501 | 0.24629 |
| 51 | 2235 | 0.71785 | 0.33424 | 0.25781 |
| 52 | 4379 | 0.41055 | 0.38155 | 0.25735 |
| 53 | 2757 | 0.44268 | 0.40149 | 0.26646 |
| 54 | 327 | 0.52856 | 0.51306 | 0.28205 |
| 56 | 457 | 0.60967 | 0.429 | 0.26482 |
| 57 | 1507 | 0.70752 | 0.67612 | 0.25844 |
| 58 | 786 | 0.53669 | 0.50635 | 0.27127 |
| 59 | 39 | 0.43205 | 0.65796 | 0.25585 |
-----------------------------------------------
Saving refined experiments to refined_lev0.expt
Saving refined reflections to refined_lev0.refl
Outlier rejection has cleaned up the positional residuals so now the greatest deviation is within 0.4 mm of the predicted position. The angular extreme is now just over 0.4 degrees. Coverage of the outer and central panels (where reflections are in the backstop shadow or thrown away for being too close to the spindle) is still a little low. Notably, panel 55 (a corner panel) is completely missing. If we had more datasets recorded at the same detector distance (and more time to process them) we could combine them in a multi-crystal joint refinement job to increase the coverage of panels further. However, for the purposes of this tutorial we will see what we can get with this single dataset.
Before moving on to the multi-panel refinement job we will take a look at the refined reflections file:
dials.analyse_output refined_lev0.refl grid_size=5,12
Here we had to tell dials.analyse_output about the arrangement of
the panels, as it does not use the refined_lev0.expt
file so cannot
figure this out itself.
Here are the positional residual plots for X and Y, analysis/centroid/centroid_diff_x.png
and analysis/centroid/centroid_diff_y.png
. The multi-panel versions
of these plots are not as compact as the single tile version presented in the
Processing in Detail. However, careful comparison of the plots is enough to
show that the same pattern of shifts is present.
Multi-tile refinement¶
Now we repeat refinement, but we allow the panels to move independently. In
DIALS multi-panel detectors are represented by a hierarchical model. The highest
level hieararchy_level=0
means to treat the whole detector unit as a
rigid block. Some detectors, notably the CS-PAD used at LCLS beamlines, have a
real hierarchy of a few levels deep. The Pilatus P6M has a very simple hierarchy,
with a single lower level, hieararchy_level=1
, in which every panel is
treated separately. We now start from the previous refinement run
specifying this hierarchy level:
dials.refine indexed.refl refined_lev0.expt outlier.algorithm=tukey \
use_all_reflections=true output.reflections=refined_lev1.refl \
close_to_spindle_cutoff=0.01 bin_size_fraction=0 hierarchy_level=1 \
output.experiments=refined_lev1.expt
You may have noticed that apart from hierarchy_level=1
there was an
additional parameter added to this command compared to the previous refinement run,
namely bin_size_fraction=0
. This sets the RMSD target for refinement to
zero, so that refinement will never terminate because the RMSDs are ‘good enough’,
only if they converge so that their rate of decrease on subsequent steps falls
to zero. This is necessary because the extra freedom allowed by parameterising
each panel individually allows the RMSDs to fall lower than the default target.
There are 366 parameters in total for this refinement run. This can be seen
by checking the file dials.refine.debug.log
once refinement is underway.
Warning
This job took 17 minutes to run on a Linux desktop with a Core i7 CPU running at 3.07GHz, and uses about 4 GB of RAM.
Refinement is single-process at the moment, unfortunately, so we can’t yet make use of parallelism here to speed the job up. The output is as follows:
The following parameters have been modified:
output {
experiments = refined_lev1.expt
reflections = refined_lev1.refl
}
refinement {
parameterisation {
detector {
hierarchy_level = 1
}
}
target {
bin_size_fraction = 0
}
reflections {
use_all_reflections = true
close_to_spindle_cutoff = 0.01
outlier {
algorithm = null *tukey
}
}
}
input {
experiments = refined.expt
reflections = indexed.refl
}
Configuring refiner
Summary statistics for observations matched to predictions:
------------------------------------------------------------------------
| | Min | Q1 | Med | Q3 | Max |
------------------------------------------------------------------------
| Xc - Xo (mm) | -2.496 | -0.04178 | 0.0004518 | 0.04222 | 2.133 |
| Yc - Yo (mm) | -1.903 | -0.03577 | 0.0006705 | 0.03588 | 1.656 |
| Phic - Phio (deg) | -5.576 | -0.06467 | -0.0007391 | 0.06414 | 3.292 |
| X weights | 80.55 | 127.9 | 131.9 | 134 | 135.2 |
| Y weights | 77.02 | 127.7 | 131.9 | 134 | 135.2 |
| Phi weights | 25.97 | 32.57 | 32.65 | 32.65 | 32.65 |
------------------------------------------------------------------------
6433 reflections have been rejected as outliers
Summary statistics for observations matched to predictions:
--------------------------------------------------------------------------
| | Min | Q1 | Med | Q3 | Max |
--------------------------------------------------------------------------
| Xc - Xo (mm) | -0.2916 | -0.04138 | 0.0001204 | 0.041 | 0.3683 |
| Yc - Yo (mm) | -0.4838 | -0.03481 | 0.0008164 | 0.03518 | 0.4917 |
| Phic - Phio (deg) | -0.6969 | -0.06416 | -0.0008647 | 0.06351 | 0.7644 |
| X weights | 80.55 | 128 | 132 | 134 | 135.2 |
| Y weights | 77.02 | 127.8 | 131.9 | 134.1 | 135.2 |
| Phi weights | 26.58 | 32.57 | 32.65 | 32.65 | 32.65 |
--------------------------------------------------------------------------
Performing refinement...
Refinement steps:
--------------------------------------------------
| Step | Nref | RMSD_X | RMSD_Y | RMSD_Phi |
| | | (mm) | (mm) | (deg) |
--------------------------------------------------
| 0 | 186145 | 0.063617 | 0.058127 | 0.085801 |
| 1 | 186145 | 0.056976 | 0.05538 | 0.085719 |
| 2 | 186145 | 0.049808 | 0.052619 | 0.085597 |
| 3 | 186145 | 0.04634 | 0.051408 | 0.085475 |
| 4 | 186145 | 0.045568 | 0.051142 | 0.085391 |
| 5 | 186145 | 0.04538 | 0.051014 | 0.085337 |
| 6 | 186145 | 0.045228 | 0.050729 | 0.085285 |
| 7 | 186145 | 0.045054 | 0.050076 | 0.085215 |
| 8 | 186145 | 0.044868 | 0.049034 | 0.085115 |
| 9 | 186145 | 0.044746 | 0.048167 | 0.085025 |
| 10 | 186145 | 0.044708 | 0.047833 | 0.08498 |
| 11 | 186145 | 0.044695 | 0.047759 | 0.084969 |
| 12 | 186145 | 0.04468 | 0.047738 | 0.084967 |
| 13 | 186145 | 0.044668 | 0.047726 | 0.084967 |
| 14 | 186145 | 0.044662 | 0.047721 | 0.084967 |
| 15 | 186145 | 0.04466 | 0.047719 | 0.084967 |
--------------------------------------------------
RMSD no longer decreasing
RMSDs by experiment:
-----------------------------------------------
| Exp | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
-----------------------------------------------
| 0 | 186145 | 0.25965 | 0.27743 | 0.24276 |
-----------------------------------------------
RMSDs by panel:
------------------------------------------------
| Panel | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
------------------------------------------------
| 0 | 64 | 0.32036 | 0.57819 | 0.22482 |
| 1 | 1361 | 0.34304 | 0.4111 | 0.26504 |
| 2 | 3079 | 0.3561 | 0.36483 | 0.26682 |
| 3 | 1632 | 0.37843 | 0.37838 | 0.25453 |
| 4 | 112 | 0.39065 | 0.39675 | 0.23706 |
| 5 | 394 | 0.30539 | 0.48132 | 0.25442 |
| 6 | 3490 | 0.29682 | 0.35249 | 0.25661 |
| 7 | 6178 | 0.28525 | 0.27486 | 0.25318 |
| 8 | 3909 | 0.31728 | 0.30551 | 0.25565 |
| 9 | 675 | 0.39465 | 0.42802 | 0.24507 |
| 10 | 1175 | 0.30057 | 0.46365 | 0.26215 |
| 11 | 5685 | 0.23485 | 0.27143 | 0.24326 |
| 12 | 9386 | 0.20171 | 0.18887 | 0.23872 |
| 13 | 6880 | 0.23494 | 0.23081 | 0.23689 |
| 14 | 1746 | 0.31911 | 0.40137 | 0.25357 |
| 15 | 1870 | 0.27575 | 0.44911 | 0.26334 |
| 16 | 6321 | 0.18338 | 0.21691 | 0.21382 |
| 17 | 7608 | 0.14673 | 0.13459 | 0.22118 |
| 18 | 7075 | 0.15323 | 0.1772 | 0.20816 |
| 19 | 2608 | 0.27977 | 0.40106 | 0.23663 |
| 20 | 1803 | 0.24748 | 0.54944 | 0.31271 |
| 21 | 4249 | 0.15151 | 0.21436 | 0.18971 |
| 22 | 3560 | 0.11336 | 0.12431 | 0.20676 |
| 23 | 4103 | 0.10087 | 0.16239 | 0.17534 |
| 24 | 2271 | 0.20061 | 0.46907 | 0.24929 |
| 25 | 476 | 0.26774 | 0.94809 | 0.69743 |
| 26 | 927 | 0.10167 | 0.22193 | 0.33398 |
| 27 | 974 | 0.097735 | 0.13559 | 0.1876 |
| 28 | 977 | 0.069491 | 0.1907 | 0.29589 |
| 29 | 549 | 0.19349 | 0.91362 | 0.67233 |
| 30 | 1474 | 0.31601 | 0.36268 | 0.32879 |
| 31 | 3209 | 0.13728 | 0.15038 | 0.18643 |
| 32 | 2829 | 0.10162 | 0.11078 | 0.19453 |
| 33 | 3276 | 0.10363 | 0.17357 | 0.2043 |
| 34 | 1951 | 0.20521 | 0.4038 | 0.36983 |
| 35 | 1931 | 0.37408 | 0.28915 | 0.24379 |
| 36 | 5869 | 0.18862 | 0.14476 | 0.1912 |
| 37 | 5991 | 0.13887 | 0.11716 | 0.21506 |
| 38 | 6591 | 0.15001 | 0.19861 | 0.21179 |
| 39 | 2763 | 0.25238 | 0.36458 | 0.26476 |
| 40 | 1511 | 0.47841 | 0.27181 | 0.24826 |
| 41 | 6461 | 0.27368 | 0.18468 | 0.22587 |
| 42 | 9213 | 0.19848 | 0.15776 | 0.22531 |
| 43 | 7521 | 0.21923 | 0.24706 | 0.2383 |
| 44 | 2390 | 0.32645 | 0.40052 | 0.27085 |
| 45 | 611 | 0.55212 | 0.29673 | 0.26008 |
| 46 | 4378 | 0.38894 | 0.24988 | 0.25198 |
| 47 | 7747 | 0.2824 | 0.2289 | 0.24614 |
| 48 | 5470 | 0.29905 | 0.31716 | 0.25135 |
| 49 | 1210 | 0.41311 | 0.47572 | 0.2691 |
| 50 | 127 | 0.69191 | 0.39228 | 0.2447 |
| 51 | 2231 | 0.47797 | 0.32129 | 0.25717 |
| 52 | 4378 | 0.38899 | 0.31331 | 0.25676 |
| 53 | 2758 | 0.39246 | 0.40955 | 0.26575 |
| 54 | 327 | 0.48186 | 0.52671 | 0.2798 |
| 56 | 458 | 0.57234 | 0.42803 | 0.2643 |
| 57 | 1507 | 0.494 | 0.41177 | 0.25741 |
| 58 | 786 | 0.48028 | 0.48906 | 0.26898 |
| 59 | 40 | 0.39499 | 0.38962 | 0.2466 |
------------------------------------------------
Saving refined experiments to refined_lev1.expt
Saving refined reflections to refined_lev1.refl
Following refinement, we repeat the analysis of positional residuals:
mv analysis analysis_lev0
dials.analyse_output refined.refl grid_size=5,12
mv analysis analysis_lev1
The positional residual plots for X and Y,
analysis_lev1/centroid/centroid_diff_x.png
and analysis_lev1/centroid/centroid_diff_y.png
make it clear that
despite poor coverage on some panels, the systematic shifts have been cleaned
up by the refinement job.
Applying the corrected metrology¶
Although we have corrected for small shifts and rotations apparently present from spot positions recorded in one dataset, what we would really like to do is apply these corrections to a different dataset. Short of rewriting the dxtbx Format object for the detector to incorporate the corrections, we could try to ‘copy and paste’ the detector from one dataset to the other.
We will choose the standard tutorial data to try this, from the
Processing in Detail. First we have to process that data using the
multi-panel version of the Pilatus P6M detector model. Assuming the environment
variable P6M_60_PANEL=1
is set in this terminal we just need to repeat
the commands from the tutorial:
mkdir tutorial_data
cd !$
dials.import /path/to/th_8_2*cbf
dials.find_spots imported.expt
dials.index imported.expt strong.refl space_group="P4"
dials.refine indexed.expt indexed.refl outlier.algorithm=tukey use_all_reflections=true bin_size_fraction=0.0
Note these are the overall RMSDs (comparable to the results from the Processing in Detail, as we’d expect):
RMSDs by experiment:
----------------------------------------------
| Exp | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
----------------------------------------------
| 0 | 53916 | 0.26341 | 0.21858 | 0.106 |
----------------------------------------------
Now we do the scan-varying refinement and integrate:
dials.refine refined.expt indexed.refl outlier.algorithm=tukey use_all_reflections=true bin_size_fraction=0.0 scan_varying=true output.experiments=sv_refined.expt
dials.integrate sv_refined.expt indexed.refl outlier.algorithm=null
dials.export integrated.refl sv_refined.expt mtz.hklout=integrated.mtz
dials.analyse_output integrated.refl grid_size=5,12
From the end of dials.integrate.log
:
Summary of integration results binned by resolution
----------------------------------------------------------------------------------------------------------
d min | d max | # full | # part | # over | # ice | # sum | # prf | <Ibg> | <I/sigI> | <I/sigI> | <CC prf>
| | | | | | | | | (sum) | (prf) |
----------------------------------------------------------------------------------------------------------
1.17 | 1.19 | 324 | 3 | 0 | 0 | 327 | 260 | 0.04 | 0.37 | 0.54 | 0.11
1.19 | 1.21 | 1093 | 7 | 0 | 0 | 1100 | 984 | 0.04 | 0.43 | 0.54 | 0.09
1.21 | 1.23 | 2317 | 14 | 0 | 0 | 2331 | 2138 | 0.05 | 0.48 | 0.57 | 0.10
1.23 | 1.26 | 3776 | 27 | 0 | 0 | 3803 | 3581 | 0.05 | 0.53 | 0.66 | 0.12
1.26 | 1.28 | 5416 | 34 | 0 | 0 | 5450 | 5100 | 0.05 | 0.59 | 0.74 | 0.14
1.28 | 1.31 | 7235 | 54 | 0 | 0 | 7289 | 6806 | 0.06 | 0.64 | 0.81 | 0.16
1.31 | 1.35 | 9504 | 63 | 0 | 0 | 9567 | 8952 | 0.06 | 0.77 | 0.95 | 0.19
1.35 | 1.38 | 12495 | 87 | 0 | 0 | 12582 | 11826 | 0.07 | 0.90 | 1.11 | 0.21
1.38 | 1.42 | 16967 | 111 | 0 | 0 | 17078 | 16125 | 0.08 | 0.98 | 1.20 | 0.23
1.42 | 1.47 | 20187 | 153 | 0 | 0 | 20340 | 19437 | 0.08 | 1.20 | 1.43 | 0.27
1.47 | 1.52 | 23623 | 258 | 0 | 0 | 23881 | 22761 | 0.09 | 1.47 | 1.71 | 0.30
1.52 | 1.58 | 24126 | 271 | 0 | 0 | 24397 | 23289 | 0.10 | 1.75 | 2.03 | 0.35
1.58 | 1.66 | 25506 | 281 | 0 | 0 | 25787 | 24863 | 0.11 | 2.17 | 2.46 | 0.41
1.66 | 1.74 | 24269 | 241 | 0 | 0 | 24510 | 23389 | 0.12 | 2.71 | 3.01 | 0.46
1.74 | 1.85 | 24780 | 238 | 0 | 0 | 25018 | 24019 | 0.15 | 3.50 | 3.82 | 0.52
1.85 | 2.00 | 25710 | 278 | 0 | 0 | 25988 | 25059 | 0.19 | 4.87 | 5.20 | 0.59
2.00 | 2.20 | 24757 | 274 | 0 | 0 | 25031 | 24000 | 0.26 | 6.58 | 6.94 | 0.66
2.20 | 2.51 | 25673 | 252 | 0 | 0 | 25925 | 25119 | 0.29 | 8.84 | 9.15 | 0.69
2.51 | 3.17 | 25214 | 297 | 0 | 0 | 25511 | 24607 | 0.37 | 12.78 | 13.01 | 0.73
3.17 | 151.26 | 25766 | 303 | 0 | 0 | 26069 | 25226 | 0.45 | 25.48 | 25.36 | 0.74
----------------------------------------------------------------------------------------------------------
Summary of integration results for the whole dataset
----------------------------------------------
Number fully recorded | 338720
Number partially recorded | 4747
Number with overloaded pixels | 0
Number in powder rings | 0
Number processed with summation | 331984
Number processed with profile fitting | 317541
<Ibg> | 0.18
<I/sigI> (summation) | 5.63
<I/sigI> (profile fitting) | 5.92
<CC prf> | 0.43
----------------------------------------------
The plot of correlations between strong (reference) reflections and the profiles used to fit them shows up the systematic effects of uncorrected tile shifts and misorientations:
Now, how can we apply the metrology? Here we will use dials.combine_experiments
with the reference_from_experiment.detector
option to overwrite the detector
model from our indexed.expt
. We don’t really want the combined experiments
file, only this side-effect, so we immediately split it again:
dials.combine_experiments experiments=../refined_lev1.expt experiments=refined.expt reflections=../refined_lev1.refl reflections=indexed.refl reference_from_experiment.detector=0
dials.split_experiments combined.expt combined.refl
This results in a few files, of which experiments_1.expt
is interesting.
It contains the updated detector - but beware the detector distance is now
completely wrong! It is at about 400 mm rather than 265 mm. We could correct that
by editing experiments_1.expt
directly, but actually there is no need.
dials.refine is extremely forgiving of bad starting geometry, though
we should remember to fix the beam and crystal models:
dials.refine experiments_1.expt indexed.refl output.experiments=corrected_refined.expt beam.fix=all crystal.fix=all
A snippet from the log file shows that the detector distance offset was largely corrected in a single step:
Refinement steps:
------------------------------------------------
| Step | Nref | RMSD_X | RMSD_Y | RMSD_Phi |
| | | (mm) | (mm) | (deg) |
------------------------------------------------
| 0 | 4049 | 40.622 | 40.688 | 0.019202 |
| 1 | 4049 | 0.28874 | 0.30251 | 0.019202 |
| 2 | 4049 | 0.045937 | 0.045205 | 0.019202 |
------------------------------------------------
Now we’ll let the crystal and beam refine along with the new detector to RMSD convergence:
dials.refine corrected_refined.expt indexed.refl outlier.algorithm=tukey use_all_reflections=true bin_size_fraction=0.0 output.experiments=corrected_refined.expt
Here is the output:
The following parameters have been modified:
output {
experiments = corrected_refined.expt
}
refinement {
target {
bin_size_fraction = 0.0
}
reflections {
use_all_reflections = true
outlier {
algorithm = null *tukey
}
}
}
input {
experiments = corrected_refined.expt
reflections = indexed.refl
}
Configuring refiner
Summary statistics for observations matched to predictions:
-------------------------------------------------------------------------
| | Min | Q1 | Med | Q3 | Max |
-------------------------------------------------------------------------
| Xc - Xo (mm) | -0.4701 | -0.02988 | -0.01025 | 0.02159 | 0.6902 |
| Yc - Yo (mm) | -0.7267 | -0.02846 | -0.005739 | 0.02339 | 1.247 |
| Phic - Phio (deg) | -1.409 | -0.01035 | 5.562e-05 | 0.01104 | 0.4029 |
| X weights | 113.5 | 133.7 | 134.5 | 135 | 135.2 |
| Y weights | 109.2 | 133.4 | 134.5 | 135 | 135.2 |
| Phi weights | 155.5 | 175.8 | 177 | 177.5 | 177.8 |
-------------------------------------------------------------------------
2382 reflections have been rejected as outliers
Summary statistics for observations matched to predictions:
--------------------------------------------------------------------------
| | Min | Q1 | Med | Q3 | Max |
--------------------------------------------------------------------------
| Xc - Xo (mm) | -0.1148 | -0.02997 | -0.01092 | 0.01966 | 0.331 |
| Yc - Yo (mm) | -0.1397 | -0.02791 | -0.005742 | 0.02263 | 0.2531 |
| Phic - Phio (deg) | -0.1881 | -0.009998 | 0.0001419 | 0.0109 | 0.1176 |
| X weights | 113.5 | 133.7 | 134.6 | 135 | 135.2 |
| Y weights | 109.9 | 133.5 | 134.5 | 135 | 135.2 |
| Phi weights | 158.2 | 175.9 | 177 | 177.5 | 177.8 |
--------------------------------------------------------------------------
Performing refinement...
Refinement steps:
-------------------------------------------------
| Step | Nref | RMSD_X | RMSD_Y | RMSD_Phi |
| | | (mm) | (mm) | (deg) |
-------------------------------------------------
| 0 | 53738 | 0.04524 | 0.04251 | 0.015875 |
| 1 | 53738 | 0.043495 | 0.041514 | 0.015395 |
| 2 | 53738 | 0.042657 | 0.040762 | 0.01535 |
| 3 | 53738 | 0.040455 | 0.038826 | 0.015287 |
| 4 | 53738 | 0.0356 | 0.034575 | 0.015251 |
| 5 | 53738 | 0.028146 | 0.027998 | 0.015246 |
| 6 | 53738 | 0.021919 | 0.022913 | 0.015245 |
| 7 | 53738 | 0.019867 | 0.021931 | 0.015256 |
| 8 | 53738 | 0.019579 | 0.02202 | 0.015267 |
| 9 | 53738 | 0.019553 | 0.02204 | 0.015269 |
| 10 | 53738 | 0.019552 | 0.022041 | 0.015269 |
-------------------------------------------------
RMSD no longer decreasing
RMSDs by experiment:
----------------------------------------------
| Exp | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
----------------------------------------------
| 0 | 53738 | 0.11368 | 0.12815 | 0.10179 |
----------------------------------------------
RMSDs by panel:
-------------------------------------------------
| Panel | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
-------------------------------------------------
| 2 | 18 | 0.18212 | 0.28586 | 0.12145 |
| 6 | 125 | 0.15295 | 0.24972 | 0.12934 |
| 7 | 609 | 0.1286 | 0.21324 | 0.12291 |
| 8 | 265 | 0.1243 | 0.21443 | 0.10878 |
| 11 | 1189 | 0.14339 | 0.19084 | 0.10244 |
| 12 | 2389 | 0.097393 | 0.16185 | 0.1081 |
| 13 | 1550 | 0.084417 | 0.14168 | 0.098364 |
| 14 | 148 | 0.14653 | 0.17253 | 0.11116 |
| 15 | 254 | 0.21387 | 0.15463 | 0.10746 |
| 16 | 2728 | 0.11345 | 0.15427 | 0.081722 |
| 17 | 4265 | 0.060489 | 0.1104 | 0.096919 |
| 18 | 2952 | 0.07167 | 0.092076 | 0.093342 |
| 19 | 565 | 0.1626 | 0.11391 | 0.11975 |
| 20 | 534 | 0.18454 | 0.16728 | 0.16016 |
| 21 | 2772 | 0.092555 | 0.12647 | 0.076534 |
| 22 | 2873 | 0.047736 | 0.10398 | 0.090391 |
| 23 | 2686 | 0.063075 | 0.074814 | 0.075038 |
| 24 | 729 | 0.16869 | 0.11128 | 0.14306 |
| 25 | 119 | 0.81495 | 0.29087 | 0.44711 |
| 26 | 406 | 0.080441 | 0.12121 | 0.098888 |
| 27 | 425 | 0.052654 | 0.15365 | 0.0754 |
| 28 | 364 | 0.06931 | 0.066238 | 0.073655 |
| 29 | 100 | 0.85448 | 0.22713 | 0.24889 |
| 30 | 579 | 0.21735 | 0.11564 | 0.18439 |
| 31 | 1994 | 0.061756 | 0.09509 | 0.068866 |
| 32 | 1924 | 0.091952 | 0.11146 | 0.083513 |
| 33 | 2166 | 0.088252 | 0.10009 | 0.085247 |
| 34 | 519 | 0.13737 | 0.16646 | 0.1872 |
| 35 | 634 | 0.16379 | 0.093519 | 0.12164 |
| 36 | 2835 | 0.067371 | 0.080697 | 0.081958 |
| 37 | 3737 | 0.094318 | 0.086918 | 0.10408 |
| 38 | 2806 | 0.098988 | 0.13001 | 0.082836 |
| 39 | 417 | 0.17099 | 0.18814 | 0.12774 |
| 40 | 227 | 0.20834 | 0.14785 | 0.10324 |
| 41 | 1817 | 0.082715 | 0.1174 | 0.10219 |
| 42 | 2385 | 0.1096 | 0.12543 | 0.10965 |
| 43 | 1589 | 0.12167 | 0.17861 | 0.099929 |
| 44 | 88 | 0.21088 | 0.2111 | 0.10221 |
| 45 | 28 | 0.19222 | 0.16491 | 0.16288 |
| 46 | 472 | 0.094714 | 0.15589 | 0.1232 |
| 47 | 1047 | 0.11775 | 0.17961 | 0.12234 |
| 48 | 307 | 0.12735 | 0.22443 | 0.11915 |
| 51 | 22 | 0.11972 | 0.18238 | 0.11037 |
| 52 | 80 | 0.12845 | 0.24552 | 0.1396 |
-------------------------------------------------
Saving refined experiments to corrected_refined.expt
As a reminder, before metrology correction we had these refined RMSDs from scan- static refinement:
RMSDs by experiment:
----------------------------------------------
| Exp | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
----------------------------------------------
| 0 | 53916 | 0.26341 | 0.21858 | 0.106 |
----------------------------------------------
After correction they are as follows:
RMSDs by experiment:
----------------------------------------------
| Exp | Nref | RMSD_X | RMSD_Y | RMSD_Z |
| | | (px) | (px) | (images) |
----------------------------------------------
| 0 | 53738 | 0.11368 | 0.12815 | 0.10179 |
----------------------------------------------
Let’s now do scan-varying refinement then integrate the dataset with corrected metrology:
dials.refine corrected_refined.expt indexed.refl outlier.algorithm=tukey use_all_reflections=true bin_size_fraction=0.0 scan_varying=true output.experiments=corrected_sv_refined.expt
dials.integrate corrected_sv_refined.expt indexed.refl outlier.algorithm=null output.reflections=corrected_integrated.refl
dials.export corrected_integrated.refl corrected_sv_refined.expt mtz.hklout=corrected_integrated.mtz
dials.analyse_output corrected_integrated.refl grid_size=5,12
From the integration log:
Summary of integration results binned by resolution
----------------------------------------------------------------------------------------------------------
d min | d max | # full | # part | # over | # ice | # sum | # prf | <Ibg> | <I/sigI> | <I/sigI> | <CC prf>
| | | | | | | | | (sum) | (prf) |
----------------------------------------------------------------------------------------------------------
1.17 | 1.19 | 340 | 3 | 0 | 0 | 343 | 278 | 0.04 | 0.28 | 0.41 | 0.06
1.19 | 1.21 | 1125 | 6 | 0 | 0 | 1131 | 1011 | 0.05 | 0.37 | 0.42 | 0.06
1.21 | 1.23 | 2346 | 13 | 0 | 0 | 2359 | 2176 | 0.05 | 0.47 | 0.49 | 0.07
1.23 | 1.26 | 3776 | 24 | 0 | 0 | 3800 | 3565 | 0.05 | 0.50 | 0.61 | 0.10
1.26 | 1.29 | 5448 | 37 | 0 | 0 | 5485 | 5123 | 0.05 | 0.58 | 0.71 | 0.12
1.29 | 1.32 | 7241 | 52 | 0 | 0 | 7293 | 6804 | 0.06 | 0.66 | 0.79 | 0.15
1.32 | 1.35 | 9522 | 71 | 0 | 0 | 9593 | 8986 | 0.06 | 0.77 | 0.94 | 0.19
1.35 | 1.38 | 12528 | 84 | 0 | 0 | 12612 | 11851 | 0.07 | 0.92 | 1.11 | 0.22
1.38 | 1.43 | 16954 | 113 | 0 | 0 | 17067 | 16130 | 0.08 | 1.01 | 1.22 | 0.24
1.43 | 1.47 | 20247 | 154 | 0 | 0 | 20401 | 19499 | 0.08 | 1.22 | 1.45 | 0.29
1.47 | 1.52 | 23553 | 267 | 0 | 0 | 23820 | 22740 | 0.09 | 1.50 | 1.74 | 0.33
1.52 | 1.58 | 24022 | 267 | 0 | 0 | 24289 | 23215 | 0.10 | 1.78 | 2.06 | 0.38
1.58 | 1.66 | 25479 | 286 | 0 | 0 | 25765 | 24860 | 0.11 | 2.19 | 2.49 | 0.44
1.66 | 1.74 | 24305 | 241 | 0 | 0 | 24546 | 23395 | 0.12 | 2.74 | 3.05 | 0.51
1.74 | 1.85 | 24742 | 236 | 0 | 0 | 24978 | 23965 | 0.15 | 3.54 | 3.87 | 0.58
1.85 | 2.00 | 25657 | 281 | 0 | 0 | 25938 | 24999 | 0.19 | 4.90 | 5.24 | 0.65
2.00 | 2.20 | 24755 | 268 | 0 | 0 | 25023 | 24005 | 0.26 | 6.61 | 6.97 | 0.72
2.20 | 2.52 | 25596 | 250 | 0 | 0 | 25846 | 25058 | 0.29 | 8.88 | 9.20 | 0.76
2.52 | 3.17 | 25140 | 298 | 0 | 0 | 25438 | 24540 | 0.37 | 12.81 | 13.04 | 0.78
3.17 | 151.25 | 25720 | 303 | 0 | 0 | 26023 | 25193 | 0.44 | 25.52 | 25.39 | 0.79
----------------------------------------------------------------------------------------------------------
Summary of integration results for the whole dataset
----------------------------------------------
Number fully recorded | 338446
Number partially recorded | 4836
Number with overloaded pixels | 0
Number in powder rings | 0
Number processed with summation | 331750
Number processed with profile fitting | 317393
<Ibg> | 0.18
<I/sigI> (summation) | 5.65
<I/sigI> (profile fitting) | 5.94
<CC prf> | 0.47
----------------------------------------------
We now have a nicer plot of correlations between profiles and the strong reflections(notwithstanding a few plotting artefacts):
By comparison with the previous results we can see that correcting the panel shifts and mis-orientations has improved the overall profile fitting mean \(\frac{I}{\sigma_I}\) and correlation coefficients. However, comparing the tables of results binned by resolution we see that the improvements are limited to the low resolution, and the results are worse at high resolution. For example, we can make a quick plot of the profile fitting correlation coefficients.
From this we see the crossover point at about \(\frac{1}{d_\textrm{mid}^2} = 0.55\) or a resolution of about 1.35 Angstroms.
So, finally, we conclude that although we have the means to do metrology analysis and corrections of modular detectors, we have learned that it is critical to use data that gives coverage right out to the corners of the detector so that we can apply the corrected metrology to other datasets effectively. With dials.refine this could be achieved by joint refinement of data from multiple crystals, but it will take a significant time to run and use a lot of memory. It is best to do this right, and exactly once!
What to do next¶
Panel coverage was rather low in the corners. We could try combining more metrology datasets together to improve coverage and make an effort at factoring out crystal-dependent effects.
Once we are satisfied with the corrected detector model we can write the changes directly back into the dxtbx Format object, so that they are available immediately for any dataset, without having to perform the ‘copy-and-paste’ operation presented here.
Acknowledgements¶
Dave Hall (Diamond Light Source) for collecting the data.


@* * Copyright 2021 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import config.AppConfig @import models.request.AuthenticatedRequest @import controllers.routes.ReassignCaseController @import models.{Case, Queue} @import views.html.forms.select_queue_form @import views.html.includes.main @import views.html.partials.{case_heading, error_summary, back_link} @import models.viewmodels.NoTabSelected @import play.twirl.api.HtmlFormat @(c: Case, form: Form[String], queues: Seq[Queue], actualQueue: Option[Queue], originUrl: String)(implicit request: AuthenticatedRequest[_], messages: Messages, appConfig: AppConfig) @main(bodyClasses = None, customTitle = Some(messages("page.title.move.case")), customPrimaryNavTab = NoTabSelected) {
@Html(messages("case.change_status.move_back_to_team.description", HtmlFormat.escape(actualQueue.map(_.name).getOrElse(""))))
@select_queue_form( form("queue"), queues, legend = messages(c.application.goodsName), legendClass= Some("visually-hidden"), "reassign-case", ReassignCaseController.reassignCase(c.reference, originUrl), originUrl )


Hello, Staranger!
Welcome to Runners Home
TM
Runners Home
TM
is dedicated to providing you with:
the most up-to-date informationon ranning races
thebest resources for runners


Online Organizer
IT18121766
Kariyapperuma.K.A.D.R.L
Y3S1.09.2 (SE)
Remaining for Last Event:
{{rDays}}
days
{{rHours}}
hours
{{rMinutes}}
minutes
{{rSeconds}}
seconds
Add Event
Add Event
Update Event
Items List
Edit
Delete Event


Discover
Favorite
Album
Artist
Genre
Playlist
New Realese
Trending
Popular
Its Amazing
Rahmania Astrini
0:00
3:28


Next: PMM, Previous: Server statistics, Up: Network [Contents][Index]
The most important piece of information about a server is whether it
supports persistent connections. If this is the case, Polipo will
open at most serverSlots
connections to that server
(serverSlots1
if the server only implements HTTP/1.0), and
attempt to pipeline; if not, Polipo will hit the server harder,
opening up to serverMaxSlots
connections.
Another use of server information is to decide whether to pipeline
additional requests on a connection that already has in-flight
requests. This is controlled by the variable
pipelineAdditionalRequests
; if it is false
, no
additional requests will be pipelined. If it is true
,
additional requests will be pipelined whenever possible. If it is
maybe
(the default), additional requests will only be pipelined
following small requests, where a small request one whose
download is estimated to take no more than smallRequestTime
(default 5s).
Sometimes, a request has been pipelined after a request that prompts a
very large reply from the server; when that happens, the pipeline
needs be broken in order to reduce latency. A reply is large
and will cause a pipeline to be broken if either its size is at least
replyUnpipelineSize
(default one megabyte) or else the server’s
transfer rate is known and the body is expected to take at least
replyUnpipelineTime
to download (default 15s).
The variable maxPipelineTrain
defines the maximum number of
requests that will be pipelined in a single write (default 10).
Setting this variable to a very low value might (or might not) fix
interaction with some unreliable servers that the normal heuristics
are unable to detect.
The variable maxSideBuffering
specifies how much data will be
buffered in a PUT or POST request; it defaults to 1500 bytes. Setting
this variable to 0 may cause some media players that abuse the HTTP
protocol to work.
Next: PMM, Previous: Server statistics, Up: Network [Contents][Index]


Brand Logo
4:02 PM
Carrier
My Missions
Past Missions
Mission # 1
Start/End Goal Weight
Result
Achievements
Before/After Pics
Before/After Pics
Start: 200 lbs. Goal: 150: lbs.
Mission # 2
Start/End Goal Weight
Result
Achievements
Before/After Pics
Mission # 3
Start/End Goal Weight
Result
Achievements
Before/After Pics
End Mission


|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object dxf2svg.svg.SvgElement
SvgElement is the abstract base class for all Svg Objects. This includes collections of SvgObjects, visible objects like graphic elements and invisible objects such as references.
| Field Summary | |
protected static boolean |
DEBUG
|
protected DxfConverter |
DxfConverterRef
|
protected java.lang.String |
Layer
|
protected static int |
MAKE_CSS
|
protected java.lang.String |
myClass
|
protected boolean |
objectIsVisible
|
protected java.lang.String |
originalLayer
|
protected StyleSheetGenerator |
SSG
|
protected boolean |
suppressElement
|
protected java.lang.String |
SvgObjID
|
protected SvgUtil |
svgUtility
|
protected java.util.Vector |
vAttribs
|
protected static boolean |
VERBOSE
|
| Constructor Summary | |
SvgElement()
Default constructor. |
| Method Summary | |
abstract void |
addAnimation(SvgAnimator sa)
Allows an animation to be added to an object. |
void |
addAttribute(Attribute attrib)
This method allows you to apply attributes to this object. |
protected java.lang.Object |
clone()
|
java.lang.String |
getAbsoluteClass()
Returns the class name of an object without the 'st' prefix. |
protected java.lang.StringBuffer |
getAdditionalAttributes()
Returns additional attributes if any attributes specified. |
protected java.lang.StringBuffer |
getAttributes()
This method allows the inclusion of additional attributes that may be defined by the user and are outside the scope of the conversion process. |
java.lang.String |
getClassAttribute()
Allows the setting of an SvgObjects class. |
boolean |
getIncludeClassAttribute()
Returns the switch setting that will allow or stop an SvgObject from including its class attribute. |
java.lang.String |
getLayer()
Returns the name of the layer that this object came from in the DXF or whatever Layer instance variable is set to. |
protected java.lang.String |
getObjID()
This method will format the ID attribute if the object name has been set. |
java.lang.String |
getObjIDUU()
This method will return the unformatted name of this object. |
java.lang.String |
getOriginalLayer()
Returns the name of the original layer that this object came from. |
java.lang.String |
getType()
This method returns the type of SvgElement that this object could be. |
boolean |
isSuppressed()
Returns the current setting for outputting of this object. |
boolean |
isVisible()
Returns the current setting for outputting of this object. |
void |
setClass()
Sets the class value for an SvgObject. |
void |
setClass(java.lang.String ClassStr)
Allows the setting of an SvgObjects class. |
void |
setIncludeClassAttribute(boolean yesno)
Setting this switch controls the inclusion of a class attribute. |
void |
setLayer(java.lang.String laName)
Sets the object's layer name. |
void |
setObjectVisible(boolean tf)
Sets the objects visibility. |
void |
setObjID(java.lang.String name)
Sets the object's ID attribute with, in most cases, the Dxf object's handle, but may also be set to the name of a pattern or the 'wire_run' if this SvgElement is a group that represents a wire run. |
void |
setSuppressElement(boolean tf)
Allows the suppressing of elements during optimization of Svg file. |
void |
setType(java.lang.String type)
Sets the object's type. |
| Methods inherited from class java.lang.Object |
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
protected java.lang.String SvgObjID
protected java.lang.String Layer
protected java.lang.String myClass
protected static boolean VERBOSE
protected static boolean DEBUG
protected static int MAKE_CSS
protected StyleSheetGenerator SSG
protected SvgUtil svgUtility
protected DxfConverter DxfConverterRef
protected boolean suppressElement
protected boolean objectIsVisible
protected java.util.Vector vAttribs
protected java.lang.String originalLayer
| Constructor Detail |
public SvgElement()
| Method Detail |
public java.lang.String getType()
public void setType(java.lang.String type)
SvgPolyLine.calculateMyUniqueData()
public void addAttribute(Attribute attrib)
Attribute.equals(java.lang.Object)
any other arg for this element and if it does it removes the old attribute
and adds the new argument.
attrib
- Attribute to be added to this element.protected java.lang.StringBuffer getAdditionalAttributes()
protected java.lang.StringBuffer getAttributes()
SvgEntityDeclaration
is one
such class.
protected java.lang.String getObjID()
null
the
object's ID is omitted and the object is said to be anonymous.
Groups are made up of anonymous objects that should have IDs.
public java.lang.String getObjIDUU()
public void setObjID(java.lang.String name)
SvgHatchPattern
,
AnimationEngine.applyAnimation(dxf2svg.svg.SvgLayerGroup, dxf2svg.DxfConverter)
public void setLayer(java.lang.String laName)
This method will also check to see if it is necessary to change a layer for a piece of text or lines of a note triangle. This will occur if the '-notes' switch is selected. This is called layer normalization. Objects that are subclasses of the object and are on layer 'NOTESENG' will get converted to 'ENGLISH' layer so there is less JavaScript required to coordinate language switching in the SVG and to maintain consistency in the output. This all came into being to accommodate being able to find notes in a DXF. It was determined that finding such content was not possible (reliably) if the text was distinguished from other text by being on a different layer
laName
- A layer name as a raw String from the EntityProcessor.setClass()
public java.lang.String getLayer()
public java.lang.String getOriginalLayer()
public void setIncludeClassAttribute(boolean yesno)
yesno
- true
include class
class and false
don't.setClass()
public boolean getIncludeClassAttribute()
false
don't..
setClass()
public void setClass()
public void setClass(java.lang.String ClassStr)
ClassStr
- name of class
without the 'st' prefix.public java.lang.String getClassAttribute()
public java.lang.String getAbsoluteClass()
setClass()
,
getClassAttribute()
public void setSuppressElement(boolean tf)
public boolean isSuppressed()
setSuppressElement(boolean)
public void setObjectVisible(boolean tf)
public boolean isVisible()
setSuppressElement(boolean)
public abstract void addAnimation(SvgAnimator sa)
SvgCollection.addAnimation(dxf2svg.animation.SvgAnimator)
,
SvgObject.addAnimation(dxf2svg.animation.SvgAnimator)
,
SvgReference.addAnimation(dxf2svg.animation.SvgAnimator)
protected java.lang.Object clone()
|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


{%block title%}
BASE
{%endblock%}
{%block body%}
ToolBox
About Us
Start Learning
Contact Us
Account
{%endblock%}


Department of Computer Application
Student Progressive report
Name
Enter your Marks
Software Engineering
Oracle
Computer Network-II
Internet Technology and Application
Artificial Intelligence
submit
Result
Name
Total Mark
Average Mark
Result
Grade


Yes, this is a paragraph about stuff. It's not really a paragraph yet because it's only two sentences. However, by the end of this rant, it will hopefully be a paragraph. Right about now, it is turning into a paragraph.


Located at the northern end of Samal Island, in the Davao Gulf. This Gulf is situated on the south coast of Mindanao Island. It has several islands, in addition, there are over 30 rivers and creeks which empty into the Gulf.
It is the only area in the Philippines that is typhoon-free.
Although other parts of Mindanao suffer from political unrest, Davao City and Samal are safe places to stop (apart from the usual petty crime).
The yacht quarantine anchorage is located 50-100m off the southern Sta. Anna wharf (approximately 07°04.53N, 125°37.74E). It is deep here and is a lee shore anchorage making it a little dangerous with a 0.5-1m SW swell in SW winds and rather uncomfortable.
It may be possible to anchor in shallower water closer to the southernmost jetty, but clear of busy ferry access lanes. Quarantine and Customs will come to the boat. Immigration will also visit (they may need to be informed of your arrival).
Since the opening of Holiday Ocean View Marina, it is permitted to come in the marina first and clear entrance formalities yourself in Davao City. Coming up along the East side of Samal will give you more room to sail and less current and boat traffic.
Last updated November 2013.
The only marina on Mindanao island is on the northern tip of Samal Island at the Holiday Ocean View Resort. This is a secure place to leave a boat long-term.
Last updated November 2013.


To see this component in action, resize your browser window or look at this page on a small device.
ImageQuery will swap the image with a lower (or higher) resolution image as you resize.
{% capture example_code %}Code
{% highlight html %} {{ example_code }} {% endhighlight %}


We provide unmatched quality, comfort, and style for property owners across the country. Our experts combine form and function in bringing your vision to life. Create a room in your own style with our collection and make your property a reflection of you and what you love.
S   H   O   P     N   O   W


Gagan Devagiri
Co - Director
2nd year Artificial Intelligence
Caitlin McDougall
Co - Director
2nd year Informatics
Martin Starkov
Lead Web Developer
1st year Mechanical Engineering
Irina Gubaciova
Web Developer
1st year Computer Science
Wassim Jabrane
Director of Logistics
2nd year Computer Science
Annabel Jakob
Financial Director
2nd year C.S. & Mathematics
Ioana Buzduga
Marketing Executive
2nd year Artificial Intelligence
Roman Akash
Head of Sponsorship
2nd year Computer Science
Mattias Formo
Sponsorship Executive
1st year C.S & Physics
Abdul Rehman
Sponsorship Partner
1nd year Informatics
Alexandra Purcarea
Sponsorship Partner
1st year Computer Science


smooth-gtk-thread.c
Download smooth-gtk-thread.c raw
/*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 1998 - 2017, Daniel Stenberg<EMAIL_ADDRESS>et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.haxx.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is * furnished to do so, under the terms of the COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ***************************************************************************/ /* <DESC> * A multi threaded application that uses a progress bar to show * status. It uses Gtk+ to make a smooth pulse. * </DESC> */ /* * Written by Jud Bishop after studying the other examples provided with * libcurl. * * To compile (on a single line): * gcc -ggdb `pkg-config --cflags --libs gtk+-2.0` -lcurl -lssl -lcrypto * -lgthread-2.0 -dl smooth-gtk-thread.c -o smooth-gtk-thread */ #include <stdio.h> #include <gtk/gtk.h> #include <glib.h> #include <unistd.h> #include <pthread.h> #include <curl/curl.h> #define NUMT 4 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; int j = 0; gint num_urls = 9; /* Just make sure this is less than urls[]*/ const char * const urls[]= { "90022", "90023", "90024", "90025", "90026", "90027", "90028", "90029", "90030" }; size_t write_file(void *ptr, size_t size, size_t nmemb, FILE *stream) { /* printf("write_file\n"); */ return fwrite(ptr, size, nmemb, stream); } /* http://xoap.weather.com/weather/local/46214?cc=*&dayf=5&unit=i */ void *pull_one_url(void *NaN) { CURL *curl; CURLcode res; gchar *http; FILE *outfile; /* Stop threads from entering unless j is incremented */ pthread_mutex_lock(&lock); while(j < num_urls) { printf("j = %d\n", j); http = g_strdup_printf("xoap.weather.com/weather/local/%s?cc=*&dayf=5&unit=i\n", urls[j]); printf("http %s", http); curl = curl_easy_init(); if(curl) { outfile = fopen(urls[j], "wb"); /* Set the URL and transfer type */ curl_easy_setopt(curl, CURLOPT_URL, http); /* Write to the file */ curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file); j++; /* critical line */ pthread_mutex_unlock(&lock); res = curl_easy_perform(curl); fclose(outfile); printf("fclose\n"); curl_easy_cleanup(curl); } g_free(http); /* Adds more latency, testing the mutex.*/ sleep(1); } /* end while */ return NULL; } gboolean pulse_bar(gpointer data) { gdk_threads_enter(); gtk_progress_bar_pulse(GTK_PROGRESS_BAR (data)); gdk_threads_leave(); /* Return true so the function will be called again; * returning false removes this timeout function. */ return TRUE; } void *create_thread(void *progress_bar) { pthread_t tid[NUMT]; int i; int error; /* Make sure I don't create more threads than urls. */ for(i = 0; i < NUMT && i < num_urls ; i++) { error = pthread_create(&tid[i], NULL, /* default attributes please */ pull_one_url, NULL); if(0 != error) fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error); else fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]); } /* Wait for all threads to terminate. */ for(i = 0; i < NUMT && i < num_urls; i++) { error = pthread_join(tid[i], NULL); fprintf(stderr, "Thread %d terminated\n", i); } /* This stops the pulsing if you have it turned on in the progress bar section */ g_source_remove(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(progress_bar), "pulse_id"))); /* This destroys the progress bar */ gtk_widget_destroy(progress_bar); /* [Un]Comment this out to kill the program rather than pushing close. */ /* gtk_main_quit(); */ return NULL; } static gboolean cb_delete(GtkWidget *window, gpointer data) { gtk_main_quit(); return FALSE; } int main(int argc, char **argv) { GtkWidget *top_window, *outside_frame, *inside_frame, *progress_bar; /* Must initialize libcurl before any threads are started */ curl_global_init(CURL_GLOBAL_ALL); /* Init thread */ g_thread_init(NULL); gdk_threads_init(); gdk_threads_enter(); gtk_init(&argc, &argv); /* Base window */ top_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* Frame */ outside_frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(outside_frame), GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(top_window), outside_frame); /* Frame */ inside_frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(inside_frame), GTK_SHADOW_IN); gtk_container_set_border_width(GTK_CONTAINER(inside_frame), 5); gtk_container_add(GTK_CONTAINER(outside_frame), inside_frame); /* Progress bar */ progress_bar = gtk_progress_bar_new(); gtk_progress_bar_pulse(GTK_PROGRESS_BAR (progress_bar)); /* Make uniform pulsing */ gint pulse_ref = g_timeout_add(300, pulse_bar, progress_bar); g_object_set_data(G_OBJECT(progress_bar), "pulse_id", GINT_TO_POINTER(pulse_ref)); gtk_container_add(GTK_CONTAINER(inside_frame), progress_bar); gtk_widget_show_all(top_window); printf("gtk_widget_show_all\n"); g_signal_connect(G_OBJECT (top_window), "delete-event", G_CALLBACK(cb_delete), NULL); if(!g_thread_create(&create_thread, progress_bar, FALSE, NULL) != 0) g_warning("can't create the thread"); gtk_main(); gdk_threads_leave(); printf("gdk_threads_leave\n"); return 0; }


|
BitMagic-C++
|
Deserializer for bit-vector. More...
#include <bmserial.h>
Public Types | |
| typedef BV | bvector_type |
| typedef deseriaizer_base< DEC >::decoder_type | decoder_type |
Public Member Functions | |
| deserializer () | |
| unsigned | deserialize (bvector_type &bv, const unsigned char *buf, bm::word_t *temp_block) |
Protected Types | |
| typedef BV::blocks_manager_type | blocks_manager_type |
| typedef BV::allocator_type | allocator_type |
| Protected Types inherited from bm::deseriaizer_base< DEC > | |
| typedef DEC | decoder_type |
Protected Member Functions | |
| void | deserialize_gap (unsigned char btype, decoder_type &dec, bvector_type &bv, blocks_manager_type &bman, unsigned i, bm::word_t *blk) |
| Protected Member Functions inherited from bm::deseriaizer_base< DEC > | |
| deseriaizer_base () | |
| void | read_gap_block (decoder_type &decoder, unsigned block_type, bm::gap_word_t *dst_block, bm::gap_word_t &gap_head) |
| Read GAP block from the stream. More... | |
| unsigned | read_id_list (decoder_type &decoder, unsigned block_type, bm::gap_word_t *dst_arr) |
| Read list of bit ids. More... | |
Protected Attributes | |
| bm::gap_word_t | gap_temp_block_ [bm::gap_equiv_len *4] |
| bm::word_t * | temp_block_ |
| Protected Attributes inherited from bm::deseriaizer_base< DEC > | |
| bm::gap_word_t | id_array_ [bm::gap_equiv_len *2] |
Deserializer for bit-vector.
Definition at line 309 of file bmserial.h.
|
protected |
Definition at line 322 of file bmserial.h.
|
protected |
Definition at line 321 of file bmserial.h.
| typedef BV bm::deserializer< BV, DEC >::bvector_type |
Definition at line 312 of file bmserial.h.
| typedef deseriaizer_base<DEC>::decoder_type bm::deserializer< BV, DEC >::decoder_type |
Definition at line 313 of file bmserial.h.
|
inline |
Definition at line 315 of file bmserial.h.
| unsigned bm::deserializer< BV, DEC >::deserialize | ( | bvector_type & | bv, |
| const unsigned char * | buf, | ||
| bm::word_t * | temp_block | ||
| ) |
Definition at line 1526 of file bmserial.h.
Referenced by bm::deserialize().
|
protected |
Definition at line 1416 of file bmserial.h.
|
protected |
Definition at line 330 of file bmserial.h.
|
protected |
Definition at line 331 of file bmserial.h.


Currently v{{ site.current_version }}
Just SCSS code compiled to CSS, define the interaction with you favorite JS framework
Watch an exampleHTML tags in which it is not necessary to include extra structure to be used, and which in turn make their style inherited when they are used within component.
HTML structures of two or more elements, these components can be simple (two elements), or as complex as necessary.