]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - START/AliSTARTRawData.cxx
Improved version (F.Carminati)
[u/mrichter/AliRoot.git] / START / AliSTARTRawData.cxx
index 73af4aa96e1c0077a318b7fdf8b5705e2f476b77..ec61e34c15b9461a86289f8fc80c5f791509eaa3 100644 (file)
 ///////////////////////////////////////////////////////////////////////////////
 
 #include <Riostream.h>
+#include <TTree.h>
 
 #include "AliSTART.h"
 #include "AliSTARTRawData.h"
 #include "AliSTARTdigit.h"
-//#include "AliSTARTLoader.h"
-
-#include <AliLoader.h>
-#include <AliRunLoader.h>
-#include <TClonesArray.h>
-#include <TTree.h>
+#include "AliBitPacking.h"
 #include "AliRawDataHeader.h"
+#include "AliBitPacking.h"
 
 ClassImp(AliSTARTRawData)
 
 //_____________________________________________________________________________
 AliSTARTRawData::AliSTARTRawData():TObject()
 {
-
+  /*
+-  48 channels (2 words each as in TOF DDL) for :
+word 1 :0-5bit number of PMT; word 2: 0-7 error sign, 8-31 TDC
+and the same but for amplified signal. Now I wrote the same time because
+CDF are not ready and differences didn't measured yet.
+
+-  48 channel for amplitude: very preliminary, QTC features are not
+known now, preliminary i put as T1 time signal for this PMT in first
+channel and T1+A in second, where A=Log(Amplitude);
+and the same for amplified but A=Log(10*Amplitude).
+
+- T0-A and T0-C 2 channels
+- T0A-T0C vertex information
+- Time Meaner where T0C TOF increase to the T0A TOF distance
+- 6 multiplicity signals the same way as amplitude and with the same
+uncertances
+  */
 
   fIndex=-1;
   fDigits = NULL;
 
-  ftimeTDC = new TArrayI(24);
+  fTimeCFD = new TArrayI(24);
   fADC = new TArrayI(24);
-  ftimeTDCAmp = new TArrayI(24);
-  fADCAmp = new TArrayI(24);
-  fSumMult = new TArrayI(6);
+  fTimeLED = new TArrayI(24);
+  fADC0 = new TArrayI(24);
    //   this->Dump();
   
 }
@@ -74,11 +86,10 @@ AliSTARTRawData::~AliSTARTRawData()
     delete fDigits;
     fDigits = NULL;
   }
-  delete ftimeTDC;
+  delete fTimeCFD;
   delete fADC;
-  delete ftimeTDCAmp;
-  delete fADCAmp;
-  delete fSumMult;
+  delete fTimeLED;
+  delete fADC0;
 }
 
 //_____________________________________________________________________________
@@ -105,163 +116,125 @@ void AliSTARTRawData::GetDigits(AliSTARTdigit *fDigits, UInt_t *buf)
   UInt_t word;
   UInt_t baseWord=0;
   Int_t error=0;
+
     // Get the digits array
 
-  fDigits->GetTime(*ftimeTDC);
+  fDigits->GetTime(*fTimeCFD);
   fDigits->GetADC(*fADC);
