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

Contents of /PamelaDigitizer/Pamelagp2Digits.cxx

Parent Directory Parent Directory | Revision Log Revision Log


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

1 /////////////////////////////////////////////////////////////////////////
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