]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EMCAL/AliEMCALRawUtils.cxx
added check on high end of amplitudes from fit to solve problem of crashes when the...
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALRawUtils.cxx
index 2a1770406014e2b2fa916e806235c49529f5fa3a..de2633d2ba15f808d4942e4f076571a04408c86a 100644 (file)
@@ -56,6 +56,7 @@
 #include "TSystem.h"
 
 #include "AliLog.h"
+#include "AliRun.h"
 #include "AliRunLoader.h"
 #include "AliCaloAltroMapping.h"
 #include "AliAltroBuffer.h"
@@ -73,9 +74,7 @@
 ClassImp(AliEMCALRawUtils)
 
 // Signal shape parameters
-Int_t    AliEMCALRawUtils::fgOrder         = 2 ;      // Order of gamma function 
 Double_t AliEMCALRawUtils::fgTimeBinWidth  = 100E-9 ; // each sample is 100 ns
-Double_t AliEMCALRawUtils::fgTau         = 235E-9 ;   // 235 ns (from CERN testbeam; not very accurate)
 Double_t AliEMCALRawUtils::fgTimeTrigger = 1.5E-6 ;   // 15 time bins ~ 1.5 musec
 
 // some digitization constants
@@ -83,15 +82,84 @@ Int_t    AliEMCALRawUtils::fgThreshold = 1;
 Int_t    AliEMCALRawUtils::fgDDLPerSuperModule = 2;  // 2 ddls per SuperModule
 
 AliEMCALRawUtils::AliEMCALRawUtils()
-  : fHighLowGainFactor(0.), fOption("") 
+  : fHighLowGainFactor(0.), fOrder(0), fTau(0.), fNoiseThreshold(0),
+    fNPedSamples(0), fGeom(0), fOption("")
 {
+
+  //These are default parameters.  
+  //Can be re-set from without with setter functions
   fHighLowGainFactor = 16. ;          // adjusted for a low gain range of 82 GeV (10 bits) 
+  fOrder = 2;                         // order of gamma fn
+  fTau = 2.35;                        // in units of timebin, from CERN 2007 testbeam
+  fNoiseThreshold = 3;
+  fNPedSamples = 5;
+
+  //Get Mapping RCU files from the AliEMCALRecParam                                 
+  const TObjArray* maps = AliEMCALRecParam::GetMappings();
+  if(!maps) AliFatal("Cannot retrieve ALTRO mappings!!");
+
+  for(Int_t i = 0; i < 2; i++) {
+    fMapping[i] = (AliAltroMapping*)maps->At(i);
+  }
+
+  //To make sure we match with the geometry in a simulation file,
+  //let's try to get it first.  If not, take the default geometry
+  AliRunLoader *rl = AliRunLoader::GetRunLoader();
+  if (rl->GetAliRun() && rl->GetAliRun()->GetDetector("EMCAL")) {
+    fGeom = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"))->GetGeometry();
+  } else {
+    AliInfo(Form("Using default geometry in raw reco"));
+    fGeom =  AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaultGeometryName());
+  }
+
+  if(!fGeom) AliFatal(Form("Could not get geometry!"));
+
+}
+
+//____________________________________________________________________________
+AliEMCALRawUtils::AliEMCALRawUtils(const AliEMCALRawUtils& rawU)
+  : TObject(),
+    fHighLowGainFactor(rawU.fHighLowGainFactor), 
+    fOrder(rawU.fOrder),
+    fTau(rawU.fTau),
+    fNoiseThreshold(rawU.fNoiseThreshold),
+    fNPedSamples(rawU.fNPedSamples),
+    fGeom(rawU.fGeom), 
+    fOption(rawU.fOption)
+{
+  //copy ctor
+  fMapping[0] = rawU.fMapping[0];
+  fMapping[1] = rawU.fMapping[1];
 }
