Root crashed after trying to analyze more events

Hello,

I’m running a simulation package in GEANT4 that simulates electron-iron atom scattering. Two events are simulated in this simulation: electron-electron scattering and electron-iron nucleus scattering. I’m using root to plot histograms for the energy of the scattered electrons based on a range of scattering angles in mrads. The amount of entries that I have are to large to run and get the plots in a short amount of time, so I decrease the amount of entries so that can I see if I have to right results. After increasing the entries, even by a magnitude by 10, I get a crash message. When I usually see that, I try to see where the mistake is in my, but I I’m sure enough that it should work no matter the amount of entries. Long story short, my code should work for any amount entries, but if I go larger than 0.01% of 7 billion root crashes. I will provide the code with some commits to explain my lines and the crash message. I hope to hear a response soon. Thanks in advance.

-Charlie Clark

_ROOT Version: 6.26/06
_Platform: Ubuntu 22
_Compiler: from file root_v6.26.06.Linux-ubuntu22-x86_64-gcc11.2.tar.gz

Code:

#define ScatteringAngle_cxx
#include "ScatteringAngle.h"
#include <TH2.h>
#include <TStyle.h>
#include <TCanvas.h>
#include <TMath.h>

void ScatteringAngle::Loop()
{
//Array of histograms with titles: radius between target and height of the detector.
  Int_t m = 10;

  TH1F * h[m];

  for (Int_t i = 0; i < m; i++){

    TString name1 = Form("h%d",i);
    TString name2 = Form("r>%fcm;Energy [GeV];Frequency [arb]",TMath::Sqrt(TMath::Sq(i/10)+TMath::Sq(100)));
    h[i] = new TH1F(name1,name2,200,0.0,2.2);
  }
  //TH1F * h2 = new TH1F("h2","Energy of All Electrons;Energy [GeV];Frequency [arb]",200,0.0,2.2);

  //TH1F * h3 = new TH1F("h3","Energy of Electrons with Scattering Angles Greater than 1 mrad;Energy [GeV];Frequency [arb]",200,0.0,2.2);

  /*for (Int_t i = 0; i < m; i++){

    TString name1 = Form("h%d",i);
    TString name2 = Form("r>%fmm",i/100.0);
    h2[i] = new TH1F(name1,name2,200,0.0,2.2);
  }*/
   if (fChain == 0) return;
//First for loop goes through all of the entries. Amount of entries are in variable nentries=7e08.
   Long64_t nentries = fChain->GetEntriesFast();

   Long64_t nbytes = 0, nb = 0;
   for (Long64_t jentry=0; jentry<nentries*0.0001;jentry++) {
      Long64_t ientry = LoadTree(jentry);
      if (ientry < 0) break;
      nb = fChain->GetEntry(jentry);   nbytes += nb;
      // if (Cut(ientry) < 0) continue;
//Second for loop goes through all of the events, calculates the scattering angles in rads, and fills the each histogram h[i] with energy of scattered electrons
//based on scattering angles. The floor function is used to cuts segments of the angles between entries i/1000 and (i+1)/1000. An example is commmented out where
//10 histograms are made with the floor function (the long way).
      for (Int_t j = 0; j < hitN; j++){
        Double_t a = TMath::ATan(TMath::Sqrt(TMath::Sq(hitPx[j])+TMath::Sq(hitPy[j]))/hitPz[j]);
        Int_t i = floor(a*1000);
        if (a>i/1000) h[i]->Fill ( hitE[j] );
        if (a>0.001) std::cout << "Angle is (rad): " << a << "Floor function is: " << i << "\n";
        /*if (a>0.0 && a<0.001) h[0]->Fill ( hitE[i] );
        if (a>0.001 && a<0.002) h[1]->Fill ( hitE[i] );
        if (a>0.002 && a<0.003) h[2]->Fill ( hitE[i] );
        if (a>0.003 && a<0.004) h[3]->Fill ( hitE[i] );
        if (a>0.004 && a<0.005) h[4]->Fill ( hitE[i] );
        if (a>0.005 && a<0.006) h[5]->Fill ( hitE[i] );
        if (a>0.006 && a<0.007) h[6]->Fill ( hitE[i] );
        if (a>0.007 && a<0.008) h[7]->Fill ( hitE[i] );
        if (a>0.008 && a<0.009) h[8]->Fill ( hitE[i] );
        if (a>0.009 && a<0.01) h[9]->Fill ( hitE[i] );*/


      }
    }
//One canvas made to plot a histograms.
    TCanvas * C1 = new TCanvas("C1","C1",3000,3000);
    C1->Divide(5,2);
    for (Int_t i = 0; i < m; i++){
      C1->cd(i+1)->SetLogy(1);
      h[i]->Draw();

    }
    /*TCanvas * C2 = new TCanvas("C2","C2",2000,2000);
    C2->cd()->SetLogy(1);
    h2->Draw();
    TCanvas * C3 = new TCanvas("C3","C3",2000,2000);
    C3->cd()->SetLogy(1);
    h3->Draw();*/


}

