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