THD_3dim_dataset * GRINCOR_extract_dataset( MRI_shindss *shd, int ids, char *pref )
{
   MRI_vectim *mv ;
   THD_3dim_dataset *dset ;
   char prefix[THD_MAX_NAME] ;
   int iv , nvals=shd->nvals[ids] ;
   static int nds=0 ;

ENTRY("GRINCOR_extract_dataset") ;

STATUS("extract vectim") ;
   mv = GRINCOR_extract_vectim( shd , ids ) ;

STATUS("create empty copy of template") ;
   dset = EDIT_empty_copy( shd->tdset ) ;

STATUS("edit prefix") ;
   prefix[0] = '\0' ;
   if( pref != NULL && *pref != '\0' ){ strcpy(prefix,pref) ; strcat(prefix,"_") ; }
   if( shd->dslab != NULL && shd->dslab[ids] != NULL ){
     strcat(prefix,shd->dslab[ids]) ;
   } else {
     nds++ ;
     sprintf(prefix+strlen(prefix),"%03d",nds) ;
   }

STATUS("edit empty copy header") ;
   EDIT_dset_items( dset ,
                      ADN_prefix    , prefix          ,
                      ADN_nvals     , nvals           ,
                      ADN_ntt       , nvals           ,
                      ADN_ttdel     , 1.0             ,
                      ADN_tunits    , UNITS_SEC_TYPE  ,
                      ADN_brick_fac , NULL            ,
                      ADN_type      , HEAD_FUNC_TYPE  ,
                      ADN_func_type , FUNC_FIM_TYPE   ,
                    ADN_none ) ;

STATUS("create empty float bricks") ;
   for( iv=0 ; iv < nvals ; iv++ )
     EDIT_substitute_brick( dset , iv , MRI_float , NULL ) ;

STATUS("copy index vector") ;
   if( shd->ivec != NULL ){
     memcpy( mv->ivec , shd->ivec , sizeof(int)*shd->nvec ) ;
   } else {
     for( iv=0 ; iv < shd->nvec ; iv++ ) mv->ivec[iv] = iv ;
   }

STATUS("convert vectim to dset") ;
   THD_vectim_to_dset( mv , dset ) ;

STATUS("destroy vectim") ;
   VECTIM_destroy( mv ) ;

   RETURN(dset) ;
}
THD_3dim_dataset * GRINCOR_extract_dataset( MRI_shindss *shd, int ids, char *pref )
{
   MRI_vectim *mv ;
   THD_3dim_dataset *dset ;
   char prefix[THD_MAX_NAME] ;
   int iv , nvals=shd->nvals[ids] ;

   mv = GRINCOR_extract_vectim( shd , ids ) ;

   dset = EDIT_empty_copy( shd->tdset ) ;

   prefix[0] = '\0' ;
   if( pref != NULL && *pref != '\0' ){ strcpy(prefix,pref) ; strcat(prefix,"_") ; }
   strcat(prefix,shd->dslab[ids]) ;

   EDIT_dset_items( dset ,
                      ADN_prefix    , prefix          ,
                      ADN_nvals     , nvals           ,
                      ADN_ntt       , nvals           ,
                      ADN_ttdel     , 1.0             ,
                      ADN_tunits    , UNITS_SEC_TYPE  ,
                      ADN_brick_fac , NULL            ,
                      ADN_type      , HEAD_FUNC_TYPE  ,
                      ADN_func_type , FUNC_FIM_TYPE   ,
                    ADN_none ) ;

   for( iv=0 ; iv < nvals ; iv++ )
     EDIT_substitute_brick( dset , iv , MRI_float , NULL ) ;

   if( shd->ivec != NULL ){
     memcpy( mv->ivec , shd->ivec , sizeof(int)*shd->nvec ) ;
   } else {
     for( iv=0 ; iv < shd->nvec ; iv++ ) mv->ivec[iv] = iv ;
   }

   THD_vectim_to_dset( mv , dset ) ;
   VECTIM_destroy( mv ) ;

   return dset ;
}