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;
95 Int_t equipId = fRawReader->GetEquipmentId();
97 if (dataSize <= 0) return kFALSE;
100 AliError("Mismatch in the DDL index");
105 buffer = new UInt_t[totaldataword];
107 for (Int_t i = 0; i < totaldataword; i++)
109 fRawReader->ReadNextInt(data);
113 // --- Open the mapping file
115 TString fileName(gSystem->Getenv("ALICE_ROOT"));
118 fileName += "/PMD/PMD_Mapping_ddl0.dat";
122 fileName += "/PMD/PMD_Mapping_ddl1.dat";
126 fileName += "/PMD/PMD_Mapping_ddl2.dat";
130 fileName += "/PMD/PMD_Mapping_ddl3.dat";
134 fileName += "/PMD/PMD_Mapping_ddl4.dat";
138 fileName += "/PMD/PMD_Mapping_ddl5.dat";
142 infile.open(fileName.Data(), ios::in); // ascii file
144 AliError(Form("Could not read the mapping file for DDL No = %d",iddl));
146 Int_t modulePerDDL = 0;
151 else if (iddl == 4 || iddl == 5)
156 const Int_t kNPatchBus = 50;
158 Int_t modno, totPatchBus, bPatchBus, ePatchBus;
159 Int_t ibus, totmcm, rows, rowe, cols, cole;
160 Int_t moduleNo[kNPatchBus], mcmperBus[kNPatchBus];
161 Int_t startRowBus[kNPatchBus], endRowBus[kNPatchBus];
162 Int_t startColBus[kNPatchBus], endColBus[kNPatchBus];
165 for (Int_t ibus = 0; ibus < kNPatchBus; ibus++)
167 mcmperBus[ibus] = -1;
168 startRowBus[ibus] = -1;
169 endRowBus[ibus] = -1;
170 startColBus[ibus] = -1;
171 endColBus[ibus] = -1;
175 for (Int_t im = 0; im < modulePerDDL; im++)
178 infile >> totPatchBus >> bPatchBus >> ePatchBus;
180 for(Int_t i=0; i<totPatchBus; i++)
182 infile >> ibus >> totmcm >> rows >> rowe >> cols >> cole;
184 moduleNo[ibus] = modno;
185 mcmperBus[ibus] = totmcm;
186 startRowBus[ibus] = rows;
187 endRowBus[ibus] = rowe;
188 startColBus[ibus] = cols;
189 endColBus[ibus] = cole;
198 AliPMDBlockHeader blockHeader;
199 AliPMDDspHeader dspHeader;
200 AliPMDPatchBusHeader pbusHeader;
202 const Int_t kblHLen = blockHeader.GetHeaderLength();
203 const Int_t kdspHLen = dspHeader.GetHeaderLength();
204 const Int_t kpbusHLen = pbusHeader.GetHeaderLength();
211 Int_t blHeaderWord[8];
212 Int_t dspHeaderWord[10];
213 Int_t pbusHeaderWord[4];
218 Int_t blRawDataLength = 0;
219 Int_t iwordcount = 0;
222 for (Int_t iblock = 0; iblock < 2; iblock++)
224 ilowLimit = iuppLimit;
225 iuppLimit = ilowLimit + kblHLen;
228 for (Int_t i = ilowLimit; i < iuppLimit; i++)
230 blHeaderWord[i-ilowLimit] = (Int_t) buffer[i];
233 blockHeader.SetHeader(blHeaderWord);
235 blRawDataLength = blockHeader.GetRawDataLength();
237 for (Int_t idsp = 0; idsp < 5; idsp++)
239 ilowLimit = iuppLimit;
240 iuppLimit = ilowLimit + kdspHLen;
242 for (Int_t i = ilowLimit; i < iuppLimit; i++)
245 dspHeaderWord[i-ilowLimit] = (Int_t) buffer[i];
247 dspHeader.SetHeader(dspHeaderWord);
249 for (Int_t ibus = 0; ibus < 5; ibus++)
252 ilowLimit = iuppLimit;
253 iuppLimit = ilowLimit + kpbusHLen;
255 for (Int_t i = ilowLimit; i < iuppLimit; i++)
258 pbusHeaderWord[i-ilowLimit] = (Int_t) buffer[i];
260 pbusHeader.SetHeader(pbusHeaderWord);
261 Int_t rawdatalength = pbusHeader.GetRawDataLength();
262 Int_t pbusid = pbusHeader.GetPatchBusId();
264 ilowLimit = iuppLimit;
265 iuppLimit = ilowLimit + rawdatalength;
267 Int_t imodule = moduleNo[pbusid];
270 for (Int_t iword = ilowLimit; iword < iuppLimit; iword++)
273 data = buffer[iword];
275 Int_t isig = data & 0x0FFF;
276 Int_t ich = (data >> 12) & 0x003F;
277 Int_t imcm = (data >> 18) & 0x07FF;
278 Int_t ibit = (data >> 31) & 0x0001;
280 GetRowCol(iddl, pbusid, imcm, ich,
281 startRowBus, endRowBus,
282 startColBus, endColBus,
285 ConvertDDL2SMN(iddl, imodule, ismn, idet);
286 TransformH2S(ismn, irow, icol);
288 pmdddldata = new AliPMDddldata();
290 pmdddldata->SetDetector(idet);
291 pmdddldata->SetSMN(ismn);
292 pmdddldata->SetModule(imodule);
293 pmdddldata->SetPatchBusId(pbusid);
294 pmdddldata->SetMCM(imcm);
295 pmdddldata->SetChannel(ich);
296 pmdddldata->SetRow(irow);
297 pmdddldata->SetColumn(icol);
298 pmdddldata->SetSignal(isig);
299 pmdddldata->SetParityBit(ibit);
301 pmdddlcont->Add(pmdddldata);
305 if (iwordcount == blRawDataLength) break;
309 if (dspHeader.GetPaddingWord() == 1) iuppLimit++;
310 if (iwordcount == blRawDataLength) break;
313 if (iwordcount == blRawDataLength) break;
322 //_____________________________________________________________________________
323 void AliPMDRawStream::GetRowCol(Int_t ddlno, Int_t pbusid,
324 UInt_t mcmno, UInt_t chno,
325 Int_t startRowBus[], Int_t endRowBus[],
326 Int_t startColBus[], Int_t endColBus[],
327 Int_t &row, Int_t &col) const
329 // decode: ddlno, patchbusid, mcmno, chno -> um, row, col
332 static const UInt_t kCh[64] = { 53, 58, 57, 54, 61, 62, 60, 63,
333 49, 59, 56, 55, 52, 50, 48, 51,
334 44, 47, 45, 43, 40, 39, 36, 46,
335 32, 35, 33, 34, 41, 38, 37, 42,
336 21, 26, 25, 22, 29, 30, 28, 31,
337 17, 27, 24, 23, 20, 18, 16, 19,
338 12, 15, 13, 11, 8, 7, 4, 14,
339 0, 3, 1, 2, 9, 6, 5, 10 };
342 Int_t rowcol = kCh[chno];
343 Int_t irownew = rowcol/4;
344 Int_t icolnew = rowcol%4;
352 row = startRowBus[pbusid] + irownew;
353 col = startColBus[pbusid] + (mcmno-12)*4 + icolnew;
357 // Add 16 to skip the 1st 15 rows
358 row = startRowBus[pbusid] + irownew + 16;
359 col = startColBus[pbusid] + mcmno*4 + icolnew;
364 row = startRowBus[pbusid] + irownew;
365 col = startColBus[pbusid] + mcmno*4 + icolnew;
375 row = endRowBus[pbusid] - (15 - irownew);
376 col = startColBus[pbusid] + (mcmno-12)*4 + icolnew;
380 // Subtract 16 to skip the 1st 15 rows
381 row = endRowBus[pbusid] - 16 - (15 - irownew) ;
382 col = startColBus[pbusid] + mcmno*4 + icolnew;
387 row = endRowBus[pbusid] - (15 - irownew);
388 col = startColBus[pbusid] + mcmno*4 + icolnew;
393 row = startRowBus[pbusid] + irownew;
394 col = endColBus[pbusid] - mcmno*4 - (3 - icolnew);
398 row = endRowBus[pbusid] - (15 - irownew);
399 col = endColBus[pbusid] - mcmno*4 - (3 - icolnew);
407 row = startRowBus[pbusid] + irownew;
408 col = startColBus[pbusid] + (mcmno-12)*4 + icolnew;
412 // Add 16 to skip the 1st 15 rows
413 row = startRowBus[pbusid] + irownew + 16;
414 col = startColBus[pbusid] + mcmno*4 + icolnew;
417 else if (pbusid > 16 && pbusid <= 20)
419 row = startRowBus[pbusid] + irownew;
420 col = startColBus[pbusid] + mcmno*4 + icolnew;
425 row = endRowBus[pbusid] - (15 - irownew);
426 col = endColBus[pbusid] - mcmno*4 - (3 - icolnew);
435 row = endRowBus[pbusid] - (15 - irownew);
436 col = startColBus[pbusid] + (mcmno-12)*4 + icolnew;
440 // Subtract 16 to skip the 1st 15 rows
441 row = endRowBus[pbusid] - 16 - (15 - irownew) ;
442 col = startColBus[pbusid] + mcmno*4 + icolnew;
445 else if (pbusid > 16 && pbusid <= 20)
447 row = endRowBus[pbusid] - (15 - irownew);
448 col = startColBus[pbusid] + mcmno*4 + icolnew;
450 else if (pbusid > 20)
452 row = startRowBus[pbusid] + irownew;
453 col = endColBus[pbusid] - mcmno*4 - (3 - icolnew);
457 //_____________________________________________________________________________
458 void AliPMDRawStream::ConvertDDL2SMN(Int_t iddl, Int_t imodule,
459 Int_t &smn, Int_t &detector) const
461 // This converts the DDL number (0 to 5), Module Number (0-47)
462 // to Serial module number in one detector (SMN : 0-23) and
463 // detector number (0:PRE plane, 1:CPV plane)
475 //_____________________________________________________________________________
476 void AliPMDRawStream::TransformH2S(Int_t smn, Int_t &row, Int_t &col) const
478 // This does the transformation of the hardware coordinate to
480 // i.e., For SuperModule 0 &1, instead of 96x48(hardware),
481 // it is 48x96 (software)
482 // For Supermodule 3 & 4, 48x96
492 else if(smn >= 12 && smn < 24)
501 //_____________________________________________________________________________