Huffman TPC compression removed. TPC raw stream reader class derives now from base...
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 23 Mar 2006 12:39:47 +0000 (12:39 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 23 Mar 2006 12:39:47 +0000 (12:39 +0000)
TPC/AliTPC.cxx
TPC/AliTPCDDLRawData.cxx
TPC/AliTPCDDLRawData.h
TPC/AliTPCRawStream.cxx [new file with mode: 0644]
TPC/AliTPCRawStream.h [new file with mode: 0644]
TPC/TPCbaseLinkDef.h
TPC/TPCsimLinkDef.h
TPC/libTPCbase.pkg
TPC/libTPCsim.pkg

index ec7101f18989781901e000546c40e59d2946dff3..14fc00cf70cee0ce44e43f664c85ba3299d0f3a0 100644 (file)
@@ -780,7 +780,6 @@ void AliTPC::Digits2Raw()
 // convert digits of the current event to raw data
 
   static const Int_t kThreshold = 0;
-  static const Bool_t kCompress = kFALSE;
 
   fLoader->LoadDigits();
   TTree* digits = fLoader->TreeD();
@@ -866,11 +865,6 @@ void AliTPC::Digits2Raw()
   rawWriter.RawData(fileName);
   gSystem->Unlink(fileName);
 
-  if (kCompress) {
-    AliInfo("Compressing raw data");
-    rawWriter.RawDataCompDecompress(kTRUE);
-    gSystem->Unlink("Statistics");
-  }
 }
 
 
index 20268b0298f78e6743f3de19f24993ecf28a2203..ac97936bba4a3c5c558b66a659b705802092e7e8 100644 (file)
@@ -27,7 +27,6 @@
 #include <Riostream.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include "AliTPCCompression.h"
 #include "AliAltroBuffer.h"
 #include "AliTPCAltroMapping.h"
 #include "AliTPCDDLRawData.h"
@@ -57,7 +56,6 @@ void AliTPCDDLRawData::RawData(const char* inputFileName){
   //Number of DDL=2*36+4*36=216
   //2 DDL for each inner sector
   //4 DDL for each outer sector
-  Int_t offset=1;
   ifstream f;
 #ifndef __DECCXX
   f.open(inputFileName,ios::binary);
@@ -119,7 +117,7 @@ void AliTPCDDLRawData::RawData(const char* inputFileName){
       //size magic word sector number sub-sector number 0 for TPC 0 for uncompressed
       buffer->WriteDataHeader(kTRUE,kFALSE);//Dummy;
       bunchLength=1;
-      buffer->FillBuffer(data.Dig-offset);
+      buffer->FillBuffer(data.Dig);
       nwords++;
     }//end if
     else{
@@ -165,7 +163,7 @@ void AliTPCDDLRawData::RawData(const char* inputFileName){
        pSecNumber=data.Sec;
       }//end else
       pTimeBin=data.Time;
-      buffer->FillBuffer(data.Dig-offset);
+      buffer->FillBuffer(data.Dig);
       nwords++;
     }//end else
   }//end while
