def remove_subject_from_stats(meanfname,
                              varfname,
                              samplesize,
                              subjvolfname,
                              newmeanfname,
                              newvarfname,
                              newstdfname=''):

    meanfname = au.add_extension_if_needed(meanfname, au.ext_str())
    varfname = au.add_extension_if_needed(varfname, au.ext_str())
    subjvolfname = au.add_extension_if_needed(subjvolfname, au.ext_str())

    newmeanfname = au.add_extension_if_needed(newmeanfname, au.ext_str())
    newvarfname = au.add_extension_if_needed(newvarfname, au.ext_str())

    if newstdfname:
        newstdfname = au.add_extension_if_needed(newstdfname, au.ext_str())

    #load data
    n = samplesize

    meanv = nib.load(meanfname).get_data()
    varv = nib.load(varfname).get_data()
    subjv = nib.load(subjvolfname).get_data()
    aff = nib.load(meanfname).get_affine()

    #calculate new mean: ((oldmean*N) - x)/(N-1)
    newmean = meanv.copy()
    newmean = ((newmean * n) - subjv) / (n - 1)
    newmean = np.nan_to_num(newmean)

    #calculate new variance:
    # oldvar = (n/(n-1)) * (sumsquare/n - oldmu^2)
    # s = ((oldvar * (n/(n-1)) ) + oldmu^2) * n
    # newvar = ((n-1)/(n-2)) * (((s - x^2)/(n-1)) - newmu^2)
    s = varv.copy()
    s = ((s * (n / (n - 1))) + np.square(meanv)) * n
    newvar = ((n - 1) / (n - 2)) * (((s - np.square(subjv)) /
                                     (n - 1)) - np.square(newmean))
    newvar = np.nan_to_num(newvar)

    #save nifti files
    au.save_nibabel(newmeanfname, newmean, aff)
    au.save_nibabel(newvarfname, newvar, aff)

    #calculate new standard deviation: sqrt(newvar)
    if newstdfname:
        newstd = np.sqrt(newvar)
        newstd = np.nan_to_num(newstd)
        au.save_nibabel(newstdfname, newstd, aff)
def change_to_absolute_values (niifname, outfname=''):

    niifname = au.add_extension_if_needed(niifname, au.ext_str())

    if not outfname:
        outfname = niifname

    try:
        #load data
        vol = nib.load(niifname).get_data()
        aff = nib.load(niifname).get_affine()

        vol = np.abs(vol)

        #save nifti file
        au.save_nibabel (outfname, vol, aff)

    except:
        au.log.error ("Change_to_absolute_values:: Unexpected error: ", sys.exc_info()[0])
        raise
def change_to_absolute_values(niifname, outfname=''):

    niifname = au.add_extension_if_needed(niifname, au.ext_str())

    if not outfname:
        outfname = niifname

    try:
        #load data
        vol = nib.load(niifname).get_data()
        aff = nib.load(niifname).get_affine()

        vol = np.abs(vol)

        #save nifti file
        au.save_nibabel(outfname, vol, aff)

    except:
        au.log.error("Change_to_absolute_values:: Unexpected error: ",
                     sys.exc_info()[0])
        raise
def remove_subject_from_stats (meanfname, varfname, samplesize, subjvolfname, newmeanfname, newvarfname, newstdfname=''):

    meanfname    = au.add_extension_if_needed(meanfname,    au.ext_str())
    varfname     = au.add_extension_if_needed(varfname,     au.ext_str())
    subjvolfname = au.add_extension_if_needed(subjvolfname, au.ext_str())

    newmeanfname = au.add_extension_if_needed(newmeanfname, au.ext_str())
    newvarfname  = au.add_extension_if_needed(newvarfname,  au.ext_str())

    if newstdfname:
        newstdfname = au.add_extension_if_needed(newstdfname, au.ext_str())

    #load data
    n = samplesize

    meanv = nib.load(meanfname).get_data()
    varv  = nib.load( varfname).get_data()
    subjv = nib.load(subjvolfname).get_data()
    aff   = nib.load(meanfname).get_affine()

    #calculate new mean: ((oldmean*N) - x)/(N-1)
    newmean = meanv.copy()
    newmean = ((newmean * n) - subjv)/(n-1)
    newmean = np.nan_to_num(newmean)

    #calculate new variance: 
    # oldvar = (n/(n-1)) * (sumsquare/n - oldmu^2)
    # s = ((oldvar * (n/(n-1)) ) + oldmu^2) * n
    # newvar = ((n-1)/(n-2)) * (((s - x^2)/(n-1)) - newmu^2)
    s = varv.copy()
    s = ((s * (n/(n-1)) ) + np.square(meanv)) * n
    newvar = ((n-1)/(n-2)) * (((s - np.square(subjv))/(n-1)) - np.square(newmean))
    newvar = np.nan_to_num(newvar)

    #save nifti files
    au.save_nibabel (newmeanfname, newmean, aff)
    au.save_nibabel (newvarfname , newvar,  aff)

    #calculate new standard deviation: sqrt(newvar)
    if newstdfname:
        newstd = np.sqrt(newvar)
        newstd = np.nan_to_num(newstd)
        au.save_nibabel (newstdfname, newstd, aff)
