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