#include "AliEMCALDigitizer.h"
#include "AliEMCAL.h"
#include "AliEMCALGeometry.h"
-//JLK
-//#include "AliEMCALHistoUtilities.h"
#include "AliEMCALRecParam.h"
#include "AliEMCALReconstructor.h"
#include "AliCDBManager.h"
//____________________________________________________________________________
AliEMCALClusterizerv1::AliEMCALClusterizerv1()
: AliEMCALClusterizer(),
- //JLK
- //fHists(0),fPointE(0),fPointL1(0),fPointL2(0),
- //fPointDis(0),fPointMult(0),fDigitAmp(0),fMaxE(0),
- //fMaxL1(0),fMaxL2(0),fMaxDis(0),
fGeom(0),
fDefaultInit(kFALSE),
fToUnfold(kFALSE),
{
// ctor with the indication of the file where header Tree and digits Tree are stored
- InitParameters() ;
Init() ;
}
+//____________________________________________________________________________
+AliEMCALClusterizerv1::AliEMCALClusterizerv1(AliEMCALGeometry* geometry)
+ : AliEMCALClusterizer(),
+ fGeom(geometry),
+ fDefaultInit(kFALSE),
+ fToUnfold(kFALSE),
+ fNumberOfECAClusters(0),fCalibData(0),
+ fADCchannelECA(0.),fADCpedestalECA(0.),fECAClusteringThreshold(0.),fECALocMaxCut(0.),
+ fECAW0(0.),fTimeCut(0.),fMinECut(0.)
+{
+ // ctor with the indication of the file where header Tree and digits Tree are stored
+ // use this contructor to avoid usage of Init() which uses runloader
+ // change needed by HLT - MP
+
+ // Note for the future: the use on runloader should be avoided or optional at least
+ // another way is to make Init virtual and protected at least such that the deriving classes can overload
+ // Init() ;
+ //
+
+ if (!fGeom)
+ {
+ AliFatal("Geometry not initialized.");
+ }
+
+ if(!gMinuit)
+ gMinuit = new TMinuit(100) ;
+
+}
+
+//____________________________________________________________________________
+AliEMCALClusterizerv1::AliEMCALClusterizerv1(AliEMCALGeometry* geometry, AliEMCALCalibData * calib)
+: AliEMCALClusterizer(),
+fGeom(geometry),
+fDefaultInit(kFALSE),
+fToUnfold(kFALSE),
+fNumberOfECAClusters(0),fCalibData(calib),
+fADCchannelECA(0.),fADCpedestalECA(0.),fECAClusteringThreshold(0.),fECALocMaxCut(0.),
+fECAW0(0.),fTimeCut(0.),fMinECut(0.)
+{
+ // ctor, geometry and calibration are initialized elsewhere.
+
+ if (!fGeom)
+ AliFatal("Geometry not initialized.");
+
+ if(!gMinuit)
+ gMinuit = new TMinuit(100) ;
+
+}
+
+
//____________________________________________________________________________
AliEMCALClusterizerv1::~AliEMCALClusterizerv1()
{
}
//____________________________________________________________________________
-Bool_t AliEMCALClusterizerv1::FindFit(AliEMCALRecPoint * RecPoint, AliEMCALDigit ** maxAt,
- Float_t* maxAtEnergy,
+Bool_t AliEMCALClusterizerv1::FindFit(AliEMCALRecPoint * recPoint, AliEMCALDigit ** maxAt,
+ const Float_t* maxAtEnergy,
Int_t nPar, Float_t * fitparameters) const
{
// Calls TMinuit to fit the energy distribution of a cluster with several maxima
gMinuit->SetFCN(AliEMCALClusterizerv1::UnfoldingChiSquare) ;
// To set the address of the minimization function
TList * toMinuit = new TList();
- toMinuit->AddAt(RecPoint,0) ;
+ toMinuit->AddAt(recPoint,0) ;
toMinuit->AddAt(fDigitsArr,1) ;
toMinuit->AddAt(fGeom,2) ;
//Check if calibration is stored in data base
- if(!fCalibData && (AliCDBManager::Instance()->IsDefaultStorageSet()))
+ if(!fCalibData)
{
AliCDBEntry *entry = (AliCDBEntry*)
AliCDBManager::Instance()->Get("EMCAL/Calib/Data");
// Make all memory allocations which can not be done in default constructor.
// Attach the Clusterizer task to the list of EMCAL tasks
- AliRunLoader *rl = AliRunLoader::GetRunLoader();
+ AliRunLoader *rl = AliRunLoader::Instance();
if (rl->GetAliRun() && rl->GetAliRun()->GetDetector("EMCAL"))
fGeom = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"))->GetGeometry();
else
if(!gMinuit)
gMinuit = new TMinuit(100) ;
- //JLK
- //fHists = BookHists();
}
//____________________________________________________________________________
const AliEMCALRecParam* recParam = AliEMCALReconstructor::GetRecParam();
if(!recParam) {
AliFatal("Reconstruction parameters for EMCAL not set!");
- }
- else {
+ } else {
fECAClusteringThreshold = recParam->GetClusteringThreshold();
fECAW0 = recParam->GetW0();
fMinECut = recParam->GetMinECut();
fToUnfold = recParam->GetUnfold();
if(fToUnfold) AliWarning("Cluster Unfolding ON. Implementing only for eta=0 case!!!");
fECALocMaxCut = recParam->GetLocMaxCut();
-
+
AliDebug(1,Form("Reconstruction parameters: fECAClusteringThreshold=%.3f, fECAW=%.3f, fMinECut=%.3f, fToUnfold=%d, fECALocMaxCut=%.3f",
- fECAClusteringThreshold,fECAW0,fMinECut,fToUnfold,fECALocMaxCut));
+ fECAClusteringThreshold,fECAW0,fMinECut,fToUnfold,fECALocMaxCut));
}
}
while ( (digit = dynamic_cast<AliEMCALDigit *>(nextdigitC())) ) { // clean up digits
e = Calibrate(digit->GetAmp(), digit->GetId());
- //JLK
- //AliEMCALHistoUtilities::FillH1(fHists, 10, digit->GetAmp());
- //AliEMCALHistoUtilities::FillH1(fHists, 11, e);
if ( e < fMinECut || digit->GetTimeR() > fTimeCut )
digitsC->Remove(digit);
else
if(fGeom->CheckAbsCellId(digit->GetId()) && (Calibrate(digit->GetAmp(), digit->GetId()) > fECAClusteringThreshold ) ){
// start a new Tower RecPoint
if(fNumberOfECAClusters >= fRecPoints->GetSize()) fRecPoints->Expand(2*fNumberOfECAClusters+1) ;
+
AliEMCALRecPoint *recPoint = new AliEMCALRecPoint("") ;
fRecPoints->AddAt(recPoint, fNumberOfECAClusters) ;
recPoint = dynamic_cast<AliEMCALRecPoint *>(fRecPoints->At(fNumberOfECAClusters)) ;
} // while digit
delete digitsC ;
-
+
AliDebug(1,Form("total no of clusters %d from %d digits",fNumberOfECAClusters,fDigitsArr->GetEntriesFast()));
}
Int_t index ;
for(index = 0 ; index < numberofNotUnfolded ; index++){
- AliEMCALRecPoint * RecPoint = dynamic_cast<AliEMCALRecPoint *>( fRecPoints->At(index) ) ;
+ AliEMCALRecPoint * recPoint = dynamic_cast<AliEMCALRecPoint *>( fRecPoints->At(index) ) ;
TVector3 gpos;
Int_t absId;
- RecPoint->GetGlobalPosition(gpos);
+ recPoint->GetGlobalPosition(gpos);
fGeom->GetAbsCellIdFromEtaPhi(gpos.Eta(),gpos.Phi(),absId);
if(absId > nModulesToUnfold)
break ;
- Int_t nMultipl = RecPoint->GetMultiplicity() ;
+ Int_t nMultipl = recPoint->GetMultiplicity() ;
AliEMCALDigit ** maxAt = new AliEMCALDigit*[nMultipl] ;
Float_t * maxAtEnergy = new Float_t[nMultipl] ;
- Int_t nMax = RecPoint->GetNumberOfLocalMax(maxAt, maxAtEnergy,fECALocMaxCut,fDigitsArr) ;
+ Int_t nMax = recPoint->GetNumberOfLocalMax(maxAt, maxAtEnergy,fECALocMaxCut,fDigitsArr) ;
if( nMax > 1 ) { // if cluster is very flat (no pronounced maximum) then nMax = 0
- UnfoldCluster(RecPoint, nMax, maxAt, maxAtEnergy) ;
- fRecPoints->Remove(RecPoint);
+ UnfoldCluster(recPoint, nMax, maxAt, maxAtEnergy) ;
+ fRecPoints->Remove(recPoint);
fRecPoints->Compress() ;
index-- ;
fNumberOfECAClusters-- ;
numberofNotUnfolded-- ;
}
else{
- RecPoint->SetNExMax(1) ; //Only one local maximum
+ recPoint->SetNExMax(1) ; //Only one local maximum
}
delete[] maxAt ;
Float_t xpar=0.,zpar=0.,epar=0. ;
AliEMCALDigit * digit = 0 ;
- Int_t * Digits = iniTower->GetDigitsList() ;
+ Int_t * digitsList = iniTower->GetDigitsList() ;
Int_t iparam ;
Int_t iDigit ;
for(iDigit = 0 ; iDigit < nDigits ; iDigit ++){
- digit = dynamic_cast<AliEMCALDigit*>( fDigitsArr->At(Digits[iDigit] ) ) ;
+ digit = dynamic_cast<AliEMCALDigit*>( fDigitsArr->At(digitsList[iDigit] ) ) ;
fGeom->RelPosCellInSModule(digit->GetId(), yDigit, xDigit, zDigit);
efit[iDigit] = 0;
// so that energy deposited in each cell is distributed between new clusters proportionally
// to its contribution to efit
- Float_t * Energies = iniTower->GetEnergiesList() ;
+ Float_t * energiesList = iniTower->GetEnergiesList() ;
Float_t ratio ;
iparam = 0 ;
epar = fitparameters[iparam+2] ;
iparam += 3 ;
- AliEMCALRecPoint * RecPoint = 0 ;
+ AliEMCALRecPoint * recPoint = 0 ;
if(fNumberOfECAClusters >= fRecPoints->GetSize())
fRecPoints->Expand(2*fNumberOfECAClusters) ;
(*fRecPoints)[fNumberOfECAClusters] = new AliEMCALRecPoint("") ;
- RecPoint = dynamic_cast<AliEMCALRecPoint *>( fRecPoints->At(fNumberOfECAClusters) ) ;
+ recPoint = dynamic_cast<AliEMCALRecPoint *>( fRecPoints->At(fNumberOfECAClusters) ) ;
fNumberOfECAClusters++ ;
- RecPoint->SetNExMax((Int_t)nPar/3) ;
+ recPoint->SetNExMax((Int_t)nPar/3) ;
Float_t eDigit ;
for(iDigit = 0 ; iDigit < nDigits ; iDigit ++){
- digit = dynamic_cast<AliEMCALDigit*>( fDigitsArr->At( Digits[iDigit] ) ) ;
+ digit = dynamic_cast<AliEMCALDigit*>( fDigitsArr->At( digitsList[iDigit] ) ) ;
fGeom->RelPosCellInSModule(digit->GetId(), yDigit, xDigit, zDigit);
ratio = epar * ShowerShape(xDigit - xpar,zDigit - zpar) / efit[iDigit] ;
- eDigit = Energies[iDigit] * ratio ;
- RecPoint->AddDigit( *digit, eDigit ) ;
+ eDigit = energiesList[iDigit] * ratio ;
+ recPoint->AddDigit( *digit, eDigit ) ;
}
}
TList * toMinuit = dynamic_cast<TList*>( gMinuit->GetObjectFit() ) ;
- AliEMCALRecPoint * RecPoint = dynamic_cast<AliEMCALRecPoint*>( toMinuit->At(0) ) ;
+ AliEMCALRecPoint * recPoint = dynamic_cast<AliEMCALRecPoint*>( toMinuit->At(0) ) ;
TClonesArray * digits = dynamic_cast<TClonesArray*>( toMinuit->At(1) ) ;
// A bit buggy way to get an access to the geometry
// To be revised!
AliEMCALGeometry *geom = dynamic_cast<AliEMCALGeometry *>(toMinuit->At(2));
- Int_t * Digits = RecPoint->GetDigitsList() ;
+ Int_t * digitsList = recPoint->GetDigitsList() ;
- Int_t nOdigits = RecPoint->GetDigitsMultiplicity() ;
+ Int_t nOdigits = recPoint->GetDigitsMultiplicity() ;
- Float_t * Energies = RecPoint->GetEnergiesList() ;
+ Float_t * energiesList = recPoint->GetEnergiesList() ;
fret = 0. ;
Int_t iparam ;
for( iDigit = 0 ; iDigit < nOdigits ; iDigit++) {
- digit = dynamic_cast<AliEMCALDigit*>( digits->At( Digits[iDigit] ) );
+ digit = dynamic_cast<AliEMCALDigit*>( digits->At( digitsList[iDigit] ) );
Double_t xDigit=0 ;
Double_t zDigit=0 ;
efit += x[iParam] * ShowerShape(dx,dz) ;
iParam++ ;
}
- Double_t sum = 2. * (efit - Energies[iDigit]) / Energies[iDigit] ; // Here we assume, that sigma = sqrt(E)
+ Double_t sum = 2. * (efit - energiesList[iDigit]) / energiesList[iDigit] ; // Here we assume, that sigma = sqrt(E)
iParam = 0 ;
while(iParam < nPar ){
Double_t xpar = x[iParam] ;
efit += epar * ShowerShape(xDigit - xpar,zDigit - zpar) ;
}
- fret += (efit-Energies[iDigit])*(efit-Energies[iDigit])/Energies[iDigit] ;
+ fret += (efit-energiesList[iDigit])*(efit-energiesList[iDigit])/energiesList[iDigit] ;
// Here we assume, that sigma = sqrt(E)
}
}
TString taskName(Version()) ;
printf("--------------- ");
- printf(taskName.Data()) ;
+ printf("%s",taskName.Data()) ;
printf(" ");
printf("Clusterizing digits: ");
printf("\n ECA Local Maximum cut = %f", fECALocMaxCut);
printf("Index Ene(GeV) Multi Module GX GY GZ lX lY lZ Dispersion Lambda 1 Lambda 2 # of prim Primaries list\n") ;
}
Int_t index =0;
- Float_t maxE=0;
- Float_t maxL1=0;
- Float_t maxL2=0;
- Float_t maxDis=0;
-
- //JLK
- //AliEMCALHistoUtilities::FillH1(fHists, 12, double(fRecPoints->GetEntries()));
for (index = 0 ; index < fRecPoints->GetEntries() ; index++) {
AliEMCALRecPoint * rp = dynamic_cast<AliEMCALRecPoint * >(fRecPoints->At(index)) ;
rp->GetIndexInList(), rp->GetEnergy(), rp->GetMultiplicity(),
globalpos.X(), globalpos.Y(), globalpos.Z(), localpos.X(), localpos.Y(), localpos.Z(),
rp->GetDispersion(), lambda[0], lambda[1], nprimaries) ;
- /////////////
- if(rp->GetEnergy()>maxE){
- maxE=rp->GetEnergy();
- maxL1=lambda[0];
- maxL2=lambda[1];
- maxDis=rp->GetDispersion();
- }
- //JLK
- //fPointE->Fill(rp->GetEnergy());
- //fPointL1->Fill(lambda[0]);
- //fPointL2->Fill(lambda[1]);
- //fPointDis->Fill(rp->GetDispersion());
- //fPointMult->Fill(rp->GetMultiplicity());
- /////////////
if(strstr(option,"deb")){
for (Int_t iprimary=0; iprimary<nprimaries; iprimary++) {
printf("%d ", primaries[iprimary] ) ;
}
}
- //JLK
- // fMaxE->Fill(maxE);
- // fMaxL1->Fill(maxL1);
- // fMaxL2->Fill(maxL2);
- // fMaxDis->Fill(maxDis);
-
if(strstr(option,"deb"))
printf("\n-----------------------------------------------------------------------\n");
}
}
-/*
-TList* AliEMCALClusterizerv1::BookHists()
-{
- //set up histograms for monitoring clusterizer performance
-
- gROOT->cd();
-
- fPointE = new TH1F("00_pointE","point energy", 2000, 0.0, 150.);
- fPointL1 = new TH1F("01_pointL1","point L1", 1000, 0.0, 3.);
- fPointL2 = new TH1F("02_pointL2","point L2", 1000, 0.0, 3.);
- fPointDis = new TH1F("03_pointDisp","point dispersion", 1000, 0.0, 10.);
- fPointMult = new TH1F("04_pointMult","#cell in point(cluster)", 101, -0.5, 100.5);
- fDigitAmp = new TH1F("05_digitAmp","Digit Amplitude", 2000, 0.0, 5000.);
- fMaxE = new TH1F("06_maxE","Max point energy", 2000, 0.0, 150.);
- fMaxL1 = new TH1F("07_maxL1","Largest (first) of eigenvalue of covariance matrix", 1000, 0.0, 3.);
- fMaxL2 = new TH1F("08_maxL2","Smalest (second) of eigenvalue of covariace matrix", 1000, 0.0, 3.);
- fMaxDis = new TH1F("09_maxDis","Point dispersion", 1000, 0.0, 10.); // 9
- //
- new TH1F("10_adcOfDigits","adc of digits(threshold control)", 1001, -0.5, 1000.5); // 10
- new TH1F("11_energyOfDigits","energy of digits(threshold control)", 1000, 0.0, 1.); // 11
- new TH1F("12_numberOfPoints","number of points(clusters)", 101, -0.5, 100.5); // 12
-
- return AliEMCALHistoUtilities::MoveHistsToList("EmcalClusterizerv1ControlHists", kFALSE);
-}
-
-void AliEMCALClusterizerv1::SaveHists(const char *fn)
-{
- AliEMCALHistoUtilities::SaveListOfHists(fHists, fn, kTRUE);
-}
-*/
-
//___________________________________________________________________
void AliEMCALClusterizerv1::PrintRecoInfo()
{
printf(" AliEMCALClusterizerv1::PrintRecoInfo() : version %s \n", Version() );
- //JLK
- //TH1F *h = (TH1F*)fHists->At(12);
- //if(h) {
- // printf(" ## Multiplicity of RecPoints ## \n");
- // for(int i=1; i<=h->GetNbinsX(); i++) {
- // int nbin = int((*h)[i]);
- // int mult = int(h->GetBinCenter(i));
- // if(nbin > 0) printf(" %i : %5.5i %6.3f %% \n", mult, nbin, 100.*nbin/h->GetEntries());
- // }
- // }
}
-
-/*
-//___________________________________________________________________
-void AliEMCALClusterizerv1::DrawLambdasHists()
-{
- if(fMaxL1) {
- fMaxL1->Draw();
- if(fMaxL2) fMaxL2->Draw("same");
- if(fMaxDis) {
- fMaxDis->Draw("same");
- }
- }
-}
-*/