写在前面:本文内容翻译自anvi'o的官方社区,若有疑惑的地方请各位优先前往官网进行查阅原文!!!
原作者: A.Murat Eren (Meren)
译:秋柔焉姬
常用anvio的小伙伴应该非常熟悉,anvi'o 交互界面非常灵活,允许我们将许多不同类型的数据添加到单个泛基因组的结果中显示。
通常要在 --manual 模式下使用交互界面(通过以临时方式自行提供每一位数据),否则界面中显示的大部分数据来自存储在 anvi'o contigs、profile 先前的计算信息里,或样本数据库(例如重叠群的 GC 含量,或样本的覆盖率值,或映射到给定样本的读取数等)。
但是,根据项目的不同,我们经常想在这些显示中添加额外的东西。 anvi-interactive 程序允许其用户相当快速地使用制表符分隔的数据文件来进行数据展示。但是尽管如此,作者认为这样仍然是不够灵活的,因而推出本教程。
通过使用 --additional-layers 参数通过制表符分隔的文件添加新信息来在任何方向扩展任何 anvi'o 显示非常高效,但这种做法对用户的配置文件有要求较为繁琐。另外,缺乏用户和程序员友好的方式来向 anvi'o 平移和配置文件数据库添加或删除此类附加信息,这样一来使得我们难以方便添加数据。
这就是为什么在保持临时工作流程的同时,我们在 anvio(v4) 中扩展了 anvi’o,采用全新的设计来处理添加的数据。
目的与相关术语
如果您不熟悉显示项目的 anvi'o 术语(即,如果您不知道什么是图层、视图或项目),请先阅读本文以熟悉标准 anvi'o 交互显示的各个部分:
这篇文章的目的是向您展示如何使用项目、图层和图层顺序的附加数据来注释显示。对于所有这些任务,我们将使用相同的三个程序,anvi-import-misc-data、anvi-export-misc-data 和 anvi-delete-misc-data 以及不同的目标表(例如用于装饰项目的项目、层)使④出现,或者layer_orders使③的数据可用于我们的平底锅或剖面数据库。
在这篇文章中,我将使用一个简单的数据集进行演示。如果您想在 anvi’o v4 或更高版本安装的计算机上顺利运行它,请按照后续命令进行
wget http://merenlab.org/files/anvio_additional_data_tables_example.tar.gz
tar -zxvf anvio_additional_data_tables_example.tar.gz
cd anvio_additional_data_tables_example/
用户如何处理数据表
本节将逐步显示哪个表适合界面中的内容。尽管这些示例将使用空白的 anvi’o 配置文件数据库,但对于常规配置文件数据库和泛数据库,一切都将以相同的方式工作
在项目中添加附加数据表
如果您想显示每个重叠群、基因簇或中心的任何其他项目的内容,则可以使用此表。 items 的目标表名称是 items。
让我们首先在手动模式下可视化 view_data.txt 的内容(给定 tree.txt 文件),如下所示:
anvi-interactive -d view_data.txt \
-t tree.txt \
-p profile.db \
--title "Test" \
--manual
点击“绘制”会给我们这样的结果:如果您查看 view_data.txt,您会发现两个文件的第一列是相同的。可以通过以下方式将显示的项目附加数据导入到配置文件数据库中:
anvi-import-misc-data items_additional_data.txt \
-p profile.db \
--target-data-table items
New data for 'items' in data group 'default'
===============================================
Data key "categorical_1" .....................: Predicted type: str
Data key "categorical_2" .....................: Predicted type: str
Data key "text_layer_01" .....................: Predicted type: str
Data key "numerical" .........................: Predicted type: float
Data key "bars_main!A" .......................: Predicted type: stackedbar
Data key "bars_main!B" .......................: Predicted type: stackedbar
Data key "bars_main!C" .......................: Predicted type: stackedbar
NEW DATA
===============================================
Database .....................................: profile
Data group ...................................: default
Data table ...................................: items
New data keys ................................: categorical_1, categorical_2, text_layer_01, numerical, bars_main!A, bars_main!B, bars_main!C.
现在再次运行交互界面会给我们带来额外的东西
anvi-interactive -d view_data.txt \
-t tree.txt \
-p profile.db \
--title "Test" \
--manual
我们通过单击“保存状态”来保存默认状态,这样下一次我们就不必单击“绘制”。
我们可以从给定表中导出数据:
anvi-export-misc-data -p profile.db \
--target-data-table items \
-o exported_additional_file.txt
Output file for items ........................: exported_additional_file.txt
或者,您可以删除整个给定表的内容,或通过指定一个或多个数据键仅删除特定数据项。 Anvi’o 可以使用 --list-available-keys 标志告诉您给定表中的可用键:
anvi-delete-misc-data -p profile.db \
--target-data-table items \
--list-available-keys
AVAILABLE DATA KEYS FOR ITEMS (5 FOUND)
===============================================
* bars_main!A;B;C (stackedbar, describes 300 items)
* categorical_1 (str, describes 300 items)
* categorical_2 (str, describes 300 items)
* numerical (float, describes 300 items)
* text_layer_01 (str, describes 300 items)
假设我们要删除其中之一:
anvi-delete-misc-data -p profile.db \
--target-data-table items \
--keys-to-remove categorical_1,categorical_2
WARNING
===============================================
items data for the following keys removed from the database: 'categorical_1,
categorical_2'.
现在它没了:
anvi-delete-misc-data -p profile.db \
--target-data-table items \
--list-available-keys
AVAILABLE DATA KEYS FOR ITEMS (3 FOUND)
===============================================
* bars_main!A;B;C (stackedbar, describes 300 items)
* numerical (float, describes 300 items)
* text_layer_01 (str, describes 300 items)
如果不指定数据键,则表的全部内容将消失:
anvi-delete-misc-data -p profile.db \
--target-data-table items
WARNING
===============================================
All data from the items additional data table is removed.
然后你就什么也看不到了:
anvi-delete-misc-data -p profile.db \
--target-data-table items \
--list-available-keys
* There are no item additional data for items in this database.
要继续使用项目附加数据表中的一些数据,让我们重新填充它并继续添加图层:
anvi-import-misc-data items_additional_data.txt \
-p profile.db \
--target-data-table items
图层附加数据表
如果您想显示每个图层的内容,则可以使用此表。这些层可以是您的宏基因组、宏转录组样本、您的基因组或上图中标识为②的任何其他层。层的目标表名称是layers。
对图层附加数据表的访问在概念上与我们处理项目附加数据的方式相同,并且需要对命令行进行一些小更改。例如,采用以下文件:现在,该文件的第一列与我们的图层名称相同,每列都描述给定图层的属性。
我们可以通过这种方式将其添加到配置文件数据库中:
anvi-import-misc-data layers_additional_data.txt \
-p profile.db \
--target-data-table layers
NEW DATA
===============================================
Database .....................................: profile
Data group ...................................: default
Data table ...................................: layers
New data keys ................................: numerical_01, numerical_02, categorical, stacked_bar!X, stacked_bar!Y, stacked_bar!Z.
之后,当您重新运行交互界面时,每层的更多信息应该显示在右侧:
anvi-interactive -d view_data.txt \
-t tree.txt \
-p profile.db \
--title "Test" \
--manual
如果再次运行交互式界面,您应该会在显示中看到新的内容:输入文件中的图层附加数据按照它们在文件中出现的顺序显示。事实上,如果您单击打开设置面板,然后切换到“样本”选项卡,您可以看到样本订单的组合框已填充了一些自动订单,以根据这些数据组织图层:
图层顺序附加数据表
如果您想存储图层的特定顺序(例如系统发育树)或基本形式的顺序,则需要使用此表。您可以执行此表的操作对应于本文开头所示示例图中标识为③的部分。图层的目标表名称是layer_orders。
每个图层顺序可以是基本形式或新形式,当然,您可以根据需要在图层顺序文件中包含任意数量的图层顺序。当您按以下方式导入图层订单文件时:
anvi-import-misc-data layers_order.txt \
-p profile.db \
--target-data-table layer_orders
New layer_orders data...
===============================================
Data key "test_tree" .........................: Type: newick
Data key "test_list" .........................: Type: basic
New order data added to the db for layer_orders : test_tree, test_list.
重新可视化一下
anvi-interactive -d view_data.txt \
-t tree.txt \
-p profile.db \
--title "Test" \
--manual
现在,如果您再次单击打开设置面板,并切换到样本选项卡,您可以在样本排序的组合框中看到新的顺序:选择进化树的排序方式,并且进行重新绘制
现在您知道如何扩展 anvi'o 交互式界面显示了!
作为程序员处理项目附加数据表
如果您正在编写 Python 程序,则可以通过以下方式简单地处理其他数据项:
import argparse
import anvio.dbops as dbops
args = argparse.Namespace(pan_or_profile_db="/path/to/profile.db", target_data_table="items")
# MiscDataTableFactory will give you the right object based on your `target_data_table`
# argument --alternatively you can directly access to the relevant class. The factory
# pattern makes it easier to seamlessly select the right inheritance route.
items_additional_data_table = dbops.MiscDataTableFactory(args)
# add data:
item_additional_data_table.add(new_keys_list, new_data_dict)
# read data:
items_additional_data_keys, items_additional_data_dict = item_additional_data_table.get()
# remove data:
item_additional_data_table.remove(keys_list)
例如,此代码应该在上面的目录中完美运行:
import argparse
import anvio.dbops as dbops
import anvio.utils as utils
args = argparse.Namespace(profile_db="profile.db", target_data_table="items")
# get some data:
keys = utils.get_columns_of_TAB_delim_file('items_additional_data.txt')
data = utils.get_TAB_delimited_file_as_dictionary('items_additional_data.txt')
# add it to the database (because this is a blank profile, we use `skip_check_names`
# flag. This flag is not necessary when working with regular profile
# and pan databases.
dbops.MiscDataTableFactory(args).add(data, keys, skip_check_names=True)
# get data from the database:
keys, data = dbops.MiscDataTableFactory(args).get()
# remove data:
dbops.MiscDataTableFactory(args).remove(keys)
就是这样!只需更改项目、图层或图层顺序之间的 target_data_table 变量,您就可以使用不同的表。也就是说,以下内容将给出与上面相同的结果,但表选择将显式完成,而不是通过 target_data_table 参数:
import argparse
import anvio.dbops as dbops
import anvio.utils as utils
args = argparse.Namespace(profile_db="profile.db")
# get some data:
keys = utils.get_columns_of_TAB_delim_file('items_additional_data.txt')
data = utils.get_TAB_delimited_file_as_dictionary('items_additional_data.txt')
# add data
dbops.TableForItemAdditionalData(args).add(data, keys, skip_check_names=True)
# get data from the database:
keys, data = dbops.TableForItemAdditionalData(args).get()
# remove data:
dbops.TableForItemAdditionalData(args).remove(keys)