]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSRawStream.cxx
Introduction of decalibration in the simulations with anchor runs and raw:// OCDB.
[u/mrichter/AliRoot.git] / PHOS / AliPHOSRawStream.cxx
index a714002cc11dacbe4e2ded67fcab5efc58aaf901..b41eb9d7192305cd399a43f1530843ef553dfa20 100644 (file)
 /// root > while (input.Next()) ..... 
 ///////////////////////////////////////////////////////////////////////////////
 
-#include "TClonesArray.h"
-#include "TClass.h"
-
-
+#include <TString.h>
+#include <TSystem.h>
 
 #include "AliPHOSRawStream.h"
 #include "AliRawReader.h"
-#include "AliRawEventHeaderBase.h"
-#include "AliPHOSConTableDB.h"
-#include "AliPHOSDigit.h"
-
-#define EVENT_TYPE_MASK      ((UInt_t)0x0000FFFF)
+#include "AliPHOSAltroMapping.h"
 
 ClassImp(AliPHOSRawStream)
 
+
 //_____________________________________________________________________________
-AliPHOSRawStream::AliPHOSRawStream(AliRawReader* rawReader) : TObject()
+AliPHOSRawStream::AliPHOSRawStream(AliRawReader* rawReader) :
+  AliAltroRawStream(rawReader),
+  fModule(-1),
+  fPrevModule(-1),
+  fRow(-1),
+  fPrevRow(-1),
+  fColumn(-1),
+  fPrevColumn(-1),
+  fGain(0)
 {
-  fRawReader = rawReader ;
-  fctdb = 0 ;
+// create an object to read PHOS raw digits
+
+  SelectRawData("PHOS");
+
+  TString path = gSystem->Getenv("ALICE_ROOT");
+  path += "/PHOS/mapping/RCU";
+  TString path2;
+  for(Int_t i = 0; i < 4; i++) {
+    path2 = path;
+    path2 += i;
+    path2 += ".data";
+    fMapping[i] = new AliPHOSAltroMapping(path2.Data());
+  }
+
+  SetNoAltroMapping(kFALSE);
 }
