// @(#) $Id$ // Author: C. Loizides //*-- Copyright © ALICE HLT Group #include "AliL3StandardIncludes.h" #include "AliL3RootTypes.h" #include "AliL3Logging.h" #include "AliL3Transform.h" #include "AliL3MemHandler.h" #include "AliL3DigitData.h" #include "AliL3RawDataFileHandler.h" #if __GNUC__ >= 3 using namespace std; #endif /** \class AliL3RawDataFileHandler
//_____________________________________________________________
// AliL3RawDataFileHandler
//
*/ ClassImp(AliL3RawDataFileHandler) AliL3RawDataFileHandler::AliL3RawDataFileHandler() { //constructor fConvert=kTRUE; fInRaw = 0; fInRawPed = 0; fMapping = 0; fPedestals=0; fCharges=0; fOutRaw = 0; fRow=0; fPad=0; fRowPad=0; FreeAll(); if((sizeof(Int_t) != 4) || (sizeof(Short_t) != 2)){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::AliL3RawDataFileHandler","Constructor") <<"Check architecture to run the conversion on! Int_t should be 32 and Short_t should be 16 bit."<open(name,fstream::binary); #else fInRaw->open(name); #endif #if defined(__HP_aCC) || defined(__DECCXX) if(!fInRaw->rdbuf()->is_open()){ #else if(!fInRaw->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open") <<"Pointer to ifstream = 0x0"<rdbuf()->is_open()){ #else if(!fInRaw->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open") <<"Pointer to ifstream = 0x0"<rdbuf()->is_open()) fInRaw->close(); #else if(fInRaw->is_open()) fInRaw->close(); #endif delete fInRaw; fInRaw = 0; } Bool_t AliL3RawDataFileHandler::SetRawOutput(Char_t *name) { //set raw output if(fOutRaw){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open") <<"File ptr is already in use, close file first"<open(name,fstream::binary); #else fOutRaw->open(name); #endif #if defined(__HP_aCC) || defined(__DECCXX) if(!fOutRaw->rdbuf()->is_open()){ #else if(!fOutRaw->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open") <<"Pointer to ofstream = 0x0"<rdbuf()->is_open()){ #else if(!fOutRaw->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open") <<"Pointer to ofstream = 0x0"<rdbuf()->is_open()) fOutRaw->close(); #else if(fOutRaw->is_open()) fOutRaw->close(); #endif delete fOutRaw; fOutRaw = 0; } Bool_t AliL3RawDataFileHandler::SetRawPedestalsInput(Char_t *name) { //set raw pedestals if(fInRawPed){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open") <<"File ptr is already in use, close file first"<open(name,fstream::binary); #else fInRawPed->open(name); #endif #if defined(__HP_aCC) || defined(__DECCXX) if(!fInRawPed->rdbuf()->is_open()){ #else if(!fInRawPed->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open") <<"Pointer to ifstream = 0x0"<rdbuf()->is_open()){ #else if(!fInRawPed->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open") <<"Pointer to ifstream = 0x0"<rdbuf()->is_open()) fInRawPed->close(); #else if(fInRawPed->is_open()) fInRawPed->close(); #endif delete fInRawPed; fInRaw = 0; } Bool_t AliL3RawDataFileHandler::SetMappingFile(Char_t *name) { //set mapping file if(fMapping){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetMapping","File Open") <<"File ptr is already in use, close file first"<fRowMaxUsed) fRowMaxUsed=row; if(rowfPadMaxUsed) fPadMaxUsed=pad; if(pad LittleEndian i3i2i1i0 if(!fConvert) return i; Char_t *p=(Char_t*)&i; Char_t temp[4]; temp[0]=p[3]; temp[1]=p[2]; temp[2]=p[1]; temp[3]=p[0]; return (*(Int_t*)temp); } inline Short_t AliL3RawDataFileHandler::Convert2(Short_t s) const { //BigEndian i0i1 -> LittleEndian i1i0 if(!fConvert) return s; Char_t *p=(Char_t*)&s; Char_t temp[2]; temp[0]=p[1]; temp[1]=p[0]; return (*(Short_t*)temp); } Int_t AliL3RawDataFileHandler::ReadRawInput() { //Read data from cosmics file into memory if(!fInRaw){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","File Open") <<"No Input avalible: no object ifstream"<rdbuf()->is_open()){ #else if(!fInRaw->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","File Open") <<"No Input avalible: ifstream not opened"<read((Char_t*)&dummy4,sizeof(dummy4)); if(dummy4==(Int_t)fNChannels) fConvert=kFALSE; else { Int_t knumofChannels = Convert4(dummy4); if(knumofChannels!=(Int_t)fNChannels){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency") <<"Number of Channels should be equal to fNChannels "<read((Char_t*)&dummy2,sizeof(dummy2)); UShort_t channel = Convert2(dummy2); if(channel>fNChannels){ LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency") <read((Char_t*)&dummy4,sizeof(dummy4)); Int_t numofChannelsTest = Convert4(dummy4); if (numofChannelsTest != (Int_t)fNChannels){ LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency") <read((Char_t*)&dummy4,sizeof(dummy4)); fNTimeBins=Convert4(dummy4); if(fNTimeBins!=AliL3Transform::GetNTimeBins()){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency") <read((Char_t*)&dummy2,sizeof(dummy2));//1024012)); Short_t charge = Convert2(dummy2); //Pedestal substraction if(fPedestals) charge-=fPedestals[channel][timebin]; else charge-=fPedVal; if(charge<0) charge=0; fCharges[channel][timebin]=charge; } } return fNChannels; } Int_t AliL3RawDataFileHandler::ReadRawInputPointer(const Char_t *ptr) { //Read data from cosmics pointer into memory if(!ptr){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInputPointer","Pointer") <<"Pointer equals 0x0!"<fNChannels){ LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInputPointer","Data Inconsistency") <read((Char_t*)&dummy2,sizeof(dummy2)); Short_t charge = Convert2(dummy2); charges[channel][timebin]=charge; } } channels=fNChannels; timebins=fNTimeBins; return charges; } Int_t AliL3RawDataFileHandler::StoreRawData(Short_t **charges) { //store charges in the raw data format if(!fOutRaw){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::StoreRawData","File Open") <<"No Output avalible: no object ofstream"<rdbuf()->is_open()){ #else if(!fOutRaw->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::StoreRawData","File Open") <<"No Output avalible: ofstream not opened"<write((Char_t*)&dummy4,sizeof(dummy4)); for(UInt_t i = 0 ; i < fNChannels ; i++){ dummy2 = Convert2(Short_t(i)); fOutRaw->write((Char_t*)&dummy2,sizeof(dummy2)); } dummy4=Convert4(fNChannels); fOutRaw->write((Char_t*)&dummy4,sizeof(dummy4)); //Timebins dummy4=Convert4(fNTimeBins); fOutRaw->write((Char_t*)&dummy4,sizeof(dummy4)); for(UInt_t channel = 0; channel < fNChannels; channel++){ for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){ Short_t charge=charges[channel][timebin]; dummy2 = Convert2(charge); fOutRaw->write((Char_t*)&dummy2,sizeof(dummy2)); } } return fNChannels; } Int_t AliL3RawDataFileHandler::ReadRawPedestalsInput() { //read raw pedestals input if(!fInRawPed){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","File Open") <<"No Input avalible: no object ifstream"<rdbuf()->is_open()){ #else if(!fInRawPed->is_open()){ #endif LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","File Open") <<"No Input avalible: ifstream not opened"<read((Char_t*)&dummy4,sizeof(dummy4)); if(dummy4==(Int_t)fNChannels) fConvert=kFALSE; else { Int_t knumofChannels = Convert4(dummy4); if(knumofChannels!=(Int_t)fNChannels){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","Data Inconsistency") <read((Char_t*)&dummy2,sizeof(dummy2)); //UShort_t channel = Convert2(dummy2); } fInRawPed->read((Char_t*)&dummy4,sizeof(dummy4)); //Int_t numofChannelsTest = Convert4(dummy4); //Timebins fInRawPed->read((Char_t*)&dummy4,sizeof(dummy4)); fNTimeBins=Convert4(dummy4); if(fNTimeBins!=AliL3Transform::GetNTimeBins()){ LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","Data Inconsistency") <read((Char_t*)&dummy2,sizeof(dummy2)); Short_t charge = Convert2(dummy2); fPedestals[channel][timebin]=charge; } } CloseRawPedestalsInput(); return fNChannels; } AliL3DigitRowData * AliL3RawDataFileHandler::RawData2Memory(UInt_t &nrow,Int_t /*event*/) { //convert raw data to memory AliL3DigitRowData *data = 0; nrow=0; if(fNTimeBins==0){ LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::RawData2Memory","Data Inconsistency") <<"Call AliL3RawDataFileHandler::RawReadInput() first"<fRowMax) break; for(Int_t pad=0;pad= AliL3Transform::GetADCSat()) dig = AliL3Transform::GetADCSat(); ndigits[slrow]++; //for this row only ndigitcount++; //total number of digits to be published } } //count number of rows nrows++; } //test data consistency Int_t ndigitcounttest=0; for(Int_t slrow=0;slrowfRowMax) break; tempPt->fRow = slrow; tempPt->fNDigit = ndigits[slrow]; Int_t localcount=0; for(Int_t pad=0;pad= AliL3Transform::GetADCSat()) dig = AliL3Transform::GetADCSat(); //Exclude data outside cone: //AliL3Transform::Raw2Local(xyz,sector,row,pad,time); //if(fParam->GetPadRowRadii(sector,row)<230./250.*fabs(xyz[2])) continue; tempPt->fDigitData[localcount].fCharge=(UShort_t)dig; tempPt->fDigitData[localcount].fPad=(UChar_t)pad; tempPt->fDigitData[localcount].fTime=(UShort_t)timebin; #ifdef do_mc tempPt->fDigitData[localcount].fTrackID[0] = 0; tempPt->fDigitData[localcount].fTrackID[1] = 0; tempPt->fDigitData[localcount].fTrackID[2] = 0; #endif localcount++; ndigitcounttest2++; } //time } //pad if(localcount != ndigits[slrow]) LOG(AliL3Log::kFatal,"AliL3RawDataFileHandler::RawData2Memory","Memory") <