ROOT logo
/**************************************************************************
 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id $*/

///////////////////////////////////////////////////////////////////
//                                                               //
// Class to decode compressed SDD Raw Data format                //
// The 32 bits for a data word are defined as follows:           //
//   31 control bit (0=data word, 1= control word)               //
//   30 -                                                        //
//   29  |                                                       //
//   28  |-> 4 bits to identify the Carlos (0-11) inside the DDL //
//   27 -                                                        //
//   26 detecor side (0= left, =right)                           //
//   25 -                                                        //
//   24  |                                                       //
//   23  |                                                       //
//   22  |                                                       //
//   21  |-> 8 bits to identify the anode number (0-255)         //
//   20  |                                                       //
//   19  |                                                       //
//   18 -                                                        //
//   17 -                                                        //
//   16  |                                                       //
//   15  |                                                       //
//   14  |                                                       //
//   13  |-> 8 bits to identify the time bin (0-255)             //
//   12  |                                                       //
//   11  |                                                       //
//   10 -                                                        //
//    9 -                                                        //
//    8  |                                                       //
//    7  |                                                       //
//    6  |                                                       //
//    5  |                                                       //
//    4  |-> 10 bit for the ADC counts                           //
//    3  |                                                       //
//    2  |                                                       //
//    1  |                                                       //
//    0 -                                                        //
//                                                               //
// Plus 3 types of control words                                 //
// identified by the the 4 most significant bits (31-28)         //
// 1) Jitter word     = 1000                                     //
// 2) JTAG answer     = 1100                                     //
// 3) End of module data (needed by the Cluster Finder)   = 1111 //
//                                                               //
// Origin: F.Prino, Torino, prino@to.infn.it                     //
//                                                               //
///////////////////////////////////////////////////////////////////



#include "AliITSRawStreamSDDCompressed.h"
#include "AliRawReader.h"
#include "AliLog.h"

ClassImp(AliITSRawStreamSDDCompressed)
  


//______________________________________________________________________
AliITSRawStreamSDDCompressed::AliITSRawStreamSDDCompressed(AliRawReader* rawReader) :
  AliITSRawStream(rawReader),
  fDDLModuleMap(0),
  fData(0),
  fCarlosId(-1),
  fChannel(0),
  fJitter(0),
  fDDL(0),
  fADCEncoded(0)
{
// create an object to read ITS SDD raw digits
  for(Int_t im=0;im<kSDDModules;im++){
    fLowThresholdArray[im][0]=0;
    fLowThresholdArray[im][1]=0;
  }
  fRawReader->Reset();
  fRawReader->Select("ITSSDD");


}

//______________________________________________________________________
AliITSRawStreamSDDCompressed::AliITSRawStreamSDDCompressed(const AliITSRawStreamSDDCompressed& rs) :
  AliITSRawStream(rs.fRawReader),
  fDDLModuleMap(rs.fDDLModuleMap),
  fData(0),
  fCarlosId(-1),
  fChannel(0),
  fJitter(0),
  fDDL(0),
  fADCEncoded(0)
{
  // copy constructor
  AliError("Copy constructor should not be used.");
}
//__________________________________________________________________________
AliITSRawStreamSDDCompressed& AliITSRawStreamSDDCompressed::operator=(const AliITSRawStreamSDDCompressed& rs) {
  // assignment operator
  if (this!=&rs) {}
  AliError("Assignment opertator should not be used.");
  return *this;
}

//______________________________________________________________________
AliITSRawStreamSDDCompressed::~AliITSRawStreamSDDCompressed(){
  if(fDDLModuleMap) delete fDDLModuleMap;
}


