iFit: iData object description
    
    
    
    Commands we use in this page: 
iData, get, set, setalias, getalias,
        setaxis, getaxis, labels, 
methods
      See also: 
iFunc, 
Fit,
      
Math, 
Plot, 
Load, 
Save 
     
    
    The iData class is a
    structure which holds some multidimensional data set
    (numerical blocks), as well as additional metadata and axes
    definitions, Signal, Error bars,
      Monitors, and user defined fields (aliases). The
    instantiated objects, which are used as normal Matlab variables,
    often contain 1D, 2D, 3D, nD histograms or nD event lists. You will
    learn below how to customize these objects (set, get, setalias,
    getalias, setaxis, getaxis, indexing, ...).
    
    A large number of methods can be used
    with iData, including data import, plotting, saving, fitting and mathematical
    operators.
    
    For impatient readers, we advise you to refer to the quick Setting Signal and Axes
    documentation in the Load page, in order to
    customize the object. For the others, just go on reading how objects
    are built, and how to handle them.
    
    Derived classes
    
    The iData data sets also exist in a set of specialized flavours
    (sub-classes) which inherit full iData capabilities, and add
    a few more specialized functionalities:
    
      - iData_Sqw2D: a data set holding
        a liquid/powder/amorphous dynamic
          structure factor 2D S(q,w) data set. This class
        can compute structure factors, density of states, incoherent
        Gaussian approximation and multi-phonons, dynamic range and
        total scattering cross sections, moments and dispersion
        relations, thermochemistry, detailed balance, export to e.g.
        McStas Sqw files, ...
       
      - iData_Sab: a data set holding a
        liquid/powder/amorphous dynamic
          structure factor 2D S(alpha,beta) data set, used
        e.g. in nuclear data bases (ENDF, JEFF, ...). This class has
        about the same capabilities as the Sqw2D flavour, but in the
        (alpha,beta) frame.
       
      - iData_vDOS: a data set holding a
        vibrational density
          of states. This class can compute the incoherent Gaussian
        approximation and multi-phonons, thermochemistry, ...
       
    
    Introduction to the iData objects
    An iData object is obtained for instance by transforming a file name
    into an iData object a with
    
      >> a = iData([ ifitpath 'Data/ILL_IN6.dat'])	% imports a file into an object
