#include "AliPHOSPulseGenerator.h"
#include "AliRunLoader.h"
#include "AliStack.h"
-#include "AliCaloRawStream.h"
+#include "AliPHOSRawDecoder.h"
#include "AliRawReaderFile.h"
#include "AliLog.h"
#include "AliCDBLocal.h"
#include "AliCDBStorage.h"
#include "AliCDBManager.h"
+#include "AliPHOSRawDigiProducer.h"
+#include "AliPHOSReconstructor.h"
+#include "AliPHOSRecoParam.h"
ClassImp(AliPHOSGetter)
}
}
else {
- AliRunLoader * rl = AliRunLoader::GetRunLoader(fgPhosLoader->GetTitle()) ;
+ rl = AliRunLoader::GetRunLoader(fgPhosLoader->GetTitle()) ;
if ( strstr(version, AliConfig::GetDefaultEventFolderName()) ) // false in case of merging
delete rl ;
fgObjGetter = new AliPHOSGetter(alirunFileName, version, openingOption) ;
return rv ;
}
-//____________________________________________________________________________
-AliPHOSGeometry * AliPHOSGetter::PHOSGeometry() const
-{
- // Returns PHOS geometry
-
- AliPHOSGeometry * rv = 0 ;
- if (PHOS() )
- rv = PHOS()->GetGeometry() ;
- else {
- rv = AliPHOSGeometry::GetInstance();
- if (!rv) {
- AliError("Could not find PHOS geometry! Loading the default one !");
- rv = AliPHOSGeometry::GetInstance("IHEP","");
- }
- }
- return rv ;
-}
-
//____________________________________________________________________________
TClonesArray * AliPHOSGetter::Primaries()
{
energy = 0. ;
// Create a shaper pulse object which contains all the shaper parameters
- AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
+ AliPHOSPulseGenerator pulse;
if (lowGainFlag) {
timezero1 = timezero2 = signalmax = timemax = 0. ;
- signalF->FixParameter(0, pulse->GetRawFormatLowCharge()) ;
- signalF->FixParameter(1, pulse->GetRawFormatLowGain()) ;
+ signalF->FixParameter(0, pulse.GetRawFormatLowCharge()) ;
+ signalF->FixParameter(1, pulse.GetRawFormatLowGain()) ;
Int_t index ;
- for (index = 0; index < pulse->GetRawFormatTimeBins(); index++) {
+ for (index = 0; index < pulse.GetRawFormatTimeBins(); index++) {
gLowGain->GetPoint(index, time, signal) ;
if (signal > kNoiseThreshold && timezero1 == 0.)
timezero1 = time ;
}
}
signalmax /=
- pulse->RawResponseFunctionMax(pulse->GetRawFormatLowCharge(),
- pulse->GetRawFormatLowGain()) ;
- if ( timezero1 + pulse->GetRawFormatTimePeak() < pulse->GetRawFormatTimeMax() * 0.4 ) { // else its noise
+ pulse.RawResponseFunctionMax(pulse.GetRawFormatLowCharge(),
+ pulse.GetRawFormatLowGain()) ;
+ if ( timezero1 + pulse.GetRawFormatTimePeak() < pulse.GetRawFormatTimeMax() * 0.4 ) { // else its noise
signalF->SetParameter(2, signalmax) ;
signalF->SetParameter(3, timezero1) ;
gLowGain->Fit(signalF, "QRO", "", 0., timezero2); //, "QRON") ;
energy = signalF->GetParameter(2) ;
- time = signalF->GetMaximumX() - pulse->GetRawFormatTimePeak() - pulse->GetRawFormatTimeTrigger() ;
+ time = signalF->GetMaximumX() - pulse.GetRawFormatTimePeak() - pulse.GetRawFormatTimeTrigger() ;
}
} else {
timezero1 = timezero2 = signalmax = timemax = 0. ;
- signalF->FixParameter(0, pulse->GetRawFormatHighCharge()) ;
- signalF->FixParameter(1, pulse->GetRawFormatHighGain()) ;
+ signalF->FixParameter(0, pulse.GetRawFormatHighCharge()) ;
+ signalF->FixParameter(1, pulse.GetRawFormatHighGain()) ;
Int_t index ;
- for (index = 0; index < pulse->GetRawFormatTimeBins(); index++) {
+ for (index = 0; index < pulse.GetRawFormatTimeBins(); index++) {
gHighGain->GetPoint(index, time, signal) ;
if (signal > kNoiseThreshold && timezero1 == 0.)
timezero1 = time ;
timemax = time ;
}
}
- signalmax /= pulse->RawResponseFunctionMax(pulse->GetRawFormatHighCharge(),
- pulse->GetRawFormatHighGain()) ;;
- if ( timezero1 + pulse->GetRawFormatTimePeak() < pulse->GetRawFormatTimeMax() * 0.4 ) { // else its noise
+ signalmax /= pulse.RawResponseFunctionMax(pulse.GetRawFormatHighCharge(),
+ pulse.GetRawFormatHighGain()) ;;
+ if ( timezero1 + pulse.GetRawFormatTimePeak() < pulse.GetRawFormatTimeMax() * 0.4 ) { // else its noise
signalF->SetParameter(2, signalmax) ;
signalF->SetParameter(3, timezero1) ;
gHighGain->Fit(signalF, "QRO", "", 0., timezero2) ;
energy = signalF->GetParameter(2) ;
- time = signalF->GetMaximumX() - pulse->GetRawFormatTimePeak() - pulse->GetRawFormatTimeTrigger() ;
+ time = signalF->GetMaximumX() - pulse.GetRawFormatTimePeak() - pulse.GetRawFormatTimeTrigger() ;
}
}
if (time == 0) energy = 0 ;
// Reimplemented by Boris Polichtchouk (Jul 2006)
// to make it working with the Jul-Aug 2006 beam test data.
- AliCaloRawStream in(rawReader,"PHOS");
- in.SetOldRCUFormat(isOldRCUFormat);
-
- // Create a shaper pulse object
- AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
- TF1 * signalF = new TF1("signal", AliPHOSPulseGenerator::RawResponseFunction, 0, pulse->GetRawFormatTimeMax(), 4);
- signalF->SetParNames("Charge", "Gain", "Amplitude", "TimeZero") ;
+ //Create raw decoder.
- Int_t relId[4], absId =0;
- Bool_t lowGainFlag = kFALSE ;
+ AliPHOSRawDecoder dc(rawReader);
+ dc.SetOldRCUFormat(isOldRCUFormat);
+ dc.SubtractPedestals(AliPHOSReconstructor::GetRecoParamEmc()->SubtractPedestals());
TClonesArray * digits = Digits() ;
- digits->Clear() ;
-
- Int_t iBin = 0;
- Int_t iDigit = 0 ;
- Double_t energyHG = 0. ;
- Double_t energyLG = 0. ;
- Double_t time = 0. ;
- Int_t iOldDigit;
- Bool_t seen;
- TH1F* hLowGain = 0;
- TH1F* hHighGain = 0;
-
- while ( in.Next() ) { // PHOS entries loop
-
- lowGainFlag = in.IsLowGain();
-
- // (Re)create histograms to store samples
-
- if (lowGainFlag) {
- if(!hLowGain)
- hLowGain = new TH1F("hLowGain","Low gain",in.GetTimeLength(),0,in.GetTimeLength());
- else
- if(hLowGain->GetNbinsX() != in.GetTimeLength()) {
- delete hLowGain;
- hLowGain = new TH1F("hLowGain","Low gain",in.GetTimeLength(),0,in.GetTimeLength());
- }
- } else {
- if(!hHighGain)
- hHighGain = new TH1F("hHighGain","High gain",in.GetTimeLength(),0,in.GetTimeLength());
- else
- if(hHighGain->GetNbinsX() != in.GetTimeLength()) {
- delete hHighGain;
- hHighGain = new TH1F("hHighGain","High gain",in.GetTimeLength(),0,in.GetTimeLength());
- }
- }
-
- // Fill histograms with samples
- if(lowGainFlag)
- hLowGain ->SetBinContent(in.GetTimeLength()-iBin-1,in.GetSignal());
- else {
- hHighGain->SetBinContent(in.GetTimeLength()-iBin-1,in.GetSignal());
- }
-
- iBin++;
-
- // Fit the full sample
- if(iBin==in.GetTimeLength()) {
- iBin=0;
-
- // Temporarily we do not fit the sample graph, but
- // take the energy from the graph maximum, and the pedestal from the 0th point
- // 30 Aug 2006
-
- //FitRaw(lowGainFlag, hLowGain, hHighGain, signalF, energy, time);
-
- if(lowGainFlag) {
- energyLG = hLowGain ->GetMaximum(); // "digit amplitude"
-// energyLG -= hLowGain ->GetBinContent(0); // "pedestal subtraction"
- energyLG *= pulse->GetRawFormatHighLowGainFactor(); // *16
- if(AliLog::GetGlobalDebugLevel()>3)
- AliDebug(4,Form("----Printing hLowGain: ----\n")) ; hLowGain ->Print("all");
- AliDebug(2,Form("AliPHOSGetter::ReadRaw: (mod,col,row)=(%d,%d,%d), low gain energy=%f\n\n",
- in.GetModule(),in.GetColumn(),in.GetRow(),energyLG));
- }
-
- else {
- energyHG = hHighGain->GetMaximum(); // "digit amplitude"
-// energyHG -= hHighGain->GetBinContent(0); // "pedestal subtraction"
- if(AliLog::GetGlobalDebugLevel()>3)
- AliDebug(4,Form("----Printing hHighGain: ----\n")); hHighGain->Print("all");
- AliDebug(2,Form("AliPHOSGetter::ReadRaw: (mod,col,row)=(%d,%d,%d), high gain energy=%f\n\n",
- in.GetModule(),in.GetColumn(),in.GetRow(),energyHG));
- }
-
- // Time is not evaluated for the moment (12.01.2007). To be implemented later.
- time = -1;
-
- relId[0] = in.GetModule()+1;
- relId[1] = 0;
- relId[2] = in.GetRow();
- relId[3] = in.GetColumn();
- if(!PHOSGeometry()) AliFatal("Couldn't find PHOSGeometry!");
- PHOSGeometry()->RelToAbsNumbering(relId, absId);
-
- // Add low gain digit only if the high gain digit does not exist in the digits array
- if(lowGainFlag) {
- seen = kFALSE;
- for (iOldDigit=iDigit; iOldDigit=0; iOldDigit--) {
- if (dynamic_cast<AliPHOSDigit*>(digits->At(iOldDigit))->GetId() == absId) {
- seen = kTRUE;
- break;
- }
- }
- if (!seen)
- new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)energyLG,time);
- energyLG = 0. ;
- }
- // Add high gain digit only if it is not saturated;
- // replace low gain digit by a high gain one
- else {
- if (energyHG >= 1023) continue;
- for (iOldDigit=iDigit; iOldDigit=0; iOldDigit--) {
- if (dynamic_cast<AliPHOSDigit*>(digits->At(iOldDigit))->GetId() == absId) {
- digits->RemoveAt(iOldDigit);
- new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)energyHG,time);
- break;
- }
- }
- energyHG = 0. ;
- }
- iDigit++;
- }
+ AliPHOSRawDigiProducer pr;
+ pr.MakeDigits(digits,&dc);
+
+ //ADC counts -> GeV
+ for(Int_t i=0; i<digits->GetEntries(); i++) {
+ AliPHOSDigit* digit = (AliPHOSDigit*)digits->At(i);
+ digit->SetEnergy(digit->GetEnergy()/AliPHOSPulseGenerator::GeV2ADC());
}
-
- // PHOS entries loop
-
- digits->Sort() ;
-
+
//!!!!for debug!!!
Int_t modMax=-111;
Int_t colMax=-111;
Float_t eMax=-333;
//!!!for debug!!!
- for(iDigit=0; iDigit<digits->GetEntries(); iDigit++) {
+ AliPHOSGeometry * phosgeom = AliPHOSGeometry::GetInstance() ;
+ Int_t relId[4];
+ for(Int_t iDigit=0; iDigit<digits->GetEntries(); iDigit++) {
AliPHOSDigit* digit = (AliPHOSDigit*)digits->At(iDigit);
if(digit->GetEnergy()>eMax) {
- PHOSGeometry()->AbsToRelNumbering(digit->GetId(),relId);
+ phosgeom->AbsToRelNumbering(digit->GetId(),relId);
eMax=digit->GetEnergy();
modMax=relId[0];
rowMax=relId[2];
AliDebug(1,Form("Digit with max. energy: modMax %d colMax %d rowMax %d eMax %f\n\n",
modMax,colMax,rowMax,eMax));
- delete signalF ;
- delete hHighGain;
- delete hLowGain;
-
return digits->GetEntriesFast() ;
}
// gets TreeR from the root file (PHOS.RecPoints.root)
//if ( !IsLoaded("R") ) {
PhosLoader()->LoadRecPoints("UPDATE") ;
- PhosLoader()->LoadClusterizer("UPDATE") ;
// SetLoaded("R") ;
//}