-  fDigits->GetTimeAmp(*ftimeTDCAmp);
-  fDigits->GetADCAmp(*fADCAmp);
-  fDigits->GetSumMult(*fSumMult);
+  fDigits->GetTimeAmp(*fTimeLED);
+  fDigits->GetADCAmp(*fADC0);
      
   // Loop through all PMT
  
   for (Int_t det = 0; det < 24; det++) {
-    Int_t time=ftimeTDC->At(det);
-    Int_t qtc=fADC->At(det);
-    Int_t timeAmp=ftimeTDCAmp->At(det);
-    Int_t qtcAmp=fADCAmp->At(det);
-
+    Int_t timeLED=fTimeLED->At(det);
+    //   if( timeLED > 0){
+      // DDL 1 0-5 -#PMT, 6-31 - empty
+      //LED
+      word=det;;
+      PackWord(baseWord,word, 0, 8); 
+      fIndex++;
+      buf[fIndex]=baseWord;
+      
+      word=0;
+      baseWord=0;
+      word=error;
+      PackWord(baseWord,word,0, 7); // Error flag
+      word=timeLED;
+      PackWord(baseWord,word,8,31); // time-of-flight
+      fIndex++;
+      buf[fIndex]=baseWord;
+      word=0;
+      baseWord=0;
+      //  }
+  }
+   for (Int_t det = 0; det < 24; det++) {
+    //CDF
+     Int_t timeCFD=fTimeCFD->At(det);
+     //   if ( timeCFD >0 ) {
+       // DDL2 2 0-5 -#PMT, 6-31 - empty
+       word=0;
+       baseWord=0;
+       word=det+24;
+       PackWord(baseWord,word, 0, 8); // number of PMT on the right side
+       fIndex++;
+       buf[fIndex]=baseWord;
+       word=0;
+       baseWord=0;
+       word=error;
+       PackWord(baseWord,word,0, 7); // Error flag
+       word=timeCFD;
+       PackWord(baseWord,word,8,31); // time-of-flight
+       fIndex++;
+       buf[fIndex]=baseWord;
+        word=0;
+       baseWord=0;
+       //  }
+   }
+  for (Int_t det = 0; det < 24; det++) {
     //conver ADC to time (preliminary algorithm)
-
-     // DDL 1 0-5 -#PMT, 6-31 - empty
-
-     word=det;;
-     PackWord(baseWord,word, 0, 5); 
-     fIndex++;
-     buf[fIndex]=baseWord;
-
-     word=0;
-     baseWord=0;
-
-     //TDC    
-     word=error;
-     PackWord(baseWord,word,0, 7); // Error flag
-     word=time;
-     PackWord(baseWord,word,8,31); // time-of-flight
-     fIndex++;
-     buf[fIndex]=baseWord;
-
-     word=0;
-     baseWord=0;
+    Int_t qtc=fADC->At(det);
+    //    if ( qtc > 0 )
+    //  {
+       word=det+48;
+       PackWord(baseWord,word, 0, 8); // number of PMT on the right side
+       fIndex++;
+       buf[fIndex]=baseWord;
+       baseWord=0;
+       word=error;
+       PackWord(baseWord,word,0, 7); // Error flag
+       word=qtc;
+       PackWord(baseWord,word,8,31); // Q->Time
+       fIndex++;
+       buf[fIndex]=baseWord;
+       word=0;
+       baseWord=0;
+       //     }
+  }
+  
+  for (Int_t det = 0; det < 24; det++) {
+    Int_t qtcAmp=fADC0->At(det);
     
-    // DDL2 2 0-5 -#PMT, 6-31 - empty
-     word=det;;
-     PackWord(baseWord,word, 0, 5); // number of PMT on the right side
-     fIndex++;
-     buf[fIndex]=baseWord;
-     word=0;
-     baseWord=0;
-
-     //  amplified TDC    
-     word=error;
-     PackWord(baseWord,word,0, 7); // Error flag
-     word=timeAmp;
-     PackWord(baseWord,word,8,31); // time-of-flight
-     fIndex++;
-     buf[fIndex]=baseWord;
-
-     word=0;
-     baseWord=0;
-
-     // DDL 3
-     word=det;;
-     PackWord(baseWord,word, 0, 5); // number of PMT on the right side
-     fIndex++;
-     buf[fIndex]=baseWord;
-     word=0;
-     baseWord=0;
-
-     // ADC -> TDC     
-     word=error;
-     PackWord(baseWord,word,0, 7); // Error flag
-     word=time;
-     PackWord(baseWord,word,8,31); // time-of-flight
-     fIndex++;
-     buf[fIndex]=baseWord;
-
-
-     // ADC -> TDC :QTC 
-     word=0;
-     baseWord=0;
-
-     word=det;;
-     PackWord(baseWord,word, 0, 5); // number of PMT on the right side
-     fIndex++;
-     buf[fIndex]=baseWord;
-     baseWord=0;
-     word=error;
-     PackWord(baseWord,word,0, 7); // Error flag
-     word=time+qtc;
-     PackWord(baseWord,word,8,31); // time-of-flight
-     fIndex++;
-     buf[fIndex]=baseWord;
-
-     word=0;
-     baseWord=0;
-
     // DDL 4 amplified QTC charge * 10
-     word=det;;
-     PackWord(baseWord,word, 0, 5); // number of PMT on the right side
-     fIndex++;
-     buf[fIndex]=baseWord;
-     word=0;
-     baseWord=0;
-
-     // ADC -> TDC     
-     word=error;
-     PackWord(baseWord,word,0, 7); // Error flag
-     word=timeAmp;
-     PackWord(baseWord,word,8,31); // time-of-flight
-     fIndex++;
-     buf[fIndex]=baseWord;
-
+    
      //Amplified  ADC -> TDC 
-     word=0;
-     baseWord=0;
-
-     word=det;;
-     PackWord(baseWord,word, 0, 5); // number of PMT on the right side
-     fIndex++;
-     buf[fIndex]=baseWord;
-     baseWord=0;
-     word=error;
-     PackWord(baseWord,word,0, 7); // Error flag
-     word=time+qtcAmp;
-     PackWord(baseWord,word,8,31); // time-of-flight
-     fIndex++;
-     buf[fIndex]=baseWord;
-
-     word=0;
-     baseWord=0;
- }
+    
+    word=det+72;
+    PackWord(baseWord,word, 0, 8); // number of PMT on the right side
+    fIndex++;
+    buf[fIndex]=baseWord;
+    baseWord=0;
+    word=error;
+    PackWord(baseWord,word,0, 7); // Error flag
+    word=qtcAmp;
+    PackWord(baseWord,word,8,31); // Q->T amplified
+    fIndex++;
+    buf[fIndex]=baseWord;
+    
+    word=0;
+    baseWord=0;
+  }
 
 
   word=0;
   baseWord=0;
   fIndex++;