a =  iData object:
    [Tag]     [Dimension]                           [Title] [Last command]          [Label]
 tp460929      [257  512] 'File ILL_IN6.dat ILL Data (n...' tp460929=load(iData,...  
     
    which results in an iData
    object. An other way to create such an object is to import directly
    Matlab variables:
    >> a = iData(rand(10))
>> a = iData(x,y,signal)	% give the axes first, then the Signal
>> a = iData(gauss, 5, -5:5)	% a gaussian with width=5, evaluated along axis -5:5
    These objects, which internal structure can be obtained with the struct(a) method, hold a number
    of important items:
    
      - Some general information regarding the Source of the Data
        (origin, filename), Dates, Command History, User name and
        Creator.
 
      - A unique ID, which can be complemented by an object Label (for
        instance the name of an experiment) and a Title (for instance
        the name of the sample).
 
      - A Data field where
        all actual scientific data is stored, usually as a structure.
 
      - Aliases, which may
        hold themselves data, or be defined as links to other parts of
        the object.
 
      - A Signal, an Error bar and a Monitor which can either
        hold data, or point to other parts of the object. This defines the visible part of the object.
         
      - A series of Axes, which
are
usually
defined
as
links
to
        Aliases or other Data parts. These Axes
        indicate how to interpret the Signal
        as a scientific data set.
       
    
    
      The iData object internal
        internal structure.
      
     
    In principle, the objects should not
    be accessed or modified as structures. Indeed, some dedicated
    methods, which match the usual Matlab commands, have been designed
    to maintain the object integrity along operations. This includes
    methods for 
    
      - loading data (see the Load page)
 
      - inquiring and manipulate the object contents (see below) 
 
      - plotting (see the Plot page)
 
      - performing computations (see the Math
        page)
 
      - fitting and adjusting model/function parameters to match the
        object data (see the Fit page)
 
      - saving/exporting the object into various formats and data
        types (see the Save page)
 
    
    In the following, we shall present how to manipulate iData objects,
    enrich them with additional information, define relations between
    the object parts as Aliases, define
    the object Signal and its
    associated Axes.
    
    Any object dimensionality can be handled. A more limited support
    exists for event based data sets.
    
    To
        get more help: list of most iData 
methods
      with comments
       
    Inquiring the iData object (get, disp,
      display)
    The main idea here is that iData objects can be handled the same way
    as structures and Matlab Graphics
      Objects using get and set methods.
    
    A quick overview of an iData object a is displayed when issuing the
    command
    >> a = iData([ ifitpath 'Data/ILL_IN6.dat' ]);	% converts a file name into an iData object
>> a
ans =  iData object:
    [Tag]     [Dimension]                           [Title] [Last command]          [Label]
 tp481575      [257  512] 'File ILL_IN6.dat ILL Data (n...' tp481575=load(iData,...
    showing the object unique ID, its dimensions, title, the last
    command which produced the object, and an optional label (here
    empty). The same output is given by the display(a)
    command.
    
    But a more useful formatting of the same information is obtained
    using get
    or disp
    
    which both result in the following output
    
      
        
          
            a = iData 2D object of size [257  512]:                      Title: 'File ILL_IN6.dat ILL Data (normal integers)'                     Source: 'iFit/Data/ILL_IN6.dat'                    Command: {'tp481575=load(iData,'iFit/Data/ILL_IN6.dat');'}                   UserData: ''                      Label: ''                DisplayName: ''                    Creator: [1x119 char]                       User: 'farhi on localhost'                       Data: [1x1 struct]                       Date: '20-nov.-2007 23:11:26'                        Tag: 'tp481575'           ModificationDate: '12-Oct-2010 17:48:16'        Object aliases:                 [Name]                           [Value] [Description]                Signal  Data.IIIIIIIIIIIIIIIIIIIIIIIIIIIII_13   Data Signal [0:27172]                 Error                      sqrt(Signal)   Error on Signal               Monitor                                 1   Monitor (weight) '1'            Attributes                   Data.Attributes   Headers from ILL_IN6.dat 
           | 
        
      
    
    
    This latter display indicates the definition of the Signal, Aliases and Axes (if any - see below).
    
    The object 'data' is stored in the 'Data' field of the object
    structure. This is usually were any file is imported.
    As we shall see below, it is simple
    to extract the object value
      (Signal) and Axes:
    >> a.Signal					% returns the Signal value
>> a{0}						% returns the Signal/Monitor value
>> a{1}						% request the 1st axis values
    A single field can be accessed in an object or an array of objects,
    by means of the get function (just like for the Matlab graphics objects):
    >> a=load(iData, [ ifitpath 'Data/*.scn'])	% returns an array of iData objects
>> get(a,'Title')			% returns the Title of all objects in the array
>> get(a(1),'Title')			% returns the Title from the first object
    where this latter is equivalent to accessing
    >> a(1).Title
>> b=a(1)
>> b.Title
    Field names are case insensitive, that is b.title will also work.
    Any field may be accessed, including subfields, just as a normal
    structure
    >> get(a,'Data.VARIA.A1')	% returns all A1 values from the array of objects
>> a(2).Data.VARIA.A1		% same but only for the second array element
>> a(3).Data			% returns the complete Data structure from the 3rd object in the array
    Accessing subfields requires a case sensitive name match, that is a a(3).data works (single field
    accessed), but a(3).data.varia.a1
    does not (requires fully qualified path to the data).
    
    The get
    function can also apply with iData arrays, as shown above, and then
    returns cell arrays.
    
    The content of objects can be searched with the findstr and
    findfield
    methods which search for a character string as a content or as a
    field name:
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> [match, field]=findstr(a,'TAS');% searches matches within object contents
match = 
    'UPt3;File sv1850.scn ILL TAS Data'
    [1x105 char]
    [1x169 char]
    'ETAS=     '
field = 
    'Title'
    'Creator'
    'Data.Attributes.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
    'Data.Attributes.PARAM.ETAS'
>> findfield(a,'TAS')	% searches matches within object members/aliases/fields
ans = 
    'Data.PARAM.ETAS'
    'Data.Attributes.PARAM.ETAS'
    Some data file formats provide additional 'attributes' to each
    numeric content (e.g. NeXus/HDF/NetCDF/CDF. See Loaders). You can access these associated
    attributes with the fileattrib method:
    
    >> fileattrib(a, 'Data.Attributes.PARAM.ETAS')
ans =
 ETAS= 
>> a=iData([ ifitpath 'Data/IRS21360_graphite002_ipg.nxs' ]);
>> getalias(a,'Signal')
ans =
Data.mantid_workspace_1.workspace.values
>> fileattrib(a,'Signal')
ans = 
        signal: 1
          axes: 'axis1,axis2'
         units: ''
    unit_label: ''
    The findobj
    method can be used to inquire all iData objects available in the
    workspace:
    >> a = findobj(iData);
>> a = findobj(iData, 'Property', 'Value'); % searches for objects that match a Property/Value pair
    It is also possible to plot the object, and we direct the reader to
    the Plotting page.
    >> a = plot(a);
      
    Last, the object  Signal
    normalized to the Monitor
    can be displayed as a Table/spreadsheet (beware the size of the object !)
    >> a = edit(iData);
    
    Modifying the iData object (set)
    
    The content of the objects can be modified using the set
    function:
    >> a=load(iData, [ ifitpath 'Data/*.scn'])	% returns an array of iData objects
>> set(a,'Data.VARIA.A1',40);		% modify the whole array Data content
>> set(a(1),'Data.VARIA.A1',40); 	% modify a single Data content
    The new assignments apply on the object itself when the method call
    has no output argument, but can additionally be copied to an other
    variable:
    >> b = set(a(1),'Data.VARIA.A1',40);	% modify the Data content and send back the modified object 
    The set assignment may
    also be used with arrays of iData objects.
    
    This syntax can be simplified by adopting the structure-type one:
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> a.Data.VARIA.A1
ans =
    40
>> a.Data.VARIA.A1 = 41			% returns the modified object
    We shall see below that there is a way to extend an iData object,
    that is add some new
    information, and to create links
    within the object.
    
    The Title
    of an object usually stores the origin and type of the data
    (filename). 
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> a.Title
ans =
UPt3;File sv1850.scn ILL TAS Data
    
    In addition, an object Label can be defined to e.g. sort objects with user defined names, such
    as 'Measurement1',',Background', ... in the spirit of Labels (Mac
    OSX) and Emblems (Linux/Gnome) in window managers to provide
    customized colours and/or icons.
    
    >> a.Label = 'TAS'
a =  iData object:
    [Tag]     [Dimension]                           [Title] [Last command]          [Label]
 tp120236        [15   1] 'UPt3;File sv1850.scn ILL TAS...' tp120236=set(tp12023... TAS 
    These can be searched using the findfield, and findstr
    methods, see above, or findobj(iData,'Label','TAS').
    
    Definition of Aliases: links and
      values (setalias, getalias, set, get)
    An Alias in iData objects
    correspond to user fields, dynamically created and evaluated. The
    previously seen UserData
    field of the iData structure is static. One can indeed store
    something there, but there is only one such slot. We shall see that
    not only we can create new fields to hold some information, but also
    that these Aliases can
    point onto other aliases or parts of the iData object.
    
    The main methods used to assign and extract Alias definitions are setalias and
    getalias
    respectively. We shall see below that the set and get methods
    can also be used, but only apply on the Alias values (which is usually a
    numerical one).
    defining a new
      field as a value
    The method used to define (or re-define) an Alias is setalias:
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> setalias(a,'NewField',42)
    In this latter case, that is when Aliases are defined as numerics (scalar, vector,
    matrix), this is strictly equivalent to
    >> a.NewField = 42
>> set(a,'NewField',42)
    The mechanism seen here works for numerical fields, but will fail if
    you decide to store structures and cell arrays into an Alias. Then,
    we recommend to define a new member in the Data part of the object, and then point to it as a
    link, as explained below.
    
    Alias names are case
    insensitive, that is a.newfield
    will also work.
    
    In addition, each Alias
    can be associated with a label/comment when creating it:
    >> setalias(a,'NewField',42,'Answer to the Ultimate Question of Life, the Universe, and Everything')
    or with the label
    method:
    >> label(a,'NewField','Answer to the Ultimate Question of Life, the Universe, and Everything')
    The current label of an Alias
    is inquired similarly with the label method
    >> label(a,'NewField')
ans =
Answer to the Ultimate Question of Life, the Universe, and Everything
    The alias labels are used as axis labels when plotting
    objects.
    getting the value
      of a new field
    The method used to extract the definition of an Alias is getalias:
    >> getalias(a,'NewField')
ans =
     3
    In this case, that is when Aliases are defined as numerics (scalar, vector,
    matrix), this is strictly equivalent to
    >> a.NewField
>> get(a,'NewField')
    defining a new
      field as a link (reference)
    The same setalias method
    can be used to assign an Alias as an expression. In the following
    example, a QH alias has
    been automatically defined as a numeric vector when importing the
    file, and we define a new Alias which points to it:
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> a.QH
ans =
    0.9791
    ...
    1.0214
>> setalias(a,'NewField','QH')
    which makes it so that NewField
    is de-facto QH.
    Links which can not be evaluated are returned as is, that is as
    character strings.
    As explained below, it is possible to define links to othet links,
    or external files.
    Links to other
      links
    More complex links may be defined to other parts of the object or to
    an other Alias,
    >> setalias(a,'NewField','Data.ZEROS')		% a link to the whole ZEROS subfield structure
>> setalias(a,'NewField','Data.ZEROS.A1')	% a link to the A1 value in the ZEROS subfield
>> setalias(a,'AnotherNewField', 'NewField');	% creates a link to a link to a Data part (follow me !)
>> a.AnotherNewField
ans =
 -115.7500
    The AnotherNewField points
    to NewField, which was
    defined as Data.ZEROS.A1.
    
    This brings the ability to enrich the Data area of the object with
    new content, and then define an Alias which links to it:
    >> a.Data.NewContent1 = rand(10);			% add a new array in the Data
>> a.Data.NewContent2 = struct('a',1,'b', rand(10));	% add a new structure in the Data
>> setalias(a,'HowAreYouToday', 'Data.NewContent2');
    Links as more
      general expressions
    Advanced Alias definition
    may be set by means of the 'this' self-referring symbol which
    can be used within full expressions. 'this' then refers to the object
    itself.
    >> setalias(a,'NewField', '[ this.Data.ZEROS.A1 this.Data.VARIA.A1 ]') 	% an expression which is built from two links
>> a.NewField
ans =
 -115.7500   39.2600
>> a.AnotherNewField
ans =
 -115.7500   39.2600
    In this last example, we have changed the NewField definition, which immediately affects AnotherNewField (defined
    above).
    The links are evaluated dynamically,
    so that their value follow the target one.
    Links to external
      resources
    In the case the link begins with file://, ftp://,
    http://, or https:// the external
    resource is accessed when requesting the alias value, and its full
    content is retrieved as a structure using iLoad.
    The external link may optionally end with an anchor specification #keyword, and the matching
    elements in the external file are then selected and returned.
    >> setalias(a,'NewField', [ 'file://' ifitpath '/Data/sv1884.scn#Data' ]) 
    The file is accessed for each alias value request.
    getting the definition of a new field
        (reference)
    In the previous examples, the QH
    Alias has been defined from the import routine, and it is assigned a
    static array (you can see that by looking at the get(a) output). 
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> setalias(a,'NewField','QH')
>> get(a,'NewField')		% is the same as a.NewField: return the value
ans =
    0.9791
    ...
    1.0214
>> getalias(a,'NewField')	% return the definition
ans =
QH
    We see here that the get method follows definitions recursively until a
    numeric value is found. 
    The getalias
    returns the current Alias definition, but does not propagate to
    other potential links.
    assigning the value of a linked field
    When assigning a value to an Alias with the equal sign and the set method,
    the value is propagated until the fully qualified path is found.
    This means that when an Alias is a linked field, setting its value
    will affect the target, but not the Alias itself:
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> setalias(a,'NewField',3)			% a static scalar
>> setalias(a,'AnotherNewField', 'NewField');
>> a.NewField
ans =
     3
>> a.AnotherNewField = 4			% this stores 4 in the NewField alias !
    The direct structure-like assignment and set method propagate the
    assignment value to the fully qualified link.
      
    getting the value of a linked field
    The direct structure-like reference and get method propagate the
    fully qualified link in order to actually find its value.
      
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> setalias(a,'NewField',3)			% a static scalar
>> setalias(a,'AnotherNewField', 'NewField');
>> get(a,'AnotherNewField')			% evaluated as NewField, then as 3
ans =
     3
>> a.AnotherNewField				% returns the same as get
    removing a field from the object
    Added Alias fields can be
    removed/deleted by setting their value to empty or using the rmalias
    method
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> setalias(a,'NewField','PNT')			% point to PNT, which is a vector here
>> setalias(a,'NewField','')			% removes NewField alias
>> rmalias(a,'NewField')
    whereas the similar set command removes the final target PNT but
    leaves the NewField Alias
    pointing to nothing.
    >> setalias(a,'NewField','PNT')
>> set(a,'NewField','')				% removes PNT, leaves NewField in error state (undefined)
    Re-defining PNT will, at
    the same time, re-enable NewField.
    A warning is in place here
    As the set and get methods follow the Aliases definitions until the
    final value is obtained, this also applies to re-definitions of Aliases. In the previous
    example, if we now use the set method, we shall modify the final definition of the Alias, that is the one
    obtained by following all definitions:
    >> setalias(a,'NewField','QH')
>> set(a,'NewField',1)	% will set QH to 1
    That's why we strongly recommend to use setalias when you wish to
    control an Alias immediate
    definition, and set when you want to control its final value. The
    setalias
    can also define the Alias
    as a static numerical value, as seen previously, without risking to
    affect deeper object parts. Similarly, a call to getalias will
    reveal the nature of the Alias, as link or numerical value.
    
    An other example would be to define QH as a column of a matrix. Changing its value, or
    the one of any further Alias
    pointing on it will effectively modify the column in the matrix
    itself.
    
    In a few words, the set/get functions work just as the linking
    mechanism in Linux/Unix systems with the ln command.
    
      - The get function
        always return the value of a field, and a.field returns the same
        result as get(a, field) 
 
      - The set function
        always defines the final value of a field, and we shall see that
        it may sometimes follow a series of definitions in the case of Aliases. The a.field=value syntax is
        equivalent to set(a,field,value).
 
      - The getalias function
        always return the current Alias definition
 
      - The setalias function
        always set the current Alias definition
       
    
    Definition of the Signal, Error bar
      and Monitor
    The Signal is a special Alias that points to a
    numerical block which is the relevant data to handle for plotting or
    computing (see mathematical operations).
    
    As an alias, its value and definition can be accessed with all the
    following methods (refer to the Alias
    section above):
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])	% returns an iData object
>> a.Signal					% returns the Signal value as an Alias
>> get(a,'Signal')
>> getalias(a,'Signal')				% returns the Signal definition, which here points to the CNTS Alias
    In the iData terminology, the Signal/Monitor is the rank 0 axis (see
    the Axis section below)
    >> getaxis(a, 0 )	% request Signal/Monitor value as an axis
>> a{0}
    Setting the axis 0 with a value first multiplies it by the Monitor,
    and then sets the Signal. In case you want to ignore the Monitor
    weighting, simply assign the Signal directly.
    
    The Signal label can be inquired or set with the usual setalias and
    label
    methods seen in the Alias
    section.
    >> label(a,'Signal')			% returns the current Signal label
>> label(a,'Signal', 'Make it so ?')
>> label(a, 0,     , 'Make it so ?')
    This label is shown on plots along the Signal axis (e.g. Y on 1D
    plots and Z on 2D plots). We point out that the object can be
    assigned a global Title and Label as well. The title is shown as the
    plot title and the object text display (see Inquiring the iData object).
    
    
    It is also possible to extract a portion of the signal from an iData
    object, similarly as for a normal array:
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> a([ 2 4 6 8 9])
    creates a new iData object with a subscript Signal (and relevant axes definitions - see below).
    Dimensionality and
      Types of Signals that can be handled
    The dimensionality of the
    iData object is the one from its Signal. It is obtained from the ndims method
    and the length of each dimension is obtained with the size method.
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> ndims(a)
ans =
     1
>> size(a)
ans =
    15     1
    In principle, there is no limitation concerning the size of the Data
    and Signal, and the dimensionality (except memory restrictions). The
    following table indicates the different types of Signal that the iData can
    handle, and the associated requirements regarding Axes.
    
    
      
        
          Dimensionality 
           | 
          Signal size 
           | 
          Related axes 
           | 
        
        
          empty ndims=0 
           | 
          Signal is empty 
           | 
          No axis 
           | 
        
        
          0D scalar ndims=1 
           | 
          Signal is a single number 
           | 
          In principle, no axis is
            needed here. 
           | 
        
        
          1D vector ndims=1 
           | 
          Signal is a vector 
           | 
          One Axis required, as scalar
            or vector 
           | 
        
        
          2D matrix ndims=2 
           | 
          Signal is a matrix 
           | 
          Two axes required, as scalar,
            vector or matrix matching Signal 
           | 
        
        
          3D volume ndims=3 
           | 
          Signal is a volume 
           | 
          Three Axes are required, as
            scalar, vector, matrix or volume matching Signal | 
        
        
          nD grid space ndims=n 
           | 
          Signal is nD 
           | 
          n Axes are required, each may have a
            dimensionality from 1 to n,
            with preference for vectors. 
           | 
        
        
          nD event - column based
            ndims=n 
           | 
          Signal is a long vector (1D) 
           | 
          n Axes are required, each being a scalar
            or vector of same length as Signal. NOTE: Not all Math
            methods support this type of data, and it should be
            converted, when appropriate, into nD grid histogramed with
            the hist or interp operators
                (see Math/interpolation). 
               | 
        
      
    
    
    The first dimension refers to rows, the second to columns, the third
    to pages,  and so on.
    Error bars
      definition
    The Signal is attached to
    an Error bar, which
    represents an uncertainty on a Signal value. The Error bar is considered to be
    symmetric w.r.t. each Signal
    value. This Error propagates along most mathematical
    operators and is also used for proper weighting of optimization methods when performing
    model fit using e.g. a least-square
    criteria. No error bar mechanism is currently implemented for axes
    and aliases.
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> a.Signal
>> a.Error
>> getalias(a,'Signal')
ans =
CNTS
>> getalias(a,'Error')
ans =
sqrt(this.Signal)
    The Error defaults to sqrt(Signal)
    when not set (that is a.Error=[]).
    A constant Error can be
    set, an expression (including using Data or this)
    or any numerical value that matches the Signal size. 
    Monitor definition
    
    Similarly, a Monitor is
    attached to the Signal. It
represents
    e.g. a counting time or any statistical weight w=1/Monitor that is
    to be taken into account when performing mathematical
    operations such as combine and most binary operators (+-/*)
    involving normalization between signals. In these cases, the Signal and Error are divided by the Monitor prior to performing the
    operation, and multiplied back after operation.
    
    The Monitor defaults to 1
    when not set (that is a.Monitor=[]).
    A constant Monitor can be set, an expression (including using Data or this) or any numerical value
    that matches the Signal
    size.
    
    The Signal, Error and Monitor fields of an iData object are
    protected Aliases: they
    can not be deleted. 
    
    The raw Signal and Error are obtained with: 
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> a.Signal
>> a.Error
    
      The normalised Signal and Error (i.e. divided by Monitor) are
      obtained with:
    
    >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])
>> getaxis(a, 'Signal')	% or: a{0}
>> getaxis(a, 'Error')
    
      Definition of Axes
      
      Axes are defined just as
      Aliases. They are used
      for Math operations and plotting.
      
      Axes are indexed from 1
      up to the Signal dimensionality, that is a vector Signal has one axis, a matrix
      has 2 axes, a volumetric signal has 3. 
      
      The 1st axis relates to the number of rows, the 2nd axis to the
      number of columns, the 3rd axis to the depth, and so on. The axis
      index then is associated to the mathematical definition of indexes
      in a matrix/tensor.
      
      However, the 'X', 'Y' convention is the one used in standard Matlab 2D/3D plots
      such as surf and mesh. This corresponds to the
      logical axes when looking at a matrix from above with horizontal
      axis referring to columns and vertical to rows, starting from the
      lower left corner.
      
      NOTE: As a result, the
      axis of rank 1 is usually labelled as 'Y' (on rows, that is
      vertical for a matrix seen from above), and the axis of rank 2 is
      labelled as 'X' (on columns, that is horizontal) except for 1D
      objects where this is the rank 1.
      getting an axis
        As they are basically Aliases,
        Axes are accessed in two ways, either through their
      definition, that is their link, or through their value. This is
      done through the getaxis function:
      
>> a=load(iData, [ ifitpath 'Data/sv1850.scn'])	% returns an iData object
>> getaxis(a, 1 )	% request axis 1 values, that is 'Y' along Signal rows
>> getaxis(a,'1')	% request axis 1 definition
      where the first command returns the 1st axis values, and the
      second commands returns its definition, which may be a link to a
      Data part.
      
      The axis value can also be obtained with the quick reference
      notation {n} (which
      works up to rank n=9) :
      >> a{1}		% returns the 1st axis values = getaxis(a,1)
>> a{'1'}	% returns axis definition     = getaxis(a,'1')
ans =
QH
      In principle, the axis rank should be within 1 up to the object
      dimensionality.
      Upon request, any undefined axis is automatically created when it
      matches the Signal
      dimensionality.
      The label of an axis is the one from its associated Alias, but can be accessed
      with the fast syntax:
      >> label(a,1)		% returns the 1st axis label, which is QH here
ans =
QH axis Ki=1.48
      setting an axis
      The common way to define an axis is by means of the setaxis
      >> a=load(iData, [ ifitpath 'Data/sv1850.scn'])	% returns an iData object
>> setaxis(a, 1, 23) 		% directly fixes the value of the axis to a constant 23
>> setaxis(a, '1', 'QH')	% defines axis 1 as 'QH', which is an alias of the object
      The fast notation a{n}
      can also be used for direct assignments
      >> a{1} = 23 		% directly fixes the value of the axis to a constant 23
>> a{'1'} ='QH'		% re-defines axis 1 as 'QH', which is an alias of the object
      In case a new Axis
          is defined with a numerical value (scalar, vector, matrix,
          ...), an Alias is
          automatically created, and the Axis then points to it.
          
          The axes labels can be defined the same way as Aliases, but given their
          rank:
        
      >> label(a, 1, 'change label of QH')
      and there is a fast notation for axes of rank 1 to 4, similar to
      the Matlab Graphics Object
      syntax, where the 'X' and 'Y' are swapped for ranks 1 and 2 (see
      note above):
      >> xlabel(a, '2st axis label')	% except for 1d objects where it points to the first axis
>> ylabel(a, '1st axis label')
>> zlabel(a, '3st Z axis label')
>> clabel(a, '4st C axis label')
      WARNING: when assigning an axis, in the
      case it has been previously defined as a link, the target of the
      link is assigned (refer to the relevant
        Alias section for more information).
      
      Axes can be deleted with the rmaxis
      method, in which case default axes are used for further operations
      (math, plot, ...)
      Handling iData object arrays
      Most iData methods apply on both single objects and arrays of
      objects. In many cases, with input arrays, the result is given
      back as cell arrays or iData arrays. This vectorization is suited
      to the iterative handling of large amounts of data sets. The zeros method initializes an
      empty (or constant) array of objects.
      >> a=zeros(iData, size)  % creates a [size] array of empty objects
>> a=zeros(object, size) % duplicates 'object' as a [size] array
      The squeeze method acts
      just like the usual Matlab squeeze one, and removes singleton
      dimensions in multi-dimensional arrays. This is useful when
      working with e.g. cat, dog,
      and array subscripts such as a(1,:,:).
      Other operators, such as fliplr
      and flipud, or a simple
      indexing of the objects as for usual arrays, can be used to
      manipulate the data sets. Refer to the Math
      page for more information about slicing, cutting, appending and
      merging.
      
      To create an iData vector, just use the bracket [ ... ] symbol
      >> b = [ a 2*a ];
    
    Handling
      event lists
    
      Some data sets contain lists of 'events', that is a set of
        coordinates for a set of signal values. These events are then
        collections of 'rows', which each has structure:
      [ x y z ... sx, sy, sz ...]
      where x,y,z,... are the coordinates, and sx,sy,sz,... are
        signal values (for instance a magnetic field vector at given
        location in space).
        On import, these data sets result in a matrix which rows are
        events, and columns are the coordinate/values, as above.
      
      It is possible to format the data set into a formal event list,
        using the 'event' method after loading. The 'event'
        method can either make a guess on the dimensionality of space
        and signal, or specify the number of columns which are affected
        to the coordinates x,y,z,... (dimensionality of space), and the
        columns which is to be used for the 'signal'. When more that one
        'signal' column is given, the norm of the given columns, per
        event, is used.
      
      Event data sets can further be converted into histograms using
        the 'hist' or 'meshgrid' methods. The histograms
        can be prettified using the 'fill' method, which makes
        sure that empty spaces in the histogram are interpolated with
        neighboring values. More information available in the Math page.
      
    
    
      Going further - some other useful
        methods
      
      A comprehensive list of most methods is shown in the Methods page. In total there are about
      120 of these available, which can be listed with
      
>> methods iData
      We shall present in particular a few additional methods of general
      use that may be useful.
      
      
        - commandhistory(a): return the
          list of all operations required to obtain an object, from
          initial import. When no output argument is specified, a list
          dialog shows this history, which can be saved as a Matlab
          script for further re-use.
         
        - b=copyobj(a): create a
          copy of an object, with a new unique ID
         
        - disp(a): display the object
          details structure, with Aliases and Axes
         
        - display(a): display the object
          in short
 
        - doc(iData): open the documentation web
          pages
         
        - findfield(a,'field'): search for
          field names in the object matching a pattern
         
        - findobj(iData): search inside the whole
          Matlab workspace and local functions for iData objects; 
         
        - findstr(a, 'pattern'): search for
          character strings in the field contents, including comments
          found in the initial files
         
        - full(a): convert the iData to
          full matrix storage
 
        - imroi(a): interactively
          select a region of interest (ROI) in a 1D-2D-3D data set.
         
        - pack(a): test whether a full or
          sparse storage is best for all fields that compose the object,
          in order to reduce the memory usage
 
        - sparse(a): convert the iData to
          sparse matrix storage
         
        - version(iData): return the iFit/iData
          version number and release date
         
        - zeros(iData, dims): initialize an array of
          empty iData objects
         
      
      
      
      
      E.
Farhi
          - iFit/iData objects - Nov. 27, 2018 $Revision:1.7 $  - back
        to 
Main iFit Page