ROOT logo
AliRoot » HMPID » AliHMPIDRawStream

class AliHMPIDRawStream: public TObject


 This is a class for reading the HMPID raw data
 The format of the raw data corresponds to the one
 which was documented by Paolo Martinengo.


Function Members (Methods)

public:
AliHMPIDRawStream()
AliHMPIDRawStream(AliRawReader* rawReader)
virtual~AliHMPIDRawStream()
voidTObject::AbstractMethod(const char* method) const
virtual voidTObject::AppendPad(Option_t* option = "")
virtual voidTObject::Browse(TBrowser* b)
Bool_tCheckDilogic(UInt_t dilogic)
Bool_tCheckEoE(Int_t& nDil)
Bool_tCheckPad(UInt_t pad)
Bool_tCheckRow(UInt_t row)
Bool_tCheckRowMarker()
Bool_tCheckSegment()
static TClass*Class()
virtual const char*TObject::ClassName() const
virtual voidTObject::Clear(Option_t* = "")
virtual TObject*TObject::Clone(const char* newname = "") const
virtual Int_tTObject::Compare(const TObject* obj) const
virtual voidTObject::Copy(TObject& object) const
virtual voidTObject::Delete(Option_t* option = "")MENU
voidDelVars()
virtual Int_tTObject::DistancetoPrimitive(Int_t px, Int_t py)
virtual voidTObject::Draw(Option_t* option = "")
virtual voidTObject::DrawClass() constMENU
virtual TObject*TObject::DrawClone(Option_t* option = "") constMENU
virtual voidTObject::Dump() constMENU
voidDumpData(Int_t nw)
virtual voidTObject::Error(const char* method, const char* msgfmt) const
virtual voidTObject::Execute(const char* method, const char* params, Int_t* error = 0)
virtual voidTObject::Execute(TMethod* method, TObjArray* params, Int_t* error = 0)
virtual voidTObject::ExecuteEvent(Int_t event, Int_t px, Int_t py)
virtual voidTObject::Fatal(const char* method, const char* msgfmt) const
virtual TObject*TObject::FindObject(const char* name) const
virtual TObject*TObject::FindObject(const TObject* obj) const
Int_t*GetChargeArray() const
Double_tGetDdlDataSize()
Int_tGetDDLNumber() const
virtual Option_t*TObject::GetDrawOption() const
static Long_tTObject::GetDtorOnly()
static const Char_t*GetErrName(Int_t eType)
Int_tGetErrors(Int_t ddl, Int_t eType) const
static Int_tGetFee(Int_t ddl, Int_t row)
virtual const char*TObject::GetIconName() const
UInt_tGetLDCNumber() const
virtual const char*TObject::GetName() const
static Int_tGetNDDL()
Int_t*GetnDDLInStream() const
Int_t*GetnDDLOutStream() const
static Int_tGetNErrors()
Int_tGetNPads() const
virtual char*TObject::GetObjectInfo(Int_t px, Int_t py) const
static Bool_tTObject::GetObjectStat()
virtual Option_t*TObject::GetOption() const
static Int_tGetPad(Int_t ddl, Int_t row, Int_t dil, Int_t pad)
Int_t*GetPadArray() const
UInt_tGetTimeStamp() const
virtual const char*TObject::GetTitle() const
Bool_tGetTurbo()
virtual UInt_tTObject::GetUniqueID() const
Bool_tGetZeroSup() const
virtual Bool_tTObject::HandleTimer(TTimer* timer)
virtual ULong_tTObject::Hash() const
virtual voidTObject::Info(const char* method, const char* msgfmt) const
virtual Bool_tTObject::InheritsFrom(const char* classname) const
virtual Bool_tTObject::InheritsFrom(const TClass* cl) const
voidInitVars(Int_t n)
virtual voidTObject::Inspect() constMENU
voidTObject::InvertBit(UInt_t f)
virtual TClass*IsA() const
virtual Bool_tTObject::IsEqual(const TObject* obj) const
virtual Bool_tTObject::IsFolder() const
Bool_tTObject::IsOnHeap() const
virtual Bool_tTObject::IsSortable() const
Bool_tTObject::IsZombie() const
virtual voidTObject::ls(Option_t* option = "") const
voidTObject::MayNotUse(const char* method) const
virtual Bool_tNext()
virtual Bool_tTObject::Notify()
voidTObject::Obsolete(const char* method, const char* asOfVers, const char* removedFromVers) const
static voidTObject::operator delete(void* ptr)
static voidTObject::operator delete(void* ptr, void* vp)
static voidTObject::operator delete[](void* ptr)
static voidTObject::operator delete[](void* ptr, void* vp)
void*TObject::operator new(size_t sz)
void*TObject::operator new(size_t sz, void* vp)
void*TObject::operator new[](size_t sz)
void*TObject::operator new[](size_t sz, void* vp)
Int_tPadPcX(Int_t ddl, Int_t row, Int_t dil, Int_t pad)
Int_tPadPcY(Int_t ddl, Int_t row, Int_t dil, Int_t pad)
virtual voidTObject::Paint(Option_t* option = "")
Int_tPc(Int_t ddl, Int_t row, Int_t dil, Int_t pad)
virtual voidTObject::Pop()
virtual voidTObject::Print(Option_t* option = "") const
virtual Int_tTObject::Read(const char* name)
Bool_tReadDilogic(Int_t& cntDilogic)
Bool_tReadHMPIDRawData()
Bool_tReadRow(Int_t& cntRow)
Bool_tReadSegment(Int_t& cntSegment)
virtual voidTObject::RecursiveRemove(TObject* obj)
virtual voidReset()
voidTObject::ResetBit(UInt_t f)
virtual voidTObject::SaveAs(const char* filename = "", Option_t* option = "") constMENU
virtual voidTObject::SavePrimitive(basic_ostream<char,char_traits<char> >& out, Option_t* option = "")
voidTObject::SetBit(UInt_t f)
voidTObject::SetBit(UInt_t f, Bool_t set)
virtual voidTObject::SetDrawOption(Option_t* option = "")MENU
static voidTObject::SetDtorOnly(void* obj)
static voidTObject::SetObjectStat(Bool_t stat)
voidSetTurbo(Bool_t isTurbo)
virtual voidTObject::SetUniqueID(UInt_t uid)
Bool_tSetZeroSup(Bool_t isSup)
virtual voidShowMembers(TMemberInspector&)
voidStorePosition()
virtual voidStreamer(TBuffer&)
voidStreamerNVirtual(TBuffer& ClassDef_StreamerNVirtual_b)
virtual voidTObject::SysError(const char* method, const char* msgfmt) const
Bool_tTObject::TestBit(UInt_t f) const
Int_tTObject::TestBits(UInt_t f) const
Bool_tTurbo()
virtual voidTObject::UseCurrentStyle()
virtual voidTObject::Warning(const char* method, const char* msgfmt) const
virtual Int_tTObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0)
virtual Int_tTObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) const
voidWrite5FirmwareWords(AliFstream* ddl)
voidWriteEoE(AliFstream* ddl, UInt_t row, UInt_t dil, UInt_t wordCnt)
voidWriteRaw(TObjArray* pDigAll)
voidWriteRowMarker(AliFstream* ddl, UInt_t size)
voidWriteSegMarker(AliFstream* ddl, UInt_t row, Int_t nwInSeg)
protected:
virtual voidTObject::DoError(int level, const char* location, const char* fmt, va_list va) const
voidTObject::MakeZombie()

