Разбор JSON в быстрый формат с указанным ограничением c - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть JSON, который выглядит следующим образом

{
   "barcodes": {
        "0004F--0004R": {
            "Barcode UID": "4",
            "Sample ID": "10887581",
            "For Barcode Name": "0004F",
            "For Barcode Sequence": "GGTAGTGTGTATCAGTACATG",
            "Rev Barcode Name": "0004R",
            "Rev Barcode Sequence": "GGTAGTGTGTATCAGTACATG",
            "Genes Sequenced": "",
            "Ethnicity": "",
            "laa_params": {
                "--minLength": "3000",
                "--ignoreEnds": "60",
                "--maxReads": "2500",
                "--maxPhasingReads": "500"
            }
        },
        "0014F--0014R": {
            "Barcode UID": "14",
            "Sample ID": "10895675",
            "For Barcode Name": "0014F",
            "For Barcode Sequence": "GGTAGCGTCTATATACGTATA",
            "Rev Barcode Name": "0014R",
            "Rev Barcode Sequence": "GGTAGCGTCTATATACGTATA",
            "Genes Sequenced": "A/B/C",
            "Ethnicity": "British/Irish",
            "laa_params": {
                "--minLength": "3000",
                "--ignoreEnds": "60",
                "--maxReads": "2500",
                "--maxPhasingReads": "500"
            }
        },
        "0018F--0018R": {
            "Barcode UID": "18",
            "Sample ID": "10896709",
            "For Barcode Name": "0018F",
            "For Barcode Sequence": "GGTAGCATCACTACGCTAGAT",
            "Rev Barcode Name": "0018R",
            "Rev Barcode Sequence": "GGTAGCATCACTACGCTAGAT",
            "Genes Sequenced": "B/C",
            "Ethnicity": "British/Irish",
            "laa_params": {
                "--minLength": "3000",
                "--ignoreEnds": "60",
                "--maxReads": "2500",
                "--maxPhasingReads": "500"
            }
        }
   }
}

Я использую это JSON для создания файла фаста, где я разделил название штрих-кода "0014F - 0014R" на два половинки. Каждая половина помещается в файл, а затем соответствующая последовательность под ним примерно так:

>0014F
GGTAGCGTCTATATACGTATA
>0014R
GGTAGCGTCTATATACGTATA

Я делаю это, используя Groovy, код для этого:

// Load JSON
// cfg_file is the JSON 
def analysis_config = jsonSlurper.parse(cfg_file)
// Create Keyset of "barcodes"
barcodes = Channel.from(analysis_config.barcodes.keySet())
// Create fasta:
new File('barcodes.fasta').withOutputStream { out ->
    analysis_config.barcodes.each { barcode -> 
        def (fname, revname) = barcode.key.split('--')
        out << ">$fname\n${barcode.value['For Barcode Sequence']}\n"
        out << ">$revname\n${barcode.value['Rev Barcode Sequence']}\n"
            }
}

Я хочу изменить этот лог c так, чтобы, если "genes sequenced" пуст, пропустите этот штрих-код.

В "0004F - 0004R" нет секвенированных генов. Как я могу реализовать эту логику c?

В Python вы можете просто сделать:

if not barcode['genessequenced']:
    continue

... и он пропустит этот штрих-код. По сути, я Python программист и использую Nextflow, который использует Groovy в качестве базового языка. Помощь будет принята с благодарностью.

ПРИМЕЧАНИЕ

У меня такое чувство, что мне нужно изменить всю логику c. Текущий поток:

  1. Создание набора ключей () всех штрих-кодов
  2. Заполните каждый последовательностями

И поток теперь должен быть: 1. Создать keySet () штрих-кодов с «секвенированными генами» 2. Заполните каждый последовательностями

Итак, barcodes = Channel.from(analysis_config.barcodes.keySet()) есть идеи, как мне добавить эти логики c в это?

Что-то вроде:

barcodes = Channel.from(analysis_config.barcodes.[if "Genes Sequenced"].keySet())

1 Ответ

1 голос
/ 24 февраля 2020

в groovy есть метод findAll {...} для этого:

analysis_config.barcodes.findAll{b-> b.value."Genes Sequenced"}.keySet()

или

analysis_config.barcodes.findAll{k,v-> v."Genes Sequenced"}.keySet()

или

analysis_config.barcodes.findAll{k,v-> v["Genes Sequenced"]}.keySet()
...