Add a TWebFile to a TChain

Hi, ROOT experts,

I am working with many root files online (files in http), and I am wondering if I can use TWebFile to open each of them and then add them to a TChain? Somebody asked the same question long time ago but there’s still no clear answer to this question:

I want to do something like this:

# These files contain trees with the same tree name
f1 = TWebFile("http://....../file1.root")
f2 = TWebFile("http://....../file2.root")
f3 = TWebFile("http://....../file3.root")

chain = ROOT.TChain("combined")
chain.AddFile(f1)
chain.AddFile(f2)
chain.AddFile(f3)

waveforms = ROOT.mattak.Waveforms()
chain.SetBranchAddress("waveforms", ROOT.AddressOf(waveforms))

nTotalEvents = chain.GetEntries()
for i_event in range(nTotalEvents):
        chain.GetEntry(i_event)
.
.
.

Is it possible to do it this way or something like this, or is there a better way?

Thank you!


ROOT Version: Not Provided
Platform: Not Provided
Compiler: Not Provided


Using

chain = ROOT.TChain("combined")
chain.AddFile("http://....../file1.root")
chain.AddFile("http://....../file2.root")
chain.AddFile("http://....../file1.root")

would create TWebFile to access the file.

What are you trying to accomplish by creating them explicitly?

Hi, @pcanal,

Thanks for your reply. But doing it in this way
chain.AddFile("http://....../combined.root")

I got an error when I was trying to get the tree out of the file:

Error in <DavixOpen>: can not open file "https://....../combined.root" with davix: Result HTTP 401 : Authentication Error  after 3 attempts (14)

Somebody told me that if I wanted to fix this issue for just using a TFile I could do:

ROOT.gPluginMgr.LoadHandlersFromPluginDirs()
ROOT.gPluginMgr.AddHandler("TFile", "^http[s]?:", "TWebFile", "Net", "TWebFile(const char*,Option_t*)")
f = TFile.Open("http://....../combined.root")
t = f.Get("combined")
t.SetBranchAddress("waveforms", ROOT.AddressOf(waveforms))

This works for me to deal with just one TFile at a time, but I really want to use TChain to deal with several files, could you please tell me if there’s a way to do it if I were to use TChain in this case?

Thank you!

Use

ROOT.gPluginMgr.LoadHandlersFromPluginDirs()
ROOT.gPluginMgr.AddHandler("TFile", "^http?:", "TWebFile", "Net", "TWebFile(const char*,Option_t*)")

This works for me to deal with just one TFile at a time, but I really want to use TChain

If it works with TFile::Open, it should work for TChain.

It works for me using a TFile, but it doesn’t work when I use a TChain, I still got the same error.

I can not reproduce the original problem. Can you pm me the url of one of the files?

I am sorry I am not allowed to share the link because there’s a password in there and that belongs to the research group. I will try to find the solution, if not I will just use TFile to work with each file individually, and then use hadd command to combine the output files…

Thank you so much for all your replies!