将 JSON 解析为具有特定约束的 fasta 格式
Parsing JSON to fasta format with specific constraint
我有一个 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创建了一个fasta文件,我把条码名称“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"
}
}
我想更改此逻辑,以便如果 "genes sequenced" 为空,则跳过该条形码。
在“0004F--0004R”中,没有基因测序。我该如何实现这个逻辑?
在 Python 中,您可以简单地执行以下操作:
if not barcode['genessequenced']:
continue
... 它会跳过该条形码。我本质上是一名 Python 程序员,我正在使用 Nextflow,它使用 Groovy 作为基础语言。将不胜感激。
注意
我觉得我的整个逻辑都必须改变。目前的流程是:
- 创建所有条形码的keySet()
- 用序列填充每个
现在的流程应该是:
1. 使用 "genes sequenced" 创建条形码的 keySet()
2. 用序列填充每个
那么,barcodes = Channel.from(analysis_config.barcodes.keySet())
知道如何将这个逻辑添加到其中吗?
类似于:
barcodes = Channel.from(analysis_config.barcodes.[if "Genes Sequenced"].keySet())
在 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()
我有一个 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创建了一个fasta文件,我把条码名称“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"
}
}
我想更改此逻辑,以便如果 "genes sequenced" 为空,则跳过该条形码。
在“0004F--0004R”中,没有基因测序。我该如何实现这个逻辑?
在 Python 中,您可以简单地执行以下操作:
if not barcode['genessequenced']:
continue
... 它会跳过该条形码。我本质上是一名 Python 程序员,我正在使用 Nextflow,它使用 Groovy 作为基础语言。将不胜感激。
注意
我觉得我的整个逻辑都必须改变。目前的流程是:
- 创建所有条形码的keySet()
- 用序列填充每个
现在的流程应该是: 1. 使用 "genes sequenced" 创建条形码的 keySet() 2. 用序列填充每个
那么,barcodes = Channel.from(analysis_config.barcodes.keySet())
知道如何将这个逻辑添加到其中吗?
类似于:
barcodes = Channel.from(analysis_config.barcodes.[if "Genes Sequenced"].keySet())
在 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()