@@ -276,7 +276,6 @@ def main():
276
276
"""Entry point"""
277
277
from nipype import logging as nlogging
278
278
from multiprocessing import set_start_method , Process , Manager
279
- from ..viz .reports import generate_reports
280
279
from ..utils .bids import write_derivative_description
281
280
set_start_method ('forkserver' )
282
281
@@ -400,8 +399,6 @@ def before_send(event, hints):
400
399
nlogging .getLogger ('nipype.interface' ).setLevel (log_level )
401
400
nlogging .getLogger ('nipype.utils' ).setLevel (log_level )
402
401
403
- errno = 0
404
-
405
402
# Call build_workflow(opts, retval)
406
403
with Manager () as mgr :
407
404
retval = mgr .dict ()
@@ -411,9 +408,9 @@ def before_send(event, hints):
411
408
412
409
retcode = p .exitcode or retval .get ('return_code' , 0 )
413
410
414
- bids_dir = retval .get ('bids_dir' )
415
- output_dir = retval .get ('output_dir' )
416
- work_dir = retval .get ('work_dir' )
411
+ bids_dir = Path ( retval .get ('bids_dir' ) )
412
+ output_dir = Path ( retval .get ('output_dir' ) )
413
+ work_dir = Path ( retval .get ('work_dir' ) )
417
414
plugin_settings = retval .get ('plugin_settings' , None )
418
415
subject_list = retval .get ('subject_list' , None )
419
416
fmriprep_wf = retval .get ('workflow' , None )
@@ -452,32 +449,48 @@ def before_send(event, hints):
452
449
sentry_sdk .add_breadcrumb (message = 'fMRIPrep started' , level = 'info' )
453
450
sentry_sdk .capture_message ('fMRIPrep started' , level = 'info' )
454
451
452
+ errno = 1 # Default is error exit unless otherwise set
455
453
try :
456
454
fmriprep_wf .run (** plugin_settings )
457
- except RuntimeError as e :
458
- errno = 1
459
- if "Workflow did not execute cleanly" not in str (e ):
460
- sentry_sdk .capture_exception (e )
461
- raise
455
+ except Exception as e :
456
+ if not opts .notrack :
457
+ from ..utils .sentry import process_crashfile
458
+ crashfolders = [output_dir / 'fmriprep' / 'sub-{}' .format (s ) / 'log' / run_uuid
459
+ for s in subject_list ]
460
+ for crashfolder in crashfolders :
461
+ for crashfile in crashfolder .glob ('crash*.*' ):
462
+ process_crashfile (crashfile )
463
+
464
+ if "Workflow did not execute cleanly" not in str (e ):
465
+ sentry_sdk .capture_exception (e )
466
+ logger .critical ('fMRIPrep failed: %s' , e )
467
+ raise
462
468
else :
463
469
if opts .run_reconall :
464
470
from templateflow import api
465
471
from niworkflows .utils .misc import _copy_any
466
472
dseg_tsv = str (api .get ('fsaverage' , suffix = 'dseg' , extensions = ['.tsv' ]))
467
473
_copy_any (dseg_tsv ,
468
- str (Path ( output_dir ) / 'fmriprep' / 'desc-aseg_dseg.tsv' ))
474
+ str (output_dir / 'fmriprep' / 'desc-aseg_dseg.tsv' ))
469
475
_copy_any (dseg_tsv ,
470
- str (Path (output_dir ) / 'fmriprep' / 'desc-aparcaseg_dseg.tsv' ))
476
+ str (output_dir / 'fmriprep' / 'desc-aparcaseg_dseg.tsv' ))
477
+ errno = 0
471
478
logger .log (25 , 'fMRIPrep finished without errors' )
479
+ if not opts .notrack :
480
+ sentry_sdk .capture_message ('fMRIPrep finished without errors' ,
481
+ level = 'info' )
472
482
finally :
483
+ from niworkflows .reports import generate_reports
473
484
# Generate reports phase
474
- errno + = generate_reports (subject_list , output_dir , work_dir , run_uuid ,
475
- sentry_sdk = sentry_sdk )
476
- write_derivative_description (bids_dir , str ( Path ( output_dir ) / 'fmriprep' ) )
485
+ failed_reports = generate_reports (
486
+ subject_list , output_dir , work_dir , run_uuid , packagename = 'fmriprep' )
487
+ write_derivative_description (bids_dir , output_dir / 'fmriprep' )
477
488
478
- if not opts .notrack and errno == 0 :
479
- sentry_sdk .capture_message ('fMRIPrep finished without errors' , level = 'info' )
480
- sys .exit (int (errno > 0 ))
489
+ if failed_reports and not opts .notrack :
490
+ sentry_sdk .capture_message (
491
+ 'Report generation failed for %d subjects' % failed_reports ,
492
+ level = 'error' )
493
+ sys .exit (int ((errno + failed_reports ) > 0 ))
481
494
482
495
483
496
def validate_input_dir (exec_env , bids_dir , participant_label ):
@@ -590,9 +603,9 @@ def build_workflow(opts, retval):
590
603
591
604
from nipype import logging , config as ncfg
592
605
from niworkflows .utils .bids import collect_participants
606
+ from niworkflows .reports import generate_reports
593
607
from ..__about__ import __version__
594
608
from ..workflows .base import init_fmriprep_wf
595
- from ..viz .reports import generate_reports
596
609
597
610
logger = logging .getLogger ('nipype.workflow' )
598
611
@@ -750,7 +763,8 @@ def build_workflow(opts, retval):
750
763
run_uuid = opts .run_uuid
751
764
retval ['run_uuid' ] = run_uuid
752
765
retval ['return_code' ] = generate_reports (
753
- subject_list , str (output_dir ), str (work_dir ), run_uuid )
766
+ subject_list , output_dir , work_dir , run_uuid ,
767
+ packagename = 'fmriprep' )
754
768
return retval
755
769
756
770
# Build main workflow
0 commit comments