@@ -186,254 +184,3 @@ void AliTPCDDLRawData::RawData(const char* inputFileName){
   f.close();
   return;
 }
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-
-
-Int_t AliTPCDDLRawData::RawDataCompDecompress(Bool_t compress){
-  //This method is used to compress and decompress the slides
-  static const Int_t kNumTables=5;
-  char filename[20];
-  fstream f;
-  UInt_t size=0;
-  AliTPCCompression util;
-  util.SetVerbose(0);
-
-  for(Int_t i=0;i<216;i++){
-    sprintf(filename,"TPC_%d.ddl",i+kDDLOffset);
-#ifndef __DECCXX
-    f.open(filename,ios::binary|ios::in);
-#else
-    f.open(filename,ios::in);
-#endif
-#if defined(__HP_aCC) || defined(__DECCXX)
-    if(!f.rdbuf()->is_open()){f.clear(); continue;}
-#else
-    if(!f.is_open()){f.clear(); continue;}
-#endif
-    if (fVerbose)
-      Info("RawDataCompDecompress", "&s -> dest.ddl", filename);
-    ofstream fdest;
-#ifndef __DECCXX
-    fdest.open("dest.ddl",ios::binary);
-#else
-    fdest.open("dest.ddl");
-#endif
-    //loop over the DDL block 
-    //Each block contains a Data Header followed by raw data (ALTRO FORMAT)
-    //The number of block is ceil(216/LDCsNumber)
-    AliRawDataHeader header;
-    //here the Data Header is read
-    while( f.read((char*)(&header),sizeof(header)) ){
-      size=header.fSize-sizeof(header);
-      // cout<<"Data size:"<<size<<endl;
-      //Int_t dim=sizeof(UInt_t)+sizeof(Int_t)*5;
-      //cout<<" Sec "<<SecNumber<<" SubSector "<<SubSector<<" size "<<size<<endl;
-      Bool_t compressed = header.TestAttribute(1);
-      if ((compressed && compress) ||
-         (!compressed && !compress)) continue;
-      //open the temporay File
-      ofstream fo;
-      char temp[15]="TempFile";
-#ifndef __DECCXX
-      fo.open(temp,ios::binary);
-#else
-      fo.open(temp);
-#endif
-      Int_t car=0;
-      for(UInt_t j=0;j<size;j++){
-       f.read((char*)(&car),1);
-       fo.write((char*)(&car),1);
-      }//end for
-      fo.close();
-      //The temp file is compressed or decompressed
-      Int_t result=0;
-      if(compress){
-       result=util.CompressDataOptTables(kNumTables,temp,"TempCompDecomp");
-      }
-      else
-       result=util.DecompressDataOptTables(kNumTables,temp,"TempCompDecomp");
-      if (result != 0) break;
-      //the temp compressed file is open and copied to the final file fdest
-      ifstream fi;
-#ifndef __DECCXX
-      fi.open("TempCompDecomp",ios::binary);
-#else
-      fi.open("TempCompDecomp");
-#endif
-      fi.seekg(0,ios::end);
-      size=fi.tellg();
-      fi.seekg(0);
-      //The Data Header is updated (size and Compressed flag) 
-      //and written into the output file
-      header.fSize=size+sizeof(header);
-      if (compress) header.SetAttribute(1);
-      else header.ResetAttribute(1);
-      fdest.write((char*)(&header),sizeof(header));
-      //The compressem temp file is copied into the output file fdest
-      for(UInt_t j=0;j<size;j++){
-       fi.read((char*)(&car),1);
-       fdest.write((char*)(&car),1);
-      }//end for
-      fi.close();
-    }//end while
-    f.clear();
-    f.close();
-    fdest.close();
-    remove("TempFile");
-    remove("TempCompDecomp");
-    rename("dest.ddl",filename);
-  }//end for
-  return 0;
-}
-
-/////////////////////////////////////////////////////////////////////////////////
-void AliTPCDDLRawData::RawDataAltro(const char* inputFileName, const char* outputFileName)const{
-  //This method is used to build the Altro format from AliTPCDDL.dat
-  //It is used to debug the code and creates the tables used in the compresseion phase
-  Int_t offset=1;
-  ifstream f;
-#ifndef __DECCXX
-  f.open(inputFileName,ios::binary);
-#else
-  f.open(inputFileName);
-#endif
-  if(!f){
-    Error("RawDataAltro", "File doesn't exist !!");
-    return;
-  }
-  struct DataPad{
-    Int_t Sec;
-    Int_t SubSec;
-    Int_t Row;
-    Int_t Pad;
-    Int_t Dig;
-    Int_t Time;
-  };
-  DataPad data;
-
-  TString path = gSystem->Getenv("ALICE_ROOT");
-  path += "/TPC/mapping/Patch";
-  TString path2;
-  AliTPCAltroMapping *mapping[6];
-  for(Int_t i = 0; i < 6; i++) {
-    path2 = path;
-    path2 += i;
-    path2 += ".data";
-    mapping[i] = new AliTPCAltroMapping(path2.Data());
-  }
-
-  //AliAltroBuffer is used in write mode to generate AltroFormat.dat file
-  Info("RawDataAltro", "Creating &s", outputFileName);
-  AliAltroBuffer *buffer=new AliAltroBuffer(outputFileName,1);
-
-  UInt_t count=0;
-  Int_t pSecNumber=-1;  //Previous Sector number
-  Int_t pSubSec=-1;     //Previous sub Sector
-  Int_t pRowNumber=-1;  //Previous Row number  
-  Int_t pPadNumber=-1;  //Previous Pad number
-  Int_t pTimeBin=-1;    //Previous Time-Bin
-  Int_t bunchLength=0;
-  Int_t nwords=0;
-  UInt_t numPackets=0;
-  while (f.read((char*)(&data),sizeof(data))){
-    count++;
-    if (pPadNumber==-1){
-      pSubSec=data.SubSec;
-      pSecNumber=data.Sec;
-      pRowNumber=data.Row;
-      pPadNumber=data.Pad;
-      pTimeBin=data.Time;
-      bunchLength=1;
-      buffer->FillBuffer(data.Dig-offset);
-      nwords++;
-    }//end if
-    else{
-      if ( (data.Time==(pTimeBin+1)) &&
-          (pPadNumber==data.Pad) &&
-          (pRowNumber==data.Row) &&
-          (pSecNumber==data.Sec)){
-       bunchLength++;
-      }//end if
-      else{
-       buffer->FillBuffer(pTimeBin);
-       buffer->FillBuffer(bunchLength+2);
-       nwords+=2;
-       if ((pPadNumber!=data.Pad)||(pRowNumber!=data.Row)||(pSecNumber!=data.Sec)){
-         //Trailer is formatted and inserted!!
-         Int_t patchIndex = pSubSec;
-         if(pSecNumber >= 36) patchIndex += 2;
-         buffer->SetMapping(mapping[patchIndex]);
-         buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
-         numPackets++;
-         nwords=0;
-       }//end if
-       
-       bunchLength=1;
-       pPadNumber=data.Pad;
-       pRowNumber=data.Row;
-       pSecNumber=data.Sec;
-      }//end else
-      pTimeBin=data.Time;
-      buffer->FillBuffer(data.Dig-offset);
-      nwords++;
-    }//end else
-  }//end while
-  buffer->FillBuffer(pTimeBin);
-  buffer->FillBuffer(bunchLength+2);
-  nwords+=2;
-  Int_t patchIndex = pSubSec;
-  if(pSecNumber >= 36) patchIndex += 2;
-  buffer->SetMapping(mapping[patchIndex]);
-  buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
-  delete buffer;
-  Info("RawDataAltro", "Number of digits: %d", count);
-
-  for(Int_t i = 0; i < 6; i++) delete mapping[i];
-
-  f.close(); 
-  return;
-}
-
-/////////////////////////////////////////////////////////////////////////
-void AliTPCDDLRawData::RawDataAltroDecode(const char* outputFileName){
-  //This method merges the slides in only one file removing at the same 
-  //time all the data headers. The file so obtained must be Altro format
-  //complaiant.
-  //It is used mainly in the debugging phase 
-  char filename[15];
-  fstream f;
-  ofstream fdest;
-
-#ifndef __DECCXX
-  fdest.open(outputFileName,ios::binary);
-#else
-  fdest.open(outputFileName);
-#endif
-  UInt_t size=0;
-  AliRawDataHeader header;
-  for(Int_t i=0;i<216;i++){
-    sprintf(filename,"TPC_%d.ddl",i+kDDLOffset);
-#ifndef __DECCXX
-    f.open(filename,ios::binary|ios::in);
-#else
-    f.open(filename,ios::in);
-#endif
-    if(!f)continue;
-    //loop over the DDL block 
-    //Each block contains a Data Header followed by raw data (ALTRO FORMAT)
-    while( (f.read((char*)(&header),sizeof(header))) ){
-      Int_t car=0;
-      size=header.fSize-sizeof(header);
-      for(UInt_t j=0;j<size;j++){
-       f.read((char*)(&car),1);
-       fdest.write((char*)(&car),1);
-      }//end for
-    }//end while
-    f.clear();
-    f.close();
-  }//end for
-  fdest.close();
-  return;
-}
-
index 782de47297fee2d598b87c856b5a90594998cccf..d2bcf6fefd3fb0187810f25947ee503aa2439e00 100644 (file)
@@ -17,14 +17,6 @@ class AliTPCDDLRawData:public TObject{
   AliTPCDDLRawData& operator=(const AliTPCDDLRawData &source); // ass. op.
   void  RawData(const char* inputFileName = "AliTPCDDL.dat");
   //This method is used to create the slides (sequence of files)
-  Int_t RawDataCompDecompress(Bool_t compress = kTRUE);
-  //This method is used to create the compressed slides starting from the uncompressed ones 
-  //or it can be used to decompress a sequence of compressed slices
-  void  RawDataAltro(const char* inputFileName = "AliTPCDDL.dat", const char* outputFileName = "AltroFormatDDL.dat")const;
-  //This method is used to create the Altro format file from "AliTPCDDL.dat"
-  void RawDataAltroDecode(const char* outputFileName);
-  //This method is used to construct an Altro format file starting from
-  //the slices compressed or uncompressed
   void SetVerbose(Int_t Verbose){fVerbose=Verbose;}
  private:
   Int_t fVerbose;         //Verbose level 0:Silent, 1: cout msg, 2:txt files for debugging
diff --git a/TPC/AliTPCRawStream.cxx b/TPC/AliTPCRawStream.cxx
new file mode 100644 (file)
index 0000000..53c7475
--- /dev/null
@@ -0,0 +1,109 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, 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$ */
+
+///////////////////////////////////////////////////////////////////////////////
+///
+/// This class provides access to TPC digits in raw data.
+///
+/// It loops over all TPC digits in the raw data given by the AliRawReader.
+/// The Next method goes to the next digit. If there are no digits left
+/// it returns kFALSE.
+/// Several getters provide information about the current digit.
+///
+///////////////////////////////////////////////////////////////////////////////
+
+#include <TSystem.h>
+
+#include "AliTPCRawStream.h"
+#include "AliRawReader.h"
+#include "AliLog.h"
+#include "AliTPCAltroMapping.h"
+
+ClassImp(AliTPCRawStream)
+
+//_____________________________________________________________________________
+AliTPCRawStream::AliTPCRawStream(AliRawReader* rawReader) :
+  AliAltroRawStream(rawReader)
+{
+  // create an object to read TPC raw digits
+
+  fRawReader->Select(0);
+
+  TString path = gSystem->Getenv("ALICE_ROOT");
+  path += "/TPC/mapping/Patch";
+  TString path2;
+  for(Int_t i = 0; i < 6; i++) {
+    path2 = path;
+    path2 += i;
+    path2 += ".data";
+    fMapping[i] = new AliTPCAltroMapping(path2.Data());
+  }
+
+  fNoAltroMapping = kFALSE;
+}
+
+//_____________________________________________________________________________
+AliTPCRawStream::AliTPCRawStream(const AliTPCRawStream& stream) :
+  AliAltroRawStream(stream)
+{
+  Fatal("AliTPCRawStream", "copy constructor not implemented");
+}
+
+//_____________________________________________________________________________
+AliTPCRawStream& AliTPCRawStream::operator = (const AliTPCRawStream& 
+                                             /* stream */)
+{
+  Fatal("operator =", "assignment operator not implemented");
+  return *this;
+}
+
+//_____________________________________________________________________________
+AliTPCRawStream::~AliTPCRawStream()
+{
+// destructor
+
+  for(Int_t i = 0; i < 6; i++) delete fMapping[i];
+}
+
+//_____________________________________________________________________________
+void AliTPCRawStream::Reset()
+{
+  // reset tpc raw stream params
+  AliAltroRawStream::Reset();
+}
+
+//_____________________________________________________________________________
+void AliTPCRawStream::ApplyAltroMapping()
+{
+  // Reads the DDL index, loads
+  // the corresponding altro mapping
+  // object and fills the sector,row and pad indeces
+  Int_t ddlNumber = fRawReader->GetDDLID();
+  Int_t patchIndex;
+  if (ddlNumber < 72) {
+    fSector = ddlNumber / 2;
+    patchIndex = ddlNumber % 2;
+  }
+  else {
+    fSector = (ddlNumber - 72) / 4 + 36;
+    patchIndex = (ddlNumber - 72) % 4 + 2;
+  }
+
+  fRow = fMapping[patchIndex]->GetPadRow(fHWAddress);
+  fPad = fMapping[patchIndex]->GetPad(fHWAddress);
+
+}
diff --git a/TPC/AliTPCRawStream.h b/TPC/AliTPCRawStream.h
new file mode 100644 (file)
index 0000000..722cf65
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef ALITPCRAWSTREAM_H
+#define ALITPCRAWSTREAM_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+///////////////////////////////////////////////////////////////////////////////
+///
+/// This class provides access to TPC digits in raw data.
+///
+///////////////////////////////////////////////////////////////////////////////
+
+#include "AliAltroRawStream.h"
+
+class AliRawReader;
+class AliAltroMapping;
+
+class AliTPCRawStream: public AliAltroRawStream {
+  public :
+    AliTPCRawStream(AliRawReader* rawReader);
+    virtual ~AliTPCRawStream();
+
+    virtual void             Reset();
+
+  protected :
+    AliTPCRawStream(const AliTPCRawStream& stream);
+    AliTPCRawStream& operator = (const AliTPCRawStream& stream);
+
+    virtual void ApplyAltroMapping();
+
+    AliAltroMapping *fMapping[6];   // Pointers to ALTRO mapping
+
+    ClassDef(AliTPCRawStream, 0)    // base class for reading TPC raw digits
+};
+
+#endif
index 264b4049521949c1860c863f18b4e36d28b7cea3..ca42174e72e8d92563db72050d24fac5cea5151d 100644 (file)
@@ -29,5 +29,8 @@
 #pragma link C++ class AliDigitsArray+;
 #pragma link C++ class AliTPCDigitsArray+;
 
+#pragma link C++ class AliTPCAltroMapping+;
+#pragma link C++ class AliTPCRawStream+;
+
 #endif
 
index 71333da193914b5b2ee54a1a3bb38044ce78ea1d..d927f1f527cb397e1ed380697678c5b3546f5232 100644 (file)
@@ -28,7 +28,6 @@
 
 #pragma link C++ class AliTPCBuffer+;
 #pragma link C++ class AliTPCDDLRawData+;
-#pragma link C++ class AliTPCAltroMapping+;
 
 #endif
 
index a13bc63a53b1e119e1970fd454724c558afef820..b4a1fcc994b3208791552b0056f162e2eadcde18 100644 (file)
@@ -3,7 +3,8 @@ SRCS:=  AliSegmentID.cxx  AliSegmentArray.cxx AliDigits.cxx AliH2F.cxx \
         AliDetectorParam.cxx AliTPCParam.cxx \
         AliTPCParamSR.cxx AliTPCParamCR.cxx \
         AliTPCdigit.cxx \
-        AliSimDigits.cxx AliDigitsArray.cxx AliTPCDigitsArray.cxx 
+        AliSimDigits.cxx AliDigitsArray.cxx AliTPCDigitsArray.cxx \
+       AliTPCAltroMapping.cxx AliTPCRawStream.cxx
 
 
        
index c61084a075ee868faf4d10c16bccfa7e48d6084e..da1ab8ff5c8807c03ab94b91def61f2f84ee74d4 100644 (file)
@@ -3,8 +3,7 @@ SRCS:=  AliTPC.cxx \
         AliTPCLaser.cxx \
         AliTPCTrackHitsV2.cxx \
         AliTPCDigitizer.cxx \
-        AliTPCBuffer.cxx AliTPCDDLRawData.cxx \
-       AliTPCAltroMapping.cxx
+        AliTPCBuffer.cxx AliTPCDDLRawData.cxx
 
 
 HDRS:= $(SRCS:.cxx=.h)