Hello, I am handling a large amount of data with a 3 dimensional array of histograms with indices A, P and M. A goes from 0 to 2, P goes from 0 to 4 and M from 0 to 11, and for some reason, I can store things in the coordinates of the form [0][P][M] but not in the coordinates of the form [1][P][M] and [2][P][M].

Here is the code:

First, some functions I use:

```
template<typename T, int N>
int getSize(T (&arr1)[N]) //Passing the array by reference
{
return N; //Correctly prints the size too [cool trick ;-)]
}
int getRange(double v, double arr[], int n)
{
for (int i = 0; i < n; ++i)
{
if (v>=arr[i])
{
return i;
}
}
}
int getMultRange(Event & event, double mult_range[], int n)
{
double mult=0;
for (int i = 0; i <= event.size(); ++i) if (event[i].isCharged() && event[i].isFinal())
{
++mult;
}
return getRange( mult, mult_range, n);
}
```

The purpose for getRange and getMultRange is because in my code I often want to find out in what point in the distribution a certain value falls, so I have this vectors with the distribution ranges from higher to lower.

Now the relevant code

```
double pT_range[] = {8, 4, 2, 1, 0.5}; //multiplicity ranges
double Aj_range[] = {0.22, 0, 0};
double mult_range[] = {234, 204, 188, 168, 152, 140, 128, 116, 104, 92, 76, 0}; //multiplicity ranges
TH2D* all_histos[getSize(Aj_range)][getSize(pT_range)][getSize(mult_range)];
const Char_t* forHist_Aj_range[] = {"AjInc", "Aj>0.22", "Aj<0.22"};
for (int a = 0; a < getSize(Aj_range); ++a)
{
for (int p = 0; p < getSize(pT_range); ++p)
{
for (int m = 0; m < getSize(mult_range); ++m)
{
all_histos[a][p][m] = new TH2D( Form("hist_mult>=%f_Aj%s_p>=%f",mult_range[m],forHist_Aj_range[a],pT_range[p]), "The momentum of particles in each Delta Ring", 9, 0, 1.8, 1000, -20, 20);
}
}
}
//I've also tried with:
//TH2D* all_histos[3][5][12];
//... in between we get the leading and subleading jets of the event
Aj = (leading.perp()-subleading.perp())/(leading.perp()+subleading.perp()); // we get the centrality
a = getRange( Aj, Aj_range, getSize(Aj_range)) + 1; //we determine what range of centrality this is
m = getMultRange( event, mult_range, getSize(mult_range)); //we determine what range of multiplicity this is
for (int n = 0; n <= event.size(); ++n) if (event[n].isCharged() && event[n].isFinal())
{
particle = event[n]; //we declare a particle
delta = sqrt(pow(particle.eta()-axis.eta(),2)+pow(particle.phi()-axis.phi(),2)); //we calculate the delta that we want to store in the histogram
if ( cutContidion(particle, delta) ) continue; //cutCondition is a custom function
pTll = -particle.perp()*cos( particle.phi()-axis.phi() ); //we calculate the "projection" that we want to store in the histogram
p = getRange( particle.perp(), pT_range, getSize(pT_range)); //we determine what range of transverse momentum this is
all_histos[0][p][m]->Fill(delta,pTll); //to fill Aj Inclusive
cout<<"This will be printed"<<endl;
all_histos[a][p][m]->Fill(delta,pTll); //to fill either Aj>0.22 or Aj<0.22
cout<<"This will NOT be printed, the code fails in the previous line"<<endl;
}
```

The code compiles, but the error I get when trying to run this code is:

*** Break *** segmentation violation

===========================================================

There was a crash.

This is the entire stack trace of all threads:

===========================================================

#0 0x0000003703aac7be in waitpid () from /lib64/libc.so.6

#1 0x0000003703a3e5c9 in do_system () from /lib64/libc.so.6

#2 0x00007f35f722b708 in TUnixSystem::StackTrace (this=0x103b880) at /storage/icn/aortizve/software/64bits/alicesw/root/alice_v5-34-30/src/core/unix/src/TUnixSystem.cxx:2419

#3 0x00007f35f722ab93 in TUnixSystem::DispatchSignals (this=0x103b880, sig=kSigSegmentationViolation) at /storage/icn/aortizve/software/64bits/alicesw/root/alice_v5-34-30/src/core/unix/src/TUnixSystem.cxx:1294

#4

#5 0x000000000046e96c in main ()

===========================================================

The lines below might hint at the cause of the crash.

If they do not help you then please submit a bug 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 0x000000000046e96c in main ()

===========================================================

I am at the point where I can’t imagine what the problem may be, I’ve checked that the indices are within bounds, that the indices are “int”, if I never try to store data in those histograms the code runs and if I save all_histos the histograms are indeed there, although empty.

Thanks a lot.

Edit: I solved it?

My code works now, but while fixing it I found that it shouldn’t have worked in the first place. The mistake is almost embarrassing: pT was being smaller than 0.5, the low boundary of the last considered interval. So I added to cutCondition an extra condition to remove those events but then I realized that it WAS filling the histograms with index [0][P][M], which is weird, if anything the problem was with the index P, but it didn’t “manifest” until the index A=1,2, and those histograms had data I could see it…

But whatever