| 18 |
#include "TLeafI.h" |
#include "TLeafI.h" |
| 19 |
#include "TH1.h" |
#include "TH1.h" |
| 20 |
#include "TH2.h" |
#include "TH2.h" |
| 21 |
|
#include "TF1.h" |
| 22 |
#include "TMath.h" |
#include "TMath.h" |
| 23 |
#include "TRandom.h" |
#include "TRandom.h" |
| 24 |
#include "TSQLServer.h" |
#include "TSQLServer.h" |
| 41 |
fhBookTree = tree; |
fhBookTree = tree; |
| 42 |
fFilename = file_raw; |
fFilename = file_raw; |
| 43 |
fCounter = 0; |
fCounter = 0; |
| 44 |
|
fCounterPhys = 0; // SO 5/12/'07 |
| 45 |
fOBT = 0; |
fOBT = 0; |
| 46 |
|
|
| 47 |
// |
// |
| 231 |
|
|
| 232 |
DigitizeTrackCalib(1); |
DigitizeTrackCalib(1); |
| 233 |
UInt_t length=fTracklength*2; |
UInt_t length=fTracklength*2; |
| 234 |
DigitizePSCU(length,0x12); |
DigitizePSCU(length,0x12,fDataPSCU); |
| 235 |
AddPadding(); |
AddPadding(); |
| 236 |
WriteTrackCalib(); |
WriteTrackCalib(); |
| 237 |
|
|
| 238 |
DigitizeTrackCalib(2); |
DigitizeTrackCalib(2); |
| 239 |
length=fTracklength*2; |
length=fTracklength*2; |
| 240 |
DigitizePSCU(length,0x13); |
DigitizePSCU(length,0x13,fDataPSCU); |
| 241 |
AddPadding(); |
AddPadding(); |
| 242 |
WriteTrackCalib(); |
WriteTrackCalib(); |
| 243 |
|
|
| 244 |
|
DigitizeRunHeader(); |
| 245 |
|
WriteRunHeader(); |
| 246 |
|
|
| 247 |
LoadMipCor(); // some initialization of parameters -not used now- |
LoadMipCor(); // some initialization of parameters -not used now- |
| 248 |
// end loading, digitizing and writing tracker calibration |
// end loading, digitizing and writing tracker calibration |
| 249 |
|
|
| 258 |
nbytes += fhBookTree->GetEntry(i); |
nbytes += fhBookTree->GetEntry(i); |
| 259 |
// read detectors sequentially: |
// read detectors sequentially: |
| 260 |
// http://www.ts.infn.it/fileadmin/documents/physics/experiments/wizard/cpu/gen_arch/RM_Acquisition.pdf |
// http://www.ts.infn.it/fileadmin/documents/physics/experiments/wizard/cpu/gen_arch/RM_Acquisition.pdf |
| 261 |
// on pamelatov: |
// on pamelatov: /cvs/yoda/techmodel/physics/NeutronDetectorReader.cpp |
| 262 |
// /cvs/yoda/techmodel/physics/NeutronDetectorReader.cpp |
//DigitizeTRIGGER(); |
|
DigitizeTRIGGER(); |
|
| 263 |
DigitizeTOF(); |
DigitizeTOF(); |
| 264 |
DigitizeAC(); |
DigitizeAC(); |
| 265 |
DigitizeCALO(); |
DigitizeCALO(); |
| 266 |
DigitizeTrack(); |
DigitizeTrack(); |
| 267 |
DigitizeS4(); |
DigitizeS4(); |
| 268 |
DigitizeND(); |
DigitizeND(); |
| 269 |
// |
// |
| 270 |
// Add padding to 64 bits |
// Add padding to 64 bits |
| 271 |
// |
// |
| 272 |
AddPadding(); |
AddPadding(); |
| 273 |
// |
// |
| 274 |
// Create CPU header, we need packet type (0x10 = physics data) and packet length. |
// 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; |
UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer+fS4buffer)+fPadding+fTOFbuffer+fTRIGGERbuffer; |
| 277 |
//UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer)+fPadding+fTOFbuffer+fTRIGGERbuffer; |
//UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer)+fPadding+fTOFbuffer+fTRIGGERbuffer; |
| 278 |
DigitizePSCU(length,0x10); |
DigitizePSCU(length,0x10,fDataPSCU); |
| 279 |
if ( !i%100 ) std::cout << "writing event " << i << endl; |
if ( !i%100 ) std::cout << "writing event " << i << endl; |
| 280 |
WriteData(); |
WriteData(); |
| 281 |
}; |
}; |
| 282 |
|
|
| 283 |
|
DigitizeRunTrailer(); |
| 284 |
|
WriteRunTrailer(); |
| 285 |
|
|
| 286 |
fOutputfile.close(); |
fOutputfile.close(); |
| 287 |
std::cout << "files closed" << endl << flush; |
std::cout << "files closed" << endl << flush; |
| 288 |
|
|
| 289 |
}; |
}; |
| 290 |
|
|
| 291 |
|
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 |
void Digitizer::AddPadding(){ |
void Digitizer::AddPadding(){ |
| 431 |
// |
// |
| 432 |
Float_t pd0 = (fLen+16)/64.; |
Float_t pd0 = (fLen+16)/64.; |
| 449 |
}; |
}; |
| 450 |
|
|
| 451 |
|
|
| 452 |
void Digitizer::DigitizePSCU(UInt_t length, UChar_t type) { |
void Digitizer::DigitizePSCU(UInt_t length, UChar_t type, UShort_t *pPSCU) { |
| 453 |
// |
// |
| 454 |
UChar_t buff[16]; |
UChar_t buff[16]; |
| 455 |
// |
// |
| 501 |
// |
// |
| 502 |
buff[15] = (BYTE)CM_Compute_CRC16((UINT16)0, (BYTE*)&buff, (UINT32)15); |
buff[15] = (BYTE)CM_Compute_CRC16((UINT16)0, (BYTE*)&buff, (UINT32)15); |
| 503 |
// |
// |
| 504 |
memcpy(fDataPSCU,buff,16*sizeof(UChar_t)); |
//memcpy(fDataPSCU,buff,16*sizeof(UChar_t)); |
| 505 |
|
memcpy(pPSCU,buff,16*sizeof(UChar_t)); |
| 506 |
// |
// |
| 507 |
}; |
}; |
| 508 |
|
|
| 752 |
fCALOlength++; |
fCALOlength++; |
| 753 |
// |
// |
| 754 |
UInt_t length=fCALOlength*2; |
UInt_t length=fCALOlength*2; |
| 755 |
DigitizePSCU(length,0x18); |
DigitizePSCU(length,0x18,fDataPSCU); |
| 756 |
// |
// |
| 757 |
// Add padding to 64 bits |
// Add padding to 64 bits |
| 758 |
// |
// |
| 1175 |
// |
// |
| 1176 |
}; |
}; |
| 1177 |
|
|
| 1178 |
void Digitizer::DigitizeTRIGGER() { |
//void Digitizer::DigitizeTRIGGER() { |
| 1179 |
//fDataTrigger: 153 bytes |
//fDataTrigger: 152 bytes |
| 1180 |
for (Int_t j=0; j < 153; j++) |
// corrected 30/11/'07 SO (was 153) |
| 1181 |
fDataTrigger[j]=0x00; |
//for (Int_t j=0; j < 152; j++) |
| 1182 |
}; |
// fDataTrigger[j]=0x00; |
| 1183 |
|
//}; |
| 1184 |
|
|
| 1185 |
Int_t Digitizer::DigitizeTOF() { |
Int_t Digitizer::DigitizeTOF() { |
| 1186 |
//fDataTof: 12 x 23 bytes (=276 bytes) |
//fDataTof: 12 x 23 bytes (=276 bytes) |
| 1352 |
else |
else |
| 1353 |
ipad=0; |
ipad=0; |
| 1354 |
|
|
| 1355 |
if (ip<6) { |
if (ip<6) { |
| 1356 |
Paddle2Pmt(ip, ipad, &pmtleft, &pmtright); |
Paddle2Pmt(ip, ipad, &pmtleft, &pmtright); |
| 1357 |
|
|
| 1358 |
// DC: evaluates mean position and path inside the paddle |
// DC: evaluates mean position and path inside the paddle |
| 1537 |
cout<<"-----------"<<endl; |
cout<<"-----------"<<endl; |
| 1538 |
|
|
| 1539 |
|
|
| 1540 |
//------ use channelmap 18-oct WM |
//------ use channelmap for ToF: 18-oct WM |
| 1541 |
|
|
| 1542 |
Int_t channelmap[] = {3,21,11,29,19,45,27,37,36,28,44,20,5,12,13,4, |
Int_t channelmap[] = {3,21,11,29,19,45,27,37,36,28,44,20,5,12,13,4, |
| 1543 |
6,47,14,39,22,31,30,23,38,15,46,7,0,33,16,24, |
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}; |
8,41,32,40,25,17,34,9,42,1,2,10,18,26,35,43}; |
| 1545 |
|
|
| 1546 |
Int_t ADChelp[48]; |
Int_t ADChelp[48]; |
| 1547 |
Int_t TDChelp[48]; |
Int_t TDChelp[48]; |
| 1558 |
} |
} |
| 1559 |
|
|
| 1560 |
|
|
| 1561 |
// ====== write fDataTof ======= |
// ====== write fDataTof ======= |
| 1562 |
|
|
| 1563 |
|
|
| 1564 |
// UChar_t tdcadd[8]={1,0,3,2,5,4,7,6}; (coded in 3 bit) |
// UChar_t tdcadd[8]={1,0,3,2,5,4,7,6}; (coded in 3 bit) |
| 1565 |
UChar_t Ctrl3bit[8]={32,0,96,64,160,128,224,192}; // DC (msb in 8 bit word ) |
UChar_t Ctrl3bit[8]={32,0,96,64,160,128,224,192}; // DC (msb in 8 bit word ) |
| 1566 |
|
|
| 1567 |
UChar_t tofBin; |
UChar_t tofBin; |
| 1593 |
fDataTof[j12+22]= EvaluateCrcTof(pTof); // CRC |
fDataTof[j12+22]= EvaluateCrcTof(pTof); // CRC |
| 1594 |
pTof+=23; |
pTof+=23; |
| 1595 |
}; |
}; |
| 1596 |
|
|
| 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 |
return(0); |
return(0); |
| 1660 |
}; |
}; |
| 1661 |
|
|
| 1709 |
return(crcTof); |
return(crcTof); |
| 1710 |
} |
} |
| 1711 |
|
|
| 1712 |
|
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 |
void Digitizer::Crc8Tof(UChar_t *oldCRC, UChar_t *crcTof){ |
void Digitizer::Crc8Tof(UChar_t *oldCRC, UChar_t *crcTof){ |
| 1726 |
union crctof_data { |
union crctof_data { |
| 1727 |
UChar_t word; |
UChar_t word; |
| 1793 |
// created: J. Conrad, KTH |
// created: J. Conrad, KTH |
| 1794 |
// modified: S. Orsi, INFN Roma2 |
// modified: S. Orsi, INFN Roma2 |
| 1795 |
// fDataAC[0-63]: main AC board |
// fDataAC[0-63]: main AC board |
| 1796 |
// fDataAC[64-127]: extra AC board |
// 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 |
|
|
| 1842 |
fDataAC[0] = 0xACAC; |
fDataAC[0] = 0xACAC; |
| 1843 |
fDataAC[64]= 0xACAC; |
fDataAC[64]= 0xACAC; |
| 1863 |
|
|
| 1864 |
// shift registers (moved to the end of the routine) |
// shift registers (moved to the end of the routine) |
| 1865 |
|
|
| 1866 |
Int_t evntLSB=Ievnt%65536; |
//Int_t evntLSB=Ievnt%65536; |
| 1867 |
Int_t evntMSB=(Int_t)(Ievnt/65536); |
//Int_t evntMSB=(Int_t)(Ievnt/65536); |
| 1868 |
|
Int_t evntLSB=(UShort_t)Ievnt; |
| 1869 |
|
Int_t evntMSB=Ievnt >> 16; |
| 1870 |
|
|
| 1871 |
// singles counters are dummy |
// singles counters are dummy |
| 1872 |
for (UInt_t i=0; i<=15; i++){ //SO Oct '07: // for (UInt_t i=0; i<=16; i++){ |
for (UInt_t i=0; i<=15; i++){ //SO Oct '07: // for (UInt_t i=0; i<=16; i++){ |
| 1923 |
fDataAC[i+119] = 0x1A13; |
fDataAC[i+119] = 0x1A13; |
| 1924 |
} |
} |
| 1925 |
|
|
|
// We activate all branches. Once the digitization algorithm is determined |
|
|
// only the branches that involve needed information will be activated |
|
|
|
|
|
fhBookTree->SetBranchAddress("Ievnt",&Ievnt); |
|
|
fhBookTree->SetBranchStatus("Nthcat",1); |
|
|
fhBookTree->SetBranchStatus("Iparcat",1); |
|
|
fhBookTree->SetBranchStatus("Icat",1); |
|
|
fhBookTree->SetBranchStatus("Xincat",1); |
|
|
fhBookTree->SetBranchStatus("Yincat",1); |
|
|
fhBookTree->SetBranchStatus("Zincat",1); |
|
|
fhBookTree->SetBranchStatus("Xoutcat",1); |
|
|
fhBookTree->SetBranchStatus("Youtcat",1); |
|
|
fhBookTree->SetBranchStatus("Zoutcat",1); |
|
|
fhBookTree->SetBranchStatus("Erelcat",1); |
|
|
fhBookTree->SetBranchStatus("Timecat",1); |
|
|
fhBookTree->SetBranchStatus("Pathcat",1); |
|
|
fhBookTree->SetBranchStatus("P0cat",1); |
|
|
fhBookTree->SetBranchStatus("Nthcas",1); |
|
|
fhBookTree->SetBranchStatus("Iparcas",1); |
|
|
fhBookTree->SetBranchStatus("Icas",1); |
|
|
fhBookTree->SetBranchStatus("Xincas",1); |
|
|
fhBookTree->SetBranchStatus("Yincas",1); |
|
|
fhBookTree->SetBranchStatus("Zincas",1); |
|
|
fhBookTree->SetBranchStatus("Xoutcas",1); |
|
|
fhBookTree->SetBranchStatus("Youtcas",1); |
|
|
fhBookTree->SetBranchStatus("Zoutcas",1); |
|
|
fhBookTree->SetBranchStatus("Erelcas",1); |
|
|
fhBookTree->SetBranchStatus("Timecas",1); |
|
|
fhBookTree->SetBranchStatus("Pathcas",1); |
|
|
fhBookTree->SetBranchStatus("P0cas",1); |
|
|
fhBookTree->SetBranchStatus("Nthcard",1); |
|
|
fhBookTree->SetBranchStatus("Iparcard",1); |
|
|
fhBookTree->SetBranchStatus("Icard",1); |
|
|
fhBookTree->SetBranchStatus("Xincard",1); |
|
|
fhBookTree->SetBranchStatus("Yincard",1); |
|
|
fhBookTree->SetBranchStatus("Zincard",1); |
|
|
fhBookTree->SetBranchStatus("Xoutcard",1); |
|
|
fhBookTree->SetBranchStatus("Youtcard",1); |
|
|
fhBookTree->SetBranchStatus("Zoutcard",1); |
|
|
fhBookTree->SetBranchStatus("Erelcard",1); |
|
|
fhBookTree->SetBranchStatus("Timecard",1); |
|
|
fhBookTree->SetBranchStatus("Pathcard",1); |
|
|
fhBookTree->SetBranchStatus("P0card",1); |
|
|
|
|
| 1926 |
// In this simpliefied approach we will assume that once |
// In this simpliefied approach we will assume that once |
| 1927 |
// a particle releases > 0.5 mip in one of the 12 AC detectors it |
// 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 |
// will fire. We will furthermore assume that both cards read out |
| 1951 |
// 6.41609e-01 +- 2.65846e-02 |
// 6.41609e-01 +- 2.65846e-02 |
| 1952 |
// 9.81177e+00 +- 1.21284e+00 |
// 9.81177e+00 +- 1.21284e+00 |
| 1953 |
// hp: 1 minimum ionising particle at 35cm from the PMT releases 1mip |
// hp: 1 minimum ionising particle at 35cm from the PMT releases 1mip |
|
// |
|
|
// NB: the PMT positions are needed! |
|
| 1954 |
|
|
| 1955 |
|
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 |
// look in CAT |
// look in CAT |
| 1966 |
// for (UInt_t k= 0;k<50;k++){ |
// for (UInt_t k= 0;k<50;k++){ |
| 1967 |
for (Int_t k= 0;k<Nthcat;k++){ |
for (Int_t k= 0;k<Nthcat;k++){ |
| 1971 |
|
|
| 1972 |
// look in CAS |
// look in CAS |
| 1973 |
for (Int_t k= 0;k<Nthcas;k++){ |
for (Int_t k= 0;k<Nthcas;k++){ |
| 1974 |
if (Erelcas[k] >0) |
if (Erelcas[k] >0) { |
| 1975 |
SumEcas[Icas[k]] += Erelcas[k]; |
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 |
}; |
}; |
| 1979 |
|
|
| 1980 |
// look in CARD |
// look in CARD |
| 1981 |
for (Int_t k= 0;k<Nthcard;k++){ |
for (Int_t k= 0;k<Nthcard;k++){ |
| 1982 |
if (Erelcard[k] >0) |
if (Erelcard[k] >0) |
| 1983 |
SumEcard[Icard[k]] += Erelcard[k]; |
SumEcard[Icard[k]] += Erelcard[k]; |
| 1984 |
}; |
}; |
| 1985 |
|
|
| 2211 |
} |
} |
| 2212 |
}; |
}; |
| 2213 |
|
|
| 2214 |
|
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 |
|
|
| 2222 |
void Digitizer::WriteData(){ |
void Digitizer::WriteData(){ |
| 2223 |
|
|
| 2225 |
// PSCU data are already swapped |
// PSCU data are already swapped |
| 2226 |
fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer); |
fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer); |
| 2227 |
// TRG |
// TRG |
| 2228 |
fOutputfile.write(reinterpret_cast<char*>(fDataTrigger),sizeof(UChar_t)*153); |
fOutputfile.write(reinterpret_cast<char*>(fDataTrigger),sizeof(UChar_t)*fTRIGGERbuffer); //30/11/07 SO; it was 153 |
| 2229 |
// TOF |
// TOF |
| 2230 |
fOutputfile.write(reinterpret_cast<char*>(fDataTof),sizeof(UChar_t)*276); |
fOutputfile.write(reinterpret_cast<char*>(fDataTof),sizeof(UChar_t)*fTOFbuffer); |
| 2231 |
// AC |
// AC |
| 2232 |
UShort_t temp[1000000]; |
UShort_t temp[1000000]; |
| 2233 |
memset(temp,0,sizeof(UShort_t)*1000000); |
memset(temp,0,sizeof(UShort_t)*1000000); |