从网格下载文件
学习目标
- 从网格获取 DST 文件
在前一节中,我们已经拿到一个名为
MC_2024_13264021_Beam6800GeV2024.W37.39MagDownNu6.325nsPythia8_Sim10d_HLT22024.W35.39_HLT2.DST.py
IOHelper('ROOT').inputFiles([
'LFN:/lhcb/MC/2024/HLT2.DST/00257716/0000/00257716_00000011_1.hlt2.dst',
'LFN:/lhcb/MC/2024/HLT2.DST/00257716/0000/00257716_00000007_1.hlt2.dst',
'LFN:/lhcb/MC/2024/HLT2.DST/00257716/0000/00257716_00000022_1.hlt2.dst',
...
],clear=True)
这仅仅是网格上逻辑文件名 (Logical File Names)的集合。它构成了我们感兴趣的数据集的文件列表,且每个文件包含许多独立的事件。因此,如果我们只想快速浏览数据集,只需获取其中一个文件就足够了。
在下载文件之前,我们需要设置与网格的连接并加载 Dirac 软件:
lhcb-proxy-init
代理初始化可能需要一些时间,并且会要求您输入证书密码。一旦我们有了可用的 Dirac 环境,获取文件就非常简单,输入:
lb-dirac dirac-dms-get-file LFN:/lhcb/MC/2024/HLT2.DST/00257716/0000/00257716_00000011_1.hlt2.dst
00257716_00000011_1.hlt2.dst
的文件。
在 Starterkit 课程期间下载文件
如果很多人同时下载同一个文件,速度可能会非常慢。有一种解决方法,文件也可以在 EOS 上获取,并可以使用以下命令下载到您的当前目录:
xrdcp root://eoslhcb.cern.ch//eos/lhcb/wg/dpa/wp7/Run3SK/exampleDST/00257716_00000011_1.hlt2.dst .
由于这些文件通常相当大,您可能需要使用您的 AFS 工作空间目录而不是用户目录来存储文件。如果您想增加 AFS 用户空间和工作空间的配额,可以按照 CERN Resources Portal 上的说明操作,您最多可以为 AFS 用户目录申请 10GB 空间,为工作空间申请 100GB。
替代方案:远程读取文件(避免下载)
为了避免 DST 文件占满您的 AFS 配额,您也可以向 Gaudi 传递一个 XML 目录 (XML catalog),使其能够远程访问文件。 首先,使用以下命令生成 XML 目录:
lb-dirac dirac-bookkeeping-genXMLCatalog --Options=MC_2024_13264021_Beam6800GeV2024.W37.39MagDownNu6.325nsPythia8_Sim10d_HLT22024.W35.39_HLT2.DST.py --Catalog=myCatalog.xml
然后,在您的选项文件中添加以下行:
from Gaudi.Configuration import FileCatalog
FileCatalog().Catalogs = [ "xmlcatalog_file:/path/to/myCatalog.xml" ]
请参阅相关的bookkeeping twiki页面获取更多细节。
Warning
LFN 的副本可能会发生变化。因此,如果您无法使用此方法访问文件,请首先尝试重新生成 XML 目录。
如果您想获取所有文件,您可以从 Bookkeeping 获取的文件中复制 LFN 列表,并将其粘贴到以下 Python 脚本中以方便操作:
# Your list of file names here
FILES = []
if __name__ == '__main__':
from subprocess import call
from sys import argv
n_files = len(FILES)
if len(argv) > 1:
n_files = int(argv[1])
files = FILES[:n_files]
for f in files:
print('Getting file {0}.'.format(f))
call('dirac-dms-get-file {0}'.format(f), shell=True)
print('Done getting {0} files.'.format(n_files))
将其保存为 getEvents.py
并通过 lb-dirac python getEvents.py [n]
来使用。如果您指定了 n
,脚本将只从网格获取前 n 个文件。
更简单的方法
实际上,dirac-dms-get-file
(以及其他 dirac-dms-\*
脚本)能够从任何文件中提取 LFN 并为您下载它们。因此,一个简单的命令就能下载所有文件:
lb-dirac dirac-dms-get-file --File=MC_2024_13264021_Beam6800GeV2024.W37.39MagDownNu6.325nsPythia8_Sim10d_HLT22024.W35.39_HLT2.DST.py