1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 /// This class provides access to PMD digits in raw data.
22 /// It loops over all PMD digits in the raw data given by the AliRawReader.
23 /// The Next method goes to the next digit. If there are no digits left
24 /// it returns kFALSE.
25 /// Several getters provide information about the current digit.
27 ///////////////////////////////////////////////////////////////////////////////
29 #include <Riostream.h>
30 #include <TObjArray.h>
35 #include "AliPMDBlockHeader.h"
36 #include "AliPMDDspHeader.h"
37 #include "AliPMDPatchBusHeader.h"
38 #include "AliPMDddldata.h"
39 #include "AliPMDRawStream.h"
40 #include "AliRawReader.h"
42 ClassImp(AliPMDRawStream)
45 //_____________________________________________________________________________
46 AliPMDRawStream::AliPMDRawStream(AliRawReader* rawReader) :
49 // create an object to read PMD raw digits
51 fRawReader->Select("PMD");
54 //_____________________________________________________________________________
55 AliPMDRawStream::AliPMDRawStream(const AliPMDRawStream& stream) :
61 AliFatal("Copy constructor not implemented");
64 //_____________________________________________________________________________
65 AliPMDRawStream& AliPMDRawStream::operator = (const AliPMDRawStream&
68 // assignment operator
70 AliFatal("operator = assignment operator not implemented");
74 //_____________________________________________________________________________
75 AliPMDRawStream::~AliPMDRawStream()
82 //_____________________________________________________________________________
84 Bool_t AliPMDRawStream::DdlData(Int_t indexDDL, TObjArray *pmdddlcont)
86 // read the next raw digit
87 // returns kFALSE if there is no digit left
89 AliPMDddldata *pmdddldata;
91 if (!fRawReader->ReadHeader()) return kFALSE;
92 Int_t iddl = fRawReader->GetDDLID();
93 Int_t dataSize = fRawReader->GetDataSize();
94 Int_t totaldataword = dataSize/4;
96 if (dataSize <= 0) return kFALSE;
99 AliError("Mismatch in the DDL index");
104 buffer = new UInt_t[totaldataword];
106 for (Int_t i = 0; i < totaldataword; i++)
108 fRawReader->ReadNextInt(data);
112 // --- Open the mapping file
114 TString fileName(gSystem->Getenv("ALICE_ROOT"));
117 fileName += "/PMD/PMD_Mapping_ddl0.dat";
121 fileName += "/PMD/PMD_Mapping_ddl1.dat";
125 fileName += "/PMD/PMD_Mapping_ddl2.dat";
129 fileName += "/PMD/PMD_Mapping_ddl3.dat";
133 fileName += "/PMD/PMD_Mapping_ddl4.dat";
137 fileName += "/PMD/PMD_Mapping_ddl5.dat";
141 infile.open(fileName.Data(), ios::in); // ascii file
143 AliError(Form("Could not read the mapping file for DDL No = %d",iddl));
145 Int_t modulePerDDL = 0;
150 else if (iddl == 4 || iddl == 5)
155 const Int_t kNPatchBus = 50;
157 Int_t modno, totPatchBus, bPatchBus, ePatchBus;
158 Int_t ibus, totmcm, rows, rowe, cols, cole;
159 Int_t moduleNo[kNPatchBus], mcmperBus[kNPatchBus];
160 Int_t startRowBus[kNPatchBus], endRowBus[kNPatchBus];
161 Int_t startColBus[kNPatchBus], endColBus[kNPatchBus];
163 for (Int_t ibus = 0; ibus < kNPatchBus; ibus++)
165 mcmperBus[ibus] = -1;
166 startRowBus[ibus] = -1;
167 endRowBus[ibus] = -1;
168 startColBus[ibus] = -1;
169 endColBus[ibus] = -1;
172 for (Int_t im = 0; im < modulePerDDL; im++)
175 infile >> totPatchBus >> bPatchBus >> ePatchBus;
177 for(Int_t i=0; i<totPatchBus; i++)
179 infile >> ibus >> totmcm >> rows >> rowe >> cols >> cole;
181 moduleNo[ibus] = modno;
182 mcmperBus[ibus] = totmcm;
183 startRowBus[ibus] = rows;
184 endRowBus[ibus] = rowe;
185 startColBus[ibus] = cols;
186 endColBus[ibus] = cole;
192 AliPMDBlockHeader blockHeader;
193 AliPMDDspHeader dspHeader;
194 AliPMDPatchBusHeader pbusHeader;
196 const Int_t kblHLen = blockHeader.GetHeaderLength();
197 const Int_t kdspHLen = dspHeader.GetHeaderLength();
198 const Int_t kpbusHLen = pbusHeader.GetHeaderLength();
205 Int_t blHeaderWord[8];
206 Int_t dspHeaderWord[10];
207 Int_t pbusHeaderWord[4];
211 Int_t blRawDataLength = 0;
212 Int_t iwordcount = 0;
215 for (Int_t iblock = 0; iblock < 2; iblock++)
217 ilowLimit = iuppLimit;
218 iuppLimit = ilowLimit + kblHLen;
220 for (Int_t i = ilowLimit; i < iuppLimit; i++)
222 blHeaderWord[i-ilowLimit] = (Int_t) buffer[i];
225 blockHeader.SetHeader(blHeaderWord);
227 blRawDataLength = blockHeader.GetRawDataLength();
229 for (Int_t idsp = 0; idsp < 5; idsp++)
231 ilowLimit = iuppLimit;
232 iuppLimit = ilowLimit + kdspHLen;
234 for (Int_t i = ilowLimit; i < iuppLimit; i++)
237 dspHeaderWord[i-ilowLimit] = (Int_t) buffer[i];
239 dspHeader.SetHeader(dspHeaderWord);
241 for (Int_t ibus = 0; ibus < 5; ibus++)
243 ilowLimit = iuppLimit;
244 iuppLimit = ilowLimit + kpbusHLen;
246 for (Int_t i = ilowLimit; i < iuppLimit; i++)
249 pbusHeaderWord[i-ilowLimit] = (Int_t) buffer[i];
251 pbusHeader.SetHeader(pbusHeaderWord);
252 Int_t rawdatalength = pbusHeader.GetRawDataLength();
253 Int_t pbusid = pbusHeader.GetPatchBusId();
255 ilowLimit = iuppLimit;
256 iuppLimit = ilowLimit + rawdatalength;
258 Int_t imodule = moduleNo[pbusid];
261 for (Int_t iword = ilowLimit; iword < iuppLimit; iword++)
264 data = buffer[iword];
266 Int_t isig = data & 0x0FFF;
267 Int_t ich = (data >> 12) & 0x003F;
268 Int_t imcm = (data >> 18) & 0x07FF;
269 Int_t ibit = (data >> 31) & 0x0001;
270 parity = ComputeParity(data);
273 AliWarning("ComputeParity:: Parity Error");
275 GetRowCol(iddl, pbusid, imcm, ich,
276 startRowBus, endRowBus,
277 startColBus, endColBus,
280 ConvertDDL2SMN(iddl, imodule, ismn, idet);
281 TransformH2S(ismn, irow, icol);
283 pmdddldata = new AliPMDddldata();
285 pmdddldata->SetDetector(idet);
286 pmdddldata->SetSMN(ismn);
287 pmdddldata->SetModule(imodule);
288 pmdddldata->SetPatchBusId(pbusid);
289 pmdddldata->SetMCM(imcm);
290 pmdddldata->SetChannel(ich);
291 pmdddldata->SetRow(irow);
292 pmdddldata->SetColumn(icol);
293 pmdddldata->SetSignal(isig);
294 pmdddldata->SetParityBit(ibit);
296 pmdddlcont->Add(pmdddldata);
300 if (iwordcount == blRawDataLength) break;
304 if (dspHeader.GetPaddingWord() == 1) iuppLimit++;
305 if (iwordcount == blRawDataLength) break;
308 if (iwordcount == blRawDataLength) break;
316 //_____________________________________________________________________________
317 void AliPMDRawStream::GetRowCol(Int_t ddlno, Int_t pbusid,
318 UInt_t mcmno, UInt_t chno,
319 Int_t startRowBus[], Int_t endRowBus[],
320 Int_t startColBus[], Int_t endColBus[],
321 Int_t &row, Int_t &col) const
323 // decode: ddlno, patchbusid, mcmno, chno -> um, row, col
326 static const UInt_t kCh[64] = { 53, 58, 57, 54, 61, 62, 60, 63,
327 49, 59, 56, 55, 52, 50, 48, 51,
328 44, 47, 45, 43, 40, 39, 36, 46,
329 32, 35, 33, 34, 41, 38, 37, 42,
330 21, 26, 25, 22, 29, 30, 28, 31,
331 17, 27, 24, 23, 20, 18, 16, 19,
332 12, 15, 13, 11, 8, 7, 4, 14,
333 0, 3, 1, 2, 9, 6, 5, 10 };
336 Int_t rowcol = kCh[chno];
337 Int_t irownew = rowcol/4;
338 Int_t icolnew = rowcol%4;
342 row = startRowBus[pbusid] + irownew;
343 col = startColBus[pbusid] + mcmno*4 + icolnew;
347 row = endRowBus[pbusid] - (15 - irownew);
348 col = startColBus[pbusid] + mcmno*4 + icolnew;
351 else if (ddlno == 2 )
353 row = startRowBus[pbusid] + irownew;
354 col = endColBus[pbusid] - mcmno*4 - (3 - icolnew);
358 row = endRowBus[pbusid] - (15 - irownew);
359 col = endColBus[pbusid] - mcmno*4 - (3 - icolnew);
361 else if (ddlno == 4 )
367 // Add 16 to skip the 1st 15 rows
368 row = startRowBus[pbusid] + irownew + 16;
369 col = startColBus[pbusid] + (mcmno)*4 + icolnew;
373 row = startRowBus[pbusid] + irownew;
374 col = startColBus[pbusid] + (mcmno-12)*4 + icolnew;
381 col = endColBus[pbusid] - mcmno*4 - (3 - icolnew);
383 if(endRowBus[pbusid] - startRowBus[pbusid] > 16)
384 row = endRowBus[pbusid] - (15 - irownew) - 16 ;
386 row = endRowBus[pbusid] - (15 - irownew) ;
392 row = endRowBus[pbusid] - (15 - irownew) ;
393 col = endColBus[pbusid] - (mcmno - 12)*4 - (3 - icolnew);
403 // Subtract 16 to skip the 1st 15 rows
404 row = endRowBus[pbusid] - 16 -(15 - irownew);
405 col = startColBus[pbusid] + (mcmno-12)*4 + icolnew;
409 row = endRowBus[pbusid] - (15 - irownew) ;
410 col = startColBus[pbusid] + mcmno*4 + icolnew;
414 else if (pbusid > 17)
418 // Add 16 to skip the 1st 15 rows
419 row = startRowBus[pbusid] + irownew + 16;
420 col = endColBus[pbusid] - (mcmno - 12)*4 - (3 - icolnew);
424 row = startRowBus[pbusid] + irownew ;
425 col = endColBus[pbusid] - mcmno*4 - (3 - icolnew);
431 //_____________________________________________________________________________
432 void AliPMDRawStream::ConvertDDL2SMN(Int_t iddl, Int_t imodule,
433 Int_t &smn, Int_t &detector) const
435 // This converts the DDL number (0 to 5), Module Number (0-47)
436 // to Serial module number in one detector (SMN : 0-23) and
437 // detector number (0:PRE plane, 1:CPV plane)
449 //_____________________________________________________________________________
450 void AliPMDRawStream::TransformH2S(Int_t smn, Int_t &row, Int_t &col) const
452 // This does the transformation of the hardware coordinate to
454 // i.e., For SuperModule 0 &1, instead of 96x48(hardware),
455 // it is 48x96 (software)
456 // For Supermodule 3 & 4, 48x96
466 else if(smn >= 12 && smn < 24)
475 //_____________________________________________________________________________
476 Int_t AliPMDRawStream::ComputeParity(Int_t data)
478 // Calculate the parity bit
481 for(Int_t j = 0; j<29; j++)
483 if (data & 0x01 ) count++;
487 Int_t parity = count%2;
492 //_____________________________________________________________________________