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 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 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 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 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 — 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 -‘get_detector_geometry_2’ 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>) – 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"> © 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 — 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>) – a named tuple containing the</li> -<li><strong>maps. The first two fields</strong><strong>, </strong><strong>"x" and "y"</strong><strong>, </strong><strong>should store the</strong> (<em>pixel</em>) – </li> -<li><strong>maps for the x coordinateand the y coordinate. The third</strong><strong>,</strong> (<em>pixel</em>) – </li> -<li><strong>should instead store the distance of each pixel in the</strong> (<em>"r"</em><em>,</em>) – </li> -<li><strong>array from the center of the reference system.</strong> (<em>data</em>) – </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 “x” and “y” 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 “r”, 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>) – 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>) – 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>) – 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>) – 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.</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>) – 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 “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.</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"> © 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 — 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"> © 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 — 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>) – 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> – 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"> © 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 — 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"> © 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! — 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’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’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"> © 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 — 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"> © 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 — 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"> © 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 — 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"> © 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’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