ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)

// Root include files
#include "TClonesArray.h"

// AliRoot include files
#include "AliDAQ.h"
#include "AliHitMap.h"

#include "AliRawReader.h"
#include "AliRawReaderFile.h"

#include "AliTOFrawData.h"
#include "AliTOFRawMap.h"
#include "AliTOFRawStream.h"

#endif

extern gBenchmark;

void AliTOFReadRawData(const char *input, const Int_t evIn, const Char_t *outFile, Int_t runNumber=137366,Int_t decoderVersion=2);

void AliTOFReadRawData(const char *input, const Int_t evIn, const Char_t *outFile, Int_t runNumber, Int_t decoderVersion)
{

  //
  // To read TOF raw data
  //

  AliCDBManager *cdb = AliCDBManager::Instance();
  cdb->SetDefaultStorage("raw://");
  cdb->SetRun(runNumber);

  AliGeomManager::LoadGeometry();
  AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF HMPID PHOS EMCAL T0 VZERO FMD PMD MUON ZDC");

  AliTOFcalib *fTOFcalib = new AliTOFcalib();
  fTOFcalib->Init();

  Int_t Volume[5];
  AliTOFHitData *HitData;
  AliTOFHitDataBuffer *DataBuffer;
  AliTOFHitDataBuffer *PackedDataBuffer;

  /* create a tree for decoded data */
  TTree DataTree("DataTree", "Decoded Data");
  DataTree.Branch("HitData", "AliTOFHitData", &HitData);

  /* create a tree for decoded packed data */
  TTree PackedDataTree("PackedDataTree", "Decoded Packed Data");
  PackedDataTree.Branch("HitData", "AliTOFHitData", &HitData);

  AliRawReader *reader;  
  TString fileName(input);
  if (fileName.EndsWith("/")) {
    reader = new AliRawReaderFile(fileName);
  } else if (fileName.EndsWith(".root")) {
    reader = new AliRawReaderRoot(fileName);
  } else if (!fileName.IsNull()) {
    reader = new AliRawReaderDate(fileName);
    reader->SelectEvents(7);
  }

  TClonesArray *clonesRawData = new TClonesArray("AliTOFrawData",1000);
  AliTOFRawStream stream;

  gBenchmark->Reset();

  Int_t countNoise = 0;

  /* loop over events */
  for (Int_t iEvent = 0; reader->NextEvent(); iEvent++) {
    if (iEvent!=evIn) continue;
      printf("processing event %d\n", iEvent);

    stream.Clear();
    stream.SetRawReader(reader);

    //reader->RewindEvents();

    UInt_t timeStamp = reader->GetTimestamp();

    gBenchmark->Start("time");

    /* loop over DDLs */
    for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){

      reader->Reset();

      /* reset buffers (actually not needed)*/
      stream.ResetBuffers();
    
      switch(decoderVersion) {
      case 1:
	stream.LoadRawDataBuffers(iDDL,0);
	break;
      case 2:
	stream.LoadRawDataBuffersV2(iDDL,0);
	break;
      case 0:
	stream.LoadRawData(iDDL);
	break;
      }

      clonesRawData = (TClonesArray*)stream.GetRawData();
      for (Int_t iRawData = 0; iRawData<clonesRawData->GetEntriesFast(); iRawData++) {

	AliTOFrawData *tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData);

	if (tofRawDatum->GetTOF()==-1) continue;
	Int_t detectorIndex[5]={-1,-1,-1,-1,-1};
	stream.EquipmentId2VolumeId(iDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(),
				    tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex);
	Int_t dummy = detectorIndex[3];
	detectorIndex[3] = detectorIndex[4];
	detectorIndex[4] = dummy;

	/* check valid index */
	if (detectorIndex[0]==-1||detectorIndex[1]==-1||detectorIndex[2]==-1||detectorIndex[3]==-1||detectorIndex[4]==-1) continue;

	// Do not reconstruct anything in the holes
	if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes
	  if (detectorIndex[1]==2) { // plate with holes
	    inholes++;
	    continue;
	  }
	}


	Int_t index = AliTOFGeometry::GetIndex(detectorIndex);

	/* check channel enabled */
	//if (!fTOFcalib->IsChannelEnabled(index)) continue; // bad channels

	/* get cluster info */
	Float_t tot = tofRawDatum->GetTOT() * AliTOFGeometry::ToTBinWidth() * 1.e-3; /* ns */
	Float_t timeRaw = tofRawDatum->GetTOF() * AliTOFGeometry::TdcBinWidth(); /* ps */
	Float_t time = tofRawDatum->GetTOF() * AliTOFGeometry::TdcBinWidth(); /* ps */
	Float_t deltaBC = tofRawDatum->GetDeltaBC(); // deltaBC
	Float_t l0l1 = tofRawDatum->GetL0L1Latency(); // L0-L1 latency
	Float_t xHit, yHit, zHit;
	Int_t sector, strip, padx, padz;
	ofstream ftxt;

	/* get correction */
	Float_t corr = fTOFcalib->GetTimeCorrection(index, tot, deltaBC, l0l1, timeStamp); /* ps */

	/* apply time correction */
	time -= corr;
	
	//if (iEvent==12)
#if 0	
	cout << " " << index
	     << " " << fTOFcalib->IsChannelEnabled(index)
	     << " " << tot
	     << " " << timeRaw
	     << " " << time
	     << endl;
#endif
	
	/* geometry */
	AliTOFGeometry geo;
	for (Int_t j=0; j<5; j++) detectorIndex[j] = -1;
	geo.GetVolumeIndices(index, detectorIndex);
	xHit  = geo.GetX(detectorIndex);
	yHit  = geo.GetY(detectorIndex);
	zHit  = geo.GetZ(detectorIndex);
	
	//if (fTOFcalib->IsChannelEnabled(index) == 1) {
	  sector = detectorIndex[0];
	  strip  = detectorIndex[2];
	  padx   = detectorIndex[4];
	  padz   = detectorIndex[3];
	  
	  //printf("x %f, y %f, z %f\n",xHit,yHit,zHit);
	  //printf("sector %d, strip %d, padx %d, padz %d\n",sector,strip,padx,padz);
#if 1  
	  ftxt.open(outFile,ios::app); 
	  ftxt << time << " " << timeRaw << " " << tot << " " << sector 
	       << " " << strip << " " << padx << " " << padz 
	       << " " << xHit << " " << yHit << " " << zHit << endl;
	  ftxt.close();  
#endif
	  //}
	  //else countNoise++;

      } // closed loop on TOF raw data per current DDL file
     
      clonesRawData->Clear();




      /*
      // read decoded data
      DataBuffer = stream.GetDataBuffer(iDDL);
      PackedDataBuffer = stream.GetPackedDataBuffer(iDDL);
      
      // get buffer entries
      Int_t nDBEntries = DataBuffer->GetEntries();
      Int_t nPDBEntries = PackedDataBuffer->GetEntries();

      // read data buffer hits
      for (Int_t iHit = 0; iHit < nDBEntries; iHit++){
      	HitData = DataBuffer->GetHit(iHit);
	HitData->SetDDLID(iDDL);
	// add volume information to hit
	stream.EquipmentId2VolumeId(HitData, HitData->GetVolume());
	DataTree.Fill();
      }
      // reset buffer
      DataBuffer->Reset();
      
      // read data buffer hits
      for (Int_t iHit = 0; iHit < nPDBEntries; iHit++){
      	HitData = PackedDataBuffer->GetHit(iHit);
	HitData->SetDDLID(iDDL);
	// add volume information to hit
	stream.EquipmentId2VolumeId(HitData, HitData->GetVolume());
	PackedDataTree.Fill();
      }

      // reset buffer
      PackedDataBuffer->Reset();
      */

    } // loop on DDLs
    
  }
  printf("noise %d\n",countNoise);
  gBenchmark->Print("time");

  /*
  TFile fileOut("TOF_rawQA.root", "RECREATE");
  DataTree.Write();
  PackedDataTree.Write();
  fileOut.Close();
  */

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