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

  ViewVC Help
Powered by ViewVC 1.1.23