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

Annotation of /PamelaDigitizer/Pamelagp2Digits.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (hide annotations) (download)
Wed Dec 5 13:02:51 2007 UTC (17 years ago) by silvio
Branch: MAIN
CVS Tags: v2r01
Changes since 1.7: +895 -847 lines
Changes in AC, TRG, RunHeader/Trailer, Makefile

1 silvio 1.8 /////////////////////////////////////////////////////////////////////////
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     // ./ Pamelagp2Digits filename.his
13     // 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     // HOWTO (only for testing purposes)
18     // Pamelagp2Digits hbook_filename root_filename raw_filename compress tolower
19     // - If the 2nd and 3rd parameters are missing the names are generated from the hbook file name.
20     // - The following flags are from h2root and default values are used:
21     // if compress is missing (or = 1) the ROOT file will be compressed
22     // if compress = 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     // convertex to lower case
27     //
28     // MODIFICATIONS:
29     //
30     // rev. 1.8 tag 2r01 (S.Orsi, Roma2, 5 December 2007)
31     // - first tagged version
32     // - options "--version" and "--help" implemented in Makefile (file digitVersion.h added)
33     // - TRG: + number of words corrected from 153 to 152 (the trg/tof code accidentally accounted for this error in all (?) cases)
34     // + variables event_count (=Ievnt from gpamela), pattern_trigger, trigger_conf (always acq.mode TOF4) implemented (they were all 0 before!)
35     // - AC : attenuation of light as function of distance from PMT implemented for CAS (see Digitizer.cxx for further references and comments)
36     // - RunHeader and RunTrailer implemented (filled with flight-like information)
37     //
38     // rev. 1.7 (S.Orsi, Roma2, 28 November 2007)
39     // - TOF: + mapping S21 corrected (WM)
40     // + time resolution increased to 425ps (WM)
41     // + new scale factors (WM)
42     // + various corrections
43     // - file README removed (usage and install information are present in the file HOW-TO-DIGIT.TXT)
44     // - Makefile: option "install" added
45     //
46     // rev. 1.6 (S.Orsi, Roma2, 31 October 2007)
47     // - TOF: (Campana, Menn, Orsi)
48     // + bugs fixed
49     // + crc included
50     // + introduction of 3 control bits in the ADC and TDC words before writing fDataTof
51     // + channel map corrected (correspondence between PMT# and TDC channel)
52     // + new conversion pC to ADC
53     // + scaling factors to tune MC data to real ones
54     // - HOW-TO-DIGIT.TXT file updated (E.Vannuccini)
55     //
56     // v. 1.5 (S.Orsi, Roma2, 11 October 2007)
57     // - 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
58     //
59     // v. 1.4 (S.Orsi, Roma2, 11 October 2007)
60     // - similar to v. 1.3
61     //
62     // v. 1.3 (S.Orsi, Roma2, 11 October 2007)
63     // - TOF: + changes and major corrections in ADC and TDC (W.Menn, D.Campana, S.Orsi)
64     // + flag DEBUG added (default: DEBUG=false; if true, print on screem some messages to debug)
65     // - AC: + shift register filled;
66     // + minor bugs fixed
67     // + counters increment by 1 at each event (they were constant before)
68     // - S4: + minor bugs fixed (S.Borisov)
69     // + 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
70     // - 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.
71     // - 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
72     // - digitizer version numbers modified according to CVS repository (v1.00->v1.1, v1.01->v1.2)
73     // - 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)
74     //
75     // v. 1.2 (S.Orsi, Roma2, 28 September 2007)
76     // - TOF TDC inserted (to be tuned)
77     // - improved tracker dEdx, tracker saturation inserted (S.Bottai)
78     // - S4 routine inserted in code (not in read-out)
79     // - bugs with packet length corrected
80     // - small bugs fixed
81     // - 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
82     //
83     // v. 1.1 (S.Orsi, Roma2, 13 September 2007)
84     // - trigger (dummy), tof (preliminary, adc only), ND (preliminary) inserted
85     // - various changes and bug fixes
86     // - padding increased (fPADbuffer=64, fPadding = padbytes+64)
87     //
88     // v. beta (J.Conrad, KTH, 2006)
89     // - compiles; includes pscu, calo, trk, ac; not present on cvs
90     //
91     /////////////////////////////////////////////////////////////////////////
92     //
93     #include <stdlib.h>
94     #include <string.h>
95     #include <ctype.h>
96     #include "Riostream.h"
97     #include "TFile.h"
98     #include "TDirectory.h"
99     #include "TTree.h"
100     #include "TLeafI.h"
101     #include "TH1.h"
102     #include "TH2.h"
103     #include "TProfile.h"
104     #include "TGraph.h"
105     #include "TMath.h"
106     #include "Digitizer.h"
107     //
108     #include "digitVersion.h"
109     //
110     int Error; //to be removed soon
111    
112     // Define the names of the Fortran common blocks for the different OSs
113    
114     #ifndef WIN32
115     #define PAWC_SIZE 5000000
116     # define pawc pawc_
117     # define quest quest_
118     # define hcbits hcbits_
119     # define hcbook hcbook_
120     # define rzcl rzcl_
121     int pawc[PAWC_SIZE];
122     int quest[100];
123     int hcbits[37];
124     int hcbook[51];
125     int rzcl[11];
126     #else
127     // on windows /pawc/ must have the same length as in libPacklib.a !!
128     #define PAWC_SIZE 2000000
129     # define pawc PAWC
130     # define quest QUEST
131     # define hcbits HCBITS
132     # define hcbook HCBOOK
133     # define rzcl RZCL
134     extern "C" int pawc[PAWC_SIZE];
135     extern "C" int quest[100];
136     extern "C" int hcbits[37];
137     extern "C" int hcbook[51];
138     extern "C" int rzcl[11];
139     #endif
140    
141     int *iq, *lq;
142     float *q;
143     char idname[128];
144     int nentries;
145     char chtitl[128];
146     int ncx,ncy,nwt,idb;
147     int lcont, lcid, lcdir;
148     float xmin,xmax,ymin,ymax;
149     const Int_t kMIN1 = 7;
150     const Int_t kMAX1 = 8;
151    
152     #if defined __linux
153     //On linux Fortran wants this, so we give to it!
154     int xargv=0;
155     int xargc=0;
156     void MAIN__() {}
157     #endif
158    
159     // Define the names of the Fortran subroutine and functions for the different OSs
160    
161     #ifndef WIN32
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    
192     # define type_of_call
193     # define DEFCHAR const char*
194     # define PASSCHAR(string) string
195     #else
196     # define hlimit HLIMIT
197     # define hropen HROPEN
198     # define hrin HRIN
199     # define hnoent HNOENT
200     # define hgive HGIVE
201     # define hgiven HGIVEN
202     # define hprntu HPRNTU
203     # define hgnpar HGNPAR
204     # define hgnf HGNF
205     # define hgnt HGNT
206     # define rzink RZINK
207     # define hdcofl HDCOFL
208     # define hmaxim HMAXIM
209     # define hminim HMINIM
210     # define hdelet HDELET
211     # define hntvar2 HNTVAR2
212     # define hbname HBNAME
213     # define hbnamc HBNAMC
214     # define hbnam HBNAM
215     # define hi HI
216     # define hie HIE
217     # define hif HIF
218     # define hij HIJ
219     # define hix HIX
220     # define hijxy HIJXY
221     # define hije HIJE
222     # define hcdir HCDIR
223     # define zitoh ZITOH
224     # define uhtoc UHTOC
225     # define type_of_call _stdcall
226     # define DEFCHAR const char*, const int
227     # define PASSCHAR(string) string, strlen(string)
228     #endif
229    
230     extern "C" void type_of_call hlimit(const int&);
231     #ifndef WIN32
232     extern "C" void type_of_call hropen(const int&,DEFCHAR,DEFCHAR,DEFCHAR,
233     const int&,const int&,const int,const int,const int);
234     #else
235     extern "C" void type_of_call hropen(const int&,DEFCHAR,DEFCHAR,DEFCHAR,
236     const int&,const int&);
237     #endif
238    
239     extern "C" void type_of_call hrin(const int&,const int&,const int&);
240     extern "C" void type_of_call hnoent(const int&,const int&);
241     #ifndef WIN32
242     extern "C" void type_of_call hgive(const int&,DEFCHAR,const int&,const float&,const float&,
243     const int&,const float&,const float&,const int&,const int&,const int);
244     #else
245     extern "C" void type_of_call hgive(const int&,DEFCHAR,const int&,const float&,const float&,
246     const int&,const float&,const float&,const int&,const int&);
247     #endif
248    
249     #ifndef WIN32
250     extern "C" void type_of_call hgiven(const int&,DEFCHAR,const int&,DEFCHAR,
251     const float&,const float&,const int,const int);
252     #else
253     extern "C" void type_of_call hgiven(const int&,DEFCHAR,const int&,DEFCHAR,
254     const float&,const float&);
255     #endif
256    
257     #ifndef WIN32
258     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);
259     #else
260     extern "C" void type_of_call hntvar2(const int&,const int&,DEFCHAR,DEFCHAR,DEFCHAR,int&,int&,int&,int&,int&);
261     #endif
262    
263     #ifndef WIN32
264     extern "C" void type_of_call hbnam(const int&,DEFCHAR,const int&,DEFCHAR,const int&,const int, const int);
265     #else
266     extern "C" void type_of_call hbnam(const int&,DEFCHAR,const int&,DEFCHAR,const int&);
267     #endif
268    
269     extern "C" void type_of_call hprntu(const int&);
270     extern "C" void type_of_call hgnpar(const int&,const char *,const int);
271     extern "C" void type_of_call hgnf(const int&,const int&,const float&,const int&);
272     extern "C" void type_of_call hgnt(const int&,const int&,const int&);
273     extern "C" void type_of_call rzink(const int&,const int&,const char *,const int);
274     extern "C" void type_of_call hdcofl();
275     extern "C" void type_of_call hmaxim(const int&,const float&);
276     extern "C" void type_of_call hminim(const int&,const float&);
277     extern "C" void type_of_call hdelet(const int&);
278     extern "C" float type_of_call hi(const int&,const int&);
279     extern "C" float type_of_call hie(const int&,const int&);
280     extern "C" float type_of_call hif(const int&,const int&);
281     extern "C" float type_of_call hij(const int&,const int&,const int&);
282     extern "C" void type_of_call hix(const int&,const int&,const float&);
283     extern "C" void type_of_call hijxy(const int&,const int&,const int&,const float&,const float&);
284     extern "C" float type_of_call hije(const int&,const int&,const int&);
285     #ifndef WIN32
286     extern "C" void type_of_call hcdir(DEFCHAR,DEFCHAR ,const int,const int);
287     #else
288     extern "C" void type_of_call hcdir(DEFCHAR,DEFCHAR);
289     #endif
290    
291     extern "C" void type_of_call zitoh(const int&,const int&,const int&);
292     #ifndef WIN32
293     extern "C" void type_of_call uhtoc(const int&,const int&,DEFCHAR,int&,const int);
294     #else
295     extern "C" void type_of_call uhtoc(const int&,const int&,DEFCHAR,int&);
296     #endif
297    
298     extern void convert_directory(const char*, char* file_raw);
299     extern void convert_1d(Int_t id);
300     extern void convert_cwn(Int_t id,char* file_raw);
301    
302    
303     Int_t golower = 1;
304     Int_t bufsize = 64000;
305     Int_t optcwn = 1;
306    
307     // Usage subroutine
308     //
309     void DigitUsage(Int_t u){
310     if (u<0)
311     printf("----- ERROR in input parameters! -----\n");
312     printf("\nPAMELA Digitizer Usage:\n\n");
313     printf("Pamelagp2Digits file.hbook file.root file.pam [compress] [tolower] [lrecl] [bufsize] [optcwn] \n");
314     printf(" if file.root is not given it will be = file.root\n");
315     printf(" or: \nPamelagp2Digits [option] \n");
316     printf("\n Options are:\n\n");
317     printf(" --version print informations about compilation and exit\n");
318     printf(" -h | --help print this help and exit \n");
319     //printf(" -g | --debug set debug flag\n");
320     printf("\nExamples: \n");
321     printf(" Pamelagp2Digits --version\n");
322     printf(" Pamelagp2Digits simulatedProtons.his \n\n");
323    
324     printf("The options [compress] [tolower] [lrecl] [bufsize] [optcwn] should be modified only for testing purposes:\n");
325     printf("(options to be removed in future versions)\n");
326     printf(" compress = 1 by default (use 0 for no compression)\n");
327     printf(" tolower = 1 by default (use 0 to keep case of column names)\n");
328     printf(" lrecl =0 by default (must be specified if >8092)\n");
329     printf(" bufsize = 8000 by default (branch buffer size)\n");
330     printf(" for cwn ntuple only: optcwn = 1 (default) 1-byte int -> char, 2-byte int -> short, (use 0 to keep 4-byte int) \n\n");
331     };
332    
333     int main(int argc, char *argv[]){
334     //
335     // Checking input parameters
336     //
337     if ( argc > 1 ){
338     Int_t ic = 0;
339     while ( ic < argc ){
340     if ( !strcmp(argv[ic],"--version") ){
341     DigitizerInfo(true);
342     exit(0);
343     };
344     if ( !strcmp(argv[ic],"-h") || !strcmp(argv[ic],"--help") ){
345     DigitUsage(0);
346     exit(0);
347     };
348     //if ( !strcmp(argv[ic],"-g") || !strcmp(argv[ic],"--debug") ){
349     //debug = true;
350     //};
351     ic++;
352     };
353     } else{
354     //
355     // no input parameters: exit with error
356     //
357     DigitUsage(-2);
358     exit(-2);
359     };
360    
361     lq = &pawc[9];
362     iq = &pawc[17];
363     void *qq = iq;
364     q = (float*)qq;
365     char *file_in=argv[1];
366     char *file_out = " ";
367     char *file_raw;
368    
369     Int_t compress = 1;
370     int ier=0, record_size=0;
371    
372     if (argc > 8) {
373     optcwn = atoi(argv[8]);
374     }
375     if (argc > 7) {
376     bufsize = atoi(argv[7]);
377     }
378     if (argc > 6) {
379     record_size = atoi(argv[6]);
380     }
381     if (argc > 5) {
382     golower = atoi(argv[5]);
383     }
384     if (argc > 4) {
385     compress = atoi(argv[4]);
386     }
387    
388     if (argc > 3) {
389     file_raw=argv[3];
390     } else {
391     file_raw= new char[2000];
392     strcpy(file_raw,file_in);
393     char *dot = strrchr(file_raw,'.');
394     if (dot) strcpy(dot+1,"pam");
395     else strcat(file_out,".pam");
396     }
397    
398     if (argc > 2) {
399     file_out=argv[2];
400     } else {
401     file_out= new char[2000];
402     strcpy(file_out,file_in);
403     char *dot = strrchr(file_out,'.');
404     if (dot) strcpy(dot+1,"gp.root"); //modified S.Orsi 09/'07
405     else strcat(file_out,".gp.root");
406     }
407    
408    
409    
410     #if defined(_HIUX_SOURCE) && !defined(__GNUC__)
411     hf_fint((char *)NULL);
412     #endif
413    
414    
415     int pawc_size = PAWC_SIZE;
416     hlimit(pawc_size);
417    
418     int lun = 10;
419     #ifndef WIN32
420     hropen(lun,PASSCHAR("example"),PASSCHAR(file_in),PASSCHAR("p"),record_size,ier,7,strlen(file_in),1);
421     #else
422     hropen(lun,PASSCHAR("example"),PASSCHAR(file_in),PASSCHAR("p"),record_size,ier);
423     #endif
424    
425     if (ier) printf (" Error on hropen was %d \n", ier);
426     if (quest[0]) {
427     printf("Error cannot open input file: %s\n",file_in);
428     return 1;
429     }
430    
431     char root_file_title[2000];
432    
433     TFile* hfile= TFile::Open(file_out,"RECREATE",root_file_title,compress);
434    
435     if (!hfile) {
436     printf("Error: can't open output file: %s \n",file_out);
437     return 1;
438     }
439    
440     convert_directory("//example",file_raw);
441    
442     //hfile->Write();
443     //hfile->ls();
444    
445     hfile->Close();
446     delete hfile;
447     return(0);
448     }
449    
450    
451     //____________________________________________________________________________
452     void convert_directory(const char *dir, char* file_raw)
453     {
454    
455    
456     printf(" Converting directory %s\n",dir);
457     Int_t id;
458     // Int_t nastycase=0;
459     // Int_t nastyprint=0;
460     // Int_t idold = 0;
461     for (Int_t key=1;key<1000000;key++) {
462     int z0 = 0;
463     rzink(key,z0,"S",1);
464     if (quest[0]) break;
465     if (quest[13] & 8) {
466     continue;
467     // if (!nastyprint) {
468     // printf("Found nasty Hbook case!! You had an Hbook error message\n");
469     // printf(" when creating the file (too many records)\n");
470     // printf(" Hbook file should have been created with a bigger LRECL\n");
471     // printf(" ROOT will try to recover\n");
472     // nastyprint = 1;
473     // }
474     // nastycase = 1;
475     }
476     id = quest[20];
477     // if (id == idold && nastycase) continue;
478     // nastycase = 0;
479     // idold = id;
480     int i999 = 999;
481     hrin(id,i999,0);
482     if (quest[0]) {
483     printf("Error cannot read ID = %d\n",id);
484     break;
485     }
486     hdcofl();
487     lcid = hcbook[10];
488     lcont = lq[lcid-1];
489     if (hcbits[3]) {
490     convert_cwn(id,file_raw);
491     hdelet(id);
492     continue;
493     }
494    
495     if (hcbits[0]) {
496     convert_1d(id);
497     hdelet(id);
498     continue;
499     }
500    
501     }
502    
503     // converting subdirectories of this directory
504     const Int_t kKLS = 26;
505     const Int_t kKNSD = 23;
506     lcdir = rzcl[2];
507     Int_t ls = iq[lcdir+kKLS];
508     Int_t ndir = iq[lcdir+kKNSD];
509     Int_t nch=16;
510     Int_t ihdir[4];
511     Int_t ncw = 4;
512     TDirectory *cursav = gDirectory;
513     Int_t i;
514     char chdir[17];
515     char hbookdir[17];
516     for (Int_t k=0;k<ndir;k++) {
517     lcdir = rzcl[2];
518     zitoh(iq[lcdir+ls+7*k],ihdir[0],ncw);
519     for (i=0;i<17;i++) chdir[i] = 0;
520     #ifndef WIN32
521     uhtoc(ihdir[0],ncw,chdir,nch ,16);
522     #else
523     uhtoc(ihdir[0],ncw,chdir,16,nch);
524     #endif
525     strcpy(hbookdir,chdir);
526     for (i=16;i>0;i--) {
527     if (chdir[i] == 0) continue;
528     if (chdir[i] != ' ') break;
529     chdir[i] = 0;
530     }
531     #ifndef WIN32
532     hcdir(PASSCHAR(hbookdir),PASSCHAR(" "),16,1);
533     #else
534     hcdir(PASSCHAR(hbookdir),PASSCHAR(" "));
535     #endif
536     TDirectory *newdir = new TDirectory(chdir,chdir);
537     newdir->cd();
538     convert_directory(chdir, file_raw);
539     #ifndef WIN32
540     hcdir(PASSCHAR("\\"),PASSCHAR(" "),1,1);
541     #else
542     hcdir(PASSCHAR("\\"),PASSCHAR(" "));
543     #endif
544     newdir->Write();
545     cursav->cd();
546     }
547     }
548    
549     //____________________________________________________________________________
550     void convert_1d(Int_t id)
551     {
552     if (id > 0) sprintf(idname,"h%d",id);
553     else sprintf(idname,"h_%d",-id);
554     hnoent(id,nentries);
555     #ifndef WIN32
556     hgive(id,chtitl,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb,80);
557     #else
558     hgive(id,chtitl,80,ncx,xmin,xmax,ncy,ymin,ymax,nwt,idb);
559     #endif
560     chtitl[4*nwt] = 0;
561     TH1F *h1;
562     Int_t i;
563     if (hcbits[5]) {
564     Int_t lbins = lq[lcid-2];
565     Double_t *xbins = new Double_t[ncx+1];
566     for (i=0;i<=ncx;i++) xbins[i] = q[lbins+i+1];
567     h1 = new TH1F(idname,chtitl,ncx,xbins);
568     delete [] xbins;
569     } else {
570     h1 = new TH1F(idname,chtitl,ncx,xmin,xmax);
571     }
572     if (hcbits[8]) h1->Sumw2();
573     TGraph *gr = 0;
574     if (hcbits[11]) {
575     gr = new TGraph(ncx);
576     h1->GetListOfFunctions()->Add(gr);
577     }
578    
579     Float_t x;
580     for (i=0;i<=ncx+1;i++) {
581     x = h1->GetBinCenter(i);
582     h1->Fill(x,hi(id,i));
583     if (hcbits[8]) h1->SetBinError(i,hie(id,i));
584     if (gr && i>0 && i<=ncx) gr->SetPoint(i,x,hif(id,i));
585     }
586     Float_t ymin, ymax;
587     if (hcbits[19]) {
588     ymax = q[lcid+kMAX1];
589     h1->SetMaximum(ymax);
590     }
591     if (hcbits[20]) {
592     ymin = q[lcid+kMIN1];
593     h1->SetMinimum(ymin);
594     }
595     h1->SetEntries(nentries);
596     h1->Write();
597     delete h1;
598     }
599     //____________________________________________________________________________
600     void convert_cwn(Int_t id,char* file_raw)
601     {
602     const int kNchar=9;
603     int nvar;
604     int ier=0;
605     int i,j;
606     int nsub,itype,isize,ielem;
607     char *chtag_out;
608     float *x;
609     float rmin[1000], rmax[1000];
610    
611     if (id > 0) sprintf(idname,"h%d",id);
612     else sprintf(idname,"h_%d",-id);
613     hnoent(id,nentries);
614     printf(" Converting CWN with ID= %d, nentries = %d\n",id,nentries);
615     nvar=0;
616     #ifndef WIN32
617     hgiven(id,chtitl,nvar,PASSCHAR(""),rmin[0],rmax[0],80,0);
618     #else
619     hgiven(id,chtitl,80,nvar,PASSCHAR(""),rmin[0],rmax[0]);
620     #endif
621    
622    
623     chtag_out = new char[nvar*kNchar+1];
624     Int_t *charflag = new Int_t[nvar];
625     Int_t *lenchar = new Int_t[nvar];
626     Int_t *boolflag = new Int_t[nvar];
627     Int_t *lenbool = new Int_t[nvar];
628     UChar_t *boolarr = new UChar_t[10000];
629     x = new float[nvar];
630     char *bigbuf = new char[2500000];
631    
632     chtag_out[nvar*kNchar]=0;
633     for (i=0;i<80;i++)chtitl[i]=0;
634     #ifndef WIN32
635     hgiven(id,chtitl,nvar,chtag_out,rmin[0],rmax[0],80,kNchar);
636     #else
637     hgiven(id,chtitl,80,nvar,chtag_out,kNchar,rmin[0],rmax[0]);
638     #endif
639     #ifndef WIN32
640     hbnam(id,PASSCHAR(" "),bigbuf[0],PASSCHAR("$CLEAR"),0,1,6);
641     #else
642     hbnam(id,PASSCHAR(" "),bigbuf[0],PASSCHAR("$CLEAR"),0);
643     #endif
644    
645     Int_t bufpos = 0;
646     Int_t isachar = 0;
647     Int_t isabool = 0;
648     char fullname[1024];
649     char name[512];
650     char block[512];
651     char oldblock[512];
652     Int_t nbits = 0;
653     strcpy(oldblock,"OLDBLOCK");
654     Int_t oldischar = -1;
655     for (i=80;i>0;i--) {if (chtitl[i] == ' ') chtitl[i] = 0; }
656     TTree *tree = new TTree(idname,chtitl);
657     for(i=0; i<nvar;i++) {
658     memset(name,' ',sizeof(name));
659     name[sizeof(name)-1] = 0;
660     memset(block,' ',sizeof(block));
661     block[sizeof(block)-1] = 0;
662     memset(fullname,' ',sizeof(fullname));
663     fullname[sizeof(fullname)-1]=0;
664     #ifndef WIN32
665     hntvar2(id,i+1,PASSCHAR(name),PASSCHAR(fullname),PASSCHAR(block),nsub,itype,isize,nbits,ielem,512,1024,512);
666     #else
667     hntvar2(id,i+1,PASSCHAR(name),PASSCHAR(fullname),PASSCHAR(block),nsub,itype,isize,nbits,ielem);
668     #endif
669    
670     for (j=510;j>0;j--) {
671     if(golower) name[j] = tolower(name[j]);
672     if (name[j] == ' ') name[j] = 0;
673     }
674     if (golower == 2) name[0] = tolower(name[0]);
675    
676     for (j=1022;j>0;j--) {
677     if(golower && fullname[j-1] != '[') fullname[j] = tolower(fullname[j]);
678     // convert also character after [, if golower == 2
679     if (golower == 2) fullname[j] = tolower(fullname[j]);
680     if (fullname[j] == ' ') fullname[j] = 0;
681     }
682     // convert also first character, if golower == 2
683     if (golower == 2) fullname[0] = tolower(fullname[0]);
684     for (j=510;j>0;j--) {
685     if (block[j] == ' ') block[j] = 0;
686     else break;
687     }
688     if (itype == 1) {
689     if( isize == 4 ) strcat(fullname,"/F");
690     else if( isize == 8) strcat(fullname,"/D");
691     }
692    
693    
694     // add support for 1-byte (Char_t) and 2-byte (Short_t) integers
695     Int_t nBytesUsed = 4; // default for integers
696    
697     if( itype == 2 )
698     {
699     if( optcwn == 1 )
700     {
701     if( nbits > 16 )
702     {
703     strcat(fullname,"/I");
704     }
705     else
706     {
707     if( nbits > 8 )
708     {
709     strcat(fullname,"/S");
710     nBytesUsed = 2;
711     }
712     else
713     {
714     strcat(fullname,"/B");
715     nBytesUsed = 1;
716     }
717     }
718     }
719     else
720     {
721     strcat(fullname,"/I");
722     }
723     }
724    
725     // add support for 1-byte (UChar_t) and 2-byte (UShort_t) integers
726     if ( itype == 3 )
727     {
728     if( optcwn == 1 )
729     {
730     if( nbits > 16)
731     {
732     strcat(fullname,"/i");
733     }
734     else
735     {
736     if( nbits > 8 )
737     {
738     strcat(fullname,"/s");
739     nBytesUsed = 2;
740     }
741     else
742     {
743     strcat(fullname,"/b");
744     nBytesUsed = 1;
745     }
746     }
747     }
748     else
749     {
750     strcat(fullname,"/i");
751     }
752     }
753    
754    
755    
756    
757     // if (itype == 4) strcat(fullname,"/i");
758     if (itype == 4) strcat(fullname,"/b");
759     if (itype == 5) strcat(fullname,"/C");
760     //printf("Creating branch:%s, block:%s, fullname:%s, nsub=%d, itype=%d, isize=%d, ielem=%d\n",name,block,fullname,nsub,itype,isize,ielem);
761     Int_t ischar;
762     if (itype == 5) ischar = 1;
763     else ischar = 0;
764     if (ischar != oldischar || strcmp(oldblock,block) != 0) {
765     strcpy(oldblock,block);
766     oldischar = ischar;
767     Int_t lblock = strlen(block);
768     Long_t add= (Long_t)&bigbuf[bufpos];
769     #ifndef WIN32
770     hbnam(id,PASSCHAR(block),add,PASSCHAR("$SET"),ischar,lblock,4);
771     #else
772     hbnam(id,PASSCHAR(block),add,PASSCHAR("$SET"),ischar);
773     #endif
774    
775     }
776     TBranch *branch = tree->Branch(name,(void*)&bigbuf[bufpos],fullname,bufsize);
777     boolflag[i] = -10;
778     charflag[i] = 0;
779     if (itype == 4) {isabool++; boolflag[i] = bufpos; lenbool[i] = ielem;}
780     bufpos += isize*ielem;
781     if (ischar) {isachar++; charflag[i] = bufpos-1; lenchar[i] = isize*ielem;}
782     TObjArray *ll= branch->GetListOfLeaves();
783     TLeaf *leaf = (TLeaf*)ll->UncheckedAt(0);
784     if (!leaf) continue;
785     TLeafI *leafcount = (TLeafI*)leaf->GetLeafCount();
786     if (leafcount) {
787     if (leafcount->GetMaximum() <= 0) leafcount->SetMaximum(ielem);
788     }
789     }
790     Int_t cf,l;
791     for(i=1;i<=nentries;i++) {
792     hgnt(id,i,ier);
793     if (isabool) { // if column is boolean
794     for (j=0;j<nvar;j++) {
795     cf = boolflag[j];
796     if (cf >-1) {
797     for (l=0;l<lenbool[j];l++) {
798     #ifdef R__BYTESWAP
799     boolarr[l] = (UChar_t)bigbuf[cf+4*l];
800     #else
801     boolarr[l] = (UChar_t)bigbuf[cf+4*l+3];
802     #endif
803     }
804     memcpy(&bigbuf[cf],boolarr,lenbool[j]);
805     }
806     }
807     }
808     if (isachar) { // if column is character, set terminator
809     for (j=0;j<nvar;j++) {
810     cf = charflag[j];
811     if (cf) {
812     bigbuf[cf] = '\0';
813     if (bigbuf[cf-1] != ' ') continue;
814     bigbuf[cf-1] = '\0';
815     if (bigbuf[cf-2] != ' ') continue;
816     bigbuf[cf-2] = '\0';
817     }
818     }
819     }
820    
821     // if optimizing cwn ntuple then look up bufpos and adjust integers to be shorts or chars
822     if( optcwn == 1 )
823     {
824     bufpos = 0;
825     for(int k=0; k<nvar;k++)
826     {
827     #ifndef WIN32
828     hntvar2(id,k+1,PASSCHAR(name),PASSCHAR(fullname),PASSCHAR(block),nsub,itype,isize,nbits,ielem,32,64,32);
829     #else
830     hntvar2(id,k+1,PASSCHAR(name),PASSCHAR(fullname),PASSCHAR(block),nsub,itype,isize,nbits,ielem);
831     #endif
832    
833     Int_t nBytesUsed = 4; // default for integers
834    
835     if ( itype == 2 || itype == 3)
836     {
837     if( nbits > 16)
838     {
839     // do nothing for integers of 4 byte
840     }
841     else
842     {
843     if( nbits > 8 )
844     {
845     nBytesUsed = 2;
846     }
847     else
848     {
849     nBytesUsed = 1;
850     }
851     }
852     }
853    
854     if(nBytesUsed == 1)
855     {
856    
857     for(Int_t index = 0; index < ielem; index++)
858     {
859     // shift all chars with data to be one after another
860     bigbuf[bufpos + index*nBytesUsed ] = bigbuf[bufpos + index * isize];
861     }
862     }
863     else
864     {
865     if(nBytesUsed == 2)
866     {
867    
868     for(Int_t index = 0; index < ielem; index++)
869     {
870     // shift all shorts ( 2 chars) with data to be one after another
871     bigbuf[bufpos + index*nBytesUsed ] = bigbuf[bufpos + index * isize];
872     bigbuf[bufpos + index*nBytesUsed+1 ] = bigbuf[bufpos + index * isize+1];
873     }
874     }
875     }
876     bufpos += isize*ielem;
877     }
878     }
879    
880     tree->Fill();
881     }
882    
883     tree->Write();
884    
885     std::cout << "Invoking Digitizer" << endl << flush;
886    
887     Digitizer* dig = new Digitizer(tree,file_raw);
888     dig->Loop();
889     dig->Close();
890    
891     std::cout << "Finished" << endl << flush;
892    
893     }
894    
895    

  ViewVC Help
Powered by ViewVC 1.1.23