/// 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);
+
+}