X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSDDLRawData.cxx;h=83ebe31e315247e11b29c9d1335a9e35daee044b;hb=5b7417d25cca06b723ad58be20a2fc6fe9d262b0;hp=573ddf67142f76f383bef360529a5946e82d85bb;hpb=a97b3678d2b467065e293043d7caade7637dbcf8;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSDDLRawData.cxx b/ITS/AliITSDDLRawData.cxx index 573ddf67142..83ebe31e315 100644 --- a/ITS/AliITSDDLRawData.cxx +++ b/ITS/AliITSDDLRawData.cxx @@ -23,16 +23,21 @@ //SSD #include +//#include #include #include #include "AliITSdigit.h" #include "AliITSDDLRawData.h" -#include "AliRawDataHeader.h" +#include "AliRawDataHeaderSim.h" #include "AliITSRawStreamSPD.h" #include "AliITSRawStreamSDD.h" +#include "AliITSDDLModuleMapSDD.h" #include "AliITSRawStreamSSD.h" +#include "AliITSIntMap.h" #include "AliBitPacking.h" #include "AliDAQ.h" +#include "AliFstream.h" +#include "AliITSFOSignalsSPD.h" ClassImp(AliITSDDLRawData) @@ -40,7 +45,8 @@ ClassImp(AliITSDDLRawData) AliITSDDLRawData::AliITSDDLRawData(): fVerbose(0), fIndex(-1), -fHalfStaveModule(-1){ +fHalfStaveModule(-1), +fSDDRawFormat(7){ //Default constructor } @@ -51,7 +57,8 @@ AliITSDDLRawData::AliITSDDLRawData(const AliITSDDLRawData &source) : TObject(source), fVerbose(source.fVerbose), fIndex(source.fIndex), -fHalfStaveModule(source.fHalfStaveModule){ +fHalfStaveModule(source.fHalfStaveModule), +fSDDRawFormat(source.fSDDRawFormat){ //Copy Constructor } @@ -62,6 +69,7 @@ AliITSDDLRawData& AliITSDDLRawData::operator=(const AliITSDDLRawData &source){ this->fIndex=source.fIndex; this->fHalfStaveModule=source.fHalfStaveModule; this->fVerbose=source.fVerbose; + this->fSDDRawFormat=source.fSDDRawFormat; return *this; } @@ -71,6 +79,7 @@ AliITSDDLRawData& AliITSDDLRawData::operator=(const AliITSDDLRawData &source){ void AliITSDDLRawData::GetDigitsSSD(TClonesArray *ITSdigits,Int_t mod,Int_t modR,Int_t ddl,UInt_t *buf){ //This method packs the SSD digits in a proper 32 bits structure + // Revised by Enrico Fragiacomo Int_t ix; Int_t iz; Int_t is; @@ -85,21 +94,29 @@ void AliITSDDLRawData::GetDigitsSSD(TClonesArray *ITSdigits,Int_t mod,Int_t modR } for (Int_t digit=0;digitUncheckedAt(digit); - iz=digs->GetCoord1(); // If iz==0, N side and if iz=1 P side - ix=digs->GetCoord2(); // Strip Numbar + iz=digs->GetCoord1(); // If iz==0, O side and if iz=1 N side + ix=digs->GetCoord2(); // Strip Number is=digs->GetCompressedSignal(); // ADC Signal // cout<<" Module:"<4095) is = 4095; if (fVerbose==2) ftxt<<"DDL:"< 0-767 + AliBitPacking::PackWord(word,baseWord,12,22);//Strip Number + + word = mod%12; // ADC-number (12 ADCs per AD module) + word += ( word<6 ) ? 0 : 2; // ADC range 0-5 and 8-13 + AliBitPacking::PackWord(word,baseWord,24,27);//ADC Channel + + word = mod/12+1; // AD-number (AD module index ranges 1-9) + AliBitPacking::PackWord(word,baseWord,28,31);//AD slot fIndex++; buf[fIndex]=baseWord; }//end for @@ -113,6 +130,50 @@ void AliITSDDLRawData::GetDigitsSSD(TClonesArray *ITSdigits,Int_t mod,Int_t modR //Silicon Drift Detector // +void AliITSDDLRawData::GetDigitsSDDCompressed(TClonesArray *ITSdigits, Int_t mod, UInt_t *buf){ +//This method packs the SDD digits in the compressed format (32 bit per digit) +// see AliITSRawStreamSDDCompressed for details on the dta format + + UInt_t dataWord=0; + Int_t ndigits = ITSdigits->GetEntries(); + AliITSdigit *digs; + if(ndigits){ + for (Int_t digit=0;digitUncheckedAt(digit); + Int_t iz=digs->GetCoord1(); // Anode + Int_t ix=digs->GetCoord2(); // Time + Int_t is=digs->GetCompressedSignal(); // ADC Signal - 8 bit + dataWord=mod<<27; + Int_t sid=0; + if(iz>=256){ + sid=1; + iz-=256; + } + dataWord+=sid<<26; + dataWord+=iz<<18; + dataWord+=ix<<10; + UInt_t adcEncoded=0; + Int_t shift=0; + if(is < 8) shift=2; + else if(is<16) shift=3; + else if(is<32) shift=4; + else if(is<64) shift=5; + else if(is<128) shift=6; + else shift=7; + adcEncoded=shift+((is-(1<GetCoord2(); // Time is=digs->GetCompressedSignal(); // ADC Signal digarr[iz][ix]=is; - if (fVerbose==2) + if (fVerbose==2) ftxt<<"DDL:"<255){Error("GetDigitsSDD", "bits words is needed)!!!");} } for(Int_t anode=0;anode<512;anode++){ - if(flag){ + if(flag){ last = first+diff-1; AliBitPacking::PackWord(word2,baseWord,first,last); flag = kFALSE; first = last+1; diff=0; } - - if(anode == 256){ last = 0; first = 0; flag = kFALSE; diff = 0; word2=0; - } for(Int_t tb=0;tb<256;tb++){ @@ -225,6 +271,7 @@ void AliITSDDLRawData::GetDigitsSDD(TClonesArray *ITSdigits,Int_t mod,Int_t modR if value >=128value = value - (1 << 7) (word is 7 bit long) */ + //if(digarr[anode][tb]<4) continue; // not write <4 cnts above tL if(digarr[anode][tb]<8){ bitinfo1[3] = 2; wordinfo1[2] = 2; @@ -378,104 +425,111 @@ void AliITSDDLRawData::GetDigitsSDD(TClonesArray *ITSdigits,Int_t mod,Int_t modR //PIXEL // -void AliITSDDLRawData::GetDigitsSPD(TClonesArray *ITSdigits,Int_t mod,Int_t ddl, UInt_t *buf){ +void AliITSDDLRawData::GetDigitsSPD(TClonesArray *ITSdigits,Int_t mod,Int_t ddl, UInt_t *buf, AliITSFOSignalsSPD* foSignals){ //This method packs the SPD digits in a proper 32 structure //Since data is zero suppressed,the coordinates for the chip having zero digits //doesn't get listed in the galice.root file. However the SPD format requires //the empty chip to be written with chip header and chip trailer. - //The index of the half stave is calculated as (mod/2). - Int_t ix; - Int_t iz; - Int_t chipNo=0; + + Int_t chipLow = AliITSRawStreamSPD::GetOnlineChipFromOffline(mod,0); + Int_t chipHigh = AliITSRawStreamSPD::GetOnlineChipFromOffline(mod,159); + + if (chipLow>chipHigh) {chipLow -= 4; chipHigh += 4;} + UInt_t eq = AliITSRawStreamSPD::GetOnlineEqIdFromOffline(mod); + UInt_t hs = AliITSRawStreamSPD::GetOnlineHSFromOffline(mod); + + // create int map to later hold all digits sorted + AliITSIntMap* digMap = new AliITSIntMap(); + UInt_t baseWord=0; - UInt_t hitRow=0; - Int_t chipHitCount=0; //Number of Hit in the current chip - Int_t previousChip=-1; //Previuos chip respect to the actual aone + Int_t ndigits = ITSdigits->GetEntries(); //number of digits in the current module //cout<<" Number of digits in the current module:"<UncheckedAt(digit); + if (fVerbose==2) ftxt.open("SPDdigits.txt",ios::app); + for (Int_t digit=0; digitUncheckedAt(digit); /*--------------------------------------------------------------------------- * Each module contains 5 read out chips of 256 rows and 32 columns. - * So, the cell number in Z direction varies from 0 to 159. Therefore, - * to get the chip address (0 to 4), we need to divide column number by 32. + * So, the cell number in Z direction varies from 0 to 159. * ---------------------------------------------------------------------*/ - iz=digs->GetCoord1(); // Cell number in Z direction - ix=digs->GetCoord2(); // Cell number in X direction - chipNo=iz/32; - if(fVerbose==2) - ftxt<<"DDL:"<4) - WriteChipHeader(i+5,(mod/2),baseWord); - else - WriteChipHeader(i,(mod/2),baseWord); - WriteChipTrailer(buf,chipHitCount,baseWord); - chipHitCount=0; - }//end for - WriteChipHeader(chipNo,(mod/2),baseWord); - chipHitCount++; - WriteHit(buf,ix,hitRow,baseWord); - previousChip=chipNo; - }//end if - else{ - if(previousChip!=chipNo){ - WriteChipTrailer(buf,chipHitCount,baseWord); - chipHitCount=0; - for(Int_t i=previousChip+1;i4)end+=5; - WriteChipTrailer(buf,chipHitCount,baseWord); - chipHitCount=0; - for(Int_t i=chipNo+1;i<=end;i++){ - WriteChipHeader(i,(mod/2),baseWord); - WriteChipTrailer(buf,0,baseWord); - chipHitCount=0; - }//end for - }//end if - else{ - //In this module there aren't digits but - //the chip header and chip trailer are store anyway - if(fHalfStaveModule){ - chipNo=5; - fHalfStaveModule=-1; - }//end if - for(Int_t i=0;i<5;i++){ - WriteChipHeader(chipNo+i,(mod/2),baseWord); - WriteChipTrailer(buf,chipHitCount,baseWord); - chipHitCount=0; - }//end for - }//end else + Int_t iz=digs->GetCoord1(); // Cell number in Z direction + Int_t ix=digs->GetCoord2(); // Cell number in X direction + + if(fVerbose==2) ftxt<<"DDL:"<Insert(chip*256*32+(31-col)*256+(255-row),row); + } + } + + // _______________________________________________________________________ + // Procedure for writing raw data (Henrik Tydesjo) + // Reimplemented because of unreadability (5 Mar 2009) + // Now also with fast-or signals + Int_t previousChip = chipLow-1; + Int_t chip = chipLow-1; + UInt_t chipHitCount = 0; + + + UInt_t nrHits = digMap->GetNrEntries(); + for (UInt_t nHit=0; nHitGetKeyIndex(nHit); + chip = key/(256*32); + Int_t col = 31 - (key%(256*32))/256; + Int_t row = digMap->GetValIndex(nHit); + + // add trailer for previous chip (if there was one...) + if (chip>previousChip && previousChip>chipLow-1) { + WriteChipTrailer(buf, chipHitCount, foSignals->GetSignal(eq,hs,previousChip), baseWord); + } + + // add headers/trailers for chips without hits (if any) + for (Int_t ch=previousChip+1; chGetSignal(eq,hs,ch), baseWord); + } + + // if new chip, add header + if (chip>previousChip) { + WriteChipHeader(chip, hs, baseWord); + chipHitCount = 0; + previousChip = chip; + } + + chipHitCount++; + + // add pixel hit + WriteHit(buf,row,col,baseWord); + + } + + // add trailer for last chip (if there was one...) + if (chip>chipLow-1) { + WriteChipTrailer(buf, chipHitCount, foSignals->GetSignal(eq,hs,chip), baseWord); + } + + // add REMAINING headers/trailers for chips without hits (if any) + for (Int_t ch=chip+1; ch<=chipHigh; ch++) { + WriteChipHeader(ch, hs, baseWord); + WriteChipTrailer(buf, 0, foSignals->GetSignal(eq,hs,ch), baseWord); + } + // _______________________________________________________________________ + + + delete digMap; + if(fVerbose==2) ftxt.close(); return; @@ -483,7 +537,7 @@ void AliITSDDLRawData::GetDigitsSPD(TClonesArray *ITSdigits,Int_t mod,Int_t ddl, ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Int_t AliITSDDLRawData::RawDataSPD(TBranch* branch){ +Int_t AliITSDDLRawData::RawDataSPD(TBranch* branch, AliITSFOSignalsSPD* foSignals){ //This method creates the Raw data files for SPD detectors const Int_t kSize=21000; //256*32*5=40960 max number of digits per module UInt_t buf[kSize]; //One buffer cell can contain 2 digits @@ -491,29 +545,25 @@ Int_t AliITSDDLRawData::RawDataSPD(TBranch* branch){ TClonesArray*& digits = * (TClonesArray**) branch->GetAddress(); char fileName[15]; - ofstream outfile; // logical name of the output file - AliRawDataHeader header; + AliFstream* outfile; // logical name of the output file + AliRawDataHeaderSim header; //loop over DDLs - for(Int_t i=0;iTellp(); + outfile->WriteBuffer((char*)(&header),sizeof(header)); //Loops over Modules of a particular DDL for (Int_t mod=0; modClear(); branch->GetEvent(moduleNumber); //For each Module, buf contains the array of data words in Binary format //fIndex gives the number of 32 bits words in the buffer for each module - GetDigitsSPD(digits,mod,i,buf); - outfile.write((char *)buf,((fIndex+1)*sizeof(UInt_t))); + GetDigitsSPD(digits, moduleNumber, ddl, buf, foSignals); + outfile->WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t))); for(Int_t i=0;i<(fIndex+1);i++){ buf[i]=0; }//end for @@ -521,11 +571,11 @@ Int_t AliITSDDLRawData::RawDataSPD(TBranch* branch){ }//end for //Write REAL DATA HEADER - UInt_t currentFilePosition=outfile.tellp(); - outfile.seekp(dataHeaderPosition); + UInt_t currentFilePosition=outfile->Tellp(); + outfile->Seekp(dataHeaderPosition); header.fSize=currentFilePosition-dataHeaderPosition; - outfile.write((char*)(&header),sizeof(header)); - outfile.close(); + outfile->WriteBuffer((char*)(&header),sizeof(header)); + delete outfile; }//end for return 0; @@ -535,27 +585,23 @@ Int_t AliITSDDLRawData::RawDataSPD(TBranch* branch){ Int_t AliITSDDLRawData::RawDataSSD(TBranch* branch){ - //This method creates the Raw data files for SSD detectors + //This method creates the Raw data files for SSD detectors const Int_t kSize=1536;//768*2 Number of stripe * number of sides(N and P) UInt_t buf[kSize]; fIndex=-1; TClonesArray*& digits = * (TClonesArray**) branch->GetAddress(); char fileName[15]; - ofstream outfile; // logical name of the output file - AliRawDataHeader header; + AliFstream* outfile; // logical name of the output file + AliRawDataHeaderSim header; //loop over DDLs for(Int_t i=0;iTellp(); + outfile->WriteBuffer((char*)(&header),sizeof(header)); //Loops over Modules of a particular DDL for (Int_t mod=0; modWriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t))); fIndex=-1; }//end if }//end for //Write REAL DATA HEADER - UInt_t currentFilePosition=outfile.tellp(); - outfile.seekp(dataHeaderPosition); + UInt_t currentFilePosition=outfile->Tellp(); + outfile->Seekp(dataHeaderPosition); header.fSize=currentFilePosition-dataHeaderPosition; header.SetAttribute(0); // valid data - outfile.write((char*)(&header),sizeof(header)); - outfile.close(); + outfile->WriteBuffer((char*)(&header),sizeof(header)); + delete outfile; }//end for return 0; @@ -585,7 +631,7 @@ Int_t AliITSDDLRawData::RawDataSSD(TBranch* branch){ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Int_t AliITSDDLRawData::RawDataSDD(TBranch* branch){ +Int_t AliITSDDLRawData::RawDataSDD(TBranch* branch, AliITSDDLModuleMapSDD* ddlsdd){ //This method creates the Raw data files for SDD detectors const Int_t kSize=131072; //256*512 UInt_t buf[kSize]; @@ -593,30 +639,40 @@ Int_t AliITSDDLRawData::RawDataSDD(TBranch* branch){ TClonesArray*& digits = * (TClonesArray**) branch->GetAddress(); char fileName[15]; - ofstream outfile; // logical name of the output file - AliRawDataHeader header; - UInt_t skippedword = AliBitPacking::PackWord(2,skippedword,0,31); - + AliFstream* outfile; // logical name of the output file + AliRawDataHeaderSim header; + + if(fSDDRawFormat!=0){ + for(Int_t ibit=0; ibit<8; ibit++) header.SetAttribute(ibit); + }else{ + for(Int_t ibit=0; ibit<5; ibit++) header.SetAttribute(ibit); + for(Int_t ibit=5; ibit<8; ibit++) header.ResetAttribute(ibit); + } + UInt_t skippedword, carlosFooterWord,fifoFooterWord,jitterWord; + Bool_t retcode; + retcode = AliBitPacking::PackWord(0x3FFFFFFF,carlosFooterWord,0,31); + retcode = AliBitPacking::PackWord(0x3F1F1F1F,fifoFooterWord,0,31); + if(fSDDRawFormat!=0) retcode = AliBitPacking::PackWord(0x7F000000,jitterWord,0,31); + else retcode = AliBitPacking::PackWord(0x80000000,jitterWord,0,31); + //loop over DDLs for(Int_t i=0;iTellp(); + outfile->WriteBuffer((char*)(&header),sizeof(header)); - //first 8 "dummy" words to be skipped - for(Int_t iw=0;iw<8;iw++){ - outfile.write((char*)&skippedword,sizeof(skippedword)); + + //first 1 "dummy" word to be skipped + if(fSDDRawFormat!=0){ + retcode = AliBitPacking::PackWord(0xFFFFFFFF,skippedword,0,31); + outfile->WriteBuffer((char*)(&skippedword),sizeof(skippedword)); } - + //Loops over Modules of a particular DDL for (Int_t mod=0; modGetModuleNumber(i, mod); if(moduleNumber!=-1){ digits->Clear(); branch->GetEvent(moduleNumber); @@ -624,20 +680,29 @@ Int_t AliITSDDLRawData::RawDataSDD(TBranch* branch){ //For each Module, buf contains the array of data words in Binary format //fIndex gives the number of 32 bits words in the buffer for each module // cout<<"MODULE NUMBER:"<WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t))); + }else{ + GetDigitsSDD(digits,mod,moduleNumber,i,buf); + outfile->WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t))); + for(Int_t iw=0;iw<3;iw++) outfile->WriteBuffer((char*)(&carlosFooterWord),sizeof(carlosFooterWord)); + } fIndex=-1; }//end if }//end for - + // 12 words with FIFO footers (=4 FIFO x 3 3F1F1F1F words per DDL) + if(fSDDRawFormat!=0){ + for(Int_t iw=0;iw<12;iw++) outfile->WriteBuffer((char*)(&fifoFooterWord),sizeof(fifoFooterWord)); + } + outfile->WriteBuffer((char*)(&jitterWord),sizeof(jitterWord)); //Write REAL DATA HEADER - UInt_t currentFilePosition=outfile.tellp(); - outfile.seekp(dataHeaderPosition); + UInt_t currentFilePosition=outfile->Tellp(); + outfile->Seekp(dataHeaderPosition); header.fSize=currentFilePosition-dataHeaderPosition; header.SetAttribute(0); // valid data - outfile.write((char*)(&header),sizeof(header)); - - outfile.close(); + outfile->WriteBuffer((char*)(&header),sizeof(header)); + delete outfile; }//end for return 0; @@ -659,13 +724,15 @@ void AliITSDDLRawData::WriteChipHeader(Int_t ChipAddr,Int_t halfStave,UInt_t &Ba ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AliITSDDLRawData::WriteChipTrailer(UInt_t *buf,Int_t ChipHitCount,UInt_t &BaseWord){ +void AliITSDDLRawData::WriteChipTrailer(UInt_t *buf, Int_t ChipHitCount, Bool_t foBit, UInt_t &BaseWord){ //This method writes a chip trailer //pixel fill word if((ChipHitCount%2)!=0){ AliBitPacking::PackWord(0xC000,BaseWord,16,31); } - AliBitPacking::PackWord(ChipHitCount,BaseWord,0,13); + AliBitPacking::PackWord(ChipHitCount,BaseWord,0,11); + AliBitPacking::PackWord(0x0,BaseWord,12,12); + AliBitPacking::PackWord(foBit,BaseWord,13,13); AliBitPacking::PackWord(0x0,BaseWord,14,15); fIndex++; buf[fIndex]=BaseWord;