ROOT Version : 6.10/08
Platform, compiler: CentOS Linux 7, gcc 4.8.5
Hello guys, I hope you’re doing well! I’m having some issues while trying to use a tree to create a histogram of invariant mass. I have a .root file generated from a .lhe file and I’m using this .root file to create a histogram. Here, this is my code(sorry for the comment lines in portuguese):
/*
Cauê Evangelista de Sousa
Março de 2018
*/
//Inclui os headers que serão usados
#include "TROOT.h"
#include "TChain.h"
#include "TFile.h"
#include "TH1F.h"
#include "TCanvas.h"
#include <iostream>
#include <fstream>
#include <cmath>
/*Como pegar os dados dos leptons e dos neutrinos sem fazer de novo um .txt com tudo?
Como fazer isso de uma maneira mais direta?!
Como ler a tree e já usar os valores dos quadrimomentos das partículas de interesse?
Eu sei calcular a massa invariante usando um arquivo com o quadrimomento das duas partículas em uma linha
Como deixar nesse formato sem recair no jeito antigo de fazer as coisas??*/
int wbeira(){
//Cria a tree usando um arquivo .root com os dados e gera as classes associadas a ela
TFile *f_wbeira = new TFile("ffbar2w.root"); //abre o arquivo .root com os dados dos eventos
TTree *wbeira; //Cria a tree do w(chamada muito criativamente de wbeira
f_wbeira->GetObject("LHEF",wbeira);//Estou confuso
wbeira->SetMakeClass(1);//Cria as classes da tree
//Cria todas as variaveis que serão usadas, todas as variaveis onde os branches e leaves serão armazenados
const Int_t n_maximo=10000;//cria uma variavel do tipo Int_t que será constante e que vale 10k
Int_t Event_Nparticles;//Irá armazenar o número de partículas do evento
Int_t Particle_PID[n_maximo]; //Irá armazenar o PID de todas as partículas
Int_t Particle_Status[n_maximo];//Irá armazenar o status de todas as partículas
Double_t Particle_Pt[n_maximo];//Irá armazenar o PT de todas as partículas
Double_t Particle_Px[n_maximo];//Irá armazenar o PX de todas as partículas
Double_t Particle_Py[n_maximo];//Irá armazenar o PY de todas as partículas
Double_t Particle_Pz[n_maximo];//Irá armazenar o PZ de todas as partículas
Double_t Particle_E[n_maximo];//Irá armazenar a E de todas as partículas
//Cria todos os branches
TBranch *bEvent_Nparticles = wbeira->GetBranch("Event.Nparticles");
TBranch *bParticle_PID = wbeira->GetBranch("Particle.PID");
TBranch *bParticle_Status = wbeira->GetBranch("Particle.Status");
TBranch *bParticle_Pt = wbeira->GetBranch("Particle.PT");
TBranch *bParticle_Px = wbeira->GetBranch("Particle.Px");
TBranch *bParticle_Py = wbeira->GetBranch("Particle.Py");
TBranch *bParticle_Pz = wbeira->GetBranch("Particle.Pz");
TBranch *bParticle_E = wbeira->GetBranch("Particle.E");
//Associa as variaveis declaradas aos branches criados(associa o edereço delas aos branches)
bEvent_Nparticles -> SetAddress(&Event_Nparticles);
bParticle_PID -> SetAddress(&Particle_PID);
bParticle_Status -> SetAddress(&Particle_Status);
bParticle_Pt -> SetAddress(&Particle_Pt);
bParticle_Px -> SetAddress(&Particle_Px);
bParticle_Py -> SetAddress(&Particle_Py);
bParticle_Pz -> SetAddress(&Particle_Pz);
bParticle_E -> SetAddress(&Particle_E);
//Cria o histograma da massa invariante do W
TH1F *InvariantMassW = new TH1F("InvariantMassW","InvariantMassW",100,0,100);//100 bins, de 0 a 100
//Loop dos eventos e loop das particulas de cada evento
Long64_t entradas = wbeira->GetEntries(); //atribui na variável entradas(que é do tipo Long64_t) as entradas da tree wbeira
//Cria as váriaveis para armazenar o momento das partículas de maior pt
Double_t pt1 = 0;
Double_t pt2 = 0;
//Cria as variáveis para armazenar o indice das partículas de maior pt
Int_t i_pt1 = 0;
Int_t i_pt2 = 0;
//Cria as variaveis que serão usadas para guardar os quadrimomentos das particulas de maior pt
Double_t e1 = 0,px1 = 0,py1 = 0,pz1 = 0,e2 = 0,px2 = 0,py2 = 0,pz2 = 0;
//Cria a variável que irá armazenar a massa invariante das duas particulas de maior pt do iesimo evento
Double_t i_iv = 0;
//Abre o for dos eventos e cria uma variavel Long64_t chamada i_event(iesimo evento) que será iterada até entradas
for(Long64_t i_event=0;i_event < entradas; i_event++){
//A cada evento os momentos deverão ser zerados a fim de procurar pelas partículas de maior pt:
pt1 = 0;
pt2 = 0;
//E os indices das particulas de maior pt também devem ser zerados
i_pt1 = 0;
i_pt2 = 0;
//E o mesmo deverá acontecer para os quadrimomentos
e1 = 0;
px1 = 0;
py1 = 0;
pz1 = 0;
e2 = 0;
px2 = 0;
py2 = 0;
pz2 = 0;
//E para a massa invariante das duas artículas de maior pt daquele evento
i_iv = 0;
/*Abre o for das particulas do iesimo evento e cria uma variavel Long64_t chamada i_part
que será iterada até o número de partículas Event_Nparticles daquele iesimo evento*/
for(Long64_t i_part = 0;i_part < Event_Nparticles; i_part++){
if( (Particle_Pt[i_part] > pt1) && (Particle_Status[i_part] == 2) ){
pt1 = Particle_Pt[i_part];
i_pt1 = i_part;
}
}
for(Long64_t i_part = 0;i_part < Event_Nparticles; i_part++){
if( (Particle_Pt[i_part] < Particle_Px[i_pt1]) && (Particle_Pt[i_part] > pt2) && (Particle_Status[i_part] == 2) ){
pt2= Particle_Pt[i_part];
i_pt2= i_part;
}
}
//Calcula a massa invariante das duas partículas de maior pt do iesimo evento filtradas acima e joga no histograma InvariantMassW
e1 = Particle_E[i_pt1];
px1 = Particle_Px[i_pt1];
py1 = Particle_Py[i_pt1];
pz1 = Particle_Pz[i_pt1];
e2 = Particle_E[i_pt2];
px2 = Particle_Px[i_pt2];
py2 = Particle_Py[i_pt2];
pz2 = Particle_Pz[i_pt2];
i_iv = sqrt(pow(e1+e2,2)-pow(px1+px2,2)-pow(py1+py2,2)-pow(pz1+pz2,2));
InvariantMassW -> Fill(i_iv);
}
/*
TCanvas c1("Canvas");
InvariantMassW ->Draw();
c1.Update();
c1.SaveAs("WInvariantMassHistogram.pdf");
*/
return 0;
}
//Esse bloco muito estranho diz basicamente que se o programa não estiver sendo compilado usando o compilador do root(CINT) ele deve ser tratado como um .c comum
#ifndef __CINT__
int main(){
wbeira();
return 0;
};
#endif
To problem is: I’m getting a strange message in my terminal
------------------------------------------------------------
| Welcome to ROOT 6.10/08 http://root.cern.ch |
| (c) 1995-2017, The ROOT Team |
| Built for linuxx8664gcc |
| From tag v6-10-08, 16 October 2017 |
| Try '.help', '.demo', '.license', '.credits', '.quit'/'.q' |
------------------------------------------------------------
Processing wbeira.cc...
Warning in <TClass::Init>: no dictionary for class TRootLHEFEvent is available
Warning in <TClass::Init>: no dictionary for class TRootWeight is available
Warning in <TClass::Init>: no dictionary for class TRootLHEFParticle is available
Warning in <TClass::Init>: no dictionary for class TSortableObject is available
*** Break *** segmentation violation
===========================================================
There was a crash.
This is the entire stack trace of all threads:
===========================================================
#0 0x00007f9c776d5dbc in waitpid () from /lib64/libc.so.6
#1 0x00007f9c77658cc2 in do_system () from /lib64/libc.so.6
#2 0x00007f9c786e80bf in TUnixSystem::StackTrace() () from /usr/local/apps/root_v6.10.08/lib/libCore.so
#3 0x00007f9c786ea80c in TUnixSystem::DispatchSignals(ESignals) () from /usr/local/apps/root_v6.10.08/lib/libCore.so
#4 <signal handler called>
#5 0x00007f9c78e8e486 in ?? ()
#6 0x0000000000000000 in ?? ()
===========================================================
The lines below might hint at the cause of the crash.
You may get help by asking at the ROOT forum http://root.cern.ch/forum.
Only if you are really convinced it is a bug in ROOT then please submit a
report at http://root.cern.ch/bugs. Please post the ENTIRE stack trace
from above as an attachment in addition to anything else
that might help us fixing this issue.
===========================================================
#5 0x00007f9c78e8e486 in ?? ()
#6 0x0000000000000000 in ?? ()
===========================================================
Please, help me!!