LiraglutideQualityChecker

Liraglutide

antivirals API biologics endotoxins essential medicines global market impurities injectables
Открыть подборку
Вот полный пакет утилиты **`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.

Утилита: LiraglutideQualityCheckerAPI / объект: LiraglutideКатегория: Global API expansion

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.HighJSON содержит общий статус, массив проверок, предупреждения, отказы и ссылку на исходный файл.
URS-006Система должна поддерживать применение в валидационном пакете клиента: URS/FS, IQ/OQ-подготовка, проверка установки и операционных сценариев.HighДокумент, тестовые сценарии и воспроизводимый CSV/JSON-поток пригодны для аудита и внутреннего согласования.
URS-007Система должна явно отделять технические ошибки данных от предметных несоответствий спецификации.MediumОшибки схемы/типов не смешиваются с фармакопейными отклонениями и отображаются отдельно.

6. Контракт входных данных input.csv

Источник истины для схемы входа — фактический заголовок input.csv. Имена колонок технические и не переводятся.

#КолонкаТипЕд.ОписаниеПримерПравило контроля
1BatchNumberидентификаторas specifiedBatch NumberLIR-BIO-2026-001обязательное поле; используется для трассируемости серии/партии
2Protein_Concentration_mgPerMlдесятичное числоmg/mlProtein Concentration mg per Ml6.02число; сравнивается с пределом содержания/чистоты из спецификации или метода
3Potency_Percentдесятичное число%Potency %97.5обязательное числовое значение; сравнение с правилом выполняет утилита
4pH_Valueдесятичное числоpHp H Value6.0обязательное числовое значение; сравнение с правилом выполняет утилита
5Osmolality_mOsm_kgдесятичное числоmOsm/kgOsmolality m Osm kg290обязательное числовое значение; сравнение с правилом выполняет утилита
6Aggregate_Percent_SECдесятичное число%Aggregate % SEC0.35обязательное числовое значение; сравнение с правилом выполняет утилита
7Fragment_Percent_SECдесятичное число%Fragment % SEC0.25обязательное числовое значение; сравнение с правилом выполняет утилита
8Acidic_Variants_Percent_IECдесятичное число%Acidic Variants % IEC17.0обязательное числовое значение; сравнение с правилом выполняет утилита
9Basic_Variants_Percent_IECдесятичное число%Basic Variants % IEC6.0обязательное числовое значение; сравнение с правилом выполняет утилита
10Methionine_Oxidized_Percentдесятичное число%Methionine Oxidized %0.8обязательное числовое значение; сравнение с правилом выполняет утилита
11Desacetyl_Liraglutide_Percentдесятичное число%Desacetyl Liraglutide %0.4обязательное числовое значение; сравнение с правилом выполняет утилита
12Host_Cell_Protein_ppmдесятичное числоppmHost Cell Protein ppm18обязательное числовое значение; сравнение с правилом выполняет утилита
13Residual_DNA_ngPerMlдесятичное числоas specifiedResidual DNA ng per Ml1.8обязательное числовое значение; сравнение с правилом выполняет утилита
14Protein_A_Leaching_ngPerMlдесятичное числоas specifiedProtein A Leaching ng per Ml3.5обязательное числовое значение; сравнение с правилом выполняет утилита
15SterilityTestлогический флаг0/1Sterility Test0значение должно быть допустимым флагом; для запрещённых микроорганизмов и роста обычно ожидается 0 / отсутствие
16Endotoxin_EU_per_mgдесятичное числоEU/mlEndotoxin EU per mg0.12число; критический показатель безопасности, сравнивается с лимитом эндотоксинов
17Subvisible_Particles_2_10_umдесятичное числоµmSubvisible Particles 2 10 um1000обязательное числовое значение; сравнение с правилом выполняет утилита
18Subvisible_Particles_10_25_umдесятичное числоµmSubvisible Particles 10 25 um100обязательное числовое значение; сравнение с правилом выполняет утилита
19Subvisible_Particles_gt_25_umдесятичное числоµmSubvisible Particles gt 25 um5обязательное числовое значение; сравнение с правилом выполняет утилита
20Appearance_Scoreдесятичное числоas specifiedAppearance Score0обязательное числовое значение; сравнение с правилом выполняет утилита

Пример 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-001CLI entry pointИсполняемый файл LiraglutideQualityChecker.exe принимает режим демонстрации и режим обработки input.csv output.json.
FS-002CSV parserМодуль импорта читает CSV, проверяет заголовок, порядок/наличие колонок, количество значений и кодировку. Для десятичных значений ожидается точка.
FS-003Field conversionДля каждой колонки выполняется преобразование к ожидаемому типу: идентификатор, текст, десятичное число, дата/время или логический флаг.
FS-004Domain rule engineДля объекта Liraglutide применяются явные правила: диапазон, минимум, максимум, отсутствие запрещённого признака, полнота данных или расчётная проверка.
FS-005Criticality handlingКритичные нарушения формируют FAIL; некритичные отклонения и неполные данные формируют WARNING; соответствие всем правилам формирует PASS.
FS-006JSON writeroutput.json сохраняет общий статус, результаты по каждому параметру, исходные значения, предупреждения, отказы и диагностические сообщения.
FS-007Integration contractФормат CSV → JSON стабилен для вызова из LIMS/ELN/MES, планировщика задач или wrapper-сервиса.
FS-008Error 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 для покрытия мирового рынка.

Открыть