#include "AliSTARTRawReader.h"
#include "AliSTARTRawData.h"
-#include "AliRawReaderFile.h"
-
+#include "AliSTARTdigit.h"
+#include "AliBitPacking.h"
+#include "TBits.h"
#include <Riostream.h>
#include "TMath.h"
#include "AliLog.h"
ClassImp(AliSTARTRawReader)
-
- AliSTARTRawReader::AliSTARTRawReader (): TTask("STARTRawReader","read raw data"),
- fPMTId(-1),
- fTimeTDC1(0),
- fChargeADC1(0),
- fTimeTDC2(0),
- fChargeADC2(0)
+
+ AliSTARTRawReader::AliSTARTRawReader (AliRawReader *rawReader, TTree* tree)
+ : TTask("STARTRawReader","read raw START data"),
+ fDigits(NULL),
+ fTree(tree),
+ fRawReader(rawReader)
{
//
// create an object to read STARTraw digits
AliDebug(1,"Start ");
- fTimeTDC1 = new TArrayI(24);
- fChargeADC1 = new TArrayI(24);
- fTimeTDC2 = new TArrayI(24);
- fChargeADC2 = new TArrayI(24);
+ if (fDigits == 0x0) fDigits = new AliSTARTdigit();
+ fTree->Branch("START","AliSTARTdigit",&fDigits,405,1);
+
+ fRawReader->Reset();
+ fRawReader->Select(13,0,1);
+
}
AliSTARTRawReader::~AliSTARTRawReader ()
{
- delete fTimeTDC1;
- delete fTimeTDC2;
- delete fChargeADC1 ;
- delete fChargeADC2;
-
+ //
}
-//------------------------------------------------------------------------------------------------
-UInt_t AliSTARTRawReader::UnpackWord(UInt_t packedWord, Int_t startBit, Int_t stopBit)
-{
- //This method unpacks a words of StopBit-StartBit+1 bits starting from "StopBits"
- UInt_t word;
- UInt_t offSet;
- Int_t length;
- length=stopBit-startBit+1;
- offSet=(UInt_t)TMath::Power(2,length)-1;
- offSet<<=startBit;
- word=packedWord&offSet;
- word>>=startBit;
- return word;
-}
-//---------------------------------------------------------------------------------------
-Bool_t AliSTARTRawReader::NextThing( AliRawReader *fRawReader)
+Bool_t AliSTARTRawReader::Next()
{
// read the next raw digit
// returns kFALSE if there is no digit left
+ AliBitPacking *pack ;
+
+ UInt_t word, unpackword;
+ Int_t time, pmt;
+ TArrayI *timeTDC1 = new TArrayI(24);
+ TArrayI * chargeTDC1 = new TArrayI(24);
+ TArrayI *timeTDC2 = new TArrayI(24);
+ TArrayI *chargeTDC2 = new TArrayI(24);
+
+ do {
+ if (!fRawReader->ReadNextData(fData)) return kFALSE;
+ } while (fRawReader->GetDataSize() == 0);
+
+ fPosition = GetPosition();
+ // trigger
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
- UInt_t word, unpackword;
- UInt_t fADC, fTime;
- fRawReader->Select(13);
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+
+
+//multiplicity
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+ fDigits->SetSumMult(time);
+
+ // best time differece
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+ fDigits->SetDiffTime(time);
+ // best time left
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+ fDigits->SetTimeBestLeft(time);
+
+ // Best time right &left
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+
+ word=0;
+ unpackword=0;
+
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+ fDigits->SetTimeBestRight(time);
+ // mean
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
- if (!fRawReader->ReadNextInt(fData)) return kFALSE;
+ word=0;
+ unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+ fDigits->SetMeanTime(time);
- Int_t size=fRawReader->GetDataSize();
- for (Int_t i=0; i<size/32; i++)
- {
+ for (Int_t i=0; i<24; i++) //QTC amplified
+ {
word=0;
unpackword=0;
- fRawReader->ReadNextInt(word);
- unpackword=UnpackWord(word,0,5);
- fPMTId=unpackword;
+
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
word=0;
unpackword=0;
+ word = GetNextWord();
+ unpackword= pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+ chargeTDC2->AddAt(time,pmt-72);
+ }
- fRawReader->ReadNextInt(word);
- unpackword=UnpackWord(word,8,31);
- fTime=unpackword;
- fTimeTDC1->AddAt(fTime,fPMTId);
+ for (Int_t i=0; i<24; i++)
+ {
+ // QTC
word=0;
unpackword=0;
-
- fRawReader->ReadNextInt(word);
- unpackword=UnpackWord(word,0,5);
- fPMTId=unpackword;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
word=0;
unpackword=0;
-
- fRawReader->ReadNextInt(word);
+ word = GetNextWord();
+ unpackword= pack->UnpackWord(word,0,8);
+ pmt=unpackword; //
+ chargeTDC1->AddAt(time,pmt-48);
+ }
- unpackword=UnpackWord(word,8,31);
- fTime=unpackword;
- fTimeTDC2->AddAt(fTime,fPMTId);
-
+ for (Int_t i=0; i<24; i++) //time CFD
+ {
word=0;
unpackword=0;
- fRawReader->ReadNextInt(word);
- unpackword=UnpackWord(word,0,5);
- fPMTId=unpackword;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
word=0;
unpackword=0;
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+ timeTDC2->AddAt(time,pmt-24);
+ }
- fRawReader->ReadNextInt(word);
- unpackword= UnpackWord(word,8,31);
- fADC=unpackword;
- fChargeADC1 -> AddAt(fADC, fPMTId);
-
+
+ for (Int_t i=0; i<24; i++) //time LED
+ {
word=0;
unpackword=0;
-
- fRawReader->ReadNextInt(word);
- unpackword=UnpackWord(word,0,5);
- fPMTId=unpackword;
-
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,8,31);
+ time=unpackword;
+
word=0;
unpackword=0;
- fRawReader->ReadNextInt(word);
+ word = GetNextWord();
+ unpackword=pack->UnpackWord(word,0,8);
+ pmt=unpackword;
+ timeTDC1->AddAt(time,pmt);
+ }
+
+
+ fDigits->SetTime(*timeTDC2);
+ fDigits->SetADC(*chargeTDC1);
- unpackword= UnpackWord(word,8,31);
- fADC=unpackword;
- fChargeADC2 -> AddAt(fADC, fPMTId);
- }
- return kTRUE;
+ fDigits->SetTimeAmp(*timeTDC1);
+ fDigits->SetADCAmp(*chargeTDC2);
+ fTree->Fill();
+ delete timeTDC1 ;
+ delete chargeTDC1;
+ delete timeTDC2 ;
+ delete chargeTDC2;
+
+ return kTRUE;
}
-//--------------------------------------------
-void AliSTARTRawReader::GetTime (TArrayI &o)
+//_____________________________________________________________________________
+Int_t AliSTARTRawReader::GetPosition()
{
- //
- Int_t i;
- for (i=0; i<24; i++)
- {
- o[i]=fTimeTDC1->At(i);
- }
+ // 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;
}
-//--------------------------------------------
-//--------------------------------------------
-void AliSTARTRawReader::GetADC (TArrayI &o)
+//_____________________________________________________________________________
+UInt_t AliSTARTRawReader::GetNextWord()
{
- //
- Int_t i;
- for (i=0; i<24; i++)
- {
- o[i]=fChargeADC1->At(i);
- }
+ // 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;
+
}
+