SOP Examples¶
This document provides complete, working examples of SOPs that demonstrate various features and patterns you can use in your own procedures.
Basic SOP Example¶
A minimal SOP with essential fields:
'@context': https://schema.org
'@type': SoftwareApplication
id: BASIC_001
name: "Basic Protocol"
title: "Basic Laboratory Protocol"
version: "1.0.0"
author: "Lab User"
approver: "Lab Manager"
date-published: "2024-01-20"
status: "published"
url: "https://example.com/sops/basic"
license: "MIT"
keywords: ["basic", "example", "template"]
applicationCategory: "Laboratory Protocol"
taskgroups:
- id: main_group
name: "Main Procedures"
title: "Primary Laboratory Procedures"
ordinal: 1
children:
- id: general_info_task
'@type': Task
name: "General Info"
title: "General Information"
ordinal: 1
children:
- id: experiment_date
'@type': Field
name: "Experiment Date"
type: "string"
format: "date"
required: true
- id: operator_name
'@type': Field
name: "Operator Name"
type: "string"
required: true
description: "Full name of person performing the experiment"
Cell Culture SOP¶
A comprehensive cell culture protocol with multiple tabs and field types:
'@context': https://schema.org
'@type': SoftwareApplication
id: CELL_CULTURE_001
name: "Cell Culture Maintenance"
title: "Cell Culture Maintenance Protocol"
version: "2.1.0"
author: "Dr. Sarah Johnson"
approver: "Lab Director"
date-published: "2024-01-15"
status: "published"
url: "https://example.com/sops/cell-culture"
license: "MIT"
keywords: ["cell culture", "maintenance", "passaging", "mammalian cells"]
applicationCategory: "Cell Biology Protocol"
taskgroups:
- id: culture_maintenance_group
name: "Culture Maintenance"
title: "Cell Culture Maintenance Procedures"
description: "Standard procedures for maintaining cell cultures"
ordinal: 1
ui_config:
icon: "microscope"
collapsible: false
children:
# Tab 1: Setup
- id: setup_task
'@type': Task
name: "Setup"
title: "Experiment Setup"
ordinal: 1
children:
- id: project_id
'@type': Field
name: "Project ID"
type: "string"
required: true
validation:
pattern: "^PROJ-[0-9]{4}$"
message: "Format: PROJ-XXXX"
children:
- id: project_id_filename
'@type': ELNFilenameComponent
order: 1
filename_component: true
- id: cell_line
'@type': Field
name: "Cell Line"
type: "string"
required: true
enum: ["HEK293", "HeLa", "CHO", "Jurkat", "A549", "Other"]
- id: passage_number
'@type': Field
name: "Passage Number"
type: "number"
required: true
min: 1
max: 50
description: "Current passage number (P1-P50)"
- id: mycoplasma_test_date
'@type': Field
name: "Last Mycoplasma Test"
type: "string"
format: "date"
required: false
description: "Date of most recent mycoplasma testing"
# Tab 2: Media Preparation
- id: media_prep_task
'@type': Task
name: "Media Prep"
title: "Media Preparation"
ordinal: 2
children:
- id: base_media
'@type': Field
name: "Base Media"
type: "string"
required: true
enum: ["DMEM", "RPMI-1640", "MEM", "Ham's F-12", "Custom"]
- id: serum_percentage
'@type': Field
name: "Serum Percentage"
type: "number"
unit: "%"
required: true
min: 0
max: 20
default: 10
- id: antibiotics
'@type': Field
name: "Antibiotics Added"
type: "array"
items:
type: "string"
enum: ["Penicillin/Streptomycin", "Gentamicin", "Amphotericin B", "None"]
minItems: 0
maxItems: 3
- id: supplements
'@type': Field
name: "Additional Supplements"
type: "string"
required: false
description: "List any additional supplements added to media"
# Tab 3: Passaging Procedure
- id: passaging_task
'@type': Task
name: "Passaging"
title: "Passaging Procedure"
ordinal: 3
children:
- id: confluency
'@type': Field
name: "Starting Confluency"
type: "number"
unit: "%"
required: true
min: 0
max: 100
description: "Estimated confluency before passaging"
- id: split_ratio
'@type': Field
name: "Split Ratio"
type: "string"
required: true
enum: ["1:2", "1:3", "1:4", "1:5", "1:10", "Other"]
default: "1:3"
- id: trypsinization_time
'@type': Field
name: "Trypsinization Time"
type: "number"
unit: "minutes"
required: true
min: 1
max: 15
- id: cell_count
'@type': Field
name: "Cell Count"
type: "number"
unit: "cells/mL"
required: false
min: 0
format: "scientific"
- id: viability
'@type': Field
name: "Cell Viability"
type: "number"
unit: "%"
required: false
min: 0
max: 100
# Tab 4: Quality Control
- id: qc_task
'@type': Task
name: "QC"
title: "Quality Control"
ordinal: 4
children:
- id: morphology_check
'@type': Field
name: "Morphology Normal?"
type: "boolean"
required: true
description: "Are cells displaying normal morphology?"
- id: contamination_check
'@type': Field
name: "Contamination Observed?"
type: "boolean"
required: true
description: "Any signs of bacterial/fungal contamination?"
- id: microscopy_images
'@type': Field
name: "Microscopy Images"
type: "file"
file_config:
accept: ".jpg,.png,.tif"
maxSize: 20971520 # 20MB
multiple: true
required: false
- id: notes
'@type': Field
name: "Additional Notes"
type: "string"
format: "textarea"
required: false
maxLength: 500
Sample Processing SOP with Tables¶
An example using table inputs for sample tracking:
'@context': https://schema.org
'@type': SoftwareApplication
id: SAMPLE_PROC_001
name: "Sample Processing"
title: "Biological Sample Processing Protocol"
version: "1.5.0"
author: "Clinical Lab Team"
approver: "QC Manager"
date-published: "2024-02-01"
status: "published"
url: "https://example.com/sops/sample-processing"
license: "MIT"
keywords: ["sample", "processing", "clinical", "biobank"]
applicationCategory: "Clinical Protocol"
taskgroups:
- id: sample_proc_group
name: "Sample Processing"
title: "Sample Processing Workflow"
ordinal: 1
children:
# Tab 1: Batch Information
- id: batch_info_task
'@type': Task
name: "Batch Info"
title: "Batch Information"
ordinal: 1
children:
- id: batch_id
'@type': Field
name: "Batch ID"
type: "string"
required: true
validation:
pattern: "^BATCH-[0-9]{6}$"
message: "Format: BATCH-YYYYMM"
children:
- id: batch_id_filename
'@type': ELNFilenameComponent
order: 1
filename_component: true
- id: processing_date
'@type': Field
name: "Processing Date"
type: "string"
format: "date"
required: true
- id: technician
'@type': Field
name: "Processing Technician"
type: "string"
required: true
# Tab 2: Sample Table
- id: samples_task
'@type': Task
name: "Samples"
title: "Sample Information"
ordinal: 2
children:
- id: sample_table
'@type': Table
name: "Sample Details"
description: "Enter information for each sample in the batch"
required: true
minRows: 1
maxRows: 96
columns:
- id: sample_id_col
name: "Sample ID"
type: "string"
required: true
validation:
pattern: "^S[0-9]{6}$"
- id: sample_type_col
name: "Sample Type"
type: "string"
required: true
enum: ["Plasma", "Serum", "Whole Blood", "Urine", "Tissue"]
- id: volume_col
name: "Volume (mL)"
type: "number"
required: true
min: 0.1
max: 50
- id: collection_time_col
name: "Collection Time"
type: "string"
format: "time"
required: true
- id: storage_temp_col
name: "Storage Temp (°C)"
type: "number"
required: true
enum: [-80, -20, 4, 25]
- id: aliquots_col
name: "# Aliquots"
type: "number"
required: true
min: 1
max: 10
- id: notes_col
name: "Notes"
type: "string"
required: false
maxLength: 100
# Tab 3: Processing Steps
- id: processing_steps_task
'@type': Task
name: "Processing"
title: "Processing Steps"
ordinal: 3
children:
- id: centrifuge_speed
'@type': Field
name: "Centrifuge Speed"
type: "number"
unit: "rpm"
required: true
min: 100
max: 15000
- id: centrifuge_time
'@type': Field
name: "Centrifuge Time"
type: "number"
unit: "minutes"
required: true
min: 1
max: 60
- id: centrifuge_temp
'@type': Field
name: "Centrifuge Temperature"
type: "number"
unit: "°C"
required: true
min: 4
max: 25
default: 4
Multi-Step Protocol with Nested Tasks¶
Example showing nested task structure for complex procedures:
'@context': https://schema.org
'@type': SoftwareApplication
id: ASSAY_PROTOCOL_001
name: "ELISA Assay"
title: "ELISA Assay Protocol"
version: "3.0.0"
author: "Immunology Lab"
approver: "Research Director"
date-published: "2024-02-10"
status: "published"
url: "https://example.com/sops/elisa"
license: "MIT"
keywords: ["ELISA", "immunoassay", "antibody", "detection"]
applicationCategory: "Immunoassay Protocol"
taskgroups:
- id: elisa_group
name: "ELISA Protocol"
title: "ELISA Assay Procedure"
ordinal: 1
children:
# Tab 1: Preparation
- id: preparation_task
'@type': Task
name: "Preparation"
title: "Assay Preparation"
ordinal: 1
children:
# Nested card for reagent prep
- id: reagent_prep_subtask
'@type': Task
name: "Reagent Preparation"
title: "Prepare Reagents"
ordinal: 1
ui_config:
component_type: "card"
variant: "outlined"
collapsible: true
children:
- id: coating_buffer
'@type': Field
name: "Coating Buffer Prepared"
type: "boolean"
required: true
- id: wash_buffer
'@type': Field
name: "Wash Buffer Volume (mL)"
type: "number"
required: true
min: 100
max: 2000
- id: blocking_buffer
'@type': Field
name: "Blocking Buffer Type"
type: "string"
required: true
enum: ["1% BSA", "5% Milk", "2% BSA", "Custom"]
# Nested card for sample prep
- id: sample_prep_subtask
'@type': Task
name: "Sample Preparation"
title: "Prepare Samples"
ordinal: 2
ui_config:
component_type: "card"
variant: "outlined"
collapsible: true
children:
- id: dilution_factor
'@type': Field
name: "Sample Dilution Factor"
type: "string"
required: true
enum: ["1:10", "1:50", "1:100", "1:500", "1:1000"]
- id: num_samples
'@type': Field
name: "Number of Samples"
type: "number"
required: true
min: 1
max: 96
# Tab 2: Plate Setup
- id: plate_setup_task
'@type': Task
name: "Plate Setup"
title: "Plate Configuration"
ordinal: 2
children:
- id: plate_layout
'@type': Field
name: "Plate Layout File"
type: "file"
file_config:
accept: ".xlsx,.csv"
maxSize: 5242880 # 5MB
required: false
description: "Upload plate layout template"
- id: standards_range
'@type': Field
name: "Standards Concentration Range"
type: "string"
required: true
description: "e.g., 0-1000 pg/mL"
# Tab 3: Incubation Steps
- id: incubation_task
'@type': Task
name: "Incubations"
title: "Incubation Steps"
ordinal: 3
children:
- id: coating_incubation
'@type': Task
name: "Coating"
title: "Coating Incubation"
ordinal: 1
ui_config:
component_type: "card"
children:
- id: coating_time
'@type': Field
name: "Incubation Time"
type: "number"
unit: "hours"
required: true
enum: [2, 4, 16] # 2h, 4h, or overnight
- id: coating_temp
'@type': Field
name: "Temperature"
type: "string"
required: true
enum: ["4°C", "Room Temperature", "37°C"]
- id: primary_antibody
'@type': Task
name: "Primary Ab"
title: "Primary Antibody"
ordinal: 2
ui_config:
component_type: "card"
children:
- id: primary_ab_time
'@type': Field
name: "Incubation Time"
type: "number"
unit: "minutes"
required: true
min: 30
max: 120
- id: primary_ab_dilution
'@type': Field
name: "Antibody Dilution"
type: "string"
required: true
validation:
pattern: "^1:[0-9]+$"
message: "Format: 1:XXXX"
File Upload and Import Example¶
SOP demonstrating file uploads and data import:
'@context': https://schema.org
'@type': SoftwareApplication
id: DATA_IMPORT_001
name: "Sequencing Data Import"
title: "Sequencing Data Import Protocol"
version: "1.0.0"
author: "Bioinformatics Team"
approver: "Data Manager"
date-published: "2024-02-15"
status: "published"
url: "https://example.com/sops/seq-import"
license: "MIT"
keywords: ["sequencing", "data import", "NGS", "bioinformatics"]
applicationCategory: "Data Management Protocol"
taskgroups:
- id: import_group
name: "Data Import"
title: "Sequencing Data Import"
ordinal: 1
children:
- id: file_upload_task
'@type': Task
name: "File Upload"
title: "Upload Sequencing Files"
ordinal: 1
children:
- id: fastq_files
'@type': Field
name: "FASTQ Files"
type: "file"
file_config:
accept: ".fastq,.fastq.gz,.fq,.fq.gz"
maxSize: 5368709120 # 5GB
multiple: true
required: true
description: "Upload paired-end FASTQ files"
- id: metadata_file
'@type': Field
name: "Sample Metadata"
type: "file"
file_config:
accept: ".csv,.xlsx"
maxSize: 10485760 # 10MB
multiple: false
required: true
description: "CSV or Excel file with sample information"
- id: reference_genome
'@type': Field
name: "Reference Genome"
type: "string"
required: true
enum: ["hg38", "hg19", "mm10", "mm9", "custom"]
- id: custom_reference
'@type': Field
name: "Custom Reference File"
type: "file"
file_config:
accept: ".fa,.fasta,.fa.gz"
maxSize: 1073741824 # 1GB
required: false
description: "Required if 'custom' selected above"
- id: import_template_task
'@type': Task
name: "Import Template"
title: "Data Import Template"
ordinal: 2
children:
- id: sample_import
'@type': ImportTemplate
name: "Sample Import Template"
format: "csv"
description: "Use this template for bulk sample import"
columns:
- field: "sample_id"
header: "Sample ID"
required: true
type: "string"
- field: "patient_id"
header: "Patient ID"
required: true
type: "string"
- field: "tissue_type"
header: "Tissue Type"
required: true
type: "string"
enum: ["Blood", "Tumor", "Normal", "Cell Line"]
- field: "read_length"
header: "Read Length"
required: true
type: "number"
- field: "paired_end"
header: "Paired End"
required: true
type: "boolean"
Validation Example¶
SOP with extensive validation rules:
'@context': https://schema.org
'@type': SoftwareApplication
id: VALIDATION_EXAMPLE_001
name: "Validated Protocol"
title: "Protocol with Complex Validation"
version: "1.0.0"
author: "QC Team"
approver: "QC Director"
date-published: "2024-02-20"
status: "published"
url: "https://example.com/sops/validation"
license: "MIT"
keywords: ["validation", "QC", "quality control"]
applicationCategory: "Quality Control"
# Cross-field validation rules
schema_dependencies:
cross_field_validations:
- name: "date_validation"
fields: ["start_date", "end_date"]
condition:
type: "comparison"
operator: "less_than_or_equal"
error_message: "End date must be after start date"
- name: "volume_validation"
fields: ["initial_volume", "final_volume"]
condition:
type: "comparison"
operator: "greater_than"
error_message: "Final volume cannot exceed initial volume"
- name: "concentration_calc"
fields: ["mass", "volume", "concentration"]
condition:
type: "calculation"
formula: "concentration = mass / volume"
error_message: "Concentration must equal mass/volume"
taskgroups:
- id: validation_group
name: "Validation Examples"
title: "Various Validation Rules"
ordinal: 1
children:
- id: validation_task
'@type': Task
name: "Validations"
title: "Field Validations"
ordinal: 1
children:
# Email validation
- id: email_field
'@type': Field
name: "Contact Email"
type: "string"
format: "email"
required: true
validation:
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
message: "Please enter a valid email address"
# URL validation
- id: protocol_url
'@type': Field
name: "Protocol URL"
type: "string"
format: "uri"
required: false
validation:
pattern: "^https?://.+"
message: "URL must start with http:// or https://"
# Custom pattern
- id: lot_number
'@type': Field
name: "Lot Number"
type: "string"
required: true
validation:
pattern: "^LOT[0-9]{4}-[A-Z]{2}$"
message: "Format: LOT####-XX (e.g., LOT2024-AB)"
# Numeric range
- id: ph_value
'@type': Field
name: "pH Value"
type: "number"
required: true
min: 0
max: 14
step: 0.1
validation:
precision: 1
message: "pH must be between 0 and 14"
# Date range
- id: start_date
'@type': Field
name: "Start Date"
type: "string"
format: "date"
required: true
validation:
min: "2024-01-01"
max: "2024-12-31"
message: "Date must be in 2024"
- id: end_date
'@type': Field
name: "End Date"
type: "string"
format: "date"
required: true
# Conditional required field
- id: requires_approval
'@type': Field
name: "Requires Approval?"
type: "boolean"
required: true
- id: approver_name
'@type': Field
name: "Approver Name"
type: "string"
required: false # Becomes required based on previous field
description: "Required if approval is needed"
Tips for Using Examples¶
Start Simple: Begin with the basic example and add complexity gradually
Copy and Modify: Use these examples as templates, changing IDs and fields as needed
Test Incrementally: Validate after each major change
Combine Features: Mix and match features from different examples
Keep IDs Unique: Always ensure all IDs are unique within your SOP
Common Patterns Reference¶
Pattern: Multi-Step Procedure¶
Use ordinal numbers for step sequence
Create separate tabs for each major phase
Nest related substeps within cards
Pattern: Data Collection Form¶
Group related fields in tasks
Use appropriate field types for data
Add validation to ensure data quality
Pattern: Sample Tracking¶
Use tables for batch sample entry
Include filename components for tracking
Add export configuration for reporting
Pattern: File Processing¶
Specify accepted file types clearly
Set appropriate size limits
Provide clear upload instructions
Pattern: Quality Control¶
Include boolean checks for pass/fail
Add notes fields for observations
Require documentation uploads