+
+//____________________________________________________________________________
+AliEMCALRawUtils& AliEMCALRawUtils::operator =(const AliEMCALRawUtils &rawU)
+{
+  //assignment operator
+
+  if(this != &rawU) {
+    fHighLowGainFactor = rawU.fHighLowGainFactor;
+    fOrder = rawU.fOrder;
+    fTau = rawU.fTau;
+    fNoiseThreshold = rawU.fNoiseThreshold;
+    fNPedSamples = rawU.fNPedSamples;
+    fGeom = rawU.fGeom;
+    fOption = rawU.fOption;
+    fMapping[0] = rawU.fMapping[0];
+    fMapping[1] = rawU.fMapping[1];
+  }
+
+  return *this;
+
+}
+
 //____________________________________________________________________________
 AliEMCALRawUtils::~AliEMCALRawUtils() {
+
 }
+
 //____________________________________________________________________________
-void AliEMCALRawUtils::Digits2Raw(AliAltroMapping **mapping)
+void AliEMCALRawUtils::Digits2Raw()
 {
   // convert digits of the current event to raw data
   
@@ -107,14 +175,7 @@ void AliEMCALRawUtils::Digits2Raw(AliAltroMapping **mapping)
     Warning("Digits2Raw", "no digits found !");
     return;
   }
-    
-  // get the geometry
-  AliEMCALGeometry* geom = AliEMCALGeometry::GetInstance();
-  if (!geom) {
-    AliError(Form("No geometry found !"));
-    return;
-  }
-  
+
   static const Int_t nDDL = 12*2; // 12 SM hardcoded for now. Buffers allocated dynamically, when needed, so just need an upper limit here
   AliAltroBuffer* buffers[nDDL];
   for (Int_t i=0; i < nDDL; i++)
@@ -136,8 +197,8 @@ void AliEMCALRawUtils::Digits2Raw(AliAltroMapping **mapping)
     Int_t iphi = 0;
     Int_t ieta = 0;
     Int_t nModule = 0;
-    geom->GetCellIndex(digit->GetId(), nSM, nModule, nIphi, nIeta);
-    geom->GetCellPhiEtaIndexInSModule(nSM, nModule, nIphi, nIeta,iphi, ieta) ;
+    fGeom->GetCellIndex(digit->GetId(), nSM, nModule, nIphi, nIeta);
+    fGeom->GetCellPhiEtaIndexInSModule(nSM, nModule, nIphi, nIeta,iphi, ieta) ;
     
     //Check which is the RCU of the cell.
     Int_t iRCU = -111;
@@ -160,7 +221,7 @@ void AliEMCALRawUtils::Digits2Raw(AliAltroMapping **mapping)
     if (buffers[iDDL] == 0) {      
       // open new file and write dummy header
       TString fileName = AliDAQ::DdlFileName("EMCAL",iDDL);
-      buffers[iDDL] = new AliAltroBuffer(fileName.Data(),mapping[iRCU]);
+      buffers[iDDL] = new AliAltroBuffer(fileName.Data(),fMapping[iRCU]);
       buffers[iDDL]->WriteDataHeader(kTRUE, kFALSE);  //Dummy;
     }
     
@@ -189,21 +250,14 @@ void AliEMCALRawUtils::Digits2Raw(AliAltroMapping **mapping)
       delete buffers[i];
     }
   }
-//PH   mapping[0]->Delete();
-//PH   mapping[1]->Delete();
+
   loader->UnloadDigits();
 }
 
 //____________________________________________________________________________
-void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr, 
-                                 AliAltroMapping **mapping)
+void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr)
 {
-  // convert raw data of the current event to digits
-  AliEMCALGeometry * geom = AliEMCALGeometry::GetInstance();
-  if (!geom) {
-    AliError(Form("No geometry found !"));
-    return;
-  }
+  // convert raw data of the current event to digits                                                                                     
 
   digitsArr->Clear(); 
 
@@ -216,7 +270,7 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
     return;
   }
 
-  AliCaloRawStream in(reader,"EMCAL",mapping);
+  AliCaloRawStream in(reader,"EMCAL",fMapping);
   // Select EMCAL DDL's;
   reader->Select("EMCAL");
 