Data Members

public:
enum EDirection { kFwd
kBwd
};
enum Ebits { kbit0
kbit1
kbit2
kbit3
kbit4
kbit5
kbit6
kbit7
kbit8
kbit9
kbit10
kbit11
kbit12
kbit13
kbit14
kbit15
kbit16
kbit17
kbit18
kbit19
kbit20
kbit21
kbit22
kbit23
kbit24
kbit25
kbit26
kbit27
kbit28
kbit29
kbit30
kbit31
kbit32
};
enum EHMPIDRawStreamError { kRawDataSizeErr
kRowMarkerErr
kWrongRowErr
kWrongDilogicErr
kWrongPadErr
kEoEFlagErr
kEoESizeErr
kEoEDILOGICErr
kEoERowErr
kBadSegWordErr
kWrongSegErr
kRowMarkerSizeErr
kPedQZero
kSumErr
};
enum { kNRows
kNDILOGICAdd
kNPadAdd
kNRowsPerSegment
kNDDL
};
enum EHMPIDRawError { kInvalidRawDataWord
};
enum TObject::EStatusBits { kCanDelete
kMustCleanup
kObjInCanvas
kIsReferenced
kHasUUID
kCannotPick
kNoContextMenu
kInvalidObject
};
enum TObject::[unnamed] { kIsOnHeap
kNotDeleted
kZombie
kBitMask
kSingleKey
kOverwrite
kWriteDelete
};
private:
Int_t*fChargeArray for charge values for all channels in one DDL
Int_tfDDLNumberindex of current DDL number
UChar_t*fDataraw data
UInt_tfLDCNumberindex of current LDC number
Int_tfNPadscounter of pads in one DDL
Int_t**fNumOfErrStore the numner of errors for a given error type and a given DDL
Int_t*fPadArray for abs pad values for all channels in one DDL
Int_t*fPosfor debug purposes
Int_tfPositioncurrent word
Int_tfRawDataSize
AliRawReader*fRawReaderobject for reading the raw data
UInt_tfTimeStampTimeStamp
Bool_tfTurbokTRUE = Turbo decoding is called. DEFAULT: kFALSE = normal decoding is called
UInt_tfWordcurrent position in fData
Bool_tfZeroSupset if zero suppression is applied
Int_tfiPoscounter for debug
Int_t*fnDDLInStreamif the DDL is in the raw data
Int_t*fnDDLOutStreamif the DDL is in the raw data

