Ignore:
Timestamp:
May 9, 2023 9:43:48 PM (5 months ago)
Author:
toby
Message:

partial refactor of ReST comments for better formatting on ReadTheDocs?; more work needed for GSASIIGUI.rst & GSASIIstruc.rst

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/docs/source/GSASIIscriptable.rst

    r3188 r5572  
     1=======================================
     2*GSASIIscriptable: Scripting Interface*
     3=======================================
     4
     5
     6*Summary/Contents*
     7==================================================
     8
     9Routines to use an increasing amount of GSAS-II's capabilities from scripts,
     10without use of the graphical user interface (GUI). GSASIIscriptable can create and access
     11GSAS-II project (.gpx) files and can directly perform image handling and refinements. 
     12The module defines wrapper classes (inheriting from :class:`G2ObjectWrapper`) for a growing number
     13of data tree items.
     14
     15GSASIIscriptable can be used in two ways. It offers a command-line mode, but
     16the more widely used and more powerful mode of GSASIIscriptable is
     17used is via Python scripts that
     18call the module's application interface (API), see API summary that follows or the :ref:`API`
     19section. The command-line mode
     20provides access a number of features without writing Python scripts
     21via shell/batch commands (see :ref:`CommandlineInterface`) but this
     22is no longer being developed and its use is discouraged.
     23
     24.. contents:: Section Contents
     25
     26
     27Application Interface (API) Summary
     28==================================================
     29This section of the documentation provides an overview to API, with full documentation
     30in the :ref:`API` section. The typical API use will be with a Python script, such as
     31what is found in :ref:`CodeExamples`. Most functionality is provided via the objects and methods
     32summarized below.
     33
     34Overview of Classes
     35---------------------
     36
     37.. tabularcolumns:: |l|p{4in}|
     38
     39===============================    ===============================================================================================================
     40class                              Encapsulates
     41===============================    ===============================================================================================================
     42:class:`G2Project`                  A GSAS-II project file, provides references to objects below,
     43                                    each corresponding to a tree item
     44                                    (exception is :class:`G2AtomRecord`)
     45:class:`G2Phase`                    Provides phase information access
     46                                    (also provides access to atom info via :class:`G2AtomRecord`)
     47:class:`G2AtomRecord`               Access to an atom within a phase
     48:class:`G2PwdrData`                 Access to powder histogram info
     49:class:`G2Image`                    Access to image info
     50:class:`G2PDF`                      PDF histogram info
     51:class:`G2SeqRefRes`                The sequential results table
     52===============================    ===============================================================================================================
     53
     54Functions
     55---------------------
     56
     57A small amount of the Scriptable code does not require use of objects.
     58
     59.. tabularcolumns:: |l|p{4in}|
     60
     61==================================================    ===============================================================================================================
     62method                                                Use
     63==================================================    ===============================================================================================================
     64:func:`GenerateReflections`                            Generates a list of unique powder reflections
     65:func:`SetPrintLevel`                                  Sets the amout of output generated when running a script
     66==================================================    ===============================================================================================================
     67
     68Class :class:`G2Project`
     69---------------------------------
     70
     71  All GSASIIscriptable scripts will need to create a :class:`G2Project` object
     72  either for a new GSAS-II project or to read in an existing project (.gpx) file.
     73  The most commonly used routines in this object are:
     74
     75.. tabularcolumns:: |l|p{3.in}|
     76
     77==================================================    ===============================================================================================================
     78method                                                Use
     79==================================================    ===============================================================================================================
     80:meth:`G2Project.save`                                Writes the current project to disk.
     81
     82:meth:`G2Project.add_powder_histogram`                Used to read in powder diffraction data into a project file.
     83
     84:meth:`G2Project.add_simulated_powder_histogram`      Defines a "dummy" powder diffraction data that will be simulated after a refinement step.
     85
     86:meth:`G2Project.add_image`                           Reads in an image into a project.
     87
     88:meth:`G2Project.add_phase`                           Adds a phase to a project
     89
     90:meth:`G2Project.add_PDF`                             Adds a PDF entry to a project (does not compute it)
     91
     92:meth:`G2Project.histograms`                          Provides a list of histograms in the current project, as :class:`G2PwdrData` objects
     93
     94:meth:`G2Project.phases`                              Provides a list of phases defined in the current project, as :class:`G2Phase` objects
     95
     96:meth:`G2Project.images`                              Provides a list of images in the current project, as :class:`G2Image` objects
     97
     98:meth:`G2Project.pdfs`                                Provides a list of PDFs in the current project, as :class:`G2PDF` objects
     99
     100:meth:`G2Project.seqref`                              Returns a :class:`G2SeqRefRes` object if there are Sequential Refinement results
     101
     102:meth:`G2Project.do_refinements`                      This is passed a list of dictionaries, where each dict defines a refinement step.
     103                                                      Passing a list with a single empty dict initiates a refinement with the current
     104                                                      parameters and flags. A refinement dict sets up a single refinement step
     105                                                      (as described in :ref:`Project_dicts`). Also see :ref:`Refinement_recipe`.
     106
     107:meth:`G2Project.set_refinement`                      This is passed a single dict which is used to set parameters and flags.
     108                                                      These actions can be performed also in :meth:`G2Project.do_refinements`.
     109:meth:`G2Project.get_Variable`                        Retrieves the value and esd for a parameter
     110:meth:`G2Project.get_Covariance`                      Retrieves values and covariance for a set of refined parameters
     111:meth:`G2Project.set_Controls`                        Set overall GSAS-II control settings such as number of cycles and to set up a sequential
     112                                                      fit. (Also see :meth:`G2Project.get_Controls` to read values.)
     113:meth:`G2Project.imageMultiDistCalib`                 Performs a global calibration fit with images at multiple distance settings.
     114:meth:`G2Project.get_Constraints`                     Retrieves :ref:`constraint definition <Constraint_definitions_table>` entries.
     115:meth:`G2Project.add_HoldConstr`                      Adds a hold constraint on one or more variables
     116:meth:`G2Project.add_EquivConstr`                     Adds an equivalence constraint on two or more variables
     117:meth:`G2Project.add_EqnConstr`                       Adds an equation-type constraint on two or more variables
     118:meth:`G2Project.add_NewVarConstr`                    Adds an new variable as a constraint on two or more variables
     119==================================================    ===============================================================================================================
     120
     121Class :class:`G2Phase`
     122---------------------------------
     123
     124
     125  Another common object in GSASIIscriptable scripts is :class:`G2Phase`, used to encapsulate each phase in a project, with commonly used methods:
     126
     127.. tabularcolumns:: |l|p{3.5in}|
     128
     129==================================================    ===============================================================================================================
     130method                                                Use
     131==================================================    ===============================================================================================================
     132:meth:`G2Phase.set_refinements`                       Provides a mechanism to set values and refinement flags for the phase. See :ref:`Phase_parameters_table`
     133                                                      for more details. This information also can be supplied within a call to :meth:`G2Project.do_refinements`
     134                                                      or :meth:`G2Project.set_refinement`.
     135:meth:`G2Phase.clear_refinements`                     Unsets refinement flags for the phase.
     136:meth:`G2Phase.set_HAP_refinements`                   Provides a mechanism to set values and refinement flags for parameters specific to both this phase and
     137                                                      one of its histograms. See :ref:`HAP_parameters_table`. This information also can be supplied within
     138                                                      a call to :meth:`G2Project.do_refinements` or :meth:`G2Project.set_refinement`.
     139:meth:`G2Phase.clear_HAP_refinements`                 Clears refinement flags specific to both this phase and one of its histograms.
     140:meth:`G2Phase.getHAPvalues`                          Returns values of parameters specific to both this phase and one of its histograms.
     141:meth:`G2Phase.copyHAPvalues`                         Copies HAP settings between from one phase/histogram and to other histograms in same phase.
     142:meth:`G2Phase.atoms`                                 Returns a list of atoms in the phase
     143:meth:`G2Phase.atom`                                  Returns an atom from its label
     144:meth:`G2Phase.histograms`                            Returns a list of histograms linked to the phase
     145:meth:`G2Phase.get_cell`                              Returns unit cell parameters (also see :meth:`G2Phase.get_cell_and_esd`)
     146:meth:`G2Phase.export_CIF`                            Writes a CIF for the phase
     147:meth:`G2Phase.setSampleProfile`                      Sets sample broadening parameters
     148:meth:`G2Phase.clearDistRestraint`                    Clears any previously defined bond distance restraint(s) for the selected phase
     149:meth:`G2Phase.addDistRestraint`                      Finds and defines new bond distance restraint(s) for the selected phase
     150:meth:`G2Phase.setDistRestraintWeight`                Sets the weighting factor for the bond distance restraints
     151
     152==================================================    ===============================================================================================================
     153
     154Class :class:`G2PwdrData`
     155---------------------------------
     156
     157  Another common object in GSASIIscriptable scripts is :class:`G2PwdrData`, which encapsulate each powder diffraction histogram in a project, with commonly used methods:
     158
     159.. tabularcolumns:: |l|p{3.5in}|
     160
     161==================================================    ===============================================================================================================
     162method                                                Use
     163==================================================    ===============================================================================================================
     164:meth:`G2PwdrData.set_refinements`                    Provides a mechanism to set values and refinement flags for the powder histogram. See
     165                                                      :ref:`Histogram_parameters_table` for details. 
     166:meth:`G2PwdrData.clear_refinements`                  Unsets refinement flags for the the powder histogram.
     167:meth:`G2PwdrData.residuals`                          Reports R-factors etc. for the the powder histogram (also see :meth:`G2PwdrData.get_wR`)
     168:meth:`G2PwdrData.add_back_peak`                      Adds a background peak to the histogram. Also see :meth:`G2PwdrData.del_back_peak` and
     169                                                      :meth:`G2PwdrData.ref_back_peak`.
     170:meth:`G2PwdrData.fit_fixed_points`                   Fits background to the specified fixed points.
     171:meth:`G2PwdrData.getdata`                            Provides access to the diffraction data associated with the histogram.
     172:meth:`G2PwdrData.reflections`                        Provides access to the reflection lists for the histogram.
     173:meth:`G2PwdrData.Export`                             Writes the diffraction data or reflection list into a file
     174:meth:`G2PwdrData.add_peak`                           Adds a peak to the peak list. Also see :ref:`PeakRefine`.
     175:meth:`G2PwdrData.set_peakFlags`                      Sets refinement flags for peaks
     176:meth:`G2PwdrData.refine_peaks`                       Starts a peak/background fitting cycle, returns refinement results
     177:attr:`G2PwdrData.Peaks`                              Provides access to the peak list data structure
     178:attr:`G2PwdrData.PeakList`                           Provides the peak list parameter values
     179:meth:`G2PwdrData.Export_peaks`                       Writes the peak parameters to a text file
     180:meth:`G2PwdrData.set_background`                     Sets a background histogram that will be subtracted (point by point) from the current histogram.
     181==================================================    ===============================================================================================================
     182
     183Class :class:`G2Image`
     184---------------------------------
     185
     186  When working with images, there will be a :class:`G2Image` object for each image (also see :meth:`G2Project.add_image`  and :meth:`G2Project.images`).
     187
     188.. tabularcolumns:: |l|p{3.5in}|
     189
     190==================================================    ===============================================================================================================
     191method                                                Use
     192==================================================    ===============================================================================================================
     193:meth:`G2Image.Recalibrate`                           Invokes a recalibration fit starting from the current Image Controls calibration coefficients.
     194:meth:`G2Image.Integrate`                             Invokes an image integration All parameters Image Controls will have previously been set.
     195:meth:`G2Image.setControl`                            Set an Image Controls parameter in the current image.
     196:meth:`G2Image.getControl`                            Return an Image Controls parameter in the current image.
     197:meth:`G2Image.findControl`                           Get the names of Image Controls parameters.
     198:meth:`G2Image.loadControls`                          Load controls from a .imctrl file (also see :meth:`G2Image.saveControls`).
     199:meth:`G2Image.loadMasks`                             Load masks from a .immask file.
     200:meth:`G2Image.setVary`                               Set a refinement flag for Image Controls parameter in the current image. (Also see :meth:`G2Image.getVary`)
     201:meth:`G2Image.setCalibrant`                          Set a calibrant type (or show choices) for the current image.
     202:meth:`G2Image.setControlFile`                        Set a image to be used as a background/dark/gain map image.
     203==================================================    ===============================================================================================================
     204
     205
     206Class :class:`G2PDF`
     207---------------------------------
     208
     209  To work with PDF entries, object :class:`G2PDF`, encapsulates a PDF entry with methods:
     210
     211.. tabularcolumns:: |l|p{3.5in}|
     212
     213==================================================    ===============================================================================================================
     214method                                                Use
     215==================================================    ===============================================================================================================
     216:meth:`G2PDF.export`                                   Used to write G(r), etc. as a file
     217:meth:`G2PDF.calculate`                                Computes the PDF using parameters in the object
     218:meth:`G2PDF.optimize`                                 Optimizes selected PDF parameters
     219:meth:`G2PDF.set_background`                           Sets the histograms used for sample background, container, etc.
     220:meth:`G2PDF.set_formula`                              Sets the chemical formula for the sample
     221==================================================    ===============================================================================================================
     222
     223Class :class:`G2SeqRefRes`
     224---------------------------------
     225
     226  To work with Sequential Refinement results, object :class:`G2SeqRefRes`, encapsulates the sequential refinement table with methods:
     227
     228.. tabularcolumns:: |l|p{3.5in}|
     229
     230==================================================    ===============================================================================================================
     231method                                                Use
     232==================================================    ===============================================================================================================
     233:meth:`G2SeqRefRes.histograms`                         Provides a list of histograms used in the Sequential Refinement
     234:meth:`G2SeqRefRes.get_cell_and_esd`                   Returns cell dimensions and standard uncertainies for a phase and histogram from the Sequential Refinement
     235:meth:`G2SeqRefRes.get_Variable`                       Retrieves the value and esd for a parameter from a particular histogram in the Sequential Refinement
     236:meth:`G2SeqRefRes.get_Covariance`                     Retrieves values and covariance for a set of refined parameters for a particular histogram
     237==================================================    ===============================================================================================================
     238
     239Class :class:`G2AtomRecord`
     240---------------------------------
     241
     242  When working with phases, :class:`G2AtomRecord` objects provide access to the contents of each atom in a phase. This provides access to "properties" that can be
     243  used to get values of much of the atoms associated settings: label, type, refinement_flags, coordinates, occupancy, ranId, adp_flag, and uiso. In addition,
     244  refinement_flags, occupancy and uiso can be used to set values. See the :class:`G2AtomRecord` docs and source code.
     245
     246.. _Refinement_dicts:
     247
     248
     249Refinement parameters
     250=====================
     251While scripts can be written that setup refinements by changing individual parameters
     252through calls to the methods associated with objects that wrap each data tree item,
     253many of these actions can be combined into fairly complex dict structures to conduct refinement
     254steps. Use of these dicts is required with the :ref:`CommandlineInterface`. This section of the
     255documentation describes these dicts.
     256
     257.. _Project_dicts:
     258
     259Project-level Parameter Dict
     260-----------------------------
     261
     262As noted below (:ref:`Refinement_parameters_kinds`), there are three types of refinement parameters,
     263which can be accessed individually by the objects that encapsulate individual phases and histograms
     264but it will often be simplest to create a composite dictionary
     265that is used at the project-level. A dict is created with keys
     266"set" and "clear" that can be supplied to :meth:`G2Project.set_refinement`
     267(or :meth:`G2Project.do_refinements`, see :ref:`Refinement_recipe` below) that will
     268determine parameter values and will determine which parameters will be refined.
     269
     270The specific keys and subkeys that can be used are defined in tables
     271:ref:`Histogram_parameters_table`, :ref:`Phase_parameters_table` and :ref:`HAP_parameters_table`.
     272
     273Note that optionally a list of histograms and/or phases can be supplied in the call to
     274:meth:`G2Project.set_refinement`, but if not specified, the default is to use all defined
     275phases and histograms.
     276
     277As an example:
     278
     279.. code-block::  python
     280
     281    pardict = {'set': { 'Limits': [0.8, 12.0],
     282                       'Sample Parameters': ['Absorption', 'Contrast', 'DisplaceX'],
     283                       'Background': {'type': 'chebyschev-1', 'refine': True,
     284                                      'peaks':[[0,True],[1,1,1]] }},
     285              'clear': {'Instrument Parameters': ['U', 'V', 'W']}}
     286    my_project.set_refinement(pardict)
     287
     288.. _Refinement_recipe:
     289
     290Refinement recipe
     291------------------------
     292
     293Building on the :ref:`Project_dicts`,
     294it is possible to specify a sequence of refinement actions as a list of
     295these dicts and supplying this list
     296as an argument to :meth:`G2Project.do_refinements`.
     297
     298As an example, this code performs the same actions as in the example in the section above:
     299
     300.. code-block::  python
     301
     302    pardict = {'set': { 'Limits': [0.8, 12.0],
     303                       'Sample Parameters': ['Absorption', 'Contrast', 'DisplaceX'],
     304                       'Background': {'type': 'chebyschev-1', 'refine': True}},
     305              'clear': {'Instrument Parameters': ['U', 'V', 'W']}}
     306    my_project.do_refinements([pardict])
     307
     308However, in addition to setting a number of parameters, this example will perform a refinement as well,
     309after setting the parameters. More than one refinement can be performed by including more
     310than one dict in the list.
     311
     312In this example, two refinement steps will be performed:
     313
     314.. code-block::  python
     315
     316    my_project.do_refinements([pardict,pardict1])
     317
     318
     319The keys defined in the following table
     320may be used in a dict supplied to :meth:`G2Project.do_refinements`. Note that keys ``histograms``
     321and ``phases`` are used to limit actions to specific sets of parameters within the project.
     322
     323.. tabularcolumns:: |l|p{4in}|
     324
     325========== ============================================================================
     326key         explanation
     327========== ============================================================================
     328set                    Specifies a dict with keys and subkeys as described in the
     329                       :ref:`Refinement_parameters_fmt` section. Items listed here
     330                       will be set to be refined.
     331clear                  Specifies a dict, as above for set, except that parameters are
     332                       cleared and thus will not be refined.
     333once                   Specifies a dict as above for set, except that parameters are
     334                       set for the next cycle of refinement and are cleared once the
     335                       refinement step is completed.
     336skip                   Normally, once parameters are processed with a set/clear/once
     337                       action(s), a refinement is started. If skip is defined as True
     338                       (or any other value) the refinement step is not performed.
     339output                 If a file name is specified for output is will be used to save
     340                       the current refinement.
     341histograms             Should contain a list of histogram(s) to be used for the
     342                       set/clear/once action(s) on :ref:`Histogram_parameters_table` or
     343                       :ref:`HAP_parameters_table`. Note that this will be
     344                       ignored for :ref:`Phase_parameters_table`. Histograms may be
     345                       specified as a list of strings [('PWDR ...'),...], indices
     346                       [0,1,2] or as list of objects [hist1, hist2].
     347phases                 Should contain a list of phase(s) to be used for the
     348                       set/clear/once action(s) on :ref:`Phase_parameters_table` or
     349                       :ref:`HAP_parameters_table`. Note that this will be
     350                       ignored for :ref:`Histogram_parameters_table`.
     351                       Phases may be specified as a list of strings
     352                       [('Phase name'),...], indices [0,1,2] or as list of objects
     353                       [phase0, phase2].
     354call                   Specifies a function to call after a refinement is completed.
     355                       The value supplied can be the object (typically a function)
     356                       that will be called or a string that will evaluate (in the
     357                       namespace inside :meth:`G2Project.iter_refinements` where
     358                       ``self`` references the project.)
     359                       Nothing is called if this is not specified.
     360callargs               Provides a list of arguments that will be passed to the function
     361                       in call (if any). If call is defined and callargs is not, the
     362                       current <tt>G2Project</tt> is passed as a single argument.
     363========== ============================================================================
     364
     365An example that performs a series of refinement steps follows:
     366
     367.. code-block::  python
     368
     369    reflist = [
     370            {"set": { "Limits": { "low": 0.7 },
     371                      "Background": { "no. coeffs": 3,
     372                                      "refine": True }}},
     373            {"set": { "LeBail": True,
     374                      "Cell": True }},
     375            {"set": { "Sample Parameters": ["DisplaceX"]}},
     376            {"set": { "Instrument Parameters": ["U", "V", "W", "X", "Y"]}},
     377            {"set": { "Mustrain": { "type": "uniaxial",
     378                                    "refine": "equatorial",
     379                                    "direction": [0, 0, 1]}}},
     380            {"set": { "Mustrain": { "type": "uniaxial",
     381                                    "refine": "axial"}}},
     382            {"clear": { "LeBail": True},
     383             "set": { "Atoms": { "Mn": "X" }}},
     384            {"set": { "Atoms": { "O1": "X", "O2": "X" }}},]
     385    my_project.do_refinements(reflist)
     386
     387
     388In this example, a separate refinement step will be performed for each dict in the list. The keyword
     389"skip" can be used to specify a dict that should not include a refinement.
     390Note that in the second from last refinement step, parameters are both set and cleared.
     391
     392.. _Refinement_parameters_kinds:
     393
     394Refinement parameter types
     395----------------------------
     396
     397Note that parameters and refinement flags used in GSAS-II fall into three classes:
     398
     399    * **Histogram**: There will be a set of these for each dataset loaded into a
     400      project file. The parameters available depend on the type of histogram
     401      (Bragg-Brentano, Single-Crystal, TOF,...). Typical Histogram parameters
     402      include the overall scale factor, background, instrument and sample parameters;
     403      see the :ref:`Histogram_parameters_table` table for a list of the histogram
     404      parameters where access has been provided.
     405
     406    * **Phase**: There will be a set of these for each phase loaded into a
     407      project file. While some parameters are found in all types of phases,
     408      others are only found in certain types (modulated, magnetic, protein...).
     409      Typical phase parameters include unit cell lengths and atomic positions; see the
     410      :ref:`Phase_parameters_table` table for a list of the phase     
     411      parameters where access has been provided.
     412
     413    * **Histogram-and-phase** (HAP): There is a set of these for every histogram
     414      that is associated with each phase, so that if there are ``N`` phases and ``M``
     415      histograms, there can be ``N*M`` total sets of "HAP" parameters sets (fewer if all
     416      histograms are not linked to all phases.) Typical HAP parameters include the
     417      phase fractions, sample microstrain and crystallite size broadening terms,
     418      hydrostatic strain perturbations of the unit cell and preferred orientation
     419      values.
     420      See the :ref:`HAP_parameters_table` table for the HAP parameters where access has
     421      been provided.
     422
     423.. _Refinement_parameters_fmt:
     424
     425
     426Specifying Refinement Parameters
     427=================================
     428
     429Refinement parameter values and flags to turn refinement on and off are specified within dictionaries,
     430where the details of these dicts are organized depends on the
     431type of parameter (see :ref:`Refinement_parameters_kinds`), with a different set
     432of keys (as described below) for each of the three types of parameters.
     433
     434.. _Histogram_parameters_table:
     435
     436Histogram parameters
     437--------------------
     438
     439This table describes the dictionaries supplied to :func:`G2PwdrData.set_refinements`
     440and :func:`G2PwdrData.clear_refinements`. As an example,
     441
     442.. code-block::  python
     443
     444   hist.set_refinements({"Background": {"no.coeffs": 3, "refine": True},
     445                         "Sample Parameters": ["Scale"],
     446                         "Limits": [10000, 40000]})
     447
     448With :meth:`G2Project.do_refinements`, these parameters should be placed inside a dict with a key
     449``set``, ``clear``, or ``once``. Values will be set for all histograms, unless the ``histograms``
     450key is used to define specific histograms. As an example:
     451
     452.. code-block::  python
     453
     454  gsas_proj.do_refinements([
     455      {'set': {
     456          'Background': {'no.coeffs': 3, 'refine': True},
     457          'Sample Parameters': ['Scale'],
     458          'Limits': [10000, 40000]},
     459      'histograms': [1,2]}
     460                            ])
     461
     462Note that below in the Instrument Parameters section,
     463related profile parameters (such as U and V) are grouped together but
     464separated by commas to save space in the table.
     465
     466.. tabularcolumns:: |l|l|p{3.5in}|
     467
     468===================== ====================  =================================================
     469key                   subkey                explanation
     470===================== ====================  =================================================
     471Limits                                      The range of 2-theta (degrees) or TOF (in
     472                                            microsec) range of values to use. Can
     473                                            be either a dictionary of 'low' and/or 'high',
     474                                            or a list of 2 items [low, high]
     475\                     low                   Sets the low limit
     476\                     high                  Sets the high limit
     477
     478Sample Parameters                           Should be provided as a **list** of subkeys
     479                                            to set or clear,\e.g. ['DisplaceX', 'Scale']
     480\                     Absorption
     481\                     Contrast
     482\                     DisplaceX             Sample displacement along the X direction
     483\                     DisplaceY             Sample displacement along the Y direction
     484\                     Scale                 Histogram Scale factor
     485
     486Background                                  Sample background. Value will be a dict or
     487                                            a boolean. If True or False, the refine
     488                                            parameter for background is set to that.
     489                                            Note that background peaks are not handled
     490                                            via this; see
     491                                            :meth:`G2PwdrData.ref_back_peak` instead.
     492                                            When value is a dict,
     493                                            supply any of the following keys:
     494\                     type                  The background model, e.g. 'chebyschev-1'
     495\                     refine                The value of the refine flag, boolean
     496\                     'no. coeffs'          Number of coefficients to use, integer
     497\                     coeffs                List of floats, literal values for background
     498\                     FixedPoints           List of (2-theta, intensity) values for fixed points
     499\                     'fit fixed points'    If True, triggers a fit to the fixed points to
     500                                            be calculated. It is calculated when this key is
     501                                            detected, regardless of calls to refine.
     502\                     peaks                 Specifies a set of flags for refining
     503                                            background peaks as a nested list. There may
     504                                            be an item for each defined background peak
     505                                            (or fewer) and each item is a list with the flag
     506                                            values for pos,int,sig & gam (fewer than 4 values
     507                                            are allowed).
     508
     509Instrument Parameters                       As in Sample Paramters, provide as a **list** of
     510                                            subkeys to
     511                                            set or clear, e.g. ['X', 'Y', 'Zero', 'SH/L']
     512\                     U, V, W               Gaussian peak profile terms
     513\                     X, Y, Z               Lorentzian peak profile terms
     514\                     alpha, beta-0,        TOF profile terms
     515                      beta-1, beta-q,
     516\                     sig-0, sig-1,         TOF profile terms
     517                      sig-2, sig-q
     518\                     difA, difB, difC      TOF Calibration constants
     519\                     Zero                  Zero shift
     520\                     SH/L                  Finger-Cox-Jephcoat low-angle peak asymmetry
     521\                     Polariz.              Polarization parameter
     522\                     Lam                   Lambda, the incident wavelength
     523===================== ====================  =================================================
     524
     525.. _Phase_parameters_table:
     526
     527Phase parameters
     528----------------
     529
     530This table describes the dictionaries supplied to :func:`G2Phase.set_refinements`
     531and :func:`G2Phase.clear_refinements`. With :meth:`G2Project.do_refinements`,
     532these parameters should be placed inside a dict with a key
     533``set``, ``clear``, or ``once``. Values will be set for all phases, unless the ``phases``
     534key is used to define specific phase(s).
     535
     536
     537.. tabularcolumns:: |l|p{4.5in}|
     538
     539======= ==========================================================
     540key                   explanation
     541======= ==========================================================
     542Cell                  Whether or not to refine the unit cell.
     543Atoms                 Dictionary of atoms and refinement flags.
     544                      Each key should be an atom label, e.g.
     545                      'O3', 'Mn5', and each value should be
     546                      a string defining what values to refine.
     547                      Values can be any combination of 'F'
     548                      for site fraction, 'X' for position,
     549                      and 'U' for Debye-Waller factor
     550LeBail                Enables LeBail intensity extraction.
     551======= ==========================================================
     552
     553
     554.. _HAP_parameters_table:
     555
     556
     557Histogram-and-phase parameters
     558------------------------------
     559
     560This table describes the dictionaries supplied to :func:`G2Phase.set_HAP_refinements`
     561and :func:`G2Phase.clear_HAP_refinements`. When supplied to
     562:meth:`G2Project.do_refinements`, these parameters should be placed inside a dict with a key
     563``set``, ``clear``, or ``once``. Values will be set for all histograms used in each phase,
     564unless the ``histograms`` and ``phases`` keys are used to define specific phases and histograms.
     565
     566.. tabularcolumns:: |l|l|p{3.5in}|
     567
     568=============  ==========  ============================================================
     569key             subkey                 explanation
     570=============  ==========  ============================================================
     571Babinet                                Should be a **list** of the following
     572                                       subkeys. If not, assumes both
     573                                       BabA and BabU
     574\              BabA
     575\              BabU
     576Extinction                             Boolean, True to refine.
     577HStrain                                Boolean or list/tuple, True to refine all
     578                                       appropriate D\ :sub:`ij` terms or False
     579                                       to not refine any. If a list/tuple, will
     580                                       be a set of True & False values for each
     581                                       D\ :sub:`ij` term; number of items must
     582                                       match number of terms.
     583Mustrain
     584\              type                   Mustrain model. One of 'isotropic',
     585                                       'uniaxial', or 'generalized'. **Should always
     586                                       be included when Mustrain is used.**
     587\              direction              For uniaxial only. A list of three
     588                                       integers,
     589                                       the [hkl] direction of the axis.
     590\              refine                 Usually boolean, set to True to refine.
     591                                       or False to clear.
     592                                       For uniaxial model, can specify a value
     593                                       of 'axial' or 'equatorial' to set that flag
     594                                       to True or a single
     595                                       boolean sets both axial and equatorial.
     596Size                                   
     597\              type                   Size broadening model. One of 'isotropic',
     598                                       'uniaxial', or 'ellipsoid'. **Should always
     599                                       be specified when Size is used.**
     600\              direction              For uniaxial only. A list of three
     601                                       integers,
     602                                       the [hkl] direction of the axis.
     603\              refine                 Boolean, True to refine.
     604\              value                  float, size value in microns
     605Pref.Ori.                              Boolean, True to refine
     606Show                                   Boolean, True to refine
     607Use                                    Boolean, True to refine
     608Scale                                  Phase fraction; Boolean, True to refine
     609=============  ==========  ============================================================
     610
     611Histogram/Phase objects
     612------------------------
     613Each phase and powder histogram in a :class:`G2Project` object has an associated
     614object. Parameters within each individual object can be turned on and off by calling
     615:meth:`G2PwdrData.set_refinements` or :meth:`G2PwdrData.clear_refinements`
     616for histogram parameters;
     617:meth:`G2Phase.set_refinements` or :meth:`G2Phase.clear_refinements`
     618for phase parameters; and :meth:`G2Phase.set_HAP_refinements` or
     619:meth:`G2Phase.clear_HAP_refinements`. As an example, if some_histogram is a histogram object (of type :class:`G2PwdrData`), use this to set parameters in that histogram:
     620
     621.. code-block::  python
     622
     623    params = { 'Limits': [0.8, 12.0],
     624               'Sample Parameters': ['Absorption', 'Contrast', 'DisplaceX'],
     625               'Background': {'type': 'chebyschev-1', 'refine': True}}
     626    some_histogram.set_refinements(params)
     627
     628Likewise to turn refinement flags on, use code such as this:
     629
     630.. code-block::  python
     631
     632    params = { 'Instrument Parameters': ['U', 'V', 'W']}
     633    some_histogram.set_refinements(params)
     634
     635and to turn these refinement flags, off use this (Note that the
     636``.clear_refinements()`` methods will usually will turn off refinement even
     637if a refinement parameter is set in the dict to True.):
     638
     639.. code-block::  python
     640
     641    params = { 'Instrument Parameters': ['U', 'V', 'W']}
     642    some_histogram.clear_refinements(params)
     643
     644For phase parameters, use code such as this:
     645
     646.. code-block::  python
     647
     648    params = { 'LeBail': True, 'Cell': True,
     649               'Atoms': { 'Mn1': 'X',
     650                          'O3': 'XU',
     651                          'V4': 'FXU'}}
     652    some_histogram.set_refinements(params)
     653
     654and here is an example for HAP parameters:
     655
     656.. code-block::  python
     657
     658    params = { 'Babinet': 'BabA',
     659               'Extinction': True,
     660               'Mustrain': { 'type': 'uniaxial',
     661                             'direction': [0, 0, 1],
     662                             'refine': True}}
     663    some_phase.set_HAP_refinements(params)
     664
     665Note that the parameters must match the object type and method (phase vs. histogram vs. HAP).
     666
     667.. _AccessingOtherItems:
     668
     669Access to other parameter settings
     670===================================
     671
     672There are several hundred different types of values that can be stored in a
     673GSAS-II project (.gpx) file. All can be changed from the GUI but only a
     674subset have direct mechanism implemented for change from the GSASIIscriptable
     675API. In practice all parameters in a .gpx file can be edited via scripting,
     676but sometimes determining what should be set to implement a parameter
     677change can be complex.
     678Several routines, :meth:`G2Phase.getHAPentryList`,
     679:meth:`G2Phase.getPhaseEntryList` and :meth:`G2PwdrData.getHistEntryList`
     680(and their related get...Value and set.Value entries),
     681provide a mechanism to discover what the GUI is changing inside a .gpx file.
     682
     683As an example, a user in changing the data type for a histogram from Debye-Scherrer
     684mode to Bragg-Brentano. This capability is not directly exposed in the API. To
     685find out what changes when the histogram type is changed we can create a short script
     686that displays the contents of all the histogram settings:
     687
     688.. code-block::  python
     689
     690    from __future__ import division, print_function
     691    import os,sys
     692    sys.path.insert(0,'/Users/toby/software/G2/GSASII')
     693    import GSASIIscriptable as G2sc
     694    gpx = G2sc.G2Project('/tmp/test.gpx')
     695    h = gpx.histograms()[0]
     696    for h in h.getHistEntryList():
     697        print(h)
     698
     699This can be run with a command like this::
     700
     701       python test.py > before.txt
     702
     703(This will create file ``before.txt``, which will contain hundreds of lines.)
     704
     705At this point open the project file, ``test.gpx`` in the GSAS-II GUI and
     706change in Histogram/Sample Parameters the diffractometer type from Debye-Scherrer
     707mode to Bragg-Brentano and then save the file.
     708
     709Rerun the previous script creating a new file::
     710
     711       python test.py > after.txt
     712
     713Finally look for the differences between files ``before.txt`` and ``after.txt`` using a tool
     714such as diff (on Linux/OS X) or fc (in Windows).
     715
     716in Windows::
     717
     718    Z:\>fc before.txt after.txt
     719    Comparing files before.txt and after.txt
     720    ***** before.txt
     721           fill_value = 1e+20)
     722    , 'PWDR Co_PCP_Act_d900-00030.fxye Bank 1', 'PWDR Co_PCP_Act_d900-00030.fxye Ban
     723    k 1'])
     724    (['Comments'], <class 'list'>, ['Co_PCP_Act_d900-00030.tif #0001 Azm= 180.00'])
     725    ***** AFTER.TXT
     726           fill_value = 1e+20)
     727    , 'PWDR Co_PCP_Act_d900-00030.fxye Bank 1', 'PWDR Co_PCP_Act_d900-00030.fxye Ban
     728    k 1', 'PWDR Co_PCP_Act_d900-00030.fxye Bank 1']
     729
     730    (['Comments'], <class 'list'>, ['Co_PCP_Act_d900-00030.tif #0001 Azm= 180.00'])
     731    *****
     732
     733    ***** before.txt
     734    (['Sample Parameters', 'Scale'], <class 'list'>, [1.276313196832068, True])
     735    (['Sample Parameters', 'Type'], <class 'str'>, 'Debye-Scherrer')
     736    (['Sample Parameters', 'Absorption'], <class 'list'>, [0.0, False])
     737    ***** AFTER.TXT
     738    (['Sample Parameters', 'Scale'], <class 'list'>, [1.276313196832068, True])
     739    (['Sample Parameters', 'Type'], <class 'str'>, 'Bragg-Brentano')
     740    (['Sample Parameters', 'Absorption'], <class 'list'>, [0.0, False])
     741    *****
     742
     743in Linux/Mac::
     744
     745    bht14: toby$ diff before.txt after.txt
     746    103c103
     747    < , 'PWDR Co_PCP_Act_d900-00030.fxye Bank 1', 'PWDR Co_PCP_Act_d900-00030.fxye Bank 1'])
     748    ---
     749    > , 'PWDR Co_PCP_Act_d900-00030.fxye Bank 1', 'PWDR Co_PCP_Act_d900-00030.fxye Bank 1', 'PWDR Co_PCP_Act_d900-00030.fxye Bank 1'])
     750    111c111
     751    < (['Sample Parameters', 'Type'], <class 'str'>, 'Debye-Scherrer')
     752    ---
     753    > (['Sample Parameters', 'Type'], <class 'str'>, 'Bragg-Brentano')
     754
     755From this we can see there are two changes that took place. One is fairly obscure,
     756where the histogram name is added to a list, which can be ignored, but the second change
     757occurs in a straight-forward way and we discover that a simple call::
     758
     759    h.setHistEntryValue(['Sample Parameters', 'Type'], 'Bragg-Brentano')
     760
     761can be used to change the histogram type.
     762
     763.. _CodeExamples:
     764
     765Code Examples
     766=================================
     767
     768.. _PeakRefine:
     769
     770Peak Fitting
     771--------------------
     772
     773Peak refinement is performed with routines
     774:meth:`G2PwdrData.add_peak`, :meth:`G2PwdrData.set_peakFlags` and
     775:meth:`G2PwdrData.refine_peaks`. Method :meth:`G2PwdrData.Export_peaks` and
     776properties :attr:`G2PwdrData.Peaks` and :attr:`G2PwdrData.PeakList`
     777provide ways to access the results. Note that when peak parameters are
     778refined with :meth:`~G2PwdrData.refine_peaks`, the background may also
     779be refined. Use :meth:`G2PwdrData.set_refinements` to change background
     780settings and the range of data used in the fit. See below for an example
     781peak refinement script, where the data files are taken from the
     782"Rietveld refinement with CuKa lab Bragg-Brentano powder data" tutorial
     783(in https://subversion.xray.aps.anl.gov/pyGSAS/Tutorials/LabData/data/).
     784
     785.. code-block::  python
     786
     787    from __future__ import division, print_function
     788    import os,sys
     789    sys.path.insert(0,'/Users/toby/software/G2/GSASII') # needed to "find" GSAS-II modules
     790    import GSASIIscriptable as G2sc
     791    datadir = os.path.expanduser("~/Scratch/peakfit")
     792    PathWrap = lambda fil: os.path.join(datadir,fil)
     793    gpx = G2sc.G2Project(newgpx=PathWrap('pkfit.gpx'))
     794    hist = gpx.add_powder_histogram(PathWrap('FAP.XRA'), PathWrap('INST_XRY.PRM'),
     795                                    fmthint='GSAS powder')
     796    hist.set_refinements({'Limits': [16.,24.],
     797          'Background': {"no. coeffs": 2,'type': 'chebyschev-1', 'refine': True}
     798                         })
     799    peak1 = hist.add_peak(1, ttheta=16.8)
     800    peak2 = hist.add_peak(1, ttheta=18.9)
     801    peak3 = hist.add_peak(1, ttheta=21.8)
     802    peak4 = hist.add_peak(1, ttheta=22.9)
     803    hist.set_peakFlags(area=True)
     804    hist.refine_peaks()
     805    hist.set_peakFlags(area=True,pos=True)
     806    hist.refine_peaks()
     807    hist.set_peakFlags(area=True, pos=True, sig=True, gam=True)
     808    res = hist.refine_peaks()
     809    print('peak positions: ',[i[0] for i in hist.PeakList])
     810    for i in range(len(hist.Peaks['peaks'])):
     811        print('peak',i,'pos=',hist.Peaks['peaks'][i][0],'sig=',hist.Peaks['sigDict']['pos'+str(i)])
     812    hist.Export_peaks('pkfit.txt')
     813    #gpx.save()  # gpx file is not written without this
     814
     815Pattern Simulation
     816-----------------------
     817
     818This shows two examples where a structure is read from a CIF, a
     819pattern is computed using a instrument parameter file to specify the
     820probe type (neutrons here) and wavelength.
     821
     822The first example uses a CW neutron instrument parameter file.
     823The pattern is computed over a 2Ξ range of 5 to 120 degrees
     824with 1000 points.
     825The pattern and reflection list are written into files.
     826Data files are found in the
     827`Scripting Tutorial <https://subversion.xray.aps.anl.gov/pyGSAS/Tutorials/PythonScript/data/>`_.
     828
     829.. code-block::  python
     830
     831    import os,sys
     832    sys.path.insert(0,'/Users/toby/software/G2/GSASII')
     833    import GSASIIscriptable as G2sc
     834    datadir = "/Users/toby/software/G2/Tutorials/PythonScript/data"
     835    PathWrap = lambda fil: os.path.join(datadir,fil)
     836    gpx = G2sc.G2Project(newgpx='PbSO4sim.gpx') # create a project   
     837    phase0 = gpx.add_phase(PathWrap("PbSO4-Wyckoff.cif"),
     838             phasename="PbSO4",fmthint='CIF') # add a phase to the project
     839    # add a simulated histogram and link it to the previous phase(s)
     840    hist1 = gpx.add_simulated_powder_histogram("PbSO4 simulation",
     841                PathWrap("inst_d1a.prm"),5.,120.,Npoints=1000,
     842                phases=gpx.phases(),scale=500000.)
     843    gpx.do_refinements()   # calculate pattern
     844    gpx.save()
     845    # save results
     846    gpx.histogram(0).Export('PbSO4data','.csv','hist') # data
     847    gpx.histogram(0).Export('PbSO4refl','.csv','refl') # reflections
     848
     849This example uses bank#2 from a TOF neutron instrument parameter file.
     850The pattern is computed over a TOF range of 14 to 35 milliseconds with
     851the default of 2500 points.
     852This uses the same CIF as in the example before, but the instrument is found in the 
     853`TOF-CW Joint Refinement Tutorial <https://subversion.xray.aps.anl.gov/pyGSAS/Tutorials/TOF-CW Joint Refinement/data>`_
     854tutorial.
     855
     856.. code-block::  python
     857
     858    import os,sys
     859    sys.path.insert(0,'/Users/toby/software/G2/GSASII')
     860    import GSASIIscriptable as G2sc
     861    cifdir = "/Users/toby/software/G2/Tutorials/PythonScript/data"
     862    datadir = "/Users/toby/software/G2/Tutorials/TOF-CW Joint Refinement/data"
     863    gpx = G2sc.G2Project(newgpx='/tmp/PbSO4simT.gpx') # create a project
     864    phase0 = gpx.add_phase(os.path.join(cifdir,"PbSO4-Wyckoff.cif"),
     865             phasename="PbSO4",fmthint='CIF') # add a phase to the project
     866    hist1 = gpx.add_simulated_powder_histogram("PbSO4 simulation",
     867                os.path.join(datadir,"POWGEN_1066.instprm"),14.,35.,
     868                phases=gpx.phases(),ibank=2)
     869    gpx.do_refinements([{}])
     870    gpx.save()
     871
     872Simple Refinement
     873----------------------
     874
     875GSASIIscriptable can be used to setup and perform simple refinements.
     876This example reads in an existing project (.gpx) file, adds a background
     877peak, changes some refinement flags and performs a refinement.
     878
     879.. code-block::  python
     880
     881    from __future__ import division, print_function
     882    import os,sys
     883    sys.path.insert(0,'/Users/toby/software/G2/GSASII') # needed to "find" GSAS-II modules
     884    import GSASIIscriptable as G2sc
     885    datadir = "/Users/Scratch/"
     886    gpx = G2sc.G2Project(os.path.join(datadir,'test2.gpx'))
     887    gpx.histogram(0).add_back_peak(4.5,30000,5000,0)
     888    pardict = {'set': {'Sample Parameters': ['Absorption', 'Contrast', 'DisplaceX'],
     889                       'Background': {'type': 'chebyschev-1', 'refine': True,
     890                                      'peaks':[[0,True]]}}}
     891    gpx.set_refinement(pardict)
     892
     893Sequential Refinement
     894----------------------
     895
     896GSASIIscriptable can be used to setup and perform sequential refinements. This example script
     897is used to take the single-dataset fit at the end of Step 1 of the
     898`Sequential Refinement tutorial <https://subversion.xray.aps.anl.gov/pyGSAS/Tutorials/SeqRefine/SequentialTutorial.htm>`_
     899and turn on and off refinement flags, add histograms and setup the sequential fit, which is then run:
     900
     901.. code-block::  python
     902
     903    import os,sys,glob
     904    sys.path.insert(0,'/Users/toby/software/G2/GSASII')
     905    import GSASIIscriptable as G2sc
     906    datadir = os.path.expanduser("~/Scratch/SeqTut2019Mar")
     907    PathWrap = lambda fil: os.path.join(datadir,fil)
     908    # load and rename project
     909    gpx = G2sc.G2Project(PathWrap('7Konly.gpx'))
     910    gpx.save(PathWrap('SeqRef.gpx'))
     911    # turn off some variables; turn on Dijs
     912    for p in gpx.phases():
     913        p.set_refinements({"Cell": False})
     914    gpx.phase(0).set_HAP_refinements(
     915        {'Scale': False,
     916         "Size": {'type':'isotropic', 'refine': False},
     917         "Mustrain": {'type':'uniaxial', 'refine': False},
     918         "HStrain":True,})
     919    gpx.phase(1).set_HAP_refinements({'Scale': False})
     920    gpx.histogram(0).clear_refinements({'Background':False,
     921                     'Sample Parameters':['DisplaceX'],})
     922    gpx.histogram(0).ref_back_peak(0,[])
     923    gpx.phase(1).set_HAP_refinements({"HStrain":(1,1,1,0)})
     924    for fil in sorted(glob.glob(PathWrap('*.fxye'))): # load in remaining fxye files
     925        if '00' in fil: continue
     926        gpx.add_powder_histogram(fil, PathWrap('OH_00.prm'), fmthint="GSAS powder",phases='all')
     927    # copy HAP values, background, instrument params. & limits, not sample params.
     928    gpx.copyHistParms(0,'all',['b','i','l'])
     929    for p in gpx.phases(): p.copyHAPvalues(0,'all')
     930    # setup and launch sequential fit
     931    gpx.set_Controls('sequential',gpx.histograms())
     932    gpx.set_Controls('cycles',10)
     933    gpx.set_Controls('seqCopy',True)
     934    gpx.refine() 
     935
     936.. _ImageProc:
     937
     938Image Processing
     939----------------------
     940
     941A sample script where an image is read, assigned calibration values from a file
     942and then integrated follows.
     943The data files are found in the
     944`Scripting Tutorial <https://subversion.xray.aps.anl.gov/pyGSAS/Tutorials/PythonScript/data/>`_.
     945
     946.. code-block::  python
     947
     948    import os,sys
     949    sys.path.insert(0,'/Users/toby/software/G2/GSASII')
     950    import GSASIIscriptable as G2sc
     951    datadir = "/tmp"
     952    PathWrap = lambda fil: os.path.join(datadir,fil)
     953
     954    gpx = G2sc.G2Project(newgpx=PathWrap('inttest.gpx'))
     955    imlst = gpx.add_image(PathWrap('Si_free_dc800_1-00000.tif'),fmthint="TIF")
     956    imlst[0].loadControls(PathWrap('Si_free_dc800_1-00000.imctrl'))
     957    pwdrList = imlst[0].Integrate()
     958    gpx.save()
     959
     960This example shows a computation similar to what is done in tutorial
     961`Area Detector Calibration with Multiple Distances <https://subversion.xray.aps.anl.gov/pyGSAS/Tutorials/DeterminingWavelength/DeterminingWavelength.html>`_
     962
     963.. code-block::  python
     964
     965    import os,sys,glob
     966    sys.path.insert(0,'/Users/toby/software/G2/GSASII')
     967    import GSASIIscriptable as G2sc
     968    PathWrap = lambda fil: os.path.join(
     969        "/Users/toby/wp/Active/MultidistanceCalibration/multimg",
     970        fil)
     971
     972    gpx = G2sc.G2Project(newgpx='/tmp/img.gpx')
     973    for f in glob.glob(PathWrap('*.tif')):
     974        im = gpx.add_image(f,fmthint="TIF")
     975    # image parameter settings
     976    defImgVals = {'wavelength': 0.24152, 'center': [206., 205.],
     977      'pixLimit': 2,  'cutoff': 5.0, 'DetDepth': 0.055,'calibdmin': 1.,}
     978    # set controls and vary options, then fit
     979    for img in gpx.images():
     980        img.setCalibrant('Si    SRM640c')
     981        img.setVary('*',False)
     982        img.setVary(['det-X', 'det-Y', 'phi', 'tilt', 'wave'], True)
     983        img.setControls(defImgVals)
     984        img.Recalibrate()
     985        img.Recalibrate() # 2nd run better insures convergence
     986    gpx.save()
     987    # make dict of images for sorting
     988    images = {img.getControl('setdist'):img for img in gpx.images()}
     989    # show values
     990    for key in sorted(images.keys()):
     991        img = images[key]
     992        c = img.getControls()
     993        print(c['distance'],c['wavelength'])
     994
     995.. _MultiDist_Example:
     996
     997Image Calibration
     998----------------------
     999
     1000This example performs a number of cycles of constrained fitting.
     1001A project is created with the images found in a directory, setting initial
     1002parameters as the images are read. The initial values
     1003for the calibration are not very good, so a :meth:`G2Image.Recalibrate` is done
     1004to quickly improve the fit. Once that is done, a fit of all images is performed
     1005where the wavelength, an offset and detector orientation are constrained to
     1006be the same for all images. The detector penetration correction is then added.
     1007Note that as the calibration values improve, the algorithm is able to find more
     1008points on diffraction rings to use for calibration and the number of "ring picks"
     1009increase. The calibration is repeated until that stops increasing significantly (<10%).
     1010Detector control files are then created.
     1011The files used for this exercise are found in the
     1012`Area Detector Calibration Tutorial <https://subversion.xray.aps.anl.gov/pyGSAS/Tutorials/DeterminingWavelength/data/>`_
     1013(see
     1014`Area Detector Calibration with Multiple Distances <https://subversion.xray.aps.anl.gov/pyGSAS/Tutorials/DeterminingWavelength/DeterminingWavelength.html>`_ ).
     1015
     1016.. code-block::  python
     1017
     1018    import os,sys,glob
     1019    sys.path.insert(0,'/Users/toby/software/G2/GSASII')
     1020    import GSASIIscriptable as G2sc
     1021    PathWrap = lambda fil: os.path.join(
     1022        "/Users/toby/wp/Active/MultidistanceCalibration/multimg",
     1023        fil)
     1024
     1025    gpx = G2sc.G2Project(newgpx='/tmp/calib.gpx')
     1026    for f in glob.glob(PathWrap('*.tif')):
     1027        im = gpx.add_image(f,fmthint="TIF")
     1028    # starting image parameter settings
     1029    defImgVals = {'wavelength': 0.240, 'center': [206., 205.],
     1030      'pixLimit': 2,  'cutoff': 5.0, 'DetDepth': 0.03,'calibdmin': 0.5,}
     1031    # set controls and vary options, then initial fit
     1032    for img in gpx.images():
     1033        img.setCalibrant('Si    SRM640c')
     1034        img.setVary('*',False)
     1035        img.setVary(['det-X', 'det-Y', 'phi', 'tilt', 'wave'], True)
     1036        img.setControls(defImgVals)
     1037        if img.getControl('setdist') > 900:
     1038            img.setControls({'calibdmin': 1.,})
     1039        img.Recalibrate()
     1040    G2sc.SetPrintLevel('warn') # cut down on output
     1041    result,covData = gpx.imageMultiDistCalib()
     1042    print('1st global fit: initial ring picks',covData['obs'])
     1043    print({i:result[i] for i in result if '-' not in i})
     1044    # add parameter to all images & refit multiple times
     1045    for img in gpx.images(): img.setVary('dep',True)
     1046    ringpicks = covData['obs']
     1047    delta = ringpicks
     1048    while delta > ringpicks/10:
     1049        result,covData = gpx.imageMultiDistCalib(verbose=False)
     1050        delta = covData['obs'] - ringpicks
     1051        print('ring picks went from',ringpicks,'to',covData['obs'])
     1052        print({i:result[i] for i in result if '-' not in i})
     1053        ringpicks = covData['obs']
     1054    # once more for good measure & printout
     1055    result,covData = gpx.imageMultiDistCalib(verbose=True)
     1056    # create image control files
     1057    for img in gpx.images():
     1058        img.saveControls(os.path.splitext(img.name)[0]+'.imctrl')
     1059    gpx.save()
     1060
     1061.. _HistExport:
     1062
     1063Histogram Export
     1064--------------------
     1065
     1066This example shows how to export a series of histograms from a collection of
     1067.gpx (project) files. The Python ``glob()`` function is used to find all files
     1068matching a wildcard in the specified directory (``dataloc``). For each file
     1069there is a loop over histograms in that project and for each histogram
     1070:meth:`G2PwdrData.Export` is called to write out the contents of that histogram
     1071as CSV (comma-separated variable) file that contains data positions,
     1072observed, computed and backgroun intensities as well as weighting for each
     1073point and Q. Note that for the Export call, there is more than one choice of
     1074exporter that can write ``.csv`` extension files, so the export hint must
     1075be specified.
     1076
     1077.. code-block::  python
     1078
     1079    import os,sys,glob
     1080    sys.path.insert(0,'/Users/toby/software/G2/GSASII')  # change this
     1081    import GSASIIscriptable as G2sc
     1082
     1083    dataloc = "/Users/toby/Scratch/"                 # where to find data
     1084    PathWrap = lambda fil: os.path.join(dataloc,fil) # EZ way 2 add dir to filename
     1085
     1086    for f in glob.glob(PathWrap('bkg*.gpx')):  # put filename prefix here
     1087        print(f)
     1088        gpx = G2sc.G2Project(f)
     1089        for i,h in enumerate(gpx.histograms()):
     1090            hfil = os.path.splitext(f)[0]+'_'+str(i) # file to write
     1091            print('\t',h.name,hfil+'.csv')
     1092            h.Export(hfil,'.csv','histogram CSV')
     1093
     1094.. _CommandlineInterface:
     1095
     1096
     1097Installation of GSASIIscriptable
     1098=======================================
     1099
     1100It is assumed that most people using GSASIIscriptable will also want to use the GUI, for this the standard
     1101`installation instructions <https://subversion.xray.aps.anl.gov/trac/pyGSAS#Installationinstructions>`_ should be followed. The GUI includes all files needed to run scriptable.
     1102Noting that not all GSAS-II capabilities are not available
     1103by scripting -- yet. Even if the scripting API were to be fully completed,
     1104there will still be some things that GSAS-II does
     1105with the GUI would be almost impossible to implement without a
     1106interactive graphical view of the data.
     1107
     1108Nonetheless, there may be times where it does make sense to install GSAS-II without all of the GUI components, for example on a compute server. As `described here
     1109<https://gsas-ii.readthedocs.io/en/latest/packages.html#scripting-requirements>`_ the minimal python requirements are only numpy and scipy. It is assumed that
     1110anyone able to use scripting is well posed to install from the command line.
     1111Below are example commands to install GSAS-II for use for scripting only.
     1112
     1113**Installing a minimal Python configuration**: Note I have chosen below
     1114to use the free
     1115miniconda installer from Anaconda, Inc., but there are also plenty of
     1116other ways to install Python, Numpy and Scipy on Linux, Windows and MacOS.
     1117For Linux a reasonable alternative is to install these packages
     1118(and perhaps others as below) using the Linux dist (``apt-get`` etc.).
     1119
     1120.. code-block::  bash
     1121
     1122    bash ~/Downloads/Miniconda3-latest-<platform>-x86_64.sh -b -p /loc/pyg2script
     1123    source /loc/pyg2script/bin/activate
     1124    conda install numpy scipy matplotlib pillow h5py hdf5 svn
     1125
     1126Some discussion on these commands follows:
     1127
     1128* the 1st command (bash) assumes that the appropriate version of Miniconda has been downloaded from https://docs.conda.io/en/latest/miniconda.html and ``/loc/pyg2script`` is where I have selected for python to be installed. You might want to use something like ``~/pyg2script``.
     1129* the 2nd command (source) is needed to access Python with miniconda.
     1130* the 3rd command (conda) installs all possible packages that might be used by scripting, but matplotlib, pillow, and hdf5 are not commonly needed and could be omitted. The svn package is not needed (for example on Linux) where this has been installed in another way.
     1131
     1132Once svn and Python has been installed and is in the path, use these commands to install GSAS-II:
     1133
     1134.. code-block::  bash
     1135
     1136    svn co https://subversion.xray.aps.anl.gov/pyGSAS/trunk /loc/GSASII
     1137    python /loc/GSASII/GSASIIscriptable.py
     1138
     1139Notes on these commands:
     1140
     1141* the 1st command (svn) is used to download the GSAS-II software. ``/loc/GSASII`` is the location where I decided to install the software. You can select something different.
     1142* the 2nd command (python) is used to invoke GSAS-II scriptable for the first time, which is needed to load the binary files from the server.
     1143
     1144GSASIIscriptable Command-line Interface
     1145=======================================
     1146
     1147The routines described above are intended to be called from a Python script, but an
     1148alternate way to access some of the same functionality is to
     1149invoke the ``GSASIIscriptable.py`` script from
     1150the command line usually from within a shell script or batch file.
     1151This mode of accessing GSAS-II scripting does not appear to get much use and
     1152is no longer being developed. Please do communicate to the developers if
     1153keeping this mode of access would be of value in your work.
     1154
     1155To use the command-line mode is done with a command like this::
     1156
     1157       python <path/>GSASIIscriptable.py <subcommand> <file.gpx> <options>
     1158
     1159The following subcommands are defined:
     1160
     1161        * create, see :func:`create`
     1162        * add, see :func:`add`
     1163        * dump, see :func:`dump`
     1164        * refine, see :func:`refine`
     1165        * export, :func:`export`
     1166        * browse, see :func:`IPyBrowse`
     1167
     1168Run::
     1169
     1170   python GSASIIscriptable.py --help
     1171
     1172to show the available subcommands, and inspect each subcommand with
     1173`python GSASIIscriptable.py <subcommand> --help` or see the documentation for each of the above routines.
     1174
     1175.. _JsonFormat:
     1176
     1177Parameters in JSON files
     1178-------------------------
     1179
     1180The refine command requires two inputs: an existing GSAS-II project (.gpx) file and
     1181a JSON format file
     1182(see `Introducing JSON <http://json.org/>`_) that contains a single dict.
     1183This dict may have two keys:
     1184
     1185refinements:
     1186  This defines the a set of refinement steps in a JSON representation of a
     1187  :ref:`Refinement_recipe` list.
     1188
     1189code:
     1190  This optionally defines Python code that will be executed after the project is loaded,
     1191  but before the refinement is started. This can be used to execute Python code to change
     1192  parameters that are not accessible via a :ref:`Refinement_recipe` dict (note that the
     1193  project object is accessed with variable ``proj``) or to define code that will be called
     1194  later (see key ``call`` in the :ref:`Refinement_recipe` section.)
     1195
     1196JSON website: `Introducing JSON <http://json.org/>`_.
     1197
     1198.. _API:
     1199
     1200API: Complete Documentation
     1201============================================================
     1202
    11203.. automodule:: GSASIIscriptable
    21204    :members:
Note: See TracChangeset for help on using the changeset viewer.