-  word=25;
-  PackWord(baseWord,word, 0, 5); // number of PMT on the right side
-  word=fDigits->MeanTime();
-  PackWord(baseWord,word, 6, 31); // TDC on the right side from Marin
+  word=97;
+  PackWord(baseWord,word, 0, 8); // ?????????????????
   buf[fIndex]=baseWord;
-
   baseWord=0;
   word=error;
   PackWord(baseWord,word,0, 7); // Error flag
   word=fDigits->MeanTime();
-  PackWord(baseWord,word,8,31); // time-of-flight
+  PackWord(baseWord,word,8,31); // MEANER
   fIndex++;
   buf[fIndex]=baseWord;
 
 
-
   // besttime right & left
-  //  fIndex++;
-  //  buf[fIndex]=baseWord;
-  word=26;
-  PackWord(baseWord,word, 0, 5); // number of PMT on the right side
-  word=fDigits->BestTimeRight();
-  PackWord(baseWord,word, 6, 31); // TDC on the right side from Marin
+  word=98;
+  PackWord(baseWord,word, 0, 8); // T0-A sign
   fIndex++;
   buf[fIndex]=baseWord;
 
@@ -269,14 +242,73 @@ void AliSTARTRawData::GetDigits(AliSTARTdigit *fDigits, UInt_t *buf)
   word=error;
   PackWord(baseWord,word,0, 7); // Error flag
   word=fDigits->BestTimeRight();
-  PackWord(baseWord,word,8,31); // time-of-flight
+  PackWord(baseWord,word,8,31); // time-of-flight T0-A
+  fIndex++;
+  buf[fIndex]=baseWord;
+
+  word=99;
+  PackWord(baseWord,word, 0, 8); // T0-C sign
   fIndex++;
   buf[fIndex]=baseWord;
 
