-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbatch_process.py
More file actions
executable file
·137 lines (108 loc) · 4.73 KB
/
Copy pathbatch_process.py
File metadata and controls
executable file
·137 lines (108 loc) · 4.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env python3
"""
Batch Processing Script for ROI Detection Pipeline
This script allows processing multiple datasets or experiments in batch.
"""
import os
import sys
import yaml
import argparse
import logging
from pathlib import Path
from automated_pipeline import ROIDetectionPipeline
class BatchProcessor:
"""Batch processor for multiple experiments."""
def __init__(self, config_dir: str):
"""Initialize batch processor."""
self.config_dir = Path(config_dir)
self.logger = logging.getLogger(__name__)
def find_config_files(self) -> list:
"""Find all configuration files in the directory."""
config_files = list(self.config_dir.glob("config_*.yaml"))
config_files.extend(list(self.config_dir.glob("config_*.yml")))
return config_files
def process_single_config(self, config_path: str) -> bool:
"""Process a single configuration file."""
self.logger.info(f"Processing configuration: {config_path}")
try:
pipeline = ROIDetectionPipeline(str(config_path))
success = pipeline.run_pipeline()
if success:
self.logger.info(f"✓ Successfully completed: {config_path}")
else:
self.logger.error(f"✗ Failed: {config_path}")
return success
except Exception as e:
self.logger.error(f"✗ Error processing {config_path}: {e}")
return False
def process_batch(self, config_files: list = None) -> dict:
"""Process multiple configuration files."""
if config_files is None:
config_files = self.find_config_files()
if not config_files:
self.logger.warning("No configuration files found")
return {}
results = {}
for config_file in config_files:
config_name = config_file.stem
self.logger.info(f"\n{'='*60}")
self.logger.info(f"Processing: {config_name}")
self.logger.info(f"{'='*60}")
success = self.process_single_config(str(config_file))
results[config_name] = success
return results
def generate_summary(self, results: dict):
"""Generate summary of batch processing results."""
self.logger.info(f"\n{'='*60}")
self.logger.info("BATCH PROCESSING SUMMARY")
self.logger.info(f"{'='*60}")
total = len(results)
successful = sum(results.values())
failed = total - successful
self.logger.info(f"Total configurations: {total}")
self.logger.info(f"Successful: {successful}")
self.logger.info(f"Failed: {failed}")
self.logger.info(f"Success rate: {successful/total*100:.1f}%")
self.logger.info("\nDetailed Results:")
for config_name, success in results.items():
status = "✓ SUCCESS" if success else "✗ FAILED"
self.logger.info(f" {config_name}: {status}")
def main():
"""Main function for batch processing."""
parser = argparse.ArgumentParser(description='Batch Process ROI Detection Pipeline')
parser.add_argument('--config-dir', type=str, default='.',
help='Directory containing configuration files')
parser.add_argument('--config-files', nargs='+', type=str,
help='Specific configuration files to process')
parser.add_argument('--log-level', type=str, default='INFO',
choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
help='Logging level')
args = parser.parse_args()
# Setup logging
logging.basicConfig(
level=getattr(logging, args.log_level),
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('batch_process.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
try:
processor = BatchProcessor(args.config_dir)
if args.config_files:
# Process specific files
config_files = [Path(f) for f in args.config_files]
results = processor.process_batch(config_files)
else:
# Process all config files in directory
results = processor.process_batch()
processor.generate_summary(results)
# Return appropriate exit code
failed_count = sum(1 for success in results.values() if not success)
return 1 if failed_count > 0 else 0
except Exception as e:
logger.error(f"Batch processing failed: {e}")
return 1
if __name__ == "__main__":
sys.exit(main())