File size: 6,058 Bytes
b279e28 | 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 138 139 140 141 142 143 144 145 146 147 148 | # Project File Structure and Naming Convention Documentation
## Overview
This document describes the file naming and storage structure used throughout the project to ensure consistent file organization and prevent path-related errors.
## Directory Structure
### Base Structure
```
{solver_cache}/
βββ {query_id}/ # Query-specific cache directory
βββ tool_cache/ # All tool outputs go here
βββ {group}/ # Group subdirectories (created by some tools)
β βββ {files} # Group-specific files
βββ {files} # Direct tool outputs (metadata, etc.)
```
### Query Cache Directory
- **Location**: `{solver_cache}/{query_id}/`
- **Purpose**: Root directory for all files related to a specific query
- **Example**: `/tmp/solver_cache/2d1d6a184495417fa2294fb620d903cb/`
### Tool Cache Directory
- **Location**: `{query_cache_dir}/tool_cache/`
- **Purpose**: All tool outputs are stored here
- **Example**: `/tmp/solver_cache/2d1d6a184495417fa2294fb620d903cb/tool_cache/`
## Tool-Specific File Storage
### 1. Image_Preprocessor_Tool
- **Output Location**: `{tool_cache_dir}/{group}/`
- **File Naming**: `{image_identifier}_{group}_processed.png`
- **Example**: `tool_cache/default/A1_02_1_1_Phase Contrast_001_default_processed.png`
- **Note**: Creates group subdirectories
### 2. Nuclei_Segmenter_Tool / Cell_Segmenter_Tool
- **Output Location**: `{tool_cache_dir}/`
- **File Naming**:
- `nuclei_mask_{image_identifier}.tif` (for Nuclei_Segmenter_Tool)
- `cell_mask_{image_identifier}.tif` (for Cell_Segmenter_Tool)
- **Example**: `tool_cache/nuclei_mask_c3e4dac8a1a740baa9cf843ce5873570.tif`
### 3. Single_Cell_Cropper_Tool
- **Output Location**: `{tool_cache_dir}/`
- **File Naming**:
- Cell crops: `cell_{idx:04d}_crop.{format}`
- Cell masks: `cell_{idx:04d}_mask.{format}`
- **Metadata**: `cell_crops_metadata_{uuid8}.json` β οΈ **CRITICAL**
- **Metadata Location**: `{tool_cache_dir}/cell_crops_metadata_*.json`
- **Example**: `tool_cache/cell_crops_metadata_a1b2c3d4.json`
- **Note**:
- Metadata is saved directly in `tool_cache_dir`, NOT in group subdirectories
- Cell crops are also saved directly in `tool_cache_dir`
- The `group` parameter is stored in metadata, not used for directory structure
### 4. Cell_State_Analyzer_Tool
- **Input**: Reads metadata from `{tool_cache_dir}/cell_crops_metadata_*.json`
- **Search Strategy**:
1. First checks `{tool_cache_dir}/` directly
2. Then checks all subdirectories in `{tool_cache_dir}/` (including group subdirectories)
3. Merges all found metadata files for multi-image processing
- **Output Location**: `{tool_cache_dir}/`
- **File Naming**: `adata_{timestamp}.h5ad`, `cell_metadata_{timestamp}.csv`
## Critical Path Handling Rules
### Executor Path Management
1. **query_cache_dir**: Always the parent directory (without 'tool_cache')
- Example: `/tmp/solver_cache/2d1d6a184495417fa2294fb620d903cb`
- Normalized in `set_query_cache_dir()` to remove 'tool_cache' suffix if present
2. **tool_cache_dir**: Always `{query_cache_dir}/tool_cache`
- Example: `/tmp/solver_cache/2d1d6a184495417fa2294fb620d903cb/tool_cache`
- Set via `tool.set_custom_output_dir(self.tool_cache_dir)` in executor
### Single_Cell_Cropper_Tool Path Handling
1. Receives `query_cache_dir` parameter (parent directory)
2. Creates `tool_cache_dir = os.path.join(query_cache_dir, "tool_cache")`
3. Saves metadata to: `{tool_cache_dir}/cell_crops_metadata_{uuid}.json`
4. **Does NOT** create group subdirectories for metadata
### Cell_State_Analyzer_Tool Path Handling
1. Receives `query_cache_dir` parameter (parent directory)
2. Searches in:
- `{query_cache_dir}/tool_cache/` (primary location)
- All subdirectories of `{query_cache_dir}/tool_cache/` (including group subdirectories)
3. Merges all found metadata files
## Common Issues and Solutions
### Issue 1: Metadata Not Found
**Symptom**: `No metadata files found. Searched in: {path}`
**Possible Causes**:
1. Single_Cell_Cropper_Tool not executed before Cell_State_Analyzer_Tool
2. Metadata saved in group subdirectory but Cell_State_Analyzer_Tool only checking root
3. Path mismatch between save and load locations
**Solution**:
- Updated `_load_cell_data_from_metadata()` to search in all subdirectories
- Added comprehensive logging to track file locations
### Issue 2: Path Normalization
**Symptom**: Path contains 'tool_cache' when it shouldn't
**Solution**:
- `set_query_cache_dir()` normalizes paths to ensure `query_cache_dir` is always parent directory
- Command generation uses normalized paths
## Best Practices
1. **Always use `query_cache_dir` parameter** (parent directory) when calling tools
2. **Never hardcode paths** - use `os.path.join()` for cross-platform compatibility
3. **Normalize paths** before comparison or storage
4. **Log paths** during save and load operations for debugging
5. **Check subdirectories** when searching for files that might be in group subdirectories
## File Naming Conventions
### Metadata Files
- Pattern: `{tool_name}_metadata_{uuid8}.json`
- Example: `cell_crops_metadata_a1b2c3d4.json`
- UUID: 8-character hexadecimal string
### Image Files
- Pattern: `{prefix}_{identifier}_{suffix}.{ext}`
- Examples:
- `nuclei_mask_c3e4dac8a1a740baa9cf843ce5873570.tif`
- `A1_02_1_1_Phase Contrast_001_default_processed.png`
- `cell_0001_crop.png`
### Data Files
- Pattern: `{type}_{timestamp}.{ext}`
- Examples:
- `adata_20240104_123456.h5ad`
- `cell_metadata_20240104_123456.csv`
## Summary
**Key Points**:
1. All tool outputs go to `{query_cache_dir}/tool_cache/`
2. Some tools (Image_Preprocessor_Tool) create group subdirectories
3. Single_Cell_Cropper_Tool saves metadata directly in `tool_cache_dir`, NOT in subdirectories
4. Cell_State_Analyzer_Tool searches both root and subdirectories to find metadata
5. Path normalization ensures consistent directory structure
6. Comprehensive logging helps debug path-related issues
|