Class Charts

Inheritance Chart:
TObject
AliHMPIDRawStream

Function documentation

AliHMPIDRawStream(AliRawReader* rawReader)
 Constructor

AliHMPIDRawStream()
 Constructor

~AliHMPIDRawStream()
 destructor

void Reset()
 reset raw stream params
 Reinitalize the containers
Bool_t Turbo()
Bool_t Next()
 read next DDL raw data from the HMPID raw data stream
 return kFALSE in case of error or no data left
void InitVars(Int_t n)


void DelVars()


Clean the initvars!!!!!!!!
Bool_t ReadHMPIDRawData()
Here the loop on the decoding the raw bank
for one ddl starts.
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t ReadSegment(Int_t& cntSegment)
Read the segment
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t ReadRow(Int_t& cntRow)
 Read the row
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t ReadDilogic(Int_t& cntDilogic)
 Read the dilogic bank
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t CheckSegment()
 Check the segment marker
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t CheckRow(UInt_t row)
check on row number
It returns: kFALSE if any error occurs
            kTRUE  if all OK
  Printf("ROW %i word %0X",row,fWord);
Bool_t CheckDilogic(UInt_t dilogic)
check dilogic number
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t CheckPad(UInt_t pad)
check pad number
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t CheckEoE(Int_t& nDil)
check the End of Event
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t CheckRowMarker()
check the row marker
It returns: kFALSE if any error occurs
            kTRUE  if all OK
Bool_t GetWord(Int_t n = 1, AliHMPIDRawStream::EDirection dir = kFwd)
 This method returns the n-th 32 bit word
 inside the raw data payload.
 The method is supposed to be endian (platform)
 independent.
void DumpData(Int_t nw)
just a simple raw data dump
 in () is the position in bytes
--
void StorePosition()
just for debug purpose
 it stores the position
read for the first time
  Printf("@@@@@@@@@ fPos: %x fPosition: %d",fPos,fPosition);
Int_t GetPad(Int_t ddl, Int_t row, Int_t dil, Int_t pad)

void AliHMPIDRawStream::Raw(UInt_t &w32,Int_t &ddl,Int_t &r,Int_t &d,Int_t &a)
{
 Convert raw stream word to raw word format
 Arguments: w32,ddl,r,d,a where to write the results
 Returns: none
  Int_t y2a[6]={5,3,1,0,2,4};

  ddl=2*Ch(ddl,r,d,a)+Pc(ddl,r,d,a)%2;                                                          //DDL# 0..13
  Int_t tmp=1+Pc(ddl,r,d,a)/2*8+PadPcY(ddl,r,d,a)/6;  r=(Pc(ddl,r,d,a)%2)? 25-tmp:tmp;              //row r=1..24
  d=1+PadPcX(ddl,r,d,a)/8;                                                                  //DILOGIC# 1..10
  a=y2a[PadPcY(ddl,r,d,a)%6]+6*(PadPcX(ddl,r,d,a)%8);                                           //ADDRESS 0..47

  w32=0;
  AliBitPacking::PackWord((fCharge[fNPads]>4095)?4095:(UInt_t)fCharge[fNPads],w32, 0,11);       // 0000 0rrr rrdd ddaa aaaa qqqq qqqq qqqq        Qdc               bits (00..11) counts (0..4095)
  //molnarl: Since in simulation the the charge can be > than 4095 but not in real life we need to protect. If fQ>4095 after packing we will get 0 for the charge!
  assert(0<=a&&a<=47);AliBitPacking::PackWord(        a ,w32,12,17);  // 3322 2222 2222 1111 1111 1000 0000 0000        DILOGIC address   bits (12..17) counts (0..47)
  assert(1<=d&&d<=10);AliBitPacking::PackWord(        d ,w32,18,21);  // 1098 7654 3210 9876 5432 1098 7654 3210        DILOGIC number    bits (18..21) counts (1..10)
  assert(1<=r&&r<=24);AliBitPacking::PackWord(        r ,w32,22,26);  //                                                Row number        bits (22..26) counts (1..24)
}



