3dTto1D             - collapse a 4D time series to a 1D time series

The program takes as input a 4D times series (a list of 1D time series)
and optionally a mask, and computes from in a 1D time series using some
method applied to the first (backward) differences.  Methods include:

    enorm           : the Euclidean norm
    rms/dvars       : root mean square (DVARS)
    srms            : rms scaled down by global mean
    shift_srms      : srms shifted by the global mean
    mdiff           : mean abs(diff)
    smdiff          : mdiff scaled down by global mean
    4095_count      : count voxels with max of exactly 4095
    4095_gcount     : count global voxels with max of exactly 4095
                      (masked voxels over time)
    4095_frac       : fraction of masked voxels with max of exactly 4095
    4095_warn       : warn of max of exactly 4095

               Note : the 4095 cases do not warn if max > 4095
                      --> the output is cleared (to zero)

More details are provided after the examples.


E1. compute SRMS of EPI time series within a brain mask
    (might be good for censoring, and is comparable across subjects)

       3dTto1D -input epi_r1+orig -mask mask.auto.nii.gz -method srms \
               -prefix epi_srms.1D

E2. compute DVARS of EPI time series within a brain mask
    (similarly good for censoring, but not comparable across subjects)

       3dTto1D -input epi_r1+orig -mask mask.auto.nii.gz -method dvars \
               -prefix epi_dvars.1D

E3. compute ENORM of motion parameters
    (as is done by afni_proc.py via 1d_tool.py)

    Note that 1D inputs will generally need the transpose operator,
    applied by appending an escaped ' to the -input dataset.

       3dTto1D -input dfile.r01.1D\' -method enorm -prefix enorm.r01.1D

E4. warn if max is 4095

       3dTto1D -input epi+orig -method 4095_warn

E4. count global number of 4095 voxels (return 0 if it is not the max)

       3dTto1D -input epi+orig -method 4095_gcount


   Since the initial step is generally to compute the first (backwards)
   difference, call that dataset TDIFF.  The value at any voxel of TDIFF
   is the same as the input, minus the value at the prior time point.
   TDIFF is defined as 0 at time point 0.

   method enorm

      This is the Euclidean norm.

      Starting with the TDIFF dataset, the value at each time point is
      the Euclidean norm for that volume (or list of values).  This is
      the same as the L2-norm, and which is often applied to the motion
      parameters for censoring.

         enorm = sqrt(sum squares)

   method rms (or dvars)

      RMS = DVARS = enorm/sqrt(nvox).

      The RMS (root mean square) is the same as the enorm divided by
      sqrt(nvox).  It is like a standard deviation, but without removal
      of the mean (per time point).

         rms = dvars = enorm/sqrt(nvox) = sqrt(sum squares/nvox)

      This is the RMS of backward differences first described by Smyser
      et. al., 2010, for motion detection, and later renamed to DVARS by
      Power et. al., 2012.

    * DVARS survives a resampling, where it would be unchanged if every
      voxel were listed multiple times, for example.

    * DVARS does not survive a scaling, it scales with the data.
      This is why the SRMS method was introduced.

   method srms (or cvar) (= scaled rms = dvars/mean)

      This result is basically the coefficient of variation, but without
      removal of each volume mean.

      This is the same as dvars divided by the global mean, gmean.

         srms = dvars/gmean = enorm/sqrt(nvox)/gmean

    * SRMS survives both a resampling and scaling of the data.  Since it
      is unchanged with any data scaling (unlike DVARS), values are
      comparable across subjects and studies.

  *** The above 3 curves will look identical, subject to scaling.

   method shift_srms  (= srms - meandiff)

      This is simply the SRMS curve shifted down by the global mean of
      (the absolute values of) the first differences.  This is probably

   method mdiff (mean diff = mean abs(first diff))

      Again, starting with the first backward difference, TDIFF, this
      is just the mean absolute value, per time point.

   method smdiff (scaled mean diff = mdiff/mean)

      This is the mean diff scaled by the global mean.

   method 4095_count

      At each time point, output the number of (masked) voxels that are
      exactly 4095 (if max is 4095).

   method 4095_gcount

      Output the total number of (masked) voxels that are exactly 4095.
      This accumulates across voxels and time.
    * This resets to output zero if the maximum > 4095.

   method 4095_frac

      At each time point, output the fraction of (masked) voxels that
      are exactly 4095 (if max is 4095).

   method 4095_warn

      Simply warn whether the maximum is exactly 4095 (so no -prefix).

informational command arguments:

   -help                    : show this help
   -hist                    : show program history
   -ver                     : show program version

required command arguments:

   -input DSET              : specify input dataset

         e.g. -input epi_r1+orig
         e.g. -input dfile.r01.1D\'

      Specify the input dataset to be processed.  This should be a set
      of 3D time series.  If the input is in 1D format, a transpose
      operator will typically be required.

   -method METHOD           : specify 4D to 1D conversion method

         e.g. -method srms
         e.g. -method DVARS
         e.g. -method dvars
         e.g. -method enorm

      Details of the computational methods are at the top of the help.
      The methods (which are case insensitive) include:

         enorm      : Euclidean norm of first differences
                      = sqrt(sum squares(first diffs))

         rms        : RMS (root mean square) of first differences
                      = DVARS = enorm/sqrt(nvox)

         srms       : scaled (by grand mean) RMS of first differences
                      = DVARS/mean

                  * seems like the most useful method for censoring

         s_srms     : SRMS shifted by grand mean abs of first diffs
                      = SRMS - mean(abs(first diffs))

         mdiff      : mean absolute first differences
                      = mean(abs(first diff))

         smdiff     : mdiff scaled by grand mean
                      = mdiff/mean

                 *** : for the following 4095 cases, output is cleared
                       if the maximum is not exactly 4095

         4095_count  : count of voxels that are exactly 4095

         4095_gcount : count of total voxels that are exactly 4095
                       across time (where 4095 is the global max, else 0)

         4095_frac   : fraction of voxels that are exactly 4095
                       = 4095_count/(mask size)

         4095_warn   : state whether global max is exactly 4095
                       (no 1D output)

optional command arguments:

   -automask        : restrict computation to automask
   -mask MSET       : restrict computation to given mask
   -prefix PREFIX   : specify output file
         e.g.     -prefix SVAR_run1.1D
         default: -prefix stdout
   -verb LEVEL      : specify verbose level
         e.g.     -verb 2
         default: -verb 1

R Reynolds  July, 2017
3dTto1D version 1.3, 8 March 2024
compiled: May 27 2024