use the new AliCaloRawStreamV3 decoder (from Yuri), based on the new AliAltroRawStrea...
authordsilverm <dsilverm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 24 Jun 2009 19:00:45 +0000 (19:00 +0000)
committerdsilverm <dsilverm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 24 Jun 2009 19:00:45 +0000 (19:00 +0000)
EMCAL/AliCaloCalibPedestal.cxx
EMCAL/AliCaloCalibPedestal.h
EMCAL/AliCaloCalibSignal.cxx
EMCAL/AliCaloCalibSignal.h
EMCAL/AliEMCALCalibHistoProducer.cxx
EMCAL/AliEMCALQADataMakerRec.cxx
EMCAL/AliEMCALRawUtils.cxx
EMCAL/AliEMCALRawUtils.h
EMCAL/EMCALLEDda.cxx
EMCAL/EMCALPEDda.cxx

index d29863c7cd3ae67ca2015101fc34e3f50bb3ad40..d01e33246b160c964c75cd7670602b513d0678f9 100644 (file)
@@ -40,7 +40,7 @@
 #include <iostream>
 #include <cmath>
 
-#include "AliCaloRawStream.h"
+#include "AliCaloRawStreamV3.h"
 
 //The include file
 #include "AliCaloCalibPedestal.h"
@@ -328,12 +328,12 @@ Bool_t AliCaloCalibPedestal::AddInfo(const AliCaloCalibPedestal *ped)
 Bool_t AliCaloCalibPedestal::ProcessEvent(AliRawReader *rawReader)
 { 
   // if fMapping is NULL the rawstream will crate its own mapping
-  AliCaloRawStream rawStream(rawReader, fCaloString, (AliAltroMapping**)fMapping);
+  AliCaloRawStreamV3 rawStream(rawReader, fCaloString, (AliAltroMapping**)fMapping);
   return ProcessEvent(&rawStream);
 }
 
 //_____________________________________________________________________
