]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - START/AliSTARTRawReader.cxx
Corrected version of raw data reader (Alla)
[u/mrichter/AliRoot.git] / START / AliSTARTRawReader.cxx
index 38f9cd6d872782036b122d93a99241c5e6e15834..7a2f80de800220c66f09056b10cfb0488b3ae010 100644 (file)
@@ -1,7 +1,8 @@
 #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;
+
 }
+