From 7eff2fa837d6d112775ade60d1fe56405237ea2b Mon Sep 17 00:00:00 2001
From: Valerio Mariani <valerio.mariani@desy.de>
Date: Fri, 13 Apr 2018 17:42:24 +0200
Subject: [PATCH] Fixed some minor syntax problems. Improved documentation and
 updated HTML documentation included with the code

---
 crystfel_utils.py                             |  76 ++++++-----
 .../cfelpyutils.crystfel_utils.doctree        | Bin 8389 -> 9557 bytes
 doc/build/doctrees/cfelpyutils.doctree        | Bin 5562 -> 5731 bytes
 .../cfelpyutils.geometry_utils.doctree        | Bin 31035 -> 35033 bytes
 .../cfelpyutils.parameter_utils.doctree       | Bin 13314 -> 14983 bytes
 doc/build/doctrees/environment.pickle         | Bin 9561 -> 10058 bytes
 doc/build/doctrees/index.doctree              | Bin 4856 -> 4923 bytes
 doc/build/doctrees/modules.doctree            | Bin 2552 -> 2597 bytes
 doc/build/html/.buildinfo                     |   2 +-
 doc/build/html/_static/basic.css              |  15 ++-
 doc/build/html/_static/doctools.js            |  56 +++++---
 doc/build/html/_static/searchtools.js         |   5 +-
 doc/build/html/_static/sphinxdoc.css          |   2 +-
 doc/build/html/_static/websupport.js          |   2 +-
 .../html/cfelpyutils.crystfel_utils.html      |  27 ++--
 .../html/cfelpyutils.geometry_utils.html      | 125 +++++++++++-------
 doc/build/html/cfelpyutils.html               |   9 +-
 .../html/cfelpyutils.parameter_utils.html     |  34 +++--
 doc/build/html/genindex.html                  |  45 ++++++-
 doc/build/html/index.html                     |  13 +-
 doc/build/html/modules.html                   |   9 +-
 doc/build/html/objects.inv                    | Bin 464 -> 504 bytes
 doc/build/html/py-modindex.html               |   9 +-
 doc/build/html/search.html                    |   9 +-
 doc/build/html/searchindex.js                 |   2 +-
 geometry_utils.py                             | 104 ++++++++-------
 parameter_utils.py                            |  25 ++--
 27 files changed, 345 insertions(+), 224 deletions(-)

diff --git a/crystfel_utils.py b/crystfel_utils.py
index 5825fc1..01aa3b6 100644
--- a/crystfel_utils.py
+++ b/crystfel_utils.py
@@ -16,8 +16,12 @@
 Utilities for interoperability with data formats used in the CrystFEL
 software package.
 
-This module currently contains a python reimplementation of the
-get_detector_geometry_2 function from CrystFEL.
+Exports:
+
+    Functions:
+
+        load_crystfel_geometry: a python reimplementation of the
+            get_detector_geometry_2 function from CrystFEL.
 """
 
 from __future__ import (absolute_import, division, print_function,
@@ -34,12 +38,12 @@ def _assplode_algebraic(value):
     # libcrystfel/src/detector.c.
     items = [
         item
-        for item in re.split(pattern='([+-])', string=value.strip())
+        for item in re.split('([+-])', string=value.strip())
         if item != ''
     ]
 
     if items and items[0] not in ('+', '-'):
-        items.insert(index=0, object='+')
+        items.insert(0, '+')
 
     return [
         ''.join((items[x], items[x + 1]))
@@ -315,23 +319,29 @@ def _parse_field_bad(key, value, bad):
     return
 
 
-def _check_point(name, panel, fs, ss, min_d, max_d, detector):
+def _check_point(name,
+                 panel,
+                 fs_,
+                 ss_,
+                 min_d,
+                 max_d,
+                 detector):
     # Reimplementation of check_point from
     # libcrystfel/src/detector.c.
-    xs = fs * panel['fsx'] + ss * panel['ssx']
-    ys = fs * panel['fsy'] + ss * panel['ssy']
-    rx = (xs + panel['cnx']) / panel['res']
-    ry = (ys + panel['cny']) / panel['res']
-    dist = math.sqrt(rx * rx + ry * ry)
+    xs_ = fs_ * panel['fsx'] + ss_ * panel['ssx']
+    ys_ = fs_ * panel['fsy'] + ss_ * panel['ssy']
+    rx_ = (xs_ + panel['cnx']) / panel['res']
+    ry_ = (ys_ + panel['cny']) / panel['res']
+    dist = math.sqrt(rx_ * rx_ + ry_ * ry_)
     if dist > max_d:
         detector['furthest_out_panel'] = name
-        detector['furthest_out_fs'] = fs
-        detector['furthest_out_ss'] = ss
+        detector['furthest_out_fs'] = fs_
+        detector['furthest_out_ss'] = ss_
         max_d = dist
     elif dist < min_d:
         detector['furthest_in_panel'] = name
-        detector['furthest_in_fs'] = fs
-        detector['furthest_in_ss'] = ss
+        detector['furthest_in_fs'] = fs_
+        detector['furthest_in_ss'] = ss_
         min_d = dist
 
     return min_d, max_d
@@ -346,8 +356,8 @@ def _find_min_max_d(detector):
         min_d, max_d = _check_point(
             name=name,
             panel=panel,
-            fs=0,
-            ss=0,
+            fs_=0,
+            ss_=0,
             min_d=min_d,
             max_d=max_d,
             detector=detector
@@ -356,8 +366,8 @@ def _find_min_max_d(detector):
         min_d, max_d = _check_point(
             name=name,
             panel=panel,
-            fs=panel['w'],
-            ss=0,
+            fs_=panel['w'],
+            ss_=0,
             min_d=min_d,
             max_d=max_d,
             detector=detector
@@ -366,8 +376,8 @@ def _find_min_max_d(detector):
         min_d, max_d = _check_point(
             name=name,
             panel=panel,
-            fs=0,
-            ss=panel['h'],
+            fs_=0,
+            ss_=panel['h'],
             min_d=min_d,
             max_d=max_d,
             detector=detector
@@ -376,8 +386,8 @@ def _find_min_max_d(detector):
         min_d, max_d = _check_point(
             name=name,
             panel=panel,
-            fs=panel['w'],
-            ss=panel['h'],
+            fs_=panel['w'],
+            ss_=panel['h'],
             min_d=min_d,
             max_d=max_d,
             detector=detector
@@ -406,7 +416,7 @@ def load_crystfel_geometry(filename):
 
     Returns:
 
-        dict: dictionary with the geometry information loaded from the
+        Dict: dictionary with the geometry information loaded from the
         file.
     """
     beam = {
@@ -471,13 +481,13 @@ def load_crystfel_geometry(filename):
         'ss', 'fs'
     ]
 
-    fhandle = open(file=filename, mode='r')
+    fhandle = open(filename, mode='r')
     fhlines = fhandle.readlines()
     for line in fhlines:
         if line.startswith(";"):
             continue
 
-        line_without_comments = line.strip().split(sep=';')[0]
+        line_without_comments = line.strip().split(';')[0]
         line_items = re.split(pattern='([ \t])', string=line_without_comments)
         line_items = [
             item
@@ -714,15 +724,19 @@ def load_crystfel_geometry(filename):
                 )
 
     for panel in detector['panels'].values():
-        d = panel['fsx'] * panel['ssy'] - panel['ssx'] * panel['fsy']
-        if d == 0.0:
+        d__ = panel['fsx'] * panel['ssy'] - panel['ssx'] * panel['fsy']
+        if d__ == 0.0:
             raise RuntimeError("Panel {} transformation is singluar.")
-        panel['xfs'] = panel['ssy'] / d
-        panel['yfs'] = panel['ssx'] / d
-        panel['xss'] = panel['fsy'] / d
-        panel['yss'] = panel['fsx'] / d
+        panel['xfs'] = panel['ssy'] / d__
+        panel['yfs'] = panel['ssx'] / d__
+        panel['xss'] = panel['fsy'] / d__
+        panel['yss'] = panel['fsx'] / d__
 
     _find_min_max_d(detector)
     fhandle.close()
 
+    # The code of this function is synced with the code of the function
+    # 'get_detector_geometry_2' in CrystFEL at commit
+    # 41a8fa9819010fe8ddeb66676fee717f5226c7b8
+
     return detector
