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

  ViewVC Help
Powered by ViewVC 1.1.23