ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id:  */

//____________________________________________________________________
//                                                                          
// T0 
// Class for reading T0 RAW data in TOF data format
//
#include "AliT0RawReader.h"
#include "AliT0Parameters.h"
#include "AliBitPacking.h"
#include "TBits.h"

#include <Riostream.h>
#include "TMath.h"
#include "TH1F.h"
#include "TArrayI.h"
#include "AliLog.h"
 
using std::cout;
using std::endl;
using std::ios_base;
ClassImp(AliT0RawReader)
  
  AliT0RawReader::AliT0RawReader (AliRawReader *rawReader, Bool_t isOnline)
    :  TTask("T0RawReader","read raw T0 data"),
       fRawReader(rawReader),
       fData(NULL),
       fPosition(0),
       fParam(NULL),
       fIsOnline(isOnline),
       fBunchID(0),
       fPrintout(kFALSE)

{
  //
// create an object to read T0raw digits
  AliDebug(1,"Start ");
 
  fRawReader->Reset();
  fRawReader->Select("T0");
  fParam = AliT0Parameters::Instance();  
  if (fIsOnline)
    fParam->InitIfOnline();
  else 
    fParam->Init();
 
}
 AliT0RawReader::~AliT0RawReader ()
{
  // 
}
/*
AliT0RawReader::AliT0RawReader(const AliT0RawReader& o): TTask(o),
     fRawReader(rawReader),
       fData(NULL),
       fPosition(0)
{
  //
}
*/