diff --git a/doc/build/doctrees/cfelpyutils.crystfel_utils.doctree b/doc/build/doctrees/cfelpyutils.crystfel_utils.doctree
index 880d0b728247eb60ad19b2503cd50f4080d81639..c36f7678188dd6542d29b17f97c286c50685b212 100644
GIT binary patch
literal 9557
zcmeHN+ix6K8TV~{S;tPA))m5W8K9RniFcEzB(5J?s?rG6k*PvTL28-K?ws|R@$AfW
z=8WwH0jUsDf(}Ae2L$2)@d8K)@joE(7$GFo2gFk!khlr)goK3P_nkAh-Pm5cDODe^
zwBDU_zH`oZKi_3;O?~%;$Hvs3T(pBuA{;Mn`hm^jRL;^skNF~fD_wmf{c75fbCI<d
z2T9ansT>1DhdZ7fF+Y7Z<zsRtW*y-KegV&Ge45X^nl><56OQm$WlDa$(`8=RS7*M`
z>_q)oVBi%~4H&(^P5@8Kv3lwz+b2BaM=OhpHG@mOnJQ#??RY21>CgfRBIRfJIG>c$
z8G&1J%5!{{ZY6C?)-53-r=18eh8QvF*fEHfGab*0V+`VV&9{2`*Q}j{<wM)*>_n_f
zFo~QI);3M0e338nc{-7wlV5D{pvPLfJu7l7-)X%ZL_4h;tQQDod@ksUJz&_XP~L)Q
zS{l#l@DM|qQ4Fe9HYbv{JROJJ@%NjSZD-=GIlj&ID+1B7;*WqnZh-3_!{<?a9>=Fa
zw1P>IqbO{EOOC${`3&%Q=zOE0g}4f_>0fIV8is&VKD{MUE8(BuYZcBoC*@48M_MPE
zVSfX>ih;PlZ3JE8C<InE$CEacZ4L@yZAVtfE8LMUzXaoO1Q=j+gUE1v!J;5!k=3T*
zzOm;BZrGNvXu4;K*hpe#1I`ef8PAb=Uwi&~J<h~wgis4>n>DqHFa7WKFYJLo2gW|D
zRc?!~kYXPyZIZ(?(9HLl|GDHLhfisr12dj|em@K%5pU$IDhEp1ZeZz)C!&pi7Pc`}
zIdM$Rx4odVW4@li@G7#;y;zA-{aWHHUsobk9V*dc*uQfOMk{2d0sI<BH*?Z6lN^($
zZPs;sXkXx)o&&SaU2^VXp|%eV!I+L<y$Yaoy}+`~!a%kee2$3v8-`_seZd3Yh?vt0
zJw{I7qO-_ipuP2NCQO?Nxc4A3^L6HBqnmNT=te=W(D7!yt|Ucne+pJIfW-Q{MIsme
zyWgOc$~VC1H%3Y2>-?OON*%yoQI4Tra=60ROh~12v`)yboU#+ID+&4@a7;%L1bbEl
z%>nq$QNZ8PRI?*JM8CqK-BCLV?D+a9pf3RkCUEqz1e9N$x8Ao4qIt09;)aDM<;@|R
zJ=QhKH{>%1@7h>38n`<2wRyy?g}e3A;dk1hC?9m!>MMa?kW&c%I`=4e12c;>W5y0b
z7?DI(7b%TH=;%5gqkv~Ma|svZDYXd&A`}Oej!Z5eK}c>RN5Yi$K%Vpu$GZ*W+<wp7
zh;bbwnwbqF7PDxVrE~%Q9=p7qg=ilXJ-Z<16#s^q_wd2|&-r%P^dQUrems`(Kl8s3
zfBshThyPWZ!3B9%p+_MUZWk5}-BxloR|t(+u2ThkRUw98mnw?~@OEqCV`E2omJDHc
z5^%uzKgWRO|GtN~ic`9472z>{<`HtO>rlvjM^0zii~R86Dvg9eB@YOEL095=N}~K9
z#Ms~A?B8lxl#JDO(+LoGR&ugD0BBSKri<5c(c@OngH9vAvJGNBg{}c+ZAV2gR@5(I
z(33AL<lvrHymeRUOJz034KY6mmbE#~m)*xR)T_bg7e0c)8wZC)VCyl$qIw|(_;Vd+
zHH{k#{?i{2f=(bPSIDJRcYK{nP$U*Hh*X7H1VVCb8qWp(E{lYbC1!c9QLI<ehOBp3
zKh7s3buto@iujFdNNA9^KnaaJ=~wYz9S2vlmjbmc$GKp{jOAhZ|5<emR+aX$q3vb;
zr1s)or4=iilZR-me3lClZnRo^dwWgz;y(Vhz9#lK(t%bU{I`0RpIF{n{#*q0O)h$#
zcFjnHQMO>Hjo@Z1uW9!)bUu}3mfnk_3WgwzUUsiz@1vZvoCZos<fIA<xJvg0!e-gM
zHew-pRm8tJ^AG|bXzucdH(^~J6u@-q;~?43a~%AR`{0FLT51Uhlg!}iPaNVFo*)w}
zoPi~9Ot0sN`jeNe^{(~Q`lY8XUb@(2>$c6>SFT*SdZo+Q)k{~qpS*neO6O{Oz3|dM
zx_=zsx%K@+uzcs%5AGY!LZ)t8OXoHEI?1Jw%V~a4PGhp(b(m)#oCB*eqnfX%Yo5Co
zONRre`ips}66e8Eb*P|4>F1Y6tC_p6X-??t99`d=P-&#X8S3r8?%#u7_43XGB%^_{
z)vB?!ro26&ou%UyFHF~f!dgY=s6(M1<(XI)_}i63DuGjGxn*cINZ?x|2$b_w$_!b@
z={lYCHd)}Cn%-}#m2e6ZMk5{EG@C-`A2Q!YCC=Q(E*1Q;6#9ZZlas)DA-7^Dt^mnN
z(3Oiw{T@8!7b8$7Tz{@{{n-dm<@xNOXE}Z<C&GTJ$Y%SY=X4wj@MeI&=!eJ{CWE${
zDtKW<u&LDjB{p||jDLzdKhY-^+!<dzm^n+bX1sIjE#t7+M+&vjHJM>0D0m@9LBga6
zo2orlBHN*=ulAeE?zgbwD9239y{$<l#UGKuyRilh6{sulHJCm(+<s+D&ggilFwo+;
zpjuhypVW3o7BzG0{3Ae1>vZo_PRo?BtmiykhDxRD&x0&D%Q8r#91QnE9;U(KbNhr{
z-0wC8t@phXG~i!E{|P+uvir|tFgMcxV(xpa0rOeJtc))6VFP0Yca$c4XkxUwW`24J
zpvTpOsZS$kQZC5->Af1WB=!6tDr+N9srnlCSJ?GXU*rCoW+^DkTupY~J<euz#F4pC
zKRy~RH)`V2i9~v&OL2WrQn}jsIh`yXz35T3Xecp0e2JXSJh<lS3>>v~*~qqa@t%5|
zC}^osmw`e#;|IDec87TM8)YF>YrF@)hCD_~YoJ?M#M*1B!MT=|2v}Z77yuq>j^*9Z
zqSQdxQ5knq+b}<`+kA(+zM`$k&(qp*x!6e}YI~YRyYo~&qT8NwHfBQLvPLWT0m=$h
zZy2tP>JN4*r$29b3A%wrX0W&==eC)T2n1b%6c1>Iu~=BW5D)YE7zA$q4j$14qb{<U
zL>`_NM9?v*O-i#ku0{zhF5R=;AP_!!F_p>9ak)T!W<Tkf`{a33j4V=vFElBj#?lyD
zF6$Adn;Ef5-8nOF*5br$LDs$9lBXg@Jtos*yUa^BCuE&lUh!Cy53qd)yh2+fiF2Tu
ztRYlSwsG7dI<!6oHrSV0J&eqW2o*&lD!nZi9Y0KjiA*Y>@CWfiBD!nqYpA5A^4#F0
z$)X5d7H;{r$0G2VP=(i#r-MWc?ov~`q;h3wW@rmHCDmTk`<6J=Ub=a0Z5`(iP7E!U
zXNZOvjN)LCr>dk2p5<>RXkLQjHe#R&ya6B|j94d#Z1jmJ$ip$zD&CUQC|GqtCOG2Q
zCd#W_XP-)5i&i26vmBBW4wP!aPI{qPC>|KA22``vw>;YLv>E|-{g}jG4uvsG?7&1d
z7f@#qtOYSMt1Fe3bcDI<#Ew?c)28jjR@);&GAw6ugW%`oDG(FG1XL{qn=WKvCf)0*
z=f4=T&;(67OD0?p;)YOH98J0{4NAu2EE~_NKS8wJve|A6kZ~)OOSFP^q!lK5cHlDF
zkElhnaP6^+Pl7FrQMWU642_h>oXd|9L4Y?n945L=I)<`&95E-XHcY@4Jl&j?D^RGO
zS=d&AzNw4gcjUtg8^=c_Ty-2#zz2_PDDpgB0D&6oM;P82WW>VSH@UOTJ$#_1Qy%3W
z@>GnM8H8@7##s5FdRCoP7*No$h=W^lrNfbab&$7ctAfDD{g_z1lZ1%0>9rK~>PTko
zcc3Fdhk~xs{Lhj@h?Djp+!@wuGaDA!$5EUiG`}O4ItbBrOoqtbGtq)TwV&SJxGg7{
zzYBCuBZ3!r)r4FLIsyV2PFv1u-vDETUg3Ihpy|TYcd*ie2XHp@M8HL&KZ_<Iy(A*f
z4vbR%riQUww|Jm(2E9rG@EID^zZ<R(i*<MKkKg5Y6FEn7bWN$ZPt@!dzl;3Bz{?sM
zZr*hXd`wPf!9n4dvzKs+MxFvJ>(@o`+KF)`>6Gqm+N$WW@uzXS(5n%5`P+$Hs49-a
zd;vL;G7(ZyJwnEv!)X>(M>HH>DS`U*+JRT-q5^$rXt02u8`yC!KUFO{JFq|ebR_6v
xSQ_3dn;Da{a6JXsBH9nISV$;_SJN979%f*8z8F^OfQ~SnUgjU@E>7Cb{{jr%)m8ui

delta 2455
zcmb_e-D@0G6wlp{SvG5%G#{HL+itc^VkeuXTdV;!Z9^5MHe@YQ@o8x{n@P`HcW1Xd
zJK8+R8c<ARpy<5?5iN>BDF{{;AN0Xeh{Xr>LFpeLCD=E86h!dcJG+|>8)o*whxz`U
z-|wD}Ip^L#_rsa+TcPXUrM?dL5;jFHjoFG>wyFh<+e;ZJm$c05rF>P-8+wL)ws)9)
zOVSZLRMZWPvu%=zA9$0ikj!yN;c*y`Njx5B=>SctFbfHY0f8V)+qq7*Y>>kY>kDo_
zX)WhrccvV-K!pV_f@`6X@$v=G%~YwpVimPi!Kzj@qgGr?70N~}uNx-&Njb!hD94X*
zh~WB$?Jn```$+8K%jm`VE>;LH!OUW)<+8O5$EMf02u~OkDZ9Ie>`L@nzbjT*j7op+
z&!^V>MBhL$vl-u7XM8V{8TM5yfBZc^o{b$Ico)U9kFC|=Q$MR4X!VgF=tDPk)>_tf
zGEMXCvcX$fIXP~JSM{pNF6>ztvPJH%AcNsJDHnHh&lk_YJ$$+4r!A^xx3ENJ775zl
zZ4C73ffH~a?|<up3x37?28AKp+E)p{1NQX5s~6!9FH>8oYO7XN=kP%IvW?cid*PeK
zE~TPUiVS|k1_nPl`3`Rt)4%xspKeKFlH}IV#@sOJ>G83mgNT6y?H8A68ST~KFXxZ>
zSlTgk(yV9&eN`{;4fKH?b%<296dxlhgShtMSsxZ*_JU*foF|mUM;7Ae5JFGlNy?pZ
z>{RyJ$Y@fP*7%c$QnRxuz7seFT~pcTBd^pQ$Rm~L>Rzp$lb}<Q%Ck4o2}fJR%vIc-
zlyt8HjU^<O_Tk0dB2+rWKHh&~{%r~H)@|l$U2w`=Euuc1WWA$*)vx>8V^2-c5Bza0
z|Afx};@^$2`O}RqbesO&M(Csd;Uha08Lfv_^g>OxbNVd4bH`C6Uw(Hd|3@ELJBo$8
zQZC`h;53I|S=rjvN>MN9HNI&_@Oy2oqH$WkBt8p#EnmH?)p%2|qb9d}G@U;_LGSwG
zTB#5rsdt+TN$XkZG>RC}CY&aV)5qPVI|~`^z?`codm7kEJEZL4fytvi0gPP4DC@?G
zc9n0602HOP*ep!D<=ImQmlS6K@86y}+a40aNc6{Gb1<Z_H3z)9TYFmrX|!$peeh30
zGL47hbA+TD$wP~TY&O;p?<aFnTpd;L1Qe)cM~!?*6Dc>vD5v6U7AQ8Iq<ECL7!9*u
rCdQv{jdvPG(9UFQk2T%I{fW~aD}ukhH-gi+dV(7U3TESp$qDiwy7Dlc

diff --git a/doc/build/doctrees/cfelpyutils.doctree b/doc/build/doctrees/cfelpyutils.doctree
index 7f6b5f2fa5295917dffb8d46eec3321f1dd5cf80..a2db9d86a967ee3cb935502715293c168b36f211 100644
GIT binary patch
delta 1247
zcmdm`{aA;!fn{oh*hJP7Vi}AX%sp(y`K3k4sZ;!VSaLG+fb_((3Gx}zJzn}5`MIh3
zWx0t(nTdIs`r-LS+4@1Lx%nlj3X|O#4VW@yCf70gS%M77koL=v@heSA%#f{}qLCpV
zJ0(LAh?Rj@6^PYir<7)BX7FW5WoSc`XJ`R+|7P?P!>)dEJkwWM%?zguX^=v1cA!Q(
zRMRIHGK=M+nQwz?zBf;4QYzd*JzT}5NxAtcr8%j^Qxaj$LlZ@EEGN(~ZiHjKStmCz
z%1stxu^`dIc?dHmSF*_C^6)wqA1%#{dZ49H4Lu?F!k?4Pno(wQ2y3Gk@xeb47^#E|
zWtQ<~oNUh_Iyr{zh%re<XDkFp6f;<F9QzJKlJ#!3<#1;t!%B9rm4`UzkfE0gtalFA
zF4CPlxt9AV88-5PZEWD#=1Ot^c?-Z22O?QdF67m5gyys!en{$8NY2kINzE$(rE)y!
znGea7d%RL?5K|^D5cj~)#td;QI4d%tW<%6W4lheGw1D}2b1a`KGo#k#W<hU8iH;uO
zVqi&9QdkNsKZ@gX@{<!m8PRX^d7%JCM)}DKB4)O*vLK6%k%0l8MPZ)kVa+TC`fy4I
Y(CDlxpbA)U01Jr;88VwEi>NaK0P>Qc8vp<R

delta 1107
zcma)5Jxjw-6!kStqcucP>(Ej^kdmerA|fLA0XnD<DgJ?ijSbuun~F7}gH$(_fQI+n
zEaK**LpFbb4&o{}`UAwl-DhiR8>(iw%j2HIIq#nHn!Foj5B%r1A&b4YUf05Apj0%r
z)-__z$xtk4@=hVMmCNWk8LMcFGyNMmT_c#Flx(OOi0qR%MAHNY=?v2up%Y6J14IxY
z45NU6fjCHzz!6`nzx6&Y`#z!~EYubijsoYJ*|Ej+mtFib&HM^)s9If+87vuUp_nx`
zv=YfU@?5VCVml~V=Z{#0HB<;nhvds23jyHL1YaW_kNc;x&C*&M*BiJ5$~AAYIX$cG
z(ywb~tt)mk*1ixw`&R};C{tPAROYh#ASrelCGZJ*IPsq%3*x`Qt-y=u0S;I6f)(z`
z>#kjCUqX^cVuiz(TnHzF7oHKpDx$md&NG6qB6|26uNLq-|2XZ{LAP_LpAce3NX~!v
z!tAPLacI4$Z)^JYS0?{RA5DxCWxOeb*(wV@6~c=y5YrGd-(Onmy#|SP(|!|T43g|n
zkAl##z1zErP!vD(P0l(6%?D6hTfH}qRvO|GHA0RkM}CiPIId}P&mdvXghccSdSZNO

diff --git a/doc/build/doctrees/cfelpyutils.geometry_utils.doctree b/doc/build/doctrees/cfelpyutils.geometry_utils.doctree
index e9213098cd7c7f54b473dc591f864b15ba5d856d..aa0d5da3c664c8236851b7035a463caa345a6be6 100644
GIT binary patch
literal 35033
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
E15}d4b^rhX

literal 31035
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

diff --git a/doc/build/doctrees/cfelpyutils.parameter_utils.doctree b/doc/build/doctrees/cfelpyutils.parameter_utils.doctree
index af2b18f621844b418c465883b7b1b2e34ffae71b..a4bbfa5261e1eb047718850e434d558e13e4758c 100644
GIT binary patch
literal 14983
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
Cwdz#>

literal 13314
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
B>oNcU

diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle
index 22427ebdc4b23a4c7524305b28ecde4af83d6a14..8b1cfd9f4f81d81939ada6ac269dfe0df75f8646 100644
GIT binary patch
literal 10058
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

literal 9561
zcmcIqZ;T{G72mzxo&9^ew|9srk_>nJna!~?fI{Fj>Ur!PxZHww2bg%9PEU8uR5v}{
zO;z{Ij=4+p11pzQ<N{4N4JL{)3Pi;(`VBwvjc+6*qF?-?Mq~7Yi4lqTtLpBV?wQ${
zS;5Qorn~CZd#~Pm_1>%Z<{Q&5Y~4Dc{)xlfr<S`@CT`PWp4%X95Q#%y3N6Rn$P7In
zt$j1P9F@d^=@|hd#I#r>?yXR-K`PCL&Me)vD(Agg(9#*H7&YSf?J%$$UcrJ&RpOIx
zaw(5Qfipv4D36PQdm%FjRvMmLv+9vJm@uAx7f!_!9Zu)HCSlAnLGN-TW;h8#KiU!t
zWG5glw>+0e+t^S?06Rfh4+9TOM&d{+6$}~@k6s7uEU53+8+t(VpswzF4)NSb%<GO`
z)p<ZzM8tAH8or|kgloQBvmJ>Atuq$s*o)eo#=~08+L80qWyS-{EHo4nO>s42xhC0(
z#H`Oen;1~kVn)y)YIuH|S#^q;mAmh}>)tzxr%rD?T)aT^23BDka@&!Zy0d%_z8P_d
z&PhaX6LXI4)<e0;EpdqK7*1#s$t(C*ViL=KyDn{mYdmN>QV+3&uoD_I94(-vfzkPR
zRB?MqP4GYuETgmUS*(`>*xIU`r?3+Zf+DUi*Dq)GqmV31vF&K!R8g0jT#1J;9mZqO
zA}xxQ%+fN}MB)>fk>UdhIEX9#WCT-a=x(Sxk(Bp5-ob1gMx)TuqxAmmh@Q|lC*|}i
z5L<4|llsU~mtgb+Jt~TixTNS<_yfB$nB_}yMXy#&R91%Jp0&6^97vpaAy-rvh#yw9
zzzQH)AX!wOFh=Sz&=$+;8z7FwDJ-fp)YUh=MI2U8sq$);qxK*cInkLx%Tn5r9#+M5
zi5*yOUBlrqEhUjF;&5)f;o}@fSHzU=%TqIl;}c+oJWC~*NTW*3*c8AK2>|#p!}0Vd
zHPX;6N7GG{5zfKEGh)dnv5K{jIgu#RAn^H#N~P6mmHjsM=$1WJub8A+0VJ<PVu{rZ
zWfbv>Po*mY&vSU$B0){9kUIkOvgP_=pb^*bOmGMz41?PGed}C$iDf8C$yM8_d8`3G
z4|ALx9#-?C3siRk%^^+VM4L0>dMQ55ayemAIzX;h9b#fPQ*e|Kof6CNbFLI2hf9;k
zYc+8h(&?35Pr4m(@QE1cd<@fZO>=T_Ep!b?c1nYs#R2(e4*F>Lpd39PiQ^Ybr3W^?
z^w^n84{e=(<kAx-&uu-lb>`B>xpR-4yL5iz@r`pEYn89vx&E2$i)+zlaW^^_LAf^t
z%xY*g&kI~HAV6Is43Z%l_jS0>D`KS%MZyItQaXIdGohH*y8O^vH$N>FYF_A?(#U!A
zEcAV2<|LJ27&xo&44U%qk@#eG)?jTO!273@c@LEXtrG-~fVET5*@kC^(rQKG=&p)6
z-Em?zV0JV(bMl>6|LFeVufL`|e*ODbUZr9D`p-Y#PFei=uYdfOw&K_KzCA~q$?IR9
z3dNF1d;%}(8WspCq;i9+<#Gl8HK^PQG!1qcU8P*kd_11XZ!4Y;GxPbq#Pdwf-w?0w
z5t;%B#hm3TS8GDb;vj>nbW_uvmfn_f7jqDgZt8&^GkQ6q98ZXc;c4M%UXDUhP^O&h
zMp?X4OlpKPv0v#J-#pV>X*8Vx5rZN&!${!p=yPKF0*pi2-;s<~i!h!iWpsEtQdt0f
zaqzS#NUwnmg1!(|5xfvUm{koC_>|k2vP|h##jN4z$~oYDMml~qI%kG{_oE7muwFS6
zirGM~s{lct537{ZBpIPE(rffPVEZL;bB5b;URlN1tTMbG%K%^OKwpgQFa@VC)7P;H
z`a@|XKLU{-<9P+oYj}PNuISGdH{mF5@}`lZ?@BVyO$y!5%^Txz!v=73G_&2_)7#I^
zEg9&GUGRQ>-WrFW)&PEPe}Xu0bfg$~#SF3Ac`=QuDoEd)(b(8aptX0$;j1}-ubivu
z>L)i0{C^q)e<&6l&#h+<CVc^h`#KHj8<f$vXp6o}o4_Te1L<XzC&KYttcH$55Q!|L
zf9a9!*!go}UQTEhlE=Q;l2}PX5Tb7qfL3KdftN>0gA|tOKJ8luqVt_F(Lejr;FI1F
z5B&js*<PBQm>4D%>F8uCi6rY8Q2@1&SrHB3AY21EPJFbl;Y8UBzyyS|BM?f^nHY3Z
zfzp4+_mfmqC3^zny<>&GF?+FZ2;OAjd{|9`QD>*QQSf+N5#HNDjI(L6cnqmXN-86O
z(g@@k0o<xUdj()mV;GJzzH;^JbuYKpb>V@Sg)3(=PHsn~t)XFl7m3WU*e>UXCK0>1
zCM_k=Fil-c_66+0eq8?fD*g}zM12PV99O6>e}I1oB)UqlfqlB}cva*#1!|cH?|3_y
zpz93GxgpY4hBR(-LM+5*({r76bVW+@w3JsN4UC`P-@P<@;Z-*`F)c3v(dH}+<rFXv
zI~|}--veB%NHR3yd;qwk3f}+&x5u^bm9r|-DkA;IT{z$wPun*If;%HNFqWksIToAw
zddB6;AetWea0HQz#k0|%v@59L0+oV~UC3}a;G^%4)S}8xdR)<mQPh6Y8u}}2<rgDF
zGgwu8Z%_QQ5ePGCd2KYPQp-=qfO`*;4EuaqzfT|A<a3ftldOEk*YWi9O-S;0Be)za
zNd*4AV%l#;Ak0Yeozb95l5dXzCnd=~N=fc3ouqF=l(PqhJHWxBWP6KpdIZ9ZC?`jQ
zDpCGtOi{LaMfu?}jj<Eku5tbz61{uGt_DlAwYNkoBM@dJdWQn-6@z^S0?g-Idj_&@
zj?v2I7<~yqCf;uz_{f93ZGdBO-#!DqD#5A{ZxgKFT!c0r94$N*;A6>+j5GF{!uMg~
z#^Hxh*E0w&>aJM~WbG;&;|I-R8+^nz#xW{!<QOC*Nw0(SdO})SPm<aDBZy=StuY!@
z9o<-5!^JASV6)F=`{PMz?0}NH7IshP-yq2Ek6?VTAe(!i&hL#tm=W4{6=>g1|EJU0
z%%0Aze6wK})$rbg-F_3q_3Wvg{y&}C6Z<^1$qg%WZl|HAUyc^5I=8V*hZ~s8H(wkF
zUsw&r3a(`uZX>8G#}_Ph{okCTd~=e9co?46<^kH=oD9)E0yL`D@%2U43gRKO!7@XK
zlB*s{n5w3j)D&=a>%B(N7AjcH?I>1PC=RI$mlk*^7pq2{tVXCsC}7gys=9$Cuks$2
zyh>%u*XGqw9F(^&U`YCVs9mn6m#y3=x`*fwxM@vOOd6^%IO|nqKTEQV`tw96rVMl)
zz=c?3C}nHB-Kcu#9i$Do7z-~;C{Z{c&vvRMFQdtawx1hVH4EL6t#1GAQCYg?7+FfY
zZzmaA8Zd2>peD)U=FpayMIlNRCAMUF5w7Evl(7T0lB@kbHs2XTwOC3l9s|$W8xE=*
zh1mL{-QlHj%I)i>CME!NR|Y|+JQ?SzWi(k#tyADk6IoP-#hh#?s9sJlp%f}9w9_yp
zbRtVA4^`GpJ4C6;w{}p>Z|FWpSAl7M`>7zVBT<yEvlNdH!{z%<JA(>E?EK<;hAfsP
zER>M725R#SoEe=ly{&QU>*$sBpvm4X%RT!^(R4S|w|r=Yg0fU<<t($kg?(J9(MO95
zZmLVdQLWEy7Uk^39Vx3h0-fWOp^|;=N)XxCt52SO-l#sq^m9#pvg9*N4vTCRcMUKZ
z<bfHVAaow<o+^__(@m@ty<$r?Vr3T`{-l6zHF1<_i@7>MV@o!g?Jt5Hz1C^9JD#D-
z-tVe*f$1(s9~SE$W!_F3^(FfxfYCo~Ck-YHi5a9Jz_W|4fxUrg`!xPMjqmEWWOqaM
z>r_K~(QmJJzUVdkl!TQF#M0TgQqhZOD}$&IcQ_;a0tR!d7tgESXYo<lyXbQ9Sa-3y
zub~Lk*}mFyvhm%>ei)$kS%nv0l0ZUb7qtuJs;1S?0D8oaMw8lF&cAQNpA|TIhEj&t
zWsIm;iVb279xi^%8gfLhZK3x}Io6l#8dwn7mO+n$$l$uUA6E}>j5<O3g~6_+v{o!x
zZqg^n*6Vw4twr_?N={&w&~OiC^M`T-vw7egvk#7NPkVEnM+&ZQO1Vzta6dZUId8QO
zT*V$-r&6!e@4WVb^;i$q&!$+rzHA@ZZcDKd%DP(0wtc!?pQJ$2wa=piY^uiv=JfQr
zet)<(t38OIo8w(xlcWXdQ1UwkgW@+Us<S8xRzv+{13z|%f6XKtp!gZnY4p-%9DmHU
zo_fGSvs>i|&qh^5cqcA1+gCsW_f|PLFS7zINluV@ked8~gzT0}ABp0#3o1-G%oPod
TV&5{J)R2UEXx=}IG@<-owLdI^

diff --git a/doc/build/doctrees/index.doctree b/doc/build/doctrees/index.doctree
index d56c9586fa0d068f0c18a4f623500e634cd03cca..f5d0ebcaece3d183b097316574c19a550ef50061 100644
GIT binary patch
delta 168
zcmeyNx?7F4fn}<J@J7~^OfoL|8Tq-X`enI^MVX0tnfl@RMcMj6sk!+jsS1<#F-@1!
z3{TBT1}ae~$yZ2DOU)^$EG@~*DSp&2b8;@T0#^oO26Kk0UxvEhBu<&hE16@^MEJOQ
tHtVt|Frf->&SaC}lIZ9WE(Y3LQdkPKtvEg>KRGccwRno(<~D&MCIGM$H);R?

delta 80
zcmdn3_CuAmfo1Ajp^dC7nFK8KGxBp&^~-V-i!u}QGW92)VwyhLkXdtb4>SMdh3qnu
g4>HGqX)A7?&HgM3Od!tYscbS_jGdcL3KTH`0EQ47D*ylh

diff --git a/doc/build/doctrees/modules.doctree b/doc/build/doctrees/modules.doctree
index 28d0cc033db2087350b9542db40f668f3063e9c5..80d31ec402191e61cafbd19f4dcc0483376048ab 100644
GIT binary patch
delta 363
zcmew%yi|m>fn}-`*F@GGVi}AX%sp(y`K3k4sZ;!VSaLG+fb_(@3Gx}zJ#P9L`MIh3
zWx0t(nTdIs`r-LS+4@1Lx%nlj3X{zlb(k__CTB7FiOJSZ(a4aGosyvl#L7Ud3dHJ@
z&oR!Z*UT`?kj~J`knv{8kjl_4O-jr_R^7v2lAl~sl$xqrUX)l+kXke)5n({=l+p~%
z3~iu3Zjdt}=J=H+rNWKq;Z9CV%_*oXEy>I&25N=cj}Z2Oh=bh&F^&^x95cc=Zzgmn
zA=?iRnG7wUQ#KniD={-_Z4P1cW|ZjY5iSOXOG#lVFf@webMliDb5e_^_-$UmuE)qI
Kzxh0eCL;i=oqf#!

delta 317
zcmZ1~@<W)lfo1Aj&WWr$CSFdE>R~I+FD*(=ozi2apOK%Ns$Z6ySd^KVm#IHFh*5{V
zhb1R7FLlb~21Y+I>Dnn88M3icGUS0+5r~z6SatFf#u@eM8HO1e8JZbd-YgkX8M>uO
zi5bYMd-zN8lS_(HQ+3OW5(^4ai>4$Z42YdlnxUSd4b;b-!I;4eF~_eoDHU!+4|j4}
zYED6AX-Q^IF;FYieuS_OL>%lMh;f`i<Cqb~c{8Cq3E6&l7-VPyowC`TS&5lZb8{A(
VHzQ-`=Cka2jEu6I|8QtB0s!;(Zu|fM

diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo
index ff6c4f2..84b02ee 100644
--- a/doc/build/html/.buildinfo
+++ b/doc/build/html/.buildinfo
@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: d40e958a7d3fc689b5ae78674cab31f2
+config: b3b7939111dbbf905db0123cb645320e
 tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/doc/build/html/_static/basic.css b/doc/build/html/_static/basic.css
index dc88b5a..6f40830 100644
--- a/doc/build/html/_static/basic.css
+++ b/doc/build/html/_static/basic.css
@@ -4,7 +4,7 @@
  *
  * Sphinx stylesheet -- basic theme.
  *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -398,6 +398,13 @@ table.field-list td, table.field-list th {
     margin: 0;
 }
 
+.field-name {
+    -moz-hyphens: manual;
+    -ms-hyphens: manual;
+    -webkit-hyphens: manual;
+    hyphens: manual;
+}
+
 /* -- other body styles ----------------------------------------------------- */
 
 ol.arabic {
@@ -438,10 +445,14 @@ dd {
     margin-left: 30px;
 }
 
-dt:target, .highlighted {
+dt:target, span.highlighted {
     background-color: #fbe54e;
 }
 
+rect.highlighted {
+    fill: #fbe54e;
+}
+
 dl.glossary dt {
     font-weight: bold;
     font-size: 1.1em;
diff --git a/doc/build/html/_static/doctools.js b/doc/build/html/_static/doctools.js
index 5654977..0c15c00 100644
--- a/doc/build/html/_static/doctools.js
+++ b/doc/build/html/_static/doctools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for all documentation.
  *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -45,7 +45,7 @@ jQuery.urlencode = encodeURIComponent;
  * it will always return arrays of strings for the value parts.
  */
 jQuery.getQueryParameters = function(s) {
-  if (typeof s == 'undefined')
+  if (typeof s === 'undefined')
     s = document.location.search;
   var parts = s.substr(s.indexOf('?') + 1).split('&');
   var result = {};
@@ -66,29 +66,53 @@ jQuery.getQueryParameters = function(s) {
  * span elements with the given class name.
  */
 jQuery.fn.highlightText = function(text, className) {
-  function highlight(node) {
-    if (node.nodeType == 3) {
+  function highlight(node, addItems) {
+    if (node.nodeType === 3) {
       var val = node.nodeValue;
       var pos = val.toLowerCase().indexOf(text);
       if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
-        var span = document.createElement("span");
-        span.className = className;
+        var span;
+        var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
+        if (isInSVG) {
+          span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+        } else {
+          span = document.createElement("span");
+          span.className = className;
+        }
         span.appendChild(document.createTextNode(val.substr(pos, text.length)));
         node.parentNode.insertBefore(span, node.parentNode.insertBefore(
           document.createTextNode(val.substr(pos + text.length)),
           node.nextSibling));
         node.nodeValue = val.substr(0, pos);
+        if (isInSVG) {
+          var bbox = span.getBBox();
+          var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
+       	  rect.x.baseVal.value = bbox.x;
+          rect.y.baseVal.value = bbox.y;
+          rect.width.baseVal.value = bbox.width;
+          rect.height.baseVal.value = bbox.height;
+          rect.setAttribute('class', className);
+          var parentOfText = node.parentNode.parentNode;
+          addItems.push({
+              "parent": node.parentNode,
+              "target": rect});
+        }
       }
     }
     else if (!jQuery(node).is("button, select, textarea")) {
       jQuery.each(node.childNodes, function() {
-        highlight(this);
+        highlight(this, addItems);
       });
     }
   }
-  return this.each(function() {
-    highlight(this);
+  var addItems = [];
+  var result = this.each(function() {
+    highlight(this, addItems);
   });
+  for (var i = 0; i < addItems.length; ++i) {
+    jQuery(addItems[i].parent).before(addItems[i].target);
+  }
+  return result;
 };
 
 /*
@@ -131,21 +155,21 @@ var Documentation = {
    * i18n support
    */
   TRANSLATIONS : {},
-  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
   LOCALE : 'unknown',
 
   // gettext and ngettext don't access this so that the functions
   // can safely bound to a different name (_ = Documentation.gettext)
   gettext : function(string) {
     var translated = Documentation.TRANSLATIONS[string];
-    if (typeof translated == 'undefined')
+    if (typeof translated === 'undefined')
       return string;
-    return (typeof translated == 'string') ? translated : translated[0];
+    return (typeof translated === 'string') ? translated : translated[0];
   },
 
   ngettext : function(singular, plural, n) {
     var translated = Documentation.TRANSLATIONS[singular];
-    if (typeof translated == 'undefined')
+    if (typeof translated === 'undefined')
       return (n == 1) ? singular : plural;
     return translated[Documentation.PLURALEXPR(n)];
   },
@@ -180,7 +204,7 @@ var Documentation = {
    * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
    */
   fixFirefoxAnchorBug : function() {
-    if (document.location.hash)
+    if (document.location.hash && $.browser.mozilla)
       window.setTimeout(function() {
         document.location.href += '';
       }, 10);
@@ -216,7 +240,7 @@ var Documentation = {
       var src = $(this).attr('src');
       var idnum = $(this).attr('id').substr(7);
       $('tr.cg-' + idnum).toggle();
-      if (src.substr(-9) == 'minus.png')
+      if (src.substr(-9) === 'minus.png')
         $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
       else
         $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
@@ -248,7 +272,7 @@ var Documentation = {
     var path = document.location.pathname;
     var parts = path.split(/\//);
     $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
-      if (this == '..')
+      if (this === '..')
         parts.pop();
     });
     var url = parts.join('/');
diff --git a/doc/build/html/_static/searchtools.js b/doc/build/html/_static/searchtools.js
index c821573..41b8336 100644
--- a/doc/build/html/_static/searchtools.js
+++ b/doc/build/html/_static/searchtools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for the full-text search.
  *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -540,6 +540,9 @@ var Search = {
           });
         } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
           var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX;
+          if (suffix === undefined) {
+            suffix = '.txt';
+          }
           $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix),
                   dataType: "text",
                   complete: function(jqxhr, textstatus) {
diff --git a/doc/build/html/_static/sphinxdoc.css b/doc/build/html/_static/sphinxdoc.css
index 8876773..3d94896 100644
--- a/doc/build/html/_static/sphinxdoc.css
+++ b/doc/build/html/_static/sphinxdoc.css
@@ -5,7 +5,7 @@
  * Sphinx stylesheet -- sphinxdoc theme.  Originally created by
  * Armin Ronacher for Werkzeug.
  *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
diff --git a/doc/build/html/_static/websupport.js b/doc/build/html/_static/websupport.js
index 53f6a45..79b18e3 100644
--- a/doc/build/html/_static/websupport.js
+++ b/doc/build/html/_static/websupport.js
@@ -4,7 +4,7 @@
  *
  * sphinx.websupport utilities for all documentation.
  *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
diff --git a/doc/build/html/cfelpyutils.crystfel_utils.html b/doc/build/html/cfelpyutils.crystfel_utils.html
index fb516cd..492008d 100644
--- a/doc/build/html/cfelpyutils.crystfel_utils.html
+++ b/doc/build/html/cfelpyutils.crystfel_utils.html
@@ -1,16 +1,13 @@
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>cfelpyutils.crystfel_utils module &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -27,7 +24,7 @@
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" /> 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -71,8 +68,16 @@
 <span id="cfelpyutils-crystfel-utils-module"></span><h1>cfelpyutils.crystfel_utils module<a class="headerlink" href="#module-cfelpyutils.crystfel_utils" title="Permalink to this headline">¶</a></h1>
 <p>Utilities for interoperability with data formats used in the CrystFEL
 software package.</p>
-<p>This module currently contains a python reimplementation of the
-get_detector_geometry_2 function from CrystFEL.</p>
+<p>Exports:</p>
+<blockquote>
+<div><p>Functions:</p>
+<blockquote>
+<div><dl class="docutils">
+<dt>load_crystfel_geometry: a python reimplementation of the</dt>
+<dd>get_detector_geometry_2 function from CrystFEL.</dd>
+</dl>
+</div></blockquote>
+</div></blockquote>
 <dl class="function">
 <dt id="cfelpyutils.crystfel_utils.load_crystfel_geometry">
 <code class="descclassname">cfelpyutils.crystfel_utils.</code><code class="descname">load_crystfel_geometry</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.crystfel_utils.load_crystfel_geometry" title="Permalink to this definition">¶</a></dt>
@@ -84,18 +89,18 @@ file to keys in the returned dictionary. For a full documentation
 on the CrystFEL geometry format, see:</p>
 <p><a class="reference external" href="http://www.desy.de/~twhite/crystfel/manual-crystfel_geometry.html">http://www.desy.de/~twhite/crystfel/manual-crystfel_geometry.html</a></p>
 <p>The code of this function is synced with the code of the function
-&#8216;get_detector_geometry_2&#8217; in CrystFEL at commit
+‘get_detector_geometry_2’ in CrystFEL at commit
 41a8fa9819010fe8ddeb66676fee717f5226c7b8.</p>
 <table class="docutils field-list" frame="void" rules="none">
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> (<em>str</em>) &#8211; filename of the geometry file.</td>
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> (<em>str</em>) – filename of the geometry file.</td>
 </tr>
 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">dictionary with the geometry information loaded from the
 file.</td>
 </tr>
-<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">dict</td>
+<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">Dict</td>
 </tr>
 </tbody>
 </table>
@@ -123,7 +128,7 @@ file.</td>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/cfelpyutils.geometry_utils.html b/doc/build/html/cfelpyutils.geometry_utils.html
index d95cf85..02ca82b 100644
--- a/doc/build/html/cfelpyutils.geometry_utils.html
+++ b/doc/build/html/cfelpyutils.geometry_utils.html
@@ -1,16 +1,13 @@
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>cfelpyutils.geometry_utils module &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -27,7 +24,7 @@
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" /> 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -69,9 +66,55 @@
             
   <div class="section" id="module-cfelpyutils.geometry_utils">
 <span id="cfelpyutils-geometry-utils-module"></span><h1>cfelpyutils.geometry_utils module<a class="headerlink" href="#module-cfelpyutils.geometry_utils" title="Permalink to this headline">¶</a></h1>
-<p>Geometry utilities.</p>
-<p>Functions that load, manipulate and apply geometry information to
+<p>Utilities to load, manipulate and apply geometry information to
 detector pixel data.</p>
+<p>Exports:</p>
+<blockquote>
+<div><p>Functions:</p>
+<blockquote>
+<div><dl class="docutils">
+<dt>compute_pixel_maps: turn a CrystFEL geometry object into pixel</dt>
+<dd>maps.</dd>
+<dt>apply_pixel_maps: apply pixel maps to a data array. Return an</dt>
+<dd>array containing data with the geometry applied.</dd>
+<dt>compute_minimum_array_size: compute the minimum array size that</dt>
+<dd>is required to store data to which a geometry has been
+applied.</dd>
+<dt>adjust_pixel_maps_for_pyqtgraph: ajust pixel maps to be used in</dt>
+<dd>a PyQtGraph’s ImageView widget.</dd>
+</dl>
+</div></blockquote>
+</div></blockquote>
+<dl class="class">
+<dt id="cfelpyutils.geometry_utils.PixelMaps">
+<em class="property">class </em><code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">PixelMaps</code><span class="sig-paren">(</span><em>x</em>, <em>y</em>, <em>r</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.PixelMaps" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">tuple</span></code></p>
+<p>Pixel maps storing data geometry.</p>
+<p>A namedtuple that stores the pixel maps describing the geometry of a
+dataset. The first two fields, named “x” and “y” respectively, store
+the pixel maps for the x coordinate and the y coordinate. The third
+field, named “r”, is instead a pixel map storing the distance of each
+pixel in the data array from the center of the reference system.</p>
+<dl class="attribute">
+<dt id="cfelpyutils.geometry_utils.PixelMaps.r">
+<code class="descname">r</code><a class="headerlink" href="#cfelpyutils.geometry_utils.PixelMaps.r" title="Permalink to this definition">¶</a></dt>
+<dd><p>Alias for field number 2</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="cfelpyutils.geometry_utils.PixelMaps.x">
+<code class="descname">x</code><a class="headerlink" href="#cfelpyutils.geometry_utils.PixelMaps.x" title="Permalink to this definition">¶</a></dt>
+<dd><p>Alias for field number 0</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="cfelpyutils.geometry_utils.PixelMaps.y">
+<code class="descname">y</code><a class="headerlink" href="#cfelpyutils.geometry_utils.PixelMaps.y" title="Permalink to this definition">¶</a></dt>
+<dd><p>Alias for field number 1</p>
+</dd></dl>
+
+</dd></dl>
+
 <dl class="function">
 <dt id="cfelpyutils.geometry_utils.adjust_pixel_maps_for_pyqtgraph">
 <code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">adjust_pixel_maps_for_pyqtgraph</code><span class="sig-paren">(</span><em>pixel_maps</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.adjust_pixel_maps_for_pyqtgraph" title="Permalink to this definition">¶</a></dt>
@@ -82,27 +125,18 @@ widget.</p>
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>ndarray</strong><strong>, </strong><strong>ndarray</strong><strong>]</strong> (<em>Tuple</em><em>[</em><em>ndarray</em><em>,</em>) &#8211; a named tuple containing the</li>
-<li><strong>maps. The first two fields</strong><strong>, </strong><strong>&quot;x&quot; and &quot;y&quot;</strong><strong>, </strong><strong>should store the</strong> (<em>pixel</em>) &#8211; </li>
-<li><strong>maps for the x coordinateand the y coordinate. The third</strong><strong>,</strong> (<em>pixel</em>) &#8211; </li>
-<li><strong>should instead store the distance of each pixel in the</strong> (<em>&quot;r&quot;</em><em>,</em>) &#8211; </li>
-<li><strong>array from the center of the reference system.</strong> (<em>data</em>) &#8211; </li>
-</ul>
-</td>
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>pixel_maps</strong> (<a class="reference internal" href="#cfelpyutils.geometry_utils.PixelMaps" title="cfelpyutils.geometry_utils.PixelMaps"><em>PixelMaps</em></a>) – a PixelMaps tuple.</td>
 </tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last"><dl class="docutils">
-<dt>Tuple[ndarray, ndarray] A tuple containing the pixel</dt>
-<dd><p class="first last">maps. The first two fields, named &#8220;x&#8221; and &#8220;y&#8221; respectively,
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils">
+<dt>A Pixelmaps tuple containing the adjusted pixel</dt>
+<dd>maps. The first two fields, named “x” and “y” respectively,
 store the pixel maps for the x coordinate and the y
-coordinate. The third field, named &#8220;r&#8221;, is instead a pixel
-map storing the distance of each pixel in the data array
-from the center of the reference system.</p>
-</dd>
+coordinate. The third field (“r”) is just set to None.</dd>
 </dl>
-</p>
 </td>
 </tr>
+<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><a class="reference internal" href="#cfelpyutils.geometry_utils.PixelMaps" title="cfelpyutils.geometry_utils.PixelMaps">PixelMaps</a></td>
+</tr>
 </tbody>
 </table>
 </dd></dl>
@@ -110,19 +144,19 @@ from the center of the reference system.</p>
 <dl class="function">
 <dt id="cfelpyutils.geometry_utils.apply_pixel_maps">
 <code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">apply_pixel_maps</code><span class="sig-paren">(</span><em>data</em>, <em>pixel_maps</em>, <em>output_array=None</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.apply_pixel_maps" title="Permalink to this definition">¶</a></dt>
-<dd><p>Apply geometry in pixel map format to the input data.</p>
-<p>Turn an array of detector pixel values into an array
+<dd><p>Apply geometry to the input data.</p>
+<p>Apply the geometry (in pixel maps format) to the data. In other
+words, turn an array of detector pixel values into an array
 containing a representation of the physical layout of the detector.</p>
 <table class="docutils field-list" frame="void" rules="none">
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>data</strong> (<em>ndarray</em>) &#8211; array containing the data on which the geometry
+<li><strong>data</strong> (<em>ndarray</em>) – array containing the data on which the geometry
 will be applied.</li>
-<li><strong>pixel_maps</strong> (<em>PixelMaps</em>) &#8211; a pixelmap tuple, as returned by the
-<a class="reference internal" href="#cfelpyutils.geometry_utils.compute_pixel_maps" title="cfelpyutils.geometry_utils.compute_pixel_maps"><code class="xref py py-obj docutils literal"><span class="pre">compute_pixel_maps</span></code></a> function in this module.</li>
-<li><strong>output_array</strong> (<em>Optional</em><em>[</em><em>ndarray</em><em>]</em>) &#8211; a preallocated array (of
+<li><strong>pixel_maps</strong> (<a class="reference internal" href="#cfelpyutils.geometry_utils.PixelMaps" title="cfelpyutils.geometry_utils.PixelMaps"><em>PixelMaps</em></a>) – a PixelMaps tuple.</li>
+<li><strong>output_array</strong> (<em>Optional</em><em>[</em><em>ndarray</em><em>]</em>) – a preallocated array (of
 dtype numpy.float32) to store the function output. If
 provided, this array will be filled by the function and
 and returned to the user. If not provided, the function
@@ -131,9 +165,9 @@ user. Defaults to None (No array provided).</li>
 </ul>
 </td>
 </tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">a numpy.float32 array containing the geometry
-information applied to the input data (i.e.: a representation
-of the physical layout of the detector).</p>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">a numpy.float32 array containing the data with the
+geometry applied (i.e.: a representation of the physical layout
+of the detector).</p>
 </td>
 </tr>
 <tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last">ndarray</p>
@@ -146,25 +180,19 @@ of the physical layout of the detector).</p>
 <dl class="function">
 <dt id="cfelpyutils.geometry_utils.compute_minimum_array_size">
 <code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">compute_minimum_array_size</code><span class="sig-paren">(</span><em>pixel_maps</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.compute_minimum_array_size" title="Permalink to this definition">¶</a></dt>
-<dd><p>Compute the minimum size of an array that can store the applied
-geometry.</p>
+<dd><p>Compute the minimum array size storing data with applied geometry.</p>
 <p>Return the minimum size of an array that can store data on which
 the geometry information described by the pixel maps has been
 applied.</p>
 <p>The returned array shape is big enough to display all the input
 pixel values in the reference system of the physical detector. The
-array is supposed to be centered at the center of the reference
-system of the detector (i.e: the beam interaction point).</p>
+array is also supposed to be centered at the center of the
+reference system of the detector (i.e: the beam interaction point).</p>
 <table class="docutils field-list" frame="void" rules="none">
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>ndarray</strong><strong>, </strong><strong>ndarray</strong><strong>]</strong> (<em>Tuple</em><em>[</em><em>ndarray</em><em>,</em>) &#8211; a named tuple containing the
-pixel maps. The first two fields, &#8220;x&#8221; and &#8220;y&#8221;, should store
-the pixel maps for the x coordinateand the y coordinate.
-The third, &#8220;r&#8221;, should instead store the distance of each
-pixel in the data array from the center of the reference
-system.</td>
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>[</strong><strong>PixelMaps</strong><strong>]</strong> (<em>pixel_maps</em>) – a PixelMaps tuple.</td>
 </tr>
 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">a numpy-style shape tuple storing the minimum
 array size.</td>
@@ -188,17 +216,14 @@ interaction point.</p>
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>geometry</strong> (<em>dict</em>) &#8211; A CrystFEL geometry object (A dictionary
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>geometry</strong> (<em>dict</em>) – A CrystFEL geometry object (A dictionary
 returned by the
 <a class="reference internal" href="cfelpyutils.crystfel_utils.html#cfelpyutils.crystfel_utils.load_crystfel_geometry" title="cfelpyutils.crystfel_utils.load_crystfel_geometry"><code class="xref py py-obj docutils literal"><span class="pre">cfelpyutils.crystfel_utils.load_crystfel_geometry</span></code></a>
 function).</td>
 </tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Tuple[ndarray, ndarray, ndarray] A tuple containing the pixel
-maps. The first two fields, named &#8220;x&#8221; and &#8220;y&#8221; respectively,
-store the pixel maps for the x coordinate and the y coordinate.
-The third field, named &#8220;r&#8221;, is instead a pixel map storing the
-distance of each pixel in the data array from the center of the
-reference system.</td>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">A PixelMaps tuple.</td>
+</tr>
+<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><a class="reference internal" href="#cfelpyutils.geometry_utils.PixelMaps" title="cfelpyutils.geometry_utils.PixelMaps">PixelMaps</a></td>
 </tr>
 </tbody>
 </table>
@@ -226,7 +251,7 @@ reference system.</td>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/cfelpyutils.html b/doc/build/html/cfelpyutils.html
index bb9c7a1..b15f0c9 100644
--- a/doc/build/html/cfelpyutils.html
+++ b/doc/build/html/cfelpyutils.html
@@ -1,16 +1,13 @@
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>cfelpyutils package &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -27,7 +24,7 @@
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" /> 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -122,7 +119,7 @@ python to work with several file format used in x-ray imaging).</p>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/cfelpyutils.parameter_utils.html b/doc/build/html/cfelpyutils.parameter_utils.html
index b674668..aa19b1b 100644
--- a/doc/build/html/cfelpyutils.parameter_utils.html
+++ b/doc/build/html/cfelpyutils.parameter_utils.html
@@ -1,16 +1,13 @@
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>cfelpyutils.parameter_utils module &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -27,7 +24,7 @@
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" /> 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -70,13 +67,24 @@
   <div class="section" id="module-cfelpyutils.parameter_utils">
 <span id="cfelpyutils-parameter-utils-module"></span><h1>cfelpyutils.parameter_utils module<a class="headerlink" href="#module-cfelpyutils.parameter_utils" title="Permalink to this headline">¶</a></h1>
 <p>Utilities for parsing command line options and configuration files.</p>
+<p>Exports:</p>
+<blockquote>
+<div><p>Functions:</p>
+<blockquote>
+<div><dl class="docutils">
+<dt>convert_parameters: convert a dictionary returned by the</dt>
+<dd>configparse module to a dictionary containing entries with
+the correct type.</dd>
+</dl>
+</div></blockquote>
+</div></blockquote>
 <dl class="function">
 <dt id="cfelpyutils.parameter_utils.convert_parameters">
 <code class="descclassname">cfelpyutils.parameter_utils.</code><code class="descname">convert_parameters</code><span class="sig-paren">(</span><em>config_dict</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.parameter_utils.convert_parameters" title="Permalink to this definition">¶</a></dt>
-<dd><p>Convert strings in parameter dictionaries to the corrent data type.</p>
-<p>Read a parameter dictionary returned by the ConfigParser python
-module, and convert each entry in an object of the corresponding
-type, without changing the structure of the dictionary.</p>
+<dd><p>Convert strings in parameter dictionaries to the correct data type.</p>
+<p>Convert a dictionary return by the configparse module to a
+dictionar contaning the same parameters converted from string to
+their correct type (int, float, string, etc.)</p>
 <p>Try to convert each entry in the dictionary according to the
 following rules. The first rule that applies to the entry
 determines the type.</p>
@@ -116,7 +124,7 @@ try to interpret the entry in order as:</p>
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><p class="first"><strong>config</strong> (<em>dict</em>) &#8211; a dictionary containing strings (the dictionary
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><p class="first"><strong>config</strong> (<em>Dict</em>) – a dictionary containing strings (the dictionary
 returned by Config Parser).</p>
 </td>
 </tr>
@@ -124,11 +132,11 @@ returned by Config Parser).</p>
 dictionary, but with correct types assigned to each entry.</p>
 </td>
 </tr>
-<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first">dict</p>
+<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first">Dict</p>
 </td>
 </tr>
 <tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple">
-<li><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code> &#8211; if an entry cannot be converted to any supported</li>
+<li><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code> – if an entry cannot be converted to any supported</li>
 <li><code class="xref py py-exc docutils literal"><span class="pre">type.</span></code></li>
 </ul>
 </td>
@@ -159,7 +167,7 @@ dictionary, but with correct types assigned to each entry.</p>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html
index 8e3eaeb..7fee42b 100644
--- a/doc/build/html/genindex.html
+++ b/doc/build/html/genindex.html
@@ -1,17 +1,14 @@
 
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>Index &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -28,7 +25,7 @@
     <link rel="index" title="Index" href="#" />
     <link rel="search" title="Search" href="search.html" /> 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -71,6 +68,10 @@
  <a href="#A"><strong>A</strong></a>
  | <a href="#C"><strong>C</strong></a>
  | <a href="#L"><strong>L</strong></a>
+ | <a href="#P"><strong>P</strong></a>
+ | <a href="#R"><strong>R</strong></a>
+ | <a href="#X"><strong>X</strong></a>
+ | <a href="#Y"><strong>Y</strong></a>
  
 </div>
 <h2 id="A">A</h2>
@@ -115,6 +116,38 @@
   </ul></td>
 </tr></table>
 
+<h2 id="P">P</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="cfelpyutils.geometry_utils.html#cfelpyutils.geometry_utils.PixelMaps">PixelMaps (class in cfelpyutils.geometry_utils)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="R">R</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="cfelpyutils.geometry_utils.html#cfelpyutils.geometry_utils.PixelMaps.r">r (cfelpyutils.geometry_utils.PixelMaps attribute)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="X">X</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="cfelpyutils.geometry_utils.html#cfelpyutils.geometry_utils.PixelMaps.x">x (cfelpyutils.geometry_utils.PixelMaps attribute)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="Y">Y</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="cfelpyutils.geometry_utils.html#cfelpyutils.geometry_utils.PixelMaps.y">y (cfelpyutils.geometry_utils.PixelMaps attribute)</a>
+</li>
+  </ul></td>
+</tr></table>
+
 
 
           </div>
@@ -136,7 +169,7 @@
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/index.html b/doc/build/html/index.html
index 2114031..9cc33b6 100644
--- a/doc/build/html/index.html
+++ b/doc/build/html/index.html
@@ -1,16 +1,13 @@
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>Welcome to cfelpyutils’s documentation! &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -27,7 +24,7 @@
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" /> 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -44,7 +41,7 @@
         <div class="sphinxsidebarwrapper">
   <h3><a href="#">Table Of Contents</a></h3>
   <ul>
-<li><a class="reference internal" href="#">Welcome to cfelpyutils&#8217;s documentation!</a></li>
+<li><a class="reference internal" href="#">Welcome to cfelpyutils’s documentation!</a></li>
 <li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
 </ul>
 
@@ -74,7 +71,7 @@
           <div class="body" role="main">
             
   <div class="section" id="welcome-to-cfelpyutils-s-documentation">
-<h1>Welcome to cfelpyutils&#8217;s documentation!<a class="headerlink" href="#welcome-to-cfelpyutils-s-documentation" title="Permalink to this headline">¶</a></h1>
+<h1>Welcome to cfelpyutils’s documentation!<a class="headerlink" href="#welcome-to-cfelpyutils-s-documentation" title="Permalink to this headline">¶</a></h1>
 <p>Contents:</p>
 <div class="toctree-wrapper compound">
 </div>
@@ -108,7 +105,7 @@
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/modules.html b/doc/build/html/modules.html
index 5562e7c..950cef6 100644
--- a/doc/build/html/modules.html
+++ b/doc/build/html/modules.html
@@ -1,16 +1,13 @@
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>cfelpyutils &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -27,7 +24,7 @@
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" /> 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -105,7 +102,7 @@
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/objects.inv b/doc/build/html/objects.inv
index ec0b69617810b39692e04b3d4c1c20a3b1e6e378..3a4683af811c503ddd611e3e57561bcc002846b7 100644
GIT binary patch
delta 388
zcmV-~0ek+?1NZ}weSefqPQx$|M)x^|5o}Y@ZEwJ$QY98Ft*J9j4R&m72i2^&2G`>x
zICVplG<5-`yLRT&d*h#&ZBS@mJ1#8Iej!y+3ncf19qY5Llj1gZ@;j1e-5xXEy6~T-
z5&hU7h%=#}pg*+|l|*NJBihszb6izqeo-}aw3rK1_hZSa2Y=BO-=SE7-m{qiYX?(~
zp?}MqnT86^8NRL^PD$QfjqE2TL-AZ&M|C5hG8pJa8LIuOD-Gyv;)47~rnT@L*R*t|
zqz-#RC9k-wB?V)^Q_J7+I-beap}{~1p}FuK4RXm3X_#fIdP5Tqx~->%9u*A?#JXZp
zC`R)6$t%|_5Pc2o1xidkcV|!|Pf(&y;!dO<s573CGfMQwJi`+_BO2S+RG?LrSn;aB
z-JUC8jiMp9)rfg$erCtmLElL{p$JzOiBnzY*T<(NAzVwW95k2VCJWjTpZ0m%h`?pM
iq|qEl?JfOKI$36B5e(b*>9H2GkFmdMuFW@lm(650<hbqt

delta 348
zcmV-i0i*u-1JDDIeSee7PQx$|Mfdp%Bam37qTBuf3nU~KU0TMOBnH3m1J!&z4sK|Y
zx{i>_E}6NyXT~!_Ti`l)$GAm0?1XAO2lRmGDZc5Q;I}DL-=Vsi=BNqQ#eZD3n9Kg)
zxZ#R4_&3&p65vc2K&_Y5F(uJ<6}4oHHY-)nWyPu&QqsJ6>wmCjhggUp+TvCjtiy-v
z4AFg|{2X%)rZo=})^**f652b!f=MR4z{D65uw`HHKb))ep@|_;1ZHK*3te%{OD$FM
z6HFZR7%vr_1uY23x@OlXit6pz4Ne0{6Z%d%C>`SktIUBE@+iGT>3lA5GBYaVbDZS_
zFMx9IS`v(?4pk(R4IF-aIe7&>IFHd}^EiA~C)p7{QS5=o)dl3#lzDGalzIWukzo~X
ustC={bg0KfvU^G^nz*UZS>wmhS(B9oVrV~iPqCzZN%`ktX}$rCI7LbB)28nL

diff --git a/doc/build/html/py-modindex.html b/doc/build/html/py-modindex.html
index 01f0bcc..07cc5eb 100644
--- a/doc/build/html/py-modindex.html
+++ b/doc/build/html/py-modindex.html
@@ -1,16 +1,13 @@
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>Python Module Index &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -30,7 +27,7 @@
 
 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -117,7 +114,7 @@
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/search.html b/doc/build/html/search.html
index 81cbbb6..505f5ab 100644
--- a/doc/build/html/search.html
+++ b/doc/build/html/search.html
@@ -1,16 +1,13 @@
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
-
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
     <title>Search &#8212; cfelpyutils 0.5 documentation</title>
-    
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
@@ -35,7 +32,7 @@
    
 
   </head>
-  <body role="document">
+  <body>
     <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
@@ -101,7 +98,7 @@
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2016, CFEL Team.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js
index 98399e1..bfecff6 100644
--- a/doc/build/html/searchindex.js
+++ b/doc/build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["cfelpyutils","cfelpyutils.crystfel_utils","cfelpyutils.geometry_utils","cfelpyutils.parameter_utils","index","modules"],envversion:51,filenames:["cfelpyutils.rst","cfelpyutils.crystfel_utils.rst","cfelpyutils.geometry_utils.rst","cfelpyutils.parameter_utils.rst","index.rst","modules.rst"],objects:{"":{cfelpyutils:[0,0,0,"-"]},"cfelpyutils.crystfel_utils":{load_crystfel_geometry:[1,1,1,""]},"cfelpyutils.geometry_utils":{adjust_pixel_maps_for_pyqtgraph:[2,1,1,""],apply_pixel_maps:[2,1,1,""],compute_minimum_array_size:[2,1,1,""],compute_pixel_maps:[2,1,1,""]},"cfelpyutils.parameter_utils":{convert_parameters:[3,1,1,""]},cfelpyutils:{crystfel_utils:[1,0,0,"-"],geometry_utils:[2,0,0,"-"],parameter_utils:[3,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:function"},terms:{"41a8fa9819010fe8ddeb66676fee717f5226c7b8":1,"boolean":3,"class":0,"default":2,"float":3,"function":[0,1,2],"import":0,"int":2,"new":2,"return":[1,2,3],"true":3,"try":3,For:1,The:[1,2,3],accord:3,adjust:2,adjust_pixel_maps_for_pyqtgraph:2,all:[2,3],allow:0,ani:3,appli:[2,3],apply_pixel_map:2,argument:0,arrai:2,assign:3,automat:[0,2],base:0,beam:2,been:2,big:2,brace:3,bracket:3,can:2,cannot:3,center:2,cfel:0,cfelfabio:0,cfelgeom:0,cfelhdf5:0,cfeloptarg:0,cfelpsana:0,chang:3,code:1,command:[0,3],commit:1,comput:2,compute_minimum_array_s:2,compute_pixel_map:2,config:3,config_dict:3,configpars:3,configur:3,contain:[0,1,2,3],content:[3,4,5],convert:[1,3],convert_paramet:3,coordin:2,coordinateand:2,correct:3,corrent:3,correspond:3,creat:2,crystfel:[0,1,2],crystfel_geometri:1,crystfel_util:[0,2,5],curli:3,current:1,data:[1,2,3],describ:2,desi:1,detector:2,determin:3,dict:[1,2,3],dictionari:[1,2,3],displai:2,distanc:2,document:1,doubl:3,dtype:2,each:[2,3],els:3,end:3,enough:2,entri:[1,3],etc:0,except:3,expand:0,fabio:0,fail:3,fals:3,field:2,file:[0,1,3],filenam:1,fill:2,first:[2,3],float32:2,follow:[0,3],format:[0,1,2],from:[1,2],full:1,geometri:[0,1,2],geometry_util:[0,5],get_detector_geometry_2:1,h5py:0,has:2,hdf5:0,html:1,http:1,imag:0,imageview:2,index:4,inform:[1,2],input:[2,3],instead:2,integ:3,interact:2,interoper:1,interpret:3,kei:1,layout:2,leav:3,line:[0,3],list:3,load:[1,2],load_crystfel_geometri:[1,2],mani:0,manipul:2,manual:1,map:2,match:3,minimum:2,modul:[4,5],name:2,ndarrai:2,non:0,none:[2,3],nonetyp:3,number:3,numpi:2,object:[2,3],option:[2,3],order:3,origin:2,output:2,output_arrai:2,packag:[1,5],page:4,paramet:[0,1,2,3],parameter_util:[0,5],pars:[0,3],parser:3,physic:2,pixel:2,pixel_map:2,pixelmap:2,point:2,prealloc:2,previou:3,process:0,project:0,provid:[0,2],psana:0,pyqtgraph:2,python:[0,1,3],quot:3,rai:0,rais:3,read:[1,3],refer:2,reimplement:1,represent:2,respect:2,rule:3,runtimeerror:3,same:3,search:4,see:1,set:[2,3],sever:0,shape:2,should:2,singl:3,size:2,softwar:[0,1],squar:3,start:3,store:2,str:1,string:3,structur:3,style:[0,2],submodul:5,support:3,suppos:2,sync:1,system:2,take:2,thi:[0,1,2],third:2,tupl:2,turn:2,twhite:1,two:2,type:[1,2,3],used:[0,1,2],user:2,util:[0,1,2,3],valu:2,visual:2,which:[0,2],widget:2,without:3,word:3,work:0,www:1},titles:["cfelpyutils package","cfelpyutils.crystfel_utils module","cfelpyutils.geometry_utils module","cfelpyutils.parameter_utils module","Welcome to cfelpyutils&#8217;s documentation!","cfelpyutils"],titleterms:{cfelpyutil:[0,1,2,3,4,5],content:0,crystfel_util:1,document:4,geometry_util:2,indic:4,modul:[0,1,2,3],packag:0,parameter_util:3,submodul:0,tabl:4,welcom:4}})
\ No newline at end of file
+Search.setIndex({docnames:["cfelpyutils","cfelpyutils.crystfel_utils","cfelpyutils.geometry_utils","cfelpyutils.parameter_utils","index","modules"],envversion:53,filenames:["cfelpyutils.rst","cfelpyutils.crystfel_utils.rst","cfelpyutils.geometry_utils.rst","cfelpyutils.parameter_utils.rst","index.rst","modules.rst"],objects:{"":{cfelpyutils:[0,0,0,"-"]},"cfelpyutils.crystfel_utils":{load_crystfel_geometry:[1,1,1,""]},"cfelpyutils.geometry_utils":{PixelMaps:[2,2,1,""],adjust_pixel_maps_for_pyqtgraph:[2,1,1,""],apply_pixel_maps:[2,1,1,""],compute_minimum_array_size:[2,1,1,""],compute_pixel_maps:[2,1,1,""]},"cfelpyutils.geometry_utils.PixelMaps":{r:[2,3,1,""],x:[2,3,1,""],y:[2,3,1,""]},"cfelpyutils.parameter_utils":{convert_parameters:[3,1,1,""]},cfelpyutils:{crystfel_utils:[1,0,0,"-"],geometry_utils:[2,0,0,"-"],parameter_utils:[3,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute"},terms:{"41a8fa9819010fe8ddeb66676fee717f5226c7b8":1,"boolean":3,"class":[0,2],"default":2,"export":[1,2,3],"float":3,"function":[0,1,2,3],"import":0,"int":[2,3],"new":2,"return":[1,2,3],"true":3,"try":3,For:1,The:[1,2,3],accord:3,adjust:2,adjust_pixel_maps_for_pyqtgraph:2,ajust:2,alia:2,all:[2,3],allow:0,also:2,ani:3,appli:[2,3],apply_pixel_map:2,argument:0,arrai:2,assign:3,automat:[0,2],base:[0,2],beam:2,been:2,big:2,brace:3,bracket:3,can:2,cannot:3,center:2,cfel:0,cfelfabio:0,cfelgeom:0,cfelhdf5:0,cfeloptarg:0,cfelpsana:0,code:1,command:[0,3],commit:1,comput:2,compute_minimum_array_s:2,compute_pixel_map:2,config:3,config_dict:3,configpars:3,configur:3,contain:[0,2,3],contan:3,content:[3,4,5],convert:[1,3],convert_paramet:3,coordin:2,correct:3,creat:2,crystfel:[0,1,2],crystfel_geometri:1,crystfel_util:[0,2,5],curli:3,data:[1,2,3],dataset:2,describ:2,desi:1,detector:2,determin:3,dict:[1,2,3],dictionar:3,dictionari:[1,2,3],displai:2,distanc:2,document:1,doubl:3,dtype:2,each:[2,3],els:3,end:3,enough:2,entri:[1,3],etc:[0,3],except:3,expand:0,fabio:0,fail:3,fals:3,field:2,file:[0,1,3],filenam:1,fill:2,first:[2,3],float32:2,follow:[0,3],format:[0,1,2],from:[1,2,3],full:1,geometri:[0,1,2],geometry_util:[0,5],get_detector_geometry_2:1,h5py:0,has:2,hdf5:0,html:1,http:1,imag:0,imageview:2,index:4,inform:[1,2],input:[2,3],instead:2,integ:3,interact:2,interoper:1,interpret:3,just:2,kei:1,layout:2,leav:3,line:[0,3],list:3,load:[1,2],load_crystfel_geometri:[1,2],mani:0,manipul:2,manual:1,map:2,match:3,minimum:2,modul:[4,5],name:2,namedtupl:2,ndarrai:2,non:0,none:[2,3],nonetyp:3,number:[2,3],numpi:2,object:2,option:[2,3],order:3,origin:2,other:2,output:2,output_arrai:2,packag:[1,5],page:4,paramet:[0,1,2,3],parameter_util:[0,5],pars:[0,3],parser:3,physic:2,pixel:2,pixel_map:2,pixelmap:2,point:2,prealloc:2,previou:3,process:0,project:0,provid:[0,2],psana:0,pyqtgraph:2,python:[0,1],quot:3,rai:0,rais:3,read:1,refer:2,reimplement:1,represent:2,requir:2,respect:2,rule:3,runtimeerror:3,same:3,search:4,see:1,set:[2,3],sever:0,shape:2,singl:3,size:2,softwar:[0,1],squar:3,start:3,store:2,str:1,string:3,structur:3,style:[0,2],submodul:5,support:3,suppos:2,sync:1,system:2,take:2,thi:[0,1,2],third:2,tupl:2,turn:2,twhite:1,two:2,type:[1,2,3],used:[0,1,2],user:2,util:[0,1,2,3],valu:2,visual:2,which:[0,2],widget:2,without:3,word:[2,3],work:0,www:1},titles:["cfelpyutils package","cfelpyutils.crystfel_utils module","cfelpyutils.geometry_utils module","cfelpyutils.parameter_utils module","Welcome to cfelpyutils\u2019s documentation!","cfelpyutils"],titleterms:{cfelpyutil:[0,1,2,3,4,5],content:0,crystfel_util:1,document:4,geometry_util:2,indic:4,modul:[0,1,2,3],packag:0,parameter_util:3,submodul:0,tabl:4,welcom:4}})
\ No newline at end of file
diff --git a/geometry_utils.py b/geometry_utils.py
index 699d822..bb95c5f 100644
--- a/geometry_utils.py
+++ b/geometry_utils.py
@@ -13,12 +13,26 @@
 #    You should have received a copy of the GNU General Public License
 #    along with cfelpyutils.  If not, see <http://www.gnu.org/licenses/>.
 """
-Geometry utilities.
-
-Functions that load, manipulate and apply geometry information to
+Utilities to load, manipulate and apply geometry information to
 detector pixel data.
-"""
 
+Exports:
+
+    Functions:
+
+        compute_pixel_maps: turn a CrystFEL geometry object into pixel
+            maps.
+
+        apply_pixel_maps: apply pixel maps to a data array. Return an
+            array containing data with the geometry applied.
+
+        compute_minimum_array_size: compute the minimum array size that
+            is required to store data to which a geometry has been
+            applied.
+
+        adjust_pixel_maps_for_pyqtgraph: ajust pixel maps to be used in
+            a PyQtGraph's ImageView widget.
+"""
 from __future__ import (absolute_import, division, print_function,
                         unicode_literals)
 
@@ -27,6 +41,21 @@ import collections
 import numpy
 
 
+PixelMaps = collections.namedtuple(  # pylint: disable=C0103
+    typename='PixelMaps',
+    field_names=['x', 'y', 'r']
+)
+"""
+Pixel maps storing data geometry.
+
+A namedtuple that stores the pixel maps describing the geometry of a
+dataset. The first two fields, named "x" and "y" respectively, store
+the pixel maps for the x coordinate and the y coordinate. The third
+field, named "r", is instead a pixel map storing the distance of each
+pixel in the data array from the center of the reference system.
+"""
+
+
 def compute_pixel_maps(geometry):
     """
     Compute pixel maps from a CrystFEL geometry object.
@@ -46,12 +75,7 @@ def compute_pixel_maps(geometry):
 
     Returns:
 
-        Tuple[ndarray, ndarray, ndarray] A tuple containing the pixel
-        maps. The first two fields, named "x" and "y" respectively,
-        store the pixel maps for the x coordinate and the y coordinate.
-        The third field, named "r", is instead a pixel map storing the
-        distance of each pixel in the data array from the center of the
-        reference system.
+        PixelMaps: A PixelMaps tuple.
     """
     # Determine the max fs and ss in the geometry object.
     max_slab_fs = numpy.array([
@@ -68,16 +92,16 @@ def compute_pixel_maps(geometry):
     # will store the x and y pixel maps.
     x_map = numpy.zeros(
         shape=(max_slab_ss + 1, max_slab_fs + 1),
-        dtype=numpy.float32
+        dtype=numpy.float32  # pylint: disable=E1101
     )
 
     y_map = numpy.zeros(
         shape=(max_slab_ss + 1, max_slab_fs + 1),
-        dtype=numpy.float32
+        dtype=numpy.float32  # pylint: disable=E1101
     )
 
     # Iterate over the panels. For each panel, determine the pixel
-    # indeces, then compute the x,y vectors using a comples notation.
+    # indices, then compute the x,y vectors using a comples notation.
     for pan in geometry['panels']:
         i, j = numpy.meshgrid(
             numpy.arange(
@@ -120,18 +144,15 @@ def compute_pixel_maps(geometry):
     # Finally, compute the values for the radius pixel map.
     r_map = numpy.sqrt(numpy.square(x_map) + numpy.square(y_map))
 
-    PixelMaps = collections.namedtuple(
-        typename='PixelMaps',
-        field_names=['x', 'y', 'r']
-    )
     return PixelMaps(x_map, y_map, r_map)
 
 
 def apply_pixel_maps(data, pixel_maps, output_array=None):
     """
-    Apply geometry in pixel map format to the input data.
+    Apply geometry to the input data.
 
-    Turn an array of detector pixel values into an array
+    Apply the geometry (in pixel maps format) to the data. In other
+    words, turn an array of detector pixel values into an array
     containing a representation of the physical layout of the detector.
 
     Args:
@@ -139,8 +160,7 @@ def apply_pixel_maps(data, pixel_maps, output_array=None):
         data (ndarray): array containing the data on which the geometry
             will be applied.
 
-        pixel_maps (PixelMaps): a pixelmap tuple, as returned by the
-            :obj:`compute_pixel_maps` function in this module.
+        pixel_maps (PixelMaps): a PixelMaps tuple.
 
         output_array (Optional[ndarray]): a preallocated array (of
             dtype numpy.float32) to store the function output. If
@@ -151,15 +171,15 @@ def apply_pixel_maps(data, pixel_maps, output_array=None):
 
     Returns:
 
-        ndarray: a numpy.float32 array containing the geometry
-        information applied to the input data (i.e.: a representation
-        of the physical layout of the detector).
+        ndarray: a numpy.float32 array containing the data with the
+        geometry applied (i.e.: a representation of the physical layout
+        of the detector).
     """
     # If no output array was provided, create one.
     if output_array is None:
         output_array = numpy.zeros(
             shape=data.shape,
-            dtype=numpy.float32
+            dtype=numpy.float32  # pylint: disable=E1101
         )
 
     # Apply the pixel map geometry information the data, then return
@@ -170,8 +190,7 @@ def apply_pixel_maps(data, pixel_maps, output_array=None):
 
 def compute_minimum_array_size(pixel_maps):
     """
-    Compute the minimum size of an array that can store the applied
-    geometry.
+    Compute the minimum array size storing data with applied geometry.
 
     Return the minimum size of an array that can store data on which
     the geometry information described by the pixel maps has been
@@ -179,17 +198,12 @@ def compute_minimum_array_size(pixel_maps):
 
     The returned array shape is big enough to display all the input
     pixel values in the reference system of the physical detector. The
-    array is supposed to be centered at the center of the reference
-    system of the detector (i.e: the beam interaction point).
+    array is also supposed to be centered at the center of the
+    reference system of the detector (i.e: the beam interaction point).
 
     Args:
 
-        Tuple[ndarray, ndarray, ndarray]: a named tuple containing the
-            pixel maps. The first two fields, "x" and "y", should store
-            the pixel maps for the x coordinateand the y coordinate.
-            The third, "r", should instead store the distance of each
-            pixel in the data array from the center of the reference
-            system.
+        pixel_maps [PixelMaps]: a PixelMaps tuple.
 
     Returns:
 
@@ -200,7 +214,7 @@ def compute_minimum_array_size(pixel_maps):
     # the returned array is centered on the origin, the minimum array
     # size along a certain axis must be at least twice the maximum
     # value for that axis. 2 pixels are added for good measure.
-    x_map, y_map = pixel_maps.x, pixel_maps.x.y
+    x_map, y_map = pixel_maps.x, pixel_maps.y
     y_minimum = 2 * int(max(abs(y_map.max()), abs(y_map.min()))) + 2
     x_minimum = 2 * int(max(abs(x_map.max()), abs(x_map.min()))) + 2
 
@@ -217,20 +231,14 @@ def adjust_pixel_maps_for_pyqtgraph(pixel_maps):
 
     Args:
 
-        Tuple[ndarray, ndarray, ndarray]: a named tuple containing the
-        pixel maps. The first two fields, "x" and "y", should store the
-        pixel maps for the x coordinateand the y coordinate. The third,
-        "r", should instead store the distance of each pixel in the
-        data array from the center of the reference system.
+        pixel_maps (PixelMaps): a PixelMaps tuple.
 
     Returns:
 
-        Tuple[ndarray, ndarray] A tuple containing the pixel
+        PixelMaps: A Pixelmaps tuple containing the adjusted pixel
             maps. The first two fields, named "x" and "y" respectively,
             store the pixel maps for the x coordinate and the y
-            coordinate. The third field, named "r", is instead a pixel
-            map storing the distance of each pixel in the data array
-            from the center of the reference system.
+            coordinate. The third field ("r") is just set to None.
     """
     # Essentially, the origin of the reference system needs to be
     # moved from the beam position to the top-left of the image that
@@ -249,8 +257,4 @@ def adjust_pixel_maps_for_pyqtgraph(pixel_maps):
         dtype=numpy.int
     ) + min_shape[0] // 2 - 1
 
-    PixelMapsForIV = collections.namedtuple(
-        typename='PixelMapsForIV',
-        field_names=['x', 'y']
-    )
-    return PixelMapsForIV(new_x_map, new_y_map)
+    return PixelMaps(new_x_map, new_y_map, None)
diff --git a/parameter_utils.py b/parameter_utils.py
index 4a3fde6..18c33be 100644
--- a/parameter_utils.py
+++ b/parameter_utils.py
@@ -14,6 +14,14 @@
 #    along with cfelpyutils.  If not, see <http://www.gnu.org/licenses/>.
 """
 Utilities for parsing command line options and configuration files.
+
+Exports:
+
+    Functions:
+
+        convert_parameters: convert a dictionary returned by the
+            configparse module to a dictionary containing entries with
+            the correct type.
 """
 
 from __future__ import (absolute_import, division, print_function,
@@ -33,11 +41,12 @@ def _parsing_error(section, option):
 
 
 def convert_parameters(config_dict):
-    """Convert strings in parameter dictionaries to the corrent data type.
+    """
+    Convert strings in parameter dictionaries to the correct data type.
 
-    Read a parameter dictionary returned by the ConfigParser python
-    module, and convert each entry in an object of the corresponding
-    type, without changing the structure of the dictionary.
+    Convert a dictionary return by the configparse module to a
+    dictionar contaning the same parameters converted from string to
+    their correct type (int, float, string, etc.)
 
     Try to convert each entry in the dictionary according to the
     following rules. The first rule that applies to the entry
@@ -66,12 +75,12 @@ def convert_parameters(config_dict):
 
     Args:
 
-        config (dict): a dictionary containing strings (the dictionary
+        config (Dict): a dictionary containing strings (the dictionary
             returned by Config Parser).
 
     Returns:
 
-        dict: dictionary with the same structure as the input
+        Dict: dictionary with the same structure as the input
         dictionary, but with correct types assigned to each entry.
 
     Raises:
@@ -92,8 +101,8 @@ def convert_parameters(config_dict):
         # the configuration file). Get each option in turn and perform
         # all the checks. If all checks fail, call the parsing_error
         # function.
-        for option in config_dict['section'].keys():
-            recovered_option = config_dict['section']
+        for option in config_dict[section].keys():
+            recovered_option = config_dict[section][option]
             if (
                     recovered_option.startswith("'") and
                     recovered_option.endswith("'")
-- 
GitLab