"""do stats report""" stats_report_filename = os.path.join(subject_data.output_dir, "report_stats.html") contrasts = dict((contrast_id, contrasts[contrast_id]) for contrast_id in z_maps.keys()) glm_reporter.generate_subject_stats_report( stats_report_filename, contrasts, z_maps, fmri_glm.mask, design_matrices=[design_matrix], subject_id=subject_data.subject_id, anat=anat, anat_affine=anat_affine, cluster_th=50, # we're only interested in this 'large' clusters start_time=stats_start_time, # additional ``kwargs`` for more informative report paradigm=paradigm.__dict__, TR=TR, n_scans=n_scans, hfcut=hfcut, frametimes=frametimes, drift_model=drift_model, hrf_model=hrf_model, ) # shutdown main report page base_reporter.ProgressReport().finish_dir(output_dir) print "\r\nStatistic report written to %s\r\n" % stats_report_filename
def execute_glm(doc, out_dir, contrast_definitions=None, outputs=None, glm_model='ar1', ): """Function to execute GLM for one subject --and perhaps multiple sessions thereof """ stats_start_time = time.ctime() # study_dir = os.path.join(out_dir, doc['study']) if outputs is None: outputs = {'maps': False, 'data': False, 'mask': True, 'model': True, } else: outputs['maps'] = False subject_id = doc['subject'] subject_output_dir = os.path.join( out_dir, subject_id) _export(doc, subject_output_dir, outputs=outputs) params = load_glm_params(doc) # instantiate GLM fmri_glm = FMRILinearModel(params['data'], params['design_matrices'], doc['mask']) # fit GLM fmri_glm.fit(do_scaling=True, model=glm_model) # save beta-maps to disk beta_map_dir = os.path.join(subject_output_dir, 'beta_maps') if not os.path.exists(beta_map_dir): os.makedirs(beta_map_dir) for j, glm in zip(range(len(fmri_glm.glms)), fmri_glm.glms): # XXX save array in some compressed format np.savetxt(os.path.join(beta_map_dir, "beta_map_%i.txt" % j), glm.get_beta(), # array has shape (n_conditions, n_voxels) ) # define contrasts if contrast_definitions is not None: params['contrasts'] = make_contrasts(params, contrast_definitions) contrasts = sorted(params['contrasts'][0].keys()) _contrasts = {} z_maps = {} # compute stats maps for index, contrast_id in enumerate(contrasts): print ' study[%s] subject[%s] contrast [%s]: %i/%i' % ( doc['study'], doc['subject'], contrast_id, index + 1, len(contrasts) ) contrast = [c[contrast_id] for c in params['contrasts']] contrast_name = contrast_id.replace(' ', '_') z_map, t_map, c_map, var_map = fmri_glm.contrast( contrast, con_id=contrast_id, output_z=True, output_stat=True, output_effects=True, output_variance=True,) for dtype, out_map in zip(['z', 't', 'c', 'variance'], [z_map, t_map, c_map, var_map]): map_dir = os.path.join(subject_output_dir, '%s_maps' % dtype) if not os.path.exists(map_dir): os.makedirs(map_dir) map_path = os.path.join(map_dir, '%s.nii.gz' % contrast_name) nb.save(out_map, map_path) # collect z map if dtype == 'z': _contrasts[contrast_name] = contrast z_maps[contrast_name] = map_path # invoke a single API to handle plotting and html business for you subject_stats_report_filename = os.path.join( subject_output_dir, "report_stats.html") glm_reporter.generate_subject_stats_report( subject_stats_report_filename, _contrasts, z_maps, doc['mask'], design_matrices=list(params['design_matrices']), subject_id=doc['subject'], cluster_th=15, # 15 voxels start_time=stats_start_time, TR=doc['TR'], n_scans=doc['n_scans'], n_sessions=doc['n_sessions'], model=glm_model, ) print "Report for subject %s written to %s" % ( doc['subject'], subject_stats_report_filename)
def execute_glm( doc, out_dir, contrast_definitions=None, outputs=None, glm_model='ar1', ): """Function to execute GLM for one subject --and perhaps multiple sessions thereof """ stats_start_time = time.ctime() # study_dir = os.path.join(out_dir, doc['study']) if outputs is None: outputs = { 'maps': False, 'data': False, 'mask': True, 'model': True, } else: outputs['maps'] = False subject_id = doc['subject'] subject_output_dir = os.path.join(out_dir, subject_id) _export(doc, subject_output_dir, outputs=outputs) params = load_glm_params(doc) # instantiate GLM fmri_glm = FMRILinearModel(params['data'], params['design_matrices'], doc['mask']) # fit GLM fmri_glm.fit(do_scaling=True, model=glm_model) # save beta-maps to disk beta_map_dir = os.path.join(subject_output_dir, 'beta_maps') if not os.path.exists(beta_map_dir): os.makedirs(beta_map_dir) for j, glm in zip(xrange(len(fmri_glm.glms)), fmri_glm.glms): # XXX save array in some compressed format np.savetxt( os.path.join(beta_map_dir, "beta_map_%i.txt" % j), glm.get_beta(), # array has shape (n_conditions, n_voxels) ) # define contrasts if contrast_definitions is not None: params['contrasts'] = make_contrasts(params, contrast_definitions) contrasts = sorted(params['contrasts'][0].keys()) _contrasts = {} z_maps = {} # compute stats maps for index, contrast_id in enumerate(contrasts): print ' study[%s] subject[%s] contrast [%s]: %i/%i' % ( doc['study'], doc['subject'], contrast_id, index + 1, len(contrasts)) contrast = [c[contrast_id] for c in params['contrasts']] contrast_name = contrast_id.replace(' ', '_') z_map, t_map, c_map, var_map = fmri_glm.contrast( contrast, con_id=contrast_id, output_z=True, output_stat=True, output_effects=True, output_variance=True, ) for dtype, out_map in zip(['z', 't', 'c', 'variance'], [z_map, t_map, c_map, var_map]): map_dir = os.path.join(subject_output_dir, '%s_maps' % dtype) if not os.path.exists(map_dir): os.makedirs(map_dir) map_path = os.path.join(map_dir, '%s.nii.gz' % contrast_name) nb.save(out_map, map_path) # collect z map if dtype == 'z': _contrasts[contrast_name] = contrast z_maps[contrast_name] = map_path # invoke a single API to handle plotting and html business for you subject_stats_report_filename = os.path.join(subject_output_dir, "report_stats.html") glm_reporter.generate_subject_stats_report( subject_stats_report_filename, _contrasts, z_maps, doc['mask'], design_matrices=list(params['design_matrices']), subject_id=doc['subject'], cluster_th=15, # 15 voxels start_time=stats_start_time, TR=doc['TR'], n_scans=doc['n_scans'], n_sessions=doc['n_sessions'], model=glm_model, ) print "Report for subject %s written to %s" % ( doc['subject'], subject_stats_report_filename)