--- gp2root/gp2root.cpp 2006/10/22 08:26:36 1.2 +++ gp2root/gp2root.cpp 2006/10/22 10:25:58 1.3 @@ -234,123 +234,13 @@ extern void convert_profile(Int_t id); extern void convert_cwn(Int_t id); extern void convert_rwn(Int_t id); -extern void convert_psam(const char*); +extern void convert_psam(const char*, TTree *, pEvent *); Int_t golower = 1; Int_t bufsize = 64000; Int_t optcwn = 1; -// struct gdata{ -// int irun; -// int iev; -// int ipa; -// float x0; -// float y0; -// float z0; -// float theta; -// float phi; -// float p0; -// }; - -// union gcdata{ -// gdata data; -// char c[36]; -// }; - - -// struct general{ - -// gcdata dat; - - -// void SetIt(char * buf){ -// for(int i=0;i<36;++i) dat.c[i]=*(buf+i); -// // irun=*(int *)buf++; -// // iev =(int) *buf++; -// // ipa =(int) *buf++; -// // x0 =(float) *buf++; -// // y0 =(float) *buf++; -// // z0 =(float) *buf++; -// // theta =(float) *buf++; -// // phi =(float) *buf++; -// // p0 =(float) *buf++; - -// } - -// void Print(){ -// std::cout << dat.data.irun << ", " << -// dat.data.iev << ", " << -// dat.data.ipa << ", " << -// dat.data.x0 << ", " << -// dat.data.y0 << ", " << -// dat.data.z0 << ", " << -// dat.data.theta << ", " << -// dat.data.phi << ", " << -// dat.data.p0 << std::endl; - -// } -// }; - - -// struct cascwn { -// int nthcas; -// int iparcas[50]; -// int icas[50]; -// float x0[50]; -// float y0[50]; -// float z0[50]; -// float x1[50]; -// float y1[50]; -// float z1[50]; -// float erel[50]; -// float time[50]; -// float path[50]; -// float p0[50]; - -// }; - -// struct structcas{ - -// cascwn *cas; //= new cascwn; - -// void SetIt(char * buf){ -// cas = (cascwn *) buf; -// } - -// void Print(){ -// std::cout << cas->nthcas << ", " << -// // iparcas[0] << ", " << -// // x0[0] << ", " << -// // y0[0] << ", " << -// // z0[0] << ", " << -// // erel[0] << ", " << -// // p0[0] << -// std::endl; - -// } - -// gpcasdat GetCas(int &i){ -// gpcasdat temp; -// temp.pathcas=(double *)&cas->path[i]; -// temp.icas=&cas->icas[i]; -// temp.dat = new gpdat(); -// temp.dat->ipart=&cas->iparcas[i]; -// temp.dat->xyzin = new coord(); -// temp.dat->xyzout = new coord(); -// temp.dat->xyzin->x=(double )cas->x0[i]; -// temp.dat->xyzin->y=(double )cas->y0[i]; -// temp.dat->xyzin->z=(double )cas->z0[i]; -// temp.dat->xyzout->x=(double )cas->x1[i]; -// temp.dat->xyzout->y=(double )cas->y1[i]; -// temp.dat->xyzout->z=(double )cas->z1[i]; -// temp.dat->erel=(double *)&cas->erel[i]; -// temp.dat->time=(double *)&cas->time[i]; -// temp.dat->p=(double *)&cas->p0[i]; -// return temp; -// } -// }; - int main(int argc, char **argv) { @@ -420,16 +310,23 @@ } char root_file_title[2000]; - sprintf(root_file_title,"HBOOK file: %s converted to ROOT",file_in); - TFile* hfile= TFile::Open(file_out,"RECREATE",root_file_title,compress); - + sprintf(root_file_title,"HBOOK file: %s converted to ROOT",file_in); + TFile* hfile=new TFile(file_out,"RECREATE",root_file_title,compress); + + // Create global GPAMELA event + + pEvent *myevent=new pEvent(); + // Create ROOT tree and assign a Branch to the event + TTree* gptree=new TTree("gptree","GPAMELA tree"); + gptree->Branch("pEvent_br","pEvent",&myevent,16000,0); + if (!hfile) { printf("Error: can't open output file: %s \n",file_out); return 1; } - convert_psam("//example"); + convert_psam("//example",gptree,myevent); // convert_directory("//example"); hfile->Write(); @@ -439,7 +336,7 @@ return(0); } -void convert_psam(const char *dir){ +void convert_psam(const char *dir, TTree *gptree, pEvent* myevent){ int nsub,itype,isize,ielem,ierr; const int kNchar=9; printf(" Converting directory %s\n",dir); @@ -465,8 +362,6 @@ char *t=bigbuf; - // gpevent myevent; - pEvent myevent; std::istringstream *test; @@ -510,18 +405,9 @@ std::cout << p->name << ": "<< p->nbyte << '\n'; if(p->name!="GENERAL" && p->name!="CALI" && p->name!="TRD" && p->name!= "SPE") - myevent.AddDetector(p->name); + myevent->AddDetector(p->name); } - myevent.Print(); -// general mygen; -// structcas mycas; -// t=(char *) &mygen; -// hbnam(id,PASSCHAR(" "),(int) *t,PASSCHAR("$CLEAR"),0,1,6); -// t=(char *) &mycas; -// hbnam(id,PASSCHAR(" "),(int) *t,PASSCHAR("$CLEAR"),0,1,6); - // Long_t add= (Long_t)&bigbuf[0]; - - // Generate the buffer and pass it to the hbook routine + myevent->Print(); t=m.CreatePbuf(); hbnam(id,PASSCHAR(" "),(int) *t,PASSCHAR("$CLEAR"),0,1,6); @@ -539,36 +425,11 @@ strlen( p->name.c_str() ),4); } } - // Long_t add= (Long_t)&mygen; - // Int_t lblock = strlen("GENERAL"); - - // hbnam(id,PASSCHAR("GENERAL"),add,PASSCHAR("$SET"),ischar,lblock,4); - // add= (Long_t)&mycas; - // lblock = strlen("CAS"); - // hbnam(id,PASSCHAR("CAS"),add,PASSCHAR("$SET"),ischar,lblock,4); - - // hgntb(id,PASSCHAR("GENERAL"),0,ierr); -// hbnam(id,PASSCHAR("GENERAL"),(Long_t) m.BuffAddress(), -// PASSCHAR("$SET"),ischar,lblock,4); -// lblock = strlen("CAS"); -// hbnam(id,PASSCHAR("CAS"),(Long_t) m.BuffAddress(), -// PASSCHAR("$SET"),ischar,lblock,4); - -// hbnam(id,PASSCHAR("GENERAL"),(Long_t) m.BlockAddress("GENERAL"), -// PASSCHAR("$SET"),ischar,lblock,4); -// lblock = strlen("CAS"); -// hbnam(id,PASSCHAR("CAS"),(Long_t) m.BlockAddress("CAS"), -// PASSCHAR("$SET"),ischar,lblock,4); - -// gpcasdat ttt; -// gpcas *tc; char * junk; for(int i=0;ibegin(); @@ -583,628 +444,13 @@ int nb= (m.BlockVar(p->name.c_str())-1)*4; std::cout << " nhit : "<< nhit << endl; for (int i=0; iname.c_str(),cc); + myevent->AddHit(p->name.c_str(),cc); cc+=nb; } -// hbnam(id,PASSCHAR(p->name.c_str()), -// (Long_t) m.BlockAddress(p->name.c_str()), -// PASSCHAR("$SET"),ischar, -// strlen( p->name.c_str() ),4); } + gptree->Fill(); } -// mygen.SetIt(m.BlockAddress("GENERAL")); -// mycas.SetIt(m.BlockAddress("CAS")); -// mygen.Print(); -// mycas.Print(); - -// if(mycas.nthcas) { -// for(int j=0;jPrint(); -// // delete tc; -// } -// } - } - myevent.Print(); -} -//____________________________________________________________________________ -void convert_directory(const char *dir) -{ - - printf(" Converting directory %s\n",dir); - Int_t id; -// Int_t nastycase=0; -// Int_t nastyprint=0; -// Int_t idold = 0; - for (Int_t key=1;key<1000000;key++) { - int z0 = 0; - rzink(key,z0,"S",1); - if (quest[0]) break; - if (quest[13] & 8) { - continue; -// if (!nastyprint) { -// printf("Found nasty Hbook case!! You had an Hbook error message\n"); -// printf(" when creating the file (too many records)\n"); -// printf(" Hbook file should have been created with a bigger LRECL\n"); -// printf(" ROOT will try to recover\n"); -// nastyprint = 1; -// } -// nastycase = 1; - } - id = quest[20]; -// if (id == idold && nastycase) continue; -// nastycase = 0; -// idold = id; - int i999 = 999; - hrin(id,i999,0); - if (quest[0]) { - printf("Error cannot read ID = %d\n",id); - break; - } - hdcofl(); - lcid = hcbook[10]; - lcont = lq[lcid-1]; - if (hcbits[3]) { - if (iq[lcid-2] == 2) convert_rwn(id); - else convert_cwn(id); - hdelet(id); - continue; - } - if (hcbits[0] && hcbits[7]) { - convert_profile(id); - hdelet(id); - continue; - } - if (hcbits[0]) { - convert_1d(id); - hdelet(id); - continue; - } - if (hcbits[1] || hcbits[2]) { - convert_2d(id); - hdelet(id); - } - } - -// converting subdirectories of this directory - const Int_t kKLS = 26; - const Int_t kKNSD = 23; - lcdir = rzcl[2]; - Int_t ls = iq[lcdir+kKLS]; - Int_t ndir = iq[lcdir+kKNSD]; - Int_t nch=16; - Int_t ihdir[4]; - Int_t ncw = 4; - TDirectory *cursav = gDirectory; - Int_t i; - char chdir[17]; - char hbookdir[17]; - for (Int_t k=0;k0;i--) { - if (chdir[i] == 0) continue; - if (chdir[i] != ' ') break; - chdir[i] = 0; - } -#ifndef WIN32 - hcdir(PASSCHAR(hbookdir),PASSCHAR(" "),16,1); -#else - hcdir(PASSCHAR(hbookdir),PASSCHAR(" ")); -#endif - TDirectory *newdir = new TDirectory(chdir,chdir); - newdir->cd(); - convert_directory(chdir); -#ifndef WIN32 - hcdir(PASSCHAR("\\"),PASSCHAR(" "),1,1); -#else - hcdir(PASSCHAR("\\"),PASSCHAR(" ")); -#endif - newdir->Write(); - cursav->cd(); - } -} - -//____________________________________________________________________________ - void convert_1d(Int_t id) -{ - if (id > 0) sprintf(idname,"h%d",id); - else sprintf(idname,"h_%d",-id); - hnoent(id,nentries); -#ifndef WIN32 - hgive(id,chtitl,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb,80); -#else - hgive(id,chtitl,80,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb); -#endif - chtitl[4*nwt] = 0; - TH1F *h1; - Int_t i; - if (hcbits[5]) { - Int_t lbins = lq[lcid-2]; - Double_t *xbins = new Double_t[ncx+1]; - for (i=0;i<=ncx;i++) xbins[i] = q[lbins+i+1]; - h1 = new TH1F(idname,chtitl,ncx,xbins); - delete [] xbins; - } else { - h1 = new TH1F(idname,chtitl,ncx,xmin,xmax); - } - if (hcbits[8]) h1->Sumw2(); - TGraph *gr = 0; - if (hcbits[11]) { - gr = new TGraph(ncx); - h1->GetListOfFunctions()->Add(gr); - } - - Float_t x; - for (i=0;i<=ncx+1;i++) { - x = h1->GetBinCenter(i); - h1->Fill(x,hi(id,i)); - if (hcbits[8]) h1->SetBinError(i,hie(id,i)); - if (gr && i>0 && i<=ncx) gr->SetPoint(i,x,hif(id,i)); - } - Float_t ymin, ymax; - if (hcbits[19]) { - ymax = q[lcid+kMAX1]; - h1->SetMaximum(ymax); - } - if (hcbits[20]) { - ymin = q[lcid+kMIN1]; - h1->SetMinimum(ymin); - } - h1->SetEntries(nentries); - h1->Write(); - delete h1; -} - -//____________________________________________________________________________ - void convert_2d(Int_t id) -{ - if (id > 0) sprintf(idname,"h%d",id); - else sprintf(idname,"h_%d",-id); - hnoent(id,nentries); -#ifndef WIN32 - hgive(id,chtitl,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb,80); -#else - hgive(id,chtitl,80,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb); -#endif - chtitl[4*nwt] = 0; - TH2F *h2 = new TH2F(idname,chtitl,ncx,xmin,xmax,ncy,ymin,ymax); - Float_t offsetx = 0.5*(xmax-xmin)/ncx; - Float_t offsety = 0.5*(ymax-ymin)/ncy; - Int_t lw = lq[lcont]; - if (lw) h2->Sumw2(); - - Float_t x,y; - for (Int_t j=0;j<=ncy+1;j++) { - for (Int_t i=0;i<=ncx+1;i++) { - hijxy(id,i,j,x,y); - h2->Fill(x+offsetx,y+offsety,hij(id,i,j)); - if (lw) { - Double_t err2 = hije(id,i,j); - h2->SetCellError(i,j,err2); - } - } - } - h2->SetEntries(nentries); - h2->Write(); - delete h2; -} - -//____________________________________________________________________________ - void convert_profile(Int_t id) -{ -// the following structure is used in Hbook -// lcid points to the profile in array iq -// lcont = lq(lcid-1) -// lw = lq(lcont) -// ln = lq(lw) -// if option S jbyt(iq(lw),1,2) = 1 -// if option I jbyt(iq(lw),1,2) = 2 - - if (id > 0) sprintf(idname,"h%d",id); - else sprintf(idname,"h_%d",-id); - hnoent(id,nentries); - Int_t lw = lq[lcont]; - Int_t ln = lq[lw]; -#ifndef WIN32 - hgive(id,chtitl,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb,80); -#else - hgive(id,chtitl,80,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb); -#endif - Float_t offsetx = 0.5*(xmax-xmin)/ncx; - chtitl[4*nwt] = 0; - const char *option= " "; - if (iq[lw] == 1) option = "S"; - if (iq[lw] == 2) option = "I"; - TProfile *p = new TProfile(idname,chtitl,ncx,xmin,xmax,ymin,ymax,option); - - const Int_t kCON1 = 9; - Int_t i; - Float_t x; - Float_t y = 0.5*(ymin+ymax); - for (i=1;i<=ncx;i++) { - Int_t n = Int_t(q[ln+i]); - hix(id,i,x); - for (Int_t j=0;jFill(x+offsetx,y); - } - //p->SetBinEntries(i,n); //this one should be much faster (to be tested) - Float_t content = q[lcont+kCON1+i]; - Float_t error = TMath::Sqrt(q[lw+i]); - p->SetBinContent(i,content); - p->SetBinError(i,error); - } - p->SetEntries(nentries); - p->Write(); - delete p; -} - -//____________________________________________________________________________ - void convert_rwn(Int_t id) -{ - const int kNchar=9; - int nvar; - int ier=0; - int i,j; - char *chtag_out; - float *x; - float rmin[1000], rmax[1000]; - - if (id > 0) sprintf(idname,"h%d",id); - else sprintf(idname,"h_%d",-id); - hnoent(id,nentries); - printf(" Converting RWN with ID= %d, nentries = %d\n",id,nentries); - nvar=0; -#ifndef WIN32 - hgiven(id,chtitl,nvar,PASSCHAR(""),rmin[0],rmax[0],80,0); -#else - hgiven(id,chtitl,80,nvar,PASSCHAR(""),rmin[0],rmax[0]); -#endif - - chtag_out = new char[nvar*kNchar+1]; - x = new float[nvar]; - - chtag_out[nvar*kNchar]=0; - for (i=0;i<80;i++)chtitl[i]=0; -#ifndef WIN32 - hgiven(id,chtitl,nvar,chtag_out,rmin[0],rmax[0],80,kNchar); -#else - hgiven(id,chtitl,80,nvar,chtag_out,kNchar,rmin[0],rmax[0]); -#endif - hgnpar(id,"?",1); - char *name = chtag_out; - for (i=80;i>0;i--) {if (chtitl[i] == ' ') chtitl[i] = 0; } - TTree *tree = new TTree(idname,chtitl); - Int_t first,last; - for(i=0; i0;j--) { - if(golower) name[j] = tolower(name[j]); - if (name[j] == ' ' && last == 0) name[j] = 0; - else last = j; - } - if (golower == 2) name[0] = tolower(name[0]); - - // suppress heading blanks - for (j=0;jBranch(&name[first],&x[i],&name[first],bufsize); - name += kNchar; } - for(i=1;i<=nentries;i++) { - hgnf(id,i,x[0],ier); - tree->Fill(); - } - tree->Write(); - delete tree; - delete [] x; + myevent->Print(); } - //____________________________________________________________________________ - void convert_cwn(Int_t id) -{ - const int kNchar=9; - int nvar; - int ier=0; - int i,j; - int nsub,itype,isize,ielem; - char *chtag_out; - float *x; - float rmin[1000], rmax[1000]; - - if (id > 0) sprintf(idname,"h%d",id); - else sprintf(idname,"h_%d",-id); - hnoent(id,nentries); - printf(" Converting CWN with ID= %d, nentries = %d\n",id,nentries); - nvar=0; -#ifndef WIN32 - hgiven(id,chtitl,nvar,PASSCHAR(""),rmin[0],rmax[0],80,0); -#else - hgiven(id,chtitl,80,nvar,PASSCHAR(""),rmin[0],rmax[0]); -#endif - - - chtag_out = new char[nvar*kNchar+1]; - Int_t *charflag = new Int_t[nvar]; - Int_t *lenchar = new Int_t[nvar]; - Int_t *boolflag = new Int_t[nvar]; - Int_t *lenbool = new Int_t[nvar]; - UChar_t *boolarr = new UChar_t[10000]; - x = new float[nvar]; - char *bigbuf = new char[2500000]; - - chtag_out[nvar*kNchar]=0; - for (i=0;i<80;i++)chtitl[i]=0; -#ifndef WIN32 - hgiven(id,chtitl,nvar,chtag_out,rmin[0],rmax[0],80,kNchar); -#else - hgiven(id,chtitl,80,nvar,chtag_out,kNchar,rmin[0],rmax[0]); -#endif -#ifndef WIN32 - hbnam(id,PASSCHAR(" "),bigbuf[0],PASSCHAR("$CLEAR"),0,1,6); -#else - hbnam(id,PASSCHAR(" "),bigbuf[0],PASSCHAR("$CLEAR"),0); -#endif - - Int_t bufpos = 0; - Int_t isachar = 0; - Int_t isabool = 0; - char fullname[1024]; - char name[512]; - char block[512]; - char oldblock[512]; - Int_t nbits = 0; - strcpy(oldblock,"OLDBLOCK"); - Int_t oldischar = -1; - for (i=80;i>0;i--) {if (chtitl[i] == ' ') chtitl[i] = 0; } - TTree *tree = new TTree(idname,chtitl); - for(i=0; i0;j--) { - if(golower) name[j] = tolower(name[j]); - if (name[j] == ' ') name[j] = 0; - } - if (golower == 2) name[0] = tolower(name[0]); - - for (j=1022;j>0;j--) { - if(golower && fullname[j-1] != '[') fullname[j] = tolower(fullname[j]); - // convert also character after [, if golower == 2 - if (golower == 2) fullname[j] = tolower(fullname[j]); - if (fullname[j] == ' ') fullname[j] = 0; - } - // convert also first character, if golower == 2 - if (golower == 2) fullname[0] = tolower(fullname[0]); - for (j=510;j>0;j--) { - if (block[j] == ' ') block[j] = 0; - else break; - } - if (itype == 1) { - if( isize == 4 ) strcat(fullname,"/F"); - else if( isize == 8) strcat(fullname,"/D"); - } - - - // add support for 1-byte (Char_t) and 2-byte (Short_t) integers - Int_t nBytesUsed = 4; // default for integers - - if( itype == 2 ) - { - if( optcwn == 1 ) - { - if( nbits > 16 ) - { - strcat(fullname,"/I"); - } - else - { - if( nbits > 8 ) - { - strcat(fullname,"/S"); - nBytesUsed = 2; - } - else - { - strcat(fullname,"/B"); - nBytesUsed = 1; - } - } - } - else - { - strcat(fullname,"/I"); - } - } - - // add support for 1-byte (UChar_t) and 2-byte (UShort_t) integers - if ( itype == 3 ) - { - if( optcwn == 1 ) - { - if( nbits > 16) - { - strcat(fullname,"/i"); - } - else - { - if( nbits > 8 ) - { - strcat(fullname,"/s"); - nBytesUsed = 2; - } - else - { - strcat(fullname,"/b"); - nBytesUsed = 1; - } - } - } - else - { - strcat(fullname,"/i"); - } - } - - - - -// if (itype == 4) strcat(fullname,"/i"); - if (itype == 4) strcat(fullname,"/b"); - if (itype == 5) strcat(fullname,"/C"); -printf("Creating branch:%s, block:%s, fullname:%s, nsub=%d, itype=%d, isize=%d, ielem=%d\n",name,block,fullname,nsub,itype,isize,ielem); - Int_t ischar; - if (itype == 5) ischar = 1; - else ischar = 0; - if (ischar != oldischar || strcmp(oldblock,block) != 0) { - strcpy(oldblock,block); - oldischar = ischar; - Int_t lblock = strlen(block); - Long_t add= (Long_t)&bigbuf[bufpos]; -#ifndef WIN32 - hbnam(id,PASSCHAR(block),add,PASSCHAR("$SET"),ischar,lblock,4); -#else - hbnam(id,PASSCHAR(block),add,PASSCHAR("$SET"),ischar); -#endif - - } - TBranch *branch = tree->Branch(name,(void*)&bigbuf[bufpos],fullname,bufsize); - boolflag[i] = -10; - charflag[i] = 0; - if (itype == 4) {isabool++; boolflag[i] = bufpos; lenbool[i] = ielem;} - bufpos += isize*ielem; - if (ischar) {isachar++; charflag[i] = bufpos-1; lenchar[i] = isize*ielem;} - TObjArray *ll= branch->GetListOfLeaves(); - TLeaf *leaf = (TLeaf*)ll->UncheckedAt(0); - if (!leaf) continue; - TLeafI *leafcount = (TLeafI*)leaf->GetLeafCount(); - if (leafcount) { - if (leafcount->GetMaximum() <= 0) leafcount->SetMaximum(ielem); - } - } - Int_t cf,l; - for(i=1;i<=nentries;i++) { - hgnt(id,i,ier); - if (isabool) { // if column is boolean - for (j=0;j-1) { - for (l=0;l 16) - { - // do nothing for integers of 4 byte - } - else - { - if( nbits > 8 ) - { - nBytesUsed = 2; - } - else - { - nBytesUsed = 1; - } - } - } - - if(nBytesUsed == 1) - { - - for(Int_t index = 0; index < ielem; index++) - { - // shift all chars with data to be one after another - bigbuf[bufpos + index*nBytesUsed ] = bigbuf[bufpos + index * isize]; - } - } - else - { - if(nBytesUsed == 2) - { - - for(Int_t index = 0; index < ielem; index++) - { - // shift all shorts ( 2 chars) with data to be one after another - bigbuf[bufpos + index*nBytesUsed ] = bigbuf[bufpos + index * isize]; - bigbuf[bufpos + index*nBytesUsed+1 ] = bigbuf[bufpos + index * isize+1]; - } - } - } - bufpos += isize*ielem; - } - } - - tree->Fill(); - } - tree->Print(); - tree->Write(); - delete tree; - delete [] x; - delete [] bigbuf; - delete [] charflag; - delete [] lenchar; - delete [] boolflag; - delete [] lenbool; - delete [] boolarr; - delete [] chtag_out; -}