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

Diff of /PamelaDigitizer/Pamelagp2Digits.cxx

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.8

  ViewVC Help
Powered by ViewVC 1.1.23