1 //-------------------------------------------------------------------------
2 // Implementation of Class AliHEPDataParser
4 // This class is used to save the content of hisograms/graphs in the
5 // HEP data format and viceversa. The HEP data format is not strictly
6 // defined and there are many variants, the class only support a few
7 // of them. More will be added as needed. The input can be a set of
8 // 2 TH1, TGraphAsymmErrors or TGraphErrors (one for the stat and one
9 // for the syst error). If the second one is a null pointer, only the
10 // stat error is printed. The class can also import hepdata ascii
11 // file (very preliminary)
13 // Author: Michele Floris, CERN
14 //-------------------------------------------------------------------------
17 #include "AliHEPDataParser.h"
19 #include "TGraphAsymmErrors.h"
21 #include "TGraphErrors.h"
23 #include "TObjArray.h"
24 #include "TObjString.h"
29 ClassImp(AliHEPDataParser)
31 AliHEPDataParser::AliHEPDataParser() : TObject(), fHistStat(0), fHistSyst(0), fGraphStat(0), fGraphSyst(0), fHEPDataFileLines(0), fValueName("")
37 AliHEPDataParser::AliHEPDataParser(TH1 * hStat, TH1 * hSyst): TObject(), fHistStat(0), fHistSyst(0), fGraphStat(0), fGraphSyst(0), fHEPDataFileLines(0), fValueName("y")
42 fHEPDataFileLines = new TObjArray;
45 AliHEPDataParser::AliHEPDataParser(TGraph * grStat, TGraph * grSyst): TObject(), fHistStat(0), fHistSyst(0), fGraphStat(0), fGraphSyst(0), fHEPDataFileLines(0), fValueName("")
50 fHEPDataFileLines = new TObjArray;
53 AliHEPDataParser::AliHEPDataParser(const char * hepfileName): TObject(), fHistStat(0), fHistSyst(0), fGraphStat(0), fGraphSyst(0), fHEPDataFileLines(0), fValueName("y")
56 // Put results in graphs
57 fGraphSyst = new TGraphAsymmErrors();
58 fGraphStat = new TGraphAsymmErrors();
60 infile.open(hepfileName);
63 while (line.ReadLine(infile)) {
64 TObjArray * tokens = line.Tokenize(" ");
65 if(tokens->GetEntries() < 1) {
67 AliError("not enough columns");
70 // TODO: Assumes the format
71 // binmin binmax y +-stat +-syst. Try to make it smarter...
72 TObjString * binMin = (TObjString*) tokens->At(0);
73 TObjString * binMax = (TObjString*) tokens->At(1);
74 TObjString * value = (TObjString*) tokens->At(2);
75 TObjString * stat = (TObjString*) tokens->At(3);
76 TObjString * syst = (TObjString*) tokens->At(4);
77 stat->String().ReplaceAll("+-","");
78 if(syst) syst->String().ReplaceAll("+-","");
79 if (!binMin->String().Atof()) {delete tokens; continue;} // skip headers
80 Float_t binCenter = (binMax->String().Atof() + binMin->String().Atof())/2;
81 Float_t binWidth = (binMax->String().Atof() - binMin->String().Atof())/2;
82 cout << line.Data() << endl;//<< " " << binMin->String().Atof() <<" " << binCenter << " " << binWidth << endl;
85 fGraphStat->SetPoint(ipoints, binCenter, value->String().Atof());
86 fGraphSyst->SetPoint(ipoints, binCenter, value->String().Atof());
87 ((TGraphAsymmErrors*)fGraphStat)->SetPointError(ipoints,
90 stat->String().Atof(),
91 stat->String().Atof());
92 if(syst) ((TGraphAsymmErrors*)fGraphSyst)->SetPointError(ipoints,
95 syst->String().Atof(),
96 syst->String().Atof());
105 AliHEPDataParser::~AliHEPDataParser(){
107 if(fHistStat) delete fHistStat;
108 if(fHistSyst) delete fHistSyst;
109 if(fGraphStat) delete fGraphStat;
110 if(fGraphSyst) delete fGraphSyst;
111 if(fHEPDataFileLines) delete fHEPDataFileLines;
114 void AliHEPDataParser::SaveHEPDataFile(const char * hepfileName, Bool_t trueUseGraphFalesUseHisto) {
115 // Fills fHEPDataFileLines and saves its content to a file
116 if(!fHEPDataFileLines) fHEPDataFileLines = new TObjArray;
117 if(trueUseGraphFalesUseHisto) {
119 AliError("Graph not set");
122 Bool_t asym = kFALSE; // check if this has asymmetric errors
123 if (!strcmp(fGraphStat->ClassName(), "TGraphErrors")) asym = kFALSE;
124 else if (!strcmp(fGraphStat->ClassName(), "TGraphAsymmErrors")) asym = kTRUE;
125 else {AliError("Unsupported graph type"); return;}
126 Int_t npoint = fGraphStat->GetN();
127 if(asym) AliInfo("Assymmetric errors");
128 for(Int_t ipoint = 0; ipoint < npoint; ipoint++){
132 fHEPDataFileLines->Add(new TObjString(Form("BinCenter %s +stat -stat +syst -syst", fValueName.Data())));
134 fHEPDataFileLines->Add(new TObjString(Form("BinCenter %s +-stat +-syst", fValueName.Data())));
138 fHEPDataFileLines->Add(new TObjString(Form("BinCenter %s +stat -stat", fValueName.Data())));
140 fHEPDataFileLines->Add(new TObjString(Form("BinCenter %s +-stat", fValueName.Data())));
144 if(!fGraphStat->GetY()[ipoint]) continue;
145 TObjString * line = new TObjString;
148 line->String().Form("%f %f +%f -%f +%f -%f",
149 fGraphStat->GetX()[ipoint], fGraphStat->GetY()[ipoint],
150 ((TGraphAsymmErrors*)fGraphStat)->GetEYhigh()[ipoint],
151 ((TGraphAsymmErrors*)fGraphStat)->GetEYlow()[ipoint],
152 ((TGraphAsymmErrors*)fGraphSyst)->GetEYhigh()[ipoint],
153 ((TGraphAsymmErrors*)fGraphSyst)->GetEYlow()[ipoint]);
155 line->String().Form("%f %f +-%f +-%f",
156 fGraphStat->GetX()[ipoint], fGraphStat->GetY()[ipoint],
157 ((TGraphErrors*)fGraphStat)->GetEY()[ipoint],
158 ((TGraphErrors*)fGraphSyst)->GetEY()[ipoint]);
160 fHEPDataFileLines->Add(line);
163 line->String().Form("%f %f +%f -%f",
164 fGraphStat->GetX()[ipoint], fGraphStat->GetY()[ipoint],
165 ((TGraphAsymmErrors*)fGraphStat)->GetEYhigh()[ipoint], ((TGraphAsymmErrors*)fGraphStat)->GetEYlow()[ipoint]);
167 line->String().Form("%f %f +-%f",
168 fGraphStat->GetX()[ipoint], fGraphStat->GetY()[ipoint],
169 ((TGraphErrors*)fGraphStat)->GetEY()[ipoint]);
172 fHEPDataFileLines->Add(line);
178 AliError("Hist not set");
181 Int_t nbin = fHistStat->GetNbinsX();
183 for(Int_t ibin = 1; ibin <= nbin; ibin++){
186 fHEPDataFileLines->Add(new TObjString(Form("BinLow BinHigh %s +-stat +-syst", fValueName.Data())));
188 fHEPDataFileLines->Add(new TObjString(Form("BinLow BinHigh %s +-stat", fValueName.Data())));
191 if(!fHistStat->GetBinContent(ibin)) continue;
192 TObjString * line = new TObjString;
194 line->String().Form("%f %f %f +-%f +-%f",
195 fHistStat->GetBinLowEdge(ibin),
196 fHistStat->GetBinLowEdge(ibin)+fHistStat->GetBinWidth(ibin),
197 fHistStat->GetBinContent(ibin), fHistStat->GetBinError(ibin), fHistSyst->GetBinError(ibin));
198 fHEPDataFileLines->Add(line);
200 line->String().Form("%f %f %f +-%f",
201 fHistStat->GetBinLowEdge(ibin),
202 fHistStat->GetBinLowEdge(ibin)+fHistStat->GetBinWidth(ibin),
203 fHistStat->GetBinContent(ibin), fHistStat->GetBinError(ibin));
204 fHEPDataFileLines->Add(line);
210 TIterator * lineIter = fHEPDataFileLines->MakeIterator();
211 TObjString * obj = 0;
213 outfile.open (hepfileName);
214 cout << "Saving HEP File " << hepfileName << endl;
216 while ((obj = (TObjString*) lineIter->Next())) {
217 cout << obj->String().Data() << endl;
218 outfile << obj->String().Data() << endl;