Skip to main content Skills Marketplace Découvrez et explorez les compétences IA créées par la communauté.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Copier le promptAfficher les détails du prompt Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
npx skills add https://github.com/mdbabumiamssm/LLMs-Universal-Life-Science-and-Clinical-Skills- --skill bio-flow-cytometry-cytometry-qcLa commande reste sur une seule ligne. Faites défiler horizontalement pour la vérifier avant de la copier.
Vous préférez une copie locale ? Téléchargez les fichiers actuellement disponibles dans SkillsMP.
Télécharger Zip Téléchargement... Build reproducible healthcare imaging pipelines with Project MONAI for DICOM, NIfTI, pathology, and multidimensional imaging tasks including preprocessing, augmentation, training, sliding-window inference, evaluation, model bundles, labeling, and deployment. Use when implementing medical image classification, segmentation, registration, detection, generative, or foundation-model workflows in PyTorch.
Métiers associés SOC
Basé sur la classification professionnelle SOC
Explorateur de fichiers
3 fichiers name bio-flow-cytometry-cytometry-qc description Comprehensive quality control for flow cytometry and CyTOF data. Covers flow rate stability, signal drift, margin events, dead cell exclusion, and batch QC. Use when assessing acquisition quality or identifying problematic samples before analysis. tool_type r primary_tool flowAI
Cytometry QC
Automated QC with flowAI
library( flowAI)
library( flowCore)
ff <- read.FCS( 'sample.fcs' )
qc_result <- flow_auto_qc(
ff,
folder_results = 'qc_output/' ,
fcs_QC = TRUE ,
html_report
mini_report
ff_clean qc_result fcs
cat nrow ff
cat nrow ff_clean
cat nrow ff nrow ff_clean
nrow ff_clean nrow ff
=
TRUE
,
=
TRUE
)
<-
$
(
'Original events:'
,
(
)
,
'\n'
)
(
'After QC:'
,
(
)
,
'\n'
)
(
'Removed:'
,
(
)
-
(
)
,
'('
,
round
(
(
1
-
(
)
/
(
)
)
*
100
,
1
)
,
'%)\n'
)
Flow Rate Stability
check_flow_rate <- function ( ff, time_channel = 'Time' ) {
expr <- exprs( ff)
time <- expr[ , time_channel]
n_bins <- 50
bins <- cut( time, breaks = n_bins, labels = FALSE )
events_per_bin <- table( bins)
flow_rate <- as.numeric ( events_per_bin)
cv <- sd( flow_rate) / mean( flow_rate) * 100
z_scores <- abs ( scale( flow_rate) )
anomalies <- which( z_scores > 2 )
list (
mean_rate = mean( flow_rate) ,
cv_percent = cv,
anomaly_bins = anomalies,
stable = cv < 20 && length ( anomalies) < 3
)
}
flow_qc <- check_flow_rate( ff)
cat( 'Flow rate CV:' , round ( flow_qc$ cv_percent, 1 ) , '%\n' )
cat( 'Stable:' , flow_qc$ stable, '\n' )
Signal Drift Detection
detect_signal_drift <- function ( ff, channels, time_channel = 'Time' ) {
expr <- exprs( ff)
time <- expr[ , time_channel]
n_bins <- 20
bins <- cut( time, breaks = n_bins, labels = FALSE )
drift_results <- lapply( channels, function ( ch) {
bin_medians <- tapply( expr[ , ch] , bins, median, na.rm = TRUE )
trend <- lm( bin_medians ~ seq_along ( bin_medians) )
slope <- coef( trend) [ 2 ]
r_squared <- summary( trend) $ r.squared
pct_change <- ( tail( bin_medians, 1 ) - head( bin_medians, 1 ) ) / head( bin_medians, 1 ) * 100
list (
channel = ch,
slope = slope,
r_squared = r_squared,
percent_change = pct_change,
drift_detected = abs ( pct_change) > 10 && r_squared > 0.5
)
} )
names ( drift_results) <- channels
drift_results
}
marker_channels <- c ( 'CD45' , 'CD3' , 'CD4' , 'CD8' )
drift <- detect_signal_drift( ff, marker_channels)
for ( ch in names ( drift) ) {
if ( drift[[ ch] ] $ drift_detected) {
cat( 'DRIFT DETECTED:' , ch, '(' , round ( drift[[ ch] ] $ percent_change, 1 ) , '%)\n' )
}
}
Margin Events Removal
remove_margin_events <- function ( ff, channels = NULL ) {
expr <- exprs( ff)
if ( is.null ( channels) ) {
channels <- colnames( expr)
}
params <- parameters( ff)
margin_mask <- rep ( FALSE , nrow( expr) )
for ( ch in channels) {
if ( ch %in% colnames( expr) ) {
idx <- match( ch, params@ data$ name)
if ( ! is.na ( idx) ) {
max_val <- params@ data$ range [ idx]
margin_mask <- margin_mask | ( expr[ , ch] >= max_val * 0.99 ) | ( expr[ , ch] <= 0 )
}
}
}
cat( 'Margin events:' , sum ( margin_mask) , '(' , round ( mean( margin_mask) * 100 , 2 ) , '%)\n' )
ff[ ! margin_mask, ]
}
ff_no_margin <- remove_margin_events( ff, c ( 'FSC-A' , 'SSC-A' ) )
Dead Cell Exclusion
exclude_dead_cells <- function ( ff, viability_channel, threshold = NULL ) {
expr <- exprs( ff)
viability <- expr[ , viability_channel]
if ( is.null ( threshold) ) {
threshold <- quantile( viability, 0.9 )
}
live_mask <- viability < threshold
cat( 'Total events:' , length ( live_mask) , '\n' )
cat( 'Live cells:' , sum ( live_mask) , '(' , round ( mean( live_mask) * 100 , 1 ) , '%)\n' )
cat( 'Dead cells:' , sum ( ! live_mask) , '(' , round ( mean( ! live_mask) * 100 , 1 ) , '%)\n' )
ff[ live_mask, ]
}
ff_live <- exclude_dead_cells( ff, 'Zombie-Aqua' )
CyTOF-Specific QC
cytof_qc <- function ( ff) {
expr <- exprs( ff)
if ( 'Event_length' %in% colnames( expr) ) {
event_length <- expr[ , 'Event_length' ]
good_length <- event_length >= 15 & event_length <= 45
cat( 'Event length filter:' , sum ( good_length) , '/' , length ( good_length) ,
'(' , round ( mean( good_length) * 100 , 1 ) , '%)\n' )
}
dna_channels <- grep( '(Ir191|Ir193|DNA)' , colnames( expr) , value = TRUE )
if ( length ( dna_channels) > 0 ) {
dna_signal <- rowMeans( expr[ , dna_channels, drop = FALSE ] )
has_dna <- dna_signal > quantile( dna_signal, 0.1 )
cat( 'DNA+ events:' , sum ( has_dna) , '(' , round ( mean( has_dna) * 100 , 1 ) , '%)\n' )
}
gauss_channels <- grep( '(Center|Offset|Width|Residual)' , colnames( expr) , value = TRUE )
if ( length ( gauss_channels) > 0 ) {
cat( 'Gaussian parameters available for additional QC\n' )
}
}
cytof_qc( ff)
Batch QC Summary library( dplyr)
batch_qc_summary <- function ( fcs_files) {
results <- lapply( fcs_files, function ( f) {
ff <- read.FCS( f)
n_events <- nrow( ff)
flow_qc <- check_flow_rate( ff)
expr <- exprs( ff)
signal_channels <- grep( '(FSC|SSC)' , colnames( expr) , value = TRUE , invert = TRUE )
median_signals <- apply( expr[ , signal_channels, drop = FALSE ] , 2 , median)
data.frame(
file = basename( f) ,
events = n_events,
flow_rate_cv = flow_qc$ cv_percent,
flow_stable = flow_qc$ stable,
median_signal = mean( median_signals, na.rm = TRUE )
)
} )
summary_df <- do.call( rbind, results)
summary_df$ outlier <- with( summary_df,
events < median( events) * 0.5 |
events > median( events) * 2 |
flow_rate_cv > 30
)
summary_df
}
fcs_files <- list.files( 'data/' , pattern = '\\.fcs$' , full.names = TRUE )
qc_summary <- batch_qc_summary( fcs_files)
print( qc_summary)
cat( '\nSamples with QC issues:\n' )
print( qc_summary[ qc_summary$ outlier, ] )
Visualization library( ggplot2)
plot_flow_rate <- function ( ff, time_channel = 'Time' ) {
expr <- exprs( ff)
time <- expr[ , time_channel]
n_bins <- 100
bins <- cut( time, breaks = n_bins, labels = FALSE )
events_per_bin <- table( bins)
plot_data <- data.frame(
bin = as.numeric ( names ( events_per_bin) ) ,
events = as.numeric ( events_per_bin)
)
ggplot( plot_data, aes( x = bin, y = events) ) +
geom_line( ) +
geom_smooth( method = 'loess' , color = 'red' , se = FALSE ) +
theme_bw( ) +
labs( title = 'Flow Rate Over Acquisition' , x = 'Time Bin' , y = 'Events per Bin' )
}
plot_signal_stability <- function ( ff, channel, time_channel = 'Time' ) {
expr <- exprs( ff)
n_bins <- 50
bins <- cut( expr[ , time_channel] , breaks = n_bins, labels = FALSE )
bin_stats <- tapply( expr[ , channel] , bins, function ( x) {
c ( median = median( x) , q25 = quantile( x, 0.25 ) , q75 = quantile( x, 0.75 ) )
} )
plot_data <- data.frame(
bin = seq_along ( bin_stats) ,
median = sapply( bin_stats, '[' , 'median' ) ,
q25 = sapply( bin_stats, '[' , 'q25' ) ,
q75 = sapply( bin_stats, '[' , 'q75' )
)
ggplot( plot_data, aes( x = bin) ) +
geom_ribbon( aes( ymin = q25, ymax = q75) , alpha = 0.3 ) +
geom_line( aes( y = median) , color = 'blue' ) +
theme_bw( ) +
labs( title = paste( 'Signal Stability:' , channel) , x = 'Time Bin' , y = 'Intensity' )
}
p1 <- plot_flow_rate( ff)
ggsave( 'qc_flow_rate.png' , p1, width = 10 , height = 4 )
p2 <- plot_signal_stability( ff, 'CD45' )
ggsave( 'qc_signal_stability.png' , p2, width = 10 , height = 4 )
QC Report Generation
generate_qc_report <- function ( ff, output_file = 'qc_report.txt' ) {
sink( output_file)
cat( '=== FLOW CYTOMETRY QC REPORT ===\n\n' )
cat( 'File:' , description( ff) $ `$FIL`, '\n' )
cat( 'Date:' , description( ff) $ `$DATE`, '\n' )
cat( 'Total events:' , nrow( ff) , '\n\n' )
cat( '--- Flow Rate ---\n' )
flow_qc <- check_flow_rate( ff)
cat( 'CV:' , round ( flow_qc$ cv_percent, 1 ) , '%\n' )
cat( 'Status:' , ifelse( flow_qc$ stable, 'PASS' , 'FAIL' ) , '\n\n' )
cat( '--- Signal Channels ---\n' )
expr <- exprs( ff)
for ( ch in colnames( expr) [ 1 : min ( 10 , ncol( expr) ) ] ) {
cat( ch, ': median =' , round ( median( expr[ , ch] ) , 1 ) , '\n' )
}
sink( )
cat( 'Report saved to' , output_file, '\n' )
}
generate_qc_report( ff)
Related Skills Workflow order: cytometry-qc → doublet-detection → bead-normalization → clustering
compensation-transformation - Data preprocessing before QC
doublet-detection - Run after QC: remove doublet events
bead-normalization - Run after doublet removal: correct signal drift
clustering-phenotyping - Analysis after all preprocessing