ROOT Version: Not Provided Platform: Not Provided Compiler: Not Provided
Hello everyone,
I have an array and I want to calculate its size for each event, I wrote this code but I couldn’t run it because I got an error clear in the attached pic.
here is the code I wrote, and my input file consists of 4 columns and about 500k raws.
any help will be highly appreciated, thanks a lot in advance.
TH1F *h_cluster_size = new TH1F("cluster_size", "cluster_size", 100, 0., 727.);
for(int i = 0; i < 4100; i++){ //looping over number of events
// for every event, you need to get the "posx" here and then:
h_cluster_size->Fill(posx.size());
}
The error message you’re seeing is caused by the fact that the variable cluster_size is being redefined inside the for loop. Because it is already defined outside the loop, you can’t define it again within the loop. The fix @Wile_E_Coyote provided is the right one.
Here is the full corrected code:
int cluster_size(const char * input = "out1.txt", const char * output = "pixels.root"){
ifstream fint; //input file
fint.open(input);
if(!fint.is_open()){
cout << "Input File " << input << " had issues while opening, closing the script\n";
return -1;
}
TFile * fout = new TFile(output, "RECREATE");
int pixarrX = 727, pixarrY = 727; //number of pixels in 2D
vector <int> posx;
vector <int> posy;
vector <float> thick;
vector <double> dose;
string spx, spy, sth, sd;
string line;
stringstream ssth, ssd;
double d = 0, t = 0;
int c_dec = 1;
int prev = 0;
while (getline(fint,line)){
if(line.length() == 1 || line.empty()){
continue;
}
else if(isdigit(line.at(0))){
stringstream s_data(line);
getline(s_data,spx,',');
getline(s_data,spy,',');
getline(s_data,sth,',');
getline(s_data,sd,',');
stringstream ssth(sth), ssd(sd);
ssth >> t; //common procedure for the conversion
ssd >> d;
posx.push_back(stoi(spx)); //for int (not in scientific notation) the stoi function is used
posy.push_back(stoi(spy));
thick.push_back(t);
dose.push_back(d);
}
TH1F *h_cluster_size = new TH1F("cluster_size","cluster_size",100, 0.,727.);
int cluster_size = 0;
for(int i = 0; i < 4100; i++){ //looping over number of events
cluster_size = posx.size();
h_cluster_size->Fill(cluster_size);
}
h_cluster_size->Write();
fout->Close();
return 0;
}
Hello again every one
when I used the previous code couple of times it was giving me the same result, so I am guessing it is only plot one event not all events as I want,
I tried to include anothe column for the event ID to loop on them, and shifted the filling to the main loop, in order to make the loop on each event ID and plot all of them
but it gives me the errore in the attached picture,
any advice or help will be highly appreciated
thanks a lot
You call “fout->Close();” right for the first “getline(fint,line)”, so then the next “input lines” do not have any opened output file (and you recreate the “h_cluster_size” histogram for every “input line”).