Ошибка при использовании Root/C++: нет подходящего конструктора для инициализации «TTree»

Я пытаюсь построить инвариантную массу Z-бозона из двух распавшихся мюонов. Я использую MadGraph и Root. MadGraph моделирует события (pp > Z > mu+ и mu-) и создает файл .root, содержащий события. Я назвал симуляцию генерацией событий.

Чтобы использовать Root для анализа данных и построения гистограммы, мне нужно написать свой код на C++. Вот код:

#ifdef __CLING__
R__LOAD_LIBRARY(libDelphes)
#include "TFile.h"
#include "TTree.h"
#include "TCanvas.h"
#include "TH1F.h"
#include <iostream>
#include "classes/DelphesClasses.h"
#include "external/ExRootAnalysis/ExRootTreeReader.h"
#include "external/ExRootAnalysis/ExRootResult.h"
#else

class ExRootTreeReader;
class ExRootResult;
using namespace std;
#endif

void readEvents(const char *inputFile)
{

 gSystem->Load("libDelphes");

 TChain chain("Delphes");
 chain.Add(inputFile);


 ExRootTreeReader *treeReader = new ExRootTreeReader(&chain);
 Long64_t numberOfEntries = treeReader->GetEntries();

 TTree *tree = new TTree(&chain);

 TClonesArray *branchMuon = treeReader->UseBranch("Muon");
 //Long64_t numberOfMuons = branchMuon->GetEntries();

 TClonesArray *branchElectron = treeReader->UseBranch("Electron");
 Long64_t numberOfElectrons = branchElectron->GetEntries();


cout << "There are " << numberOfEntries << " entries in your ntuple" << endl;

UInt_t  Muons;
Float_t MuonEta1;
Float_t MuonPhi1;
Float_t MuonPt1;
Float_t MuonEta2;
Float_t MuonPhi2;
Float_t MuonPt2;

tree->SetBranchAddress("MuonEta1", &MuonEta1);
tree->SetBranchAddress("MuonPhi1", &MuonPhi1);
tree->SetBranchAddress("MuonPt1", &MuonPt1);
tree->SetBranchAddress("MuonEta2", &MuonEta2);
tree->SetBranchAddress("MuonPhi2", &MuonPhi2);
tree->SetBranchAddress("MuonPt2", &MuonPt2);

TH1F *histDiMuonMass = new TH1F("mass", "M_{inv}(mu+[1], mu-[2]); M_inv (GeV/c^2); Events", 50, 0.0, 1500);
for(Int_t entry = 0; entry < numberOfEntries; ++entry)
{
 treeReader->ReadEntry(entry);

 Long64_t numberOfMuons = branchMuon->GetEntries();

 //Muons += entry;



 //Muon *muon1, *muon2, *muon3, *muon4;
 TLorentzVector muon1;
 TLorentzVector muon2;

 muon1.SetPtEtaPhiM(MuonPt1, MuonEta1, MuonPhi1, 0.1);
 muon2.SetPtEtaPhi(MuonPt2, MuonEta2, MuonPhi2, 0.1);


if(branchMuon->GetEntries() == 4)
{


 TLorentzVector Z = muon1 + muon2;
 histDiMuonMass->Fill(Z.M());
}
}
cout << "There are " << Muons << " entries in your ntuple" << endl;
histDiMuonMass->Draw();
}

Затем в корневом терминале я набираю: \

.x examples/readEvents.C("../eventgeneration/Events/run_01/tag_1_delphes_events.root")

Однако я получаю следующую ошибку:

In file included from input_line_1563:1:
/mnt/c/1/MG5_aMC_v2_6_6/Delphes/examples/readEvents.C:30:20: error: no matching constructor for initialization of 'TTree'
 TTree *tree = new TTree(&chain);
                   ^     ~~~~~~
/home/cucip/builddir/include/TTree.h:295:4: note: candidate constructor not viable: no known conversion from 'TChain *' to 'const TTree' for 1st argument; remove &
   TTree(const TTree& tt) = delete;
   ^
/home/cucip/builddir/include/TTree.h:291:4: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
   TTree();
   ^
/home/cucip/builddir/include/TTree.h:292:4: note: candidate constructor not viable: requires at least 2 arguments, but 1 was provided
   TTree(const char* name, const char* title, Int_t splitlevel = 99, TDirectory* dir = gDirectory);
   ^
In file included from input_line_1563:1:
/mnt/c/1/MG5_aMC_v2_6_6/Delphes/examples/readEvents.C:72:8: error: no member named 'SetPtEtaPhi' in 'TLorentzVector'
 muon2.SetPtEtaPhi(MuonPt2, MuonEta2, MuonPhi2, 0.1);

Кто-нибудь видит, что может вызвать эту ошибку и как я могу ее исправить?

Большое спасибо!


person usernew    schedule 27.01.2020    source источник


Ответы (1)


Вызывая new TTree(&chain), вы пытаетесь вызвать конструктор для TTree и предоставляете ему TChain * (тип chain равен TChain, поэтому &chain является указателем на TChain).

Конструкторы для TTree https://root.cern/doc/v618/classTTree.html либо без аргументов, либо с двумя const char* (обычно это строковые литералы или .Data() из TString, или .c_str() из std::string, или вывод ROOT Form…).

Похоже, вы пытаетесь вызвать удаленный конструктор TTree(const TTree&tt)=delete, который не работает по нескольким причинам:

  • вы предоставляете указатель на TTree вместо TTree по ссылке (даже не уверен, что приведение от TChain к TTree будет работать, если & там не будет.
  • конструктор удален, поэтому на самом деле он не существует и не может быть вызван.

Однако, судя по всему, вы хотите использовать TChain как TTree*, что не требует никакого кода с вашей стороны для начала, потому что TChain уже является TTree по наследству. Таким образом, вы можете использовать chain. вместо tree-> или (если наличие переменной-указателя действительно более желательно по причинам, которые я не вижу в примере) создать TTree* (т.е. создать только указатель на TTree вместо создания фактическое TTree в куче и получить указатель на него от оператора new), выполнив что-то вроде

TTree* tree = &chain;
person pseyfert    schedule 27.01.2020
comment
Однако новая ошибка, которую я получаю, это Ошибка в TChain::SetBranchAddress: неизвестная ветвь -> Ошибка MuonEta1 в TChain::SetBranchAddress: неизвестная ветвь -> Ошибка MuonPhi1 в TChain::SetBranchAddress: неизвестная ветвь -> Ошибка MuonPt1 в TChain :: SetBranchAddress: неизвестная ветвь -> MuonEta2 Ошибка в TChain::SetBranchAddress: неизвестная ветвь -> MuonPhi2 Ошибка в TChain::SetBranchAddress: неизвестная ветвь -> MuonPt2 - person usernew; 28.01.2020
comment
это, вероятно, взято отсюда root.cern/doc/v618/TChain_8cxx_source.html#l02476 и проблема не только в коде, а в том, что ваш код не соответствует входному файлу (вы пытаетесь получить доступ к данным, которых просто нет). Боюсь, без доступа к tag_1_delphes_events.root трудно сказать. - person pseyfert; 28.01.2020