def group_distance (measure_function, datadir, groups, groupsizes, chkf, absolute=False, outdir='', foldno='', expname='', exclude_idx=-1, exclude_subj='', exclude_subjclass=''):

    olddir = os.getcwd()

    if not outdir:
        outdir = datadir

    ngroups = len(groups)
    #matrix of strings of 2000 characters maximum, to save filepaths
    gfnames = np.zeros ([ngroups,3], dtype=np.dtype('a2000'))

    subject_excluded = False

    for g1 in range(ngroups):
        g1name = groups[g1]
        #mean1fname
        gfnames[g1,0] = datadir + os.path.sep + g1name + '_' + au.mean_str()
        #var1fname  
        gfnames[g1,1] = datadir + os.path.sep + g1name + '_' + au.var_str()
        #std1fname
        gfnames[g1,2] = datadir + os.path.sep + g1name + '_' + au.std_str()

        for g2 in range(g1+1, ngroups):
            g2name = groups[g2]
            gfnames[g2,0] = datadir + os.path.sep + g2name + '_' + au.mean_str()
            gfnames[g2,1] = datadir + os.path.sep + g2name + '_' + au.var_str()
            gfnames[g2,2] = datadir + os.path.sep + g2name + '_' + au.std_str()

            experiment = g1name + '_vs_' + g2name

            #check if exclude_subjclass is any of both current groups
            eg = -1
            if exclude_idx > -1:
                if   exclude_subjclass == g1name: eg = g2
                elif exclude_subjclass == g2name: eg = g1

            step = au.measure_str() + ' ' + measure_function.func_name + ' ' + experiment + ' ' + datadir

            #remove subject from stats
            if eg > -1:
                exclude_str = '_' + au.excluded_str() + str(exclude_idx)
                step       += exclude_str
                experiment += exclude_str

                if not au.is_done(chkf, step):
                    if not subject_excluded:
                        newmeanfname = gfnames[eg,0] + exclude_str
                        newvarfname  = gfnames[eg,1] + exclude_str
                        newstdfname  = gfnames[eg,2] + exclude_str

                        rstep = au.remove_str() + ' ' + au.subject_str() + ' ' + str(exclude_subj) + ' ' + au.fromstats_str() + ' ' + datadir
                        if not au.is_done(chkf, rstep):
                           #(meanfname, varfname, samplesize, subjvolfname, newmeanfname, newvarfname, newstdfname='')
                           remove_subject_from_stats (gfnames[eg,0], gfnames[eg,1], groupsizes[eg][1], exclude_subj, newmeanfname, newvarfname, newstdfname)
                           au.checklist_add (chkf, rstep)

                        gfnames[eg,0] += exclude_str
                        gfnames[eg,1] += exclude_str
                        gfnames[eg,2] += exclude_str

                        groupsizes[eg][1] -= 1

                        subject_excluded = True

            #calculating distance
            if not au.is_done(chkf, step):
                mean1fname = au.add_extension_if_needed (gfnames[g1,0], au.ext_str())
                mean2fname = au.add_extension_if_needed (gfnames[g2,0], au.ext_str())
                var1fname  = au.add_extension_if_needed (gfnames[g1,1], au.ext_str())
                var2fname  = au.add_extension_if_needed (gfnames[g2,1], au.ext_str())
                std1fname  = au.add_extension_if_needed (gfnames[g1,2], au.ext_str())
                std2fname  = au.add_extension_if_needed (gfnames[g2,2], au.ext_str())

                outfname = measure_function (mean1fname, mean2fname, var1fname, var2fname, std1fname, std2fname, groupsizes[g1][1], groupsizes[g2][1], experiment, outdir, exclude_idx)

                if absolute:
                    change_to_absolute_values (outfname)

                au.checklist_add (chkf, step)

                return outfname
