Problems while using a Root Tree


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!!

   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

Multiple arrays of size ‘10,000’ is pretty large for the stack. You are likely running out of stack.
Try

  Int_t *Particle_PID = new Int_t[n_maximo];
  ....

Also make sure that the number of element in a given entry is never higher than 10,000 ; if it is higher, you will ended over-write random memory (and/or the stack).

Cheers,
Philippe.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.