Tunning of raw data buffer and macro reading raw data
authormbroz <Michal.Broz@cern.ch>
Thu, 28 Aug 2014 09:25:51 +0000 (11:25 +0200)
committermbroz <Michal.Broz@cern.ch>
Thu, 28 Aug 2014 09:25:51 +0000 (11:25 +0200)
AD/AliAD.cxx
AD/AliADBuffer.cxx
AD/AliADConst.h
AD/macros/ADRaw2Digits.C [new file with mode: 0644]

index bdfcf95..3cfb138 100644 (file)
@@ -304,9 +304,9 @@ void AliAD::Digits2Raw()
    fAD->SetTreeAddress();              
    digits->GetBranch("ADDigit")->SetAddress(&ADdigits); 
   
-   //const char *fileName    = AliDAQ::DdlFileName("AD",0);
-   //AliADBuffer* buffer  = new AliADBuffer(fileName);
-   AliADBuffer* buffer  = new AliADBuffer("AD.Buffer");
+   const char *fileName    = AliDAQ::DdlFileName("AD",0);
+   AliADBuffer* buffer  = new AliADBuffer(fileName);
+   //AliADBuffer* buffer  = new AliADBuffer("AD_0.ddl");
    
    // Get Trigger information first
    // Read trigger inputs from trigger-detector object
