//*-- Author: Marco van Leeuwen (LBL)
//*-- Major refactoring by Per Thomas Hille
+//#include "AliCDBManager.h"
#include "AliEMCALRawUtils.h"
#include "AliRun.h"
#include "AliRunLoader.h"
using namespace CALO;
using namespace EMCAL;
+using std::vector;
ClassImp(AliEMCALRawUtils)
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!!");
AliEMCALRawUtils::~AliEMCALRawUtils()
{
//dtor
+ delete fRawAnalyzer;
+ delete fTriggerRawDigitMaker;
}
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;
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;
}
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() );
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
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())
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)
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();
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 );