// @(#) $Id$ // Author: C. Loizides //*-- Copyright © ALICE HLT Group #include "AliHLTTPCStandardIncludes.h" #include "AliHLTTPCRootTypes.h" #include "AliHLTTPCLogging.h" #include "AliHLTTPCTransform.h" #include "AliHLTTPCMemHandler.h" #include "AliHLTTPCDigitData.h" #ifdef use_newio #include "AliRawReaderRoot.h" #include "AliRawReaderDate.h" #else #include "AliHLTTPCDDLTPCRawStream.h" #include "AliHLTTPCDDLRawReaderFile.h" #endif #include "AliHLTTPCDDLDataFileHandler.h" #if __GNUC__ == 3 using namespace std; #endif /** \class AliHLTTPCDDLDataFileHandler
//_____________________________________________________________
// AliHLTTPCDDLDataFileHandler
//
//  This class does converts from the DDL format of offline
//  into the memory I/O handling of the HLT binary files.
//  
//  Examples: see ddl2binary in exa and the general 
//            AliHLTTPCMemHandler class description
//
*/ ClassImp(AliHLTTPCDDLDataFileHandler) AliHLTTPCDDLDataFileHandler::AliHLTTPCDDLDataFileHandler() { // default constructor fReader=0; fTPCStream=0; } AliHLTTPCDDLDataFileHandler::~AliHLTTPCDDLDataFileHandler() { // destructor FreeAll(); } void AliHLTTPCDDLDataFileHandler::FreeAll() { // frees all heap memory if(fReader) delete fReader; fReader = 0; if(fTPCStream) delete fTPCStream; fTPCStream = 0; } #ifdef use_newio Bool_t AliHLTTPCDDLDataFileHandler::SetReaderInput(AliRawEvent *rawevent) { // sets the input of the reader fEvent=-1; fFilename=""; if(fReader) delete fReader; fReader=new AliRawReaderRoot(rawevent); if(fTPCStream) delete fTPCStream; fTPCStream=new AliTPCRawStream(fReader); return kTRUE; } Bool_t AliHLTTPCDDLDataFileHandler::SetReaderInput(Char_t *name,Int_t event) { // sets the input of the reader fEvent=event; if(fReader) delete fReader; if(fTPCStream) delete fTPCStream; if(event>=0){ fFilename=name; fReader=new AliRawReaderRoot(name,event); } else { fFilename=""; fReader=new AliRawReaderDate((void *)name); } fTPCStream=new AliTPCRawStream(fReader); return kTRUE; } #else Bool_t AliHLTTPCDDLDataFileHandler::SetReaderInput(Char_t *name, Bool_t add) { // sets the input of the reader if(fReader){ LOG(AliHLTTPCLog::kError,"AliHLTTPCDDLDataFileHandler::SetReaderInput","File Open") <<"Reader ptr is already in use"<=0)&&(event!=fEvent)){ fEvent=event; if(fReader) delete fReader; if(fTPCStream) delete fTPCStream; fReader=new AliRawReaderRoot(fFilename,event); fTPCStream=new AliTPCRawStream(fReader); } #endif AliHLTTPCDigitRowData *data = 0; nrow=0; if(!fReader){ LOG(AliHLTTPCLog::kWarning,"AliHLTTPCDDLDataFileHandler::DDLData2Memory","File") <<"No Input avalible: no object AliHLTTPCDDLRawReaderFile"<ddls[ddlsToSearch-1]) { Int_t tempddl = ddls[0]; ddls[0] = ddls[ddlsToSearch-1]; ddls[ddlsToSearch-1] = tempddl; } #ifdef use_newio fReader->Reset(); fReader->Select(0,ddls[0],ddls[ddlsToSearch-1]); fTPCStream->Reset(); #else fTPCStream->SetDDLID(ddls[i]); //ddl to read out #endif Int_t zerosup = AliHLTTPCTransform::GetZeroSup(); Int_t adcsat = AliHLTTPCTransform::GetADCSat(); Int_t slice,srow; Int_t lrow=-1; while (fTPCStream->Next()){ if(fTPCStream->IsNewSector() || fTPCStream->IsNewRow()) { Int_t sector=fTPCStream->GetSector(); Int_t row=fTPCStream->GetRow(); AliHLTTPCTransform::Sector2Slice(slice,srow,sector,row); if(slice!=fSlice){ LOG(AliHLTTPCLog::kError,"AliHLTTPCDDLDataFileHandler::DDLDigits2Memory","Slice") <fRowMax))continue; Int_t pad=fTPCStream->GetPad(); if(fTPCStream->IsNewPad()) { if((pad<0)||(pad>=AliHLTTPCTransform::GetNPads(srow))){ LOG(AliHLTTPCLog::kError,"AliHLTTPCDDLDataFileHandler::DDLDigits2Memory","Pad") <GetTime(); if((time<0)||(time>=AliHLTTPCTransform::GetNTimeBins())){ LOG(AliHLTTPCLog::kError,"AliHLTTPCDDLDataFileHandler::DDLDigits2Memory","Time") <GetSignal(); if(dig <= zerosup) continue; if(dig >= adcsat) dig = adcsat; ndigits[lrow]++; //for this row only ndigitcount++; //total number of digits to be published charges[lrow][pad][time]=dig; } Int_t size = sizeof(AliHLTTPCDigitData)*ndigitcount + nrows*sizeof(AliHLTTPCDigitRowData); LOG(AliHLTTPCLog::kDebug,"AliHLTTPCDDLDataFileHandler::DDLDigits2Memory","Digits") <fRow = r; tempPt->fNDigit = ndigits[lrow]; Int_t localcount=0; for(Int_t pad=0;pad= ndigits[lrow]) LOG(AliHLTTPCLog::kFatal,"AliHLTTPCDDLDataFileHandler::DDLDigits2Binary","Memory") <fDigitData[localcount].fCharge=dig; tempPt->fDigitData[localcount].fPad=pad; tempPt->fDigitData[localcount].fTime=time; #ifdef do_mc tempPt->fDigitData[localcount].fTrackID[0] = 0; tempPt->fDigitData[localcount].fTrackID[1] = 0; tempPt->fDigitData[localcount].fTrackID[2] = 0; #endif localcount++; } } if(localcount != ndigits[lrow]) LOG(AliHLTTPCLog::kFatal,"AliHLTTPCDDLDataFileHandler::DDLDigits2Binary","Memory") <=0)&&(event!=fEvent)){ fEvent=event; if(fReader) delete fReader; if(fTPCStream) delete fTPCStream; fReader=new AliRawReaderRoot(fFilename,event); fTPCStream=new AliTPCRawStream(fReader); } #endif AliHLTTPCDigitRowData *data = 0; nrow=0; if(!fReader){ LOG(AliHLTTPCLog::kWarning,"AliHLTTPCDDLDataFileHandler::DDLData2Memory","File") <<"No Input avalible: no object AliHLTTPCDDLRawReaderFile"<Reset(); fReader->Select(0,ddls[0],ddls[ddlsToSearch-1]); fTPCStream->Reset(); #else fTPCStream->SetDDLID(ddls[i]); //ddl to read out #endif nrow = (UInt_t)nrows; return data; } #endif Bool_t AliHLTTPCDDLDataFileHandler::DDLData2CompBinary(Int_t event) { // transfers the DDL data to the memory and converts it // to comp binary Bool_t out = kTRUE; UInt_t ndigits=0; AliHLTTPCDigitRowData *digits=0; digits = DDLData2Memory(ndigits,event); out = Memory2CompBinary(ndigits,digits); Free(); return out; }