//______________________________________________________________________
Int_t AliITSRawStreamSDDCompressed::DecompAmbra(Int_t value) const
{
  // AMBRA decompression (from 8 to 10 bit)
  
  if ((value & 0x80) == 0) {
    return value & 0x7f;
  } else if ((value & 0x40) == 0) {
    if(value&1) return 0x080 + ((value & 0x3f) << 1);
    return 0x081 + ((value & 0x3f) << 1);
  } else if ((value & 0x20) == 0) {
    if(value&1) return 0x103 + ((value & 0x1f) << 3);
    return 0x104 + ((value & 0x1f) << 3);
  } else {
    if(value&1) return 0x207 + ((value & 0x1f) << 4);
    return 0x208 + ((value & 0x1f) << 4);
  }
  
}
//______________________________________________________________________
Bool_t AliITSRawStreamSDDCompressed::Next()
{
// read the next raw digit
// returns kFALSE if there is no digit left
// returns kTRUE and fCompletedModule=kFALSE and fCompletedDDL=kFALSE when a digit is found
// returns kTRUE and fCompletedModule=kTRUE  and fCompletedDDL=kFALSE when a module is completed (=3x3FFFFFFF footer words)
// returns kTRUE and fCompletedModule=kFALSE and fCompletedDDL=kTRUE  when a DDL is completed (=jitter word)


  UInt_t idJit=8;    // Jitter word has the 4 most significant bits = 1000
  UInt_t idEom=15;   // end of module has the 4 most significant bits = 1111
  UInt_t idJtag=12;  // end of module has the 4 most significant bits = 1100

  UInt_t maskmod=15;   // last 4 bits for module number in end of module word
  UInt_t maskCarlos=15<<27; // 4 bits  (27-30) for CarlosId in data word
  UInt_t maskSide=1<<26;    // 1 bit   (26)    for side     in data word
  UInt_t maskAnode=255<<18; // 8 bits  (18-25) for Nanode   in data word
  UInt_t maskTb=255<<10;    // 8 bits  (10-27) for Ntimebin in data word
  UInt_t maskADC=1023;      // 10 bits (0-9)   for ADC      in data word
  UInt_t maskCode=7;        // 3 bits (0-2)    for ADC range in encoded-ADC case
    
  while(kTRUE){
    if (!fRawReader->ReadNextInt(fData)) return kFALSE;  // read next word
    UInt_t mostsigbits=fData>>28; 
    if(fData==0xFFFFFFFF){ 
      // CarlosRX header do nothing
    } else if(mostsigbits==idEom){
      // end of module word
      fCarlosId=fData&maskmod;
      fDDL=fRawReader->GetDDLID();
      if(fDDL<0) return kFALSE;
      fModuleID = GetModuleNumber(fDDL,fCarlosId);
      fCompletedDDL=kFALSE;
      fCompletedModule=kTRUE;
      return kTRUE;
    } else if(mostsigbits==idJit){
      // jitter word
      fJitter = fData&0x000000ff;      
      fCompletedModule=kFALSE;
      fCompletedDDL=kTRUE;
      return kTRUE;
    } else if(mostsigbits==idJtag){
      // jtag word -> skipped
      continue;
    }else if(mostsigbits<8){
      // data word
      fCarlosId=(fData&maskCarlos)>>27;
      fDDL=fRawReader->GetDDLID();
      if(fDDL<0) return kFALSE;
      fModuleID = GetModuleNumber(fDDL,fCarlosId);
      fChannel=(fData&maskSide)>>26;
      fCoord1=(fData&maskAnode)>>18;
      fCoord2=(fData&maskTb)>>10;
      Int_t sig8bit;
      if(fADCEncoded){
	UInt_t code=fData&maskCode;
	if (code < 2 || code > 7){ 
	  AliError(Form("Wrong ADC code value %d",code));
	  continue;
	}
	UInt_t adcmask=(1<<code)-1;
	sig8bit=((fData&(adcmask<<3))>>3) + (1<<code);
      }else{      
	sig8bit=fData&maskADC;
      }
      sig8bit+=fLowThresholdArray[fModuleID-kSPDModules][fChannel];
      fSignal=DecompAmbra(sig8bit);
      fCompletedModule=kFALSE;
      fCompletedDDL=kFALSE;
      return kTRUE;
    }
  }
  return kFALSE;
}


 AliITSRawStreamSDDCompressed.cxx:1
 AliITSRawStreamSDDCompressed.cxx:2
 AliITSRawStreamSDDCompressed.cxx:3
 AliITSRawStreamSDDCompressed.cxx:4
 AliITSRawStreamSDDCompressed.cxx:5
 AliITSRawStreamSDDCompressed.cxx:6
 AliITSRawStreamSDDCompressed.cxx:7
 AliITSRawStreamSDDCompressed.cxx:8
 AliITSRawStreamSDDCompressed.cxx:9
 AliITSRawStreamSDDCompressed.cxx:10
 AliITSRawStreamSDDCompressed.cxx:11
 AliITSRawStreamSDDCompressed.cxx:12
 AliITSRawStreamSDDCompressed.cxx:13
 AliITSRawStreamSDDCompressed.cxx:14
 AliITSRawStreamSDDCompressed.cxx:15
 AliITSRawStreamSDDCompressed.cxx:16
 AliITSRawStreamSDDCompressed.cxx:17
 AliITSRawStreamSDDCompressed.cxx:18
 AliITSRawStreamSDDCompressed.cxx:19
 AliITSRawStreamSDDCompressed.cxx:20
 AliITSRawStreamSDDCompressed.cxx:21
 AliITSRawStreamSDDCompressed.cxx:22
 AliITSRawStreamSDDCompressed.cxx:23
 AliITSRawStreamSDDCompressed.cxx:24
 AliITSRawStreamSDDCompressed.cxx:25
 AliITSRawStreamSDDCompressed.cxx:26
 AliITSRawStreamSDDCompressed.cxx:27
 AliITSRawStreamSDDCompressed.cxx:28
 AliITSRawStreamSDDCompressed.cxx:29
 AliITSRawStreamSDDCompressed.cxx:30
 AliITSRawStreamSDDCompressed.cxx:31
 AliITSRawStreamSDDCompressed.cxx:32
 AliITSRawStreamSDDCompressed.cxx:33
 AliITSRawStreamSDDCompressed.cxx:34
 AliITSRawStreamSDDCompressed.cxx:35
 AliITSRawStreamSDDCompressed.cxx:36
 AliITSRawStreamSDDCompressed.cxx:37
 AliITSRawStreamSDDCompressed.cxx:38
 AliITSRawStreamSDDCompressed.cxx:39
 AliITSRawStreamSDDCompressed.cxx:40
 AliITSRawStreamSDDCompressed.cxx:41
 AliITSRawStreamSDDCompressed.cxx:42
 AliITSRawStreamSDDCompressed.cxx:43
 AliITSRawStreamSDDCompressed.cxx:44
 AliITSRawStreamSDDCompressed.cxx:45
 AliITSRawStreamSDDCompressed.cxx:46
 AliITSRawStreamSDDCompressed.cxx:47
 AliITSRawStreamSDDCompressed.cxx:48
 AliITSRawStreamSDDCompressed.cxx:49
 AliITSRawStreamSDDCompressed.cxx:50
 AliITSRawStreamSDDCompressed.cxx:51
 AliITSRawStreamSDDCompressed.cxx:52
 AliITSRawStreamSDDCompressed.cxx:53
 AliITSRawStreamSDDCompressed.cxx:54
 AliITSRawStreamSDDCompressed.cxx:55
 AliITSRawStreamSDDCompressed.cxx:56
 AliITSRawStreamSDDCompressed.cxx:57
 AliITSRawStreamSDDCompressed.cxx:58
 AliITSRawStreamSDDCompressed.cxx:59
 AliITSRawStreamSDDCompressed.cxx:60
 AliITSRawStreamSDDCompressed.cxx:61
 AliITSRawStreamSDDCompressed.cxx:62
 AliITSRawStreamSDDCompressed.cxx:63
 AliITSRawStreamSDDCompressed.cxx:64
 AliITSRawStreamSDDCompressed.cxx:65
 AliITSRawStreamSDDCompressed.cxx:66
 AliITSRawStreamSDDCompressed.cxx:67
 AliITSRawStreamSDDCompressed.cxx:68
 AliITSRawStreamSDDCompressed.cxx:69
 AliITSRawStreamSDDCompressed.cxx:70
 AliITSRawStreamSDDCompressed.cxx:71
 AliITSRawStreamSDDCompressed.cxx:72
 AliITSRawStreamSDDCompressed.cxx:73
 AliITSRawStreamSDDCompressed.cxx:74
 AliITSRawStreamSDDCompressed.cxx:75
 AliITSRawStreamSDDCompressed.cxx:76
 AliITSRawStreamSDDCompressed.cxx:77
 AliITSRawStreamSDDCompressed.cxx:78
 AliITSRawStreamSDDCompressed.cxx:79
 AliITSRawStreamSDDCompressed.cxx:80
 AliITSRawStreamSDDCompressed.cxx:81
 AliITSRawStreamSDDCompressed.cxx:82
 AliITSRawStreamSDDCompressed.cxx:83
 AliITSRawStreamSDDCompressed.cxx:84
 AliITSRawStreamSDDCompressed.cxx:85
 AliITSRawStreamSDDCompressed.cxx:86
 AliITSRawStreamSDDCompressed.cxx:87
 AliITSRawStreamSDDCompressed.cxx:88
 AliITSRawStreamSDDCompressed.cxx:89
 AliITSRawStreamSDDCompressed.cxx:90
 AliITSRawStreamSDDCompressed.cxx:91
 AliITSRawStreamSDDCompressed.cxx:92
 AliITSRawStreamSDDCompressed.cxx:93
 AliITSRawStreamSDDCompressed.cxx:94
 AliITSRawStreamSDDCompressed.cxx:95
 AliITSRawStreamSDDCompressed.cxx:96
 AliITSRawStreamSDDCompressed.cxx:97
 AliITSRawStreamSDDCompressed.cxx:98
 AliITSRawStreamSDDCompressed.cxx:99
 AliITSRawStreamSDDCompressed.cxx:100
 AliITSRawStreamSDDCompressed.cxx:101
 AliITSRawStreamSDDCompressed.cxx:102
 AliITSRawStreamSDDCompressed.cxx:103
 AliITSRawStreamSDDCompressed.cxx:104
 AliITSRawStreamSDDCompressed.cxx:105
 AliITSRawStreamSDDCompressed.cxx:106
 AliITSRawStreamSDDCompressed.cxx:107
 AliITSRawStreamSDDCompressed.cxx:108
 AliITSRawStreamSDDCompressed.cxx:109
 AliITSRawStreamSDDCompressed.cxx:110
 AliITSRawStreamSDDCompressed.cxx:111
 AliITSRawStreamSDDCompressed.cxx:112
 AliITSRawStreamSDDCompressed.cxx:113
 AliITSRawStreamSDDCompressed.cxx:114
 AliITSRawStreamSDDCompressed.cxx:115
 AliITSRawStreamSDDCompressed.cxx:116
 AliITSRawStreamSDDCompressed.cxx:117
 AliITSRawStreamSDDCompressed.cxx:118
 AliITSRawStreamSDDCompressed.cxx:119
 AliITSRawStreamSDDCompressed.cxx:120
 AliITSRawStreamSDDCompressed.cxx:121
 AliITSRawStreamSDDCompressed.cxx:122
 AliITSRawStreamSDDCompressed.cxx:123
 AliITSRawStreamSDDCompressed.cxx:124
 AliITSRawStreamSDDCompressed.cxx:125
 AliITSRawStreamSDDCompressed.cxx:126
 AliITSRawStreamSDDCompressed.cxx:127
 AliITSRawStreamSDDCompressed.cxx:128
 AliITSRawStreamSDDCompressed.cxx:129
 AliITSRawStreamSDDCompressed.cxx:130
 AliITSRawStreamSDDCompressed.cxx:131
 AliITSRawStreamSDDCompressed.cxx:132
 AliITSRawStreamSDDCompressed.cxx:133
 AliITSRawStreamSDDCompressed.cxx:134
 AliITSRawStreamSDDCompressed.cxx:135
 AliITSRawStreamSDDCompressed.cxx:136
 AliITSRawStreamSDDCompressed.cxx:137
 AliITSRawStreamSDDCompressed.cxx:138
 AliITSRawStreamSDDCompressed.cxx:139
 AliITSRawStreamSDDCompressed.cxx:140
 AliITSRawStreamSDDCompressed.cxx:141
 AliITSRawStreamSDDCompressed.cxx:142
 AliITSRawStreamSDDCompressed.cxx:143
 AliITSRawStreamSDDCompressed.cxx:144
 AliITSRawStreamSDDCompressed.cxx:145
 AliITSRawStreamSDDCompressed.cxx:146
 AliITSRawStreamSDDCompressed.cxx:147
 AliITSRawStreamSDDCompressed.cxx:148
 AliITSRawStreamSDDCompressed.cxx:149
 AliITSRawStreamSDDCompressed.cxx:150
 AliITSRawStreamSDDCompressed.cxx:151
 AliITSRawStreamSDDCompressed.cxx:152
 AliITSRawStreamSDDCompressed.cxx:153
 AliITSRawStreamSDDCompressed.cxx:154
 AliITSRawStreamSDDCompressed.cxx:155
 AliITSRawStreamSDDCompressed.cxx:156
 AliITSRawStreamSDDCompressed.cxx:157
 AliITSRawStreamSDDCompressed.cxx:158
 AliITSRawStreamSDDCompressed.cxx:159
 AliITSRawStreamSDDCompressed.cxx:160
 AliITSRawStreamSDDCompressed.cxx:161
 AliITSRawStreamSDDCompressed.cxx:162
 AliITSRawStreamSDDCompressed.cxx:163
 AliITSRawStreamSDDCompressed.cxx:164
 AliITSRawStreamSDDCompressed.cxx:165
 AliITSRawStreamSDDCompressed.cxx:166
 AliITSRawStreamSDDCompressed.cxx:167
 AliITSRawStreamSDDCompressed.cxx:168
 AliITSRawStreamSDDCompressed.cxx:169
 AliITSRawStreamSDDCompressed.cxx:170
 AliITSRawStreamSDDCompressed.cxx:171
 AliITSRawStreamSDDCompressed.cxx:172
 AliITSRawStreamSDDCompressed.cxx:173
 AliITSRawStreamSDDCompressed.cxx:174
 AliITSRawStreamSDDCompressed.cxx:175
 AliITSRawStreamSDDCompressed.cxx:176
 AliITSRawStreamSDDCompressed.cxx:177
 AliITSRawStreamSDDCompressed.cxx:178
 AliITSRawStreamSDDCompressed.cxx:179
 AliITSRawStreamSDDCompressed.cxx:180
 AliITSRawStreamSDDCompressed.cxx:181
 AliITSRawStreamSDDCompressed.cxx:182
 AliITSRawStreamSDDCompressed.cxx:183
 AliITSRawStreamSDDCompressed.cxx:184
 AliITSRawStreamSDDCompressed.cxx:185
 AliITSRawStreamSDDCompressed.cxx:186
 AliITSRawStreamSDDCompressed.cxx:187
 AliITSRawStreamSDDCompressed.cxx:188
 AliITSRawStreamSDDCompressed.cxx:189
 AliITSRawStreamSDDCompressed.cxx:190
 AliITSRawStreamSDDCompressed.cxx:191
 AliITSRawStreamSDDCompressed.cxx:192
 AliITSRawStreamSDDCompressed.cxx:193
 AliITSRawStreamSDDCompressed.cxx:194
 AliITSRawStreamSDDCompressed.cxx:195
 AliITSRawStreamSDDCompressed.cxx:196
 AliITSRawStreamSDDCompressed.cxx:197
 AliITSRawStreamSDDCompressed.cxx:198
 AliITSRawStreamSDDCompressed.cxx:199
 AliITSRawStreamSDDCompressed.cxx:200
 AliITSRawStreamSDDCompressed.cxx:201
 AliITSRawStreamSDDCompressed.cxx:202
 AliITSRawStreamSDDCompressed.cxx:203
 AliITSRawStreamSDDCompressed.cxx:204
 AliITSRawStreamSDDCompressed.cxx:205
 AliITSRawStreamSDDCompressed.cxx:206
 AliITSRawStreamSDDCompressed.cxx:207
 AliITSRawStreamSDDCompressed.cxx:208
 AliITSRawStreamSDDCompressed.cxx:209
 AliITSRawStreamSDDCompressed.cxx:210
 AliITSRawStreamSDDCompressed.cxx:211
 AliITSRawStreamSDDCompressed.cxx:212
 AliITSRawStreamSDDCompressed.cxx:213
 AliITSRawStreamSDDCompressed.cxx:214
 AliITSRawStreamSDDCompressed.cxx:215
 AliITSRawStreamSDDCompressed.cxx:216
 AliITSRawStreamSDDCompressed.cxx:217
 AliITSRawStreamSDDCompressed.cxx:218
 AliITSRawStreamSDDCompressed.cxx:219
 AliITSRawStreamSDDCompressed.cxx:220