LCOV - code coverage report
Current view: top level - ITS/ITSbase - AliITSRawStreamSDD.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 139 169 82.2 %
Date: 2016-06-14 17:26:59 Functions: 14 17 82.4 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 2007-2009, 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             : /* $Id$*/
      17             : 
      18             : ///////////////////////////////////////////////////////////////////////////////
      19             : ///
      20             : /// This class provides access to ITS SDD digits in raw data.
      21             : ///
      22             : ///////////////////////////////////////////////////////////////////////////////
      23             : 
      24             : #include "AliITSRawStreamSDD.h"
      25             : #include "AliITSRawStreamSDDCompressed.h"
      26             : #include "AliRawReader.h"
      27             : #include "AliLog.h"
      28             : 
      29         118 : ClassImp(AliITSRawStreamSDD)
      30             :   
      31             : const UInt_t AliITSRawStreamSDD::fgkCodeLength[8] =  {8, 18, 2, 3, 4, 5, 6, 7};
      32             : 
      33             : //______________________________________________________________________
      34             : AliITSRawStreamSDD::AliITSRawStreamSDD(AliRawReader* rawReader) :
      35           4 :   AliITSRawStream(rawReader),
      36           4 : fDDLModuleMap(0),
      37           4 : fData(0),
      38           4 : fResetSkip(kTRUE),
      39           4 : fEventId(0),
      40           4 : fCarlosId(-1),
      41           4 : fChannel(0),
      42           4 : fJitter(0),
      43           4 : fEightBitSignal(0),
      44           4 : fDecompressAmbra(kTRUE)
      45          20 : {
      46             : // create an object to read ITS SDD raw digits
      47           4 :   Reset();
      48        2088 :   for(Int_t im=0;im<kSDDModules;im++){
      49        1040 :     fLowThresholdArray[im][0]=0;
      50        1040 :     fLowThresholdArray[im][1]=0;
      51             :   }
      52          40 :   for(Int_t i=0;i<kFifoWords;i++) fNfifo[i]=0;
      53           4 :   fRawReader->Reset();
      54           4 :   fRawReader->Select("ITSSDD");
      55             : 
      56         104 :   for(Short_t i=0; i<kCarlosWords; i++) fICarlosWord[i]=0x30000000 + i; // 805306368+i;
      57          40 :   for(Short_t i=0; i<kFifoWords; i++) fIFifoWord[i]=0x30000010 + i;  // 805306384+i;
      58           8 : }
      59             : 
      60             : //______________________________________________________________________
      61             : AliITSRawStreamSDD::AliITSRawStreamSDD(const AliITSRawStreamSDD& rs) :
      62           0 : AliITSRawStream(rs.fRawReader),
      63           0 : fDDLModuleMap(rs.fDDLModuleMap),
      64           0 : fData(0),
      65           0 : fResetSkip(kTRUE),
      66           0 : fEventId(0),
      67           0 : fCarlosId(-1),
      68           0 : fChannel(0),
      69           0 : fJitter(0),
      70           0 : fEightBitSignal(0),
      71           0 : fDecompressAmbra(kTRUE)
      72           0 : {
      73             :   // copy constructor
      74           0 :   AliError("Copy constructor should not be used.");
      75           0 : }
      76             : //__________________________________________________________________________
      77             : AliITSRawStreamSDD& AliITSRawStreamSDD::operator=(const AliITSRawStreamSDD& rs) {
      78             :   // assignment operator
      79             :   if (this!=&rs) {}
      80           0 :   AliError("Assignment opertator should not be used.");
      81           0 :   return *this;
      82             : }
      83             : 
      84             : //______________________________________________________________________
      85          24 : AliITSRawStreamSDD::~AliITSRawStreamSDD(){
      86          12 :   if(fDDLModuleMap) delete fDDLModuleMap;
      87          12 : }
      88             : //______________________________________________________________________
      89             : UChar_t AliITSRawStreamSDD::ReadBlockAttributes(AliRawReader* rawReader){
      90             :   // reads block attribuited from CDH
      91           8 :   UChar_t *data;
      92           4 :   rawReader->Reset();
      93           4 :   rawReader->Select("ITSSDD");
      94           4 :   do{
      95           4 :     if(!rawReader->ReadNextData(data)) return 0x0;
      96           4 :   }while(rawReader->GetDataSize()==0);
      97           4 :   UChar_t attr=rawReader->GetBlockAttributes();
      98             :   return attr;
      99           4 : }
     100             : //______________________________________________________________________
     101             : AliITSRawStream* AliITSRawStreamSDD::CreateRawStreamSDD(AliRawReader* rawReader, UChar_t attributes){
     102             :   // instantiates the proper raw stream from block attributes value
     103             : 
     104           8 :   Int_t rawFormat=(attributes&0xE0)>>5;  
     105           4 :   rawReader->Reset();
     106             :   AliITSRawStream* inputSDD;
     107           4 :   if(rawFormat==0){
     108           0 :     inputSDD=new AliITSRawStreamSDDCompressed(rawReader);
     109           0 :     inputSDD->SetADCEncoded(kTRUE);
     110           0 :   }else{
     111           8 :     inputSDD=new AliITSRawStreamSDD(rawReader);
     112             :   }
     113           4 :   return inputSDD;
     114           0 : }
     115             : //______________________________________________________________________
     116             : AliITSRawStream* AliITSRawStreamSDD::CreateRawStreamSDD(AliRawReader* rawReader){
     117             :   // reads the data format from CDH and instantiates the proper raw stream
     118           8 :   UChar_t attr=ReadBlockAttributes(rawReader);
     119           4 :   return CreateRawStreamSDD(rawReader,attr);
     120             : }
     121             : //______________________________________________________________________
     122             : UInt_t AliITSRawStreamSDD::ReadBits()
     123             : {
     124             : // read bits from the given channel
     125      205292 :   UInt_t result = (fChannelData[fCarlosId][fChannel] & ((1<<fReadBits[fCarlosId][fChannel]) - 1));
     126      102646 :   fChannelData[fCarlosId][fChannel] >>= fReadBits[fCarlosId][fChannel]; 
     127      102646 :   fLastBit[fCarlosId][fChannel] -= fReadBits[fCarlosId][fChannel];
     128      102646 :   return result;
     129             : }
     130             : 
     131             : //______________________________________________________________________
     132             : Int_t AliITSRawStreamSDD::DecompAmbra(Int_t value) const
     133             : {
     134             :   // AMBRA decompression (from 8 to 10 bit)
     135             :   
     136        1286 :   if ((value & 0x80) == 0) {
     137         621 :     return value & 0x7f;
     138          22 :   } else if ((value & 0x40) == 0) {
     139          30 :     if(value&1) return 0x080 + ((value & 0x3f) << 1);
     140          10 :     return 0x081 + ((value & 0x3f) << 1);
     141           4 :   } else if ((value & 0x20) == 0) {
     142           5 :     if(value&1) return 0x103 + ((value & 0x1f) << 3);
     143           1 :     return 0x104 + ((value & 0x1f) << 3);
     144             :   } else {
     145           0 :     if(value&1) return 0x207 + ((value & 0x1f) << 4);
     146           0 :     return 0x208 + ((value & 0x1f) << 4);
     147             :   }
     148             :   
     149         643 : }
     150             : 
     151             : //______________________________________________________________________
     152             : Bool_t AliITSRawStreamSDD::Next()
     153             : {
     154             : // read the next raw digit
     155             : // returns kFALSE if there is no digit left
     156             : // returns kTRUE and fCompletedModule=kFALSE and fCompletedDDL=kFALSE when a digit is found
     157             : // returns kTRUE and fCompletedModule=kTRUE  and fCompletedDDL=kFALSE when a module is completed (=3x3FFFFFFF footer words)
     158             : // returns kTRUE and fCompletedModule=kFALSE and fCompletedDDL=kTRUE  when a DDL is completed (=jitter word)
     159             : 
     160        3566 :   fPrevModuleID = fModuleID;
     161        1783 :   fCompletedModule=kFALSE;
     162             : 
     163        1783 :   while (kTRUE) {
     164      143492 :     if(fResetSkip){
     165         100 :       Reset();
     166         100 :       Bool_t kSkip = SkipHeaderWord();
     167         104 :       if(!kSkip) return kSkip;  
     168          96 :       fResetSkip=kFALSE;
     169          96 :     }
     170      717428 :     if ((fChannel < 0) || (fCarlosId < 0) || (fChannel >= 2) || (fCarlosId >= kModulesPerDDL) || (fLastBit[fCarlosId][fChannel] < fReadBits[fCarlosId][fChannel]) ) {
     171       40842 :       if (!fRawReader->ReadNextInt(fData)) return kFALSE;  // read next word
     172             : 
     173             : 
     174       40842 :       if((fData >> 16) == 0x7F00){ // jitter word
     175          96 :         fJitter = fData&0x000000ff;
     176          96 :         fResetSkip=kTRUE;
     177          96 :         fCompletedModule=kFALSE;
     178          96 :         fCompletedDDL=kTRUE;
     179          96 :         return kTRUE;
     180             :        }
     181             : 
     182       40746 :       UInt_t nData28= fData >> 28;
     183       40746 :       UInt_t nData30= fData >> 30;
     184             : 
     185             : 
     186       40746 :       if (nData28== 0x02) {           // header
     187           0 :         fEventId = (fData >> 3) & 0x07FF; 
     188       40746 :       } else if (nData28== 0x03) {    // Carlos and FIFO words or Footers
     189       10624 :         if(fData>=fICarlosWord[0]&&fData<=fICarlosWord[11]) { // Carlos Word
     190        1040 :           fCarlosId = fData-fICarlosWord[0];
     191        1040 :           Int_t iFifoIdx = fCarlosId/3;
     192        1040 :           fNfifo[iFifoIdx] = fCarlosId;
     193        9584 :         } else if (fData>=fIFifoWord[0]&&fData<=fIFifoWord[3]){ // FIFO word
     194           0 :           fCarlosId = fNfifo[fData-fIFifoWord[0]];          
     195       10512 :         } else if(fData==0x3FFFFFFF && fCarlosId>=0 && fCarlosId<kModulesPerDDL){ // Carlos footer
     196        3120 :           fICountFoot[fCarlosId]++; // stop before the last word (last word=jitter)
     197        3120 :           if(fICountFoot[fCarlosId]==3){
     198        1040 :             fCompletedModule=kTRUE;
     199        1040 :             fCompletedDDL=kFALSE;
     200        1040 :             return kTRUE;
     201             :           }
     202        1152 :         } else if(fData==0x3F1F1F1F){ // CarlosRX footer
     203             :           // CARLOSRX footer -- do nothing
     204             :         }else{
     205           0 :           fRawReader->AddMajorErrorLog(kDataError,"Bad footer");
     206           0 :           AliWarning(Form("Invalid data: bad footer %08X\n", fData));
     207           0 :           return kFALSE;            
     208             :         }
     209       35434 :       } else if (nData30 == 0x02 || nData30 == 0x03) {
     210       35434 :         fChannel = nData30-2;
     211       70868 :         if(fCarlosId>=0 && fCarlosId<kModulesPerDDL){
     212       35434 :           fChannelData[fCarlosId][fChannel] += 
     213       35434 :             (ULong64_t(fData & 0x3FFFFFFF) << fLastBit[fCarlosId][fChannel]);
     214       35434 :           fLastBit[fCarlosId][fChannel] += 30;
     215       35434 :         }
     216           0 :       } else if (nData28== 0x04) {
     217             :         // JTAG word -- do nothing
     218             :       } else {                               // unknown data format
     219           0 :         fRawReader->AddMajorErrorLog(kDataFormatErr,Form("Invalid data %8.8x",fData));
     220           0 :         AliWarning(Form("Invalid data: %08X\n", fData));
     221           0 :         return kFALSE;
     222             :       }
     223             :       
     224       79412 :       if(fCarlosId>=0 && fCarlosId <kModulesPerDDL){
     225       39706 :         Int_t nDDL=fRawReader->GetDDLID();
     226       39706 :         if(nDDL>=0){
     227       39706 :           fModuleID = GetModuleNumber(nDDL,fCarlosId);
     228       39706 :         }
     229       39706 :       }
     230       39706 :     } else {  // decode data
     231      102646 :       if (fReadCode[fCarlosId][fChannel]) {// read the next code word
     232       51415 :         fChannelCode[fCarlosId][fChannel] = ReadBits();
     233       51415 :         fReadCode[fCarlosId][fChannel] = kFALSE;
     234       51415 :         fReadBits[fCarlosId][fChannel] = fgkCodeLength[fChannelCode[fCarlosId][fChannel]];
     235       51415 :       } else {                      // read the next data word
     236       51231 :         UInt_t data = ReadBits();
     237       51231 :         fReadCode[fCarlosId][fChannel] = kTRUE;
     238       51231 :         fReadBits[fCarlosId][fChannel] = 3;
     239       51231 :         if (fChannelCode[fCarlosId][fChannel] == 0) {         // set the time bin         
     240         643 :           fTimeBin[fCarlosId][fChannel] = data;
     241       51231 :         } else if (fChannelCode[fCarlosId][fChannel] == 1) {  // next anode
     242       49945 :           fTimeBin[fCarlosId][fChannel] = 0;
     243       49945 :           fAnode[fCarlosId][fChannel]++;
     244             :         } else {                                   // ADC signal data
     245         643 :           fEightBitSignal=data + (1 << fChannelCode[fCarlosId][fChannel]);
     246        1286 :           if(fDecompressAmbra) fSignal = DecompAmbra(fEightBitSignal + fLowThresholdArray[fModuleID-kSPDModules][fChannel]);
     247         643 :           fCoord1 = fAnode[fCarlosId][fChannel];
     248         643 :           fCoord2 = fTimeBin[fCarlosId][fChannel];
     249         643 :           fTimeBin[fCarlosId][fChannel]++;
     250         643 :           fCompletedModule=kFALSE;
     251         643 :           fCompletedDDL=kFALSE;
     252         643 :           return kTRUE;
     253             :         }
     254       50588 :       }
     255             :     }
     256             :   }
     257             :   return kFALSE;
     258        1783 : }
     259             : 
     260             : //______________________________________________________________________
     261             : void AliITSRawStreamSDD::Reset(){
     262             : 
     263             :   //reset data member for a new ddl
     264         728 :   for(Int_t i=0;i<2;i++){
     265        5408 :     for(Int_t ic=0;ic<kModulesPerDDL;ic++){
     266        2496 :       fChannelData[ic][i]=0;
     267        2496 :       fLastBit[ic][i]=0;
     268        2496 :       fChannelCode[ic][i]=0;
     269        2496 :       fReadCode[ic][i]=kTRUE;
     270        2496 :       fReadBits[ic][i]=3;
     271        2496 :       fTimeBin[ic][i]=0;
     272        2496 :       fAnode[ic][i]=0;     
     273        2496 :       fICountFoot[ic]=0;
     274             :     }
     275             :   }
     276         104 : }
     277             : 
     278             : //______________________________________________________________________
     279             : Bool_t AliITSRawStreamSDD::SkipHeaderWord(){
     280             :   // skip the 1 DDL header word = 0xffffffff
     281         200 :   while (kTRUE) {
     282         104 :     if (!fRawReader->ReadNextInt(fData)) return kFALSE;    
     283          96 :     if ((fData >> 30) == 0x01) continue;  // JTAG word
     284         192 :     if(fData==0xFFFFFFFF) return kTRUE;
     285             :   }
     286         100 : }
     287             : 

Generated by: LCOV version 1.11