Bool_t  AliT0RawReader::Next()
{
// read the next raw digit
// returns kFALSE if there is no digit left
//"LookUpTable":
// Amplitude LED TRM=0; chain=0; TDC 0 -5        channel 0,2,4,6
// Time CFD      TRM=0; chain=0; TDC 6 - 11      channel 0,2,4,6
// mean time     TRM=0; chain=0; TDC 12          channel 0
// T0A           TRM=0; chain=0; TDC 12          channel 2
// T0C           TRM=0; chain=0; TDC 12          channel 4
// vertex        TRM=0; chain=0; TDC 12          channel 6
// mult QTC0        TRM=0; chain=0; TDC 13          channel 0
// mult QTC1        TRM=0; chain=0; TDC 13          channel 2

// Charge QTC0   TRM=1; chain=0; TDC 0 -5        channel 0,2,4,6
// Charge QTC1   TRM=1; chain=0; TDC 6 - 11      channel 0,2,4,6
// T0A trigger          TRM=1; chain=0; TDC 12          channel 0
// T0C trigger          TRM=1; chain=0; TDC 12          channel 2
// vertex trigger       TRM=1; chain=0; TDC 12          channel 4
// trigger central      TRM=1; chain=0; TDC 13          channel 0
// tigger semicenral    TRM=1; chain=0; TDC 13          channel 2
//
// allData array collect data from all channels in one :
// allData[0] - allData[23] 24 CFD channels
// allData[24] -   allData[47] 24 LED channels
//  allData[48]  mean (T0) signal  
// allData[49]   time difference (vertex)

  UInt_t word;
  Int_t time=0,  itdc=0, ichannel=0, uu; 
  Int_t numberOfWordsInTRM=0, iTRM=0;
  Int_t tdcTime, koef,hit=0;
  Int_t koefhits[220];
  Int_t trm_chain_header =  0x00000000;
  Int_t  trm_chain_trailer =  0x10000000;
  
  UInt_t  filler =  0x70000000;
  Bool_t correct=kTRUE;
  Int_t header;
  Int_t fNTRM = fParam->GetNumberOfTRMs();
  if (fPrintout) cout<<" Number of TRMs "<<fNTRM<<endl;
  for ( Int_t k=0; k<220; k++) {
    koefhits[k]=0;
    for ( Int_t jj=0; jj<5; jj++) {
      fAllData[k][jj]=0;
    }
  }
  do {
    if (!fRawReader->ReadNextData(fData)) return kFALSE;
  } while (fRawReader->GetDataSize() == 0);
  
  fPosition = 0;
  if(fPrintout) cout.setf( ios_base::hex, ios_base::basefield );
  if(fPrintout)
    cout<<" CDH :: BC ID "<< (fRawReader->GetBCID())<<
      " Event size"<<fRawReader->GetDataSize()<<
      " orbit ID "<<fRawReader->GetOrbitID()<< 
      " event index "<<fRawReader->GetEventIndex()<<
      " event type " <<fRawReader->GetType()<<endl;
  //DRM header
    for (Int_t i=0; i<6; i++) {
      word = GetNextWord();
      if(fPrintout && i==0) cout<<" DRM header:: event words "<<AliBitPacking::UnpackWord(word,4, 20);
      //  cout<<i<<" DRM header "<<word<<endl;
      if (fPrintout && i==4 ) cout<<" L0BC ID "<< AliBitPacking::UnpackWord(word,4, 15)<<endl;
      header = AliBitPacking::UnpackWord(word,28,31);
      if( header !=4 ) 
	{
	  AliWarning(Form(" !!!! wrong  DRM header  %x!!!!", word));
	  fRawReader->AddFatalErrorLog(kWrongDRMHeader,Form("w=%x",word));
	  break;
	}
    }
    for (Int_t ntrm=0; ntrm< fNTRM; ntrm++)
      {
	//TRMheader  
	word = GetNextWord();
	if (word == filler )  word = GetNextWord(); 
	//	cout<<" TRM "<<word<<endl;
	header = AliBitPacking::UnpackWord(word,28,31);
	if ( header != 4 )
	  {
	    AliWarning(Form(" !!!! wrong TRM header  %x!!!!", word));
	    fRawReader->AddMajorErrorLog(kWrongTRMHeader,Form("w=%x",word));
	    break;
	  }
	numberOfWordsInTRM=AliBitPacking::UnpackWord(word,4,16);
	if(fPrintout) {
	  cout<<" TRM header :: event words "<<numberOfWordsInTRM;
	  cout<<" ACQ bits "<<AliBitPacking::UnpackWord(word,17,18);
	  cout<<" L bit "<<AliBitPacking::UnpackWord(word,19,19)<<endl;
	}
	iTRM=AliBitPacking::UnpackWord(word,0,3);
	for( Int_t ichain=0; ichain<2; ichain++)
	  {
	    //chain header
	    word = GetNextWord();
	    // cout<<" chain header "<<word<<endl;
	    uu = word & trm_chain_header;
	    if(uu != trm_chain_header) 
	      {
		AliWarning(Form(" !!!! wrong CHAIN  0  header %x!!!!", word));
		fRawReader->AddMajorErrorLog(kWrongChain0Header,Form("w=%x",word));
		break;
	      }
	    fBunchID=AliBitPacking::UnpackWord(word,4,15);
	    if(fPrintout)
	      cout<<" chain "<< ichain<<" header:: BunchID  "<<fBunchID;
	    word = GetNextWord();
	    //   cout<<" next word "<<word<<endl;
	    tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
	    //	    for (; tdcTime==1; tdcTime) 
	    while(tdcTime==1)
	      {
		correct = kTRUE;
		itdc=AliBitPacking::UnpackWord(word,24,27);
		ichannel=AliBitPacking::UnpackWord(word,21,23);
		time=AliBitPacking::UnpackWord(word,0,20);
		
		koef = fParam->GetChannel(iTRM,itdc,ichain,ichannel);
		if (koef != 0 && fPrintout) 
		  	  cout<<"RawReader>> "<<"koef "<<koef<<" trm "<<iTRM<<
		  		    " tdc "<<itdc<<" chain "<<ichain<<
		  		    " channel "<<ichannel<<" time "<<time<<endl;
		if (koef ==-1 ){
		  //	  AliWarning(Form("Incorrect lookup table ! "));
		  fRawReader->AddMajorErrorLog(kIncorrectLUT);
		  correct=kFALSE;
		}
		if(correct){
		  hit=koefhits[koef];
		  if(hit>4) {  
		    AliDebug(10,Form("Too many hits for %i channel - %i ! ",koef,koefhits[koef] )); 
		    hit=4;
		  }
		  fAllData[koef][hit]=time; 
		  koefhits[koef]++;
		}
		word = GetNextWord();

		tdcTime =  AliBitPacking::UnpackWord(word,31,31);   
		
	      }
	    
	    //   cout<<" trailer :: "<<word<<endl;
	    uu = word&trm_chain_trailer;
	    if(uu != trm_chain_trailer )
	      {
		AliWarning(Form(" !!!! wrong CHAIN 0 trailer %x !!!!", word));
		fRawReader->AddMajorErrorLog(kWrongChain0Trailer,Form("w=%x",word));
		break;
	      }
	    if(fPrintout)
	      cout<<" trailer:: event counter "<< AliBitPacking::UnpackWord(word,16,27)<<endl;
	  }
            
	word = GetNextWord(); //TRM trailer
	//	cout<<" TRM trailer "<<word<<endl;
	header = AliBitPacking::UnpackWord(word,28,31);
	if( header !=5 )
	  {
	    AliWarning(Form(" !!!! wrong TRM GLOBAL trailer  %x!!!!", word));
	    fRawReader->AddMajorErrorLog(kWrongTRMTrailer,Form("w=%x",word));
	    break;
	  }
	if(fPrintout)
	  cout<<"  TRM trailer :: event counter "<< AliBitPacking::UnpackWord(word,16,27)<<endl;
      } //TRM loop

	word = GetNextWord(); //
	//  cout<<" after TRM trailer "<<word<<endl;
	if (word == filler )  word = GetNextWord(); 
    
    header = AliBitPacking::UnpackWord(word,28,31);
     if( header !=5 )
       {
	 AliWarning(Form(" !!!! wrong DRM GLOBAL trailer  %x!!!!", word));
	 fRawReader->AddFatalErrorLog(kWrongDRMTrailer,Form("w=%x",word));
      }
     if(fPrintout)
       cout<<" DRM trailer ::event counter "<< AliBitPacking::UnpackWord(word,4,15)<<endl;
     cout.setf( ios_base::dec, ios_base::basefield );
    
     return kTRUE;
}
//_____________________________________________________________________________
Int_t AliT0RawReader::GetPosition()
{
  // Sets the position in the
  // input stream
  if (((fRawReader->GetDataSize() * 8) % 32) != 0)
    AliFatal(Form("Incorrect raw data size ! %d words are found !",fRawReader->GetDataSize()));
  return (fRawReader->GetDataSize() * 8) / 32;
}
//_____________________________________________________________________________
UInt_t AliT0RawReader::GetNextWord()
{
  // Read the next 32 bit word in backward direction
  // The input stream access is given by fData and fPosition


  //   fPosition--;
  Int_t iBit = fPosition * 32;
  Int_t iByte = iBit / 8;

  UInt_t word = 0;
  word  = fData[iByte+3]<<24;
  word |= fData[iByte+2]<<16;
  word |= fData[iByte+1]<<8;
  word |= fData[iByte];
   fPosition++;

  return word;

}

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