1 |
orsi |
1.4 |
// ------ PAMELA Digitizer ------
|
2 |
|
|
//
|
3 |
|
|
// Date, release and how-to: see file Pamelagp2Digits.cxx
|
4 |
|
|
//
|
5 |
|
|
// NB: Check length physics packet [packet type (0x10 = physics data)]
|
6 |
|
|
//
|
7 |
|
|
#include <sstream>
|
8 |
|
|
#include <fstream>
|
9 |
|
|
#include <stdlib.h>
|
10 |
|
|
#include <stdio.h>
|
11 |
|
|
#include <string.h>
|
12 |
|
|
#include <ctype.h>
|
13 |
|
|
#include <time.h>
|
14 |
|
|
#include "Riostream.h"
|
15 |
|
|
#include "TFile.h"
|
16 |
|
|
#include "TDirectory.h"
|
17 |
|
|
#include "TTree.h"
|
18 |
|
|
#include "TLeafI.h"
|
19 |
|
|
#include "TH1.h"
|
20 |
|
|
#include "TH2.h"
|
21 |
silvio |
1.6 |
#include "TF1.h"
|
22 |
orsi |
1.4 |
#include "TMath.h"
|
23 |
|
|
#include "TRandom.h"
|
24 |
|
|
#include "TSQLServer.h"
|
25 |
|
|
#include "TSystem.h"
|
26 |
|
|
//
|
27 |
|
|
#include "Digitizer.h"
|
28 |
|
|
#include "CRC.h"
|
29 |
|
|
//
|
30 |
|
|
#include <PamelaRun.h>
|
31 |
|
|
#include <physics/calorimeter/CalorimeterEvent.h>
|
32 |
|
|
#include <CalibCalPedEvent.h>
|
33 |
|
|
#include "GLTables.h"
|
34 |
|
|
//
|
35 |
|
|
extern "C"{
|
36 |
|
|
short crc(short, short);
|
37 |
|
|
};
|
38 |
|
|
//
|
39 |
|
|
|
40 |
|
|
Digitizer::Digitizer(TTree* tree, char* &file_raw){
|
41 |
|
|
fhBookTree = tree;
|
42 |
|
|
fFilename = file_raw;
|
43 |
|
|
fCounter = 0;
|
44 |
silvio |
1.6 |
fCounterPhys = 0; // SO 5/12/'07
|
45 |
orsi |
1.4 |
fOBT = 0;
|
46 |
|
|
|
47 |
|
|
//
|
48 |
|
|
// DB connections
|
49 |
|
|
//
|
50 |
|
|
TString host = "mysql://localhost/pamelaprod";
|
51 |
|
|
TString user = "anonymous";
|
52 |
|
|
TString psw = "";
|
53 |
|
|
//
|
54 |
|
|
const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
|
55 |
|
|
const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
|
56 |
|
|
const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
|
57 |
|
|
if ( !pamdbhost ) pamdbhost = "";
|
58 |
|
|
if ( !pamdbuser ) pamdbuser = "";
|
59 |
|
|
if ( !pamdbpsw ) pamdbpsw = "";
|
60 |
|
|
if ( strcmp(pamdbhost,"") ) host = pamdbhost;
|
61 |
|
|
if ( strcmp(pamdbuser,"") ) user = pamdbuser;
|
62 |
|
|
if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
|
63 |
|
|
fDbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
|
64 |
|
|
//
|
65 |
|
|
GL_TABLES *glt = new GL_TABLES(host,user,psw);
|
66 |
|
|
if ( glt->IsConnected(fDbc) ) printf("\n DB INFORMATION:\n SQL: %s Version: %s Host %s Port %i \n\n",fDbc->GetDBMS(),fDbc->ServerInfo(),fDbc->GetHost(),fDbc->GetPort());
|
67 |
|
|
//
|
68 |
|
|
// Use UTC in the DB and make timeout bigger
|
69 |
|
|
//
|
70 |
|
|
stringstream myquery;
|
71 |
|
|
myquery.str("");
|
72 |
|
|
myquery << "SET time_zone='+0:00'";
|
73 |
|
|
fDbc->Query(myquery.str().c_str());
|
74 |
|
|
myquery.str("");
|
75 |
|
|
myquery << "SET wait_timeout=173000;";
|
76 |
|
|
fDbc->Query(myquery.str().c_str());
|
77 |
|
|
//
|
78 |
|
|
|
79 |
|
|
std:: cout << "preparing tree" << endl;
|
80 |
|
|
|
81 |
|
|
// prepare tree
|
82 |
|
|
fhBookTree->SetBranchAddress("Irun",&Irun);
|
83 |
|
|
fhBookTree->SetBranchAddress("Ievnt",&Ievnt);
|
84 |
|
|
fhBookTree->SetBranchAddress("Ipa",&Ipa);
|
85 |
|
|
fhBookTree->SetBranchAddress("X0",&X0);
|
86 |
|
|
fhBookTree->SetBranchAddress("Y0",&Y0);
|
87 |
|
|
fhBookTree->SetBranchAddress("Z0",&Z0);
|
88 |
|
|
fhBookTree->SetBranchAddress("Theta",&Theta);
|
89 |
|
|
fhBookTree->SetBranchAddress("Phi",&Phi);
|
90 |
|
|
fhBookTree->SetBranchAddress("P0",&P0);
|
91 |
|
|
fhBookTree->SetBranchAddress("Nthtof",&Nthtof);
|
92 |
|
|
fhBookTree->SetBranchAddress("Ipltof",Ipltof);
|
93 |
|
|
fhBookTree->SetBranchAddress("Ipaddle",Ipaddle);
|
94 |
|
|
fhBookTree->SetBranchAddress("Ipartof",Ipartof);
|
95 |
|
|
fhBookTree->SetBranchAddress("Xintof",Xintof);
|
96 |
|
|
fhBookTree->SetBranchAddress("Yintof",Yintof);
|
97 |
|
|
fhBookTree->SetBranchAddress("Zintof",Zintof);
|
98 |
|
|
fhBookTree->SetBranchAddress("Xouttof",Xouttof);
|
99 |
|
|
fhBookTree->SetBranchAddress("Youttof",Youttof);
|
100 |
|
|
fhBookTree->SetBranchAddress("Zouttof",Zouttof);
|
101 |
|
|
fhBookTree->SetBranchAddress("Ereltof",Ereltof);
|
102 |
|
|
fhBookTree->SetBranchAddress("Timetof",Timetof);
|
103 |
|
|
fhBookTree->SetBranchAddress("Pathtof",Pathtof);
|
104 |
|
|
fhBookTree->SetBranchAddress("P0tof",P0tof);
|
105 |
|
|
fhBookTree->SetBranchAddress("Nthcat",&Nthcat);
|
106 |
|
|
fhBookTree->SetBranchAddress("Iparcat",Iparcat);
|
107 |
|
|
fhBookTree->SetBranchAddress("Icat",Icat);
|
108 |
|
|
fhBookTree->SetBranchAddress("Xincat",Xincat);
|
109 |
|
|
fhBookTree->SetBranchAddress("Yincat",Yincat);
|
110 |
|
|
fhBookTree->SetBranchAddress("Zincat",Zincat);
|
111 |
|
|
fhBookTree->SetBranchAddress("Xoutcat",Xoutcat);
|
112 |
|
|
fhBookTree->SetBranchAddress("Youtcat",Youtcat);
|
113 |
|
|
fhBookTree->SetBranchAddress("Zoutcat",Zoutcat);
|
114 |
|
|
fhBookTree->SetBranchAddress("Erelcat",Erelcat);
|
115 |
|
|
fhBookTree->SetBranchAddress("Timecat",Timecat);
|
116 |
|
|
fhBookTree->SetBranchAddress("Pathcat",Pathcat);
|
117 |
|
|
fhBookTree->SetBranchAddress("P0cat",P0cat);
|
118 |
|
|
fhBookTree->SetBranchAddress("Nthcas",&Nthcas);
|
119 |
|
|
fhBookTree->SetBranchAddress("Iparcas",Iparcas);
|
120 |
|
|
fhBookTree->SetBranchAddress("Icas",Icas);
|
121 |
|
|
fhBookTree->SetBranchAddress("Xincas",Xincas);
|
122 |
|
|
fhBookTree->SetBranchAddress("Yincas",Yincas);
|
123 |
|
|
fhBookTree->SetBranchAddress("Zincas",Zincas);
|
124 |
|
|
fhBookTree->SetBranchAddress("Xoutcas",Xoutcas);
|
125 |
|
|
fhBookTree->SetBranchAddress("Youtcas",Youtcas);
|
126 |
|
|
fhBookTree->SetBranchAddress("Zoutcas",Zoutcas);
|
127 |
|
|
fhBookTree->SetBranchAddress("Erelcas",Erelcas);
|
128 |
|
|
fhBookTree->SetBranchAddress("Timecas",Timecas);
|
129 |
|
|
fhBookTree->SetBranchAddress("Pathcas",Pathcas);
|
130 |
|
|
fhBookTree->SetBranchAddress("P0cas",P0cas);
|
131 |
|
|
fhBookTree->SetBranchAddress("Nthspe",&Nthspe);
|
132 |
|
|
fhBookTree->SetBranchAddress("Iparspe",Iparspe);
|
133 |
|
|
fhBookTree->SetBranchAddress("Itrpb",Itrpb);
|
134 |
|
|
fhBookTree->SetBranchAddress("Itrsl",Itrsl);
|
135 |
|
|
fhBookTree->SetBranchAddress("Itspa",Itspa);
|
136 |
|
|
fhBookTree->SetBranchAddress("Xinspe",Xinspe);
|
137 |
|
|
fhBookTree->SetBranchAddress("Yinspe",Yinspe);
|
138 |
|
|
fhBookTree->SetBranchAddress("Zinspe",Zinspe);
|
139 |
|
|
fhBookTree->SetBranchAddress("Xoutspe",Xoutspe);
|
140 |
|
|
fhBookTree->SetBranchAddress("Youtspe",Youtspe);
|
141 |
|
|
fhBookTree->SetBranchAddress("Zoutspe",Zoutspe);
|
142 |
|
|
fhBookTree->SetBranchAddress("Xavspe",Xavspe);
|
143 |
|
|
fhBookTree->SetBranchAddress("Yavspe",Yavspe);
|
144 |
|
|
fhBookTree->SetBranchAddress("Zavspe",Zavspe);
|
145 |
|
|
fhBookTree->SetBranchAddress("Erelspe",Erelspe);
|
146 |
|
|
fhBookTree->SetBranchAddress("Pathspe",Pathspe);
|
147 |
|
|
fhBookTree->SetBranchAddress("P0spe",P0spe);
|
148 |
|
|
fhBookTree->SetBranchAddress("Nxmult",Nxmult);
|
149 |
|
|
fhBookTree->SetBranchAddress("Nymult",Nymult);
|
150 |
|
|
fhBookTree->SetBranchAddress("Nstrpx",&Nstrpx);
|
151 |
|
|
fhBookTree->SetBranchAddress("Npstripx",Npstripx);
|
152 |
|
|
fhBookTree->SetBranchAddress("Ntstripx",Ntstripx);
|
153 |
|
|
fhBookTree->SetBranchAddress("Istripx",Istripx);
|
154 |
|
|
fhBookTree->SetBranchAddress("Qstripx",Qstripx);
|
155 |
|
|
fhBookTree->SetBranchAddress("Xstripx",Xstripx);
|
156 |
|
|
fhBookTree->SetBranchAddress("Nstrpy",&Nstrpy);
|
157 |
|
|
fhBookTree->SetBranchAddress("Npstripy",Npstripy);
|
158 |
|
|
fhBookTree->SetBranchAddress("Ntstripy",Ntstripy);
|
159 |
|
|
fhBookTree->SetBranchAddress("Istripy",Istripy);
|
160 |
|
|
fhBookTree->SetBranchAddress("Qstripy",Qstripy);
|
161 |
|
|
fhBookTree->SetBranchAddress("Ystripy",Ystripy);
|
162 |
|
|
fhBookTree->SetBranchAddress("Nthcali",&Nthcali);
|
163 |
|
|
fhBookTree->SetBranchAddress("Icaplane",Icaplane);
|
164 |
|
|
fhBookTree->SetBranchAddress("Icastrip",Icastrip);
|
165 |
|
|
fhBookTree->SetBranchAddress("Icamod",Icamod);
|
166 |
|
|
fhBookTree->SetBranchAddress("Enestrip",Enestrip);
|
167 |
|
|
fhBookTree->SetBranchAddress("Nthcal",&Nthcal);
|
168 |
|
|
fhBookTree->SetBranchAddress("Icapl",Icapl);
|
169 |
|
|
fhBookTree->SetBranchAddress("Icasi",Icasi);
|
170 |
|
|
fhBookTree->SetBranchAddress("Icast",Icast);
|
171 |
|
|
fhBookTree->SetBranchAddress("Xincal",Xincal);
|
172 |
|
|
fhBookTree->SetBranchAddress("Yincal",Yincal);
|
173 |
|
|
fhBookTree->SetBranchAddress("Zincal",Zincal);
|
174 |
|
|
fhBookTree->SetBranchAddress("Erelcal",Erelcal);
|
175 |
|
|
fhBookTree->SetBranchAddress("Nthnd",&Nthnd);
|
176 |
|
|
fhBookTree->SetBranchAddress("Itubend",Itubend);
|
177 |
|
|
fhBookTree->SetBranchAddress("Iparnd",Iparnd);
|
178 |
|
|
fhBookTree->SetBranchAddress("Xinnd",Xinnd);
|
179 |
|
|
fhBookTree->SetBranchAddress("Yinnd",Yinnd);
|
180 |
|
|
fhBookTree->SetBranchAddress("Zinnd",Zinnd);
|
181 |
|
|
fhBookTree->SetBranchAddress("Xoutnd",Xoutnd);
|
182 |
|
|
fhBookTree->SetBranchAddress("Youtnd",Youtnd);
|
183 |
|
|
fhBookTree->SetBranchAddress("Zoutnd",Zoutnd);
|
184 |
|
|
fhBookTree->SetBranchAddress("Erelnd",Erelnd);
|
185 |
|
|
fhBookTree->SetBranchAddress("Timend",Timend);
|
186 |
|
|
fhBookTree->SetBranchAddress("Pathnd",Pathnd);
|
187 |
|
|
fhBookTree->SetBranchAddress("P0nd",P0nd);
|
188 |
|
|
fhBookTree->SetBranchAddress("Nthcard",&Nthcard);
|
189 |
|
|
fhBookTree->SetBranchAddress("Iparcard",Iparcard);
|
190 |
|
|
fhBookTree->SetBranchAddress("Icard",Icard);
|
191 |
|
|
fhBookTree->SetBranchAddress("Xincard",Xincard);
|
192 |
|
|
fhBookTree->SetBranchAddress("Yincard",Yincard);
|
193 |
|
|
fhBookTree->SetBranchAddress("Zincard",Zincard);
|
194 |
|
|
fhBookTree->SetBranchAddress("Xoutcard",Xoutcard);
|
195 |
|
|
fhBookTree->SetBranchAddress("Youtcard",Youtcard);
|
196 |
|
|
fhBookTree->SetBranchAddress("Zoutcard",Zoutcard);
|
197 |
|
|
fhBookTree->SetBranchAddress("Erelcard",Erelcard);
|
198 |
|
|
fhBookTree->SetBranchAddress("Timecard",Timecard);
|
199 |
|
|
fhBookTree->SetBranchAddress("Pathcard",Pathcard);
|
200 |
|
|
fhBookTree->SetBranchAddress("P0card",P0card);
|
201 |
|
|
|
202 |
|
|
fhBookTree->SetBranchStatus("*",0);
|
203 |
|
|
|
204 |
|
|
};
|
205 |
|
|
|
206 |
|
|
|
207 |
|
|
|
208 |
|
|
void Digitizer::Close(){
|
209 |
|
|
|
210 |
|
|
delete fhBookTree;
|
211 |
|
|
|
212 |
|
|
};
|
213 |
|
|
|
214 |
|
|
|
215 |
|
|
|
216 |
|
|
|
217 |
|
|
void Digitizer::Loop() {
|
218 |
|
|
//
|
219 |
|
|
// opens the raw output file and loops over the events
|
220 |
|
|
//
|
221 |
|
|
fOutputfile.open(fFilename, ios::out | ios::binary);
|
222 |
|
|
//fOutputfile.open(Form("Output%s",fFilename), ios::out | ios::binary);
|
223 |
|
|
//
|
224 |
|
|
// Load in memory and save at the beginning of file the calorimeter calibration
|
225 |
|
|
//
|
226 |
|
|
CaloLoadCalib();
|
227 |
|
|
DigitizeCALOCALIB();
|
228 |
|
|
|
229 |
|
|
// load, digitize and write tracker calibration
|
230 |
|
|
LoadTrackCalib();
|
231 |
|
|
|
232 |
|
|
DigitizeTrackCalib(1);
|
233 |
|
|
UInt_t length=fTracklength*2;
|
234 |
silvio |
1.6 |
DigitizePSCU(length,0x12,fDataPSCU);
|
235 |
orsi |
1.4 |
AddPadding();
|
236 |
|
|
WriteTrackCalib();
|
237 |
|
|
|
238 |
|
|
DigitizeTrackCalib(2);
|
239 |
|
|
length=fTracklength*2;
|
240 |
silvio |
1.6 |
DigitizePSCU(length,0x13,fDataPSCU);
|
241 |
orsi |
1.4 |
AddPadding();
|
242 |
|
|
WriteTrackCalib();
|
243 |
silvio |
1.6 |
|
244 |
|
|
DigitizeRunHeader();
|
245 |
|
|
WriteRunHeader();
|
246 |
|
|
|
247 |
orsi |
1.4 |
LoadMipCor(); // some initialization of parameters -not used now-
|
248 |
|
|
// end loading, digitizing and writing tracker calibration
|
249 |
|
|
|
250 |
|
|
//
|
251 |
|
|
// loops over the events
|
252 |
|
|
//
|
253 |
|
|
|
254 |
|
|
Int_t nentries = fhBookTree->GetEntriesFast();
|
255 |
|
|
Long64_t nbytes = 0;
|
256 |
|
|
for (Int_t i=0; i<nentries;i++) {
|
257 |
|
|
//
|
258 |
|
|
nbytes += fhBookTree->GetEntry(i);
|
259 |
|
|
// read detectors sequentially:
|
260 |
|
|
// http://www.ts.infn.it/fileadmin/documents/physics/experiments/wizard/cpu/gen_arch/RM_Acquisition.pdf
|
261 |
silvio |
1.6 |
// on pamelatov: /cvs/yoda/techmodel/physics/NeutronDetectorReader.cpp
|
262 |
|
|
//DigitizeTRIGGER();
|
263 |
orsi |
1.4 |
DigitizeTOF();
|
264 |
|
|
DigitizeAC();
|
265 |
|
|
DigitizeCALO();
|
266 |
|
|
DigitizeTrack();
|
267 |
|
|
DigitizeS4();
|
268 |
|
|
DigitizeND();
|
269 |
silvio |
1.6 |
//
|
270 |
orsi |
1.4 |
// Add padding to 64 bits
|
271 |
|
|
//
|
272 |
|
|
AddPadding();
|
273 |
silvio |
1.6 |
//
|
274 |
orsi |
1.4 |
// Create CPU header, we need packet type (0x10 = physics data) and packet length.
|
275 |
|
|
//
|
276 |
|
|
UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer+fS4buffer)+fPadding+fTOFbuffer+fTRIGGERbuffer;
|
277 |
|
|
//UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer)+fPadding+fTOFbuffer+fTRIGGERbuffer;
|
278 |
silvio |
1.6 |
DigitizePSCU(length,0x10,fDataPSCU);
|
279 |
orsi |
1.4 |
if ( !i%100 ) std::cout << "writing event " << i << endl;
|
280 |
|
|
WriteData();
|
281 |
|
|
};
|
282 |
|
|
|
283 |
silvio |
1.6 |
DigitizeRunTrailer();
|
284 |
|
|
WriteRunTrailer();
|
285 |
|
|
|
286 |
orsi |
1.4 |
fOutputfile.close();
|
287 |
|
|
std::cout << "files closed" << endl << flush;
|
288 |
|
|
|
289 |
|
|
};
|
290 |
|
|
|
291 |
silvio |
1.6 |
void Digitizer::DigitizeRunHeader(){
|
292 |
|
|
const Int_t lenRH = fRunHeaderbuffer*2;
|
293 |
|
|
UChar_t buffRH[lenRH];
|
294 |
|
|
UShort_t buffPSCU[8];
|
295 |
|
|
UChar_t *p;
|
296 |
|
|
p=buffRH;
|
297 |
|
|
|
298 |
|
|
// header: 16 bytes
|
299 |
|
|
DigitizePSCU(fRunHeaderbuffer*2,0x20,buffPSCU);
|
300 |
|
|
memcpy(p,buffPSCU,16*sizeof(UChar_t));
|
301 |
|
|
p+=16;
|
302 |
|
|
|
303 |
|
|
// time stamp (uint32): 0x82569c97
|
304 |
|
|
*(p++) = 0x82;
|
305 |
|
|
*(p++) = 0x56;
|
306 |
|
|
*(p++) = 0x9C;
|
307 |
|
|
*(p++) = 0x97;
|
308 |
|
|
|
309 |
|
|
// acq_setting_mode (uint8)
|
310 |
|
|
*(p++) = 2;
|
311 |
|
|
|
312 |
|
|
// obt (uint32)
|
313 |
|
|
ULong64_t obt = fOBT + 30LL;
|
314 |
|
|
while ( obt > 4294967295LL )
|
315 |
|
|
obt -= 4294967295LL;
|
316 |
|
|
fOBT = (UInt_t)obt;
|
317 |
|
|
//
|
318 |
|
|
*(p++) = (UChar_t)(fOBT >> 24);
|
319 |
|
|
*(p++) = (UChar_t)(fOBT >> 16);
|
320 |
|
|
*(p++) = (UChar_t)(fOBT >> 8);
|
321 |
|
|
*(p++) = (UChar_t)fOBT;
|
322 |
|
|
|
323 |
|
|
// last time_sync_info (uint32) (from file 000_001_00110)
|
324 |
|
|
*(p++) = 0x00;
|
325 |
|
|
*(p++) = 0x08;
|
326 |
|
|
*(p++) = 0x68;
|
327 |
|
|
*(p++) = 0xEF;
|
328 |
|
|
|
329 |
|
|
// fav. working schedule (uint8)
|
330 |
|
|
*(p++) = 0;
|
331 |
|
|
|
332 |
|
|
// eff. working schedule (uint8)
|
333 |
|
|
*(p++) = 0;
|
334 |
|
|
|
335 |
|
|
// trigger_mode_A (uint32)
|
336 |
|
|
*(p++) = 0;
|
337 |
|
|
*(p++) = 0;
|
338 |
|
|
*(p++) = 0;
|
339 |
|
|
*(p++) = 0x01;
|
340 |
|
|
|
341 |
|
|
// trigger_mode_B (uint32)
|
342 |
|
|
*(p++) = 0;
|
343 |
|
|
*(p++) = 0;
|
344 |
|
|
*(p++) = 0;
|
345 |
|
|
*(p++) = 0x03;
|
346 |
|
|
|
347 |
|
|
// acq_after_calib (0,1) (uint8)
|
348 |
|
|
*(p++) = 0;
|
349 |
|
|
|
350 |
|
|
// trk_calib_used (uint32)
|
351 |
|
|
*(p++) = 0;
|
352 |
|
|
*(p++) = 0;
|
353 |
|
|
*(p++) = 0;
|
354 |
|
|
*(p++) = 0x68;
|
355 |
|
|
|
356 |
|
|
// acq_build_info (4 zero bits + 28 1's) (uint32)
|
357 |
|
|
*(p++) = 0x3F;
|
358 |
|
|
*(p++) = 0xFF;
|
359 |
|
|
*(p++) = 0xFF;
|
360 |
|
|
*(p++) = 0xFF;
|
361 |
|
|
|
362 |
|
|
// acq_var_info (11 bits) (uint16)
|
363 |
|
|
*(p++) = 0x23;
|
364 |
|
|
*(p++) = 0x7F;
|
365 |
|
|
|
366 |
|
|
// cal_dsp_mask (uint8)
|
367 |
|
|
*(p++) = 0;
|
368 |
|
|
|
369 |
|
|
// crc (uint16)
|
370 |
|
|
UShort_t crcRH = (UShort_t)CM_Compute_CRC16((UINT16)0, (BYTE*)&buffRH, (UINT32)(fRunHeaderbuffer*2-2));
|
371 |
|
|
*(p++) = (UChar_t)(crcRH << 8);
|
372 |
|
|
*p = (UChar_t)crcRH;
|
373 |
|
|
|
374 |
|
|
memcpy(fDataRunHeader,buffRH,fRunHeaderbuffer*sizeof(UShort_t));
|
375 |
|
|
};
|
376 |
|
|
|
377 |
|
|
void Digitizer::DigitizeRunTrailer(){
|
378 |
|
|
UChar_t buffRT[fRunTrailerbuffer*2];
|
379 |
|
|
UShort_t buffPSCU[8];
|
380 |
|
|
UChar_t *p;
|
381 |
|
|
p=buffRT;
|
382 |
|
|
|
383 |
|
|
// header: 16 bytes
|
384 |
|
|
DigitizePSCU(fRunHeaderbuffer*2,0x21,buffPSCU);
|
385 |
|
|
memcpy(p,buffPSCU,16*sizeof(UChar_t));
|
386 |
|
|
p+=16;
|
387 |
|
|
|
388 |
|
|
// pkt_counter (uint32)
|
389 |
|
|
fCounterPhys++;
|
390 |
|
|
fCounter++;
|
391 |
|
|
while ( fCounterPhys > 16777215 )
|
392 |
|
|
fCounterPhys -= 16777215;
|
393 |
|
|
//
|
394 |
|
|
*(p++) = (UChar_t)(fCounterPhys >> 24);
|
395 |
|
|
*(p++) = (UChar_t)(fCounterPhys >> 16);
|
396 |
|
|
*(p++) = (UChar_t)(fCounterPhys >> 8);
|
397 |
|
|
*(p++) = (UChar_t)fCounterPhys;
|
398 |
|
|
|
399 |
|
|
// pkt_readyCounter: valid packets in the run (uint32)
|
400 |
|
|
*(p++) = 0;
|
401 |
|
|
*(p++) = 0;
|
402 |
|
|
*(p++) = 0;
|
403 |
|
|
*(p++) = 0;
|
404 |
|
|
|
405 |
|
|
// obt (uint32)
|
406 |
|
|
ULong64_t obt = fOBT + 30LL;
|
407 |
|
|
while ( obt > 4294967295LL )
|
408 |
|
|
obt -= 4294967295LL;
|
409 |
|
|
fOBT = (UInt_t)obt;
|
410 |
|
|
//
|
411 |
|
|
*(p++) = (UChar_t)(fOBT >> 24);
|
412 |
|
|
*(p++) = (UChar_t)(fOBT >> 16);
|
413 |
|
|
*(p++) = (UChar_t)(fOBT >> 8);
|
414 |
|
|
*(p++) = (UChar_t)fOBT;
|
415 |
|
|
|
416 |
|
|
// last time_sync_info (uint32)
|
417 |
|
|
*(p++) = 0;
|
418 |
|
|
*(p++) = 0;
|
419 |
|
|
*(p++) = 0;
|
420 |
|
|
*(p++) = 0;
|
421 |
|
|
|
422 |
|
|
// crc (uint16)
|
423 |
|
|
UShort_t crcRT = (UShort_t)CM_Compute_CRC16((UINT16)0, (BYTE*)(buffRT), (UINT32)(fRunTrailerbuffer*2-2));
|
424 |
|
|
*(p++) = (UChar_t)(crcRT << 8);
|
425 |
|
|
*p = (UChar_t)crcRT;
|
426 |
|
|
|
427 |
|
|
memcpy(fDataRunTrailer,buffRT,fRunTrailerbuffer*sizeof(UShort_t));
|
428 |
|
|
};
|
429 |
|
|
|
430 |
orsi |
1.4 |
void Digitizer::AddPadding(){
|
431 |
|
|
//
|
432 |
|
|
Float_t pd0 = (fLen+16)/64.;
|
433 |
|
|
Float_t pd1 = pd0 - (Float_t)int(pd0);
|
434 |
|
|
Float_t padfrac = 64. - pd1 * 64.;
|
435 |
|
|
//
|
436 |
|
|
UInt_t padbytes = (UInt_t)padfrac;
|
437 |
|
|
if ( padbytes > 0 && padbytes < 64 ){
|
438 |
|
|
//
|
439 |
|
|
// here the padding length
|
440 |
|
|
//
|
441 |
|
|
fPadding = padbytes+64;
|
442 |
|
|
//
|
443 |
|
|
// random padding bytes
|
444 |
|
|
//
|
445 |
|
|
for (Int_t ur=0; ur<32; ur++){
|
446 |
|
|
fDataPadding[ur] = (UShort_t)rand();
|
447 |
|
|
};
|
448 |
|
|
};
|
449 |
|
|
};
|
450 |
|
|
|
451 |
|
|
|
452 |
silvio |
1.6 |
void Digitizer::DigitizePSCU(UInt_t length, UChar_t type, UShort_t *pPSCU) {
|
453 |
orsi |
1.4 |
//
|
454 |
|
|
UChar_t buff[16];
|
455 |
|
|
//
|
456 |
|
|
// CPU signature
|
457 |
|
|
//
|
458 |
|
|
buff[0] = 0xFA;
|
459 |
|
|
buff[1] = 0xFE;
|
460 |
|
|
buff[2] = 0xDE;
|
461 |
|
|
//
|
462 |
|
|
// packet type (twice)
|
463 |
|
|
//
|
464 |
|
|
buff[3] = type;
|
465 |
|
|
buff[4] = type;
|
466 |
|
|
//
|
467 |
|
|
// counter
|
468 |
|
|
//
|
469 |
|
|
fCounter++;
|
470 |
|
|
while ( fCounter > 16777215 ){
|
471 |
|
|
fCounter -= 16777215;
|
472 |
|
|
};
|
473 |
|
|
//
|
474 |
|
|
buff[5] = (UChar_t)(fCounter >> 16);
|
475 |
|
|
buff[6] = (UChar_t)(fCounter >> 8);
|
476 |
|
|
buff[7] = (UChar_t)fCounter;
|
477 |
|
|
//
|
478 |
|
|
// on board time
|
479 |
|
|
//
|
480 |
|
|
ULong64_t obt = fOBT + 30LL;
|
481 |
|
|
//
|
482 |
|
|
while ( obt > 4294967295LL ){
|
483 |
|
|
obt -= 4294967295LL;
|
484 |
|
|
};
|
485 |
|
|
fOBT = (UInt_t)obt;
|
486 |
|
|
//
|
487 |
|
|
buff[8] = (UChar_t)(fOBT >> 24);
|
488 |
|
|
buff[9] = (UChar_t)(fOBT >> 16);
|
489 |
|
|
buff[10] = (UChar_t)(fOBT >> 8);
|
490 |
|
|
buff[11] = (UChar_t)fOBT;
|
491 |
|
|
//
|
492 |
|
|
// Packet length
|
493 |
|
|
//
|
494 |
|
|
fLen = length;
|
495 |
|
|
//
|
496 |
|
|
buff[12] = (UChar_t)(fLen >> 16);
|
497 |
|
|
buff[13] = (UChar_t)(fLen >> 8);
|
498 |
|
|
buff[14] = (UChar_t)fLen;
|
499 |
|
|
//
|
500 |
|
|
// CPU header CRC
|
501 |
|
|
//
|
502 |
|
|
buff[15] = (BYTE)CM_Compute_CRC16((UINT16)0, (BYTE*)&buff, (UINT32)15);
|
503 |
|
|
//
|
504 |
silvio |
1.6 |
//memcpy(fDataPSCU,buff,16*sizeof(UChar_t));
|
505 |
|
|
memcpy(pPSCU,buff,16*sizeof(UChar_t));
|
506 |
orsi |
1.4 |
//
|
507 |
|
|
};
|
508 |
|
|
|
509 |
|
|
void Digitizer::ClearCaloCalib(Int_t s){
|
510 |
|
|
//
|
511 |
|
|
fcstwerr[s] = 0;
|
512 |
|
|
fcperror[s] = 0.;
|
513 |
|
|
for ( Int_t d=0 ; d<11 ;d++ ){
|
514 |
|
|
Int_t pre = -1;
|
515 |
|
|
for ( Int_t j=0; j<96 ;j++){
|
516 |
|
|
if ( j%16 == 0 ) pre++;
|
517 |
|
|
fcalped[s][d][j] = 0.;
|
518 |
|
|
fcstwerr[s] = 0.;
|
519 |
|
|
fcperror[s] = 0.;
|
520 |
|
|
fcalgood[s][d][j] = 0.;
|
521 |
|
|
fcalthr[s][d][pre] = 0.;
|
522 |
|
|
fcalrms[s][d][j] = 0.;
|
523 |
|
|
fcalbase[s][d][pre] = 0.;
|
524 |
|
|
fcalvar[s][d][pre] = 0.;
|
525 |
|
|
};
|
526 |
|
|
};
|
527 |
|
|
return;
|
528 |
|
|
}
|
529 |
|
|
|
530 |
|
|
Int_t Digitizer::CaloLoadCalib(Int_t s,TString fcalname, UInt_t calibno){
|
531 |
|
|
//
|
532 |
|
|
//
|
533 |
|
|
UInt_t e = 0;
|
534 |
|
|
if ( s == 0 ) e = 0;
|
535 |
|
|
if ( s == 1 ) e = 2;
|
536 |
|
|
if ( s == 2 ) e = 3;
|
537 |
|
|
if ( s == 3 ) e = 1;
|
538 |
|
|
//
|
539 |
|
|
ifstream myfile;
|
540 |
|
|
myfile.open(fcalname.Data());
|
541 |
|
|
if ( !myfile ){
|
542 |
|
|
return(-107);
|
543 |
|
|
};
|
544 |
|
|
myfile.close();
|
545 |
|
|
//
|
546 |
|
|
TFile *File = new TFile(fcalname.Data());
|
547 |
|
|
if ( !File ) return(-108);
|
548 |
|
|
TTree *tr = (TTree*)File->Get("CalibCalPed");
|
549 |
|
|
if ( !tr ) return(-109);
|
550 |
|
|
//
|
551 |
|
|
TBranch *calo = tr->GetBranch("CalibCalPed");
|
552 |
|
|
//
|
553 |
|
|
pamela::CalibCalPedEvent *ce = 0;
|
554 |
|
|
tr->SetBranchAddress("CalibCalPed", &ce);
|
555 |
|
|
//
|
556 |
|
|
Long64_t ncalibs = calo->GetEntries();
|
557 |
|
|
//
|
558 |
|
|
if ( !ncalibs ) return(-110);
|
559 |
|
|
//
|
560 |
|
|
calo->GetEntry(calibno);
|
561 |
|
|
//
|
562 |
|
|
if (ce->cstwerr[s] != 0 && ce->cperror[s] == 0 ) {
|
563 |
|
|
fcstwerr[s] = ce->cstwerr[s];
|
564 |
|
|
fcperror[s] = ce->cperror[s];
|
565 |
|
|
for ( Int_t d=0 ; d<11 ;d++ ){
|
566 |
|
|
Int_t pre = -1;
|
567 |
|
|
for ( Int_t j=0; j<96 ;j++){
|
568 |
|
|
if ( j%16 == 0 ) pre++;
|
569 |
|
|
fcalped[s][d][j] = ce->calped[e][d][j];
|
570 |
|
|
fcalgood[s][d][j] = ce->calgood[e][d][j];
|
571 |
|
|
fcalthr[s][d][pre] = ce->calthr[e][d][pre];
|
572 |
|
|
fcalrms[s][d][j] = ce->calrms[e][d][j];
|
573 |
|
|
fcalbase[s][d][pre] = ce->calbase[e][d][pre];
|
574 |
|
|
fcalvar[s][d][pre] = ce->calvar[e][d][pre];
|
575 |
|
|
};
|
576 |
|
|
};
|
577 |
|
|
} else {
|
578 |
|
|
printf(" CALORIMETER - ERROR: problems finding a good calibration in this file! \n\n ");
|
579 |
|
|
File->Close();
|
580 |
|
|
return(-111);
|
581 |
|
|
};
|
582 |
|
|
File->Close();
|
583 |
|
|
return(0);
|
584 |
|
|
}
|
585 |
|
|
|
586 |
|
|
|
587 |
|
|
void Digitizer::DigitizeCALOCALIB() {
|
588 |
|
|
//
|
589 |
|
|
// Header of the four sections
|
590 |
|
|
//
|
591 |
|
|
fSecCalo[0] = 0xAA00; // XE
|
592 |
|
|
fSecCalo[1] = 0xB100; // XO
|
593 |
|
|
fSecCalo[2] = 0xB600; // YE
|
594 |
|
|
fSecCalo[3] = 0xAD00; // YO
|
595 |
|
|
//
|
596 |
|
|
// length of the data is 0x1215
|
597 |
|
|
//
|
598 |
|
|
fSecCALOLength[0] = 0x1215; // XE
|
599 |
|
|
fSecCALOLength[1] = 0x1215; // XO
|
600 |
|
|
fSecCALOLength[2] = 0x1215; // YE
|
601 |
|
|
fSecCALOLength[3] = 0x1215; // YO
|
602 |
|
|
//
|
603 |
|
|
Int_t chksum = 0;
|
604 |
|
|
UInt_t tstrip = 0;
|
605 |
|
|
UInt_t fSecPointer = 0;
|
606 |
|
|
//
|
607 |
|
|
for (Int_t sec=0; sec < 4; sec++){
|
608 |
|
|
//
|
609 |
|
|
// sec = 0 -> XE 1 -> XO 2-> YE 3 -> YO
|
610 |
|
|
//
|
611 |
|
|
fCALOlength = 0;
|
612 |
|
|
memset(fDataCALO,0,sizeof(UShort_t)*fCALObuffer);
|
613 |
|
|
fSecPointer = fCALOlength;
|
614 |
|
|
//
|
615 |
|
|
// First of all we have section header and packet length
|
616 |
|
|
//
|
617 |
|
|
fDataCALO[fCALOlength] = fSecCalo[sec];
|
618 |
|
|
fCALOlength++;
|
619 |
|
|
fDataCALO[fCALOlength] = fSecCALOLength[sec];
|
620 |
|
|
fCALOlength++;
|
621 |
|
|
//
|
622 |
|
|
// Section XO is read in the opposite direction respect to the others
|
623 |
|
|
//
|
624 |
|
|
chksum = 0;
|
625 |
|
|
//
|
626 |
|
|
for (Int_t plane=0; plane < 11; plane++){
|
627 |
|
|
//
|
628 |
|
|
if ( sec == 1 ) tstrip = fCALOlength + 96*2;
|
629 |
|
|
//
|
630 |
|
|
for (Int_t strip=0; strip < 96; strip++){
|
631 |
|
|
//
|
632 |
|
|
chksum += (Int_t)fcalped[sec][plane][strip];
|
633 |
|
|
//
|
634 |
|
|
// save value
|
635 |
|
|
//
|
636 |
|
|
if ( sec == 1 ){
|
637 |
|
|
tstrip -= 2;
|
638 |
|
|
fDataCALO[tstrip] = (Int_t)fcalped[sec][plane][strip];
|
639 |
|
|
fDataCALO[tstrip+1] = (Int_t)fcalgood[sec][plane][strip];
|
640 |
|
|
} else {
|
641 |
|
|
fDataCALO[fCALOlength] = (Int_t)fcalped[sec][plane][strip];
|
642 |
|
|
fDataCALO[fCALOlength+1] = (Int_t)fcalgood[sec][plane][strip];
|
643 |
|
|
};
|
644 |
|
|
fCALOlength +=2;
|
645 |
|
|
};
|
646 |
|
|
//
|
647 |
|
|
};
|
648 |
|
|
//
|
649 |
|
|
fDataCALO[fCALOlength] = (UShort_t)chksum;
|
650 |
|
|
fCALOlength++;
|
651 |
|
|
fDataCALO[fCALOlength] = 0;
|
652 |
|
|
fCALOlength++;
|
653 |
|
|
fDataCALO[fCALOlength] = (UShort_t)((Int_t)(chksum >> 16));
|
654 |
|
|
fCALOlength++;
|
655 |
|
|
//
|
656 |
|
|
// Section XO is read in the opposite direction respect to the others
|
657 |
|
|
//
|
658 |
|
|
chksum = 0;
|
659 |
|
|
//
|
660 |
|
|
for (Int_t plane=0; plane < 11; plane++){
|
661 |
|
|
//
|
662 |
|
|
if ( sec == 1 ) tstrip = fCALOlength+6*2;
|
663 |
|
|
//
|
664 |
|
|
for (Int_t strip=0; strip < 6; strip++){
|
665 |
|
|
//
|
666 |
|
|
chksum += (Int_t)fcalthr[sec][plane][strip];
|
667 |
|
|
//
|
668 |
|
|
// save value
|
669 |
|
|
//
|
670 |
|
|
if ( sec == 1 ){
|
671 |
|
|
tstrip -= 2;
|
672 |
|
|
fDataCALO[tstrip] = 0;
|
673 |
|
|
fDataCALO[tstrip+1] = (Int_t)fcalthr[sec][plane][strip];
|
674 |
|
|
} else {
|
675 |
|
|
fDataCALO[fCALOlength] = 0;
|
676 |
|
|
fDataCALO[fCALOlength+1] = (Int_t)fcalthr[sec][plane][strip];
|
677 |
|
|
};
|
678 |
|
|
fCALOlength +=2;
|
679 |
|
|
};
|
680 |
|
|
//
|
681 |
|
|
};
|
682 |
|
|
//
|
683 |
|
|
fDataCALO[fCALOlength] = 0;
|
684 |
|
|
fCALOlength++;
|
685 |
|
|
fDataCALO[fCALOlength] = (UShort_t)chksum;
|
686 |
|
|
fCALOlength++;
|
687 |
|
|
fDataCALO[fCALOlength] = 0;
|
688 |
|
|
fCALOlength++;
|
689 |
|
|
fDataCALO[fCALOlength] = (UShort_t)((Int_t)(chksum >> 16));
|
690 |
|
|
fCALOlength++;
|
691 |
|
|
//
|
692 |
|
|
// Section XO is read in the opposite direction respect to the others
|
693 |
|
|
//
|
694 |
|
|
for (Int_t plane=0; plane < 11; plane++){
|
695 |
|
|
//
|
696 |
|
|
if ( sec == 1 ) tstrip = fCALOlength+96*2;
|
697 |
|
|
//
|
698 |
|
|
for (Int_t strip=0; strip < 96; strip++){
|
699 |
|
|
//
|
700 |
|
|
// save value
|
701 |
|
|
//
|
702 |
|
|
if ( sec == 1 ){
|
703 |
|
|
tstrip -= 2;
|
704 |
|
|
fDataCALO[tstrip] = 0;
|
705 |
|
|
fDataCALO[tstrip+1] = (Int_t)fcalrms[sec][plane][strip];
|
706 |
|
|
} else {
|
707 |
|
|
fDataCALO[fCALOlength] = 0;
|
708 |
|
|
fDataCALO[fCALOlength+1] = (Int_t)fcalrms[sec][plane][strip];
|
709 |
|
|
};
|
710 |
|
|
fCALOlength += 2;
|
711 |
|
|
};
|
712 |
|
|
//
|
713 |
|
|
};
|
714 |
|
|
//
|
715 |
|
|
// Section XO is read in the opposite direction respect to the others
|
716 |
|
|
//
|
717 |
|
|
for (Int_t plane=0; plane < 11; plane++){
|
718 |
|
|
//
|
719 |
|
|
if ( sec == 1 ) tstrip = fCALOlength+6*4;
|
720 |
|
|
//
|
721 |
|
|
for (Int_t strip=0; strip < 6; strip++){
|
722 |
|
|
//
|
723 |
|
|
// save value
|
724 |
|
|
//
|
725 |
|
|
if ( sec == 1 ){
|
726 |
|
|
tstrip -= 4;
|
727 |
|
|
fDataCALO[tstrip] = 0;
|
728 |
|
|
fDataCALO[tstrip+1] = (Int_t)fcalbase[sec][plane][strip];
|
729 |
|
|
fDataCALO[tstrip+2] = 0;
|
730 |
|
|
fDataCALO[tstrip+3] = (Int_t)fcalvar[sec][plane][strip];
|
731 |
|
|
} else {
|
732 |
|
|
fDataCALO[fCALOlength] = 0;
|
733 |
|
|
fDataCALO[fCALOlength+1] = (Int_t)fcalbase[sec][plane][strip];
|
734 |
|
|
fDataCALO[fCALOlength+2] = 0;
|
735 |
|
|
fDataCALO[fCALOlength+3] = (Int_t)fcalvar[sec][plane][strip];
|
736 |
|
|
};
|
737 |
|
|
fCALOlength +=4;
|
738 |
|
|
};
|
739 |
|
|
//
|
740 |
|
|
};
|
741 |
|
|
//
|
742 |
|
|
//
|
743 |
|
|
// here we calculate and save the CRC
|
744 |
|
|
//
|
745 |
|
|
fDataCALO[fCALOlength] = 0;
|
746 |
|
|
fCALOlength++;
|
747 |
|
|
Short_t CRC = 0;
|
748 |
|
|
for (UInt_t i=0; i<(fCALOlength-fSecPointer); i++){
|
749 |
|
|
CRC=crc(CRC,fDataCALO[i+fSecPointer]);
|
750 |
|
|
};
|
751 |
|
|
fDataCALO[fCALOlength] = (UShort_t)CRC;
|
752 |
|
|
fCALOlength++;
|
753 |
|
|
//
|
754 |
|
|
UInt_t length=fCALOlength*2;
|
755 |
silvio |
1.6 |
DigitizePSCU(length,0x18,fDataPSCU);
|
756 |
orsi |
1.4 |
//
|
757 |
|
|
// Add padding to 64 bits
|
758 |
|
|
//
|
759 |
|
|
AddPadding();
|
760 |
|
|
//
|
761 |
|
|
fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);
|
762 |
|
|
UShort_t temp[1000000];
|
763 |
|
|
memset(temp,0,sizeof(UShort_t)*1000000);
|
764 |
|
|
swab(fDataCALO,temp,sizeof(UShort_t)*fCALOlength); // WE MUST SWAP THE BYTES!!!
|
765 |
|
|
fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fCALOlength);
|
766 |
|
|
//
|
767 |
|
|
// padding to 64 bytes
|
768 |
|
|
//
|
769 |
|
|
if ( fPadding ){
|
770 |
|
|
fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);
|
771 |
|
|
};
|
772 |
|
|
//
|
773 |
|
|
//
|
774 |
|
|
};
|
775 |
|
|
//
|
776 |
|
|
};
|
777 |
|
|
|
778 |
|
|
void Digitizer::CaloLoadCalib() {
|
779 |
|
|
//
|
780 |
|
|
fGivenCaloCalib = 0; // ####@@@@ should be given as input par @@@@####
|
781 |
|
|
//
|
782 |
|
|
// first of all load the MIP to ADC conversion values
|
783 |
|
|
//
|
784 |
|
|
stringstream calfile;
|
785 |
|
|
Int_t error = 0;
|
786 |
|
|
GL_PARAM *glparam = new GL_PARAM();
|
787 |
|
|
//
|
788 |
|
|
// determine where I can find calorimeter ADC to MIP conversion file
|
789 |
|
|
//
|
790 |
|
|
error = 0;
|
791 |
|
|
error = glparam->Query_GL_PARAM(3,101,fDbc);
|
792 |
|
|
//
|
793 |
|
|
calfile.str("");
|
794 |
|
|
calfile << glparam->PATH.Data() << "/";
|
795 |
|
|
calfile << glparam->NAME.Data();
|
796 |
|
|
//
|
797 |
|
|
printf("\n Using Calorimeter ADC to MIP conversion file: \n %s \n",calfile.str().c_str());
|
798 |
|
|
FILE *f;
|
799 |
|
|
f = fopen(calfile.str().c_str(),"rb");
|
800 |
|
|
//
|
801 |
|
|
memset(fCalomip,0,4224*sizeof(fCalomip[0][0][0]));
|
802 |
|
|
//
|
803 |
|
|
for (Int_t m = 0; m < 2 ; m++ ){
|
804 |
|
|
for (Int_t k = 0; k < 22; k++ ){
|
805 |
|
|
for (Int_t l = 0; l < 96; l++ ){
|
806 |
|
|
fread(&fCalomip[m][k][l],sizeof(fCalomip[m][k][l]),1,f);
|
807 |
|
|
};
|
808 |
|
|
};
|
809 |
|
|
};
|
810 |
|
|
fclose(f);
|
811 |
|
|
//
|
812 |
|
|
// determine which calibration has to be used and load it for each section
|
813 |
|
|
//
|
814 |
|
|
GL_CALO_CALIB *glcalo = new GL_CALO_CALIB();
|
815 |
|
|
GL_ROOT *glroot = new GL_ROOT();
|
816 |
|
|
TString fcalname;
|
817 |
|
|
UInt_t idcalib;
|
818 |
|
|
UInt_t calibno;
|
819 |
|
|
UInt_t utime = 0;
|
820 |
|
|
//
|
821 |
|
|
for (UInt_t s=0; s<4; s++){
|
822 |
|
|
//
|
823 |
|
|
// clear calo calib variables for section s
|
824 |
|
|
//
|
825 |
|
|
ClearCaloCalib(s);
|
826 |
|
|
//
|
827 |
|
|
if ( fGivenCaloCalib ){
|
828 |
|
|
//
|
829 |
|
|
// a time has been given as input on the command line so retrieve the calibration that preceed that time
|
830 |
|
|
//
|
831 |
|
|
glcalo->Query_GL_CALO_CALIB(fGivenCaloCalib,utime,s,fDbc);
|
832 |
|
|
//
|
833 |
|
|
calibno = glcalo->EV_ROOT;
|
834 |
|
|
idcalib = glcalo->ID_ROOT_L0;
|
835 |
|
|
//
|
836 |
|
|
// determine path and name and entry of the calibration file
|
837 |
|
|
//
|
838 |
|
|
printf("\n");
|
839 |
|
|
printf(" ** SECTION %i **\n",s);
|
840 |
|
|
//
|
841 |
|
|
glroot->Query_GL_ROOT(idcalib,fDbc);
|
842 |
|
|
//
|
843 |
|
|
stringstream name;
|
844 |
|
|
name.str("");
|
845 |
|
|
name << glroot->PATH.Data() << "/";
|
846 |
|
|
name << glroot->NAME.Data();
|
847 |
|
|
//
|
848 |
|
|
fcalname = (TString)name.str().c_str();
|
849 |
|
|
//
|
850 |
|
|
printf("\n Section %i : using file %s calibration at entry %i: \n",s,fcalname.Data(),calibno);
|
851 |
|
|
//
|
852 |
|
|
} else {
|
853 |
|
|
error = 0;
|
854 |
|
|
error = glparam->Query_GL_PARAM(1,104,fDbc);
|
855 |
|
|
//
|
856 |
|
|
calfile.str("");
|
857 |
|
|
calfile << glparam->PATH.Data() << "/";
|
858 |
|
|
calfile << glparam->NAME.Data();
|
859 |
|
|
//
|
860 |
|
|
printf("\n Section %i : using default calorimeter calibration: \n %s \n",s,calfile.str().c_str());
|
861 |
|
|
//
|
862 |
|
|
fcalname = (TString)calfile.str().c_str();
|
863 |
|
|
calibno = s;
|
864 |
|
|
//
|
865 |
|
|
};
|
866 |
|
|
//
|
867 |
|
|
// load calibration variables in memory
|
868 |
|
|
//
|
869 |
|
|
CaloLoadCalib(s,fcalname,calibno);
|
870 |
|
|
//
|
871 |
|
|
};
|
872 |
|
|
//
|
873 |
|
|
// at this point we have in memory the calorimeter calibration and we can save it to disk in the correct format and use it to digitize the data
|
874 |
|
|
//
|
875 |
|
|
delete glparam;
|
876 |
|
|
delete glcalo;
|
877 |
|
|
delete glroot;
|
878 |
|
|
};
|
879 |
|
|
|
880 |
|
|
void Digitizer::DigitizeCALO() {
|
881 |
|
|
//
|
882 |
|
|
fModCalo = 0; // 0 is RAW, 1 is COMPRESS, 2 is FULL ####@@@@ should be given as input par @@@@####
|
883 |
|
|
//
|
884 |
|
|
//
|
885 |
|
|
//
|
886 |
|
|
fCALOlength = 0; // reset total dimension of calo data
|
887 |
|
|
//
|
888 |
|
|
// gpamela variables to be used
|
889 |
|
|
//
|
890 |
|
|
fhBookTree->SetBranchStatus("Nthcali",1);
|
891 |
|
|
fhBookTree->SetBranchStatus("Icaplane",1);
|
892 |
|
|
fhBookTree->SetBranchStatus("Icastrip",1);
|
893 |
|
|
fhBookTree->SetBranchStatus("Icamod",1);
|
894 |
|
|
fhBookTree->SetBranchStatus("Enestrip",1);
|
895 |
|
|
//
|
896 |
|
|
// call different routines depending on the acq mode you want to simulate
|
897 |
|
|
//
|
898 |
|
|
switch ( fModCalo ){
|
899 |
|
|
case 0:
|
900 |
|
|
this->DigitizeCALORAW();
|
901 |
|
|
break;
|
902 |
|
|
case 1:
|
903 |
|
|
this->DigitizeCALOCOMPRESS();
|
904 |
|
|
break;
|
905 |
|
|
case 2:
|
906 |
|
|
this->DigitizeCALOFULL();
|
907 |
|
|
break;
|
908 |
|
|
};
|
909 |
|
|
//
|
910 |
|
|
};
|
911 |
|
|
|
912 |
|
|
Float_t Digitizer::GetCALOen(Int_t sec, Int_t plane, Int_t strip){
|
913 |
|
|
//
|
914 |
|
|
// determine plane and strip
|
915 |
|
|
//
|
916 |
|
|
Int_t mplane = 0;
|
917 |
|
|
//
|
918 |
|
|
// wrong!
|
919 |
|
|
//
|
920 |
|
|
// if ( sec == 0 || sec == 3 ) mplane = (plane * 4) + sec + 1;
|
921 |
|
|
// if ( sec == 1 ) mplane = (plane * 4) + 2 + 1;
|
922 |
|
|
// if ( sec == 2 ) mplane = (plane * 4) + 1 + 1;
|
923 |
|
|
//
|
924 |
|
|
if ( sec == 0 ) mplane = plane * 4 + 1; // it must be 0, 4, 8, ... (+1) from plane = 0, 11
|
925 |
|
|
if ( sec == 1 ) mplane = plane * 4 + 2 + 1; // it must be 2, 6, 10, ... (+1) from plane = 0, 11
|
926 |
|
|
if ( sec == 2 ) mplane = plane * 4 + 3 + 1; // it must be 3, 7, 11, ... (+1) from plane = 0, 11
|
927 |
|
|
if ( sec == 3 ) mplane = plane * 4 + 1 + 1; // it must be 1, 5, 9, ... (+1) from plane = 0, 11
|
928 |
|
|
//
|
929 |
|
|
Int_t mstrip = strip + 1;
|
930 |
|
|
//
|
931 |
|
|
// search energy release in gpamela output
|
932 |
|
|
//
|
933 |
|
|
for (Int_t i=0; i<Nthcali;i++){
|
934 |
|
|
if ( Icaplane[i] == mplane && Icastrip[i] == mstrip ){
|
935 |
|
|
return (Enestrip[i]);
|
936 |
|
|
};
|
937 |
|
|
};
|
938 |
|
|
//
|
939 |
|
|
// if not found it means no energy release so return 0.
|
940 |
|
|
//
|
941 |
|
|
return(0.);
|
942 |
|
|
};
|
943 |
|
|
|
944 |
|
|
void Digitizer::DigitizeCALORAW() {
|
945 |
|
|
//
|
946 |
|
|
// some variables
|
947 |
|
|
//
|
948 |
|
|
Float_t ens = 0.;
|
949 |
|
|
UInt_t adcsig = 0;
|
950 |
|
|
UInt_t adcbase = 0;
|
951 |
|
|
UInt_t adc = 0;
|
952 |
|
|
Int_t pre = 0;
|
953 |
|
|
UInt_t l = 0;
|
954 |
|
|
UInt_t lpl = 0;
|
955 |
|
|
UInt_t tstrip = 0;
|
956 |
|
|
UInt_t fSecPointer = 0;
|
957 |
|
|
Double_t pedenoise;
|
958 |
|
|
Float_t rms = 0.;
|
959 |
|
|
Float_t pedestal = 0.;
|
960 |
|
|
//
|
961 |
|
|
// clean the data structure
|
962 |
|
|
//
|
963 |
|
|
memset(fDataCALO,0,sizeof(UShort_t)*fCALObuffer);
|
964 |
|
|
//
|
965 |
|
|
// Header of the four sections
|
966 |
|
|
//
|
967 |
|
|
fSecCalo[0] = 0xEA08; // XE
|
968 |
|
|
fSecCalo[1] = 0xF108; // XO
|
969 |
|
|
fSecCalo[2] = 0xF608; // YE
|
970 |
|
|
fSecCalo[3] = 0xED08; // YO
|
971 |
|
|
//
|
972 |
|
|
// length of the data is 0x0428 in RAW mode
|
973 |
|
|
//
|
974 |
|
|
fSecCALOLength[0] = 0x0428; // XE
|
975 |
|
|
fSecCALOLength[1] = 0x0428; // XO
|
976 |
|
|
fSecCALOLength[2] = 0x0428; // YE
|
977 |
|
|
fSecCALOLength[3] = 0x0428; // YO
|
978 |
|
|
//
|
979 |
|
|
// let's start
|
980 |
|
|
//
|
981 |
|
|
fCALOlength = 0;
|
982 |
|
|
//
|
983 |
|
|
for (Int_t sec=0; sec < 4; sec++){
|
984 |
|
|
//
|
985 |
|
|
// sec = 0 -> XE 1 -> XO 2-> YE 3 -> YO
|
986 |
|
|
//
|
987 |
|
|
l = 0; // XE and XO are Y planes
|
988 |
|
|
if ( sec < 2 ) l = 1; // while YE and YO are X planes
|
989 |
|
|
//
|
990 |
|
|
fSecPointer = fCALOlength;
|
991 |
|
|
//
|
992 |
|
|
// First of all we have section header and packet length
|
993 |
|
|
//
|
994 |
|
|
fDataCALO[fCALOlength] = fSecCalo[sec];
|
995 |
|
|
fCALOlength++;
|
996 |
|
|
fDataCALO[fCALOlength] = fSecCALOLength[sec];
|
997 |
|
|
fCALOlength++;
|
998 |
|
|
//
|
999 |
|
|
// selftrigger coincidences - in the future we should add here some code to simulate timing response of pre-amplifiers
|
1000 |
|
|
//
|
1001 |
|
|
for (Int_t autoplane=0; autoplane < 7; autoplane++){
|
1002 |
|
|
fDataCALO[fCALOlength] = 0x0000;
|
1003 |
|
|
fCALOlength++;
|
1004 |
|
|
};
|
1005 |
|
|
//
|
1006 |
|
|
//
|
1007 |
|
|
// here comes data
|
1008 |
|
|
//
|
1009 |
|
|
//
|
1010 |
|
|
// Section XO is read in the opposite direction respect to the others
|
1011 |
|
|
//
|
1012 |
|
|
if ( sec == 1 ){
|
1013 |
|
|
tstrip = 96*11 + fCALOlength;
|
1014 |
|
|
} else {
|
1015 |
|
|
tstrip = 0;
|
1016 |
|
|
};
|
1017 |
|
|
//
|
1018 |
|
|
pre = -1;
|
1019 |
|
|
//
|
1020 |
|
|
for (Int_t strip=0; strip < 96; strip++){
|
1021 |
|
|
//
|
1022 |
|
|
// which is the pre for this strip?
|
1023 |
|
|
//
|
1024 |
|
|
if (strip%16 == 0) {
|
1025 |
|
|
pre++;
|
1026 |
|
|
};
|
1027 |
|
|
//
|
1028 |
|
|
if ( sec == 1 ) tstrip -= 11;
|
1029 |
|
|
//
|
1030 |
|
|
for (Int_t plane=0; plane < 11; plane++){
|
1031 |
|
|
//
|
1032 |
|
|
// here is wrong!!!!
|
1033 |
|
|
//
|
1034 |
|
|
//
|
1035 |
|
|
// if ( plane%2 == 0 && sec%2 != 0){
|
1036 |
|
|
// lpl = plane*2;
|
1037 |
|
|
// } else {
|
1038 |
|
|
// lpl = (plane*2) + 1;
|
1039 |
|
|
// };
|
1040 |
|
|
//
|
1041 |
|
|
if ( sec == 0 || sec == 3 ) lpl = plane * 2;
|
1042 |
|
|
if ( sec == 1 || sec == 2 ) lpl = (plane * 2) + 1;
|
1043 |
|
|
//
|
1044 |
|
|
// get the energy in GeV from the simulation for that strip
|
1045 |
|
|
//
|
1046 |
|
|
ens = this->GetCALOen(sec,plane,strip);
|
1047 |
|
|
//
|
1048 |
|
|
// convert it into ADC channels
|
1049 |
|
|
//
|
1050 |
|
|
adcsig = int(ens*fCalomip[l][lpl][strip]/fCALOGeV2MIPratio);
|
1051 |
|
|
//
|
1052 |
|
|
// sum baselines
|
1053 |
|
|
//
|
1054 |
|
|
adcbase = (UInt_t)fcalbase[sec][plane][pre];
|
1055 |
|
|
//
|
1056 |
|
|
// add noise and pedestals
|
1057 |
|
|
//
|
1058 |
|
|
pedestal = fcalped[sec][plane][strip];
|
1059 |
|
|
rms = fcalrms[sec][plane][strip]/4.;
|
1060 |
|
|
//
|
1061 |
|
|
// Add random gaussian noise of RMS rms and Centered in the pedestal
|
1062 |
|
|
//
|
1063 |
|
|
pedenoise = gRandom->Gaus((Double_t)pedestal,(Double_t)rms);
|
1064 |
|
|
//
|
1065 |
|
|
// Sum all contribution
|
1066 |
|
|
//
|
1067 |
|
|
adc = adcsig + adcbase + (Int_t)round(pedenoise);
|
1068 |
|
|
//
|
1069 |
|
|
// Signal saturation
|
1070 |
|
|
//
|
1071 |
|
|
if ( adc > 0x7FFF ) adc = 0x7FFF;
|
1072 |
|
|
//
|
1073 |
|
|
// save value
|
1074 |
|
|
//
|
1075 |
|
|
if ( sec == 1 ){
|
1076 |
|
|
fDataCALO[tstrip] = adc;
|
1077 |
|
|
tstrip++;
|
1078 |
|
|
} else {
|
1079 |
|
|
fDataCALO[fCALOlength] = adc;
|
1080 |
|
|
};
|
1081 |
|
|
fCALOlength++;
|
1082 |
|
|
//
|
1083 |
|
|
};
|
1084 |
|
|
//
|
1085 |
|
|
if ( sec == 1 ) tstrip -= 11;
|
1086 |
|
|
//
|
1087 |
|
|
};
|
1088 |
|
|
//
|
1089 |
|
|
// here we calculate and save the CRC
|
1090 |
|
|
//
|
1091 |
|
|
Short_t CRC = 0;
|
1092 |
|
|
for (UInt_t i=0; i<(fCALOlength-fSecPointer); i++){
|
1093 |
|
|
CRC=crc(CRC,fDataCALO[i+fSecPointer]);
|
1094 |
|
|
};
|
1095 |
|
|
fDataCALO[fCALOlength] = (UShort_t)CRC;
|
1096 |
|
|
fCALOlength++;
|
1097 |
|
|
//
|
1098 |
|
|
};
|
1099 |
|
|
//
|
1100 |
|
|
// for (Int_t i=0; i<fCALOlength; i++){
|
1101 |
|
|
// printf(" WORD %i DIGIT %0x \n",i,fDataCALO[i]);
|
1102 |
|
|
// };
|
1103 |
|
|
//
|
1104 |
|
|
};
|
1105 |
|
|
|
1106 |
|
|
void Digitizer::DigitizeCALOCOMPRESS() {
|
1107 |
|
|
//
|
1108 |
|
|
printf(" COMPRESS MODE STILL NOT IMPLEMENTED! \n");
|
1109 |
|
|
//
|
1110 |
|
|
this->DigitizeCALORAW();
|
1111 |
|
|
return;
|
1112 |
|
|
//
|
1113 |
|
|
//
|
1114 |
|
|
//
|
1115 |
|
|
fSecCalo[0] = 0xEA00;
|
1116 |
|
|
fSecCalo[1] = 0xF100;
|
1117 |
|
|
fSecCalo[2] = 0xF600;
|
1118 |
|
|
fSecCalo[3] = 0xED00;
|
1119 |
|
|
//
|
1120 |
|
|
// length of the data in DSP mode must be calculated on fly during digitization
|
1121 |
|
|
//
|
1122 |
|
|
memset(fSecCALOLength,0x0,4*sizeof(UShort_t));
|
1123 |
|
|
//
|
1124 |
|
|
// here comes raw data
|
1125 |
|
|
//
|
1126 |
|
|
Int_t en = 0;
|
1127 |
|
|
//
|
1128 |
|
|
for (Int_t sec=0; sec < 4; sec++){
|
1129 |
|
|
fDataCALO[en] = fSecCalo[sec];
|
1130 |
|
|
en++;
|
1131 |
|
|
fDataCALO[en] = fSecCALOLength[sec];
|
1132 |
|
|
en++;
|
1133 |
|
|
for (Int_t plane=0; plane < 11; plane++){
|
1134 |
|
|
for (Int_t strip=0; strip < 11; strip++){
|
1135 |
|
|
fDataCALO[en] = 0x0;
|
1136 |
|
|
en++;
|
1137 |
|
|
};
|
1138 |
|
|
};
|
1139 |
|
|
};
|
1140 |
|
|
//
|
1141 |
|
|
};
|
1142 |
|
|
|
1143 |
|
|
void Digitizer::DigitizeCALOFULL() {
|
1144 |
|
|
//
|
1145 |
|
|
printf(" FULL MODE STILL NOT IMPLEMENTED! \n");
|
1146 |
|
|
//
|
1147 |
|
|
this->DigitizeCALORAW();
|
1148 |
|
|
return;
|
1149 |
|
|
//
|
1150 |
|
|
fSecCalo[0] = 0xEA00;
|
1151 |
|
|
fSecCalo[1] = 0xF100;
|
1152 |
|
|
fSecCalo[2] = 0xF600;
|
1153 |
|
|
fSecCalo[3] = 0xED00;
|
1154 |
|
|
//
|
1155 |
|
|
// length of the data in DSP mode must be calculated on fly during digitization
|
1156 |
|
|
//
|
1157 |
|
|
memset(fSecCALOLength,0x0,4*sizeof(UShort_t));
|
1158 |
|
|
//
|
1159 |
|
|
// here comes raw data
|
1160 |
|
|
//
|
1161 |
|
|
Int_t en = 0;
|
1162 |
|
|
//
|
1163 |
|
|
for (Int_t sec=0; sec < 4; sec++){
|
1164 |
|
|
fDataCALO[en] = fSecCalo[sec];
|
1165 |
|
|
en++;
|
1166 |
|
|
fDataCALO[en] = fSecCALOLength[sec];
|
1167 |
|
|
en++;
|
1168 |
|
|
for (Int_t plane=0; plane < 11; plane++){
|
1169 |
|
|
for (Int_t strip=0; strip < 11; strip++){
|
1170 |
|
|
fDataCALO[en] = 0x0;
|
1171 |
|
|
en++;
|
1172 |
|
|
};
|
1173 |
|
|
};
|
1174 |
|
|
};
|
1175 |
|
|
//
|
1176 |
|
|
};
|
1177 |
|
|
|
1178 |
silvio |
1.6 |
//void Digitizer::DigitizeTRIGGER() {
|
1179 |
|
|
//fDataTrigger: 152 bytes
|
1180 |
|
|
// corrected 30/11/'07 SO (was 153)
|
1181 |
|
|
//for (Int_t j=0; j < 152; j++)
|
1182 |
|
|
// fDataTrigger[j]=0x00;
|
1183 |
|
|
//};
|
1184 |
orsi |
1.4 |
|
1185 |
|
|
Int_t Digitizer::DigitizeTOF() {
|
1186 |
|
|
//fDataTof: 12 x 23 bytes (=276 bytes)
|
1187 |
|
|
UChar_t *pTof=fDataTof;
|
1188 |
|
|
Bool_t DEBUG=false;
|
1189 |
|
|
|
1190 |
|
|
// --- activate branches:
|
1191 |
|
|
fhBookTree->SetBranchStatus("Nthtof",1);
|
1192 |
|
|
fhBookTree->SetBranchStatus("Ipltof",1);
|
1193 |
|
|
fhBookTree->SetBranchStatus("Ipaddle",1);
|
1194 |
|
|
fhBookTree->SetBranchStatus("Xintof",1);
|
1195 |
|
|
fhBookTree->SetBranchStatus("Yintof",1);
|
1196 |
|
|
fhBookTree->SetBranchStatus("Xouttof",1);
|
1197 |
|
|
fhBookTree->SetBranchStatus("Youttof",1);
|
1198 |
|
|
fhBookTree->SetBranchStatus("Ereltof",1);
|
1199 |
|
|
fhBookTree->SetBranchStatus("Timetof",1);
|
1200 |
|
|
// not yet used: Zintof, Xouttof, Youttof, Zouttof
|
1201 |
|
|
|
1202 |
|
|
// ------ evaluate energy in each pmt: ------
|
1203 |
|
|
// strip geometry (lenght/width)
|
1204 |
|
|
Float_t dimel[6] = {33.0, 40.8 ,18.0, 15.0, 15.0, 18.0};
|
1205 |
|
|
//Float_t dimes[6] = {5.1, 5.5, 7.5, 9.0, 6.0, 5.0};
|
1206 |
|
|
|
1207 |
|
|
// S11 8 paddles 33.0 x 5.1 cm
|
1208 |
|
|
// S12 6 paddles 40.8 x 5.5 cm
|
1209 |
|
|
// S21 2 paddles 18.0 x 7.5 cm
|
1210 |
|
|
// S22 2 paddles 15.0 x 9.0 cm
|
1211 |
|
|
// S31 3 paddles 15.0 x 6.0 cm
|
1212 |
|
|
// S32 3 paddles 18.0 x 5.0 cm
|
1213 |
|
|
|
1214 |
|
|
Float_t FGeo[2]={0., 0.}; /* geometrical factor */
|
1215 |
|
|
|
1216 |
|
|
const Float_t Pho_keV = 10.; // photons per keV in scintillator
|
1217 |
|
|
const Float_t echarge = 1.6e-19; // electron charge
|
1218 |
|
|
Float_t Npho=0.;
|
1219 |
|
|
Float_t QevePmt_pC[48];
|
1220 |
|
|
Float_t QhitPad_pC[2]={0., 0.};
|
1221 |
|
|
Float_t QhitPmt_pC[2]={0., 0.};
|
1222 |
|
|
Float_t pmGain = 3.5e6; /* PMT Gain: the same for all PMTs */
|
1223 |
|
|
Float_t effi=0.21; /* Efficienza di fotocatodo */
|
1224 |
|
|
|
1225 |
silvio |
1.5 |
// Float_t ADC_pC0=-58.1; // ADC/pC conversion coefficient 0
|
1226 |
|
|
// Float_t ADC_pC1=1.728; // ADC/pC conversion coefficient 1
|
1227 |
|
|
// Float_t ADC_pC2=-4.063e-05; // ADC/pC conversion coefficient 2
|
1228 |
|
|
// Float_t ADC_pC3=-5.763e-08; // ADC/pC conversion coefficient 3
|
1229 |
|
|
|
1230 |
|
|
// pC < 800
|
1231 |
|
|
Float_t ADC_pC0A = -4.437616e+01 ;
|
1232 |
|
|
Float_t ADC_pC1A = 1.573329e+00 ;
|
1233 |
|
|
Float_t ADC_pC2A = 2.780518e-04 ;
|
1234 |
|
|
Float_t ADC_pC3A = -2.302160e-07 ;
|
1235 |
|
|
|
1236 |
|
|
// pC > 800:
|
1237 |
|
|
Float_t ADC_pC0B = -2.245756e+02 ;
|
1238 |
|
|
Float_t ADC_pC1B = 2.184156e+00 ;
|
1239 |
|
|
Float_t ADC_pC2B = -4.171825e-04 ;
|
1240 |
|
|
Float_t ADC_pC3B = 3.789715e-08 ;
|
1241 |
orsi |
1.4 |
|
1242 |
|
|
Float_t pCthres=40.; // threshold in charge
|
1243 |
|
|
Int_t ADClast=4095; // no signal --> ADC ch=4095
|
1244 |
|
|
Int_t ADCsat=3100; // saturation value for the ADCs
|
1245 |
|
|
Int_t ADCtof[48];
|
1246 |
|
|
|
1247 |
|
|
|
1248 |
silvio |
1.5 |
// ---- introduce scale factors to tune simul ADC to real data 24-oct DC
|
1249 |
|
|
// Float_t ScaleFact[48]={0.18,0.22,0.35,0.26,0.47,0.35,0.31,0.37,
|
1250 |
|
|
// 0.44,0.23,0.38,0.60,0.39,0.29,0.40,0.23,
|
1251 |
|
|
// 0.30,0.66,0.22,1.53,0.17,0.55,
|
1252 |
|
|
// 0.84,0.19,0.21,1.64,0.62,0.13,
|
1253 |
|
|
// 0.18,0.15,0.10,0.14,0.14,0.14,0.14,0.12,
|
1254 |
|
|
// 0.26,0.18,0.25,0.23,0.20,0.40,0.19,0.23,0.25,0.23,0.25,0.20};
|
1255 |
|
|
|
1256 |
|
|
// new scale factors: WM 30-Oct-07
|
1257 |
|
|
// Float_t ScaleFact[48]={0.35,0.41,0.32,0.34,0.58,0.47,0.42,0.44,
|
1258 |
|
|
// 0.50,0.34,0.50,0.50,0.51,0.42,0.46,0.25,
|
1259 |
|
|
// 0.20,0.38,0.29,0.49,0.24,0.68,
|
1260 |
|
|
// 0.30,0.26,0.28,0.79,0.31,0.12,
|
1261 |
|
|
// 0.25,0.21,0.14,0.20,
|
1262 |
|
|
// 0.16,0.17,0.19,0.18,
|
1263 |
|
|
// 0.34,0.27,0.34,0.31,0.25,0.57,
|
1264 |
|
|
// 0.24,0.34,0.34,0.32,0.31,0.30};
|
1265 |
|
|
|
1266 |
|
|
Float_t ScaleFact[48]={0.39, 0.49, 0.38, 0.40, 0.65, 0.51, 0.43,
|
1267 |
|
|
0.49, 0.58, 0.38, 0.53, 0.57, 0.53, 0.45, 0.49, 0.16,
|
1268 |
|
|
0.15, 0.44, 0.28, 0.57, 0.26, 0.72, 0.37, 0.29, 0.30, 0.89,
|
1269 |
|
|
0.37, 0.08, 0.27, 0.23, 0.12, 0.22, 0.15, 0.16, 0.21,
|
1270 |
|
|
0.19, 0.41, 0.32, 0.39, 0.38, 0.28, 0.66, 0.28, 0.40, 0.39, 0.40, 0.37, 0.35 };
|
1271 |
|
|
|
1272 |
orsi |
1.4 |
for(Int_t i=0; i<48; i++){
|
1273 |
|
|
QevePmt_pC[i] = 0;
|
1274 |
|
|
ADCtof[i]=0;
|
1275 |
|
|
}
|
1276 |
|
|
|
1277 |
|
|
// ------ read calibration file (get A1, A2, lambda1, lambda2)
|
1278 |
|
|
ifstream fileTriggerCalib;
|
1279 |
|
|
TString ftrigname="TrigCalibParam.txt";
|
1280 |
|
|
fileTriggerCalib.open(ftrigname.Data());
|
1281 |
|
|
if ( !fileTriggerCalib ) {
|
1282 |
|
|
printf("debug: no trigger calib file!\n");
|
1283 |
|
|
return(-117); //check output!
|
1284 |
|
|
};
|
1285 |
|
|
Float_t atte1[48],atte2[48],lambda1[48],lambda2[48];
|
1286 |
|
|
Int_t temp=0;
|
1287 |
|
|
// correct readout WM Oct '07
|
1288 |
|
|
for(Int_t i=0; i<48; i++){
|
1289 |
|
|
fileTriggerCalib >> temp;
|
1290 |
|
|
fileTriggerCalib >> atte1[i];
|
1291 |
|
|
fileTriggerCalib >> lambda1[i];
|
1292 |
|
|
fileTriggerCalib >> atte2[i];
|
1293 |
|
|
fileTriggerCalib >> lambda2[i];
|
1294 |
|
|
fileTriggerCalib >> temp;
|
1295 |
|
|
}
|
1296 |
|
|
fileTriggerCalib.close();
|
1297 |
|
|
|
1298 |
|
|
Int_t ip, ipad;
|
1299 |
|
|
//Int_t ipmt;
|
1300 |
|
|
Int_t pmtleft=0, pmtright=0;
|
1301 |
|
|
Int_t *pl, *pr;
|
1302 |
|
|
pl = &pmtleft;
|
1303 |
|
|
pr = &pmtright;
|
1304 |
|
|
|
1305 |
|
|
// TDC variables:
|
1306 |
|
|
Int_t TDClast=4095; // no signal --> TDC ch=4095
|
1307 |
|
|
Int_t TDCint[48];
|
1308 |
|
|
Float_t tdc[48],tdc1[48],tdcpmt[48];
|
1309 |
|
|
for(Int_t i=0; i<48; i++) {
|
1310 |
|
|
tdcpmt[i] = 1000.;
|
1311 |
|
|
tdc[i] = 0.; // 18-oct WM
|
1312 |
|
|
tdc1[i] = 0.; // 18-oct WM
|
1313 |
|
|
}
|
1314 |
|
|
|
1315 |
|
|
Float_t thresh=10.; // to be defined better... (Wolfgang)
|
1316 |
|
|
|
1317 |
|
|
// === TDC: simulate timing for each paddle
|
1318 |
silvio |
1.5 |
//Float_t dt1 = 285.e-12 ; // single PMT resolution
|
1319 |
|
|
Float_t dt1 = 425.e-12 ; // single PMT resolution (WM, Nov'07)
|
1320 |
orsi |
1.4 |
Float_t tdcres[50],c1_S[50],c2_S[50],c3_S[50];
|
1321 |
|
|
for(Int_t j=0;j<48;j++) tdcres[j] = 50.E-12; // TDC resolution 50 picosec
|
1322 |
|
|
for(Int_t j=0;j<48;j++) c1_S[j] = 500.; // cable length in channels
|
1323 |
|
|
for(Int_t j=0;j<48;j++) c2_S[j] = 0.;
|
1324 |
|
|
for(Int_t j=0;j<48;j++) c3_S[j] = 1000.;
|
1325 |
|
|
for(Int_t j=0;j<48;j++) c1_S[j] = c1_S[j]*tdcres[j]; // cable length in sec
|
1326 |
|
|
for(Int_t j=0;j<48;j++) c2_S[j] = c2_S[j]*tdcres[j];
|
1327 |
|
|
// ih = 0 + i1; // not used?? (Silvio)
|
1328 |
|
|
|
1329 |
|
|
/* ********************************** start loop over hits */
|
1330 |
|
|
|
1331 |
|
|
for(Int_t nh=0; nh<Nthtof; nh++){
|
1332 |
|
|
|
1333 |
|
|
Float_t s_l_g[6] = {8.0, 8.0, 20.9, 22.0, 9.8, 8.3 }; // length of the lightguide
|
1334 |
|
|
Float_t t1,t2,veff,veff1,veff0 ;
|
1335 |
|
|
veff0 = 100.*1.0e8 ; // light velocity in the scintillator in m/sec
|
1336 |
|
|
veff1 = 100.*1.5e8; // light velocity in the lightguide in m/sec
|
1337 |
|
|
veff=veff0; // signal velocity in the paddle
|
1338 |
|
|
|
1339 |
|
|
t1 = Timetof[nh] ; // Start
|
1340 |
|
|
t2 = Timetof[nh] ;
|
1341 |
|
|
|
1342 |
|
|
// Donatella: redefinition plane and pad for vectors in C
|
1343 |
|
|
ip = Ipltof[nh]-1;
|
1344 |
|
|
ipad = Ipaddle[nh]-1;
|
1345 |
|
|
pmtleft=0;
|
1346 |
|
|
pmtright=0;
|
1347 |
silvio |
1.5 |
|
1348 |
|
|
// WM: S12 paddles are "reversed" (Nov'07)
|
1349 |
|
|
if (ip==2)
|
1350 |
|
|
if (ipad==0)
|
1351 |
|
|
ipad=1;
|
1352 |
|
|
else
|
1353 |
|
|
ipad=0;
|
1354 |
|
|
|
1355 |
silvio |
1.6 |
if (ip<6) {
|
1356 |
orsi |
1.4 |
Paddle2Pmt(ip, ipad, &pmtleft, &pmtright);
|
1357 |
|
|
|
1358 |
|
|
// DC: evaluates mean position and path inside the paddle
|
1359 |
|
|
|
1360 |
|
|
Float_t tpos=0.;
|
1361 |
|
|
Float_t path[2] = {0., 0.};
|
1362 |
|
|
//--- Strip in Y = S11,S22,S31 ------
|
1363 |
|
|
if(ip==0 || ip==3 || ip==4)
|
1364 |
|
|
tpos = (Yintof[nh]+Youttof[nh])/2.;
|
1365 |
|
|
else
|
1366 |
silvio |
1.5 |
if(ip==1 || ip==2 || ip==5) //--- Strip in X for S12,S21,S32
|
1367 |
orsi |
1.4 |
tpos = (Xintof[nh]+Xouttof[nh])/2.;
|
1368 |
|
|
else //if (ip!=6)
|
1369 |
|
|
printf("*** WARNING TOF: this option should never occur! (ip=%2i, nh=%2i)\n",ip,nh);
|
1370 |
|
|
|
1371 |
|
|
path[0]= tpos + dimel[ip]/2.; // path to left PMT
|
1372 |
|
|
path[1]= dimel[ip]/2.- tpos; // path to right PMT
|
1373 |
|
|
|
1374 |
|
|
// cout <<"Strip N. ="<< ipaddle <<" piano n.= "<< iplane <<" POSIZ = "<< tpos <<"\n";
|
1375 |
|
|
|
1376 |
|
|
if (DEBUG) {
|
1377 |
|
|
cout <<" plane "<<ip<<" strip # ="<< ipad <<" tpos "<< tpos <<"\n";
|
1378 |
|
|
cout <<"pmtleft, pmtright "<<pmtleft<<" "<<pmtright<<endl;
|
1379 |
|
|
}
|
1380 |
|
|
|
1381 |
silvio |
1.5 |
// constant geometric factor, the rest is handled by the scaling factor
|
1382 |
orsi |
1.4 |
FGeo[0] =0.5;
|
1383 |
|
|
FGeo[1] =0.5;
|
1384 |
silvio |
1.5 |
// FGeo[1] = atan(path[1]/dimes[ip])/6.28318; // fraction of photons toward left
|
1385 |
|
|
// FGeo[2] = atan(path[2]/dimes[ip])/6.28318; // toward right
|
1386 |
orsi |
1.4 |
|
1387 |
|
|
|
1388 |
|
|
// Npho = Poisson(ERELTOF[nh])*Pho_keV*1e6 Poissonian fluctuations to be inserted-DC
|
1389 |
|
|
Npho = Ereltof[nh]*Pho_keV*1.0e6; // Eloss in GeV
|
1390 |
|
|
|
1391 |
|
|
Float_t knorm[2]={0., 0.}; // Donatella
|
1392 |
|
|
Float_t Atten[2]={0., 0.}; // Donatella
|
1393 |
|
|
for(Int_t j=0; j<2; j++){
|
1394 |
silvio |
1.5 |
QhitPad_pC[j]= Npho*FGeo[j]*effi*pmGain*echarge*1.E12*ScaleFact[pmtleft+j];
|
1395 |
orsi |
1.4 |
// WM
|
1396 |
|
|
knorm[j]=atte1[pmtleft+j]*exp(lambda1[pmtleft+j]*dimel[ip]/2.*pow(-1,j+1)) +
|
1397 |
|
|
atte2[pmtleft+j]*exp(lambda2[pmtleft+j]*dimel[ip]/2.*pow(-1,j+1));
|
1398 |
|
|
Atten[j]=atte1[pmtleft+j]*exp(tpos*lambda1[pmtleft+j]) +
|
1399 |
|
|
atte2[pmtleft+j]*exp(tpos*lambda2[pmtleft+j]) ;
|
1400 |
|
|
QhitPmt_pC[j]= QhitPad_pC[j]*Atten[j]/knorm[j];
|
1401 |
|
|
// QhitPmt_pC[j]= QhitPad_pC[j]; //no attenuation
|
1402 |
|
|
|
1403 |
|
|
|
1404 |
|
|
if (DEBUG) {
|
1405 |
|
|
cout<<"pmtleft "<<pmtleft<<" j "<<j<<endl;
|
1406 |
|
|
cout<<" atte1 "<<atte1[pmtleft+j]<<"lambda1 "<<lambda1[pmtleft+j]<<" atte2 "<<atte2[pmtleft+j]<<"lambda2 "<<lambda2[pmtleft+j] <<endl;
|
1407 |
|
|
cout<<j<<" tpos "<<tpos<<" knorm "<<knorm[j]<<" "<<Atten[j]<<" "<<"QhitPmt_pC "<<QhitPmt_pC[j]<<endl;
|
1408 |
|
|
}
|
1409 |
|
|
}
|
1410 |
|
|
|
1411 |
|
|
if (DEBUG)
|
1412 |
|
|
cout<<"Npho "<<Npho<<" QhitPmt_pC "<<QhitPmt_pC[0]<<" "<<QhitPmt_pC[1]<<endl;
|
1413 |
|
|
|
1414 |
|
|
QevePmt_pC[pmtleft] += QhitPmt_pC[0];
|
1415 |
|
|
QevePmt_pC[pmtright] += QhitPmt_pC[1];
|
1416 |
|
|
|
1417 |
|
|
// TDC
|
1418 |
silvio |
1.5 |
// WM right and left <->
|
1419 |
|
|
// t2 = t2 + fabs(path[0]/veff) + s_l_g[ip]/veff1 ; // Signal reaches PMT
|
1420 |
|
|
// t1 = t1 + fabs(path[1]/veff) + s_l_g[ip]/veff1;
|
1421 |
orsi |
1.4 |
|
1422 |
|
|
t1 = t1 + fabs(path[0]/veff) + s_l_g[ip]/veff1;
|
1423 |
|
|
t2 = t2 + fabs(path[1]/veff) + s_l_g[ip]/veff1 ; // Signal reaches PMT
|
1424 |
|
|
|
1425 |
silvio |
1.5 |
t1 = gRandom->Gaus(t1,dt1); //apply gaussian error dt
|
1426 |
|
|
t2 = gRandom->Gaus(t2,dt1); //apply gaussian error dt
|
1427 |
orsi |
1.4 |
|
1428 |
|
|
t1 = t1 + c1_S[pmtleft] ; // Signal reaches Discriminator ,TDC starts to run
|
1429 |
|
|
t2 = t2 + c1_S[pmtright] ;
|
1430 |
|
|
|
1431 |
|
|
// check if signal is above threshold
|
1432 |
|
|
// then check if tdcpmt is already filled by another hit...
|
1433 |
|
|
// only re-fill if time is smaller
|
1434 |
|
|
|
1435 |
|
|
if (QhitPmt_pC[0] > thresh) {
|
1436 |
|
|
if (tdcpmt[pmtleft] == 1000.) { // fill for the first time
|
1437 |
|
|
tdcpmt[pmtleft] = t1;
|
1438 |
|
|
tdc[pmtleft] = t1 + c2_S[pmtleft] ; // Signal reaches Coincidence
|
1439 |
|
|
}
|
1440 |
|
|
if (tdcpmt[pmtleft] < 1000.) // is already filled!
|
1441 |
|
|
if (t1 < tdcpmt[pmtleft]) {
|
1442 |
|
|
tdcpmt[pmtleft] = t1;
|
1443 |
|
|
t1 = t1 + c2_S[pmtleft] ; // Signal reaches Coincidence
|
1444 |
|
|
tdc[pmtleft] = t1;
|
1445 |
|
|
}
|
1446 |
|
|
}
|
1447 |
|
|
if (QhitPmt_pC[1] > thresh) {
|
1448 |
|
|
if (tdcpmt[pmtright] == 1000.) { // fill for the first time
|
1449 |
|
|
tdcpmt[pmtright] = t2;
|
1450 |
|
|
tdc[pmtright] = t2 + c2_S[pmtright] ; // Signal reaches Coincidence
|
1451 |
|
|
}
|
1452 |
|
|
if (tdcpmt[pmtright] < 1000.) // is already filled!
|
1453 |
|
|
if (t2 < tdcpmt[pmtright]) {
|
1454 |
|
|
tdcpmt[pmtright] = t2;
|
1455 |
|
|
t2 = t2 + c2_S[pmtright] ;
|
1456 |
|
|
tdc[pmtright] = t2;
|
1457 |
|
|
}
|
1458 |
|
|
}
|
1459 |
|
|
|
1460 |
|
|
if (DEBUG)
|
1461 |
|
|
cout<<nh<<" "<<Timetof[nh]<<" "<<t1<<" "<<t2<<endl;
|
1462 |
|
|
|
1463 |
|
|
} // ip < 6
|
1464 |
|
|
|
1465 |
|
|
}; // **************************************** end loop over hits
|
1466 |
|
|
|
1467 |
|
|
// ====== ADC ======
|
1468 |
|
|
|
1469 |
silvio |
1.5 |
for(Int_t i=0; i<48; i++){
|
1470 |
|
|
if (QevePmt_pC[i] < 800.) ADCtof[i]= (Int_t)(ADC_pC0A + ADC_pC1A*QevePmt_pC[i] + ADC_pC2A*pow(QevePmt_pC[i],2) + ADC_pC3A*pow(QevePmt_pC[i],3));
|
1471 |
|
|
if (QevePmt_pC[i] > 800.) ADCtof[i]= (Int_t)(ADC_pC0B + ADC_pC1B*QevePmt_pC[i] + ADC_pC2B*pow(QevePmt_pC[i],2) + ADC_pC3B*pow(QevePmt_pC[i],3));
|
1472 |
|
|
if (QevePmt_pC[i] > 2485.) ADCtof[i]= (Int_t)(1758. + 0.54*QevePmt_pC[i]); //assuming a fictional 0.54 ch/pC above ADCsat
|
1473 |
|
|
if (ADCtof[i]>ADCsat) ADCtof[i]=ADCsat;
|
1474 |
|
|
if (QevePmt_pC[i] < pCthres) ADCtof[i]= ADClast;
|
1475 |
|
|
if (ADCtof[i] < 0) ADCtof[i]=ADClast;
|
1476 |
|
|
if (ADCtof[i] > ADClast) ADCtof[i]=ADClast;
|
1477 |
|
|
}
|
1478 |
orsi |
1.4 |
|
1479 |
silvio |
1.5 |
// for(Int_t i=0; i<48; i++){
|
1480 |
|
|
// if(QevePmt_pC[i] >= pCthres){
|
1481 |
|
|
// ADCtof[i]= (Int_t)(ADC_pC0 + ADC_pC1*QevePmt_pC[i] + ADC_pC2*pow(QevePmt_pC[i],2) + ADC_pC3*pow(QevePmt_pC[i],3));
|
1482 |
|
|
// } else
|
1483 |
|
|
// ADCtof[i]= ADClast;
|
1484 |
|
|
// }
|
1485 |
|
|
|
1486 |
|
|
// // ---- introduce scale factors to tune simul ADC to real data 24-oct DC
|
1487 |
|
|
|
1488 |
|
|
// for(Int_t i=0; i<48; i++){
|
1489 |
|
|
// if(ADCtof[i] != ADClast){
|
1490 |
|
|
// // printf("%3d, %4d, %4.2f\n",i, ADCtof[i],ScaleFact[i]);
|
1491 |
|
|
// ADCtof[i]= Int_t (ADCtof[i]*ScaleFact[i]);
|
1492 |
|
|
// // printf("%3d, %4d,\n",i, ADCtof[i]);
|
1493 |
|
|
// }
|
1494 |
|
|
// }
|
1495 |
|
|
|
1496 |
|
|
// for(Int_t i=0; i<48; i++){
|
1497 |
|
|
// if(ADCtof[i] != ADClast){
|
1498 |
|
|
// if(ADCtof[i]> ADCsat) ADCtof[i]=ADCsat;
|
1499 |
|
|
// else if(ADCtof[i]< 0) ADCtof[i]=ADClast;
|
1500 |
|
|
// }
|
1501 |
|
|
// }
|
1502 |
orsi |
1.4 |
|
1503 |
|
|
|
1504 |
silvio |
1.5 |
// ====== build TDC coincidence ======
|
1505 |
orsi |
1.4 |
|
1506 |
|
|
Float_t t_coinc = 0;
|
1507 |
|
|
Int_t ilast = 100;
|
1508 |
|
|
for (Int_t ii=0; ii<48;ii++)
|
1509 |
|
|
if (tdc[ii] > t_coinc) {
|
1510 |
|
|
t_coinc = tdc[ii];
|
1511 |
|
|
ilast = ii;
|
1512 |
|
|
}
|
1513 |
|
|
|
1514 |
|
|
// cout<<ilast<<" "<<t_coinc<<endl;
|
1515 |
|
|
// At t_coinc trigger condition is fulfilled
|
1516 |
|
|
|
1517 |
|
|
for (Int_t ii=0; ii<48;ii++){
|
1518 |
|
|
// if (tdc[ii] != 0) tdc1[ii] = t_coinc - tdc[ii]; // test 1
|
1519 |
|
|
if (tdc[ii] != 0) tdc1[ii] = t_coinc - tdcpmt[ii]; // test 2
|
1520 |
|
|
tdc1[ii] = tdc1[ii]/tdcres[ii]; // divide by TDC resolution
|
1521 |
|
|
if (tdc[ii] != 0) tdc1[ii] = tdc1[ii] + c3_S[ii]; // add cable length c3
|
1522 |
|
|
} // missing parenthesis inserted! (Silvio)
|
1523 |
|
|
|
1524 |
|
|
for(Int_t i=0; i<48; i++){
|
1525 |
|
|
if(tdc1[i] != 0.){
|
1526 |
|
|
TDCint[i]=(Int_t)tdc1[i];
|
1527 |
|
|
if (TDCint[i]>4093) TDCint[i]=TDClast; // 18-oct WM
|
1528 |
|
|
if (DEBUG)
|
1529 |
|
|
cout<<i<<" "<<TDCint[i]<<endl;
|
1530 |
|
|
//ADC[i]= ADC_pC * QevePmt_pC[i] + ADCoffset;
|
1531 |
|
|
//if(ADC[i]> ADClast) ADC[i]=ADClast;
|
1532 |
|
|
} else
|
1533 |
|
|
TDCint[i]= TDClast;
|
1534 |
|
|
}
|
1535 |
|
|
|
1536 |
|
|
if (DEBUG)
|
1537 |
|
|
cout<<"-----------"<<endl;
|
1538 |
|
|
|
1539 |
|
|
|
1540 |
silvio |
1.6 |
//------ use channelmap for ToF: 18-oct WM
|
1541 |
orsi |
1.4 |
|
1542 |
silvio |
1.5 |
Int_t channelmap[] = {3,21,11,29,19,45,27,37,36,28,44,20,5,12,13,4,
|
1543 |
silvio |
1.6 |
6,47,14,39,22,31,30,23,38,15,46,7,0,33,16,24,
|
1544 |
|
|
8,41,32,40,25,17,34,9,42,1,2,10,18,26,35,43};
|
1545 |
orsi |
1.4 |
|
1546 |
|
|
Int_t ADChelp[48];
|
1547 |
|
|
Int_t TDChelp[48];
|
1548 |
|
|
|
1549 |
|
|
for(Int_t i=0; i<48; i++){
|
1550 |
silvio |
1.5 |
Int_t ii=channelmap[i];
|
1551 |
|
|
ADChelp[ii]= ADCtof[i];
|
1552 |
|
|
TDChelp[ii]= TDCint[i];
|
1553 |
|
|
}
|
1554 |
orsi |
1.4 |
|
1555 |
|
|
for(Int_t i=0; i<48; i++){
|
1556 |
silvio |
1.5 |
ADCtof[i]= ADChelp[i];
|
1557 |
|
|
TDCint[i]= TDChelp[i];
|
1558 |
|
|
}
|
1559 |
orsi |
1.4 |
|
1560 |
|
|
|
1561 |
silvio |
1.6 |
// ====== write fDataTof =======
|
1562 |
orsi |
1.4 |
|
1563 |
|
|
|
1564 |
silvio |
1.6 |
// UChar_t tdcadd[8]={1,0,3,2,5,4,7,6}; (coded in 3 bit)
|
1565 |
orsi |
1.4 |
UChar_t Ctrl3bit[8]={32,0,96,64,160,128,224,192}; // DC (msb in 8 bit word )
|
1566 |
|
|
|
1567 |
|
|
UChar_t tofBin;
|
1568 |
|
|
for (Int_t j=0; j < 12; j++){ // loop on TDC #12
|
1569 |
|
|
Int_t j12=j*23; // for each TDC 23 bytes (8 bits)
|
1570 |
|
|
fDataTof[j12+0]=0x00; // TDC_ID
|
1571 |
|
|
fDataTof[j12+1]=0x00; // EV_COUNT
|
1572 |
|
|
fDataTof[j12+2]=0x00; // TDC_MASK (1)
|
1573 |
|
|
fDataTof[j12+3]=0x00; // TDC_MASK (2)
|
1574 |
|
|
for (Int_t k=0; k < 4; k++){ // for each TDC 4 channels (ADC+TDC)
|
1575 |
|
|
|
1576 |
|
|
Int_t jk12=j12+4*k; // ADC,TDC channel (0-47)
|
1577 |
|
|
|
1578 |
|
|
tofBin =(UChar_t)(ADCtof[k+4*j]/256); // ADC# (msb)
|
1579 |
|
|
fDataTof[jk12+4] = Bin2GrayTof(tofBin,fDataTof[jk12+4]);
|
1580 |
|
|
/* control bits inserted here, after the bin to gray conv - DC*/
|
1581 |
|
|
fDataTof[jk12+4] = Ctrl3bit[2*k] | fDataTof[jk12+4];
|
1582 |
|
|
tofBin=(UChar_t)(ADCtof[k+4*j]%256); // ADC# (lsb)
|
1583 |
|
|
fDataTof[jk12+5] = Bin2GrayTof(tofBin,fDataTof[jk12+5]);
|
1584 |
|
|
tofBin=(UChar_t)(TDCint[k+4*j]/256); // TDC# (msb)
|
1585 |
|
|
fDataTof[jk12+6]=Bin2GrayTof(tofBin,fDataTof[jk12+6]);
|
1586 |
|
|
/* control bits inserted here, after the bin to gray conv - DC*/
|
1587 |
|
|
fDataTof[jk12+6] = Ctrl3bit[2*k+1] | fDataTof[jk12+6];
|
1588 |
|
|
tofBin=(UChar_t)(TDCint[k+4*j]%256); // TDC# (lsb)
|
1589 |
|
|
fDataTof[jk12+7]=Bin2GrayTof(tofBin,fDataTof[jk12+7]);
|
1590 |
|
|
};
|
1591 |
|
|
fDataTof[j12+20]=0x00; // TEMP1
|
1592 |
|
|
fDataTof[j12+21]=0x00; // TEMP2
|
1593 |
|
|
fDataTof[j12+22]= EvaluateCrcTof(pTof); // CRC
|
1594 |
|
|
pTof+=23;
|
1595 |
|
|
};
|
1596 |
silvio |
1.6 |
|
1597 |
|
|
// ====== evaluate trigger variables =======
|
1598 |
|
|
|
1599 |
|
|
//fDataTrigger: 152 bytes (corrected 30/11/'07 SO - it was 153)
|
1600 |
|
|
|
1601 |
|
|
// initialization:
|
1602 |
|
|
for (Int_t j=0; j < 152; j++)
|
1603 |
|
|
fDataTrigger[j]=0x00;
|
1604 |
|
|
UChar_t *pTrg=fDataTrigger;
|
1605 |
|
|
|
1606 |
|
|
// Only the variables with a (*) are modified; the others are set to 0
|
1607 |
|
|
// info given in #bites data + #bites crc
|
1608 |
|
|
// TB_READ_PMT_PLANE : 6 + 1
|
1609 |
|
|
// TB_READ_EVENT_COUNT : 3 + 1 (*)
|
1610 |
|
|
// TB_READ_TRIGGER_RATE : 12 + 1
|
1611 |
|
|
// TB_READ_D_L_TIME : 4 + 1
|
1612 |
|
|
// TB_READ_S4_CAL_COUNT : 4 + 1
|
1613 |
|
|
// TB_READ_PMT_COUNT1 : 48 + 1
|
1614 |
|
|
// TB_READ_PMT_COUNT2 : 48 + 1
|
1615 |
|
|
// TB_READ_PATTERN_BUSY : 8 + 1
|
1616 |
|
|
// TB_READ_PATTERN_TRIGGER: 7 + 1 (*)
|
1617 |
|
|
// TB_READ_TRIGGER_CONF : 2 + 1 (*)
|
1618 |
|
|
|
1619 |
|
|
// TB_READ_EVENT_COUNT
|
1620 |
|
|
fhBookTree->SetBranchStatus("Ievnt",&Ievnt);
|
1621 |
|
|
UInt_t cTrg = (UInt_t)Ievnt; //counter
|
1622 |
|
|
UInt_t cTrg2 = 0; //counter with bits inverted, according to document
|
1623 |
|
|
//"formato dati provenienti dalla trigger board"
|
1624 |
|
|
for (Int_t i=0; i < 24; i++){ // Use the first 24 bits
|
1625 |
|
|
if (cTrg & (0x1 << i) )
|
1626 |
|
|
cTrg2 = cTrg2 | (0x1 << (24-i));
|
1627 |
|
|
};
|
1628 |
|
|
fDataTrigger[7] = (UChar_t)(cTrg2 >> 16); // 8 MSbits (out of 24)
|
1629 |
|
|
fDataTrigger[8] = (UChar_t)(cTrg2 >> 8); // 8 "middle" bits
|
1630 |
|
|
fDataTrigger[9] = (UChar_t)(cTrg2); // 8 LSbits
|
1631 |
|
|
pTrg=fDataTrigger+7;
|
1632 |
|
|
fDataTrigger[10]=EvaluateCrcTrigger(pTrg, 3);
|
1633 |
|
|
|
1634 |
|
|
// TB_READ_PATTERN_TRIGGER: bytes 141-148:
|
1635 |
|
|
// PatternTrigMap[i] corresponds to bit i in TB_READ_PATTERN_TRIGGER:
|
1636 |
|
|
// mapping according to documents:
|
1637 |
|
|
// 1. "formato dati provenienti dalla trigger board"
|
1638 |
|
|
// 2. "The ToF quicklook software", Appendix A (Campana, Nagni)
|
1639 |
|
|
Int_t PatternTrigMap[]={29,42,43,1,16,7,17,28,33,41,46,2,15,8,18,27,
|
1640 |
|
|
30,40,44,3,14,9,19,26,32,37,47,4,13,10,20,25,
|
1641 |
|
|
34,31,38,45,5,12,21,24,36,35,39,48,6,11,22,23};
|
1642 |
|
|
|
1643 |
|
|
for (Int_t i=0; i < 48; i++)
|
1644 |
|
|
//if (ADCtof[i]>thrTrg)
|
1645 |
|
|
if (tdc1[channelmap[i]]!=0)
|
1646 |
|
|
fDataTrigger[147-(Int_t)((PatternTrigMap[i]+1)/8)]=fDataTrigger[147-(Int_t)((PatternTrigMap[i]+1)/8)] | (0x1 << (PatternTrigMap[i]%8));
|
1647 |
|
|
pTrg=fDataTrigger+141;
|
1648 |
|
|
fDataTrigger[148]=EvaluateCrcTrigger(pTrg, 7);
|
1649 |
|
|
|
1650 |
|
|
// TB_READ_TRIGGER_CONF : set always acq.mode TOF4
|
1651 |
|
|
//
|
1652 |
|
|
// TOF1: S1-S2-S3 (&,|)
|
1653 |
|
|
// TOF4: S2-S3 (&,&)
|
1654 |
|
|
fDataTrigger[149]=0x02;
|
1655 |
|
|
fDataTrigger[150]=0x0;
|
1656 |
|
|
pTrg=fDataTrigger+149;
|
1657 |
|
|
fDataTrigger[151]=EvaluateCrcTrigger(pTrg, 2);
|
1658 |
|
|
|
1659 |
orsi |
1.4 |
return(0);
|
1660 |
|
|
};
|
1661 |
|
|
|
1662 |
|
|
|
1663 |
|
|
UChar_t Digitizer::Bin2GrayTof(UChar_t binaTOF,UChar_t grayTOF){
|
1664 |
|
|
union graytof_data {
|
1665 |
|
|
UChar_t word;
|
1666 |
|
|
struct bit_field {
|
1667 |
|
|
unsigned b0:1;
|
1668 |
|
|
unsigned b1:1;
|
1669 |
|
|
unsigned b2:1;
|
1670 |
|
|
unsigned b3:1;
|
1671 |
|
|
unsigned b4:1;
|
1672 |
|
|
unsigned b5:1;
|
1673 |
|
|
unsigned b6:1;
|
1674 |
|
|
unsigned b7:1;
|
1675 |
|
|
} bit;
|
1676 |
|
|
} bi,gr;
|
1677 |
|
|
//
|
1678 |
|
|
bi.word = binaTOF;
|
1679 |
|
|
gr.word = grayTOF;
|
1680 |
|
|
//
|
1681 |
|
|
gr.bit.b0 = bi.bit.b1 ^ bi.bit.b0;
|
1682 |
|
|
gr.bit.b1 = bi.bit.b2 ^ bi.bit.b1;
|
1683 |
|
|
gr.bit.b2 = bi.bit.b3 ^ bi.bit.b2;
|
1684 |
|
|
gr.bit.b3 = bi.bit.b3;
|
1685 |
|
|
//
|
1686 |
|
|
/* bin to gray conversion 4 bit per time*/
|
1687 |
|
|
//
|
1688 |
|
|
gr.bit.b4 = bi.bit.b5 ^ bi.bit.b4;
|
1689 |
|
|
gr.bit.b5 = bi.bit.b6 ^ bi.bit.b5;
|
1690 |
|
|
gr.bit.b6 = bi.bit.b7 ^ bi.bit.b6;
|
1691 |
|
|
gr.bit.b7 = bi.bit.b7;
|
1692 |
|
|
//
|
1693 |
|
|
return(gr.word);
|
1694 |
|
|
}
|
1695 |
|
|
|
1696 |
|
|
UChar_t Digitizer::EvaluateCrcTof(UChar_t *pTof) {
|
1697 |
|
|
Bool_t DEBUG=false;
|
1698 |
|
|
if (DEBUG)
|
1699 |
|
|
return(0x00);
|
1700 |
|
|
|
1701 |
|
|
UChar_t crcTof=0x00;
|
1702 |
|
|
UChar_t *pc=&crcTof, *pc2;
|
1703 |
|
|
pc2=pTof;
|
1704 |
|
|
for (Int_t jp=0; jp < 23; jp++){
|
1705 |
|
|
//crcTof = crc8(...)
|
1706 |
|
|
Crc8Tof(pc2++,pc);
|
1707 |
|
|
// printf("%2i --- %x\n",jp,crcTof);
|
1708 |
|
|
}
|
1709 |
|
|
return(crcTof);
|
1710 |
|
|
}
|
1711 |
|
|
|
1712 |
silvio |
1.6 |
UChar_t Digitizer::EvaluateCrcTrigger(UChar_t *pTrg, Int_t nb) {
|
1713 |
|
|
Bool_t DEBUG=false;
|
1714 |
|
|
if (DEBUG)
|
1715 |
|
|
return(0x00);
|
1716 |
|
|
|
1717 |
|
|
UChar_t crcTrg=0x00;
|
1718 |
|
|
UChar_t *pc=&crcTrg, *pc2;
|
1719 |
|
|
pc2=pTrg;
|
1720 |
|
|
for (Int_t jp=0; jp < nb; jp++)
|
1721 |
|
|
Crc8Tof(pc2++,pc);
|
1722 |
|
|
return(crcTrg);
|
1723 |
|
|
}
|
1724 |
|
|
|
1725 |
orsi |
1.4 |
void Digitizer::Crc8Tof(UChar_t *oldCRC, UChar_t *crcTof){
|
1726 |
|
|
union crctof_data {
|
1727 |
|
|
UChar_t word;
|
1728 |
|
|
struct bit_field {
|
1729 |
|
|
unsigned b0:1;
|
1730 |
|
|
unsigned b1:1;
|
1731 |
|
|
unsigned b2:1;
|
1732 |
|
|
unsigned b3:1;
|
1733 |
|
|
unsigned b4:1;
|
1734 |
|
|
unsigned b5:1;
|
1735 |
|
|
unsigned b6:1;
|
1736 |
|
|
unsigned b7:1;
|
1737 |
|
|
} bit;
|
1738 |
|
|
} c,d,r;
|
1739 |
|
|
|
1740 |
|
|
c.word = *oldCRC;
|
1741 |
|
|
//d.word = *newCRC;
|
1742 |
|
|
d.word = *crcTof;
|
1743 |
|
|
r.word = 0;
|
1744 |
|
|
|
1745 |
|
|
r.bit.b0 = c.bit.b7 ^ c.bit.b6 ^ c.bit.b0 ^
|
1746 |
|
|
d.bit.b0 ^ d.bit.b6 ^ d.bit.b7;
|
1747 |
|
|
|
1748 |
|
|
r.bit.b1 = c.bit.b6 ^ c.bit.b1 ^ c.bit.b0 ^
|
1749 |
|
|
d.bit.b0 ^ d.bit.b1 ^ d.bit.b6;
|
1750 |
|
|
|
1751 |
|
|
r.bit.b2 = c.bit.b6 ^ c.bit.b2 ^ c.bit.b1 ^ c.bit.b0 ^
|
1752 |
|
|
d.bit.b0 ^ d.bit.b1 ^ d.bit.b2 ^ d.bit.b6;
|
1753 |
|
|
|
1754 |
|
|
r.bit.b3 = c.bit.b7 ^ c.bit.b3 ^ c.bit.b2 ^ c.bit.b1 ^
|
1755 |
|
|
d.bit.b1 ^ d.bit.b2 ^ d.bit.b3 ^ d.bit.b7;
|
1756 |
|
|
|
1757 |
|
|
r.bit.b4 = c.bit.b4 ^ c.bit.b3 ^ c.bit.b2 ^
|
1758 |
|
|
d.bit.b2 ^ d.bit.b3 ^ d.bit.b4;
|
1759 |
|
|
|
1760 |
|
|
r.bit.b5 = c.bit.b5 ^ c.bit.b4 ^ c.bit.b3 ^
|
1761 |
|
|
d.bit.b3 ^ d.bit.b4 ^ d.bit.b5;
|
1762 |
|
|
|
1763 |
|
|
r.bit.b6 = c.bit.b6 ^ c.bit.b5 ^ c.bit.b4 ^
|
1764 |
|
|
d.bit.b4 ^ d.bit.b5 ^ d.bit.b6;
|
1765 |
|
|
|
1766 |
|
|
r.bit.b7 = c.bit.b7 ^ c.bit.b6 ^ c.bit.b5 ^
|
1767 |
|
|
d.bit.b5 ^ d.bit.b6 ^ d.bit.b7 ;
|
1768 |
|
|
|
1769 |
|
|
*crcTof=r.word;
|
1770 |
|
|
//return r.word;
|
1771 |
|
|
};
|
1772 |
|
|
|
1773 |
|
|
//void Digitizer::Paddle2Pmt(Int_t plane, Int_t paddle, Int_t* &pmtleft, Int_t* &pmtright){
|
1774 |
|
|
void Digitizer::Paddle2Pmt(Int_t plane, Int_t paddle, Int_t *pl, Int_t *pr){
|
1775 |
|
|
//* @param plane (0 - 5)
|
1776 |
|
|
//* @param paddle (plane=0, paddle = 0,...5)
|
1777 |
|
|
//* @param padid (0 - 23)
|
1778 |
|
|
//
|
1779 |
|
|
Int_t padid=-1;
|
1780 |
|
|
Int_t pads[6]={8,6,2,2,3,3};
|
1781 |
|
|
//
|
1782 |
|
|
Int_t somma=0;
|
1783 |
|
|
Int_t np=plane;
|
1784 |
|
|
for(Int_t j=0; j<np; j++)
|
1785 |
|
|
somma+=pads[j];
|
1786 |
|
|
padid=paddle+somma;
|
1787 |
|
|
*pl = padid*2;
|
1788 |
|
|
// *pr = *pr + 1;
|
1789 |
|
|
*pr = *pl + 1; // WM
|
1790 |
|
|
};
|
1791 |
|
|
|
1792 |
|
|
void Digitizer::DigitizeAC() {
|
1793 |
|
|
// created: J. Conrad, KTH
|
1794 |
|
|
// modified: S. Orsi, INFN Roma2
|
1795 |
|
|
// fDataAC[0-63]: main AC board
|
1796 |
silvio |
1.6 |
// fDataAC[64-127]: extra AC board (identical to main board, for now)
|
1797 |
|
|
|
1798 |
|
|
// We activate all branches. Once the digitization algorithm is determined
|
1799 |
|
|
// only the branches that involve needed information will be activated
|
1800 |
|
|
|
1801 |
|
|
fhBookTree->SetBranchStatus("Ievnt",&Ievnt);
|
1802 |
|
|
fhBookTree->SetBranchStatus("Nthcat",1);
|
1803 |
|
|
fhBookTree->SetBranchStatus("Iparcat",1);
|
1804 |
|
|
fhBookTree->SetBranchStatus("Icat",1);
|
1805 |
|
|
fhBookTree->SetBranchStatus("Xincat",1);
|
1806 |
|
|
fhBookTree->SetBranchStatus("Yincat",1);
|
1807 |
|
|
fhBookTree->SetBranchStatus("Zincat",1);
|
1808 |
|
|
fhBookTree->SetBranchStatus("Xoutcat",1);
|
1809 |
|
|
fhBookTree->SetBranchStatus("Youtcat",1);
|
1810 |
|
|
fhBookTree->SetBranchStatus("Zoutcat",1);
|
1811 |
|
|
fhBookTree->SetBranchStatus("Erelcat",1);
|
1812 |
|
|
fhBookTree->SetBranchStatus("Timecat",1);
|
1813 |
|
|
fhBookTree->SetBranchStatus("Pathcat",1);
|
1814 |
|
|
fhBookTree->SetBranchStatus("P0cat",1);
|
1815 |
|
|
fhBookTree->SetBranchStatus("Nthcas",1);
|
1816 |
|
|
fhBookTree->SetBranchStatus("Iparcas",1);
|
1817 |
|
|
fhBookTree->SetBranchStatus("Icas",1);
|
1818 |
|
|
fhBookTree->SetBranchStatus("Xincas",1);
|
1819 |
|
|
fhBookTree->SetBranchStatus("Yincas",1);
|
1820 |
|
|
fhBookTree->SetBranchStatus("Zincas",1);
|
1821 |
|
|
fhBookTree->SetBranchStatus("Xoutcas",1);
|
1822 |
|
|
fhBookTree->SetBranchStatus("Youtcas",1);
|
1823 |
|
|
fhBookTree->SetBranchStatus("Zoutcas",1);
|
1824 |
|
|
fhBookTree->SetBranchStatus("Erelcas",1);
|
1825 |
|
|
fhBookTree->SetBranchStatus("Timecas",1);
|
1826 |
|
|
fhBookTree->SetBranchStatus("Pathcas",1);
|
1827 |
|
|
fhBookTree->SetBranchStatus("P0cas",1);
|
1828 |
|
|
fhBookTree->SetBranchStatus("Nthcard",1);
|
1829 |
|
|
fhBookTree->SetBranchStatus("Iparcard",1);
|
1830 |
|
|
fhBookTree->SetBranchStatus("Icard",1);
|
1831 |
|
|
fhBookTree->SetBranchStatus("Xincard",1);
|
1832 |
|
|
fhBookTree->SetBranchStatus("Yincard",1);
|
1833 |
|
|
fhBookTree->SetBranchStatus("Zincard",1);
|
1834 |
|
|
fhBookTree->SetBranchStatus("Xoutcard",1);
|
1835 |
|
|
fhBookTree->SetBranchStatus("Youtcard",1);
|
1836 |
|
|
fhBookTree->SetBranchStatus("Zoutcard",1);
|
1837 |
|
|
fhBookTree->SetBranchStatus("Erelcard",1);
|
1838 |
|
|
fhBookTree->SetBranchStatus("Timecard",1);
|
1839 |
|
|
fhBookTree->SetBranchStatus("Pathcard",1);
|
1840 |
|
|
fhBookTree->SetBranchStatus("P0card",1);
|
1841 |
orsi |
1.4 |
|
1842 |
|
|
fDataAC[0] = 0xACAC;
|
1843 |
|
|
fDataAC[64]= 0xACAC;
|
1844 |
|
|
fDataAC[1] = 0xAC11;
|
1845 |
|
|
fDataAC[65] = 0xAC22;
|
1846 |
|
|
|
1847 |
|
|
// the third word is a status word (dummy: "no errors are present in the AC boards")
|
1848 |
|
|
fDataAC[2] = 0xFFFF; //FFEF?
|
1849 |
|
|
fDataAC[66] = 0xFFFF;
|
1850 |
|
|
|
1851 |
|
|
const UInt_t nReg = 6;
|
1852 |
|
|
|
1853 |
|
|
// FPGA Registers (dummy)
|
1854 |
|
|
for (UInt_t i=0; i<=nReg; i++){
|
1855 |
|
|
fDataAC[i+4] = 0xFFFF;
|
1856 |
|
|
fDataAC[i+68] = 0xFFFF;
|
1857 |
|
|
}
|
1858 |
|
|
|
1859 |
|
|
// the last word is a CRC
|
1860 |
|
|
// Dummy for the time being, but it might need to be calculated in the end
|
1861 |
|
|
fDataAC[63] = 0xABCD;
|
1862 |
|
|
fDataAC[127] = 0xABCD;
|
1863 |
|
|
|
1864 |
|
|
// shift registers (moved to the end of the routine)
|
1865 |
|
|
|
1866 |
silvio |
1.6 |
//Int_t evntLSB=Ievnt%65536;
|
1867 |
|
|
//Int_t evntMSB=(Int_t)(Ievnt/65536);
|
1868 |
|
|
Int_t evntLSB=(UShort_t)Ievnt;
|
1869 |
|
|
Int_t evntMSB=Ievnt >> 16;
|
1870 |
orsi |
1.4 |
|
1871 |
|
|
// singles counters are dummy
|
1872 |
|
|
for (UInt_t i=0; i<=15; i++){ //SO Oct '07: // for (UInt_t i=0; i<=16; i++){
|
1873 |
|
|
// fDataAC[i+26] = 0x0000;
|
1874 |
|
|
// fDataAC[i+90] = 0x0000;
|
1875 |
|
|
fDataAC[i+26] = evntLSB;
|
1876 |
|
|
fDataAC[i+90] = evntLSB;
|
1877 |
|
|
};
|
1878 |
|
|
|
1879 |
|
|
// coincidences are dummy (increment by 1 at each event)
|
1880 |
|
|
// for (UInt_t i=0; i<=7; i++){
|
1881 |
|
|
// fDataAC[i+42] = 0x0000;
|
1882 |
|
|
// fDataAC[i+106] = 0x0000;
|
1883 |
|
|
// }
|
1884 |
|
|
for (UInt_t i=0; i<=7; i++){
|
1885 |
|
|
fDataAC[i+42] = evntLSB;
|
1886 |
|
|
fDataAC[i+106] = evntLSB;
|
1887 |
|
|
};
|
1888 |
|
|
|
1889 |
|
|
// increments for every trigger might be needed at some point.
|
1890 |
|
|
// dummy for now
|
1891 |
|
|
fDataAC[50] = 0x0000;
|
1892 |
|
|
fDataAC[114] = 0x0000;
|
1893 |
|
|
|
1894 |
|
|
// dummy FPGA clock (increment by 1 at each event)
|
1895 |
|
|
/*
|
1896 |
|
|
fDataAC[51] = 0x006C;
|
1897 |
|
|
fDataAC[52] = 0x6C6C;
|
1898 |
|
|
fDataAC[115] = 0x006C;
|
1899 |
|
|
fDataAC[116] = 0x6C6C;
|
1900 |
|
|
*/
|
1901 |
|
|
if (Ievnt<=0xFFFF) {
|
1902 |
|
|
fDataAC[51] = 0x0000;
|
1903 |
|
|
fDataAC[52] = Ievnt;
|
1904 |
|
|
fDataAC[115] = 0x0000;
|
1905 |
|
|
fDataAC[116] = Ievnt;
|
1906 |
|
|
} else {
|
1907 |
|
|
fDataAC[51] = evntMSB;
|
1908 |
|
|
fDataAC[52] = evntLSB;
|
1909 |
|
|
fDataAC[115] = fDataAC[51];
|
1910 |
|
|
fDataAC[116] = fDataAC[52];
|
1911 |
|
|
}
|
1912 |
|
|
|
1913 |
|
|
// dummy temperatures
|
1914 |
|
|
fDataAC[53] = 0x0000;
|
1915 |
|
|
fDataAC[54] = 0x0000;
|
1916 |
|
|
fDataAC[117] = 0x0000;
|
1917 |
|
|
fDataAC[118] = 0x0000;
|
1918 |
|
|
|
1919 |
|
|
|
1920 |
|
|
// dummy DAC thresholds
|
1921 |
|
|
for (UInt_t i=0; i<=7; i++){
|
1922 |
|
|
fDataAC[i+55] = 0x1A13;
|
1923 |
|
|
fDataAC[i+119] = 0x1A13;
|
1924 |
|
|
}
|
1925 |
|
|
|
1926 |
|
|
// In this simpliefied approach we will assume that once
|
1927 |
|
|
// a particle releases > 0.5 mip in one of the 12 AC detectors it
|
1928 |
|
|
// will fire. We will furthermore assume that both cards read out
|
1929 |
|
|
// identical data.
|
1930 |
|
|
|
1931 |
|
|
// If you develop your digitization algorithm, you should start by
|
1932 |
|
|
// identifying the information present in level2 (post-darth-vader)
|
1933 |
|
|
// data.
|
1934 |
|
|
|
1935 |
|
|
Float_t SumEcat[5];
|
1936 |
|
|
Float_t SumEcas[5];
|
1937 |
|
|
Float_t SumEcard[5];
|
1938 |
|
|
for (Int_t k= 0;k<5;k++){
|
1939 |
|
|
SumEcat[k]=0.;
|
1940 |
|
|
SumEcas[k]=0.;
|
1941 |
|
|
SumEcard[k]=0.;
|
1942 |
|
|
};
|
1943 |
|
|
|
1944 |
|
|
if (Nthcat>50 || Nthcas>50 || Nthcard>50)
|
1945 |
|
|
printf("*** ERROR AC! NthAC out of range!\n\n");
|
1946 |
|
|
|
1947 |
|
|
// energy dependence on position (see file AcFitOutputDistancePmt.C by S.Orsi)
|
1948 |
|
|
// based on J.Lundquist's calculations (PhD thesis, page 94)
|
1949 |
|
|
// function: [0]+[1]*atan([2]/(x+1)), where the 3 parameters are:
|
1950 |
|
|
// 8.25470e-01 +- 1.79489e-02
|
1951 |
|
|
// 6.41609e-01 +- 2.65846e-02
|
1952 |
|
|
// 9.81177e+00 +- 1.21284e+00
|
1953 |
|
|
// hp: 1 minimum ionising particle at 35cm from the PMT releases 1mip
|
1954 |
|
|
|
1955 |
silvio |
1.6 |
TF1 *attenAC = new TF1("fAttAC",".825+.64*atan(9.8/x)",0.,45.);
|
1956 |
|
|
|
1957 |
|
|
// PMT positions: x,y,z: (average position of the 2 PMTs)
|
1958 |
|
|
Float_t posCasPmt[4][3]={{28.308, -17.168, 63.644}, // 1 - CAS CPU: x,y,z
|
1959 |
|
|
{18.893, 24.913, 63.644}, // 2 - CAS DCDC
|
1960 |
|
|
{-24.307, 17.162, 63.644}, // 3 - CAS VME
|
1961 |
|
|
{-17.765, -28.300, 63.644}}; // 4 - CAS IPM
|
1962 |
|
|
|
1963 |
|
|
Float_t dAC=0.; // distance from PMT
|
1964 |
|
|
|
1965 |
orsi |
1.4 |
// look in CAT
|
1966 |
|
|
// for (UInt_t k= 0;k<50;k++){
|
1967 |
|
|
for (Int_t k= 0;k<Nthcat;k++){
|
1968 |
|
|
if (Erelcat[k] > 0)
|
1969 |
|
|
SumEcat[Icat[k]] += Erelcat[k];
|
1970 |
|
|
};
|
1971 |
|
|
|
1972 |
|
|
// look in CAS
|
1973 |
|
|
for (Int_t k= 0;k<Nthcas;k++){
|
1974 |
silvio |
1.6 |
if (Erelcas[k] >0) {
|
1975 |
|
|
dAC=sqrt(pow((Xincas[k]+Xoutcas[k])/2 - posCasPmt[Icas[k]-1][0],2) + pow((Yincas[k]+Youtcas[k])/2 - posCasPmt[Icas[k]-1][1],2) + pow((Zincas[k]+Zoutcas[k])/2 - posCasPmt[Icas[k]-1][2],2));
|
1976 |
|
|
SumEcas[Icas[k]] += Erelcas[k]*attenAC->Eval(dAC);
|
1977 |
|
|
}
|
1978 |
orsi |
1.4 |
};
|
1979 |
|
|
|
1980 |
|
|
// look in CARD
|
1981 |
|
|
for (Int_t k= 0;k<Nthcard;k++){
|
1982 |
silvio |
1.6 |
if (Erelcard[k] >0)
|
1983 |
orsi |
1.4 |
SumEcard[Icard[k]] += Erelcard[k];
|
1984 |
|
|
};
|
1985 |
|
|
|
1986 |
|
|
// channel mapping Hit Map
|
1987 |
|
|
// 1 CARD4 0 LSB
|
1988 |
|
|
// 2 CAT2 0
|
1989 |
|
|
// 3 CAS1 0
|
1990 |
|
|
// 4 NC 0
|
1991 |
|
|
// 5 CARD2 0
|
1992 |
|
|
// 6 CAT4 1
|
1993 |
|
|
// 7 CAS4 0
|
1994 |
|
|
// 8 NC 0
|
1995 |
|
|
// 9 CARD3 0
|
1996 |
|
|
// 10 CAT3 0
|
1997 |
|
|
// 11 CAS3 0
|
1998 |
|
|
// 12 NC 0
|
1999 |
|
|
// 13 CARD1 0
|
2000 |
|
|
// 14 CAT1 0
|
2001 |
|
|
// 15 CAS2 0
|
2002 |
|
|
// 16 NC 0 MSB
|
2003 |
|
|
|
2004 |
|
|
// In the first version only the hit-map is filled, not the SR.
|
2005 |
|
|
|
2006 |
|
|
// Threshold: 0.8 MeV.
|
2007 |
|
|
|
2008 |
|
|
Float_t thr = 8e-4;
|
2009 |
|
|
|
2010 |
|
|
fDataAC[3] = 0x0000;
|
2011 |
|
|
|
2012 |
|
|
if (SumEcas[0] > thr) fDataAC[3] = 0x0004;
|
2013 |
|
|
if (SumEcas[1] > thr) fDataAC[3] += 0x4000;
|
2014 |
|
|
if (SumEcas[2] > thr) fDataAC[3] += 0x0400;
|
2015 |
|
|
if (SumEcas[3] > thr) fDataAC[3] += 0x0040;
|
2016 |
|
|
|
2017 |
|
|
if (SumEcat[0] > thr) fDataAC[3] += 0x2000;
|
2018 |
|
|
if (SumEcat[1] > thr) fDataAC[3] += 0x0002;
|
2019 |
|
|
if (SumEcat[2] > thr) fDataAC[3] += 0x0200;
|
2020 |
|
|
if (SumEcat[3] > thr) fDataAC[3] += 0x0020;
|
2021 |
|
|
|
2022 |
|
|
if (SumEcard[0] > thr) fDataAC[3] += 0x1000;
|
2023 |
|
|
if (SumEcard[1] > thr) fDataAC[3] += 0x0010;
|
2024 |
|
|
if (SumEcard[2] > thr) fDataAC[3] += 0x0100;
|
2025 |
|
|
if (SumEcard[3] > thr) fDataAC[3] += 0x0001;
|
2026 |
|
|
|
2027 |
|
|
fDataAC[67] = fDataAC[3];
|
2028 |
|
|
|
2029 |
|
|
// shift registers
|
2030 |
|
|
// the central bin is equal to the hitmap, all other bins in the shift register are 0
|
2031 |
|
|
for (UInt_t i=0; i<=15; i++){
|
2032 |
|
|
fDataAC[i+11] = 0x0000;
|
2033 |
|
|
fDataAC[i+75] = 0x0000;
|
2034 |
|
|
}
|
2035 |
|
|
fDataAC[18] = fDataAC[3];
|
2036 |
|
|
fDataAC[82] = fDataAC[3];
|
2037 |
|
|
|
2038 |
|
|
// for (Int_t i=0; i<fACbuffer; i++){
|
2039 |
|
|
// printf("%0x ",fDataAC[i]);
|
2040 |
|
|
// if ((i+1)%8 ==0) cout << endl;
|
2041 |
|
|
// }
|
2042 |
|
|
};
|
2043 |
|
|
|
2044 |
|
|
|
2045 |
|
|
void Digitizer::DigitizeS4(){
|
2046 |
|
|
Int_t DEBUG=0;
|
2047 |
|
|
// creato: S. Borisov, INFN Roma2 e MEPHI, Sett 2007
|
2048 |
|
|
TString ciao,modo="ns";
|
2049 |
|
|
Int_t i,j,t,NdF,pmt,NdFT,S4,S4v=0,S4p=32;
|
2050 |
|
|
Float_t E0,E1=1e-6,Ert,X,Y,Z,x,y,z,V[3],Xs[2],Ys[2],Zs[2],Yp[6],q,w,p=0.1,l,l0=500;
|
2051 |
|
|
Xs[0]=-24.1;
|
2052 |
|
|
Xs[1]=24.1;
|
2053 |
|
|
Ys[0]=-24.1;
|
2054 |
|
|
Ys[1]=24.1;
|
2055 |
|
|
Zs[0]=-0.5;
|
2056 |
|
|
Zs[1]=0.5;
|
2057 |
|
|
Yp[0]=-20.;
|
2058 |
|
|
Yp[2]=-1.;
|
2059 |
|
|
Yp[4]=17.;
|
2060 |
|
|
for(i=0;i<3;i++)
|
2061 |
|
|
Yp[2*i+1]=Yp[2*i]+3;
|
2062 |
|
|
srand(time(NULL));
|
2063 |
|
|
// --- activate branches:
|
2064 |
|
|
fhBookTree->SetBranchStatus("Nthtof",1);
|
2065 |
|
|
fhBookTree->SetBranchStatus("Ipltof",1);
|
2066 |
|
|
fhBookTree->SetBranchStatus("Ipaddle",1);
|
2067 |
|
|
|
2068 |
|
|
fhBookTree->SetBranchStatus("Xintof",1);
|
2069 |
|
|
fhBookTree->SetBranchStatus("Yintof",1);
|
2070 |
|
|
fhBookTree->SetBranchStatus("Xouttof",1);
|
2071 |
|
|
fhBookTree->SetBranchStatus("Youttof",1);
|
2072 |
|
|
|
2073 |
|
|
fhBookTree->SetBranchStatus("Ereltof",1);
|
2074 |
|
|
fhBookTree->SetBranchStatus("Timetof",1);
|
2075 |
|
|
NdFT=0;
|
2076 |
|
|
Ert=0;
|
2077 |
|
|
for(i=0;i<Nthtof;i++){
|
2078 |
|
|
if(Ipltof[i]!=6) continue;
|
2079 |
|
|
Ert+=Ereltof[i];
|
2080 |
|
|
|
2081 |
|
|
if(modo=="ns") continue;
|
2082 |
|
|
NdF=Int_t(Ereltof[i]/E1);
|
2083 |
|
|
NdFT=0;
|
2084 |
|
|
X=Xintof[i];
|
2085 |
|
|
Y=Yintof[i];
|
2086 |
|
|
Z=(Float_t)(random())/(Float_t)(0x7fffffff)-0.5;
|
2087 |
|
|
//cout<<"XYZ "<<X<<" "<<Y<<" "<<Z<<endl;
|
2088 |
|
|
for(j=0;j<NdF;j++){
|
2089 |
|
|
q=(Float_t)random()/(Float_t)0x7fffffff;
|
2090 |
|
|
w=(Float_t)random()/(Float_t)0x7fffffff;
|
2091 |
|
|
// cout<<"qw "<<q<<" "<<w<<endl;
|
2092 |
|
|
V[0]=p*cos(6.28318*q);
|
2093 |
|
|
V[1]=p*sin(6.28318*q);
|
2094 |
|
|
V[2]=p*(2.*w-1.);
|
2095 |
|
|
pmt=0;
|
2096 |
|
|
x=X;
|
2097 |
|
|
y=Y;
|
2098 |
|
|
z=Z;
|
2099 |
|
|
while(pmt==0 && (x>Xs[0] && x<Xs[1])&&(y>Ys[0] && y<Ys[1])&&(z>Zs[0] && z<Zs[1])){
|
2100 |
|
|
l=0;
|
2101 |
|
|
while(pmt==0 && (x>Xs[0] && x<Xs[1])&&(y>Ys[0] && y<Ys[1])&&(z>Zs[0] && z<Zs[1])){
|
2102 |
|
|
x+=V[0];
|
2103 |
|
|
y+=V[1];
|
2104 |
|
|
z+=V[2];
|
2105 |
|
|
l+=p;
|
2106 |
|
|
//cout<<x<<" "<<y<<" "<<z<<" "<<l<<endl;
|
2107 |
|
|
//cin>>ciao;
|
2108 |
|
|
}
|
2109 |
|
|
if((x<Xs[0]+p || x>Xs[1]-p)&&(y>Ys[0]+p && y<Ys[1]-p)&&(z>Zs[0]+p && z<Zs[1]-p)){
|
2110 |
|
|
for(t=0;t<3;t++){
|
2111 |
|
|
if(y>=Yp[2*t] && y<Yp[2*t+1]){
|
2112 |
|
|
if(pmt==0)NdFT++;
|
2113 |
|
|
pmt=1;
|
2114 |
|
|
//cout<<NdFT<<endl;
|
2115 |
|
|
break;
|
2116 |
|
|
}
|
2117 |
|
|
}
|
2118 |
|
|
if(pmt==1)break;
|
2119 |
|
|
V[0]=-V[0];
|
2120 |
|
|
}
|
2121 |
|
|
q=(Float_t)random()/(Float_t)0x7fffffff;
|
2122 |
|
|
w=1-exp(-l/l0);
|
2123 |
|
|
if(q<w)break;
|
2124 |
|
|
q=(Float_t)random()/(Float_t)0x7fffffff;
|
2125 |
|
|
w=0.5;
|
2126 |
|
|
if(q<w)break;
|
2127 |
|
|
if((x>Xs[0]+p && x<Xs[1]-p)&&(y<Ys[0]+p || y>Ys[1]-p)&&(z>Zs[0]+p && z<Zs[1]-p))V[1]=-V[1];
|
2128 |
|
|
if((x>Xs[0]+p && x<Xs[1]-p)&&(y>Ys[0]+p && y<Ys[1]-p)&&(z<Zs[0]+p || z>Zs[1]-p))V[2]=-V[2];
|
2129 |
|
|
x+=V[0];
|
2130 |
|
|
y+=V[1];
|
2131 |
|
|
z+=V[2];
|
2132 |
|
|
l=0;
|
2133 |
|
|
//cout<<x<<" "<<y<<" "<<z<<" "<<l<<endl;
|
2134 |
|
|
//cin>>ciao;
|
2135 |
|
|
}
|
2136 |
|
|
}
|
2137 |
|
|
}
|
2138 |
|
|
Ert=Ert/0.002;
|
2139 |
|
|
q=(Float_t)(random())/(Float_t)0x7fffffff;
|
2140 |
|
|
w=0.7;
|
2141 |
|
|
//E0=(Float_t)(4064./7.);
|
2142 |
|
|
E0=4064./7.;
|
2143 |
|
|
if(Ert<1) S4=0;
|
2144 |
|
|
else S4=(Int_t)(4064.*(1.-exp(-(Ert-1.)/E0)));
|
2145 |
|
|
i=S4/4;
|
2146 |
|
|
if(S4%4==0)
|
2147 |
|
|
S4v=S4+S4p;
|
2148 |
|
|
else if(S4%4==1){
|
2149 |
|
|
if(q<w) S4v=S4-1+S4p;
|
2150 |
|
|
else S4v=S4+1+S4p;
|
2151 |
|
|
} else if(S4%4==2) S4v=S4+S4p;
|
2152 |
|
|
else if(S4%4==3){
|
2153 |
|
|
if(q<w) S4v=S4+1+S4p;
|
2154 |
|
|
else S4v=S4-1+S4p;
|
2155 |
|
|
}
|
2156 |
|
|
if (DEBUG)
|
2157 |
|
|
cout<<"Ert_S4 = " << Ert << " --- S4v = " << S4v << endl;
|
2158 |
|
|
fDataS4[0]=S4v;//0xf028;
|
2159 |
|
|
fDataS4[1]=0xd800;
|
2160 |
|
|
fDataS4[2]=0x0300;
|
2161 |
|
|
//cout<<" PMT "<<NdFT<<" "<<NdF<<endl;
|
2162 |
|
|
//cin>>ciao;
|
2163 |
|
|
}
|
2164 |
|
|
|
2165 |
|
|
|
2166 |
|
|
|
2167 |
|
|
void Digitizer::DigitizeND(){
|
2168 |
|
|
// creato: S. Borisov, INFN Roma2 e MEPHI, Sett 2007
|
2169 |
|
|
Int_t i=0;
|
2170 |
|
|
UShort_t NdN=0;
|
2171 |
|
|
fhBookTree->SetBranchStatus("Nthnd",1);
|
2172 |
|
|
fhBookTree->SetBranchStatus("Itubend",1);
|
2173 |
|
|
fhBookTree->SetBranchStatus("Iparnd",1);
|
2174 |
|
|
fhBookTree->SetBranchStatus("Xinnd",1);
|
2175 |
|
|
fhBookTree->SetBranchStatus("Yinnd",1);
|
2176 |
|
|
fhBookTree->SetBranchStatus("Zinnd",1);
|
2177 |
|
|
fhBookTree->SetBranchStatus("Xoutnd",1);
|
2178 |
|
|
fhBookTree->SetBranchStatus("Youtnd",1);
|
2179 |
|
|
fhBookTree->SetBranchStatus("Zoutnd",1);
|
2180 |
|
|
fhBookTree->SetBranchStatus("Erelnd",1);
|
2181 |
|
|
fhBookTree->SetBranchStatus("Timend",1);
|
2182 |
|
|
fhBookTree->SetBranchStatus("Pathnd",1);
|
2183 |
|
|
fhBookTree->SetBranchStatus("P0nd",1);
|
2184 |
|
|
//cout<<"n="<<Nthnd<<" "<<NdN<<"\n";
|
2185 |
|
|
for(i=0;i<Nthnd;i++){
|
2186 |
|
|
if(Iparnd[i]==13){
|
2187 |
|
|
NdN++;
|
2188 |
|
|
}
|
2189 |
|
|
}
|
2190 |
|
|
//NdN=100; //only for debug
|
2191 |
|
|
|
2192 |
|
|
for(i=0;i<3;i++){
|
2193 |
|
|
fDataND[2*i]=0x0000;
|
2194 |
|
|
fDataND[2*i+1]=0x010F;
|
2195 |
|
|
}
|
2196 |
|
|
fDataND[0]=0xFF00 & (256*NdN);
|
2197 |
|
|
}
|
2198 |
|
|
|
2199 |
|
|
|
2200 |
|
|
void Digitizer::DigitizeDummy() {
|
2201 |
|
|
|
2202 |
|
|
fhBookTree->SetBranchStatus("Enestrip",1);
|
2203 |
|
|
|
2204 |
|
|
// dumy header
|
2205 |
|
|
fDataDummy[0] = 0xCAAA;
|
2206 |
|
|
|
2207 |
|
|
for (Int_t i=1; i<fDummybuffer; i++){
|
2208 |
|
|
fDataDummy[i] = 0xFFFF;
|
2209 |
|
|
// printf("%0x ",fDataDummy[i]);
|
2210 |
|
|
//if ((i+1)%8 ==0) cout << endl;
|
2211 |
|
|
}
|
2212 |
|
|
};
|
2213 |
|
|
|
2214 |
silvio |
1.6 |
void Digitizer::WriteRunHeader(){
|
2215 |
|
|
fOutputfile.write(reinterpret_cast<char*>(fDataRunHeader),sizeof(UShort_t)*fRunHeaderbuffer);
|
2216 |
|
|
};
|
2217 |
|
|
|
2218 |
|
|
void Digitizer::WriteRunTrailer(){
|
2219 |
|
|
fOutputfile.write(reinterpret_cast<char*>(fDataRunTrailer),sizeof(UShort_t)*fRunTrailerbuffer);
|
2220 |
|
|
};
|
2221 |
orsi |
1.4 |
|
2222 |
|
|
void Digitizer::WriteData(){
|
2223 |
|
|
|
2224 |
|
|
// Routine that writes the data to a binary file
|
2225 |
|
|
// PSCU data are already swapped
|
2226 |
|
|
fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);
|
2227 |
|
|
// TRG
|
2228 |
silvio |
1.6 |
fOutputfile.write(reinterpret_cast<char*>(fDataTrigger),sizeof(UChar_t)*fTRIGGERbuffer); //30/11/07 SO; it was 153
|
2229 |
orsi |
1.4 |
// TOF
|
2230 |
silvio |
1.6 |
fOutputfile.write(reinterpret_cast<char*>(fDataTof),sizeof(UChar_t)*fTOFbuffer);
|
2231 |
orsi |
1.4 |
// AC
|
2232 |
|
|
UShort_t temp[1000000];
|
2233 |
|
|
memset(temp,0,sizeof(UShort_t)*1000000);
|
2234 |
|
|
swab(fDataAC,temp,sizeof(UShort_t)*fACbuffer); // WE MUST SWAP THE BYTES!!!
|
2235 |
|
|
fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fACbuffer);
|
2236 |
|
|
// CALO
|
2237 |
|
|
memset(temp,0,sizeof(UShort_t)*1000000);
|
2238 |
|
|
swab(fDataCALO,temp,sizeof(UShort_t)*fCALOlength); // WE MUST SWAP THE BYTES!!!
|
2239 |
|
|
fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fCALOlength);
|
2240 |
|
|
// TRK
|
2241 |
|
|
memset(temp,0,sizeof(UShort_t)*1000000);
|
2242 |
|
|
swab(fDataTrack,temp,sizeof(UShort_t)*fTracklength); // WE MUST SWAP THE BYTES!!!
|
2243 |
|
|
fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fTracklength);
|
2244 |
|
|
fTracklength=0;
|
2245 |
|
|
// padding to 64 bytes
|
2246 |
|
|
//
|
2247 |
|
|
if ( fPadding ){
|
2248 |
|
|
fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);
|
2249 |
|
|
};
|
2250 |
|
|
// S4
|
2251 |
|
|
memset(temp,0,sizeof(UShort_t)*1000000);
|
2252 |
|
|
swab(fDataS4,temp,sizeof(UShort_t)*fS4buffer); // WE MUST SWAP THE BYTES!!!
|
2253 |
|
|
fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fS4buffer);
|
2254 |
|
|
// ND
|
2255 |
|
|
memset(temp,0,sizeof(UShort_t)*1000000);
|
2256 |
|
|
swab(fDataND,temp,sizeof(UShort_t)*fNDbuffer); // WE MUST SWAP THE BYTES!!!
|
2257 |
|
|
fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fNDbuffer);
|
2258 |
|
|
};
|
2259 |
|
|
|
2260 |
|
|
|
2261 |
|
|
void Digitizer::ReadData(){
|
2262 |
|
|
|
2263 |
|
|
UShort_t InData[64];
|
2264 |
|
|
|
2265 |
|
|
// for debuggigng purposes only, write your own routine if you like (many
|
2266 |
|
|
// hardwired things.
|
2267 |
|
|
|
2268 |
|
|
ifstream InputFile;
|
2269 |
|
|
|
2270 |
|
|
// if (!InputFile) {
|
2271 |
|
|
|
2272 |
|
|
// std::cout << "ERROR" << endl;
|
2273 |
|
|
// // An error occurred!
|
2274 |
|
|
// // myFile.gcount() returns the number of bytes read.
|
2275 |
|
|
// // calling myFile.clear() will reset the stream state
|
2276 |
|
|
// // so it is usable again.
|
2277 |
|
|
// };
|
2278 |
|
|
|
2279 |
|
|
|
2280 |
|
|
|
2281 |
|
|
//InputFile.seekg(0);
|
2282 |
|
|
|
2283 |
|
|
InputFile.open(fFilename, ios::in | ios::binary);
|
2284 |
|
|
// fOutputfile.seekg(0);
|
2285 |
|
|
if (!InputFile.is_open()) std::cout << "ERROR" << endl;
|
2286 |
|
|
|
2287 |
|
|
InputFile.seekg(0);
|
2288 |
|
|
|
2289 |
|
|
for (Int_t k=0; k<=1000; k++){
|
2290 |
|
|
InputFile.read(reinterpret_cast<char*>(InData),384*sizeof(UShort_t));
|
2291 |
|
|
|
2292 |
|
|
std::cout << "Read back: " << endl << endl;
|
2293 |
|
|
|
2294 |
|
|
for (Int_t i=0; i<=384; i++){
|
2295 |
|
|
printf("%4x ", InData[i]);
|
2296 |
|
|
if ((i+1)%8 ==0) cout << endl;
|
2297 |
|
|
}
|
2298 |
|
|
|
2299 |
|
|
}
|
2300 |
|
|
cout << endl;
|
2301 |
|
|
InputFile.close();
|
2302 |
|
|
|
2303 |
|
|
};
|
2304 |
|
|
|
2305 |
|
|
|
2306 |
|
|
|
2307 |
|
|
void Digitizer::DigitizeTrack() {
|
2308 |
|
|
//std:: cout << "Entering DigitizeTrack " << endl;
|
2309 |
|
|
Float_t AdcTrack[fNviews][fNstrips_view]; // Vector of strips to be compressed
|
2310 |
|
|
|
2311 |
|
|
Int_t Iview;
|
2312 |
|
|
Int_t Nstrip;
|
2313 |
|
|
|
2314 |
|
|
for (Int_t j=0; j<fNviews;j++) {
|
2315 |
|
|
|
2316 |
|
|
for (Int_t i=0; i<fNladder;i++) {
|
2317 |
|
|
|
2318 |
|
|
Float_t commonN1=gRandom->Gaus(0.,fSigmaCommon);
|
2319 |
|
|
Float_t commonN2=gRandom->Gaus(0.,fSigmaCommon);
|
2320 |
|
|
for (Int_t k=0; k<fNstrips_ladder;k++) {
|
2321 |
|
|
Nstrip=i*fNstrips_ladder+k;
|
2322 |
|
|
AdcTrack[j][Nstrip]=gRandom->Gaus(fPedeTrack[j][Nstrip],fSigmaTrack[j][Nstrip]);
|
2323 |
|
|
if(k<4*128) {AdcTrack[j][Nstrip] += commonN1;} // full correlation of 4 VA1 Com. Noise
|
2324 |
|
|
else {AdcTrack[j][Nstrip] += commonN2;} // full correlation of 4 VA1 Com. Noise
|
2325 |
|
|
|
2326 |
|
|
};
|
2327 |
|
|
|
2328 |
|
|
|
2329 |
|
|
};
|
2330 |
|
|
|
2331 |
|
|
|
2332 |
|
|
};
|
2333 |
|
|
|
2334 |
|
|
|
2335 |
|
|
fhBookTree->SetBranchStatus("Nstrpx",1);
|
2336 |
|
|
fhBookTree->SetBranchStatus("Npstripx",1);
|
2337 |
|
|
fhBookTree->SetBranchStatus("Ntstripx",1);
|
2338 |
|
|
fhBookTree->SetBranchStatus("Istripx",1);
|
2339 |
|
|
fhBookTree->SetBranchStatus("Qstripx",1);
|
2340 |
|
|
fhBookTree->SetBranchStatus("Xstripx",1);
|
2341 |
|
|
fhBookTree->SetBranchStatus("Nstrpy",1);
|
2342 |
|
|
fhBookTree->SetBranchStatus("Npstripy",1);
|
2343 |
|
|
fhBookTree->SetBranchStatus("Ntstripy",1);
|
2344 |
|
|
fhBookTree->SetBranchStatus("Istripy",1);
|
2345 |
|
|
fhBookTree->SetBranchStatus("Qstripy",1);
|
2346 |
|
|
fhBookTree->SetBranchStatus("Ystripy",1);
|
2347 |
|
|
|
2348 |
|
|
|
2349 |
|
|
|
2350 |
|
|
Float_t ADCfull;
|
2351 |
|
|
Int_t iladd=0;
|
2352 |
|
|
for (Int_t ix=0; ix<Nstrpx;ix++) {
|
2353 |
|
|
Iview=Npstripx[ix]*2-1;
|
2354 |
|
|
Nstrip=(Int_t)Istripx[ix]-1;
|
2355 |
|
|
if(Nstrip<fNstrips_ladder) iladd=0;
|
2356 |
|
|
if((Nstrip>=fNstrips_ladder)&&(Nstrip<2*fNstrips_ladder)) iladd=1;
|
2357 |
|
|
if((Nstrip>=2*fNstrips_ladder)&&(Nstrip<3*fNstrips_ladder)) iladd=2;
|
2358 |
|
|
ADCfull=AdcTrack[Iview][Nstrip] += Qstripx[ix]*fMipCor[iladd][Iview];
|
2359 |
|
|
AdcTrack[Iview][Nstrip] *= SaturationTrack(ADCfull);
|
2360 |
|
|
|
2361 |
|
|
};
|
2362 |
|
|
|
2363 |
|
|
|
2364 |
|
|
for (Int_t iy=0; iy<Nstrpy;iy++) {
|
2365 |
|
|
Iview=Npstripy[iy]*2-2;
|
2366 |
|
|
Nstrip=(Int_t)Istripy[iy]-1;
|
2367 |
|
|
if(Nstrip<fNstrips_ladder) iladd=0;
|
2368 |
|
|
if((Nstrip>=fNstrips_ladder)&&(Nstrip<2*fNstrips_ladder)) iladd=1;
|
2369 |
|
|
if((Nstrip>=2*fNstrips_ladder)&&(Nstrip<3*fNstrips_ladder)) iladd=2;
|
2370 |
|
|
ADCfull=AdcTrack[Iview][Nstrip] -= Qstripy[iy]*fMipCor[iladd][Iview];
|
2371 |
|
|
AdcTrack[Iview][Nstrip] *= SaturationTrack(ADCfull);
|
2372 |
|
|
|
2373 |
|
|
};
|
2374 |
|
|
|
2375 |
|
|
CompressTrackData(AdcTrack); // Compress and Digitize data of one Ladder in turn for all ladders
|
2376 |
|
|
|
2377 |
|
|
};
|
2378 |
|
|
|
2379 |
|
|
|
2380 |
|
|
|
2381 |
|
|
void Digitizer::DigitizeTrackCalib(Int_t ii) {
|
2382 |
|
|
|
2383 |
|
|
std:: cout << "Entering DigitizeTrackCalib " << ii << endl;
|
2384 |
|
|
if( (ii!=1)&&(ii!=2) ) {
|
2385 |
|
|
std:: cout << "error wrong DigitizeTrackCalib argument" << endl;
|
2386 |
|
|
return;
|
2387 |
|
|
};
|
2388 |
|
|
|
2389 |
|
|
memset(fDataTrack,0,sizeof(UShort_t)*fTRACKbuffer);
|
2390 |
|
|
fTracklength=0;
|
2391 |
|
|
|
2392 |
|
|
UShort_t Dato;
|
2393 |
|
|
|
2394 |
|
|
Float_t dato1;
|
2395 |
|
|
Float_t dato2;
|
2396 |
|
|
Float_t dato3;
|
2397 |
|
|
Float_t dato4;
|
2398 |
|
|
|
2399 |
|
|
UShort_t DatoDec;
|
2400 |
|
|
UShort_t DatoDec1;
|
2401 |
|
|
UShort_t DatoDec2;
|
2402 |
|
|
UShort_t DatoDec3;
|
2403 |
|
|
UShort_t DatoDec4;
|
2404 |
|
|
|
2405 |
|
|
UShort_t EVENT_CAL;
|
2406 |
|
|
UShort_t PED_L1;
|
2407 |
|
|
UShort_t ReLength;
|
2408 |
|
|
UShort_t OveCheckCode;
|
2409 |
|
|
//UShort_t PED_L2;
|
2410 |
|
|
//UShort_t PED_L3HI;
|
2411 |
|
|
//UShort_t PED_L3LO;
|
2412 |
|
|
//UShort_t SIG_L1HI;
|
2413 |
|
|
//UShort_t SIG_L1LO;
|
2414 |
|
|
//UShort_t SIG_L2HI;
|
2415 |
|
|
//UShort_t SIG_L2LO;
|
2416 |
|
|
//UShort_t SIG_L3;
|
2417 |
|
|
//UShort_t BAD_L1;
|
2418 |
|
|
//UShort_t BAD_L2LO;
|
2419 |
|
|
//UShort_t BAD_L3HI;
|
2420 |
|
|
//UShort_t BAD_L3LO;
|
2421 |
|
|
//UShort_t FLAG;
|
2422 |
|
|
|
2423 |
|
|
|
2424 |
|
|
Int_t DSPpos;
|
2425 |
|
|
for (Int_t j=ii-1; j<fNviews;j+=2) {
|
2426 |
|
|
UShort_t CkSum=0;
|
2427 |
|
|
// here skip the dsp header and his trailer , to be written later
|
2428 |
|
|
DSPpos=fTracklength;
|
2429 |
|
|
fTracklength=fTracklength+13+3;
|
2430 |
|
|
|
2431 |
|
|
|
2432 |
|
|
for (Int_t i=0; i<fNladder;i++) {
|
2433 |
|
|
for (Int_t k=0; k<fNstrips_ladder;k++) {
|
2434 |
|
|
// write in buffer the current LADDER
|
2435 |
|
|
Dato=(UShort_t)fPedeTrack[j][i*fNstrips_ladder+k];
|
2436 |
|
|
dato1=fPedeTrack[j][i*fNstrips_ladder+k]-Dato;
|
2437 |
|
|
|
2438 |
|
|
DatoDec1=(UShort_t)(dato1*2);
|
2439 |
|
|
dato2=dato1*2-DatoDec1;
|
2440 |
|
|
|
2441 |
|
|
DatoDec2=(UShort_t)(dato2*2);
|
2442 |
|
|
dato3=dato2*2-DatoDec2;
|
2443 |
|
|
|
2444 |
|
|
DatoDec3=(UShort_t)(dato3*2);
|
2445 |
|
|
dato4=dato3*2-DatoDec3;
|
2446 |
|
|
|
2447 |
|
|
DatoDec4=(UShort_t)(dato4*2);
|
2448 |
|
|
|
2449 |
|
|
DatoDec=DatoDec1*0x0008+DatoDec2*0x0004+DatoDec3*0x0002+DatoDec4*0x0001;
|
2450 |
|
|
fDataTrack[fTracklength]=( (Dato << 4) | (DatoDec & 0x000F) );
|
2451 |
|
|
CkSum=CkSum^fDataTrack[fTracklength];
|
2452 |
|
|
fTracklength++;
|
2453 |
|
|
};
|
2454 |
|
|
|
2455 |
|
|
for (Int_t k=0; k<fNstrips_ladder;k++) {
|
2456 |
|
|
// write in buffer the current LADDER
|
2457 |
|
|
Dato=(UShort_t)fSigmaTrack[j][i*fNstrips_ladder+k];
|
2458 |
|
|
dato1=fSigmaTrack[j][i*fNstrips_ladder+k]-Dato;
|
2459 |
|
|
|
2460 |
|
|
DatoDec1=(UShort_t)(dato1*2);
|
2461 |
|
|
dato2=dato1*2-DatoDec1;
|
2462 |
|
|
|
2463 |
|
|
DatoDec2=(UShort_t)(dato2*2);
|
2464 |
|
|
dato3=dato2*2-DatoDec2;
|
2465 |
|
|
|
2466 |
|
|
DatoDec3=(UShort_t)(dato3*2);
|
2467 |
|
|
dato4=dato3*2-DatoDec3;
|
2468 |
|
|
|
2469 |
|
|
DatoDec4=(UShort_t)(dato4*2);
|
2470 |
|
|
|
2471 |
|
|
DatoDec=DatoDec1*0x0008+DatoDec2*0x0004+DatoDec3*0x0002+DatoDec4*0x0001;
|
2472 |
|
|
|
2473 |
|
|
fDataTrack[fTracklength]=( (Dato << 4) | (DatoDec & 0x000F) );
|
2474 |
|
|
CkSum=CkSum^fDataTrack[fTracklength];
|
2475 |
|
|
fTracklength++;
|
2476 |
|
|
};
|
2477 |
|
|
|
2478 |
|
|
for (Int_t k=0; k<64;k++) {
|
2479 |
|
|
fDataTrack[fTracklength]=0x0000;
|
2480 |
|
|
CkSum=CkSum^fDataTrack[fTracklength];
|
2481 |
|
|
fTracklength++;
|
2482 |
|
|
|
2483 |
|
|
};
|
2484 |
|
|
// end ladder
|
2485 |
|
|
|
2486 |
|
|
// write in buffer the end ladder word
|
2487 |
|
|
if(i==0) fDataTrack[fTracklength]=0x1807;
|
2488 |
|
|
if(i==1) fDataTrack[fTracklength]=0x1808;
|
2489 |
|
|
if(i==2) fDataTrack[fTracklength]=0x1809;
|
2490 |
|
|
CkSum=CkSum^fDataTrack[fTracklength];
|
2491 |
|
|
fTracklength++;
|
2492 |
|
|
|
2493 |
|
|
// write in buffer the TRAILER
|
2494 |
|
|
ReLength=(UShort_t)((fNstrips_ladder*2+64+1)*2+3);
|
2495 |
|
|
OveCheckCode=0x0000;
|
2496 |
|
|
|
2497 |
|
|
fDataTrack[fTracklength]=0x0000;
|
2498 |
|
|
fTracklength++;
|
2499 |
|
|
|
2500 |
|
|
fDataTrack[fTracklength]=(ReLength >> 8);
|
2501 |
|
|
fTracklength++;
|
2502 |
|
|
|
2503 |
|
|
fDataTrack[fTracklength]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );
|
2504 |
|
|
fTracklength++;
|
2505 |
|
|
|
2506 |
|
|
// end TRAILER
|
2507 |
|
|
};
|
2508 |
|
|
|
2509 |
|
|
// write in buffer the DSP header
|
2510 |
|
|
|
2511 |
|
|
fDataTrack[DSPpos]=(0xE800 | ( ((j+1) << 3) | 0x0005) );
|
2512 |
|
|
|
2513 |
|
|
fDataTrack[DSPpos+1]=0x01A9;
|
2514 |
|
|
|
2515 |
|
|
fDataTrack[DSPpos+2]=0x8740;
|
2516 |
|
|
|
2517 |
|
|
EVENT_CAL=0;
|
2518 |
|
|
fDataTrack[DSPpos+3]=(0x1A00 | ( (0x03FF & EVENT_CAL)>> 1) );
|
2519 |
|
|
|
2520 |
|
|
PED_L1=0;
|
2521 |
|
|
fDataTrack[DSPpos+4]=( ((EVENT_CAL << 15) | 0x5002 ) | ((0x03FF & PED_L1) << 2) );
|
2522 |
|
|
|
2523 |
|
|
// FROM HERE WE WRITE AS ALL VARIABLE apart CkSum are =0
|
2524 |
|
|
|
2525 |
|
|
fDataTrack[DSPpos+5]=0x8014;
|
2526 |
|
|
|
2527 |
|
|
fDataTrack[DSPpos+6]=0x00A0;
|
2528 |
|
|
|
2529 |
|
|
fDataTrack[DSPpos+7]=0x0500;
|
2530 |
|
|
|
2531 |
|
|
fDataTrack[DSPpos+8]=0x2801;
|
2532 |
|
|
|
2533 |
|
|
fDataTrack[DSPpos+9]=0x400A;
|
2534 |
|
|
|
2535 |
|
|
fDataTrack[DSPpos+10]=0x0050;
|
2536 |
|
|
|
2537 |
|
|
CkSum=(CkSum >> 8)^(CkSum&0x00FF);
|
2538 |
|
|
fDataTrack[DSPpos+11]=(0x0280 | (CkSum >> 3));
|
2539 |
|
|
|
2540 |
|
|
fDataTrack[DSPpos+12]=(0x1FFF | (CkSum << 13) );
|
2541 |
|
|
|
2542 |
|
|
// end dsp header
|
2543 |
|
|
|
2544 |
|
|
// write in buffer the TRAILER
|
2545 |
|
|
|
2546 |
|
|
ReLength=(UShort_t)((13*2)+3);
|
2547 |
|
|
OveCheckCode=0x0000;
|
2548 |
|
|
fDataTrack[DSPpos+13]=0x0000;
|
2549 |
|
|
|
2550 |
|
|
fDataTrack[DSPpos+14]=(ReLength >> 8);
|
2551 |
|
|
|
2552 |
|
|
fDataTrack[DSPpos+15]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );
|
2553 |
|
|
|
2554 |
|
|
// end TRAILER
|
2555 |
|
|
|
2556 |
|
|
|
2557 |
|
|
|
2558 |
|
|
|
2559 |
|
|
// end DSP
|
2560 |
|
|
};
|
2561 |
|
|
|
2562 |
|
|
|
2563 |
|
|
|
2564 |
|
|
};
|
2565 |
|
|
|
2566 |
|
|
void Digitizer::WriteTrackCalib() {
|
2567 |
|
|
|
2568 |
|
|
|
2569 |
|
|
std:: cout << " Entering WriteTrackCalib " << endl;
|
2570 |
|
|
|
2571 |
|
|
fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);
|
2572 |
|
|
|
2573 |
|
|
UShort_t temp[1000000];
|
2574 |
|
|
memset(temp,0,sizeof(UShort_t)*1000000);
|
2575 |
|
|
swab(fDataTrack,temp,sizeof(UShort_t)*fTracklength); // WE MUST SWAP THE BYTES!!!
|
2576 |
|
|
fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fTracklength);
|
2577 |
|
|
fTracklength=0;
|
2578 |
|
|
if ( fPadding ){
|
2579 |
|
|
fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);
|
2580 |
|
|
};
|
2581 |
|
|
|
2582 |
|
|
};
|
2583 |
|
|
|
2584 |
|
|
|
2585 |
|
|
void Digitizer::ClearTrackCalib() {
|
2586 |
|
|
|
2587 |
|
|
std:: cout << "Entering ClearTrackCalib " << endl;
|
2588 |
|
|
|
2589 |
|
|
|
2590 |
|
|
};
|
2591 |
|
|
|
2592 |
|
|
|
2593 |
|
|
void Digitizer::LoadTrackCalib() {
|
2594 |
|
|
std:: cout << "Entering LoadTrackCalib " << endl;
|
2595 |
|
|
|
2596 |
|
|
// Generate the pedestals and sigmas according to parametrization
|
2597 |
|
|
for (Int_t j=0; j<fNviews;j++) {
|
2598 |
|
|
for (Int_t i=0; i<fNstrips_view;i++) {
|
2599 |
|
|
|
2600 |
|
|
if((j+1)%2==0) {
|
2601 |
|
|
fPedeTrack[j][i]=gRandom->Gaus(fAvePedex,fSigmaPedex);
|
2602 |
|
|
fSigmaTrack[j][i]=gRandom->Gaus(fAveSigmax,fSigmaSigmax);
|
2603 |
|
|
};
|
2604 |
|
|
if((j+1)%2==1) {
|
2605 |
|
|
fPedeTrack[j][i]=gRandom->Gaus(fAvePedey,fSigmaPedey);
|
2606 |
|
|
fSigmaTrack[j][i]=gRandom->Gaus(fAveSigmay,fSigmaSigmay);
|
2607 |
|
|
};
|
2608 |
|
|
|
2609 |
|
|
};
|
2610 |
|
|
};
|
2611 |
|
|
|
2612 |
|
|
|
2613 |
|
|
|
2614 |
|
|
};
|
2615 |
|
|
|
2616 |
|
|
void Digitizer::LoadMipCor() {
|
2617 |
|
|
std:: cout << "Entering LoadMipCor" << endl;
|
2618 |
|
|
Float_t xfactor=1./151.6*1.04;
|
2619 |
|
|
Float_t yfactor=1./152.1;
|
2620 |
|
|
|
2621 |
|
|
fMipCor[0][0]=140.02*yfactor;
|
2622 |
|
|
fMipCor[0][1]=140.99*xfactor;
|
2623 |
|
|
fMipCor[0][2]=134.48*yfactor;
|
2624 |
|
|
fMipCor[0][3]=144.41*xfactor;
|
2625 |
|
|
fMipCor[0][4]=140.74*yfactor;
|
2626 |
|
|
fMipCor[0][5]=142.28*xfactor;
|
2627 |
|
|
fMipCor[0][6]=134.53*yfactor;
|
2628 |
|
|
fMipCor[0][7]=140.63*xfactor;
|
2629 |
|
|
fMipCor[0][8]=135.55*yfactor;
|
2630 |
|
|
fMipCor[0][9]=138.00*xfactor;
|
2631 |
|
|
fMipCor[0][10]=154.95*yfactor;
|
2632 |
|
|
fMipCor[0][11]=158.44*xfactor;
|
2633 |
|
|
|
2634 |
|
|
|
2635 |
|
|
fMipCor[1][0]=136.07*yfactor;
|
2636 |
|
|
fMipCor[1][1]=135.59*xfactor;
|
2637 |
|
|
fMipCor[1][2]=142.69*yfactor;
|
2638 |
|
|
fMipCor[1][3]=138.19*xfactor;
|
2639 |
|
|
fMipCor[1][4]=137.35*yfactor;
|
2640 |
|
|
fMipCor[1][5]=140.23*xfactor;
|
2641 |
|
|
fMipCor[1][6]=153.15*yfactor;
|
2642 |
|
|
fMipCor[1][7]=151.42*xfactor;
|
2643 |
|
|
fMipCor[1][8]=129.76*yfactor;
|
2644 |
|
|
fMipCor[1][9]=140.63*xfactor;
|
2645 |
|
|
fMipCor[1][10]=157.87*yfactor;
|
2646 |
|
|
fMipCor[1][11]=153.64*xfactor;
|
2647 |
|
|
|
2648 |
|
|
fMipCor[2][0]=134.98*yfactor;
|
2649 |
|
|
fMipCor[2][1]=143.95*xfactor;
|
2650 |
|
|
fMipCor[2][2]=140.23*yfactor;
|
2651 |
|
|
fMipCor[2][3]=138.88*xfactor;
|
2652 |
|
|
fMipCor[2][4]=137.95*yfactor;
|
2653 |
|
|
fMipCor[2][5]=134.87*xfactor;
|
2654 |
|
|
fMipCor[2][6]=157.56*yfactor;
|
2655 |
|
|
fMipCor[2][7]=157.31*xfactor;
|
2656 |
|
|
fMipCor[2][8]=141.37*yfactor;
|
2657 |
|
|
fMipCor[2][9]=143.39*xfactor;
|
2658 |
|
|
fMipCor[2][10]=156.15*yfactor;
|
2659 |
|
|
fMipCor[2][11]=158.79*xfactor;
|
2660 |
|
|
|
2661 |
|
|
/*
|
2662 |
|
|
for (Int_t j=0; j<fNviews;j++) {
|
2663 |
|
|
for (Int_t i=0; i<fNstrips_view;i++) {
|
2664 |
|
|
fMipCor[j][i]=1.;
|
2665 |
|
|
};
|
2666 |
|
|
};
|
2667 |
|
|
|
2668 |
|
|
|
2669 |
|
|
*/
|
2670 |
|
|
};
|
2671 |
|
|
|
2672 |
|
|
void Digitizer::CompressTrackData(Float_t AdcTrack[fNviews][fNstrips_view]) {
|
2673 |
|
|
// copy of the corresponding compression fortran routine + new digitization
|
2674 |
|
|
// std:: cout << "Entering CompressTrackData " << endl;
|
2675 |
|
|
Int_t oldval=0;
|
2676 |
|
|
Int_t newval=0;
|
2677 |
|
|
Int_t trasmesso=0;
|
2678 |
|
|
Int_t ntrastot=0;
|
2679 |
|
|
Float_t real;
|
2680 |
|
|
Float_t inte;
|
2681 |
|
|
Int_t cercacluster=0;
|
2682 |
|
|
Int_t kt=0;
|
2683 |
|
|
static const int DSPbufferSize = 4000; // 13 bit buffer to be rearranged in 16 bit Track buffer
|
2684 |
|
|
UShort_t DataDSP[DSPbufferSize]; // 13 bit buffer to be rearranged in 16 bit Track buffer
|
2685 |
|
|
UShort_t DSPlength; // 13 bit buffer to be rearranged in 16 bit Track buffer
|
2686 |
|
|
|
2687 |
|
|
memset(fDataTrack,0,sizeof(UShort_t)*fTRACKbuffer); // probably not necessary becouse already done ?
|
2688 |
|
|
fTracklength=0;
|
2689 |
|
|
|
2690 |
|
|
for (Int_t iv=0; iv<fNviews;iv++) {
|
2691 |
|
|
memset(DataDSP,0,sizeof(UShort_t)*DSPbufferSize);
|
2692 |
|
|
DSPlength=16; // skip the header, to be written later
|
2693 |
|
|
UShort_t CheckSum=0;
|
2694 |
|
|
// write dsp header on buffer
|
2695 |
|
|
|
2696 |
|
|
// fDataTrack[fTracklength]=0xE805;
|
2697 |
|
|
// fTracklength++;
|
2698 |
|
|
|
2699 |
|
|
// fDataTrack[fTracklength]=0x01A9;
|
2700 |
|
|
// fTracklength++;
|
2701 |
|
|
|
2702 |
|
|
// end dsp header
|
2703 |
|
|
|
2704 |
|
|
//
|
2705 |
|
|
// INIZIO VISTA IV - TAKE PROPER ACTION
|
2706 |
|
|
//
|
2707 |
|
|
|
2708 |
|
|
|
2709 |
|
|
|
2710 |
|
|
for (Int_t ladder=0; ladder<fNladder;ladder++) {
|
2711 |
|
|
Int_t k=0;
|
2712 |
|
|
while (k<fNstrips_ladder) {
|
2713 |
|
|
// compress write in buffer the current LADDER
|
2714 |
|
|
if ( k == 0) {
|
2715 |
|
|
real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
|
2716 |
|
|
if (real > 0.5) inte=inte+1;
|
2717 |
|
|
newval=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+k];
|
2718 |
|
|
// first strip of ladder is transmitted
|
2719 |
|
|
// DC_TOT first " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;
|
2720 |
|
|
DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
|
2721 |
|
|
DSPlength++;
|
2722 |
|
|
ntrastot++;
|
2723 |
|
|
trasmesso=1;
|
2724 |
|
|
oldval=newval;
|
2725 |
|
|
kt=k;
|
2726 |
|
|
k++;
|
2727 |
|
|
continue;
|
2728 |
|
|
};
|
2729 |
|
|
real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
|
2730 |
|
|
if (real > 0.5) inte=inte+1;
|
2731 |
|
|
newval=(Int_t)inte -(Int_t)(fPedeTrack[iv][ladder*fNstrips_ladder+k]);
|
2732 |
|
|
cercacluster=1; // ?????????
|
2733 |
|
|
if (cercacluster==1) {
|
2734 |
|
|
|
2735 |
|
|
// controlla l'ordine di tutti queste strip ladder e DSP !!!!!!!
|
2736 |
|
|
Int_t diff=0;
|
2737 |
|
|
|
2738 |
|
|
|
2739 |
|
|
switch ((iv+1)%2) {
|
2740 |
|
|
case 0: diff=newval-oldval;
|
2741 |
|
|
break;
|
2742 |
|
|
case 1: diff=oldval-newval;
|
2743 |
|
|
break;
|
2744 |
|
|
};
|
2745 |
|
|
|
2746 |
|
|
if (diff>fCutclu*(Int_t)fSigmaTrack[iv][ladder*fNstrips_ladder+k]) {
|
2747 |
|
|
Int_t clval=newval;
|
2748 |
|
|
Int_t klp=k; // go on to search for maximum
|
2749 |
|
|
klp++;
|
2750 |
|
|
|
2751 |
|
|
while(klp<fNstrips_ladder) {
|
2752 |
|
|
real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klp],&inte);
|
2753 |
|
|
if (real > 0.5) inte=inte+1;
|
2754 |
|
|
Int_t clvalp=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+klp];
|
2755 |
|
|
if((iv+1)%2==0) {
|
2756 |
|
|
|
2757 |
|
|
if(clvalp>clval) {
|
2758 |
|
|
clval=clvalp;
|
2759 |
|
|
k=klp;}
|
2760 |
|
|
else break; // max of cluster found
|
2761 |
|
|
|
2762 |
|
|
} else {
|
2763 |
|
|
|
2764 |
|
|
if(clvalp<clval) {
|
2765 |
|
|
clval=clvalp;
|
2766 |
|
|
k=klp;}
|
2767 |
|
|
else break; // max of cluster found
|
2768 |
|
|
|
2769 |
|
|
};
|
2770 |
|
|
|
2771 |
|
|
klp++;
|
2772 |
|
|
};
|
2773 |
|
|
|
2774 |
|
|
Int_t kl1=k-fNclst; // max of cluster (or end of ladder ?)
|
2775 |
|
|
trasmesso=0;
|
2776 |
|
|
if(kl1<0) kl1=0;
|
2777 |
|
|
|
2778 |
|
|
if(kt>=kl1) kl1=kt+1;
|
2779 |
|
|
if( (kt+1)==kl1 ) trasmesso=1;
|
2780 |
|
|
|
2781 |
|
|
|
2782 |
|
|
|
2783 |
|
|
Int_t kl2=k+fNclst;
|
2784 |
|
|
if(kl2>=fNstrips_ladder) kl2=fNstrips_ladder-1;
|
2785 |
|
|
|
2786 |
|
|
for(Int_t klt=kl1 ; klt<=kl2 ; klt++) {
|
2787 |
|
|
if(trasmesso==0) {
|
2788 |
|
|
// std:: cout << "STRIP " << klt << endl;
|
2789 |
|
|
// std:: cout << "ADC_TOT " <<AdcTrack[iv][ladder*fNstrips_ladder+klt] << endl;
|
2790 |
|
|
|
2791 |
|
|
DataDSP[DSPlength]=( ((UShort_t)klt) | 0x1000);
|
2792 |
|
|
DSPlength++;
|
2793 |
|
|
ntrastot++;
|
2794 |
|
|
|
2795 |
|
|
|
2796 |
|
|
real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klt],&inte);
|
2797 |
|
|
if (real > 0.5) inte=inte+1;
|
2798 |
|
|
DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
|
2799 |
|
|
DSPlength++;
|
2800 |
|
|
ntrastot++;
|
2801 |
|
|
|
2802 |
|
|
}
|
2803 |
|
|
else {
|
2804 |
|
|
// std:: cout << "ADC_TOT " <<AdcTrack[iv][ladder*fNstrips_ladder+klt] << endl;
|
2805 |
|
|
real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klt],&inte);
|
2806 |
|
|
if (real > 0.5) inte=inte+1;
|
2807 |
|
|
DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
|
2808 |
|
|
DSPlength++;
|
2809 |
|
|
ntrastot++;
|
2810 |
|
|
};
|
2811 |
|
|
trasmesso=1;
|
2812 |
|
|
}; // end trasmission
|
2813 |
|
|
kt=kl2;
|
2814 |
|
|
k=kl2;
|
2815 |
|
|
real=modff(AdcTrack[iv][ladder*fNstrips_ladder+kt],&inte);
|
2816 |
|
|
if (real > 0.5) inte=inte+1;
|
2817 |
|
|
oldval=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+kt];
|
2818 |
|
|
k++;
|
2819 |
|
|
continue;
|
2820 |
|
|
|
2821 |
|
|
|
2822 |
|
|
}; // end cercacluster
|
2823 |
|
|
}; // end cercacluster
|
2824 |
|
|
|
2825 |
|
|
// start ZOP check for strips no
|
2826 |
|
|
|
2827 |
|
|
if(abs(newval-oldval)>=fCutzop*(Int_t)fSigmaTrack[iv][ladder*fNstrips_ladder+k]) {
|
2828 |
|
|
|
2829 |
|
|
if(trasmesso==0) {
|
2830 |
|
|
// std:: cout << "STRIP " << k << endl;
|
2831 |
|
|
// std:: cout << "ADC_TOT " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;
|
2832 |
|
|
|
2833 |
|
|
DataDSP[DSPlength]=( ((UShort_t)k) | 0x1000);
|
2834 |
|
|
DSPlength++;
|
2835 |
|
|
ntrastot++;
|
2836 |
|
|
|
2837 |
|
|
|
2838 |
|
|
real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
|
2839 |
|
|
if (real > 0.5) inte=inte+1;
|
2840 |
|
|
DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
|
2841 |
|
|
DSPlength++;
|
2842 |
|
|
ntrastot++;
|
2843 |
|
|
|
2844 |
|
|
}
|
2845 |
|
|
else {
|
2846 |
|
|
// std:: cout << "ADC_TOT " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;
|
2847 |
|
|
real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
|
2848 |
|
|
if (real > 0.5) inte=inte+1;
|
2849 |
|
|
DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
|
2850 |
|
|
DSPlength++;
|
2851 |
|
|
ntrastot++;
|
2852 |
|
|
};
|
2853 |
|
|
trasmesso=1;
|
2854 |
|
|
oldval=newval;
|
2855 |
|
|
kt=k;
|
2856 |
|
|
|
2857 |
|
|
}
|
2858 |
|
|
else trasmesso=0;
|
2859 |
|
|
// end zop
|
2860 |
|
|
|
2861 |
|
|
k++;
|
2862 |
|
|
}; // end cycle inside ladder
|
2863 |
|
|
// write here the end ladder bytes
|
2864 |
|
|
// std:: cout << "FINE LADDER " << ladder+1 << endl;
|
2865 |
|
|
|
2866 |
|
|
DataDSP[DSPlength]=( ((UShort_t)(ladder+1)) | 0x1800);
|
2867 |
|
|
DSPlength++;
|
2868 |
|
|
ntrastot++;
|
2869 |
|
|
trasmesso=0;
|
2870 |
|
|
|
2871 |
|
|
}; //end cycle inside dsp
|
2872 |
|
|
// std:: cout << "FINE DSP " << iv+1 << endl;
|
2873 |
|
|
// here put DSP header
|
2874 |
|
|
DataDSP[0]=(0x1CA0 | ((UShort_t)(iv+1)) );
|
2875 |
|
|
UShort_t Nword=(DSPlength*13)/16;
|
2876 |
|
|
if( ((DSPlength*13)%16)!=0) Nword++;
|
2877 |
|
|
DataDSP[1]=(0x1400 | ( Nword >> 10));
|
2878 |
|
|
DataDSP[2]=(0x1400 | ( Nword & 0x03FF) );
|
2879 |
|
|
DataDSP[3]=(0x1400 | (( (UShort_t)(fCounter >> 10) ) & 0x03FF) );
|
2880 |
|
|
DataDSP[4]=(0x1400 | (( (UShort_t)(fCounter) ) & 0x03FF) );
|
2881 |
|
|
DataDSP[5]=(0x1400 | ( (UShort_t)(fNclst << 7) ) | ( (UShort_t)(fCutzop << 4) )
|
2882 |
|
|
| ( (UShort_t)fCutzop ) );
|
2883 |
|
|
DataDSP[6]=0x1400;
|
2884 |
|
|
DataDSP[7]=0x1400;
|
2885 |
|
|
DataDSP[8]=0x1400;
|
2886 |
|
|
DataDSP[9]=0x1400;
|
2887 |
|
|
DataDSP[10]=0x1400;
|
2888 |
|
|
DataDSP[11]=0x1400;
|
2889 |
|
|
DataDSP[12]=0x1400;
|
2890 |
|
|
DataDSP[13]=0x1400;
|
2891 |
|
|
DataDSP[14]=(0x1400 | (CheckSum & 0x00FF) );
|
2892 |
|
|
DataDSP[15]=0x1C00;
|
2893 |
|
|
// end DSP header
|
2894 |
|
|
|
2895 |
|
|
|
2896 |
|
|
// write 13 bit DataDSP bufer inside 16 bit fDataTrack buffer
|
2897 |
|
|
Int_t Bit16free=16;
|
2898 |
|
|
UShort_t Dato;
|
2899 |
|
|
for (Int_t NDSP=0; NDSP<DSPlength;NDSP++) {
|
2900 |
|
|
Int_t Bit13ToWrite=13;
|
2901 |
|
|
while(Bit13ToWrite>0) {
|
2902 |
|
|
if(Bit13ToWrite<=Bit16free) {
|
2903 |
|
|
Dato=((DataDSP[NDSP]&(0xFFFF >> (16-Bit13ToWrite)))<<(Bit16free-Bit13ToWrite));
|
2904 |
|
|
fDataTrack[fTracklength]=fDataTrack[fTracklength] | Dato ;
|
2905 |
|
|
Bit16free=Bit16free-Bit13ToWrite;
|
2906 |
|
|
Bit13ToWrite=0;
|
2907 |
|
|
if(Bit16free==0) {
|
2908 |
|
|
if(NDSP>15) CheckSum=CheckSum^fDataTrack[fTracklength];
|
2909 |
|
|
fTracklength++;
|
2910 |
|
|
Bit16free=16;
|
2911 |
|
|
};
|
2912 |
|
|
}
|
2913 |
|
|
else if(Bit13ToWrite>Bit16free) {
|
2914 |
|
|
Dato=( (DataDSP[NDSP]&(0xFFFF >> (16-Bit13ToWrite) ) ) >> (Bit13ToWrite-Bit16free) );
|
2915 |
|
|
fDataTrack[fTracklength]=fDataTrack[fTracklength] | Dato ;
|
2916 |
|
|
if(NDSP>15) CheckSum=CheckSum^fDataTrack[fTracklength];
|
2917 |
|
|
fTracklength++;
|
2918 |
|
|
Bit13ToWrite=Bit13ToWrite-Bit16free;
|
2919 |
|
|
Bit16free=16;
|
2920 |
|
|
};
|
2921 |
|
|
|
2922 |
|
|
}; // end cycle while(Bit13ToWrite>0)
|
2923 |
|
|
|
2924 |
|
|
}; // end cycle DataDSP
|
2925 |
|
|
if(Bit16free!=16) { fTracklength++; CheckSum=CheckSum^fDataTrack[fTracklength]; };
|
2926 |
|
|
CheckSum=(CheckSum >> 8)^(CheckSum&0x00FF);
|
2927 |
|
|
fDataTrack[fTracklength-Nword+11]=(0x0280 | (CheckSum >> 3));
|
2928 |
|
|
fDataTrack[fTracklength-Nword+12]=(0x1C00 | (CheckSum << 13) );
|
2929 |
|
|
|
2930 |
|
|
// end write 13 bit DataDSP bufer inside 16 bit fDataTrack buffer
|
2931 |
|
|
|
2932 |
|
|
//write trailer on buffer
|
2933 |
|
|
UShort_t ReLength=(UShort_t)((Nword+13)*2+3);
|
2934 |
|
|
UShort_t OveCheckCode=0x0000;
|
2935 |
|
|
|
2936 |
|
|
fDataTrack[fTracklength]=0x0000;
|
2937 |
|
|
fTracklength++;
|
2938 |
|
|
|
2939 |
|
|
fDataTrack[fTracklength]=(ReLength >> 8);
|
2940 |
|
|
fTracklength++;
|
2941 |
|
|
|
2942 |
|
|
fDataTrack[fTracklength]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );
|
2943 |
|
|
fTracklength++;
|
2944 |
|
|
// end trailer
|
2945 |
|
|
// std:: cout << "DSPlength " <<DSPlength << endl;
|
2946 |
|
|
// std:: cout << "Nword " << Nword << endl;
|
2947 |
|
|
// std:: cout << "ReLength " << ReLength << endl;
|
2948 |
|
|
};
|
2949 |
|
|
// std:: cout << "ntrastot " << ntrastot << endl;
|
2950 |
|
|
|
2951 |
|
|
};
|
2952 |
|
|
|
2953 |
|
|
|
2954 |
|
|
Float_t Digitizer::SaturationTrack(Float_t ADC) {
|
2955 |
|
|
Float_t SatFact=1.;
|
2956 |
|
|
if(ADC<70.) { SatFact=80./ADC; };
|
2957 |
|
|
if(ADC>3000.) { SatFact=3000./ADC; };
|
2958 |
|
|
return SatFact;
|
2959 |
|
|
};
|
2960 |
|
|
|
2961 |
|
|
|
2962 |
|
|
|
2963 |
|
|
|
2964 |
|
|
|
2965 |
|
|
|