File size: 8,794 Bytes
31d5c57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
# Contributing to Spatial Metabolic Atlas

Thank you for your interest in contributing! This document provides guidelines for development, testing, and contributions.

## 🀝 How to Contribute

### Types of Contributions
- **Bug Fixes**: Report and fix issues
- **Features**: Add new analysis modules or visualizations
- **Documentation**: Improve guides and examples
- **Tests**: Add unit and integration tests
- **Performance**: Optimize existing code

## πŸ”§ Development Setup

### 1. Clone Repository
```bash
git clone <repo-url>
cd streamlit_app
```

### 2. Create Development Environment
```bash
# Create virtual environment
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# Install dependencies with dev extras
pip install -r requirements.txt
pip install -e .  # If using setup.py
```

### 3. Install Pre-commit Hooks
```bash
pip install pre-commit
pre-commit install
```

## πŸ“ Code Style

### Python Style Guide (PEP 8)
```bash
# Format code
black modules/ utils/

# Check linting
flake8 modules/ utils/

# Type checking
mypy modules/ utils/
```

### Docstring Format
```python
def example_function(param1: str, param2: int) -> bool:
    """
    Brief description of function.
    
    Longer description if needed, explaining the purpose,
    algorithm, or important details.
    
    Parameters
    ----------
    param1 : str
        Description of param1
    param2 : int
        Description of param2
    
    Returns
    -------
    bool
        Description of return value
    
    Examples
    --------
    >>> result = example_function("test", 42)
    >>> print(result)
    True
    
    Notes
    -----
    Additional implementation notes or warnings.
    """
    return True
```

## πŸ§ͺ Testing

### Running Tests
```bash
# Run all tests
pytest

# Run specific test file
pytest tests/test_visualization.py

# Run with coverage
pytest --cov=modules --cov=utils tests/

# Verbose output
pytest -v
```

### Writing Tests
```python
# tests/test_module.py
import pytest
from modules import visualization

def test_spatial_flux_map_basic():
    """Test basic spatial flux map generation."""
    # Setup
    mock_adata = create_mock_adata()
    
    # Action
    fig = visualization.plot_spatial_flux(mock_adata, 'EX_glc_D[e]')
    
    # Assert
    assert fig is not None
    assert fig.axes is not None

def test_visualization_with_invalid_reaction():
    """Test error handling for invalid reactions."""
    mock_adata = create_mock_adata()
    
    with pytest.raises(ValueError):
        visualization.plot_spatial_flux(mock_adata, 'INVALID_RXN')
```

## πŸ“¦ Adding New Modules

### Structure for New Feature
```
modules/
β”œβ”€β”€ new_feature.py      # Main module
β”œβ”€β”€ __init__.py
└── tests/
    └── test_new_feature.py
```

### Module Template
```python
"""
New Feature Module
==================

Brief description of functionality.
"""

import streamlit as st
import logging

logger = logging.getLogger(__name__)


def render():
    """Render feature UI."""
    st.markdown("## πŸ†• New Feature")
    
    # Check prerequisites
    if st.session_state.metabolic_adata is None:
        st.error("Please run flux analysis first.")
        return
    
    metabolic_adata = st.session_state.metabolic_adata
    
    # UI components
    col1, col2 = st.columns(2)
    
    with col1:
        # Input controls
        parameter = st.slider("Parameter:", 1, 100, 50)
    
    with col2:
        # Additional options
        method = st.selectbox("Method:", ["option1", "option2"])
    
    # Main computation
    if st.button("▢️ Run Analysis") :
        try:
            with st.spinner("Computing..."):
                result = perform_analysis(metabolic_adata, parameter, method)
            
            st.success("βœ“ Analysis complete!")
            st.dataframe(result)
            
        except Exception as e:
            st.error(f"Error: {str(e)}")
            logger.error(f"Analysis failed: {str(e)}", exc_info=True)


def perform_analysis(adata, parameter, method):
    """
    Perform custom analysis.
    
    Parameters
    ----------
    adata : AnnData
        Input data
    parameter : int
        Analysis parameter
    method : str
        Analysis method
    
    Returns
    -------
    pd.DataFrame
        Analysis results
    """
    # Implementation
    results = {}
    return results
```

### Integrating into Main App
```python
# app.py
elif page == "πŸ†• New Feature":
    from modules import new_feature
    new_feature.render()
```