Int_t AliHMPIDRawStream::Raw(Int_t ddl,Int_t r,Int_t d,Int_t a)
{
  //Assign absolute pad ID based on ddl,row,dil,pad
  //Arguments: DDL, row number, dilogic number, dilogic address(pad)
  //Returns  : nothing

  assert(0<=ddl&&ddl<=13); assert(1<=r&&r<=24); assert(1<=d&&d<=10);   assert(0<=a&&a<=47);
  Int_t a2y[6]={3,2,4,1,5,0};//pady for a given address (for single DILOGIC chip)
                                  Int_t ch=ddl/2;
  Int_t tmp=(r-1)/8;              Int_t pc=(ddl%2)? 5-2*tmp:2*tmp;
                                  Int_t px=(d-1)*8+a/6;
        tmp=(ddl%2)?(24-r):r-1;   Int_t py=6*(tmp%8)+a2y[a%6];
  return AliHMPIDParam::Abs(ch,pc,px,py);
}

Bool_t AliHMPIDRawStream::Raw(UInt_t w32,Int_t ddl, AliRawReader *pRR)
{
 Converts a given raw data word to a digit
 Arguments: w32 - 32 bits raw data word
            ddl - DDL idx  0 1 2 3 4 ... 13
   Returns: none
  Int_t r = AliBitPacking::UnpackWord(w32,22,26); assert(1<=r&&r<=24);   //                                         Row number      (1..24)
  Int_t d = AliBitPacking::UnpackWord(w32,18,21); assert(1<=d&&d<=10);   // 3322 2222 2222 1111 1111 1000 0000 0000 DILOGIC number  (1..10)
  Int_t a = AliBitPacking::UnpackWord(w32,12,17); assert(0<=a&&a<=47);   // 1098 7654 3210 9876 5432 1098 7654 3210 DILOGIC address (0..47)
  Int_t q = AliBitPacking::UnpackWord(w32, 0,11); assert(0<=q&&q<=4095); // 0000 0rrr rrdd ddaa aaaa qqqq qqqq qqqq Qdc             (0..4095)
  if (r<1 || r>24 || d<1 || d>10 || a<0 || a>47 || q<0 || q>4095) {
    AliWarning(Form("Invalid raw data word %x",w32));
    pRR->AddMajorErrorLog(kInvalidRawDataWord,Form("w=%x",w32));
    return kFALSE;
  }
  Raw(ddl,r,d,a);
  fCharge[ddl][r][d][a]=q;
  return kTRUE;
}


Int_t GetFee(Int_t ddl, Int_t row)
void WriteRowMarker(AliFstream* ddl, UInt_t size)
void WriteEoE(AliFstream* ddl, UInt_t row, UInt_t dil, UInt_t wordCnt)
void WriteSegMarker(AliFstream* ddl, UInt_t row, Int_t nwInSeg)
void Write5FirmwareWords(AliFstream* ddl)
Bool_t SetZeroSup(Bool_t isSup)
Bool_t GetZeroSup() const
void WriteRaw(TObjArray* pDigAll)
Int_t GetErrors(Int_t ddl, Int_t eType) const
const Char_t* GetErrName(Int_t eType)
AliHMPIDRawStream(AliRawReader* rawReader)
Int_t GetNDDL()
{ return kNDDL;}
Int_t GetNErrors()
{ return kSumErr;}
Int_t GetNPads() const
{ return fNPads;}
Int_t* GetPadArray() const
{ return fPad;}
Int_t* GetChargeArray() const
{ return fCharge;}
Int_t* GetnDDLInStream() const
{ return fnDDLInStream;}
Int_t* GetnDDLOutStream() const
{ return fnDDLOutStream;}
Int_t Pc(Int_t ddl, Int_t row, Int_t dil, Int_t pad)
{return AliHMPIDParam::A2P(GetPad(ddl,row,dil,pad));}
Int_t PadPcX(Int_t ddl, Int_t row, Int_t dil, Int_t pad)
{return AliHMPIDParam::A2X(GetPad(ddl,row,dil,pad));}
Int_t PadPcY(Int_t ddl, Int_t row, Int_t dil, Int_t pad)
{return AliHMPIDParam::A2Y(GetPad(ddl,row,dil,pad));}
Int_t GetDDLNumber() const
{ return fDDLNumber;}
UInt_t GetLDCNumber() const
{ return fLDCNumber;}
UInt_t GetTimeStamp() const
{ return fTimeStamp;}
void SetTurbo(Bool_t isTurbo)
{fTurbo=isTurbo;}
Bool_t GetTurbo()
{ return fTurbo;}
Double_t GetDdlDataSize()
{ return 4.0*fRawDataSize;}
UInt_t GetNextWord()