-Bool_t AliCaloCalibPedestal::ProcessEvent(AliCaloRawStream *in)
+Bool_t AliCaloCalibPedestal::ProcessEvent(AliCaloRawStreamV3 *in)
 { 
   // Method to process=analyze one event in the data stream
   if (!in) return kFALSE; //Return right away if there's a null pointer
@@ -343,33 +343,45 @@ Bool_t AliCaloCalibPedestal::ProcessEvent(AliCaloRawStream *in)
   int sample = 0;
   int gain = 0;
   int time = 0;
-  // counters
-  int i = 0; // the sample number in current event.
-  int max = fgkSampleMin, min = fgkSampleMax;//Use these for picking the pedestal
-
-  // for the pedestal calculation
-  int sampleSum = 0; // sum of samples
-  int squaredSampleSum = 0; // sum of samples squared
-  int nSum = 0; // number of samples in sum
-  // calc. quantities
-  double mean = 0, squaredMean = 0, rms = 0;
-  
-  while (in->Next()) {
-    sample = in->GetSignal(); //Get the adc signal
-    if (sample < min) min = sample;
-    if (sample > max) max = sample;
-    i++;
-
-    // should we add it for the pedestal calculation?
-    time = in->GetTime();
-    if ( (fFirstPedestalSample<=time && time<=fLastPedestalSample) || // sample time in range
-        !fSelectPedestalSamples ) { // or we don't restrict the sample range.. - then we'll take all 
-      sampleSum += sample;
-      squaredSampleSum += sample*sample;
-      nSum++;
-    }
+  int i = 0; // sample counter
+  int startBin = 0;
+
+  // start loop over input stream 
+  while (in->NextDDL()) {
+    while (in->NextChannel()) {
+
+      // counters
+      int max = fgkSampleMin, min = fgkSampleMax; // min and max sample values
+      
+      // for the pedestal calculation
+      int sampleSum = 0; // sum of samples
+      int squaredSampleSum = 0; // sum of samples squared
+      int nSum = 0; // number of samples in sum
+      // calc. quantities
+      double mean = 0, squaredMean = 0, rms = 0;
+      
+      while (in->NextBunch()) {
+       const UShort_t *sig = in->GetSignals();
+       startBin = in->GetStartTimeBin();
+       for (i = 0; i < in->GetBunchLength(); i++) {
+         sample = sig[i];
+         time = startBin--;
+
+         // check if it's a min or max value
+         if (sample < min) min = sample;
+         if (sample > max) max = sample;
+         
+         // should we add it for the pedestal calculation?
+         if ( (fFirstPedestalSample<=time && time<=fLastPedestalSample) || // sample time in range
+              !fSelectPedestalSamples ) { // or we don't restrict the sample range.. - then we'll take all 
+           sampleSum += sample;
+           squaredSampleSum += sample*sample;
+           nSum++;
+         }
+         
+       } // loop over samples in bunch
+      } // loop over bunches
 
-    if ( i >= in->GetTimeLength()) {
       // calculate pedesstal estimate: mean of possibly selected samples
       if (nSum > 0) {
        mean = sampleSum / (1.0 * nSum);
@@ -382,8 +394,8 @@ Bool_t AliCaloCalibPedestal::ProcessEvent(AliCaloRawStream *in)
        squaredMean = 0;
        rms  = 0;
       }
-
-      //If we're here then we're done with this tower
+      
+      // we're done with the calc. for this channel; let's prepare to fill histo
       gain = -1; // init to not valid value
       if ( in->IsLowGain() ) {
        gain = 0;
@@ -392,17 +404,17 @@ Bool_t AliCaloCalibPedestal::ProcessEvent(AliCaloRawStream *in)
        gain = 1;
       }
       
+      // it should be enough to check the SuperModule info for each DDL really, but let's keep it here for now
       int arrayPos = in->GetModule(); //The modules are numbered starting from 0
       if (arrayPos >= fModules) {
        //TODO: return an error message, if appopriate (perhaps if debug>0?)
        return kFALSE;
-      } 
-    
+      }     
       //Debug
       if (arrayPos < 0 || arrayPos >= fModules) {
        printf("Oh no: arrayPos = %i.\n", arrayPos); 
       }
-
+      
       fNChanFills++; // one more channel found, and profile to be filled
       //NOTE: coordinates are (column, row) for the profiles
       if (gain == 0) {
@@ -420,20 +432,14 @@ Bool_t AliCaloCalibPedestal::ProcessEvent(AliCaloRawStream *in)
          ((TProfile2D*)fPedestalHighGain[arrayPos])->Fill(in->GetColumn(), fRowMultiplier*in->GetRow(), mean); 
          ((TProfile2D*)fPedestalRMSHighGain[arrayPos])->Fill(in->GetColumn(), fRowMultiplier*in->GetRow(), rms);
        }
-      }//end if gain
-
-      // reset counters
-      max = fgkSampleMin; min = fgkSampleMax;
-      i = 0;
-      // also pedestal calc counters
-      sampleSum = 0; // sum of samples
-      squaredSampleSum = 0; // sum of samples squared
-      nSum = 0; // number of samples in sum
+      }//end if valid gain
+
     
-    }//End if end of tower
-   
-  }//end while, of stream
-  
+    }// end while over channel   
+  }//end while over DDL's, of input stream 
+
+  in->Reset(); // just in case the next customer forgets to check if the stream was reset..
   return kTRUE;
 }
 
index 7f1ce7ce7f51a9fcc47c27c419f4c8c872a38cb9..b3abe6a1cf5dfbcb34fefca661f22000fd013585 100644 (file)
@@ -10,7 +10,7 @@
 // \file AliCaloCalibPedestal.h
 //   \brief Description:
 //   A help class for monitoring and calibration tools: MOOD, AMORE etc.,
