// $Id$ /** * @file compareDigitReaders.C * @brief Compare the TPCDigitReaderPacked and TPCDigitReaderDecoder * * Usage: *
 *   aliroot -b -q 'compareDigitReaders.C("raw.root")' | tee compareDigitReaders.log
 * 
* * Test macro for comparison of the AliHLTTPCDigitReaderPacked and *Decoder. * The AliHLTTPCDigitReaderPacked is based on the AliTPCRawStream * (AliAltroRawStream). The AliHLTTPCDigitReaderDecoder is based on the * fast AliDecoder. The macro loops over all events of the specified data * file, instantiates the two readers and compares signal by signal the * output of both. * * @ingroup alihlt_tpc * @author Matthias.Richter@ift.uib.no */ #ifndef __CINT__ const int sizeofAliRawDataHeader=sizeof(AliRawDataHeader); #else // cint does not handle sizeof correctly const int sizeofAliRawDataHeader=32; #endif bool bVerbose=false; int CompareReaders(AliRawReader* pRawReader); int compareDigitReaders(const char* input, int iMinEvent=-1, int iMaxEvent=-1) { int iResult=0; ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // // some defaults ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // // setup of the RawReader if (!input) { cerr << "invalid path" << endl; cerr << "usage: aliroot -b -q 'compareDigitReaders.C(\"raw.root\")'" << endl; return; } AliRawReader* pRawReader=AliRawReader::Create(input); if (!pRawReader) { cout << "can not open RawReader for file " << input << endl; return; } if (!pRawReader->NextEvent()) { cerr << "no events available" << endl; return; } ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // // setup of the HLT system AliHLTSystem* pHLT=AliHLTPluginBase::GetInstance(); if (!pHLT) { cerr << "fatal error: can not get HLT instance" << endl; } pHLT->LoadComponentLibraries("libAliHLTTPC.so"); ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // // the reconstruction loop Int_t event=0; UChar_t* pData=NULL; pRawReader->RewindEvents(); while (pRawReader->NextEvent() && iResult>=0 && (iMaxEvent<0 || event<=iMaxEvent)) { if (event>=iMinEvent) { cout << "=======================================================" << endl; cout << "event " << event << endl; pRawReader->Reset(); int verifiedDDLs=0; while (pRawReader->ReadHeader() && iResult>=0) { if ((iResult=CompareReaders(pRawReader))==0) { verifiedDDLs++; } } if (iResult>=0) { cout << "event " << event << ": " << verifiedDDLs << " DDL(s) verified" <GetEquipmentId(); int dataSize=pRawReader->GetDataSize(); if (dataSize<=0 || ddlid<768 || ddlid>983) return 1; const AliRawDataHeader* pHeader=pRawReader->GetDataHeader(); if (pHeader==NULL) { cerr << "warning: can not get data header from RawReader, skipping data block ..." << endl; return 1; } TArrayC buffer(dataSize+sizeofAliRawDataHeader); UChar_t* pTgt=buffer.GetArray(); memcpy(pTgt, pHeader, sizeofAliRawDataHeader); pTgt+=sizeofAliRawDataHeader; if (!pRawReader->ReadNext(pTgt, dataSize)) { cerr << "error: reading " << dataSize << " byte(s) from ReadNextData (ddl " << ddlid << ")" << endl; return -1; } int part=0; if (ddlid<840) { part=ddlid%2; } else { part=(ddlid%4)+2; } if (bVerbose) cout << "data: " << dataSize << " byte(s) on ddl " << ddlid << endl; AliHLTTPCDigitReader* pPacked=new AliHLTTPCDigitReaderPacked; AliHLTTPCDigitReader* pDecoder=new AliHLTTPCDigitReaderDecoder; pPacked->SetUnsorted(true); pTgt=buffer.GetArray(); if ((iResult=pPacked->InitBlock(pTgt, buffer.GetSize(), part, 0))<0) { cerr << "error setting up DigitReaderPacked" << endl; delete pPacked; return iResult; } pDecoder->SetUnsorted(true); if ((iResult=pDecoder->InitBlock(pTgt, buffer.GetSize(), part, 0))<0) { cerr << "error setting up DigitReaderDecoder" << endl; delete pPacked; delete pDecoder; return iResult; } int iPrintedPart=-1; int iPrintedRow=-1; int iPrintedPad=-1; int iLastTime=-1; while (pPacked->Next()) { if (!pDecoder->Next()) { cerr << endl << "error: no more data on DigitReaderDecoder" << endl; return -1; } if (pPacked->GetAltroBlockHWaddr()!=pDecoder->GetAltroBlockHWaddr()) { cerr << endl << "error: hw address mismatch Packed " << pPacked->GetAltroBlockHWaddr() << " Decoder " << pDecoder->GetAltroBlockHWaddr() << endl; return -1; } if (pPacked->GetRow()!=pDecoder->GetRow()) { //cerr << endl << "warning: row mismatch Packed " << pPacked->GetRow() << " Decoder " << pDecoder->GetRow() << endl; //return -1; } if (pPacked->GetPad()!=pDecoder->GetPad()) { cerr << endl << "error: row mismatch Packed " << pPacked->GetPad() << " Decoder " << pDecoder->GetPad() << endl; return -1; } if (pPacked->GetTime()!=pDecoder->GetTime()) { cerr << endl << "error: row mismatch Packed " << pPacked->GetTime() << " Decoder " << pDecoder->GetTime() << endl; return -1; } if (bVerbose) { if ((iLastTime!=-1 && iLastTime!=pPacked->GetTime()+1 && iLastTime!=pPacked->GetTime()-1)) { cout << " -> Time: " << iLastTime << endl; } else if ((iPrintedPad!=-1 && iPrintedPad!=pPacked->GetPad()) || (iPrintedRow!=-1 && iPrintedRow!=pPacked->GetRow())) { cout << endl; } if (iPrintedPart!=part) { iPrintedPart=part; cout << "====================================================================" << endl; cout << " Partition: " << iPrintedPart << endl; iPrintedRow=-1; } if (iPrintedRow!=pPacked->GetRow()) { iPrintedRow=pPacked->GetRow(); cout << "--------------------------------------------------------------------" << endl; cout << "Row: " << iPrintedRow << endl; iPrintedPad=-1; } if (iPrintedPad!=pPacked->GetPad()) { iPrintedPad=pPacked->GetPad(); cout << "Row: " << iPrintedRow << " Pad: " << iPrintedPad << " HW address: " << pPacked->GetAltroBlockHWaddr() << endl; iLastTime=-1; } if (iLastTime!=pPacked->GetTime()+1 && iLastTime!=pPacked->GetTime()-1 ) { cout << " Time " << pPacked->GetTime() << ": "; } iLastTime=pPacked->GetTime(); cout << " " << pPacked->GetSignal(); } } if (bVerbose) cout << endl << endl; if (pDecoder->Next()) { cerr << endl << "error: additional data on DigitReaderDecoder" << endl; return -1; } delete pDecoder; delete pPacked; return iResult; } int compareDigitReaders() { cerr << "===============================================================" << endl; cerr << "usage: aliroot -b -q 'compareDigitReaders.C(\"raw.root\")'" << endl << endl; cerr << "please provide input, and optional min and max event" << endl; cerr << "===============================================================" << endl; }