-  word=27;
-  PackWord(baseWord,word, 0, 5); // number of PMT on the right side
+  baseWord=0;
+  word=error;
+  PackWord(baseWord,word,0, 7); // Error flag
   word=fDigits->BestTimeLeft();
-  PackWord(baseWord,word, 6, 31); // TDC on the right side from Marin
+  PackWord(baseWord,word,8,31); // time-of-flight T0-C 
+  fIndex++;
+  buf[fIndex]=baseWord;
+
+  // time difference
+  word=100;
+  PackWord(baseWord,word, 0, 8); // TVDS sign
+  fIndex++;
+  buf[fIndex]=baseWord;
+
+  baseWord=0;
+
+  word=error;
+  PackWord(baseWord,word,0, 7); // Error flag
+  word=fDigits->TimeDiff();
+  PackWord(baseWord,word,8,31); // T0verex
+  fIndex++;
+  buf[fIndex]=baseWord;
+
+
+  // multiplicity 
+  
+  Int_t mult=fDigits->SumMult();
+  word=101;
+  PackWord(baseWord,word, 0, 8); 
+  fIndex++;
+  buf[fIndex]=baseWord;
+  
+  baseWord=0;
+  word=error;
+  PackWord(baseWord,word,0, 7); // Error flag
+  word=mult;
+  PackWord(baseWord,word,8,31); // time amplitude
+  fIndex++;
+  buf[fIndex]=baseWord;
+  
+
+  // trigger channels
+   // besttime right & left
+  word=102;
+  PackWord(baseWord,word, 0, 8); // T0-A sign
+  fIndex++;
+  buf[fIndex]=baseWord;
+
+  baseWord=0;
+  word=error;
+  PackWord(baseWord,word,0, 7); // Error flag
+  word=fDigits->BestTimeRight();
+  PackWord(baseWord,word,8,31); // time-of-flight T0-A
+  fIndex++;
+  buf[fIndex]=baseWord;
+  word=103;
+  PackWord(baseWord,word, 0, 8); // T0-C sign
   fIndex++;
   buf[fIndex]=baseWord;
 
@@ -285,15 +317,13 @@ void AliSTARTRawData::GetDigits(AliSTARTdigit *fDigits, UInt_t *buf)
   word=error;
   PackWord(baseWord,word,0, 7); // Error flag
   word=fDigits->BestTimeLeft();
-  PackWord(baseWord,word,8,31); // time-of-flight
+  PackWord(baseWord,word,8,31); // time-of-flight T0-C 
   fIndex++;
   buf[fIndex]=baseWord;
 
   // time difference
-  word=28;
-  PackWord(baseWord,word, 0, 5); // number of PMT on the right side
-  word=fDigits->TimeDiff();
-  PackWord(baseWord,word, 6, 31); // TDC on the right side from Marin
+  word=104;
+  PackWord(baseWord,word, 0, 8); // TVDS sign
   fIndex++;
   buf[fIndex]=baseWord;
 
@@ -302,71 +332,70 @@ void AliSTARTRawData::GetDigits(AliSTARTdigit *fDigits, UInt_t *buf)
   word=error;
   PackWord(baseWord,word,0, 7); // Error flag
   word=fDigits->TimeDiff();
-  PackWord(baseWord,word,8,31); // time-of-flight
+  PackWord(baseWord,word,8,31); // T0verex
   fIndex++;
   buf[fIndex]=baseWord;
 
   // multiplicity 