Crash message:

===========================================================
There was a crash.
This is the entire stack trace of all threads:
===========================================================
#0  0x00007fd9f504645a in __GI___wait4 (pid=4324, stat_loc=stat_loc
entry=0x7fff04640218, options=options
entry=0, usage=usage
entry=0x0) at ../sysdeps/unix/sysv/linux/wait4.c:30
#1  0x00007fd9f504641b in __GI___waitpid (pid=<optimized out>, stat_loc=stat_loc
entry=0x7fff04640218, options=options
entry=0) at ./posix/waitpid.c:38
#2  0x00007fd9f4facbcb in do_system (line=<optimized out>) at ../sysdeps/posix/system.c:171
#3  0x00007fd9f56f82d4 in TUnixSystem::StackTrace() () from /home/tuo91122/root/lib/libCore.so.6.26
#4  0x00007fd9f56f55e5 in TUnixSystem::DispatchSignals(ESignals) () from /home/tuo91122/root/lib/libCore.so.6.26
#5  <signal handler called>
#6  0x00007fd9eef9a9fd in ?? ()
#7  0x00007fff04643518 in ?? ()
#8  0x01007fd9f3bfb613 in ?? ()
#9  0x00007fd9f53d2018 in ?? ()
#10 0x0000562281d59f10 in ?? ()
#11 0x00007fd9f0fb9380 in ?? () from /home/tuo91122/root/lib/libCling.so
#12 0x00000000edb74e00 in ?? ()
#13 0x0000000000000000 in ?? ()
===========================================================


The lines below might hint at the cause of the crash.
You may get help by asking at the ROOT forum https://root.cern/forum
Only if you are really convinced it is a bug in ROOT then please submit a
report at https://root.cern/bugs Please post the ENTIRE stack trace
from above as an attachment in addition to anything else
that might help us fixing this issue.
===========================================================
#6  0x00007fd9eef9a9fd in ?? ()
#7  0x00007fff04643518 in ?? ()
#8  0x01007fd9f3bfb613 in ?? ()
#9  0x00007fd9f53d2018 in ?? ()
#10 0x0000562281d59f10 in ?? ()
#11 0x00007fd9f0fb9380 in ?? () from /home/tuo91122/root/lib/libCling.so
#12 0x00000000edb74e00 in ?? ()
#13 0x0000000000000000 in ?? ()
===========================================================

Try with: if (i >= 0 && i < m) h[i]->Fill ( hitE[j] );

Wow. That worked when I went up a magnitude of 10 for the entries. I will now try to go to higher entries and report back if anything goes bad again. Thanks.

Note that in your original condition “(a>i/1000)”, the “i/1000” always evaluates to “0”, so you effectively have “(a>0)”.