ROOT logo
// $Id$
/**
 * @file compareDigitReaders.C
 * @brief Compare the TPCDigitReaderPacked and TPCDigitReaderDecoder
 *
 * Usage:
 * <pre>
 *   aliroot -b -q 'compareDigitReaders.C("raw.root")' | tee compareDigitReaders.log
 * </pre>
 *
 * 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" <<endl;
	cout << "-------------------------------------------------------" << endl;
      }
    }
    event++;
  }

  return iResult;
}

int CompareReaders(AliRawReader* pRawReader)
{
  int iResult=0;

  int ddlid=pRawReader->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;
}
 compareDigitReaders.C:1
 compareDigitReaders.C:2
 compareDigitReaders.C:3
 compareDigitReaders.C:4
 compareDigitReaders.C:5
 compareDigitReaders.C:6
 compareDigitReaders.C:7
 compareDigitReaders.C:8
 compareDigitReaders.C:9
 compareDigitReaders.C:10
 compareDigitReaders.C:11
 compareDigitReaders.C:12
 compareDigitReaders.C:13
 compareDigitReaders.C:14
 compareDigitReaders.C:15
 compareDigitReaders.C:16
 compareDigitReaders.C:17
 compareDigitReaders.C:18
 compareDigitReaders.C:19
 compareDigitReaders.C:20
 compareDigitReaders.C:21
 compareDigitReaders.C:22
 compareDigitReaders.C:23
 compareDigitReaders.C:24
 compareDigitReaders.C:25
 compareDigitReaders.C:26
 compareDigitReaders.C:27
 compareDigitReaders.C:28
 compareDigitReaders.C:29
 compareDigitReaders.C:30
 compareDigitReaders.C:31
 compareDigitReaders.C:32
 compareDigitReaders.C:33
 compareDigitReaders.C:34
 compareDigitReaders.C:35
 compareDigitReaders.C:36
 compareDigitReaders.C:37
 compareDigitReaders.C:38
 compareDigitReaders.C:39
 compareDigitReaders.C:40
 compareDigitReaders.C:41
 compareDigitReaders.C:42
 compareDigitReaders.C:43
 compareDigitReaders.C:44
 compareDigitReaders.C:45
 compareDigitReaders.C:46
 compareDigitReaders.C:47
 compareDigitReaders.C:48
 compareDigitReaders.C:49
 compareDigitReaders.C:50
 compareDigitReaders.C:51
 compareDigitReaders.C:52
 compareDigitReaders.C:53
 compareDigitReaders.C:54
 compareDigitReaders.C:55
 compareDigitReaders.C:56
 compareDigitReaders.C:57
 compareDigitReaders.C:58
 compareDigitReaders.C:59
 compareDigitReaders.C:60
 compareDigitReaders.C:61
 compareDigitReaders.C:62
 compareDigitReaders.C:63
 compareDigitReaders.C:64
 compareDigitReaders.C:65
 compareDigitReaders.C:66
 compareDigitReaders.C:67
 compareDigitReaders.C:68
 compareDigitReaders.C:69
 compareDigitReaders.C:70
 compareDigitReaders.C:71
 compareDigitReaders.C:72
 compareDigitReaders.C:73
 compareDigitReaders.C:74
 compareDigitReaders.C:75
 compareDigitReaders.C:76
 compareDigitReaders.C:77
 compareDigitReaders.C:78
 compareDigitReaders.C:79
 compareDigitReaders.C:80
 compareDigitReaders.C:81
 compareDigitReaders.C:82
 compareDigitReaders.C:83
 compareDigitReaders.C:84
 compareDigitReaders.C:85
 compareDigitReaders.C:86
 compareDigitReaders.C:87
 compareDigitReaders.C:88
 compareDigitReaders.C:89
 compareDigitReaders.C:90
 compareDigitReaders.C:91
 compareDigitReaders.C:92
 compareDigitReaders.C:93
 compareDigitReaders.C:94
 compareDigitReaders.C:95
 compareDigitReaders.C:96
 compareDigitReaders.C:97
 compareDigitReaders.C:98
 compareDigitReaders.C:99
 compareDigitReaders.C:100
 compareDigitReaders.C:101
 compareDigitReaders.C:102
 compareDigitReaders.C:103
 compareDigitReaders.C:104
 compareDigitReaders.C:105
 compareDigitReaders.C:106
 compareDigitReaders.C:107
 compareDigitReaders.C:108
 compareDigitReaders.C:109
 compareDigitReaders.C:110
 compareDigitReaders.C:111
 compareDigitReaders.C:112
 compareDigitReaders.C:113
 compareDigitReaders.C:114
 compareDigitReaders.C:115
 compareDigitReaders.C:116
 compareDigitReaders.C:117
 compareDigitReaders.C:118
 compareDigitReaders.C:119
 compareDigitReaders.C:120
 compareDigitReaders.C:121
 compareDigitReaders.C:122
 compareDigitReaders.C:123
 compareDigitReaders.C:124
 compareDigitReaders.C:125
 compareDigitReaders.C:126
 compareDigitReaders.C:127
 compareDigitReaders.C:128
 compareDigitReaders.C:129
 compareDigitReaders.C:130
 compareDigitReaders.C:131
 compareDigitReaders.C:132
 compareDigitReaders.C:133
 compareDigitReaders.C:134
 compareDigitReaders.C:135
 compareDigitReaders.C:136
 compareDigitReaders.C:137
 compareDigitReaders.C:138
 compareDigitReaders.C:139
 compareDigitReaders.C:140
 compareDigitReaders.C:141
 compareDigitReaders.C:142
 compareDigitReaders.C:143
 compareDigitReaders.C:144
 compareDigitReaders.C:145
 compareDigitReaders.C:146
 compareDigitReaders.C:147
 compareDigitReaders.C:148
 compareDigitReaders.C:149
 compareDigitReaders.C:150
 compareDigitReaders.C:151
 compareDigitReaders.C:152
 compareDigitReaders.C:153
 compareDigitReaders.C:154
 compareDigitReaders.C:155
 compareDigitReaders.C:156
 compareDigitReaders.C:157
 compareDigitReaders.C:158
 compareDigitReaders.C:159
 compareDigitReaders.C:160
 compareDigitReaders.C:161
 compareDigitReaders.C:162
 compareDigitReaders.C:163
 compareDigitReaders.C:164
 compareDigitReaders.C:165
 compareDigitReaders.C:166
 compareDigitReaders.C:167
 compareDigitReaders.C:168
 compareDigitReaders.C:169
 compareDigitReaders.C:170
 compareDigitReaders.C:171
 compareDigitReaders.C:172
 compareDigitReaders.C:173
 compareDigitReaders.C:174
 compareDigitReaders.C:175
 compareDigitReaders.C:176
 compareDigitReaders.C:177
 compareDigitReaders.C:178
 compareDigitReaders.C:179
 compareDigitReaders.C:180
 compareDigitReaders.C:181
 compareDigitReaders.C:182
 compareDigitReaders.C:183
 compareDigitReaders.C:184
 compareDigitReaders.C:185
 compareDigitReaders.C:186
 compareDigitReaders.C:187
 compareDigitReaders.C:188
 compareDigitReaders.C:189
 compareDigitReaders.C:190
 compareDigitReaders.C:191
 compareDigitReaders.C:192
 compareDigitReaders.C:193
 compareDigitReaders.C:194
 compareDigitReaders.C:195
 compareDigitReaders.C:196
 compareDigitReaders.C:197
 compareDigitReaders.C:198
 compareDigitReaders.C:199
 compareDigitReaders.C:200
 compareDigitReaders.C:201
 compareDigitReaders.C:202
 compareDigitReaders.C:203
 compareDigitReaders.C:204
 compareDigitReaders.C:205
 compareDigitReaders.C:206
 compareDigitReaders.C:207
 compareDigitReaders.C:208
 compareDigitReaders.C:209
 compareDigitReaders.C:210
 compareDigitReaders.C:211
 compareDigitReaders.C:212
 compareDigitReaders.C:213
 compareDigitReaders.C:214
 compareDigitReaders.C:215
 compareDigitReaders.C:216
 compareDigitReaders.C:217
 compareDigitReaders.C:218
 compareDigitReaders.C:219
 compareDigitReaders.C:220
 compareDigitReaders.C:221
 compareDigitReaders.C:222
 compareDigitReaders.C:223
 compareDigitReaders.C:224
 compareDigitReaders.C:225
 compareDigitReaders.C:226
 compareDigitReaders.C:227
 compareDigitReaders.C:228
 compareDigitReaders.C:229
 compareDigitReaders.C:230
 compareDigitReaders.C:231
 compareDigitReaders.C:232
 compareDigitReaders.C:233
 compareDigitReaders.C:234