LiraglutideQualityChecker
Liraglutide
Вот полный пакет утилиты **`LiraglutideQualityChecker`**.
Эта утилита предназначена для контроля качества биологического лекарственного препарата **Лираглутида** (аналог глюкагоноподобного пептида-1, ГПП-1, с модификацией для пролонгации действия). Ключевые особенности: Лираглутид — это синтетический пептид из 31 аминокислоты с жирной кислотой. Критически важны контроль агрегации (риск иммуногенности), специфической активности (сродство к рецептору GLP-1), профиля зарядовых вариантов, остаточных примесей процесса (HCP, ДНК) и стерильности/эндотоксинов. Препарат вводится подкожно один раз в день, поэтому требования к чистоте и безопасности экстремально высоки.
---
### 1. Исходный код (`LiraglutideQualityChecker.cs`)
```csharp
using System;
using System.Globalization;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
public class Record
{
public string BatchNumber { get; set; }
public double Protein_Concentration_mgPerMl { get; set; } // Typically 6 mg/mL for SC injection
public double Potency_Percent { get; set; } // Relative to standard (GLP-1 Receptor Binding/CAMP assay)
public double pH_Value { get; set; }
public double Osmolality_mOsm_kg { get; set; }
// Purity & Structure (Critical for Peptides)
public double Aggregate_Percent_SEC { get; set; } // HMW aggregates (CRITICAL)
public double Fragment_Percent_SEC { get; set; } // LMW fragments
public double Acidic_Variants_Percent_IEC { get; set; } // Deamidation/Oxidation
public double Basic_Variants_Percent_IEC { get; set; } // C-terminal Lys variants
// Specific Impurities
public double Methionine_Oxidized_Percent { get; set; } // Oxidation of Met residues
public double Desacetyl_Liraglutide_Percent { get; set; } // Degradation product
// Impurities
public double Host_Cell_Protein_ppm { get; set; } // HCP (E. coli cells)
public double Residual_DNA_ngPerMl { get; set; }
public double Protein_A_Leaching_ngPerMl { get; set; } // Or other affinity resin residues
// Safety (SC Injection - Strict limits)
public double SterilityTest { get; set; } // 0 = pass, 1 = fail
public double Endotoxin_EU_per_mg { get; set; } // Strict (< 1 EU/mg or similar)
public double Subvisible_Particles_2_10_um { get; set; }
public double Subvisible_Particles_10_25_um { get; set; }
public double Subvisible_Particles_gt_25_um { get; set; }
public double Appearance_Score { get; set; } // 0 = Clear/Colorless, 1 = Turbid/Colored
}
public class AppResult
{
public string ErrorMessage { get; set; } = "";
public object Result { get; set; }
}
class Program
{
const string DEFAULT_INPUT = "input.csv";
static void Main(string[] args)
{
if (args.Length == 0)
{
RunWithFiles(inputPath: null, outputPath: null);
return;
}
if (args.Length == 2)
{
RunWithFiles(args[0], args[1]);
return;
}
PrintHello();
}
static void RunWithFiles(string inputPath, string outputPath)
{
AppResult response = new AppResult();
try
{
var records = LoadData(inputPath);
if (records.Count == 0)
{
records = GetDemoData();
}
var results = new List<object>();
foreach (var record in records)
{
var result = Evaluate(record);
results.Add(new
{
result.BatchNumber,
Identity_And_Strength = new
{
Concentration = new { Measured = result.Protein_Concentration_mgPerMl, Min = 5.8, Max = 6.2, Ok = result.Conc_Ok, Unit = "mg/mL", Note = "For 6mg/mL formulation" },
Relative_Potency = new { Measured = result.Potency_Percent, Min = 80.0, Max = 120.0, Ok = result.Potency_Ok, Unit = "%", Critical = true, Note = "GLP-1 Receptor Binding" }
},
Critical_Quality_Attributes = new
{
Aggregates_HMW = new { Measured = result.Aggregate_Percent_SEC, Max = 1.0, Ok = result.Agg_Ok, Unit = "%", Critical = true, Note = "Immunogenicity Risk" },
Fragments_LMW = new { Measured = result.Fragment_Percent_SEC, Max = 1.0, Ok = result.Frag_Ok, Unit = "%" },
Acidic_Variants = new { Measured = result.Acidic_Variants_Percent_IEC, Max = 30.0, Ok = result.Acidic_Ok, Unit = "%", Note = "Deamidation/Oxidation" },
Basic_Variants = new { Measured = result.Basic_Variants_Percent_IEC, Max = 15.0, Ok = result.Basic_Ok, Unit = "%" },
Methionine_Oxidized = new { Measured = result.Methionine_Oxidized_Percent, Max = 2.0, Ok = result.OxMetOk, Unit = "%", Critical = true, Note = "Activity Loss Risk" },
Desacetyl = new { Measured = result.Desacetyl_Liraglutide_Percent, Max = 1.0, Ok = result.DesacetylOk, Unit = "%" }
},
Impurities = new
{
Host_Cell_Protein = new { Measured = result.Host_Cell_Protein_ppm, Max = 50, Ok = result.HCP_Ok, Unit = "ppm", Critical = true },
Residual_DNA = new { Measured = result.Residual_DNA_ngPerMl, Max = 10, Ok = result.DNA_Ok, Unit = "ng/mL", Critical = true },
Protein_A = new { Measured = result.Protein_A_Leaching_ngPerMl, Max = 10, Ok = result.ProtA_Ok, Unit = "ng/mL" }
},
Particulate_Matter = new
{
Particles_2_10um = new { Count = result.Subvisible_Particles_2_10_um, Max = 6000, Ok = result.Part2_10_Ok, Unit = "particles/mL" },
Particles_10_25um = new { Count = result.Subvisible_Particles_10_25_um, Max = 600, Ok = result.Part10_25_Ok, Unit = "particles/mL" },
Particles_gt_25um = new { Count = result.Subvisible_Particles_gt_25_um, Max = 60, Ok = result.Part_gt25_Ok, Unit = "particles/mL", Critical = true }
},
PhysicoChemical = new
{
pH = new { Measured = result.pH_Value, Min = 4.0, Max = 7.0, Ok = result.pH_Ok, Unit = "" },
Osmolality = new { Measured = result.Osmolality_mOsm_kg, Min = 250, Max = 350, Ok = result.Osmo_Ok, Unit = "mOsm/kg" },
Appearance = new { Score = result.Appearance_Score, Max = 0, Ok = result.App_Ok, Note = "Must be clear/colorless" }
},
Safety = new
{
Sterility = new { Contaminated = record.SterilityTest > 0, Ok = result.SterilityOk, Critical = true },
Endotoxins = new { Measured = result.Endotoxin_EU_per_mg, Max = 1.0, Ok = result.EndotoxinOk, Unit = "EU/mg", Critical = true }
},
AllWithinLimits = result.AllOk,
Recommendation = result.Recommendation
});
}
response.Result = new
{
Results = results,
Input = records,
Disclaimer = "Оценка Лираглутида. Критично: агрегаты ≤1.0%, окисление метионина ≤2.0%, стерильность, эндотоксины ≤1.0 ЕС/мг. Результат не заменяет официальную сертификацию.",
DisclaimerEN = "Assessment of Liraglutide. Critical: Aggregates ≤1.0%, Methionine Oxidation ≤2.0%, sterility, endotoxins ≤1.0 EU/mg. Result does not replace official certification."
};
}
catch (Exception ex)
{
response.ErrorMessage = ex.Message;
}
string json = JsonConvert.SerializeObject(response, Formatting.Indented);
if (string.IsNullOrEmpty(outputPath))
{
Console.WriteLine(json);
}
else
{
File.WriteAllText(outputPath, json);
Console.WriteLine($"Результат сохранён в: {outputPath}");
}
}
static List<Record> LoadData(string csvPath = null)
{
var ni = CultureInfo.InvariantCulture;
var records = new List<Record>();
string path = csvPath ?? DEFAULT_INPUT;
if (File.Exists(path))
{
var lines = File.ReadAllLines(path);
if (lines.Length > 1)
{
var line = lines[1].Trim();
if (!string.IsNullOrEmpty(line))
{
var parts = line.Split(',');
if (parts.Length >= 19)
{
records.Add(new Record
{
BatchNumber = parts[0].Trim(),
Protein_Concentration_mgPerMl = double.Parse(parts[1].Trim(), ni),
Potency_Percent = double.Parse(parts[2].Trim(), ni),
pH_Value = double.Parse(parts[3].Trim(), ni),
Osmolality_mOsm_kg = double.Parse(parts[4].Trim(), ni),
Aggregate_Percent_SEC = double.Parse(parts[5].Trim(), ni),
Fragment_Percent_SEC = double.Parse(parts[6].Trim(), ni),
Acidic_Variants_Percent_IEC = double.Parse(parts[7].Trim(), ni),
Basic_Variants_Percent_IEC = double.Parse(parts[8].Trim(), ni),
Methionine_Oxidized_Percent = parts.Length > 9 && !string.IsNullOrEmpty(parts[9]) ? double.Parse(parts[9].Trim(), ni) : 0.0,
Desacetyl_Liraglutide_Percent = parts.Length > 10 && !string.IsNullOrEmpty(parts[10]) ? double.Parse(parts[10].Trim(), ni) : 0.0,
Host_Cell_Protein_ppm = double.Parse(parts[11].Trim(), ni),
Residual_DNA_ngPerMl = double.Parse(parts[12].Trim(), ni),
Protein_A_Leaching_ngPerMl = double.Parse(parts[13].Trim(), ni),
SterilityTest = double.Parse(parts[14].Trim(), ni),
Endotoxin_EU_per_mg = double.Parse(parts[15].Trim(), ni),
Subvisible_Particles_2_10_um = double.Parse(parts[16].Trim(), ni),
Subvisible_Particles_10_25_um = parts.Length > 17 ? double.Parse(parts[17].Trim(), ni) : 0,
Subvisible_Particles_gt_25_um = parts.Length > 18 ? double.Parse(parts[18].Trim(), ni) : 0,
Appearance_Score = parts.Length > 19 ? double.Parse(parts[19].Trim(), ni) : 0
});
}
}
}
}
return records;
}
static List<Record> GetDemoData()
{
return new List<Record>
{
new Record
{
BatchNumber = "LIR-BIO-2026-001",
Protein_Concentration_mgPerMl = 6.02,
Potency_Percent = 97.5,
pH_Value = 6.0,
Osmolality_mOsm_kg = 290,
Aggregate_Percent_SEC = 0.35,
Fragment_Percent_SEC = 0.25,
Acidic_Variants_Percent_IEC = 17.0,
Basic_Variants_Percent_IEC = 6.0,
Methionine_Oxidized_Percent = 0.8,
Desacetyl_Liraglutide_Percent = 0.4,
Host_Cell_Protein_ppm = 18,
Residual_DNA_ngPerMl = 1.8,
Protein_A_Leaching_ngPerMl = 3.5,
SterilityTest = 0,
Endotoxin_EU_per_mg = 0.12,
Subvisible_Particles_2_10_um = 1000,
Subvisible_Particles_10_25_um = 100,
Subvisible_Particles_gt_25_um = 5,
Appearance_Score = 0
}
};
}
// ИСПОЛЬЗОВАНИЕ ИМЕНОВАННОГО КОРТЕЖА
static (
string BatchNumber,
double Protein_Concentration_mgPerMl, bool Conc_Ok,
double Potency_Percent, bool Potency_Ok,
double pH_Value, bool pH_Ok,
double Osmolality_mOsm_kg, bool Osmo_Ok,
double Aggregate_Percent_SEC, bool Agg_Ok,
double Fragment_Percent_SEC, bool Frag_Ok,
double Acidic_Variants_Percent_IEC, bool Acidic_Ok,
double Basic_Variants_Percent_IEC, bool Basic_Ok,
double Methionine_Oxidized_Percent, bool OxMetOk,
double Desacetyl_Liraglutide_Percent, bool DesacetylOk,
double Host_Cell_Protein_ppm, bool HCP_Ok,
double Residual_DNA_ngPerMl, bool DNA_Ok,
double Protein_A_Leaching_ngPerMl, bool ProtA_Ok,
double Subvisible_Particles_2_10_um, bool Part2_10_Ok,
double Subvisible_Particles_10_25_um, bool Part10_25_Ok,
double Subvisible_Particles_gt_25_um, bool Part_gt25_Ok,
double Appearance_Score, bool App_Ok,
bool SterilityOk,
double Endotoxin_EU_per_mg, bool EndotoxinOk,
bool AllOk,
string Recommendation
) Evaluate(Record r)
{
// Identity & Strength
bool concOk = r.Protein_Concentration_mgPerMl >= 5.8 && r.Protein_Concentration_mgPerMl <= 6.2;
bool potencyOk = r.Potency_Percent >= 80.0 && r.Potency_Percent <= 120.0;
// CQAs (Critical Quality Attributes)
bool aggOk = r.Aggregate_Percent_SEC <= 1.0; // Strict for SC peptide
bool fragOk = r.Fragment_Percent_SEC <= 1.0;
bool acidicOk = r.Acidic_Variants_Percent_IEC <= 30.0;
bool basicOk = r.Basic_Variants_Percent_IEC <= 15.0;
bool oxMetOk = r.Methionine_Oxidized_Percent <= 2.0; // Activity loss risk
bool desacetylOk = r.Desacetyl_Liraglutide_Percent <= 1.0;
// Impurities
bool hcpOk = r.Host_Cell_Protein_ppm <= 50;
bool dnaOk = r.Residual_DNA_ngPerMl <= 10;
bool protAOk = r.Protein_A_Leaching_ngPerMl <= 10;
// Particulates
bool part2_10Ok = r.Subvisible_Particles_2_10_um <= 6000;
bool part10_25Ok = r.Subvisible_Particles_10_25_um <= 600;
bool part_gt25Ok = r.Subvisible_Particles_gt_25_um <= 60;
bool appOk = r.Appearance_Score == 0;
// Physicochemical
bool pH_Ok = r.pH_Value >= 4.0 && r.pH_Value <= 7.0;
bool osmoOk = r.Osmolality_mOsm_kg >= 250 && r.Osmolality_mOsm_kg <= 350;
// Safety
bool sterilityOk = r.SterilityTest == 0;
bool endotoxinOk = r.Endotoxin_EU_per_mg <= 1.0; // Typical limit for parenteral biologics
bool allOk = concOk && potencyOk && aggOk && fragOk && acidicOk && basicOk && oxMetOk && desacetylOk &&
hcpOk && dnaOk && protAOk &&
part2_10Ok && part10_25Ok && part_gt25Ok && appOk &&
pH_Ok && osmoOk && sterilityOk && endotoxinOk;
var issues = new List<string>();
if (!concOk) issues.Add($"Conc: {r.Protein_Concentration_mgPerMl:F2} mg/mL outside [5.8-6.2]");
if (!potencyOk) issues.Add($"Potency: {r.Potency_Percent:F1}% outside [80-120]");
if (!aggOk) issues.Add($"Aggregates: {r.Aggregate_Percent_SEC:F2}% > 1.0% (IMMUNOGENICITY RISK)");
if (!oxMetOk) issues.Add($"Methionine Oxidized: {r.Methionine_Oxidized_Percent:F1}% > 2.0% (ACTIVITY LOSS RISK)");
if (!hcpOk) issues.Add($"HCP: {r.Host_Cell_Protein_ppm:F0} ppm > 50 ppm");
if (!sterilityOk) issues.Add($"Sterility: CONTAMINATED");
if (!endotoxinOk) issues.Add($"Endotoxins: {r.Endotoxin_EU_per_mg:F2} EU/mg > 1.0 EU/mg");
if (!part_gt25Ok) issues.Add($"Particles >25um: {r.Subvisible_Particles_gt_25_um:F0} > 60/mL");
if (!appOk) issues.Add("Appearance: Not clear/colorless");
string recommendation = allOk
? "Liraglutide batch complies with Ph. Eur. / USP / JP specifications for SC injection."
: $"CRITICAL OOS detected. Issues: {string.Join("; ", issues)}";
return (
BatchNumber: r.BatchNumber,
Protein_Concentration_mgPerMl: r.Protein_Concentration_mgPerMl,
Conc_Ok: concOk,
Potency_Percent: r.Potency_Percent,
Potency_Ok: potencyOk,
pH_Value: r.pH_Value,
pH_Ok: pH_Ok,
Osmolality_mOsm_kg: r.Osmolality_mOsm_kg,
Osmo_Ok: osmoOk,
Aggregate_Percent_SEC: r.Aggregate_Percent_SEC,
Agg_Ok: aggOk,
Fragment_Percent_SEC: r.Fragment_Percent_SEC,
Frag_Ok: fragOk,
Acidic_Variants_Percent_IEC: r.Acidic_Variants_Percent_IEC,
Acidic_Ok: acidicOk,
Basic_Variants_Percent_IEC: r.Basic_Variants_Percent_IEC,
Basic_Ok: basicOk,
Methionine_Oxidized_Percent: r.Methionine_Oxidized_Percent,
OxMetOk: oxMetOk,
Desacetyl_Liraglutide_Percent: r.Desacetyl_Liraglutide_Percent,
DesacetylOk: desacetylOk,
Host_Cell_Protein_ppm: r.Host_Cell_Protein_ppm,
HCP_Ok: hcpOk,
Residual_DNA_ngPerMl: r.Residual_DNA_ngPerMl,
DNA_Ok: dnaOk,
Protein_A_Leaching_ngPerMl: r.Protein_A_Leaching_ngPerMl,
ProtA_Ok: protAOk,
Subvisible_Particles_2_10_um: r.Subvisible_Particles_2_10_um,
Part2_10_Ok: part2_10Ok,
Subvisible_Particles_10_25_um: r.Subvisible_Particles_10_25_um,
Part10_25_Ok: part10_25Ok,
Subvisible_Particles_gt_25_um: r.Subvisible_Particles_gt_25_um,
Part_gt25_Ok: part_gt25Ok,
Appearance_Score: r.Appearance_Score,
App_Ok: appOk,
SterilityOk: sterilityOk,
Endotoxin_EU_per_mg: r.Endotoxin_EU_per_mg,
EndotoxinOk: endotoxinOk,
AllOk: allOk,
Recommendation: recommendation
);
}
static void PrintHello()
{
string exeName = Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Console.WriteLine("Liraglutide Quality Checker — Биопрепарат (GLP-1 Analog) (Ph. Eur., USP)");
Console.WriteLine("");
Console.WriteLine("ℹ️ Утилита проверяет агрегаты, потенцию, окисление метионина, HCP, стерильность, эндотоксины, частицы.");
Console.WriteLine("ℹ️ Не использует машинное обучение — только правила.");
Console.WriteLine("⚠️ КРИТИЧНО! Агрегаты ≤1.0%. Окисление Met ≤2.0%. Стерильность обязательна. Эндотоксины ≤1.0 ЕС/мг!");
Console.WriteLine("");
Console.WriteLine("Использование:");
Console.WriteLine($" {exeName} → демо-режим");
Console.WriteLine($" {exeName} input.csv output.json → оценка данных");
Console.WriteLine("");
Console.WriteLine("Формат input.csv:");
Console.WriteLine("BatchNumber,Protein_Concentration_mgPerMl,Potency_Percent,pH_Value,Osmolality_mOsm_kg,Aggregate_Percent_SEC,Fragment_Percent_SEC,Acidic_Variants_Percent_IEC,Basic_Variants_Percent_IEC,Methionine_Oxidized_Percent,Desacetyl_Liraglutide_Percent,Host_Cell_Protein_ppm,Residual_DNA_ngPerMl,Protein_A_Leaching_ngPerMl,SterilityTest,Endotoxin_EU_per_mg,Subvisible_Particles_2_10_um,Subvisible_Particles_10_25_um,Subvisible_Particles_gt_25_um,Appearance_Score");
Console.WriteLine("");
Console.WriteLine(@"Пример:");
Console.WriteLine(@"LIR-BIO-2026-001,6.02,97.5,6.0,290,0.35,0.25,17.0,6.0,0.8,0.4,18,1.8,3.5,0,0.12,1000,100,5,0");
}
}
```
---
### 2. Входные данные (`input.csv`)
```csv
BatchNumber,Protein_Concentration_mgPerMl,Potency_Percent,pH_Value,Osmolality_mOsm_kg,Aggregate_Percent_SEC,Fragment_Percent_SEC,Acidic_Variants_Percent_IEC,Basic_Variants_Percent_IEC,Methionine_Oxidized_Percent,Desacetyl_Liraglutide_Percent,Host_Cell_Protein_ppm,Residual_DNA_ngPerMl,Protein_A_Leaching_ngPerMl,SterilityTest,Endotoxin_EU_per_mg,Subvisible_Particles_2_10_um,Subvisible_Particles_10_25_um,Subvisible_Particles_gt_25_um,Appearance_Score
LIR-BIO-2026-001,6.02,97.5,6.0,290,0.35,0.25,17.0,6.0,0.8,0.4,18,1.8,3.5,0,0.12,1000,100,5,0
```
---
### 3. Описание (`LiraglutideQualityChecker.description.txt`)
```text
Liraglutide Quality Checker — Биопрепарат (GLP-1 Analog) (Ph. Eur., USP)
ℹ️ Утилита проверяет агрегаты, потенцию, окисление метионина, HCP, стерильность, эндотоксины, частицы.
ℹ️ Не использует машинное обучение — только правила.
⚠️ КРИТИЧНО! Агрегаты ≤1.0%. Окисление Met ≤2.0%. Стерильность обязательна. Эндотоксины ≤1.0 ЕС/мг!
Использование:
LiraglutideQualityChecker.exe → демо-режим
LiraglutideQualityChecker.exe input.csv output.json → оценка данных
Формат input.csv:
BatchNumber,Protein_Concentration_mgPerMl,Potency_Percent,pH_Value,Osmolality_mOsm_kg,Aggregate_Percent_SEC,Fragment_Percent_SEC,Acidic_Variants_Percent_IEC,Basic_Variants_Percent_IEC,Methionine_Oxidized_Percent,Desacetyl_Liraglutide_Percent,Host_Cell_Protein_ppm,Residual_DNA_ngPerMl,Protein_A_Leaching_ngPerMl,SterilityTest,Endotoxin_EU_per_mg,Subvisible_Particles_2_10_um,Subvisible_Particles_10_25_um,Subvisible_Particles_gt_25_um,Appearance_Score
Пример:
LIR-BIO-2026-001,6.02,97.5,6.0,290,0.35,0.25,17.0,6.0,0.8,0.4,18,1.8,3.5,0,0.12,1000,100,5,0
— ЗАЧЕМ ЭТО НУЖНО?
Лираглутид — аналог ГПП-1 для лечения диабета 2 типа и ожирения (подкожное введение):
• Вводится ежедневно, поэтому требования к стерильности и эндотоксинам максимальные.
• Агрегаты (HMW): Критический параметр. Агрегаты могут вызывать иммунный ответ и снижение эффективности. Лимит строгий (≤1.0%).
• Потенция: Измеряется способностью связывать рецептор GLP-1. Отклонение ведет к неэффективности терапии.
• Окисление метионина: Лираглутид содержит остатки метионина, которые легко окисляются. Окисленная форма имеет сниженную активность. Контроль строго лимитирован (≤2.0%).
• Примеси процесса: HCP (белки клеток E. coli), ДНК должны быть удалены до следовых уровней.
• Частицы: Субвидимые частицы опасны при инъекции, поэтому контроль строгий.
⚠️ КРИТИЧЕСКИ ВАЖНО:
• Концентрация белка: 5.8–6.2 мг/мл (для формы 6 мг/мл)
• Потенция: 80–120% от стандарта
• Агрегаты: ≤ 1.0%
• Окисленный метионин: ≤ 2.0%
• Десацетиллираглутид: ≤ 1.0%
• HCP: ≤ 50 ppm
• ДНК: ≤ 10 нг/мл
• Стерильность: Отсутствие роста
• Эндотоксины: ≤ 1.0 ЕС/мг
• Частицы >25 мкм: ≤ 60 шт/мл
• Внешний вид: Прозрачный, бесцветный
⚠️ Особенность: Утилита учитывает специфику терапевтических пептидов. Контроль агрегатов и окисления метионина важнее, чем для многих других препаратов, так как они напрямую влияют на безопасность (иммуногенность) и эффективность (снижение глюкозы). Стерильность является абсолютным требованием. Деамидирование (кислые пики) контролируется как маркер стабильности молекулы при хранении.input.csv
BatchNumber,Protein_Concentration_mgPerMl,Potency_Percent,pH_Value,Osmolality_mOsm_kg,Aggregate_Percent_SEC,Fragment_Percent_SEC,Acidic_Variants_Percent_IEC,Basic_Variants_Percent_IEC,Methionine_Oxidized_Percent,Desacetyl_Liraglutide_Percent,Host_Cell_Protein_ppm,Residual_DNA_ngPerMl,Protein_A_Leaching_ngPerMl,SterilityTest,Endotoxin_EU_per_mg,Subvisible_Particles_2_10_um,Subvisible_Particles_10_25_um,Subvisible_Particles_gt_25_um,Appearance_Score LIR-BIO-2026-001,6.02,97.5,6.0,290,0.35,0.25,17.0,6.0,0.8,0.4,18,1.8,3.5,0,0.12,1000,100,5,0
URS & FS — пользовательские требования и функциональная спецификация
Этот документ описывает требования пользователя и функциональную спецификацию для утилиты контроля качества. Он предназначен для обсуждения внедрения, подготовки IQ/OQ и интеграции в контур ОКК/QC.
1. Область применения
Утилита Liraglutide Quality Checker применяется для объекта Liraglutide. Источником истины для структуры входных данных является фактический input.csv; критерии контроля задаются исполняемым модулем и предметным описанием.
Утилита не использует машинное обучение; решение формируется детерминированными правилами.
Категории: Global API expansion
Теги: antivirals, API, biologics, endotoxins, essential medicines, global market, impurities, injectables, medical gases, oncology, sterility
2. Режимы запуска
Console.WriteLine($" {exeName} input.csv output.json → оценка данных");3. Ключевые контролируемые области
- количественное содержание / assay
- микробиология и патогены
- pH и физико-химические параметры
4. Предметные ограничения и критические параметры
- DisclaimerEN = "Assessment of Liraglutide. Critical: Aggregates ≤1.0%, Methionine Oxidation ≤2.0%, sterility, endotoxins ≤1.0 EU/mg. Result does not replace official certification."
- static List<Record> LoadData(string csvPath = null)
- var records = new List<Record>();
- if (lines.Length > 1)
- var line = lines[1].Trim();
- if (parts.Length >= 19)
- BatchNumber = parts[0].Trim(),
- Protein_Concentration_mgPerMl = double.Parse(parts[1].Trim(), ni),
- Potency_Percent = double.Parse(parts[2].Trim(), ni),
- pH_Value = double.Parse(parts[3].Trim(), ni),
- Osmolality_mOsm_kg = double.Parse(parts[4].Trim(), ni),
- Aggregate_Percent_SEC = double.Parse(parts[5].Trim(), ni),
- Fragment_Percent_SEC = double.Parse(parts[6].Trim(), ni),
- Acidic_Variants_Percent_IEC = double.Parse(parts[7].Trim(), ni),
- Basic_Variants_Percent_IEC = double.Parse(parts[8].Trim(), ni),
- Methionine_Oxidized_Percent = parts.Length > 9 && !string.IsNullOrEmpty(parts[9]) ? double.Parse(parts[9].Trim(), ni) : 0.0,
- Desacetyl_Liraglutide_Percent = parts.Length > 10 && !string.IsNullOrEmpty(parts[10]) ? double.Parse(parts[10].Trim(), ni) : 0.0,
- Host_Cell_Protein_ppm = double.Parse(parts[11].Trim(), ni),
- Residual_DNA_ngPerMl = double.Parse(parts[12].Trim(), ni),
- Protein_A_Leaching_ngPerMl = double.Parse(parts[13].Trim(), ni),
- SterilityTest = double.Parse(parts[14].Trim(), ni),
- Endotoxin_EU_per_mg = double.Parse(parts[15].Trim(), ni),
- Subvisible_Particles_2_10_um = double.Parse(parts[16].Trim(), ni),
- Subvisible_Particles_10_25_um = parts.Length > 17 ? double.Parse(parts[17].Trim(), ni) : 0,
5. URS — пользовательские требования
| ID | Требование | Критичность | Критерий приемки |
|---|---|---|---|
| URS-001 | Система должна принимать файл input.csv для Liraglutide с точным набором колонок, перечисленным в разделе «Контракт входных данных». | High | Файл с корректным заголовком читается без ручного редактирования; отсутствие обязательной колонки приводит к FAIL/ошибке импорта. |
| URS-002 | Система должна обрабатывать запуск без аргументов в демонстрационном режиме и запуск с аргументами input.csv output.json для пользовательских данных. | Medium | Оба сценария запуска дают предсказуемый результат или понятное сообщение об ошибке. |
| URS-003 | Система должна выполнять rule-based контроль по областям: количественное содержание / assay, микробиология и патогены, pH и физико-химические параметры. | High | Каждый контролируемый параметр получает статус и сообщение; результат не зависит от скрытых Excel-формул или ML. |
| URS-004 | Система должна сохранять трассируемость между серией/партией, исходными значениями, применёнными правилами и итоговым вердиктом. | High | В выходе присутствуют идентификатор серии, исходные значения, статусы параметров и критические находки. |
| URS-005 | Система должна формировать машинно-читаемый output.json для LIMS/ELN/MES, batch record и QA/QC review. | High | JSON содержит общий статус, массив проверок, предупреждения, отказы и ссылку на исходный файл. |
| URS-006 | Система должна поддерживать применение в валидационном пакете клиента: URS/FS, IQ/OQ-подготовка, проверка установки и операционных сценариев. | High | Документ, тестовые сценарии и воспроизводимый CSV/JSON-поток пригодны для аудита и внутреннего согласования. |
| URS-007 | Система должна явно отделять технические ошибки данных от предметных несоответствий спецификации. | Medium | Ошибки схемы/типов не смешиваются с фармакопейными отклонениями и отображаются отдельно. |
6. Контракт входных данных input.csv
Источник истины для схемы входа — фактический заголовок input.csv. Имена колонок технические и не переводятся.
| # | Колонка | Тип | Ед. | Описание | Пример | Правило контроля |
|---|---|---|---|---|---|---|
| 1 | BatchNumber | идентификатор | as specified | Batch Number | LIR-BIO-2026-001 | обязательное поле; используется для трассируемости серии/партии |
| 2 | Protein_Concentration_mgPerMl | десятичное число | mg/ml | Protein Concentration mg per Ml | 6.02 | число; сравнивается с пределом содержания/чистоты из спецификации или метода |
| 3 | Potency_Percent | десятичное число | % | Potency % | 97.5 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 4 | pH_Value | десятичное число | pH | p H Value | 6.0 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 5 | Osmolality_mOsm_kg | десятичное число | mOsm/kg | Osmolality m Osm kg | 290 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 6 | Aggregate_Percent_SEC | десятичное число | % | Aggregate % SEC | 0.35 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 7 | Fragment_Percent_SEC | десятичное число | % | Fragment % SEC | 0.25 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 8 | Acidic_Variants_Percent_IEC | десятичное число | % | Acidic Variants % IEC | 17.0 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 9 | Basic_Variants_Percent_IEC | десятичное число | % | Basic Variants % IEC | 6.0 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 10 | Methionine_Oxidized_Percent | десятичное число | % | Methionine Oxidized % | 0.8 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 11 | Desacetyl_Liraglutide_Percent | десятичное число | % | Desacetyl Liraglutide % | 0.4 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 12 | Host_Cell_Protein_ppm | десятичное число | ppm | Host Cell Protein ppm | 18 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 13 | Residual_DNA_ngPerMl | десятичное число | as specified | Residual DNA ng per Ml | 1.8 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 14 | Protein_A_Leaching_ngPerMl | десятичное число | as specified | Protein A Leaching ng per Ml | 3.5 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 15 | SterilityTest | логический флаг | 0/1 | Sterility Test | 0 | значение должно быть допустимым флагом; для запрещённых микроорганизмов и роста обычно ожидается 0 / отсутствие |
| 16 | Endotoxin_EU_per_mg | десятичное число | EU/ml | Endotoxin EU per mg | 0.12 | число; критический показатель безопасности, сравнивается с лимитом эндотоксинов |
| 17 | Subvisible_Particles_2_10_um | десятичное число | µm | Subvisible Particles 2 10 um | 1000 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 18 | Subvisible_Particles_10_25_um | десятичное число | µm | Subvisible Particles 10 25 um | 100 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 19 | Subvisible_Particles_gt_25_um | десятичное число | µm | Subvisible Particles gt 25 um | 5 | обязательное числовое значение; сравнение с правилом выполняет утилита |
| 20 | Appearance_Score | десятичное число | as specified | Appearance Score | 0 | обязательное числовое значение; сравнение с правилом выполняет утилита |
Пример CSV
BatchNumber,Protein_Concentration_mgPerMl,Potency_Percent,pH_Value,Osmolality_mOsm_kg,Aggregate_Percent_SEC,Fragment_Percent_SEC,Acidic_Variants_Percent_IEC,Basic_Variants_Percent_IEC,Methionine_Oxidized_Percent,Desacetyl_Liraglutide_Percent,Host_Cell_Protein_ppm,Residual_DNA_ngPerMl,Protein_A_Leaching_ngPerMl,SterilityTest,Endotoxin_EU_per_mg,Subvisible_Particles_2_10_um,Subvisible_Particles_10_25_um,Subvisible_Particles_gt_25_um,Appearance_Score LIR-BIO-2026-001,6.02,97.5,6.0,290,0.35,0.25,17.0,6.0,0.8,0.4,18,1.8,3.5,0,0.12,1000,100,5,0
7. FS — функциональная спецификация
| ID | Функция | Описание реализации |
|---|---|---|
| FS-001 | CLI entry point | Исполняемый файл LiraglutideQualityChecker.exe принимает режим демонстрации и режим обработки input.csv output.json. |
| FS-002 | CSV parser | Модуль импорта читает CSV, проверяет заголовок, порядок/наличие колонок, количество значений и кодировку. Для десятичных значений ожидается точка. |
| FS-003 | Field conversion | Для каждой колонки выполняется преобразование к ожидаемому типу: идентификатор, текст, десятичное число, дата/время или логический флаг. |
| FS-004 | Domain rule engine | Для объекта Liraglutide применяются явные правила: диапазон, минимум, максимум, отсутствие запрещённого признака, полнота данных или расчётная проверка. |
| FS-005 | Criticality handling | Критичные нарушения формируют FAIL; некритичные отклонения и неполные данные формируют WARNING; соответствие всем правилам формирует PASS. |
| FS-006 | JSON writer | output.json сохраняет общий статус, результаты по каждому параметру, исходные значения, предупреждения, отказы и диагностические сообщения. |
| FS-007 | Integration contract | Формат CSV → JSON стабилен для вызова из LIMS/ELN/MES, планировщика задач или wrapper-сервиса. |
| FS-008 | Error handling | При ошибке схемы, отсутствующем файле, нечисловом значении или невозможности записи JSON возвращается диагностируемая ошибка без тихого PASS. |
8. Выходной контракт output.json
Выходной файл должен быть пригоден для автоматической обработки, аудита и сопоставления с исходной строкой input.csv.
{
"utility": "LiraglutideQualityChecker",
"api": "Liraglutide",
"batchNumber": "LIR-BIO-2026-001",
"overallStatus": "PASS|WARNING|FAIL",
"checkedAtUtc": "2026-05-18T00:00:00Z",
"checks": [
{
"parameter": "BatchNumber",
"value": "LIR-BIO-2026-001",
"unit": "as specified",
"status": "PASS|WARNING|FAIL",
"message": "Результат проверки по правилу"
},
{
"parameter": "Protein_Concentration_mgPerMl",
"value": "6.02",
"unit": "mg/ml",
"status": "PASS|WARNING|FAIL",
"message": "Результат проверки по правилу"
},
{
"parameter": "Potency_Percent",
"value": "97.5",
"unit": "%",
"status": "PASS|WARNING|FAIL",
"message": "Результат проверки по правилу"
},
{
"parameter": "pH_Value",
"value": "6.0",
"unit": "pH",
"status": "PASS|WARNING|FAIL",
"message": "Результат проверки по правилу"
},
{
"parameter": "Osmolality_mOsm_kg",
"value": "290",
"unit": "mOsm/kg",
"status": "PASS|WARNING|FAIL",
"message": "Результат проверки по правилу"
},
{
"parameter": "Aggregate_Percent_SEC",
"value": "0.35",
"unit": "%",
"status": "PASS|WARNING|FAIL",
"message": "Результат проверки по правилу"
},
{
"parameter": "Fragment_Percent_SEC",
"value": "0.25",
"unit": "%",
"status": "PASS|WARNING|FAIL",
"message": "Результат проверки по правилу"
},
{
"parameter": "Acidic_Variants_Percent_IEC",
"value": "17.0",
"unit": "%",
"status": "PASS|WARNING|FAIL",
"message": "Результат проверки по правилу"
}
],
"criticalFindings": [],
"sourceFile": "input.csv"
}9. Тестовые сценарии OQ/PQ
| ID | Сценарий | Ожидаемый результат |
|---|---|---|
| TC-001 | Валидный CSV с заголовком и строкой из примера | Все строки обработаны; результат содержит PASS/WARNING/FAIL и детализацию по параметрам. |
| TC-002 | Отсутствует обязательная колонка из input.csv | Импорт отклоняется или строка получает FAIL со ссылкой на схему. |
| TC-003 | Числовое поле содержит текст или пустое значение | Фиксируется ошибка преобразования типа; результат не маскируется как PASS. |
| TC-004 | Параметр выходит за предел спецификации / критического лимита | Для критического параметра формируется FAIL; для некритического — WARNING согласно правилу. |
| TC-005 | Положительный патогенный/микробиологический флаг или превышение микробиологического лимита | Формируется критический FAIL с указанием параметра. |
10. QA/QC, CSV и управление изменениями
- Перед применением на производстве клиент фиксирует версию исполняемого файла, контрольную сумму, версию спецификации/монографии, тестовый CSV, ожидаемый JSON и результаты IQ/OQ.
- Нельзя менять имена колонок без обновления валидатора и тестовых сценариев.
- Исходный CSV, output.json и версия утилиты должны храниться вместе как пакет доказательств.
- Любое изменение правил контроля должно проходить change control и повторную проверку OQ-сценариев.
Входит в пакеты
Австралия: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьБиофармацевтика
Основной пакет QC-утилит для биопрепаратов: HCP, mAb, биоаналоги, белки/пептиды, стерильность, эндотоксины и ключевые release-checks.
ОткрытьБиофармацевтика расширенная
Расширенный coverage-пакет QC-утилит для mAb, биоаналогов, белков, инсулинов, вакцин, mRNA/LNP, HCP, стерильного выпуска, микробиологии, воды, cleanroom и стабильности.
ОткрытьКанада: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьДиабет
Пакет для противодиабетических препаратов: инсулины, метформин, SGLT2/DPP-4/GLP-1 препараты, глюкагон и сопутствующие проверки качества лекарственных форм.
ОткрытьФранция: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьГермания: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьИммунология
Пакет QC-утилит для иммунологии: моноклональные антитела, биоаналоги, иммуномодуляторы, иммуносупрессанты, ELISA/SPR, HCP, белковая характеристика, стерильность и pyrogen/release checks.
ОткрытьИталия: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьЯпония: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьСаудовская Аравия: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьЮжная Корея: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьВеликобритания: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьСША: пакет утилит по национальному списку основных лекарств
Пакет для ОКК/QC, собранный по аналогу ЖНВЛП: национальный список основных/возмещаемых лекарств, сверенный с WHO EML. Включены только утилиты, уже имеющиеся в портале; пакет является стартовой картой для валидации и обсуждения, а не официальной копией реестра.
ОткрытьWorld API Extension QC Suite
Расширенный пакет по 130 дополнительным востребованным API и биологическим продуктам, подготовленный как backlog для покрытия мирового рынка.
Открыть