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