def group_distance(measure_function,
                   datadir,
                   groups,
                   groupsizes,
                   chkf,
                   absolute=False,
                   outdir='',
                   foldno='',
                   expname='',
                   exclude_idx=-1,
                   exclude_subj='',
                   exclude_subjclass=''):

    olddir = os.getcwd()

    if not outdir:
        outdir = datadir

    ngroups = len(groups)
    #matrix of strings of 2000 characters maximum, to save filepaths
    gfnames = np.zeros([ngroups, 3], dtype=np.dtype('a2000'))

    subject_excluded = False

    for g1 in range(ngroups):
        g1name = groups[g1]
        #mean1fname
        gfnames[g1, 0] = datadir + os.path.sep + g1name + '_' + au.mean_str()
        #var1fname
        gfnames[g1, 1] = datadir + os.path.sep + g1name + '_' + au.var_str()
        #std1fname
        gfnames[g1, 2] = datadir + os.path.sep + g1name + '_' + au.std_str()

        for g2 in range(g1 + 1, ngroups):
            g2name = groups[g2]
            gfnames[g2,
                    0] = datadir + os.path.sep + g2name + '_' + au.mean_str()
            gfnames[g2,
                    1] = datadir + os.path.sep + g2name + '_' + au.var_str()
            gfnames[g2,
                    2] = datadir + os.path.sep + g2name + '_' + au.std_str()

            experiment = g1name + '_vs_' + g2name

            #check if exclude_subjclass is any of both current groups
            eg = -1
            if exclude_idx > -1:
                if exclude_subjclass == g1name: eg = g2
                elif exclude_subjclass == g2name: eg = g1

            step = au.measure_str(
            ) + ' ' + measure_function.func_name + ' ' + experiment + ' ' + datadir

            #remove subject from stats
            if eg > -1:
                exclude_str = '_' + au.excluded_str() + str(exclude_idx)
                step += exclude_str
                experiment += exclude_str

                if not au.is_done(chkf, step):
                    if not subject_excluded:
                        newmeanfname = gfnames[eg, 0] + exclude_str
                        newvarfname = gfnames[eg, 1] + exclude_str
                        newstdfname = gfnames[eg, 2] + exclude_str

                        rstep = au.remove_str() + ' ' + au.subject_str(
                        ) + ' ' + str(exclude_subj) + ' ' + au.fromstats_str(
                        ) + ' ' + datadir
                        if not au.is_done(chkf, rstep):
                            #(meanfname, varfname, samplesize, subjvolfname, newmeanfname, newvarfname, newstdfname='')
                            remove_subject_from_stats(gfnames[eg,
                                                              0], gfnames[eg,
                                                                          1],
                                                      groupsizes[eg][1],
                                                      exclude_subj,
                                                      newmeanfname,
                                                      newvarfname, newstdfname)
                            au.checklist_add(chkf, rstep)

                        gfnames[eg, 0] += exclude_str
                        gfnames[eg, 1] += exclude_str
                        gfnames[eg, 2] += exclude_str

                        groupsizes[eg][1] -= 1

                        subject_excluded = True

            #calculating distance
            if not au.is_done(chkf, step):
                mean1fname = au.add_extension_if_needed(
                    gfnames[g1, 0], au.ext_str())
                mean2fname = au.add_extension_if_needed(
                    gfnames[g2, 0], au.ext_str())
                var1fname = au.add_extension_if_needed(gfnames[g1, 1],
                                                       au.ext_str())
                var2fname = au.add_extension_if_needed(gfnames[g2, 1],
                                                       au.ext_str())
                std1fname = au.add_extension_if_needed(gfnames[g1, 2],
                                                       au.ext_str())
                std2fname = au.add_extension_if_needed(gfnames[g2, 2],
                                                       au.ext_str())

                outfname = measure_function(mean1fname, mean2fname, var1fname,
                                            var2fname, std1fname, std2fname,
                                            groupsizes[g1][1],
                                            groupsizes[g2][1], experiment,
                                            outdir, exclude_idx)

                if absolute:
                    change_to_absolute_values(outfname)

                au.checklist_add(chkf, step)

                return outfname