## πŸ“š Documentation

### Adding to README.md
1. Update feature list under "Features"
2. Add usage instructions in "Usage Guide"
3. Include examples and expected outputs

### Creating Examples
```python
# examples/basic_workflow.py
"""
Basic workflow example for Spatial Metabolic Atlas.
"""

import scanpy as sc
from streamlit_app.utils import plotting, flux_utils

# Load data
adata = sc.read_h5ad("data/spatial_data.h5ad")

# Preprocess
sc.pp.normalize_total(adata, 1e4)
sc.pp.log1p(adata)

# Visualize
fig = plotting.plot_spatial_flux(adata, "EX_glc_D[e]")

print("Done!")
```

## πŸ› Bug Reports

When reporting bugs, include:
- **Title**: Concise description
- **Steps to reproduce**: Exact steps to recreate issue
- **Expected behavior**: What should happen
- **Actual behavior**: What actually happens
- **Screenshots**: If applicable
- **Environment**: Python version, OS, package versions

### Bug Report Template
```markdown
## Bug: [Title]

### Steps to Reproduce
1. Load dataset X
2. Go to Y module
3. Click button Z
4. Get error

### Expected Behavior
Should show visualization

### Actual Behavior
Shows error message: "..."

### Screenshots
[If applicable]

### Environment
- Python: 3.10.5
- Streamlit: 1.28.0
- OS: Ubuntu 22.04
```

## 🎨 Feature Requests

Provide:
- **Use case**: Why is this needed?
- **Description**: Detailed description
- **Example**: How would it be used?
- **Priority**: Low, Medium, High

### Feature Request Template
```markdown
## Feature: [Title]

### Use Case
Researchers want to [use case description]

### Proposed Solution
Implement [feature description]

### Example Usage
[How users would use this feature]

### Additional Context
[Any other relevant information]
```

## πŸ“ˆ Pull Request Process

1. **Fork** the repository
2. **Create Branch**: `git checkout -b feature/feature-name`
3. **Make Changes**: Follow code style guidelines
4. **Write Tests**: Add tests for new functionality
5. **Document**: Update README, docstrings, comments
6. **Commit**: Clear, descriptive commit messages
7. **Push**: `git push origin feature/feature-name`
8. **Create PR**: Open pull request with description

### PR Template
```markdown
## Description
Brief description of changes

## Type
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation
- [ ] Performance

## Changes
- Change 1
- Change 2

## Testing
- [ ] Tests added/updated
- [ ] All tests passing
- [ ] Manual testing completed

## Screenshots
[If applicable]

## Checklist
- [ ] Code follows style guidelines
- [ ] Documentation updated
- [ ] Tests added
- [ ] No breaking changes
```

## πŸ—οΈ Architecture Decisions

### Module Interface Standard
All modules should:
- Implement `render()` function
- Check `st.session_state` for prerequisites
- Handle errors gracefully with try/except
- Log important operations
- Provide user feedback (success/error messages)

### Caching Strategy
```python
@st.cache_data(ttl=3600)
def expensive_computation(data):
    """This will be cached for 1 hour."""
    return result

@st.cache_resource
def load_model():
    """This will be cached for entire session."""
    return model
```

## πŸ”„ Release Process

1. **Update Version**:
   - `app.py`: Update version string
   - `setup.py`: Update version
   - Create CHANGELOG entry

2. **Create Release**:
   - Tag commit: `git tag v1.0.0`
   - Push tag: `git push origin v1.0.0`
   - Create GitHub release with notes

3. **Deploy**:
   - Build Docker image
   - Push to registry
   - Deploy to production

## πŸ“ž Getting Help

- **Documentation**: Check README.md and DEPLOYMENT.md
- **Issues**: Search GitHub Issues
- **Discussions**: Start discussion thread
- **Email**: contact@example.com

## πŸ“‹ Code of Conduct

### Our Pledge
We are committed to providing a welcoming and inclusive environment.

### Our Standards
- Use welcoming language
- Be respectful of differing opinions
- Accept constructive criticism gracefully
- Focus on what is best for the community
- Show empathy towards other community members

### Enforcement
Violations may result in removal from the community.

---

**Thank you for contributing!** πŸŽ‰

Your contributions help make Spatial Metabolic Atlas better for researchers worldwide.

**Last Updated**: February 2024