-//_____________________________________________________________________________
-Bool_t AliPHOSRawStream::ReadDigits(TClonesArray * digits){
 
-  Bool_t isOK = kFALSE ;
-  if(!fctdb){
-    Error("ReadDigits","Connection table not set") ;
-    return kFALSE ;
-  }
+//_____________________________________________________________________________
+AliPHOSRawStream::AliPHOSRawStream(const AliPHOSRawStream& stream) :
+  AliAltroRawStream(stream),
+  fModule(-1),
+  fPrevModule(-1),
+  fRow(-1),
+  fPrevRow(-1),
+  fColumn(-1),
+  fPrevColumn(-1),
+  fGain(0)
+{  
+  Fatal("AliPHOSRawStream", "copy constructor not implemented");
+}
 
-  if(!digits){
-    Error("ReadDigits","Output array not created") ;
-    return kFALSE ;
-  }
+//_____________________________________________________________________________
+AliPHOSRawStream& AliPHOSRawStream::operator = (const AliPHOSRawStream& 
+                                             /* stream */)
+{
+  Fatal("operator =", "assignment operator not implemented");
+  return *this;
+}
 
-  if(!(digits->GetClass()->InheritsFrom("AliPHOSDigit"))){
-    Error("ReadDigits","Digits contanier made for %s, not AliPHOSDigits",digits->GetClass()->GetName()) ;
-    return kFALSE ;
-  }
+//_____________________________________________________________________________
+AliPHOSRawStream::~AliPHOSRawStream()
+{
+// destructor
 
-  digits->Clear() ;
+  for(Int_t i = 0; i < 4; i++) delete fMapping[i];
+}
 
-  //Check, if current event - PHYSICS event
-  if(!((fRawReader->GetType() & EVENT_TYPE_MASK)==AliRawEventHeaderBase::kPhysicsEvent)){
-    return kFALSE ;
-  }
+//_____________________________________________________________________________
+void AliPHOSRawStream::Reset()
+{
+  // reset phos raw stream params
+  AliAltroRawStream::Reset();
+  fModule = fPrevModule = fRow = fPrevRow = fColumn = fPrevColumn = -1;
+  fGain = 0;
+}
 
-  //Scan subevents until subevent with digits
-  while(fRawReader->ReadNextData(fData)){    
-    switch (fRawReader->GetEquipmentType()){
-    case kPattUnitMarker:
-      if(fRawReader->GetEquipmentId() == kPattUnitEquipId){ //Read PHOS trigger
-       Int_t * patt = (Int_t *)fData;
-       if(fRawReader->GetEquipmentSize() >= (Int_t)sizeof(Int_t))
-         fTrig = patt[0];
-       else
-         fTrig = 0 ;
-      }
-      break;
-    case kPhosAdcMarker:
-      if(fRawReader->GetEquipmentId() == kPhosAdcEquipId){
-       Int_t ndigits = fRawReader->GetEquipmentSize()/sizeof(Int_t);      
-       digits->Expand(ndigits) ;
-       for(Int_t i=0; i<ndigits; i++){
-         Int_t * amps = (Int_t *)fData ;
-         Int_t absID = fctdb->Raw2AbsId(i) ;
-         Int_t time = 0;
-         if(absID>0) //Only real digits are filled, last ADC numbers (if any) are scipped
-           new((*digits)[i]) AliPHOSDigit( -1, absID, amps[i], time) ;
-       }
-       digits->Sort() ;
-       digits->Compress() ;  
-       digits->Expand(digits->GetEntriesFast()) ;
-
-       //Set indexes in list of digits and make true digitization of the energy
-       for (Int_t id = 0 ; id < digits->GetEntriesFast() ; id++) { 
-         AliPHOSDigit * digit = dynamic_cast<AliPHOSDigit*>( digits->At(id) ) ; 
-         digit->SetIndexInList(id) ;     
-       }
-
-       isOK = kTRUE ;
-      }
-      break;
-    case kTdcMarker:
-      if(fRawReader->GetEquipmentId() == kTdcEquipId){
-       // Probably sometime we will need to handle these data 
-      }
-      break;
-    case kChargeAdcMarker:
-      if(fRawReader->GetEquipmentId() == kChargeAdcEquipId){
-       //Probably sometime we will need to handle these data 
-      }
-      break;
-    case kScalerMarker:
-      if(fRawReader->GetEquipmentId() == kScalerEquipId){
-       //Probably sometime we will need to handle these data 
-      }
-      break;
-    default:
-      break;
-    }
+//_____________________________________________________________________________
+Bool_t AliPHOSRawStream::Next()
+{
+  // Read next PHOS signal
+  // Apply the PHOS altro mapping to get
+  // the module,row and column indeces
+  fPrevModule = fModule;
+  fPrevRow = fRow;
+  fPrevColumn = fColumn;
+  if (AliAltroRawStream::Next()) {
+    if (IsNewHWAddress())
+      ApplyAltroMapping();
+    return kTRUE;
   }
-  return isOK ;
+  else
+    return kFALSE;
 }
 
+//_____________________________________________________________________________
+void AliPHOSRawStream::ApplyAltroMapping()
+{
+  // Take the DDL index, load
+  // the corresponding altro mapping
+  // object and fill the sector,row and pad indeces
+  Int_t ddlNumber = GetDDLNumber();
+  fModule = ddlNumber / 4;
+
+  Int_t rcuIndex = ddlNumber % 4;
+
+  Short_t hwAddress = GetHWAddress();
+  fRow = fMapping[rcuIndex]->GetPadRow(hwAddress);
+  fColumn = fMapping[rcuIndex]->GetPad(hwAddress);
+  fGain = fMapping[rcuIndex]->GetSector(hwAddress);
+
+}