@@ -233,11 +287,11 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
   //given raw signal being fit
 
   TF1 * signalF = new TF1("signal", RawResponseFunction, 0, GetRawFormatTimeBins(), 5);
-  signalF->SetParameters(10.,0.,2.35,2.,5.); //set all defaults once, just to be safe
+  signalF->SetParameters(10.,0.,fTau,fOrder,5.); //set all defaults once, just to be safe
   signalF->SetParNames("amp","t0","tau","N","ped");
-  signalF->SetParameter(2,2.35); // tau in units of time bin
+  signalF->SetParameter(2,fTau); // tau in units of time bin
   signalF->SetParLimits(2,2,-1);
-  signalF->SetParameter(3,2); // order
+  signalF->SetParameter(3,fOrder); // order
   signalF->SetParLimits(3,2,-1);
   
   Int_t id =  -1;
@@ -258,7 +312,7 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
   Int_t row = 0;
 
   while (readOk) { 
-    id =  geom->GetAbsCellIdFromCellIndexes(in.GetModule(), in.GetRow(), in.GetColumn()) ;
+    id =  fGeom->GetAbsCellIdFromCellIndexes(in.GetModule(), in.GetRow(), in.GetColumn()) ;
     lowGain = in.IsLowGain();
     Int_t maxTime = in.GetTime();  // timebins come in reverse order
     if (maxTime < 0 || maxTime >= GetRawFormatTimeBins()) {
@@ -289,7 +343,8 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
 
     FitRaw(gSig, signalF, amp, time) ; 
     
-    if (amp > 0) {
+    if (amp > 0 && amp < 10000) {  //check both high and low end of
+                                  //result, 10000 is somewhat arbitrary
       AliDebug(2,Form("id %d lowGain %d amp %g", id, lowGain, amp));
       //cout << "col " << col-40 << " row " << row-8 << " lowGain " << lowGain << " amp " << amp << endl;
       AddDigit(digitsArr, id, lowGain, (Int_t)amp, time);
@@ -300,7 +355,7 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
       gSig->SetPoint(index, index, 0) ;  
     } 
     // Reset starting parameters for fit function
-    signalF->SetParameters(10.,0.,2.35,2.,5.); //reset all defaults just to be safe
+    signalF->SetParameters(10.,0.,fTau,fOrder,5.); //reset all defaults just to be safe
 
   }; // EMCAL entries loop
   
@@ -334,14 +389,14 @@ void AliEMCALRawUtils::AddDigit(TClonesArray *digitsArr, Int_t id, Int_t lowGain
     new((*digitsArr)[idigit]) AliEMCALDigit( -1, -1, id, amp, time, idigit) ;  
   }
   else { // a digit already exists, check range 
-         // (use high gain if signal < 800, otherwise low gain)
+         // (use high gain if signal < cut value, otherwise low gain)
     if (lowGain) { // new digit is low gain
-      if (digit->GetAmp() > 800) {  // use if stored digit is out of range
+      if (digit->GetAmp() > fgkOverflowCut) {  // use if stored digit is out of range
        digit->SetAmp(Int_t(fHighLowGainFactor * amp));
        digit->SetTime(time);
       }
     }
-    else if (amp < 800) { // new digit is high gain; use if not out of range
+    else if (amp < fgkOverflowCut) { // new digit is high gain; use if not out of range
       digit->SetAmp(amp);
       digit->SetTime(time);
     }
@@ -353,13 +408,11 @@ void AliEMCALRawUtils::FitRaw(TGraph * gSig, TF1* signalF, Float_t & amp, Float_
 {
   // Fits the raw signal time distribution; from AliEMCALGetter 
 
-  const Int_t kNoiseThreshold = 5;
-  const Int_t kNPedSamples = 5;
   amp = time = 0. ; 
   Double_t ped = 0;
   Int_t nPed = 0;
 
-  for (Int_t index = 0; index < kNPedSamples; index++) {
+  for (Int_t index = 0; index < fNPedSamples; index++) {
     Double_t ttime, signal;
     gSig->GetPoint(index, ttime, signal) ; 
     if (signal > 0) {
@@ -383,14 +436,14 @@ void AliEMCALRawUtils::FitRaw(TGraph * gSig, TF1* signalF, Float_t & amp, Float_
   Int_t tmin_after_sig = gSig->GetN();
   Int_t n_ped_after_sig = 0;
 
-  for (Int_t i=kNPedSamples; i < gSig->GetN(); i++) {
+  for (Int_t i=fNPedSamples; i < gSig->GetN(); i++) {
     Double_t ttime, signal;
     gSig->GetPoint(i, ttime, signal) ; 
     if (!max_found && signal > max) {
       i_max = i;
       max = signal;
     }
-    else if ( max > ped + kNoiseThreshold ) {
+    else if ( max > ped + fNoiseThreshold ) {
       max_found = 1;
       min_after_sig = signal;
       tmin_after_sig = i;
@@ -404,7 +457,7 @@ void AliEMCALRawUtils::FitRaw(TGraph * gSig, TF1* signalF, Float_t & amp, Float_
         max_fit = tmin_after_sig;
         break;
       }
-      if ( signal < ped + kNoiseThreshold)
+      if ( signal < ped + fNoiseThreshold)
         n_ped_after_sig++;
       if (n_ped_after_sig >= 5) {  // include 5 pedestal bins after peak
         max_fit = i;
@@ -413,7 +466,7 @@ void AliEMCALRawUtils::FitRaw(TGraph * gSig, TF1* signalF, Float_t & amp, Float_
     }
   }
 
-  if ( max - ped > kNoiseThreshold ) { // else its noise 
+  if ( max - ped > fNoiseThreshold ) { // else its noise 
     AliDebug(2,Form("Fitting max %d ped %d", max, ped));
     signalF->SetRange(0,max_fit);
 
@@ -470,7 +523,6 @@ const Double_t dtime, const Double_t damp, Int_t * adcH, Int_t * adcL) const
   // for a start time dtime and an amplitude damp given by digit, 
   // calculates the raw sampled response AliEMCAL::RawResponseFunction
 
-  const Int_t kRawSignalOverflow = 0x3FF ; 
   const Int_t pedVal = 32;
   Bool_t lowGain = kFALSE ; 
 
@@ -483,24 +535,24 @@ const Double_t dtime, const Double_t damp, Int_t * adcH, Int_t * adcL) const
   TF1 signalF("signal", RawResponseFunction, 0, GetRawFormatTimeMax(), 5);
   signalF.SetParameter(0, damp) ; 
   signalF.SetParameter(1, dtime + fgTimeTrigger) ; 
-  signalF.SetParameter(2, fgTau) ; 
-  signalF.SetParameter(3, fgOrder);
+  signalF.SetParameter(2, fTau) ; 
+  signalF.SetParameter(3, fOrder);
   signalF.SetParameter(4, pedVal);
 
   for (Int_t iTime = 0; iTime < GetRawFormatTimeBins(); iTime++) {
     Double_t time = iTime * GetRawFormatTimeBinWidth() ;
     Double_t signal = signalF.Eval(time) ;     
     adcH[iTime] =  static_cast<Int_t>(signal + 0.5) ;
-    if ( adcH[iTime] > kRawSignalOverflow ){  // larger than 10 bits 
-      adcH[iTime] = kRawSignalOverflow ;
+    if ( adcH[iTime] > fgkRawSignalOverflow ){  // larger than 10 bits 
+      adcH[iTime] = fgkRawSignalOverflow ;
       lowGain = kTRUE ; 
     }
 
     signal /= fHighLowGainFactor;
 
     adcL[iTime] =  static_cast<Int_t>(signal + 0.5) ;
-    if ( adcL[iTime] > kRawSignalOverflow)  // larger than 10 bits 
-      adcL[iTime] = kRawSignalOverflow ;
+    if ( adcL[iTime] > fgkRawSignalOverflow)  // larger than 10 bits 
+      adcL[iTime] = fgkRawSignalOverflow ;
   }
   return lowGain ; 
 }