-//   that can process events from a standard AliCaloRawStream,
+//   that can process events from a standard AliCaloRawStreamV3,
 //   most usually from LED/pulser runs. It stores signal info as
 //   typical (highest) amplitude, and pedestal info in geometrically-binned
 //   2D profiles of the detectors (EMCAL and PHOS).
@@ -26,7 +26,7 @@
 #include "TProfile2D.h"
 #include "TH2.h"
 #include "TObjArray.h"
-class AliCaloRawStream;
+class AliCaloRawStreamV3;
 class AliCaloAltroMapping;
 class AliRawReader;
 
@@ -51,7 +51,7 @@ class AliCaloCalibPedestal : public TObject {
 
   // Event processing methods:  
   Bool_t ProcessEvent(AliRawReader *rawReader);
-  Bool_t ProcessEvent(AliCaloRawStream    *in);
+  Bool_t ProcessEvent(AliCaloRawStreamV3    *in);
   
   // Mapping handling
   AliCaloAltroMapping **GetAltroMapping() { return fMapping; };
index 0840c1b9a33d7de63c1daf9d1ae29a881055d709..67021e901173ceb8b8e596e5beed81bfb37ce418 100644 (file)
@@ -36,7 +36,7 @@
 
 #include "AliRawReader.h"
 #include "AliRawEventHeaderBase.h"
-#include "AliCaloRawStream.h"
+#include "AliCaloRawStreamV3.h"
 
 //The include file
 #include "AliCaloCalibSignal.h"
@@ -324,13 +324,13 @@ Bool_t AliCaloCalibSignal::AddInfo(const AliCaloCalibSignal *sig)
 Bool_t AliCaloCalibSignal::ProcessEvent(AliRawReader *rawReader)
 {
   // if fMapping is NULL the rawstream will crate its own mapping
-  AliCaloRawStream rawStream(rawReader, fCaloString, (AliAltroMapping**)fMapping);
+  AliCaloRawStreamV3 rawStream(rawReader, fCaloString, (AliAltroMapping**)fMapping);
 
   return ProcessEvent( &rawStream, (AliRawEventHeaderBase*)rawReader->GetEventHeader() );
 }
 
 //_____________________________________________________________________
-Bool_t AliCaloCalibSignal::ProcessEvent(AliCaloRawStream *in, AliRawEventHeaderBase *aliHeader)
+Bool_t AliCaloCalibSignal::ProcessEvent(AliCaloRawStreamV3 *in, AliRawEventHeaderBase *aliHeader)
 { 
   // Method to process=analyze one event in the data stream
   if (!in) return kFALSE; //Return right away if there's a null pointer
@@ -347,8 +347,7 @@ Bool_t AliCaloCalibSignal::ProcessEvent(AliCaloRawStream *in, AliRawEventHeaderB
   int LEDAmpVal[fgkMaxRefs * 2]; // factor 2 is for the two gain values
   memset(LEDAmpVal, 0, sizeof(LEDAmpVal));
 
-  int sample, isample = 0; //The sample temp, and the sample number in current event.
-  int max = fgkSampleMin, min = fgkSampleMax;//Use these for picking the signal
+  int sample; // temporary value
   int gain = 0; // high or low gain
   
   // Number of Low and High gain channels for this event:
@@ -359,12 +358,26 @@ Bool_t AliCaloCalibSignal::ProcessEvent(AliCaloRawStream *in, AliRawEventHeaderB
   int RefNum = 0; // array index for LED references
 
   // loop first to get the fraction of channels with amplitudes above cut
-  while (in->Next()) {
-    sample = in->GetSignal(); //Get the adc signal
-    if (sample < min) min = sample;
-    if (sample > max) max = sample;
-    isample++;
-    if ( isample >= in->GetTimeLength()) {
+
+  while (in->NextDDL()) {
+    while (in->NextChannel()) {
+
+      // counters
+      int max = fgkSampleMin, min = fgkSampleMax; // min and max sample values
+      
+      while (in->NextBunch()) {
+       const UShort_t *sig = in->GetSignals();
+       for (Int_t i = 0; i < in->GetBunchLength(); i++) {
+         sample = sig[i];
+
+         // check if it's a min or max value
+         if (sample < min) min = sample;
+         if (sample > max) max = sample;
+
+       } // loop over samples in bunch
+      } // loop over bunches
+
+      gain = -1; // init to not valid value
       //If we're here then we're done with this tower
       if ( in->IsLowGain() ) {
        gain = 0;
@@ -376,6 +389,7 @@ Bool_t AliCaloCalibSignal::ProcessEvent(AliCaloRawStream *in, AliRawEventHeaderB
        gain = in->GetRow(); // gain coded in (in RCU/Altro mapping) as Row info for LED refs..
       }
 
+      // it should be enough to check the SuperModule info for each DDL really, but let's keep it here for now
       int arrayPos = in->GetModule(); //The modules are numbered starting from 0
       //Debug
       if (arrayPos < 0 || arrayPos >= fModules) {
@@ -403,13 +417,12 @@ Bool_t AliCaloCalibSignal::ProcessEvent(AliCaloRawStream *in, AliRawEventHeaderB
        LEDAmpVal[RefNum] = max - min;
       } // end of LED ref
       
-      max = fgkSampleMin; min = fgkSampleMax;
-      isample = 0;
-      
-    }//End if end of tower
+    } // end while over channel 
    
-  }//end while, of stream
+  }//end while over DDL's, of input stream
   
+  in->Reset(); // just in case the next customer forgets to check if the stream was reset..
+
   // now check if it was a led event, only use high gain (that should be sufficient)
   if (fReqFractionAboveAmp) {
     bool ok = false;
index 648fbadc086dc80336f13183e896bab9ea9dd976..f00e96d590fc8cf14295e57b77366d850ac450ce 100644 (file)
@@ -9,7 +9,7 @@
 // \file AliCaloCalibSignal.h
 //   \brief Description:
 //   A help class for monitoring and calibration tools: MOOD, AMORE etc.,
-//   that can process events from a standard AliCaloRawStream,
+//   that can process events from a standard AliCaloRawStreamV3,
 //   most usually from LED/pulser runs. It stores signal info as
 //   typical (highest) amplitude vs time in TGraphs (one per channel)
 //   or TProfiles if we decide to just store the averages (and not all points) 
@@ -25,7 +25,7 @@
 #include "TString.h"
 #include "TTree.h"
 
-class AliCaloRawStream;
+class AliCaloRawStreamV3;
 class AliCaloAltroMapping;
 class AliRawReader;
 class AliRawEventHeaderBase;
@@ -45,7 +45,7 @@ class AliCaloCalibSignal : public TObject {
   
   // Event processing methods:
   Bool_t ProcessEvent(AliRawReader *rawReader);
-  Bool_t ProcessEvent(AliCaloRawStream *in, AliRawEventHeaderBase *aliHeader); // added header for time info
+  Bool_t ProcessEvent(AliCaloRawStreamV3 *in, AliRawEventHeaderBase *aliHeader); // added header for time info
   Bool_t CheckFractionAboveAmp(int *AmpVal, int nTotChan); // check fraction of signals to check for LED events
 
   // Mapping handling
index cb14edda6a36f96ec6ce7a68be32675e332190e5..e779b2f5e9c578b7fea4cd3545ee072c41b823d6 100644 (file)
@@ -40,7 +40,7 @@
 
 #include "AliLog.h"
 #include "AliRawReader.h"
-#include "AliCaloRawStream.h"
+#include "AliCaloRawStreamV3.h"
 #include "AliEMCALCalibHistoProducer.h"
 
 ClassImp(AliEMCALCalibHistoProducer)
@@ -183,38 +183,31 @@ void AliEMCALCalibHistoProducer::Run()
   
 //   TH1F* gHighGain = 0;
 //   TH1F* gLowGain = 0;
-  Int_t iBin = 0;
+  char hname[128];
   Int_t iEvent = 0;
   Int_t runNum = 0;
   Int_t nProfFreq = 1000; //Number of events with which a bin of the TProfile if filled
   Int_t nEvtBins = 1000; //Total number of the profile survey bins.
 
-  AliCaloRawStream in(fRawReader,"EMCAL");
+  AliCaloRawStreamV3 in(fRawReader,"EMCAL");
 
   // Read raw data event by event
 
   while (fRawReader->NextEvent()) {
     runNum = fRawReader->GetRunNumber();
-    Float_t energy = 0;
-     while ( in.Next() ) { 
 
-      if(fSMInstalled[in.GetModule()]==kFALSE) continue;
-       
-      if (in.GetSignal() > energy) {
-       energy = (Double_t) in.GetSignal();
-      }    
+    while (in.NextDDL()) {
+      while (in.NextChannel()) {
 
-      iBin++;
+       if(fSMInstalled[in.GetModule()]==kFALSE) continue;
 
-      if(iBin==in.GetTimeLength()) {
-       iBin=0;
-           
+       // indices
        Int_t mod = in.GetModule();
        Int_t col = in.GetColumn();
        Int_t row = in.GetRow();
        Int_t evtbin = iEvent/nProfFreq;
-       char hname[128];
-
+       Bool_t HighGainFlag = in.IsHighGain();
+       
        //Check if histogram/profile already exist, if not create it.
        if(!fAmpHisto[mod][col][row]) {
          sprintf(hname,"mod%dcol%drow%d",mod,col,row);
@@ -224,14 +217,23 @@ void AliEMCALCalibHistoProducer::Run()
          sprintf(hname,"mod%d",mod);
          fAmpProf[mod] = new TProfile(hname,hname,nEvtBins,0.,nEvtBins);
        }
+       
+       // loop over samples
+       Int_t maxSample = 0;
+       while (in.NextBunch()) {
+         const UShort_t *sig = in.GetSignals();
+         for (Int_t i = 0; i < in.GetBunchLength(); i++) {
+           if (sig[i] > maxSample) maxSample = sig[i];
+         }
+       } // bunches
+       
        //Fill histogram/profile 
-       Bool_t lowGainFlag = in.IsLowGain();
-       if(!lowGainFlag) {
-         fAmpHisto[mod][col][row]->Fill(energy);
-         fAmpProf[mod]->Fill(evtbin, energy);
+       if(HighGainFlag) {
+         fAmpHisto[mod][col][row]->Fill(maxSample);
+         fAmpProf[mod]->Fill(evtbin, maxSample);
        }
-      }
-    }
+      } // channels
+    } // DDL's
 
     // update histograms in local file every 100th event
     if(iEvent%fUpdatingRate == 0) {
index f7f2d7e2c2fcf8257820bd37e303509a5e158133..62d4b1537c56d948580b628f31da5c096a804012 100644 (file)
@@ -44,7 +44,7 @@ Authors:  J.Klay (Cal Poly) May 2008
 #include "AliEMCALReconstructor.h"
 #include "AliEMCALRecParam.h"
 #include "AliRawReader.h"
-#include "AliCaloRawStream.h"
+#include "AliCaloRawStreamV3.h"
 
 ClassImp(AliEMCALQADataMakerRec)
            
@@ -257,7 +257,7 @@ void AliEMCALQADataMakerRec::MakeRaws(AliRawReader* rawReader)
     InitRaws() ;
 
   rawReader->Reset() ;
-  AliCaloRawStream in(rawReader,"EMCAL"); 
+  AliCaloRawStreamV3 in(rawReader,"EMCAL"); 
 
   // setup
   int nTowersPerSM = 1152; // number of towers in a SuperModule; 24x48
@@ -281,35 +281,49 @@ void AliEMCALQADataMakerRec::MakeRaws(AliRawReader* rawReader)
   int time = 0;
   // counters, on sample level
   int i = 0; // the sample number in current event.
-  int max = sampleMin, min = sampleMax;//Use these for picking the pedestal
   int maxTime = 0;
+  int startBin = 0;
 
-  // for the pedestal calculation
-  int sampleSum = 0; // sum of samples
-  int squaredSampleSum = 0; // sum of samples squared
-  int nSum = 0; // number of samples in sum
   // calc. quantities
   double meanPed = 0, squaredMean = 0, rmsPed = 0;
-  
-  while (in.Next()) { // loop over input stream
-    sample = in.GetSignal(); //Get the adc signal
-    time = in.GetTime();
-    if (sample < min) { min = sample; }
-    if (sample > max) { 
-      max = sample;
-      maxTime = time;
-    }
-    i++;
-
-    // should we add it for the pedestal calculation?
-    if ( (firstPedestalSample<=time && time<=lastPedestalSample) || // sample time in range
-        !selectPedestalSamples ) { // or we don't restrict the sample range.. - then we'll take all 
-      sampleSum += sample;
-      squaredSampleSum += sample*sample;
-      nSum++;
-    }
-
-    if ( i >= in.GetTimeLength()) {
+
+  // start loop over input stream  
+  while (in.NextDDL()) {
+    while (in.NextChannel()) {
+
+      // counters
+      int max = sampleMin, min = sampleMax; // min and max sample values
+      
+      // for the pedestal calculation
+      int sampleSum = 0; // sum of samples
+      int squaredSampleSum = 0; // sum of samples squared
+      int nSum = 0; // number of samples in sum
+      
+      while (in.NextBunch()) {
+       const UShort_t *sig = in.GetSignals();
+       startBin = in.GetStartTimeBin();
+       for (i = 0; i < in.GetBunchLength(); i++) {
+         sample = sig[i];
+         time = startBin--;
+
+         // check if it's a min or max value
+         if (sample < min) min = sample;
+         if (sample > max) {
+           max = sample;
+           maxTime = time;
+         }
+
+         // should we add it for the pedestal calculation?
+         if ( (firstPedestalSample<=time && time<=lastPedestalSample) || // sample time in range
+              !selectPedestalSamples ) { // or we don't restrict the sample range.. - then we'll take all 
+           sampleSum += sample;
+           squaredSampleSum += sample*sample;
+           nSum++;
+         }
+         
+       } // loop over samples in bunch
+      } // loop over bunches
+
       // calculate pedesstal estimate: mean of possibly selected samples
       if (nSum > 0) {
        meanPed = sampleSum / (1.0 * nSum);
@@ -332,6 +346,7 @@ void AliEMCALQADataMakerRec::MakeRaws(AliRawReader* rawReader)
        gain = 1;
       }
       
+      // it should be enough to check the SuperModule info for each DDL really, but let's keep it here for now
       iSM = in.GetModule(); //The modules are numbered starting from 0
 
       if (iSM>=0 && iSM<fSuperModules) { // valid module reading, can go on with filling
@@ -360,18 +375,9 @@ void AliEMCALQADataMakerRec::MakeRaws(AliRawReader* rawReader)
        }
       } // SM index OK
 
-      // reset counters
-      max = sampleMin; min = sampleMax;
-      maxTime = 0;
-      i = 0;
-      // also pedestal calc counters
-      sampleSum = 0; // sum of samples
-      squaredSampleSum = 0; // sum of samples squared
-      nSum = 0; // number of samples in sum
-    
-    }//End if, of channel
+    }// end while over channel 
    
-  }//end while, of stream
+  }//end while over DDL's, of input stream 
 
   // let's also fill the SM and event counter histograms
   int nTotalHG = 0;
index 6c9032d694fc9f2b0c2580b8cece433641e4da61..bb0eb00063e9539f3716df8b83af5175e9b51e23 100644 (file)
@@ -38,7 +38,7 @@ class AliLog;
 class AliCaloAltroMapping;
 #include "AliAltroBuffer.h"
 #include "AliRawReader.h"
-#include "AliCaloRawStream.h"
+#include "AliCaloRawStreamV3.h"
 #include "AliDAQ.h"
   
 #include "AliEMCALRecParam.h"
@@ -297,7 +297,7 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr)
     return;
   }
 
-  AliCaloRawStream in(reader,"EMCAL",fMapping);
+  AliCaloRawStreamV3 in(reader,"EMCAL",fMapping);
   // Select EMCAL DDL's;
   reader->Select("EMCAL");
 
@@ -317,69 +317,72 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr)
   Int_t id =  -1;
   Float_t time = 0. ; 
   Float_t amp = 0. ; 
+  Int_t i = 0;
+  Int_t startBin = 0;
 
   //Graph to hold data we will fit (should be converted to an array
   //later to speed up processing
   TGraph * gSig = new TGraph(GetRawFormatTimeBins()); 
 
-  Int_t readOk = 1;
   Int_t lowGain = 0;
   Int_t caloFlag = 0; // low, high gain, or TRU, or LED ref.
 
-  while (readOk && in.GetModule() < 0) 
-    readOk = in.Next();  // Go to first digit
-
-  while (readOk) { 
-
-    id =  fGeom->GetAbsCellIdFromCellIndexes(in.GetModule(), in.GetRow(), in.GetColumn()) ;
-    caloFlag = in.GetCaloFlag();
-    lowGain = in.IsLowGain();
-    Int_t maxTime = in.GetTime();  // timebins come in reverse order
-    if (maxTime < 0 || maxTime >= GetRawFormatTimeBins()) {
-      AliWarning(Form("Invalid time bin %d",maxTime));
-      maxTime = GetRawFormatTimeBins();
-    }
-    gSig->Set(maxTime+1);
-    // There is some kind of zero-suppression in the raw data, 
-    // so set up the TGraph in advance
-    for (Int_t i=0; i < maxTime; i++) {
-      gSig->SetPoint(i, i , 0);
-    }
-
-    Int_t iTime = 0;
-    do {
-      if (in.GetTime() >= gSig->GetN()) {
-         AliWarning("Too many time bins");
-         gSig->Set(in.GetTime());
-      }
+  // start loop over input stream 
+  while (in.NextDDL()) {
+    while (in.NextChannel()) {
       
-      gSig->SetPoint(in.GetTime(), in.GetTime(), in.GetSignal()) ;
-
-      if (in.GetTime() > maxTime)
-        maxTime = in.GetTime();
-      iTime++;
-    } while ((readOk = in.Next()) && !in.IsNewHWAddress());
-
-    FitRaw(gSig, signalF, amp, time) ; 
+      id =  fGeom->GetAbsCellIdFromCellIndexes(in.GetModule(), in.GetRow(), in.GetColumn()) ;
+      caloFlag = in.GetCaloFlag();
+      lowGain = in.IsLowGain();
+
+      // There can be zero-suppression in the raw data, 
+      // so set up the TGraph in advance
+      for (i=0; i < GetRawFormatTimeBins(); i++) {
+       gSig->SetPoint(i, i , 0);
+      }
+      Int_t maxTime = 0;
+
+      while (in.NextBunch()) {
+       const UShort_t *sig = in.GetSignals();
+       startBin = in.GetStartTimeBin();
+
+       if (maxTime < in.GetStartTimeBin()) {
+         maxTime = in.GetStartTimeBin(); // timebins come in reverse order
+       }
+
+       if (maxTime < 0 || maxTime >= GetRawFormatTimeBins()) {
+         AliWarning(Form("Invalid time bin %d",maxTime));
+         maxTime = GetRawFormatTimeBins();
+       }
+
+       for (i = 0; i < in.GetBunchLength(); i++) {
+         time = startBin--;
+         gSig->SetPoint(time, time, sig[i]) ;
+       }
+      } // loop over bunches
+    
+      gSig->Set(maxTime+1);
+      FitRaw(gSig, signalF, amp, time) ; 
     
-    if (caloFlag == 0 || caloFlag == 1) { // low gain or high gain 
-      if (amp > 0 && amp < 2000) {  //check both high and low end of
+      if (caloFlag == 0 || caloFlag == 1) { // low gain or high gain 
+       if (amp > 0 && amp < 2000) {  //check both high and low end of
        //result, 2000 is somewhat arbitrary - not nice with magic numbers in the code..
-       AliDebug(2,Form("id %d lowGain %d amp %g", id, lowGain, amp));
+         AliDebug(2,Form("id %d lowGain %d amp %g", id, lowGain, amp));
        
-       AddDigit(digitsArr, id, lowGain, (Int_t)amp, time);
-      }
+         AddDigit(digitsArr, id, lowGain, (Int_t)amp, time);
+       }
        
-    }
+      }
 
-    // Reset graph
-    for (Int_t index = 0; index < gSig->GetN(); index++) {
-      gSig->SetPoint(index, index, 0) ;  
-    } 
-    // Reset starting parameters for fit function
-    signalF->SetParameters(10.,0.,fTau,fOrder,5.); //reset all defaults just to be safe
+      // Reset graph
+      for (Int_t index = 0; index < gSig->GetN(); index++) {
+       gSig->SetPoint(index, index, 0) ;  
+      
+      // Reset starting parameters for fit function
+      signalF->SetParameters(10.,0.,fTau,fOrder,5.); //reset all defaults just to be safe
 
-  }; // EMCAL entries loop
+   } // end while over channel   
+  } //end while over DDL's, of input stream 
   
   delete signalF ; 
   delete gSig;
index 36964b49fc95f05db266ea96be998a0dcddd938f..ac7c45bf98bee18fa5d58a7ac404903fd25cdb68 100644 (file)
@@ -19,8 +19,8 @@
 //
 #include "TObject.h" // for ROOT types
 #include <TString.h>
-//#include "AliCaloRawStream.h"
-class AliCaloRawStream;
+//#include "AliCaloRawStreamV3.h"
+class AliCaloRawStreamV3;
 class AliAltroMapping;
 class TGraph;
 class TF1;
index cb2fc0e268f5dc1dd02c29a29e57a64c342c99fa..60c7febd3ded4ccfd14c1e5ca41a9d4a5d099aaf 100644 (file)
@@ -46,7 +46,7 @@ extern "C" {
 #include "AliRawReader.h"
 #include "AliRawReaderDate.h"
 #include "AliRawEventHeaderBase.h"
-#include "AliCaloRawStream.h"
+#include "AliCaloRawStreamV3.h"
 #include "AliCaloAltroMapping.h"
 #include "AliLog.h"
 
@@ -63,7 +63,7 @@ extern "C" {
 
 int main(int argc, char **argv) {
 
-  AliLog::SetClassDebugLevel("AliCaloRawStream",-5);
+  AliLog::SetClassDebugLevel("AliCaloRawStreamV3",-5);
   AliLog::SetClassDebugLevel("AliRawReaderDate",-5);
   AliLog::SetModuleDebugLevel("RAW",-5);
 
index 02f09ca71371b5e0dd83d82cd0648b58786c9297..593dce7391f11277202837bbcac35537843b3f56 100644 (file)
@@ -50,7 +50,7 @@ extern "C" {
 #include "AliRawReader.h"
 #include "AliRawReaderDate.h"
 #include "AliRawEventHeaderBase.h"
-#include "AliCaloRawStream.h"
+#include "AliCaloRawStreamV3.h"
 #include "AliCaloAltroMapping.h"
 #include "AliLog.h"
 
@@ -66,7 +66,7 @@ extern "C" {
 
 int main(int argc, char **argv) {
 
-  AliLog::SetClassDebugLevel("AliCaloRawStream",-5);
+  AliLog::SetClassDebugLevel("AliCaloRawStreamV3",-5);
   AliLog::SetClassDebugLevel("AliRawReaderDate",-5);
   AliLog::SetModuleDebugLevel("RAW",-5);