New classes and macros for raw data compression and ADC (D.Favretto)
[u/mrichter/AliRoot.git] / ITS / AliITSDDLRawData.cxx
CommitLineData
2e9f335b 1/**************************************************************************
2 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16#include <stdlib.h>
17#include <iostream.h>
18#include <TClonesArray.h>
19#include <TTree.h>
20#include <AliITS.h>
21#include <AliITSgeom.h>
22#include <AliITSdigit.h>
23#include "AliITSDDLRawData.h"
24
25ClassImp(AliITSDDLRawData)
26
27////////////////////////////////////////////////////////////////////////////////////////
28AliITSDDLRawData::AliITSDDLRawData(){
29 fIndex=-1;
30 fHalfStaveModule=-1;
31}
32
33////////////////////////////////////////////////////////////////////////////////////////
34
35AliITSDDLRawData::AliITSDDLRawData(const AliITSDDLRawData &source){
36 // Copy Constructor
37 this->fIndex=source.fIndex;
38 this->fHalfStaveModule=source.fHalfStaveModule;
39 return;
40}
41
42////////////////////////////////////////////////////////////////////////////////////////
43
44AliITSDDLRawData& AliITSDDLRawData::operator=(const AliITSDDLRawData &source){
45 //Assigment operator
46 this->fIndex=source.fIndex;
47 this->fHalfStaveModule=source.fHalfStaveModule;
48 return *this;
49}
50
51////////////////////////////////////////////////////////////////////////////////////////
52//STRIP
53//
54
55void AliITSDDLRawData::GetDigitsSSD(TClonesArray *ITSdigits,Int_t mod, ULong_t *buf){
56 Int_t ix;
57 Int_t iz;
58 Int_t is;
59 ULong_t Word;
60 ULong_t BaseWord;
61 Int_t ndigits = ITSdigits->GetEntries();
62 AliITSdigit *digs;
63 if(ndigits){
64 for (Int_t digit=0;digit<ndigits;digit++) {
65 digs = (AliITSdigit*)ITSdigits->UncheckedAt(digit);
66 iz=digs->fCoord1; // If iz==0, N side and if iz=1 P side
67 ix=digs->fCoord2; // Strip Numbar
68 is=digs->fSignal; // ADC Signal
69 // cout<<" Module:"<<mod-500<<" N/P side:"<<iz<<" Strip Number:"<<ix<<" Amplidute:"<<is-1<<endl;
70 BaseWord=0;
71 Word=is-1;
72 PackWord(BaseWord,Word,0,9);//ADC data
73 Word=ix;
74 PackWord(BaseWord,Word,10,19);//Strip Number
75 Word=iz;
76 PackWord(BaseWord,Word,20,20);//ADC Channel ID (N or P side)
77 Word=mod;
78 PackWord(BaseWord,Word,21,31);//ADC module ID
79 fIndex++;
80 buf[fIndex]=BaseWord;
81 }//end for
82 }//end if
83 return;
84}//end GetDigitsSSD
85
86////////////////////////////////////////////////////////////////////////////////////////
87//Silicon Drift Detector
88//
89
90void AliITSDDLRawData::GetDigitsSDD(TClonesArray *ITSdigits,Int_t mod, ULong_t *buf){
91 Int_t ix;
92 Int_t iz;
93 Int_t is;
94 ULong_t Word;
95 ULong_t BaseWord;
96 Int_t ndigits = ITSdigits->GetEntries();
97 AliITSdigit *digs;
98 if(ndigits){
99 //cout<<"Mudule "<<mod<<" number of digits "<<ndigits<<endl;
100 for (Int_t digit=0;digit<ndigits;digit++) {
101 digs = (AliITSdigit*)ITSdigits->UncheckedAt(digit);
102 iz=digs->fCoord1; // Anode
103 ix=digs->fCoord2; // Time
104 is=digs->fSignal; // ADC Signal
105 // cout<<"Amplitude value:"<<is<<" Time Bucket:"<<ix<<" Anode:"<<iz<<endl;
106 if (is>255){cout<<"WARNING (!) bits words is needed)!!!\n";}
107 BaseWord=0;
108 /*
109 //10 bits words for amplitude value
110 Word=is;
111 PackWord(BaseWord,Word,0,9);//ADC data
112 Word=ix;
113 PackWord(BaseWord,Word,10,17);//Time bucket
114 Word=iz;
115 PackWord(BaseWord,Word,18,26);//Anode Number
116 Word=mod;
117 PackWord(BaseWord,Word,27,31);//Module number
118 */
119
120 //8bits words for amplitude value
121 Word=is;
122 PackWord(BaseWord,Word,0,7);//ADC data
123 Word=ix;
124 PackWord(BaseWord,Word,8,15);//Time bucket
125 Word=iz;
126 PackWord(BaseWord,Word,16,24);//Anode Number
127 Word=mod;
128 PackWord(BaseWord,Word,25,31);//Module number
129
130 fIndex++;
131 buf[fIndex]=BaseWord;
132 }//end for
133 }//end if
134 return;
135}//end GetDigitsSDD
136
137////////////////////////////////////////////////////////////////////////////////////////
138//PIXEL
139//
140
141void AliITSDDLRawData::GetDigitsSPD(TClonesArray *ITSdigits,Int_t mod, ULong_t *buf){
142 Int_t ix;
143 Int_t iz;
144 Int_t ChipNo=0;
145 ULong_t BaseWord=0;
146 ULong_t HitRow=0;
147 Int_t ChipHitCount=0; //Number of Hit in the current chip
148 Int_t PreviousChip=-1; //Previuos chip respect to the actual aone
149 Int_t ndigits = ITSdigits->GetEntries(); //number of digits in the current module
150 //cout<<" Number of digits in the current module:"<<ndigits<<" module:"<<mod<<endl;
151 AliITSdigit *digs;
152 fHalfStaveModule++; //It's a private variable used to distinguish between the firs
153 //and the second module of an Half Stave Module
154 if(ndigits){
155 //loop over digits
156 for (Int_t digit=0;digit<ndigits;digit++){
157 digs = (AliITSdigit*)ITSdigits->UncheckedAt(digit);
158 /*---------------------------------------------------------------------------
159 * Each module contains 5 read out chips of 256 rows and 32 columns.
160 * So, the cell number in Z direction varies from 1 to 160. Therefore,
161 * to get the chip address (0 to 4), we need to divide column number by 32.
162 * ---------------------------------------------------------------------*/
163 iz=digs->fCoord1; // Cell number in Z direction
164 ix=digs->fCoord2; // Cell number in X direction
165 ChipNo=iz/32;
166 HitRow=iz-ChipNo*32;
167 if(fHalfStaveModule){
168 ChipNo+=5;
169 fHalfStaveModule=-1;
170 }//end if
171 //cout<<"Chip number of the current digit:"<<ChipNo<<" Row:"<<HitRow<<" Column:"<<ix<<endl;
172 if(PreviousChip==-1){
173 //loop over chip without digits
174 //Even if there aren't digits for a given chip
175 //the chip header and the chip trailer are stored
176 for(Int_t i=0;i<(iz/32);i++){
177 if(ChipNo>4)
178 WriteChipHeader(i+5,(mod/2),BaseWord);
179 else
180 WriteChipHeader(i,(mod/2),BaseWord);
181 WriteChipTrailer(buf,ChipHitCount,BaseWord);
182 }//end for
183 PreviousChip=ChipNo;
184 WriteChipHeader(ChipNo,(mod/2),BaseWord);
185 ChipHitCount++;
186 WriteHit(buf,ix,HitRow,BaseWord);
187 }//end if
188 else{
189 ChipHitCount++;
190 if(PreviousChip!=ChipNo){
191 WriteChipTrailer(buf,ChipHitCount-1,BaseWord);
192 for(Int_t i=PreviousChip+1;i<ChipNo;i++){
193 WriteChipHeader(i,(mod/2),BaseWord);
194 WriteChipTrailer(buf,0,BaseWord);
195 }//end for
196 WriteChipHeader(ChipNo,(mod/2),BaseWord);
197 PreviousChip=ChipNo;
198 }//end if
199 WriteHit(buf,ix,HitRow,BaseWord);
200 }//end else
201 }//end for
202 //Even if there aren't digits for a given chip
203 //the chip header and the chip trailer are stored
204 Int_t End=4;
205 if(ChipNo>4)End+=5;
206 WriteChipTrailer(buf,ChipHitCount,BaseWord);
207 for(Int_t i=ChipNo+1;i<=End;i++){
208 WriteChipHeader(i,(mod/2),BaseWord);
209 WriteChipTrailer(buf,0,BaseWord);
210 }//end for
211 }//end if
212 else{
213 //In this module there aren't digits but
214 //the chip header and chip trailer are store anyway
215 if(fHalfStaveModule){
216 ChipNo=5;
217 fHalfStaveModule=-1;
218 }//end if
219 for(Int_t i=0;i<5;i++){
220 WriteChipHeader(ChipNo+i,(mod/2),BaseWord);
221 WriteChipTrailer(buf,ChipHitCount,BaseWord);
222 }//end for
223 }//end else
224 return;
225}//end GetDigitsSPD
226
227////////////////////////////////////////////////////////////////////////////////////////////////////////////////
228
229void AliITSDDLRawData::PackWord(ULong_t &BaseWord, ULong_t Word, Int_t StartBit, Int_t StopBit){
230 ULong_t DummyWord,OffSet;
231 Int_t Length;
232 ULong_t Sum;
233 //The BaseWord is being filled with 1 from StartBit to StopBit
234 Length=StopBit-StartBit+1;
235 Sum=(ULong_t)pow(2,Length)-1;
236 if(Word > Sum){
237 cout<<"WARNING::Word to be filled is not within desired length"<<endl;
238 cout<<"Word:"<<Word<<" Start bit:"<<StartBit<<" Stop Bit:"<<StopBit<<endl;
239 exit(-1);
240 }
241 OffSet=Sum;
242 OffSet<<=StartBit;
243 BaseWord=BaseWord|OffSet;
244 //The Word to be filled is shifted to the position StartBit
245 //and the remaining Left and Right bits are filled with 1
246 Sum=(ULong_t)pow(2,StartBit)-1;
247 DummyWord=0xFFFFFFFF<<Length;
248 DummyWord +=Word;
249 DummyWord<<=StartBit;
250 DummyWord+=Sum;
251 BaseWord=BaseWord&DummyWord;
252 return;
253}
254
255/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
256
257void AliITSDDLRawData::UnpackWord(ULong_t PackedWord, Int_t StartBit, Int_t StopBit, ULong_t &Word){
258 ULong_t OffSet;
259 Int_t Length;
260 Length=StopBit-StartBit+1;
261 OffSet=(ULong_t)pow(2,Length)-1;
262 OffSet<<=StartBit;
263 Word=PackedWord&OffSet;
264 Word>>=StartBit;
265 return;
266}
267
268/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
269
270Int_t AliITSDDLRawData::RawDataSPD(AliITS *ITS,TTree *TD ,Int_t LDCsNumber){
271
272 //Silicon Pixel Detector
273 const Int_t DDLNumber=20; // Number of DDL in SPD
274 const Int_t ModulePerDDL=12; // Number of modules in each DDL
275 //Row ==> DDLs
276 //Column ==> Modules
277 Int_t SPDMap[DDLNumber][ModulePerDDL]={{ 0, 1, 4, 5, 80, 81, 84, 85, 88, 89, 92, 93},
278 { 2, 3, 6, 7, 82, 83, 86, 87, 90, 91, 94, 95},
279 { 8, 9,12,13, 96, 97,100,101,104,105,108,109},
280 {10,11,14,15, 98, 99,102,103,106,107,110,111},
281 {16,17,20,21,112,113,116,117,120,121,124,125},
282 {18,19,22,23,114,115,118,119,122,123,126,127},
283 {24,25,28,29,128,129,132,133,136,137,140,141},
284 {26,27,30,31,130,131,134,135,138,139,142,143},
285 {32,33,36,37,144,145,148,149,152,153,156,157},
286 {34,35,38,39,146,147,150,151,154,155,158,159},
287 {40,41,44,45,160,161,164,165,168,169,172,173},
288 {42,43,46,47,162,163,166,167,170,171,174,175},
289 {48,47,50,51,176,177,180,181,184,185,188,189},
290 {50,51,54,55,178,179,182,183,186,187,190,191},
291 {56,57,60,61,192,193,196,197,200,201,204,205},
292 {58,59,62,63,194,195,198,199,202,203,206,207},
293 {64,65,68,69,208,209,212,213,216,217,220,221},
294 {66,67,70,71,210,211,214,215,218,219,222,223},
295 {72,73,76,77,224,225,228,229,232,233,236,237},
296 {74,75,78,79,226,227,230,231,234,235,238,239}};
297 Int_t DDLPerFile=DDLNumber/LDCsNumber;
298 if(DDLNumber%LDCsNumber)DDLPerFile++;
299 cout<<"Number of DDL per File: "<<DDLPerFile<<endl;
300 Int_t subd=0;
301 Int_t CountDDL=0;
302 Int_t SliceNumber=1;
303 const Int_t size=21000; //256*32*5=40960 max number of digits per module
304 ULong_t buf[size]; //One buffer cell can contain 2 digits
305 fIndex=-1;
306 TClonesArray *ITSdigits = ITS->DigitsAddress(subd);
307
308 Int_t nbytes = 0;
309 char fileName[15];
310
311 ULong_t MiniHeaderPosition=0; //variable used to store the position of the Mini Header inside a file
312 ofstream outfile; // logical name of the output file
313 Int_t Flag=0; // 0==> Uncompressed data 1==>Compressed Data
314 Int_t Detector=1; // 1==>ITS (Pixel) 2==>ITS (Drift) 3==>ITS (Strip) 0==>TPC ......
315 ULong_t Size=0; // Size of the data block that follows the mini header
316 Int_t MagicWord=0x123456; // Magic word used to distinguish between data and garbage
317 sprintf(fileName,"SPDslice%d",SliceNumber); //The name of the output file. There are as many slides as the number of LDC
318 outfile.open(fileName,ios::binary);
319 ULong_t MiniHeader[3];
320 Int_t MiniHeaderSize=sizeof(ULong_t)*3;
321 Int_t Version=1; //Version of the mini header
322 //loop over DDLs
323 for(Int_t i=0;i<DDLNumber;i++){
324 CountDDL++;
325 //write Dummy MINI HEADER
326 MiniHeader[0]=Size;
327 PackWord(MiniHeader[1],MagicWord,8,31);
328 PackWord(MiniHeader[1],Detector,0,7);
329 PackWord(MiniHeader[2],i,16,31);
330 PackWord(MiniHeader[2],Flag,8,15);
331 PackWord(MiniHeader[2],Version,0,7);
332 MiniHeaderPosition=outfile.tellp();
333 outfile.write((char*)(MiniHeader),MiniHeaderSize);
334 //Loops over Modules of a particular DDL
335 for (Int_t mod=0; mod<ModulePerDDL; mod++){
336 ITS->ResetDigits();
337 nbytes += TD->GetEvent(SPDMap[i][mod]);
338 //For each Module, buf contains the array of data words in Binary format
339 //fIndex gives the number of 32 bits words in the buffer for each module
340 GetDigitsSPD(ITSdigits,SPDMap[i][mod],buf);
341 outfile.write((char *)buf,((fIndex+1)*sizeof(ULong_t)));
342 for(Int_t i=0;i<(fIndex+1);i++){
343 buf[i]=0;
344 }//end for
345 fIndex=-1;
346 }//end for
347
348 //Write REAL MINI HEADER
349 ULong_t CurrentFilePosition=outfile.tellp();
350 outfile.seekp(MiniHeaderPosition);
351 Size=CurrentFilePosition-MiniHeaderPosition-MiniHeaderSize;
352
353 outfile.write((char*)(&Size),sizeof(ULong_t));
354 outfile.seekp(CurrentFilePosition);
355 if(CountDDL==DDLPerFile){
356 outfile.close();
357 SliceNumber++;
358 sprintf(fileName,"SPDslice%d",SliceNumber);
359 if(i!=(DDLNumber-1))
360 outfile.open(fileName,ios::binary);
361 CountDDL=0;
362 }//end if
363 }//end for
364 outfile.close();
365 return 0;
366}
367
368/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
369
370Int_t AliITSDDLRawData::RawDataSSD(AliITS *ITS,TTree *TD ,Int_t LDCsNumber){
371 //Strip detector
372 const Int_t DDLNumber=16; // Number of DDL in SSD
373 const Int_t ModulePerDDL=109; // Number of modules in each DDL
374 //DDL from 32 to 47 (16 DDL)
375 //Row ==> DDLs
376 //Column ==> Modules
377 Int_t SSDMap[DDLNumber][ModulePerDDL]={
378 //104
379 //DDL[32][]=
380 { 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510,
381 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532,
382 1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,
383 1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,
384 1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,
385 2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,
386 2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,
387 2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,
388 2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,-1,-1,-1,-1,-1},
389 //93
390 //DDL[33][]=
391 { 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576,
392 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598,
393 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620,
394 1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,
395 1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,
396 1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,
397 1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,
398 1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,
399 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,-1,-1,-1},
400 //103
401 //DDL[34][]=
402 { 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642,
403 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664,
404 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686,
405 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708,
406 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730,
407 1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,
408 1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,
409 1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,
410 1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,-1,-1,-1,-1,-1,-1},
411 //104
412 //DDL[35][]=
413 { 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752,
414 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774,
415 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796,
416 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818,
417 1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,
418 1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,
419 1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,
420 1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,
421 1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,-1,-1,-1,-1,-1},
422 //104
423 //DDL[36[]=
424 { 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840,
425 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862,
426 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884,
427 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906,
428 1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,
429 1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,
430 1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1682,1684,
431 1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,
432 1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,-1,-1,-1,-1,-1},
433 //104
434 //DDL[37][]=
435 { 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928,
436 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950,
437 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972,
438 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994,
439 1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,
440 1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,
441 1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,
442 1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,
443 1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,-1,-1,-1,-1,-1},
444 //103
445 //DDL[38][]=
446 {1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,
447 1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,
448 1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,
449 1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,
450 1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,
451 1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,
452 1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,
453 1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,
454 1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,-1,-1,-1,-1,-1,-1},
455 //104
456 //DDL[39][]=
457 {1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,
458 1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,
459 1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,
460 1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,
461 1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,
462 1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,
463 2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,
464 2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,
465 2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,-1,-1,-1,-1,-1},
466 //109
467 //DDL[40][]=
468 { 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521,
469 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543,
470 1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,
471 1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,
472 1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,
473 2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,
474 2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,
475 2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,
476 2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197},
477 //109
478 //DDL[41][]=
479 { 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565,
480 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587,
481 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609,
482 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631,
483 1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,
484 1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,
485 1335,1336,1337,1338,1339,1340,1341,1342,1443,1344,1345,1346,1347,
486 1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,
487 1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397},
488 //107
489 //DDL[42][]=
490 { 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653,
491 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675,
492 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697,
493 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719,
494 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741,
495 1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,
496 1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,
497 1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,
498 1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,-1,-1},
499 //109
500 //DDL[43][]=
501 { 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763,
502 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785,
503 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807,
504 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829,
505 1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,
506 1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,
507 1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,
508 1585,1586,1587,1588,1589,1590,1591,1592,1593,1584,1595,1596,1597,
509 1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622},
510 //109
511 //DDL[44][]=
512 { 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851,
513 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873,
514 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895,
515 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917,
516 1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,
517 1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,
518 1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,
519 1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,
520 1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747},
521 //109
522 //DDL[45][]=
523 {929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939,
524 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961,
525 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983,
526 995, 996, 997, 998, 999,1000,1001,1002,1003,1004,1005,
527 1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,
528 1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,
529 1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,
530 1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,
531 1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872},
532 //109
533 //DDL[46][]=
534 {1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,
535 1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,
536 1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,
537 1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,
538 1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,
539 1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,
540 1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,
541 1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,
542 1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972},
543 //109
544 //DDL[47][]=
545 {1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,
546 1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,
547 1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,
548 1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,
549 1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,
550 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,
551 2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,
552 2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,
553 2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097} };
554
555
556 Int_t DDLPerFile=DDLNumber/LDCsNumber;
557 if(20%LDCsNumber)DDLPerFile++;
558 cout<<"Number of DDL per File: "<<DDLPerFile<<endl;
559 Int_t subd=2; //SSD
560 Int_t CountDDL=0;
561 Int_t SliceNumber=1;
562 const Int_t size=1536;//768*2 Number of stripe * number of sides(N and P)
563 ULong_t buf[size];
564 fIndex=-1;
565 Int_t nbytes = 0;
566 TClonesArray *ITSdigits = ITS->DigitsAddress(subd);
567 char fileName[15];
568
569 ULong_t MiniHeaderPosition=0; //variable used to store the position of the Mini Header inside the file
570 ofstream outfile; // logical name of the output file
571 Int_t Flag=0; // 0==> Uncompressed data 1==>Compressed Data
572 Int_t Detector=3; // 1==>ITS (Pixel) 2==>ITS (Drift) 3==>ITS (Strip) 0==>TPC ......
573 ULong_t Size=0; // Size of the data block that follows the mini header
574 Int_t MagicWord=0x123456; // Magic word used to distinguish between data and garbage
575 sprintf(fileName,"SSDslice%d",SliceNumber); //The name of the output file. There are as many slides as the number of LDC
576 outfile.open(fileName,ios::binary);
577 ULong_t MiniHeader[3];
578 Int_t MiniHeaderSize=sizeof(ULong_t)*3;
579 Int_t Version=1; //Version of the mini header
580 //loop over DDLs
581
582 for(Int_t i=0;i<DDLNumber;i++){
583 CountDDL++;
584 //write Dummy MINI HEADER
585 MiniHeader[0]=Size;
586 PackWord(MiniHeader[1],MagicWord,8,31);
587 PackWord(MiniHeader[1],Detector,0,7);
588 PackWord(MiniHeader[2],i,16,31);
589 PackWord(MiniHeader[2],Flag,8,15);
590 PackWord(MiniHeader[2],Version,0,7);
591 MiniHeaderPosition=outfile.tellp();
592 outfile.write((char*)(MiniHeader),MiniHeaderSize);
593
594 //Loops over Modules of a particular DDL
595 for (Int_t mod=0; mod<ModulePerDDL; mod++){
596 if(SSDMap[i][mod]!=-1){
597 ITS->ResetDigits();
598 nbytes += TD->GetEvent(SSDMap[i][mod]);
599 //For each Module, buf contains the array of data words in Binary format
600 //fIndex gives the number of 32 bits words in the buffer for each module
601 GetDigitsSSD(ITSdigits,mod,buf);
602 outfile.write((char *)buf,((fIndex+1)*sizeof(ULong_t)));
603 for(Int_t i=0;i<(fIndex+1);i++){
604 buf[i]=0;
605 }//end for
606 fIndex=-1;
607 }//end if
608 }//end for
609 //Write REAL MINI HEADER
610 ULong_t CurrentFilePosition=outfile.tellp();
611 outfile.seekp(MiniHeaderPosition);
612 Size=CurrentFilePosition-MiniHeaderPosition-MiniHeaderSize;
613
614 outfile.write((char*)(&Size),sizeof(ULong_t));
615 outfile.seekp(CurrentFilePosition);
616 if(CountDDL==DDLPerFile){
617 outfile.close();
618 SliceNumber++;
619 sprintf(fileName,"SSDslice%d",SliceNumber);
620 if(i!=(DDLNumber-1))
621 outfile.open(fileName,ios::binary);
622 CountDDL=0;
623 }//end if
624 }//end for
625 outfile.close();
626 return 0;
627}
628
629/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
630
631Int_t AliITSDDLRawData::RawDataSDD(AliITS *ITS,TTree *TD ,Int_t LDCsNumber){
632 //Silicon Drift Detector
633 const Int_t DDLNumber=12; // Number of DDL in SPD
634 const Int_t ModulePerDDL=22; // Number of modules in each DDL
635 //Row ==> DDLs
636 //Column ==> Modules
637 Int_t SDDMap[DDLNumber][ModulePerDDL]= {{240,241,242,246,247,248,252,253,254,258,259,260,264,265,266,270,271,272,276,277,278,-1},
638 {243,244,245,249,250,251,255,256,257,261,262,263,267,268,269,273,274,275,279,280,281,-1},
639 {282,283,284,288,289,290,294,295,296,300,301,302,306,307,308,312,313,314,318,319,320,-1},
640 {285,286,287,291,292,293,297,298,299,303,304,305,309,310,311,315,316,317,321,322,323,-1},
641 {324,325,326,327,332,333,334,335,340,341,342,343,348,349,350,351,356,357,358,359,364,365},
642 {328,329,330,331,336,337,338,339,344,345,346,347,352,353,354,355,360,361,362,363,368,369},
643 {366,367,372,373,374,375,380,381,382,383,388,389,390,391,396,397,398,399,404,405,406,407},
644 {370,371,376,377,378,379,384,385,386,387,392,393,394,395,400,401,402,403,408,409,410,411},
645 {412,413,414,415,420,421,422,423,428,429,430,431,436,436,438,439,444,445,446,447,452,453},
646 {416,417,418,419,424,425,426,427,432,433,434,435,440,441,442,443,448,449,450,451,456,457},
647 {454,455,460,461,462,463,468,469,470,471,476,477,478,479,484,485,486,487,492,493,494,495},
648 {458,459,464,465,466,467,472,473,474,475,480,481,482,483,488,489,490,491,496,497,498,499}};
649
650 Int_t DDLPerFile=DDLNumber/LDCsNumber;
651 if(DDLNumber%LDCsNumber)DDLPerFile++;
652 cout<<"Number of DDL per File: "<<DDLPerFile<<endl;
653 Int_t subd=1;
654 Int_t CountDDL=0;
655 Int_t SliceNumber=1;
656 const Int_t size=131072; //256*512
657 ULong_t buf[size];
658 fIndex=-1;
659 Int_t nbytes = 0;
660 TClonesArray *ITSdigits = ITS->DigitsAddress(subd);
661 char fileName[15];
662
663 ULong_t MiniHeaderPosition=0; // variable used to store the position of the Mini Header inside a file
664 ofstream outfile; // logical name of the output file
665 Int_t Flag=0; // 0==> Uncompressed data 1==>Compressed Data
666 Int_t Detector=2; // 1==>ITS (Pixel) 2==>ITS (Drift) 3==>ITS (Strip) 0==>TPC ......
667 ULong_t Size=0; // Size of the data block that follows the mini header
668 Int_t MagicWord=0x123456; // Magic word used to distinguish between data and garbage
669 sprintf(fileName,"SDDslice%d",SliceNumber); //The name of the output file. There are as many slides as the number of LDC
670 outfile.open(fileName,ios::binary);
671 ULong_t MiniHeader[3];
672 Int_t MiniHeaderSize=sizeof(ULong_t)*3;
673 Int_t Version=1; //Version of the mini header
674 //loop over DDLs
675 for(Int_t i=0;i<DDLNumber;i++){
676 CountDDL++;
677 //write Dummy MINI HEADER
678 MiniHeader[0]=Size;
679 PackWord(MiniHeader[1],MagicWord,8,31);
680 PackWord(MiniHeader[1],Detector,0,7);
681 PackWord(MiniHeader[2],i,16,31);
682 PackWord(MiniHeader[2],Flag,8,15);
683 PackWord(MiniHeader[2],Version,0,7);
684 MiniHeaderPosition=outfile.tellp();
685 outfile.write((char*)(MiniHeader),MiniHeaderSize);
686 //Loops over Modules of a particular DDL
687 for (Int_t mod=0; mod<ModulePerDDL; mod++){
688 if(SDDMap[i][mod]!=-1){
689 ITS->ResetDigits();
690 nbytes += TD->GetEvent(SDDMap[i][mod]);
691 //For each Module, buf contains the array of data words in Binary format
692 //fIndex gives the number of 32 bits words in the buffer for each module
693 // cout<<"MODULE NUMBER:"<<SDDMap[i][mod]<<endl;
694 GetDigitsSDD(ITSdigits,mod,buf);
695 outfile.write((char *)buf,((fIndex+1)*sizeof(ULong_t)));
696 for(Int_t i=0;i<(fIndex+1);i++){
697 buf[i]=0;
698 }//end for
699 fIndex=-1;
700 }//end if
701 }//end for
702
703 //Write REAL MINI HEADER
704 ULong_t CurrentFilePosition=outfile.tellp();
705 outfile.seekp(MiniHeaderPosition);
706 Size=CurrentFilePosition-MiniHeaderPosition-MiniHeaderSize;
707
708 outfile.write((char*)(&Size),sizeof(ULong_t));
709 outfile.seekp(CurrentFilePosition);
710 if(CountDDL==DDLPerFile){
711 outfile.close();
712 SliceNumber++;
713 sprintf(fileName,"SDDslice%d",SliceNumber);
714 if(i!=(DDLNumber-1))
715 outfile.open(fileName,ios::binary);
716 CountDDL=0;
717 }//end if
718 }//end for
719 outfile.close();
720 return 0;
721}
722
723/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
724
725void AliITSDDLRawData::WriteChipHeader(Int_t ChipAddr,Int_t EventCnt,ULong_t &BaseWord){
726 //cout<<"Chip: "<<ChipAddr<<" Half Stave module:"<<EventCnt<<endl;
727 BaseWord=0;
728 PackWord(BaseWord,ChipAddr,0,3);
729 PackWord(BaseWord,EventCnt,4,10);
730 PackWord(BaseWord,0x7,11,13);
731 PackWord(BaseWord,0x1,14,15);
732 return;
733}//end WriteChipHeader
734
735/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
736
737void AliITSDDLRawData::ReadChipHeader(Int_t &ChipAddr,Int_t &EventCnt,ULong_t BaseWord){
738 ULong_t temp=0;
739 UnpackWord(BaseWord,0,3,temp);
740 ChipAddr=(Int_t)temp;
741 UnpackWord(BaseWord,4,10,temp);
742 EventCnt=(Int_t)temp;
743 cout<<"Chip: "<<ChipAddr<<" Half Stave module:"<<EventCnt<<endl;
744 return;
745}//end ReadChipHeader
746
747/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
748
749void AliITSDDLRawData::WriteChipTrailer(ULong_t *buf,Int_t ChipHitCount,ULong_t &BaseWord){
750 //pixel fill word
751 if((ChipHitCount%2)!=0){
752 PackWord(BaseWord,0xFECD,0,15);
753 }
754 PackWord(BaseWord,ChipHitCount,16,28);
755 PackWord(BaseWord,0x0,30,31);
756 fIndex++;
757 buf[fIndex]=BaseWord;
758 BaseWord=0;
759 return;
760}//end WriteChipTrailer
761
762/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
763
764void AliITSDDLRawData::ReadChipTrailer(Int_t &ChipHitCount,ULong_t BaseWord){
765 ULong_t temp=0;
766 UnpackWord(BaseWord,16,28,temp);
767 ChipHitCount=(Int_t)temp;
768 return;
769}//end ReadChipTrailer
770
771/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
772
773void AliITSDDLRawData::WriteHit(ULong_t *buf,Int_t RowAddr,Int_t HitAddr,ULong_t &BaseWord){
774 if(!BaseWord){
775 PackWord(BaseWord,HitAddr,0,4);
776 PackWord(BaseWord,RowAddr,5,12);
777 PackWord(BaseWord,2,14,15);
778 }//end if
779 else{
780 PackWord(BaseWord,HitAddr,16,20);
781 PackWord(BaseWord,RowAddr,21,28);
782 PackWord(BaseWord,2,30,31);
783 fIndex++;
784 buf[fIndex]=BaseWord;
785 BaseWord=0;
786 }//end else
787 return;
788}//end WriteHit
789
790/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
791
792void AliITSDDLRawData::TestFormat(){
793 ifstream f;
794 Int_t LDCsNumber=2;
795 ofstream ftxt("File2.txt");
796 ULong_t Size=0;
797 char filename[15];
798 ULong_t DDLNumber=0;
799 ULong_t MiniHeader[3];
800 Int_t MiniHeaderSize=sizeof(ULong_t)*3;
801 for(Int_t i=1;i<=LDCsNumber;i++){
802 sprintf(filename,"SPDslice%d",i);
803 f.open(filename,ios::binary|ios::in);
804 if(!f){exit(1);}
805 //loop over the DDL block
806 //here the Mini Header is read
807 while( f.read((char*)(MiniHeader),MiniHeaderSize)){
808 //cout<<"Block Size: "<<Size<<endl;
809 Size=MiniHeader[0];
810 UnpackWord(MiniHeader[2],16,31,DDLNumber);
811 ftxt<<"DDL NUMBER:"<<DDLNumber<<endl;
812 ULong_t Word=0;
813 ULong_t Code=0;
814 ULong_t Decoded1,Decoded2=0;
815 for(ULong_t j=0;j<(Size/4);j++){
816 f.read((char*)(&Word),sizeof(Word)); //32 bits word
817 Code=0;
818 UnpackWord(Word,14,15,Code);
819 DecodeWord(Code,Word,0,Decoded1,Decoded2);
820 switch (Code){
821 case 0://trailer
822 ftxt<<"Number of Hit:"<<Decoded1<<endl;
823 break;
824 case 1://header
825 ftxt<<"Half Stave Number:"<<Decoded1<<" Chip Number:"<<Decoded2<<endl;
826 break;
827 case 2://hit
828 ftxt<<"Row:"<<Decoded1<<" Column:"<<Decoded2<<endl;
829 break;
830 case 3://fill word
831 break;
832 }//end switch
833 Code=0;
834 UnpackWord(Word,30,31,Code);
835 DecodeWord(Code,Word,1,Decoded1,Decoded2);
836 switch (Code){
837 case 0://trailer
838 ftxt<<"Number of Hit:"<<Decoded1<<endl;
839 break;
840 case 1://header
841 ftxt<<"Half Stave Number:"<<Decoded1<<" Chip Number:"<<Decoded2<<endl;
842 break;
843 case 2://hit
844 ftxt<<"Row:"<<Decoded1<<" Column:"<<Decoded2<<endl;
845 break;
846 case 3://fill word
847 break;
848 }//end switch
849 }//end for
850 }//end while
851 f.close();
852 }//end for
853 ftxt.close();
854 return;
855}
856
857void AliITSDDLRawData::DecodeWord(ULong_t Code,ULong_t BaseWord,Int_t FirstHalf,ULong_t &Decoded1,ULong_t &Decoded2){
858 //FirstHalf=0 ==>bits from 0 to 15
859 //FirstHalf=1 ==>bits from 16 to 31
860 if(!FirstHalf){
861 switch (Code){
862 case 0://trailer
863 UnpackWord(BaseWord,0,12,Decoded1);
864 break;
865 case 1://header
866 UnpackWord(BaseWord,4,10,Decoded1);
867 UnpackWord(BaseWord,0,3,Decoded2);
868 break;
869 case 2://hit
870 UnpackWord(BaseWord,5,12,Decoded1);
871 UnpackWord(BaseWord,0,4,Decoded2);
872 break;//fill word
873 case 3:
874 UnpackWord(BaseWord,0,13,Decoded1);
875 break;
876 }//end switch
877 }
878 else{
879 switch (Code){
880 case 0://trailer
881 UnpackWord(BaseWord,16,28,Decoded1);
882 break;
883 case 1://header
884 UnpackWord(BaseWord,20,26,Decoded1);
885 UnpackWord(BaseWord,16,19,Decoded2);
886 break;
887 case 2://hit
888 UnpackWord(BaseWord,21,28,Decoded1);
889 UnpackWord(BaseWord,16,20,Decoded2);
890 break;
891 case 3://fill word
892 UnpackWord(BaseWord,16,29,Decoded1);
893 break;
894 }//end switch
895 }
896 return;
897}