]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EMCAL/AliEMCALRawUtils.cxx
add histogram with shower shape of cluster before the split cluster selection
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALRawUtils.cxx
index 1710d51322a1082fdc73ebd0086022aee7a74f0d..3b70379d44ddc850c7b284c75799f9b3116517b9 100644 (file)
@@ -29,6 +29,7 @@
 //*-- Author: Marco van Leeuwen (LBL)
 //*-- Major refactoring by Per Thomas Hille
 
+//#include "AliCDBManager.h"
 #include "AliEMCALRawUtils.h"
 #include "AliRun.h"
 #include "AliRunLoader.h"
@@ -56,6 +57,7 @@
 using namespace CALO;
 using namespace EMCAL;
 
+using std::vector;
 ClassImp(AliEMCALRawUtils)
 
 
@@ -70,7 +72,7 @@ AliEMCALRawUtils::AliEMCALRawUtils( Algo::fitAlgorithm fitAlgo) : fNoiseThreshol
                                                                  fUseFALTRO(kTRUE),
                                                                  fRawAnalyzer(0),
                                                                  fTriggerRawDigitMaker(0x0)
-{
+{ // ctor; set up fit algo etc
   SetFittingAlgorithm(fitAlgo);
   const TObjArray* maps = AliEMCALRecParam::GetMappings();
   if(!maps) AliFatal("Cannot retrieve ALTRO mappings!!");
@@ -107,6 +109,8 @@ AliEMCALRawUtils::AliEMCALRawUtils( Algo::fitAlgorithm fitAlgo) : fNoiseThreshol
 AliEMCALRawUtils::~AliEMCALRawUtils() 
 {
   //dtor
+  delete fRawAnalyzer;
+  delete fTriggerRawDigitMaker;
 }
 
 
@@ -124,7 +128,7 @@ void AliEMCALRawUtils::Digits2Raw()
     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
+  static const Int_t nDDL = 20*2; // 20 SM for EMCal + DCal 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++)
     buffers[i] = 0;
@@ -133,59 +137,52 @@ void AliEMCALRawUtils::Digits2Raw()
   TArrayI adcValuesHigh( TIMEBINS );
   
   // loop over digits (assume ordered digits)
-  for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) 
-    {
-      AliEMCALDigit* digit = dynamic_cast<AliEMCALDigit *>(digits->At(iDigit)) ;
-      if(!digit)
-       {
-         AliFatal("NULL Digit");
-       }
-      else
-       {
-         if (digit->GetAmplitude() <  AliEMCALRawResponse::GetRawFormatThreshold() ) 
-           {
-             continue;
-           }
-         //get cell indices
-         Int_t nSM = 0;
-         Int_t nIphi = 0;
-         Int_t nIeta = 0;
-         Int_t iphi = 0;
-         Int_t ieta = 0;
-         Int_t nModule = 0;
-         fGeom->GetCellIndex(digit->GetId(), nSM, nModule, nIphi, nIeta);
-         fGeom->GetCellPhiEtaIndexInSModule(nSM, nModule, nIphi, nIeta,iphi, ieta) ;
+  for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
+    AliEMCALDigit* digit = dynamic_cast<AliEMCALDigit *>(digits->At(iDigit)) ;
+    if(!digit) {
+      AliFatal("NULL Digit");
+    } else {
+      if (digit->GetAmplitude() <  AliEMCALRawResponse::GetRawFormatThreshold() ) {
+        continue;
+      }
+      //get cell indices
+      Int_t nSM = 0;
+      Int_t nIphi = 0;
+      Int_t nIeta = 0;
+      Int_t iphi = 0;
+      Int_t ieta = 0;
+      Int_t nModule = 0;
+      fGeom->GetCellIndex(digit->GetId(), nSM, nModule, nIphi, nIeta);
+      fGeom->GetCellPhiEtaIndexInSModule(nSM, nModule, nIphi, nIeta,iphi, ieta) ;
+    
+      //Check which is the RCU, 0 or 1, of the cell.
+      Int_t iRCU = -111;
+      if (0<=iphi&&iphi<8) iRCU=0; // first cable row
+      else if (8<=iphi&&iphi<16 && 0<=ieta&&ieta<24) iRCU=0; // first half; 
+      else if(8<=iphi&&iphi<16 && 24<=ieta&&ieta<48) iRCU=1; // second half; 
+      //second cable row
+      else if(16<=iphi&&iphi<24) iRCU=1; // third cable row
       
-         //Check which is the RCU, 0 or 1, of the cell.
-         Int_t iRCU = -111;
-         if (0<=iphi&&iphi<8) iRCU=0; // first cable row
-         else if (8<=iphi&&iphi<16 && 0<=ieta&&ieta<24) iRCU=0; // first half; 
-         else if(8<=iphi&&iphi<16 && 24<=ieta&&ieta<48) iRCU=1; // second half; 
-         //second cable row
-         else if(16<=iphi&&iphi<24) iRCU=1; // third cable row
-         
-         if (nSM%2==1) iRCU = 1 - iRCU; // swap for odd=C side, to allow us to cable both sides the same
-         
-         if (iRCU<0) 
-           Fatal("Digits2Raw()","Non-existent RCU number: %d", iRCU);
+      if (nSM%2==1) iRCU = 1 - iRCU; // swap for odd=C side, to allow us to cable both sides the same
       
-         //Which DDL?
-         Int_t iDDL = NRCUSPERMODULE*nSM + iRCU;
-         if (iDDL < 0 || iDDL >= nDDL){
-           Fatal("Digits2Raw()","Non-existent DDL board number: %d", iDDL);
-         }
-         else{
-           if (buffers[iDDL] == 0) 
-             {      
-               // open new file and write dummy header
-               TString fileName = AliDAQ::DdlFileName("EMCAL",iDDL);
-               //Select mapping file RCU0A, RCU0C, RCU1A, RCU1C
+      if (iRCU<0) 
+        Fatal("Digits2Raw()","Non-existent RCU number: %d", iRCU);
+    
+      //Which DDL?
+      Int_t iDDL = NRCUSPERMODULE*nSM + iRCU;
+      if (iDDL < 0 || iDDL >= nDDL){
+        Fatal("Digits2Raw()","Non-existent DDL board number: %d", iDDL);
+      } else {
+        if (buffers[iDDL] == 0) {      
+          // open new file and write dummy header
+          TString fileName = AliDAQ::DdlFileName("EMCAL",iDDL);
+          //Select mapping file RCU0A, RCU0C, RCU1A, RCU1C
           Int_t iRCUside=iRCU+(nSM%2)*2;
           //iRCU=0 and even (0) SM -> RCU0A.data   0
           //iRCU=1 and even (0) SM -> RCU1A.data   1
           //iRCU=0 and odd  (1) SM -> RCU0C.data   2
           //iRCU=1 and odd  (1) SM -> RCU1C.data   3
-         buffers[iDDL] = new AliAltroBuffer(fileName.Data(),fMapping[iRCUside]);
+          buffers[iDDL] = new AliAltroBuffer(fileName.Data(),fMapping[iRCUside]);
           buffers[iDDL]->WriteDataHeader(kTRUE, kFALSE);  //Dummy;
         }
         
@@ -198,10 +195,10 @@ void AliEMCALRawUtils::Digits2Raw()
           buffers[iDDL]->WriteTrailer(3, ieta, iphi, nSM);  // trailer
           // calculate the time response function
         } else {
-          Bool_t lowgain = AliEMCALRawResponse::RawSampledResponse(digit->GetTimeR(), digit->GetAmplitude(), 
-                                                                  adcValuesHigh.GetArray(), adcValuesLow.GetArray()) ; 
-         
-         if (lowgain) 
+          Bool_t lowgain = AliEMCALRawResponse::RawSampledResponse(digit->GetTimeR(), digit->GetAmplitude(),
+                                                                   adcValuesHigh.GetArray(), adcValuesLow.GetArray()) ; 
+      
+          if (lowgain) 
             buffers[iDDL]->WriteChannel(ieta, iphi, 0, TIMEBINS, adcValuesLow.GetArray(),  AliEMCALRawResponse::GetRawFormatThreshold()  );
           else 
             buffers[iDDL]->WriteChannel(ieta,iphi, 1, TIMEBINS, adcValuesHigh.GetArray(),  AliEMCALRawResponse::GetRawFormatThreshold()  );
@@ -287,7 +284,7 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
   if (!reader) {Error("Raw2Digits", "no raw reader found !");return;}
   AliEMCALTriggerSTURawStream inSTU(reader);
   AliCaloRawStreamV3 in(reader,"EMCAL",fMapping);      
-  reader->Select("EMCAL",0,43); // 43 = AliEMCALGeoParams::fgkLastAltroDDL
+  reader->Select("EMCAL",0,39); // 39 = AliEMCALGeoParams::fgkLastAltroDDL
   fTriggerRawDigitMaker->Reset();      
   fTriggerRawDigitMaker->SetIO(reader, in, inSTU, digitsTRG, trgData);
   fRawAnalyzer->SetIsZeroSuppressed(true); // TMP - should use stream->IsZeroSuppressed(), or altro cfg registers later
@@ -295,6 +292,17 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
   Int_t lowGain  = 0;
   Int_t caloFlag = 0; // low, high gain, or TRU, or LED ref.
   
+  Float_t bcTimePhaseCorr = 0; // for BC-based L1 phase correction
+  Int_t bcMod4 = (reader->GetBCID() % 4); // LHC uses 40 MHz, EMCal uses 10 MHz clock
+       
+  //AliCDBManager* man = AliCDBManager::Instance();
+  //Int_t runNumber = man->GetRun();
+       
+ Int_t runNumber = reader->GetRunNumber();
+
+  if ((runNumber >130850 ) && (bcMod4==0 || bcMod4==1)) 
+    bcTimePhaseCorr = -1e-7; // subtract 100 ns for certain BC values
+
   while (in.NextDDL()) 
     {
       while (in.NextChannel()) 
@@ -319,7 +327,7 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
              AliCaloFitResults res =  fRawAnalyzer->Evaluate( bunchlist, in.GetAltroCFG1(), in.GetAltroCFG2());  
              if(res.GetAmp() >= fNoiseThreshold )
                {
-                 AddDigit(digitsArr, id, lowGain, res.GetAmp(),  res.GetTime(), res.GetChi2(),  res.GetNdf() ); 
+                 AddDigit(digitsArr, id, lowGain, res.GetAmp(),  res.GetTime()+bcTimePhaseCorr, res.GetChi2(),  res.GetNdf() ); 
                }
            }//ALTRO
          else if(fUseFALTRO)
@@ -334,7 +342,7 @@ void AliEMCALRawUtils::Raw2Digits(AliRawReader* reader,TClonesArray *digitsArr,
 
 
 void AliEMCALRawUtils::TrimDigits(TClonesArray *digitsArr) 
-{
+{ // rm entries with LGnoHG (unphysical), out of time window, and too bad chi2
   AliEMCALDigit *digit = 0;
   Int_t n = 0;
   Int_t nDigits = digitsArr->GetEntriesFast();
@@ -364,7 +372,8 @@ void AliEMCALRawUtils::TrimDigits(TClonesArray *digitsArr)
 
 
 void AliEMCALRawUtils::SetFittingAlgorithm(Int_t fitAlgo)              
-{
+{ // select which fitting algo should be used
+  delete fRawAnalyzer; // delete doesn't do anything if the pointer is 0x0
   fRawAnalyzer = AliCaloRawAnalyzerFactory::CreateAnalyzer( fitAlgo );
   fRawAnalyzer->SetNsampleCut(5); // requirement for fits to be done, for the new methods
   fRawAnalyzer->SetOverflowCut ( OVERFLOWCUT );