Hi Stephan,
I have written a small Root macro (topaw.C) to convert a Root file to
PAW.
In fact the macro converts the Root file into a PAW kumac.
The macro is in the attachment. See comments inside.
This macro could be extended to cover more cases, including ntuples.
I have no time to upgrade this macro for the time being.
Rene Brun
Stephan Hurling wrote:
>
> Hello everybody,
>
> I would like to use a program based on minuit, which would allow me to
> make a complex fit to my data. This fit cannot be reprogrammed in Root
> without spending a lot of time on this project. Unfortunately the
> interface of this programm works only with histograms in PAW format. So
> I'm searching for a way to convert just a single normal TH1F histogram
> into its PAW equivalent.
>
> Can anybody discribe me, what I have to do, to put my TH1F histogram into
> PAW format? (Because I think it will be faster to go this way then
> rewriting the fit program in C++).
>
> (I'm using Root from the beginning on and therefore I'm not very familiar
> with the HBOOK data format. In earlier letters of the Root Talk Digest,
> Rene said, one doesn't need to know the internals of the data formats to
> make this conversion. So it's no problem for me to develop code, if it is
> possible to make this running successfully within 2 days or so.)
>
> Thanks and all the best,
>
> Stephan
>
> +-------------------------------------------------------------------------+
> | |
> | |
> | Stephan Hurling |
> | |
> | DESY Telephone: **49 40 8998 3461 |
> | Group FH1, Build. 1b/343 FAX : **49 40 8998 4385 |
> | Notkestrasse 85 |
> | |
> | D-22607 Hamburg (Germany) e-mail :hurling@mail.desy.de |
> | |
> | |
> +-------------------------------------------------------------------------+
>
FILE *fk;
static Int_t ID=0;
char aline[100];
void topaw(const char *rootFile, const char *ckumac="")
{
// convert histograms in rootFile into a PAW macro ckumac
// only histograms are converted
// if ckumac is not specified assume rootFile.kumac
// hbookFile name is rootFile with .hbook instead of .root
// author Rene Brun
//
// Example
// Root > .x topaw.C("hsimple.root")
// will convert the Root file hsimple.root into a PAW kumac hsimple.kumac
// To create the Hbook/Paw file, run the following PAW session
// Paw > exec hsimple
TFile f(rootFile);
if (f.IsZombie()) {
printf("Error invalid Rootfile name: %s\n",rootFile);
return;
}
// build Hbook file name
char hbookFile[100];
strcpy(hbookFile,rootFile);
char *dot = strstr(hbookFile,".");
if (dot) strcpy(dot+1,"hbook");
else strcat(hbookFile,".hbook");
// build kumac file name
char kumac[100];
if (strlen(ckumac) > 0) {
strcpy(kumac,ckumac);
} else {
Int_t nch = strlen(rootFile);
strcpy(kumac,rootFile);
dot = strstr(kumac,".");
if (dot) strcpy(dot+1,"kumac");
else strcat(kumac,".kumac");
}
fk = fopen(kumac,"w");
if (!fk) {
printf("Cannot open macro file:%s\n",kumac);
return;
}
printf("Converting Root file: %s to PAW macro: %s\n",rootFile,kumac);
fprintf(fk,"****************************************************\n");
fprintf(fk,"* kumac generated by Root macro topaw.C\n");
fprintf(fk,"* converting Root file: %s\n",f.GetName());
fprintf(fk,"****************************************************\n");
fprintf(fk,"*\n");
fprintf(fk,"* Opening output Hbook file\n");
fprintf(fk,"histo/file 22 %s ! N\n",hbookFile);
// loop on all keys in the file
TIter next(f.GetListOfKeys());
TKey *key;
TH1 *h;
const char *className;
while ((key = (TKey*)next())) {
className = key->GetClassName();
TClass *cl = gROOT->GetClass(className);
if (!cl) continue;
if (!cl->InheritsFrom("TH1")) continue;
h = (TH1*)key->ReadObj();
ID++;
printf("Converting ID= %d, h=%s, title=%s\n",ID,h->GetName(),h->GetTitle());
fprintf(fk,"*\n");
fprintf(fk,"*-------------------------------------\n");
if (h->InheritsFrom("TProfile")) {
ConvertProfile((TProfile*)h);
delete h;
continue;
}
if (h->InheritsFrom("TH2")) {
Convert2D(h);
delete h;
continue;
}
Convert1D(h);
delete h;
}
fprintf(fk,"close 22\n");
fclose(fk);
}
void Convert1D(TH1 *h)
{
// Convert a Root 1-d histogram (bin contents and errors)
TAxis *xaxis = h->GetXaxis();
Int_t nbinsx = xaxis->GetNbins();
fprintf(fk,"1d %d '%s' %d %g %g\n",ID,h->GetTitle(),
nbinsx,xaxis->GetXmin(),xaxis->GetXmax());
sprintf(aline,"Vector/Create bins(%d) R ",nbinsx);
// convert bin contents
Int_t bin,k;
for (bin=1;bin<=nbinsx;bin++) {
k = strlen(aline);
sprintf(aline+k," %g",h->GetBinContent(bin));
if (k > 65) {
fprintf(fk,"%s",aline);
if (bin < nbinsx) fprintf(fk," _\n");
aline[0] = 0;
}
}
k = strlen(aline);
if (k > 0) fprintf(fk,"%s\n",aline);
fprintf(fk,"Put/Content %d bins\n",ID);
fprintf(fk,"Vector/Delete bins\n");
// convert bin errors (if any)
if (h->GetSumw2N()) {
for (bin=1;bin<=nbinsx;bin++) {
k = strlen(aline);
sprintf(aline+k," %g",h->GetBinError(bin));
if (k > 65) {
fprintf(fk,"%s",aline);
if (bin < nbinsx) fprintf(fk," _\n");
aline[0] = 0;
}
}
k = strlen(aline);
if (k > 0) fprintf(fk,"%s\n",aline);
fprintf(fk,"Put/Errors %d errors\n",ID);
fprintf(fk,"Vector/Delete errors\n");
}
fprintf(fk,"hrout %d\n",ID);
}
void Convert2D(TH1 *h)
{
// convert a Root 2-d histogram (bins only)
TAxis *xaxis = h->GetXaxis();
TAxis *yaxis = h->GetYaxis();
Int_t nbinsx = xaxis->GetNbins();
Int_t nbinsy = yaxis->GetNbins();
fprintf(fk,"2d %d '%s' %d %g %g %d %g %g\n",ID,h->GetTitle(),
nbinsx,xaxis->GetXmin(),xaxis->GetXmax(),
nbinsy,yaxis->GetXmin(),yaxis->GetXmax());
sprintf(aline,"Vector/Create bins(%d) R ",nbinsx*nbinsy);
Int_t binx,biny,k;
for (biny=1;biny<=nbinsy;biny++) {
for (binx=1;binx<=nbinsx;binx++) {
k = strlen(aline);
sprintf(aline+k," %g",h->GetCellContent(binx,biny));
if (k > 65) {
fprintf(fk,"%s",aline);
if (bin < nbinsx) fprintf(fk," _\n");
aline[0] = 0;
}
}
}
k = strlen(aline);
if (k > 0) fprintf(fk,"%s\n",aline);
fprintf(fk,"Put/Content %d bins\n",ID);
fprintf(fk,"Vector/Delete bins\n");
fprintf(fk,"hrout %d\n",ID);
}
void ConvertProfile(TProfile *h)
{
// Convert a Root Profile histogram (to be implemented)
TAxis *xaxis = h->GetXaxis();
Int_t nbinsx = xaxis->GetNbins();
fprintf(fk,"Profile %d '%s' %d %g %g ! !\n",ID,h->GetTitle(),
nbinsx,xaxis->GetXmin(),xaxis->GetXmax());
fprintf(fk,"hrout %d\n",ID);
}
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:39 MET