/[PAMELA software]/PamelaDigitizer/Pamelagp2Digits.cxx
ViewVC logotype

Annotation of /PamelaDigitizer/Pamelagp2Digits.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.15 - (hide annotations) (download)
Fri Jan 17 13:08:42 2014 UTC (10 years, 10 months ago) by mocchiut
Branch: MAIN
CVS Tags: HEAD
Changes since 1.14: +7 -7 lines
Compilation warnings using GCC4.7 fixed

1 pamelats 1.9 /////////////////////////////////////////////////////////////////////////
2     // Program to convert an gpamela ntuple to pamela raw data (.pam).
3     // A root file containing the ntuple is also produced.
4     // The conversion is done using a slightly patched version of
5     // Rene Brun's h2root.
6     //
7     // Created : 2006 Jan Conrad (conrad@particle.kth.se)
8     // Modified: 2007 Silvio Orsi (silvio.orsi@roma2.infn.it)
9     //
10     //
11     // HOWTO (RECOMMENDED):
12 pizzolot 1.14 // ./ Pamelagp2Digits -hbookfile filename.his
13 pamelats 1.9 // It generates filename.pam (PAMELA raw data) and filename.gp.root (sim info)
14     //
15     // NB: more details are present in the file HOW-TO-DIGIT.TXT
16     //
17 pizzolot 1.14 // HOWTO
18     // see usage(). Example:
19     // Pamelagp2Digits -hbookfile filename.his -rootfile filename.root -pamfile filename.pam -calocompress [VAL] -rootcompress [VAL]
20     // The following flags are from h2root and default values are used:
21     // if rootcompress is missing (or = 1) the ROOT file will be compressed
22     // if rootcompress = 0 the ROOT file will not be compressed.
23     // if tolower is missing (or = 1) ntuple column names are converted to lower case
24     // but the first character is converted to upper case.
25     // if tolower = 2 same as tolower=1 except that the first character is also
26 pamelats 1.9 // convertex to lower case
27     //
28 pizzolot 1.14 //
29 pamelats 1.9 // MODIFICATIONS:
30 pizzolot 1.14 // (C.Pizzolotto. Trieste. october 2009)
31     // - added DigitizeCALOCOMPRESS to write calorimeter data in compress mode
32     // - changed way of reading input parameters. now the input order is not important.
33     //
34 pamelats 1.9 // v. 1.5 (S.Orsi, Roma2, 11 October 2007)
35     // - file HOW-TO-DIGIT.TXT written (mainly by S.Bottai): contains information on how to run the chain from the DB creation to DarthVader through Digitizer, yoda and YodaProfiler
36     //
37     // v. 1.4 (S.Orsi, Roma2, 11 October 2007)
38     // - similar to v. 1.3
39     //
40     // v. 1.3 (S.Orsi, Roma2, 11 October 2007)
41     // - TOF: + changes and major corrections in ADC and TDC (W.Menn, D.Campana, S.Orsi)
42     // + flag DEBUG added (default: DEBUG=false; if true, print on screem some messages to debug)
43     // - AC: + shift register filled;
44     // + minor bugs fixed
45     // + counters increment by 1 at each event (they were constant before)
46     // - S4: + minor bugs fixed (S.Borisov)
47     // + the routine DigitizeS4() is now inserted in the code. For DV versions earlier than October 2007, the option "-S4" is still needed because S4 calibration is not present
48     // - corrected severe bug that caused yoda to process only part of large data files (file.pam). S4 data were written to file even if the DigitizeS4() routine was not called. Previous versions of the digitizer should have crashed always, but unexpectedly worked on small files.
49     // - file HOW-TO-DIGIT.TXT written (mainly by S.Bottai): contains information on how to run the chain from the DB creation to DarthVader through Digitizer, yoda and YodaProfiler. The file is included only from release 1.5
50     // - digitizer version numbers modified according to CVS repository (v1.00->v1.1, v1.01->v1.2)
51     // - some flags (LDFLAGS) in the Makefile have been changed; they are needed on some machines (e.g. pamelatov.roma2.infn.it), but give errors on others (e.g. pamelaws02.na.infn.it). See Makefile for details if the compilation fails due to library errors)
52     //
53     // v. 1.2 (S.Orsi, Roma2, 28 September 2007)
54     // - TOF TDC inserted (to be tuned)
55     // - improved tracker dEdx, tracker saturation inserted (S.Bottai)
56     // - S4 routine inserted in code (not in read-out)
57     // - bugs with packet length corrected
58     // - small bugs fixed
59     // - NB: Run DarthVader with the options: "DarthVader -zerofill -idRun 1 -ALL +RUN +CAL [ --no-crosstalk ] +TRK +TOF +AC +TRG +ND" or "DarthVader -zerofill -idRun 1 +CAL [ --no-crosstalk ] -S4", i.e. without S4
60     //
61     // v. 1.1 (S.Orsi, Roma2, 13 September 2007)
62     // - trigger (dummy), tof (preliminary, adc only), ND (preliminary) inserted
63     // - various changes and bug fixes
64     // - padding increased (fPADbuffer=64, fPadding = padbytes+64)
65     //
66     // v. beta (J.Conrad, KTH, 2006)
67     // - compiles; includes pscu, calo, trk, ac; not present on cvs
68     //
69     /////////////////////////////////////////////////////////////////////////
70    
71     #include "Digitizer.h"
72    
73 pamelats 1.10 using namespace std;
74    
75 mocchiut 1.12 //int Error; //to be removed soon
76 pamelats 1.9
77     // Define the names of the Fortran common blocks for the different OSs
78    
79     #ifndef WIN32
80     #define PAWC_SIZE 5000000
81     # define pawc pawc_
82     # define quest quest_
83     # define hcbits hcbits_
84     # define hcbook hcbook_
85     # define rzcl rzcl_
86     int pawc[PAWC_SIZE];
87     int quest[100];
88     int hcbits[37];
89     int hcbook[51];
90     int rzcl[11];
91     #else
92     // on windows /pawc/ must have the same length as in libPacklib.a !!
93     #define PAWC_SIZE 2000000
94     # define pawc PAWC
95     # define quest QUEST
96     # define hcbits HCBITS
97     # define hcbook HCBOOK
98     # define rzcl RZCL
99     extern "C" int pawc[PAWC_SIZE];
100     extern "C" int quest[100];
101     extern "C" int hcbits[37];
102     extern "C" int hcbook[51];
103     extern "C" int rzcl[11];
104     #endif
105    
106     int *iq, *lq;
107     float *q;
108     char idname[128];
109     int nentries;
110     char chtitl[128];
111     int ncx,ncy,nwt,idb;
112     int lcont, lcid, lcdir;
113     float xmin,xmax,ymin,ymax;
114 pizzolot 1.14 int comprcalomode;
115 pamelats 1.9 const Int_t kMIN1 = 7;
116     const Int_t kMAX1 = 8;
117    
118     #if defined __linux
119     //On linux Fortran wants this, so we give to it!
120     int xargv=0;
121     int xargc=0;
122     void MAIN__() {}
123     #endif
124    
125     // Define the names of the Fortran subroutine and functions for the different OSs
126    
127     #ifndef WIN32
128     # define hlimit hlimit_
129     # define hropen hropen_
130     # define hrin hrin_
131     # define hnoent hnoent_
132     # define hgive hgive_
133     # define hgiven hgiven_
134     # define hprntu hprntu_
135     # define hgnpar hgnpar_
136     # define hgnf hgnf_
137     # define hgnt hgnt_
138     # define rzink rzink_
139     # define hdcofl hdcofl_
140     # define hmaxim hmaxim_
141     # define hminim hminim_
142     # define hdelet hdelet_
143     # define hntvar2 hntvar2_
144     # define hbname hbname_
145     # define hbnamc hbnamc_
146     # define hbnam hbnam_
147     # define hi hi_
148     # define hie hie_
149     # define hif hif_
150     # define hij hij_
151     # define hix hix_
152     # define hijxy hijxy_
153     # define hije hije_
154     # define hcdir hcdir_
155     # define zitoh zitoh_
156     # define uhtoc uhtoc_
157    
158     # define type_of_call
159     # define DEFCHAR const char*
160     # define PASSCHAR(string) string
161     #else
162     # define hlimit HLIMIT
163     # define hropen HROPEN
164     # define hrin HRIN
165     # define hnoent HNOENT
166     # define hgive HGIVE
167     # define hgiven HGIVEN
168     # define hprntu HPRNTU
169     # define hgnpar HGNPAR
170     # define hgnf HGNF
171     # define hgnt HGNT
172     # define rzink RZINK
173     # define hdcofl HDCOFL
174     # define hmaxim HMAXIM
175     # define hminim HMINIM
176     # define hdelet HDELET
177     # define hntvar2 HNTVAR2
178     # define hbname HBNAME
179     # define hbnamc HBNAMC
180     # define hbnam HBNAM
181     # define hi HI
182     # define hie HIE
183     # define hif HIF
184     # define hij HIJ
185     # define hix HIX
186     # define hijxy HIJXY
187     # define hije HIJE
188     # define hcdir HCDIR
189     # define zitoh ZITOH
190     # define uhtoc UHTOC
191     # define type_of_call _stdcall
192     # define DEFCHAR const char*, const int
193     # define PASSCHAR(string) string, strlen(string)
194     #endif
195    
196     extern "C" void type_of_call hlimit(const int&);
197     #ifndef WIN32
198     extern "C" void type_of_call hropen(const int&,DEFCHAR,DEFCHAR,DEFCHAR,
199     const int&,const int&,const int,const int,const int);
200     #else
201     extern "C" void type_of_call hropen(const int&,DEFCHAR,DEFCHAR,DEFCHAR,
202     const int&,const int&);
203     #endif
204    
205     extern "C" void type_of_call hrin(const int&,const int&,const int&);
206     extern "C" void type_of_call hnoent(const int&,const int&);
207     #ifndef WIN32
208     extern "C" void type_of_call hgive(const int&,DEFCHAR,const int&,const float&,const float&,
209     const int&,const float&,const float&,const int&,const int&,const int);
210     #else
211     extern "C" void type_of_call hgive(const int&,DEFCHAR,const int&,const float&,const float&,
212     const int&,const float&,const float&,const int&,const int&);
213     #endif
214    
215     #ifndef WIN32
216     extern "C" void type_of_call hgiven(const int&,DEFCHAR,const int&,DEFCHAR,
217     const float&,const float&,const int,const int);
218     #else
219     extern "C" void type_of_call hgiven(const int&,DEFCHAR,const int&,DEFCHAR,
220     const float&,const float&);
221     #endif
222    
223     #ifndef WIN32
224     extern "C" void type_of_call hntvar2(const int&,const int&,DEFCHAR,DEFCHAR,DEFCHAR,int&,int&,int&,int&,int&,const int,const int, const int);
225     #else
226     extern "C" void type_of_call hntvar2(const int&,const int&,DEFCHAR,DEFCHAR,DEFCHAR,int&,int&,int&,int&,int&);
227     #endif
228    
229     #ifndef WIN32
230     extern "C" void type_of_call hbnam(const int&,DEFCHAR,const int&,DEFCHAR,const int&,const int, const int);
231     #else
232     extern "C" void type_of_call hbnam(const int&,DEFCHAR,const int&,DEFCHAR,const int&);
233     #endif
234    
235     extern "C" void type_of_call hprntu(const int&);
236     extern "C" void type_of_call hgnpar(const int&,const char *,const int);
237     extern "C" void type_of_call hgnf(const int&,const int&,const float&,const int&);
238     extern "C" void type_of_call hgnt(const int&,const int&,const int&);
239     extern "C" void type_of_call rzink(const int&,const int&,const char *,const int);
240     extern "C" void type_of_call hdcofl();
241     extern "C" void type_of_call hmaxim(const int&,const float&);
242     extern "C" void type_of_call hminim(const int&,const float&);
243     extern "C" void type_of_call hdelet(const int&);
244     extern "C" float type_of_call hi(const int&,const int&);
245     extern "C" float type_of_call hie(const int&,const int&);
246     extern "C" float type_of_call hif(const int&,const int&);
247     extern "C" float type_of_call hij(const int&,const int&,const int&);
248     extern "C" void type_of_call hix(const int&,const int&,const float&);
249     extern "C" void type_of_call hijxy(const int&,const int&,const int&,const float&,const float&);
250     extern "C" float type_of_call hije(const int&,const int&,const int&);
251     #ifndef WIN32
252     extern "C" void type_of_call hcdir(DEFCHAR,DEFCHAR ,const int,const int);
253     #else
254     extern "C" void type_of_call hcdir(DEFCHAR,DEFCHAR);
255     #endif
256    
257     extern "C" void type_of_call zitoh(const int&,const int&,const int&);
258     #ifndef WIN32
259     extern "C" void type_of_call uhtoc(const int&,const int&,DEFCHAR,int&,const int);
260     #else
261     extern "C" void type_of_call uhtoc(const int&,const int&,DEFCHAR,int&);
262     #endif
263    
264     extern void convert_directory(const char*, char* file_raw);
265     extern void convert_1d(Int_t id);
266     extern void convert_cwn(Int_t id,char* file_raw);
267    
268    
269     Int_t golower = 1;
270     Int_t bufsize = 64000;
271     Int_t optcwn = 1;
272    
273 pamelats 1.10 char *DigitizerInfo(bool print);
274 pamelats 1.9
275    
276 pamelats 1.10
277 pizzolot 1.14 void usage(){
278     printf("\nUsage:\n");
279     printf("\n Pamelagp2Digits [options] -hbookfile file.hbook \n");
280     printf("\n -hbookfile path to the file that has to be converted \n");
281     printf("\n Options are:\n\n");
282     printf(" -h | --help print this help and exit \n");
283     printf(" -rootfile name of the root file in output finename.root,\n");
284     printf(" if parameter is missing the name is generated from the hbook file name\n");
285     printf(" -pamfile name of the pam file in output filename.pam \n");
286     printf(" if parameter is missing the name is generated from the hbook file name\n");
287     printf(" -calocompress compression of data in calorimeter- By default is 1.\n");
288     printf(" 0 is RAW, 1 is COMPRESS, 2 is FULL (2 not yet implemented)\n");
289     printf(" -rootcompress compression of root file = 1 by default (use 0 for no compression)\n");
290     printf(" -tolower = 1 by default : ntuple column names are converted to lower case \n");
291     printf(" but the first character is converted to upper case.\n");
292     printf(" if 2 same as tolower=1 but also the first character is converted to lower case.\n");
293     printf(" use 0 to keep case of column names\n");
294     printf(" -lrecl =0 by default (must be specified if >8092)\n");
295     printf(" -bufsize = 8000 by default (branch buffer size)\n");
296     printf(" -optcwn for cwn ntuple only: optcwn\n");
297     printf(" = 1 (default) 1-byte int -> char, 2-byte int -> short, (use 0 to keep 4-byte int) \n");
298     printf("\n The order of input files and options does not matter. \n");
299     printf("\n Example: \n");
300     printf(" Pamelagp2Digits -hbookfile /path/to/files/protons_1_300-500.rz -caloCompress 1 \n\n");
301     }
302    
303 pamelats 1.9
304 pizzolot 1.14 int main(int argc, char *argv[])
305     {
306    
307     printf("init\n");
308 pamelats 1.9 lq = &pawc[9];
309     iq = &pawc[17];
310     void *qq = iq;
311 pizzolot 1.14 q = (float*)qq;
312    
313 mocchiut 1.13 char *file_out = new char[512];
314     strcpy(file_out," ");
315 pamelats 1.9 char *file_raw;
316 pizzolot 1.14 Int_t rootcompress = 1;
317     Int_t calocompress = 1;
318     int ier=0, record_size=0;
319    
320     char *rootfile = new char[512];
321     strcpy(rootfile," ");
322     char *pamfile = new char[512];
323     strcpy(pamfile," ");
324     char *file_in;
325     file_in = NULL ;
326    
327     Int_t i = 0;
328     if ( argc > 1 ){
329     while ( i < argc ){
330     if ( !strcmp(argv[i],"-h") || !strcmp(argv[i],"--help") ){
331     usage();
332     return 0;
333     };
334     if ( !strcmp(argv[i],"-hbookfile") ) {
335     if ( argc-1 < i+1 ){
336     usage();
337     return 1;
338     };
339     file_in = argv[i+1];
340     };
341     if ( !strcmp(argv[i],"-rootfile") ) {
342     if ( argc-1 < i+1 ){
343     usage();
344     return 1;
345     };
346     rootfile = argv[i+1];
347     };
348     if ( !strcmp(argv[i],"-pamfile") ) {
349     if ( argc-1 < i+1 ){
350     usage();
351     return 1;
352     };
353     pamfile = argv[i+1];
354     };
355     if ( !strcmp(argv[i],"-calocompress") ) {
356     if ( argc-1 < i+1 ){
357     usage();
358     return 1;
359     };
360     calocompress = atoi(argv[i+1]);
361     };
362     if ( !strcmp(argv[i],"-rootcompress") ) {
363     if ( argc-1 < i+1 ){
364     usage();
365     return 1;
366     };
367     rootcompress = atoi(argv[i+1]);
368     };
369     if ( !strcmp(argv[i],"-tolower") ) {
370     if ( argc-1 < i+1 ){
371     usage();
372     return 1;
373     };
374     golower = atoi(argv[i+1]);
375     };
376     if ( !strcmp(argv[i],"-lrecl") ) {
377     if ( argc-1 < i+1 ){
378     usage();
379     return 1;
380     };
381     record_size = atoi(argv[i+1]);
382     };
383     if ( !strcmp(argv[i],"-bufsize") ) {
384     if ( argc-1 < i+1 ){
385     usage();
386     return 1;
387     };
388     bufsize = atoi(argv[i+1]);
389     };
390     if ( !strcmp(argv[i],"-optcwn") ) {
391     if ( argc-1 < i+1 ){
392     usage();
393     return 1;
394     };
395     optcwn = atoi(argv[i+1]);
396     };
397     i++;
398     };
399 pamelats 1.9 } else {
400 pizzolot 1.14 //
401     // no input parameters exit with error, we need at least the input file
402     //
403     cout << "\n ERROR: NO INPUT PARAMETERS \n";
404     usage();
405     return 1;
406     };
407    
408     if ( file_in==NULL) {
409     //
410     // file is not defined. exit with error, we need at least the input file
411     //
412     cout << "\n ERROR: NO INPUT PARAMETERS \n";
413     usage();
414     return 1;
415     }
416    
417     // define calo writing format (general variable)
418     comprcalomode = calocompress ;
419     // Define the root and pam file
420     if ( !strcmp(pamfile," ")) {
421 pamelats 1.9 file_raw= new char[2000];
422     strcpy(file_raw,file_in);
423     char *dot = strrchr(file_raw,'.');
424     if (dot) strcpy(dot+1,"pam");
425     else strcat(file_out,".pam");
426 pizzolot 1.14 } else {
427     file_raw=pamfile;
428 pamelats 1.9 }
429 pizzolot 1.14 if (!strcmp(rootfile," ")) {
430 pamelats 1.9 file_out= new char[2000];
431     strcpy(file_out,file_in);
432     char *dot = strrchr(file_out,'.');
433     if (dot) strcpy(dot+1,"gp.root"); //modified S.Orsi 09/'07
434     else strcat(file_out,".gp.root");
435 pizzolot 1.14 } else {
436     file_out=rootfile;
437 pamelats 1.9 }
438    
439    
440 pizzolot 1.14 cout<<" Check input parameters inputfile="<<file_in<<" root="<<file_out<<" pam="<<file_raw<<endl;
441     cout<<" calocompress="<<calocompress<<" rootcompress="<<rootcompress<<" golow="<<golower<<endl;
442     cout<<" bufsize="<<bufsize<<" cwn="<<optcwn<<endl;
443    
444 pamelats 1.9
445     #if defined(_HIUX_SOURCE) && !defined(__GNUC__)
446     hf_fint((char *)NULL);
447     #endif
448    
449    
450     int pawc_size = PAWC_SIZE;
451     hlimit(pawc_size);
452    
453     int lun = 10;
454     #ifndef WIN32
455     hropen(lun,PASSCHAR("example"),PASSCHAR(file_in),PASSCHAR("p"),record_size,ier,7,strlen(file_in),1);
456     #else
457     hropen(lun,PASSCHAR("example"),PASSCHAR(file_in),PASSCHAR("p"),record_size,ier);
458     #endif
459    
460     if (ier) printf (" Error on hropen was %d \n", ier);
461     if (quest[0]) {
462     printf("Error cannot open input file: %s\n",file_in);
463     return 1;
464     }
465    
466     char root_file_title[2000];
467    
468 pizzolot 1.14 TFile* hfile= TFile::Open(file_out,"RECREATE",root_file_title,rootcompress);
469 pamelats 1.9
470     if (!hfile) {
471     printf("Error: can't open output file: %s \n",file_out);
472     return 1;
473     }
474    
475     convert_directory("//example",file_raw);
476    
477     //hfile->Write();
478     //hfile->ls();
479    
480     hfile->Close();
481     delete hfile;
482     return(0);
483     }
484    
485    
486     //____________________________________________________________________________
487     void convert_directory(const char *dir, char* file_raw)
488     {
489    
490    
491     printf(" Converting directory %s\n",dir);
492     Int_t id;
493     // Int_t nastycase=0;
494     // Int_t nastyprint=0;
495     // Int_t idold = 0;
496     for (Int_t key=1;key<1000000;key++) {
497     int z0 = 0;
498     rzink(key,z0,"S",1);
499     if (quest[0]) break;
500     if (quest[13] & 8) {
501     continue;
502     // if (!nastyprint) {
503     // printf("Found nasty Hbook case!! You had an Hbook error message\n");
504     // printf(" when creating the file (too many records)\n");
505     // printf(" Hbook file should have been created with a bigger LRECL\n");
506     // printf(" ROOT will try to recover\n");
507     // nastyprint = 1;
508     // }
509     // nastycase = 1;
510     }
511     id = quest[20];
512     // if (id == idold && nastycase) continue;
513     // nastycase = 0;
514     // idold = id;
515     int i999 = 999;
516     hrin(id,i999,0);
517     if (quest[0]) {
518     printf("Error cannot read ID = %d\n",id);
519     break;
520     }
521     hdcofl();
522     lcid = hcbook[10];
523     lcont = lq[lcid-1];
524     if (hcbits[3]) {
525     convert_cwn(id,file_raw);
526     hdelet(id);
527     continue;
528     }
529    
530     if (hcbits[0]) {
531     convert_1d(id);
532     hdelet(id);
533     continue;
534     }
535    
536     }
537    
538     // converting subdirectories of this directory
539     const Int_t kKLS = 26;
540     const Int_t kKNSD = 23;
541     lcdir = rzcl[2];
542     Int_t ls = iq[lcdir+kKLS];
543     Int_t ndir = iq[lcdir+kKNSD];
544     Int_t nch=16;
545     Int_t ihdir[4];
546     Int_t ncw = 4;
547     TDirectory *cursav = gDirectory;
548     Int_t i;
549     char chdir[17];
550     char hbookdir[17];
551     for (Int_t k=0;k<ndir;k++) {
552     lcdir = rzcl[2];
553     zitoh(iq[lcdir+ls+7*k],ihdir[0],ncw);
554     for (i=0;i<17;i++) chdir[i] = 0;
555     #ifndef WIN32
556     uhtoc(ihdir[0],ncw,chdir,nch ,16);
557     #else
558     uhtoc(ihdir[0],ncw,chdir,16,nch);
559     #endif
560     strcpy(hbookdir,chdir);
561     for (i=16;i>0;i--) {
562     if (chdir[i] == 0) continue;
563     if (chdir[i] != ' ') break;
564     chdir[i] = 0;
565     }
566     #ifndef WIN32
567     hcdir(PASSCHAR(hbookdir),PASSCHAR(" "),16,1);
568     #else
569     hcdir(PASSCHAR(hbookdir),PASSCHAR(" "));
570     #endif
571     TDirectory *newdir = new TDirectory(chdir,chdir);
572     newdir->cd();
573     convert_directory(chdir, file_raw);
574     #ifndef WIN32
575     hcdir(PASSCHAR("\\"),PASSCHAR(" "),1,1);
576     #else
577     hcdir(PASSCHAR("\\"),PASSCHAR(" "));
578     #endif
579     newdir->Write();
580     cursav->cd();
581     }
582     }
583    
584     //____________________________________________________________________________
585     void convert_1d(Int_t id)
586     {
587     if (id > 0) sprintf(idname,"h%d",id);
588     else sprintf(idname,"h_%d",-id);
589     hnoent(id,nentries);
590     #ifndef WIN32
591     hgive(id,chtitl,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb,80);
592     #else
593     hgive(id,chtitl,80,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb);
594     #endif
595     chtitl[4*nwt] = 0;
596     TH1F *h1;
597     Int_t i;
598     if (hcbits[5]) {
599     Int_t lbins = lq[lcid-2];
600     Double_t *xbins = new Double_t[ncx+1];
601     for (i=0;i<=ncx;i++) xbins[i] = q[lbins+i+1];
602     h1 = new TH1F(idname,chtitl,ncx,xbins);
603     delete [] xbins;
604     } else {
605     h1 = new TH1F(idname,chtitl,ncx,xmin,xmax);
606     }
607     if (hcbits[8]) h1->Sumw2();
608     TGraph *gr = 0;
609     if (hcbits[11]) {
610     gr = new TGraph(ncx);
611     h1->GetListOfFunctions()->Add(gr);
612     }
613    
614     Float_t x;
615     for (i=0;i<=ncx+1;i++) {
616     x = h1->GetBinCenter(i);
617     h1->Fill(x,hi(id,i));
618     if (hcbits[8]) h1->SetBinError(i,hie(id,i));
619     if (gr && i>0 && i<=ncx) gr->SetPoint(i,x,hif(id,i));
620     }
621     Float_t ymin, ymax;
622     if (hcbits[19]) {
623     ymax = q[lcid+kMAX1];
624     h1->SetMaximum(ymax);
625     }
626     if (hcbits[20]) {
627     ymin = q[lcid+kMIN1];
628     h1->SetMinimum(ymin);
629     }
630     h1->SetEntries(nentries);
631     h1->Write();
632 pamelats 1.11 // delete h1;
633     h1->Delete();
634 pamelats 1.9 }
635     //____________________________________________________________________________
636     void convert_cwn(Int_t id,char* file_raw)
637     {
638     const int kNchar=9;
639     int nvar;
640     int ier=0;
641     int i,j;
642     int nsub,itype,isize,ielem;
643     char *chtag_out;
644 mocchiut 1.15 // float *x;
645 pamelats 1.9 float rmin[1000], rmax[1000];
646    
647     if (id > 0) sprintf(idname,"h%d",id);
648     else sprintf(idname,"h_%d",-id);
649     hnoent(id,nentries);
650     printf(" Converting CWN with ID= %d, nentries = %d\n",id,nentries);
651     nvar=0;
652     #ifndef WIN32
653     hgiven(id,chtitl,nvar,PASSCHAR(""),rmin[0],rmax[0],80,0);
654     #else
655     hgiven(id,chtitl,80,nvar,PASSCHAR(""),rmin[0],rmax[0]);
656     #endif
657    
658    
659     chtag_out = new char[nvar*kNchar+1];
660     Int_t *charflag = new Int_t[nvar];
661     Int_t *lenchar = new Int_t[nvar];
662     Int_t *boolflag = new Int_t[nvar];
663     Int_t *lenbool = new Int_t[nvar];
664     UChar_t *boolarr = new UChar_t[10000];
665 mocchiut 1.15 // x = new float[nvar];
666 pamelats 1.9 char *bigbuf = new char[2500000];
667    
668     chtag_out[nvar*kNchar]=0;
669     for (i=0;i<80;i++)chtitl[i]=0;
670     #ifndef WIN32
671     hgiven(id,chtitl,nvar,chtag_out,rmin[0],rmax[0],80,kNchar);
672     #else
673     hgiven(id,chtitl,80,nvar,chtag_out,kNchar,rmin[0],rmax[0]);
674     #endif
675     #ifndef WIN32
676     hbnam(id,PASSCHAR(" "),bigbuf[0],PASSCHAR("$CLEAR"),0,1,6);
677     #else
678     hbnam(id,PASSCHAR(" "),bigbuf[0],PASSCHAR("$CLEAR"),0);
679     #endif
680    
681     Int_t bufpos = 0;
682     Int_t isachar = 0;
683     Int_t isabool = 0;
684     char fullname[1024];
685     char name[512];
686     char block[512];
687     char oldblock[512];
688     Int_t nbits = 0;
689     strcpy(oldblock,"OLDBLOCK");
690     Int_t oldischar = -1;
691     for (i=80;i>0;i--) {if (chtitl[i] == ' ') chtitl[i] = 0; }
692     TTree *tree = new TTree(idname,chtitl);
693     for(i=0; i<nvar;i++) {
694     memset(name,' ',sizeof(name));
695     name[sizeof(name)-1] = 0;
696     memset(block,' ',sizeof(block));
697     block[sizeof(block)-1] = 0;
698     memset(fullname,' ',sizeof(fullname));
699     fullname[sizeof(fullname)-1]=0;
700     #ifndef WIN32
701     hntvar2(id,i+1,PASSCHAR(name),PASSCHAR(fullname),PASSCHAR(block),nsub,itype,isize,nbits,ielem,512,1024,512);
702     #else
703     hntvar2(id,i+1,PASSCHAR(name),PASSCHAR(fullname),PASSCHAR(block),nsub,itype,isize,nbits,ielem);
704     #endif
705    
706     for (j=510;j>0;j--) {
707     if(golower) name[j] = tolower(name[j]);
708     if (name[j] == ' ') name[j] = 0;
709     }
710     if (golower == 2) name[0] = tolower(name[0]);
711    
712     for (j=1022;j>0;j--) {
713     if(golower && fullname[j-1] != '[') fullname[j] = tolower(fullname[j]);
714     // convert also character after [, if golower == 2
715     if (golower == 2) fullname[j] = tolower(fullname[j]);
716     if (fullname[j] == ' ') fullname[j] = 0;
717     }
718     // convert also first character, if golower == 2
719     if (golower == 2) fullname[0] = tolower(fullname[0]);
720     for (j=510;j>0;j--) {
721     if (block[j] == ' ') block[j] = 0;
722     else break;
723     }
724     if (itype == 1) {
725     if( isize == 4 ) strcat(fullname,"/F");
726     else if( isize == 8) strcat(fullname,"/D");
727     }
728    
729    
730     // add support for 1-byte (Char_t) and 2-byte (Short_t) integers
731 mocchiut 1.15 // Int_t nBytesUsed = 4; // default for integers
732 pamelats 1.9
733     if( itype == 2 )
734     {
735     if( optcwn == 1 )
736     {
737     if( nbits > 16 )
738     {
739     strcat(fullname,"/I");
740     }
741     else
742     {
743     if( nbits > 8 )
744     {
745     strcat(fullname,"/S");
746 mocchiut 1.15 // nBytesUsed = 2;
747 pamelats 1.9 }
748     else
749     {
750     strcat(fullname,"/B");
751 mocchiut 1.15 // nBytesUsed = 1;
752 pamelats 1.9 }
753     }
754     }
755     else
756     {
757     strcat(fullname,"/I");
758     }
759     }
760    
761     // add support for 1-byte (UChar_t) and 2-byte (UShort_t) integers
762     if ( itype == 3 )
763     {
764     if( optcwn == 1 )
765     {
766     if( nbits > 16)
767     {
768     strcat(fullname,"/i");
769     }
770     else
771     {
772     if( nbits > 8 )
773     {
774     strcat(fullname,"/s");
775 mocchiut 1.15 // nBytesUsed = 2;
776 pamelats 1.9 }
777     else
778     {
779     strcat(fullname,"/b");
780 mocchiut 1.15 // nBytesUsed = 1;
781 pamelats 1.9 }
782     }
783     }
784     else
785     {
786     strcat(fullname,"/i");
787     }
788     }
789    
790    
791    
792    
793     // if (itype == 4) strcat(fullname,"/i");
794     if (itype == 4) strcat(fullname,"/b");
795     if (itype == 5) strcat(fullname,"/C");
796     //printf("Creating branch:%s, block:%s, fullname:%s, nsub=%d, itype=%d, isize=%d, ielem=%d\n",name,block,fullname,nsub,itype,isize,ielem);
797     Int_t ischar;
798     if (itype == 5) ischar = 1;
799     else ischar = 0;
800     if (ischar != oldischar || strcmp(oldblock,block) != 0) {
801     strcpy(oldblock,block);
802     oldischar = ischar;
803     Int_t lblock = strlen(block);
804     Long_t add= (Long_t)&bigbuf[bufpos];
805     #ifndef WIN32
806     hbnam(id,PASSCHAR(block),add,PASSCHAR("$SET"),ischar,lblock,4);
807     #else
808     hbnam(id,PASSCHAR(block),add,PASSCHAR("$SET"),ischar);
809     #endif
810    
811     }
812     TBranch *branch = tree->Branch(name,(void*)&bigbuf[bufpos],fullname,bufsize);
813     boolflag[i] = -10;
814     charflag[i] = 0;
815     if (itype == 4) {isabool++; boolflag[i] = bufpos; lenbool[i] = ielem;}
816     bufpos += isize*ielem;
817     if (ischar) {isachar++; charflag[i] = bufpos-1; lenchar[i] = isize*ielem;}
818     TObjArray *ll= branch->GetListOfLeaves();
819     TLeaf *leaf = (TLeaf*)ll->UncheckedAt(0);
820     if (!leaf) continue;
821     TLeafI *leafcount = (TLeafI*)leaf->GetLeafCount();
822     if (leafcount) {
823     if (leafcount->GetMaximum() <= 0) leafcount->SetMaximum(ielem);
824     }
825     }
826     Int_t cf,l;
827     for(i=1;i<=nentries;i++) {
828     hgnt(id,i,ier);
829     if (isabool) { // if column is boolean
830     for (j=0;j<nvar;j++) {
831     cf = boolflag[j];
832     if (cf >-1) {
833     for (l=0;l<lenbool[j];l++) {
834     #ifdef R__BYTESWAP
835     boolarr[l] = (UChar_t)bigbuf[cf+4*l];
836     #else
837     boolarr[l] = (UChar_t)bigbuf[cf+4*l+3];
838     #endif
839     }
840     memcpy(&bigbuf[cf],boolarr,lenbool[j]);
841     }
842     }
843     }
844     if (isachar) { // if column is character, set terminator
845     for (j=0;j<nvar;j++) {
846     cf = charflag[j];
847     if (cf) {
848     bigbuf[cf] = '\0';
849     if (bigbuf[cf-1] != ' ') continue;
850     bigbuf[cf-1] = '\0';
851     if (bigbuf[cf-2] != ' ') continue;
852     bigbuf[cf-2] = '\0';
853     }
854     }
855     }
856    
857     // if optimizing cwn ntuple then look up bufpos and adjust integers to be shorts or chars
858     if( optcwn == 1 )
859     {
860     bufpos = 0;
861     for(int k=0; k<nvar;k++)
862     {
863     #ifndef WIN32
864     hntvar2(id,k+1,PASSCHAR(name),PASSCHAR(fullname),PASSCHAR(block),nsub,itype,isize,nbits,ielem,32,64,32);
865     #else
866     hntvar2(id,k+1,PASSCHAR(name),PASSCHAR(fullname),PASSCHAR(block),nsub,itype,isize,nbits,ielem);
867     #endif
868    
869     Int_t nBytesUsed = 4; // default for integers
870    
871     if ( itype == 2 || itype == 3)
872     {
873     if( nbits > 16)
874     {
875     // do nothing for integers of 4 byte
876     }
877     else
878     {
879     if( nbits > 8 )
880     {
881     nBytesUsed = 2;
882     }
883     else
884     {
885     nBytesUsed = 1;
886     }
887     }
888     }
889    
890     if(nBytesUsed == 1)
891     {
892    
893     for(Int_t index = 0; index < ielem; index++)
894     {
895     // shift all chars with data to be one after another
896     bigbuf[bufpos + index*nBytesUsed ] = bigbuf[bufpos + index * isize];
897     }
898     }
899     else
900     {
901     if(nBytesUsed == 2)
902     {
903    
904     for(Int_t index = 0; index < ielem; index++)
905     {
906     // shift all shorts ( 2 chars) with data to be one after another
907     bigbuf[bufpos + index*nBytesUsed ] = bigbuf[bufpos + index * isize];
908     bigbuf[bufpos + index*nBytesUsed+1 ] = bigbuf[bufpos + index * isize+1];
909     }
910     }
911     }
912     bufpos += isize*ielem;
913     }
914     }
915    
916     tree->Fill();
917     }
918    
919     tree->Write();
920    
921 pamelats 1.10 cout << "Invoking Digitizer" << endl << flush;
922 pizzolot 1.14 const char *ndl[9];
923 mocchiut 1.13 char *q,*q1;
924 pamelats 1.10 q=(char*)malloc(5 *sizeof(char));
925     q1=(char*)malloc(5 *sizeof(char));
926     ndl[0]="nspe";
927     ndl[1]="ntof";
928     ndl[2]="ncat";
929     ndl[3]="ncas";
930     ndl[4]="ncar";
931     ndl[5]="ncal";
932     ndl[6]="nndd";
933     ndl[7]="nstr";
934 pizzolot 1.14 ndl[8]="comprcalomod";
935 pamelats 1.10
936 pizzolot 1.14 int nspe=200,ntof=200,ncat=50,ncas=50,ncar=100,ncal=1000,nnd=200,nstr=1000,par[9],tmp=0,t;
937 pamelats 1.10 par[0]=nspe;
938     par[1]=ntof;
939     par[2]=ncat;
940     par[3]=ncas;
941     par[4]=ncar;
942     par[5]=ncal;
943     par[6]=nnd;
944     par[7]=nstr;
945 pizzolot 1.14 par[8]=comprcalomode;
946 pamelats 1.10
947     ifstream np("vectpar.dat",ios::in);
948     if(!np)printf("ATTENTION: Using default vector legths!\n");
949 pamelats 1.11 else{
950     while(!np.eof()){
951     np>>q>>tmp;
952     if(np.eof())break;
953     if(tmp<=0){
954     cout<<"ATTENTION: Length of one vector is negative or equal 0!"<<endl<<q<<"="<<tmp<<endl;
955     break;
956     }
957     t=0;
958     while(tmp){
959 mocchiut 1.13 strcpy(q1,ndl[t]);
960 pamelats 1.11 if(q[0]==q1[0] && q[1]==q1[1] && q[2]==q1[2] && q[3]==q1[3]){
961     par[t]=tmp;
962     tmp=0;
963     cout<<q<<" "<<par[t]<<"["<<t<<"]"<<endl;
964     }
965     t++;
966 pamelats 1.10 }
967     }
968 pamelats 1.11 nspe=par[0];
969     ntof=par[1];
970     ncat=par[2];
971     ncas=par[3];
972     ncar=par[4];
973     ncal=par[5];
974     nnd=par[6];
975     nstr=par[7];
976 pizzolot 1.14 comprcalomode=par[8];
977 pamelats 1.10 }
978 pizzolot 1.14 Digitizer* dig = new Digitizer(tree,file_raw,nspe,ntof,ncat,ncas,ncar,ncal,nnd,nstr,comprcalomode);
979 pamelats 1.9 dig->Loop();
980     dig->Close();
981    
982 pamelats 1.11 cout << "Finished" << endl;
983 pamelats 1.9
984     }
985    
986    

  ViewVC Help
Powered by ViewVC 1.1.23