+  
+  mult=fDigits->SumMult();
+  word=105;
+  PackWord(baseWord,word, 0, 8); 
+  fIndex++;
+  buf[fIndex]=baseWord;
+  
+  baseWord=0;
+  word=error;
+  PackWord(baseWord,word,0, 7); // Error flag
+  word=mult;
+  PackWord(baseWord,word,8,31); // time amplitude
+  fIndex++;
+  buf[fIndex]=baseWord;
+  
+  // multiplicity 
+  
+  mult=fDigits->SumMult();
+  word=106;
+  PackWord(baseWord,word, 0, 8); 
+  fIndex++;
+  buf[fIndex]=baseWord;
+  
+  baseWord=0;
+  word=error;
+  PackWord(baseWord,word,0, 7); // Error flag
+  word=mult;
+  PackWord(baseWord,word,8,31); // time amplitude
+  fIndex++;
+  buf[fIndex]=baseWord;
 
-  for (Int_t i=0; i<6; i++)
-    {
-      Int_t mult=fSumMult->At(i);
-      word=29+i;
-      PackWord(baseWord,word, 0, 5); 
-      word=mult;
-      PackWord(baseWord,word, 6, 31); // TDC on the right side from Marin
-      fIndex++;
-      buf[fIndex]=baseWord;
-      
-      baseWord=0;
-      word=error;
-      PackWord(baseWord,word,0, 7); // Error flag
-      word=mult;
-      PackWord(baseWord,word,8,31); // time QTC
-      fIndex++;
-      buf[fIndex]=baseWord;
-    }
-  cout<<endl;
 }
 
-//-------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------------
 
 void AliSTARTRawData::PackWord(UInt_t &BaseWord, UInt_t Word, Int_t StartBit, Int_t StopBit)
 {
-  //This method packs a word into the Baseword buffer starting form the "StartBit" 
-  //and tacking StopBit-StartBit+1 bits
-  UInt_t dummyWord,offSet;
-  Int_t  length;
-  UInt_t sum;
-  //The BaseWord is being filled with 1 from StartBit to StopBit
-  length=StopBit-StartBit+1;
-  sum=(UInt_t)TMath::Power(2,length)-1;
-
-  if(Word > sum){
+
+  // Build mask
+  Int_t len=StopBit-StartBit+1;
+  UInt_t mask=0;
+  for(Int_t jb=0; jb<len; mask|=1<<jb++);
+  // Check consistency
+  if(Word > mask){
     Error("PackWord", "Word to be filled is not within desired length\n"
-         "Word:%d Start bit:%d Stop Bit:%d",Word,StartBit,StopBit);
+          "Word:%d Start bit:%d Stop Bit:%d",Word,StartBit,StopBit);
     return;
   }
-  offSet=sum;
-  offSet<<=StartBit;
-  BaseWord=BaseWord|offSet;
-
-  //The Word to be filled is shifted to the position StartBit
-  //and the remaining  Left and Right bits are filled with 1
-  sum=(UInt_t)TMath::Power(2,StartBit)-1;
-  dummyWord=0xFFFFFFFF<<length;
-  dummyWord +=Word;
-  dummyWord<<=StartBit;
-  dummyWord+=sum;
-  BaseWord=BaseWord&dummyWord;
-
-  return;
+  BaseWord=(BaseWord&~(mask<<StartBit))|Word<<StartBit;
+
 }
+
 //---------------------------------------------------------------------------------------
 
-Int_t AliSTARTRawData::RawDataSTART(AliSTARTdigit *fDigits){
-  
-  //This method creates the Raw data files for TOF detector
+Int_t AliSTARTRawData::RawDataSTART(AliSTARTdigit *fDigits)
+{
+   //This method creates the Raw data files for START detector
+
+
   const Int_t kSize=512; //2*AliTOFGeometry::NpadXSector() 
                           //max number of digits per DDL file times 2
   UInt_t buf[kSize];
@@ -374,7 +403,6 @@ Int_t AliSTARTRawData::RawDataSTART(AliSTARTdigit *fDigits){
   UInt_t word;
 
   fIndex=-1;
-  // TClonesArray*& digits = * (TClonesArray**) branch->GetAddress();
 
   char fileName[15];
   ofstream outfile;         // logical name of the output file