index 11e6623..80b6dea 100644 (file)
@@ -110,19 +110,43 @@ void AliADBuffer::WriteChannel(Int_t channel, Short_t *adc, Bool_t integrator){
   // It writes AD charge information into a raw data file. 
   // Being called by Digits2Raw
   
-  UShort_t data = 0;
+  UInt_t data = 0;
   for(Int_t i = 0; i < kNClocks; ++i) {
     if (adc[i] > 1023) {
       AliWarning(Form("ADC (channel=%d) saturated: %d. Truncating to 1023",channel,adc[i]));
       adc[i] = 1023;
     }
   }
-   
-    for(Int_t i = 0; i < (kNClocks); ++i) {
-      data =   (adc[i] & 0x3ff);
-      data |= ((integrator & 0x1) << 10);      
+  
+  if(channel%2 == 0) {
+    for(Int_t i = 0; i < (kNClocks/2); ++i) {
+      data =   (adc[2*i] & 0x3ff);
+      data |= ((integrator & 0x1) << 10);
+
+      data |= ((adc[2*i+1] & 0x3ff) << 16);
+      data |= ((!integrator & 0x1) << 26);
+
       f->WriteBuffer((char*)&data,sizeof(data));
     }
+    fRemainingWord = (adc[kNClocks-1] & 0x3ff);
+    fRemainingWord |= ((integrator & 0x1) << 10);
+  }
+  else {
+    data = fRemainingWord;
+    data |= ((adc[0] & 0x3ff) << 16);
+    data |= ((integrator & 0x1) << 26);
+    f->WriteBuffer((char*)&data,sizeof(data));
+
+    for(Int_t i = 1; i <= (kNClocks/2); ++i) {
+      data =   (adc[2*i-1] & 0x3ff);
+      data |= ((!integrator & 0x1) << 10);
+
+      data |= ((adc[2*i] & 0x3ff) << 16);
+      data |= ((integrator & 0x1) << 26);
+
+      f->WriteBuffer((char*)&data,sizeof(data));
+    }
+  }
     
 }
 
@@ -160,8 +184,8 @@ void AliADBuffer::WriteBeamFlags() {
    data = 0;
    f->WriteBuffer((char*)&data,sizeof(data));//Empty short in the end
    /*/
-  for(Int_t i = 0; i < 12; i++) {
-       UShort_t data = 0;
+  for(Int_t i = 0; i < 6; i++) {
+       UInt_t data = 0;
        f->WriteBuffer((char*)&data,sizeof(data));
        }
 }
@@ -174,8 +198,8 @@ void AliADBuffer::WriteMBInfo() {
   // 10 events (4*10 shorts for the 4 channels 
   // of half a CIU card)
     
-  for(Int_t i = 0; i < 40; i++) {
-    UShort_t data = 0;
+  for(Int_t i = 0; i < 20; i++) {
+    UInt_t data = 0;
     f->WriteBuffer((char*)&data,sizeof(data));
   }
 }
@@ -189,10 +213,10 @@ void AliADBuffer::WriteMBFlags() {
   // of half a CIU card + one empty 16-bit
 
 
-  for(Int_t i = 0; i < 6; i++) {
-    UShort_t data = 0;
-    f->WriteBuffer((char*)&data,sizeof(data));
-  }
+  for(Int_t i = 0; i < 3; i++) {
+    UInt_t data = 0;
+    f->WriteBuffer((char*)&data,sizeof(data));  
+    }
 }
 
 //_____________________________________________________________________________
index dcef219..45594f3 100644 (file)
@@ -7,7 +7,7 @@ const Float_t kIntTimeRes = 0.39; // intrinsic time resolution of the scintillat
 const Float_t kV0CDelayCables = 8.1; // delay cables on the C side (in ns)
 const Float_t kV0Offset = -1338.6; // general V0 offset between the TDCs and the trigger
 const Int_t   kNClocks = 21; // Number of ADC clocks that are read out
-const Float_t kChargePerADC = 0.6e-12; // Charge per ADC
+const Float_t kChargePerADC = 1e-23; // Charge per ADC
 const Int_t   kMinTDCWidth = 13; // minimum signal width measured by TDC
 const Int_t   kMaxTDCWidth = 128; // maximum signal width measured by TDC
 const Float_t kPMRespTime = 6.0; // PM response time (corresponds to 1.9 ns rise time)
diff --git a/AD/macros/ADRaw2Digits.C b/AD/macros/ADRaw2Digits.C
new file mode 100644 (file)
index 0000000..932d483
--- /dev/null
@@ -0,0 +1,86 @@
+//_____________________________________________________//
+//                                                     //
+//    This macro reads AD DDL Raw Data and          //
+//    converts it into Digits                          //
+//                                                     //
+//____________________________________________________ //
+
+
+void ADRaw2Digits(Int_t nEvent = 5) 
+{
+     for(int iEvent=0; iEvent<nEvent; iEvent++) {
+               printf("=========== EVENT  %d ===========\n",iEvent);
+               TString FileName = "raw.root";
+               RawStreamEvent(FileName.Data(),iEvent); }
+}
+
+
+Bool_t RawStreamEvent(TString fileName = "./",Int_t iEvent = 0)
+{
+  // Reads DDL data from fileName
+
+  TStopwatch timer;
+  timer.Start();
+
+// Creates a TreeD to dump Digits
+
+  AliRunLoader* rl = AliRunLoader::Open("galice.root");    
+
+  AliADLoader* loader = (AliADLoader*) rl->GetLoader("ADLoader");
+  
+  if(!loader) {
+    AliError("no AD loader found");
+    return kFALSE; }
+
+  TTree* treeD  = loader->TreeD();
+  if(!treeD) {
+      loader->MakeTree("D");
+      treeD = loader->TreeD(); }
+        
+  AliADdigit  digit;
+  AliADdigit* pdigit = &digit;
+  const Int_t kBufferSize = 4000;
+   
+  treeD->Branch("AD", "AliADdigit",  &pdigit, kBufferSize);
+
+  AliRawReader* rawReader = 0x0;
+  rawReader = new AliRawReaderRoot(fileName); // DDL files
+  
+  AliADRawStream* rawStream  = new AliADRawStream(rawReader);    
+  
+  rawReader->GotoEvent(iEvent);  
+     
+  rawStream->Next();
+  
+  printf("Data size is %d\n",rawReader->GetDataSize());
+  
+  for(Int_t i=0; i<16; i++) {
+  
+      Short_t chargeADC[21];
+      for(Int_t iClock=0; iClock < 21; ++iClock) {
+       chargeADC[iClock] = rawStream->GetPedestal(i,iClock);
+      }
+
+      new(pdigit) AliADdigit(i, (Int_t)rawStream->GetTime(i), (Int_t)rawStream->GetWidth(i), rawStream->GetIntegratorFlag(i, 10),chargeADC); 
+      treeD->Fill();
+  }
+// Checks if everything is OK by printing results 
+
+   for(int i=0;i<16;i++) {
+       printf("Channel %d : %d %d \n",i,rawStream->GetADC(i),rawStream->GetTime(i)); }
+   //treeD->Print(); printf(" \n"); 
+       
+  loader->WriteDigits("OVERWRITE");
+  loader->UnloadDigits();
+  
+       
+       
+  delete rawReader;
+  delete rawStream;
+
+  timer.Stop();
+  timer.Print();
+}
+
+