#include "AliVCaloCells.h"
#include "AliAODEvent.h"
#include "AliAODHandler.h"
-#include "AliAnalysisManager.h"
#include "AliAODPWG4Particle.h"
ClassImp(AliAnaCaloTrackCorrBaseClass)
//__________________________________________________________
AliAnaCaloTrackCorrBaseClass::AliAnaCaloTrackCorrBaseClass() :
TObject(),
-fDataMC(0), fDebug(0), fCheckFidCut(0),
+fDataMC(0), fDebug(0),
+fCalorimeter(-1), fCalorimeterString(""),
+fCheckFidCut(0), fCheckRealCaloAcc(0),
fCheckCaloPID(0), fRecalculateCaloPID(0),
-fMinPt(0), fMaxPt(0), fPairTimeCut(200),
-fMultiBin(0), fNZvertBin(0),
-fNrpBin(0), fNCentrBin(0),
-fNmaxMixEv(0), fMaxMulti(0), fMinMulti(0),
-fUseSelectEvent(kFALSE), fMakePlots(kFALSE),
+fMinPt(0), fMaxPt(0),
+fPairTimeCut(200), fTRDSMCovered(-1),
+fNZvertBin(0), fNrpBin(0),
+fNCentrBin(0), fNmaxMixEv(0),
+fDoOwnMix(0), fUseTrackMultBins(0),
+fFillPileUpHistograms(0), fFillHighMultHistograms(0),
+fMakePlots(kFALSE),
fInputAODBranch(0x0), fInputAODName(""),
fOutputAODBranch(0x0), fNewAOD(kFALSE),
fOutputAODName(""), fOutputAODClassName(""),
//delete fCaloUtils ; //Already deleted in maker
//delete fReader ; //Already deleted in maker
- delete fCaloPID ; fCaloPID = 0;
- delete fFidCut ; fFidCut = 0;
- delete fIC ; fIC = 0;
- delete fMCUtils ; fMCUtils = 0;
- delete fNMS ; fNMS = 0;
- delete fHisto; fHisto = 0;
+ delete fCaloPID ;
+ delete fFidCut ;
+ delete fIC ;
+ delete fMCUtils ;
+ delete fNMS ;
+ delete fHisto ;
}
//______________________________________________________________________
{
//Put AOD calo cluster in the AODParticleCorrelation array
- if(fOutputAODBranch){
-
- Int_t i = fOutputAODBranch->GetEntriesFast();
- //new((*fOutputAODBranch)[i]) AliAODPWG4Particle(pc);
- if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4Particle")==0)
- new((*fOutputAODBranch)[i]) AliAODPWG4Particle(pc);
- else if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4ParticleCorrelation")==0)
- new((*fOutputAODBranch)[i]) AliAODPWG4ParticleCorrelation(pc);
- else {
- printf("AliAnaCaloTrackCorrBaseClass::AddAODParticle() - Cannot add an object of type < %s >, to the AOD TClonesArray \n",
- fOutputAODBranch->GetClass()->GetName());
- abort();
- }
+ if(!fOutputAODBranch)
+ {
+ AliFatal("No AOD branch available!!!\n");
+ return; // coverity
+ }
+
+ Int_t i = fOutputAODBranch->GetEntriesFast();
+ //new((*fOutputAODBranch)[i]) AliAODPWG4Particle(pc);
+ if (strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4Particle")==0)
+ {
+ new((*fOutputAODBranch)[i]) AliAODPWG4Particle(pc);
+ }
+ else if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4ParticleCorrelation")==0)
+ {
+ new((*fOutputAODBranch)[i]) AliAODPWG4ParticleCorrelation(pc);
}
- else {
- printf(" AliAnaCaloTrackCorrBaseClass::AddAODParticle() - No AOD branch available!!!\n");
- abort();
+ else
+ {
+ AliFatal(Form("Cannot add an object of type < %s >, to the AOD TClonesArray \n", fOutputAODBranch->GetClass()->GetName()));
}
-}
+}
+//__________________________________________________________________________________________
+Int_t AliAnaCaloTrackCorrBaseClass::CheckMixedEventVertex(Int_t caloLabel, Int_t trackLabel)
+{
+ // Check vertex in mixed events
+
+ if (!GetMixedEvent()) return 1; // Not mixed event continue normal processing
+
+ Int_t evt = -1;
+
+ if (caloLabel >= 0 )
+ {
+ evt = GetMixedEvent()->EventIndexForCaloCluster(caloLabel) ;
+ }
+ else if(trackLabel >= 0 )
+ {
+ evt = GetMixedEvent()->EventIndex(trackLabel) ;
+ }
+ else
+ return 0; // go to next entry in the particle list
+
+ if(evt == -1)
+ return 0 ; // to content coverity
+
+ if (TMath::Abs(GetVertex(evt)[2]) > GetZvertexCut()) return -1; // Vertex out of range process next event
+
+ return 1 ; // continue processing normally
+
+}
//________________________________________________________________
void AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches()
//Recover ouput and input AOD pointers for each event in the maker
//Delta AODs
- if(fDebug > 3) printf("AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Connect Input with name: <%s>; Connect output with name <%s>\n",fInputAODName.Data(),fOutputAODName.Data());
+ AliDebug(3,Form("AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Connect Input with name: <%s>; Connect output with name <%s>\n",fInputAODName.Data(),fOutputAODName.Data()));
//Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
AliAODHandler* aodHandler = 0x0;
fOutputAODBranch = (TClonesArray *) (fReader->GetAODBranchList())->FindObject(fOutputAODName);
fInputAODBranch = (TClonesArray *) (fReader->GetAODBranchList())->FindObject(fInputAODName);
}
- else if (aodHandler->GetExtensions()) {
-
+ else if (aodHandler->GetExtensions())
+ {
AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName());
- if(ext){
+ if(ext)
+ {
AliAODEvent *aodEvent = ext->GetAOD();
if(fNewAOD)fOutputAODBranch = (TClonesArray*) aodEvent->FindListObject(fOutputAODName);
fInputAODBranch = (TClonesArray*) aodEvent->FindListObject(fInputAODName);
if(!fOutputAODBranch && fNewAOD) fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
if(!fInputAODBranch) fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
}
- else{//If no Delta AODs, kept in standard branch, to revise.
- if(fNewAOD && fReader->GetOutputEvent()) {
+ else
+ { // If no Delta AODs, kept in standard branch, to revise.
+ if(fNewAOD && fReader->GetOutputEvent())
+ {
fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
}
- else {
+ else
+ {
fInputAODBranch = (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);
if(!fInputAODBranch && fReader->GetOutputEvent() )
fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
}
}
}
- else{ //If no Delta AODs, kept in standard branch
- if(fNewAOD && fReader->GetOutputEvent()) {
+ else
+ { // If no Delta AODs, kept in standard branch
+ if(fNewAOD && fReader->GetOutputEvent())
+ {
fOutputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
}
- else{
+ else
+ {
fInputAODBranch = (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);
if(!fInputAODBranch && fReader->GetOutputEvent())
fInputAODBranch = (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
}
}
- if(GetDebug() > 1){
- if(fNewAOD && !fOutputAODBranch)
- printf(" AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Output Branch <%s>, not found!\n",fOutputAODName.Data());
- if(!fNewAOD && !fInputAODBranch)
- printf(" AliAnaCaloTrackCorrBaseClass::ConnectInputOutputAODBranches() - Input Branch <%s>, not found!\n",fInputAODName.Data());
- }
+// if(GetDebug() > 1)
+// {
+// if(fNewAOD && !fOutputAODBranch)
+// AliInfo(Form("Output Branch <%s>, not found!\n",fOutputAODName.Data()));
+// if(!fNewAOD && !fInputAODBranch)
+// AliInfo(Form("Input Branch <%s>, not found!\n",fInputAODName.Data()));
+// }
}
-//__________________________________________________________________________________________
-AliVCluster * AliAnaCaloTrackCorrBaseClass::FindCluster(TObjArray* clusters, const Int_t id,
- Int_t & iclus, const Int_t first)
+//_____________________________________________________________________________________
+AliVCluster * AliAnaCaloTrackCorrBaseClass::FindCluster(TObjArray* clusters, Int_t id,
+ Int_t & iclus, Int_t first)
{
// Given the cluster ID stored in AliAODPWG4Particle, get the originator cluster and its index in the array
if(!clusters) return 0x0;
- for(iclus = first; iclus < clusters->GetEntriesFast(); iclus++){
+ for(iclus = first; iclus < clusters->GetEntriesFast(); iclus++)
+ {
AliVCluster *cluster= dynamic_cast<AliVCluster*> (clusters->At(iclus));
- if(cluster){
- if (cluster->GetID()==id) {
+ if(cluster)
+ {
+ if(cluster->GetID()==id)
+ {
return cluster;
}
}
}
-//______________________________________________________________________________
-TClonesArray * AliAnaCaloTrackCorrBaseClass::GetAODBranch(TString aodName) const
+//______________________________________________________________________________________
+TClonesArray * AliAnaCaloTrackCorrBaseClass::GetAODBranch(const TString & aodName) const
{
//Recover ouput and input AOD pointers for each event in the maker
//Delta AODs
- if(fDebug > 3) printf("AliAnaCaloTrackCorrBaseClass::GetAODBranch() - Get Input Branch with name: <%s>; \n",aodName.Data());
+
+ AliDebug(3,Form("AliAnaCaloTrackCorrBaseClass::GetAODBranch() - Get Input Branch with name: <%s>; \n",aodName.Data()));
//Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
AliAODHandler* aodHandler = 0x0;
parList+=onePar ;
snprintf(onePar,buffersize,"fCheckFidCut=%d (Check Fiducial cut selection on/off) \n",fCheckFidCut) ;
parList+=onePar ;
+ snprintf(onePar,buffersize,"fCheckRealCaloAcc=%d (Check Real Calo Acceptance on/off) \n",fCheckRealCaloAcc) ;
+ parList+=onePar ;
snprintf(onePar,buffersize,"fCheckCaloPID =%d (Use Bayesian PID in calorimetes, on/off) \n",fCheckCaloPID) ;
parList+=onePar ;
snprintf(onePar,buffersize,"fRecalculateCaloPID =%d (Calculate PID from shower/tof/tracking parameters, on/off) \n",fRecalculateCaloPID) ;
parList+=onePar ;
snprintf(onePar,buffersize,"fInputAODName =%s Input AOD name \n",fInputAODName.Data()) ;
parList+=onePar ;
- if(fNewAOD){
+ if(fNewAOD)
+ {
snprintf(onePar,buffersize,"fOutputAODName =%s Output AOD name \n",fOutputAODName.Data()) ;
parList+=onePar ;
snprintf(onePar,buffersize,"fOutputAODClassName =%s Output AOD class name \n",fOutputAODClassName.Data()) ;
{
//Create AOD branch filled in the analysis
- printf("Create AOD branch of %s objects and with name < %s >\n",
- fOutputAODClassName.Data(),fOutputAODName.Data()) ;
+ AliInfo(Form("Create AOD branch of %s objects and with name < %s >\n",
+ fOutputAODClassName.Data(),fOutputAODName.Data())) ;
TClonesArray * aodBranch = new TClonesArray(fOutputAODClassName, 0);
aodBranch->SetName(fOutputAODName);
}
+
+//_________________________________________________________________
+Int_t AliAnaCaloTrackCorrBaseClass::GetTrackMultiplicityBin() const
+{
+ // Track multiplicity bins
+
+ //curCentrBin = (GetTrackMultiplicity()-1)/5;
+ //if(curCentrBin > GetNCentrBin()-1) curCentrBin=GetNCentrBin()-1;
+ Int_t trackMult = GetReader()->GetTrackMultiplicity();
+
+ for(Int_t ibin = 0; ibin < GetNTrackMultBin()-1; ibin++)
+ {
+ if(trackMult >= fTrackMultBins[ibin] && trackMult < fTrackMultBins[ibin+1]) return ibin;
+ }
+
+ AliWarning(Form("Bin not found for track multiplicity %d",trackMult));
+
+ return -1;
+}
+
+//________________________________________________________________
+Int_t AliAnaCaloTrackCorrBaseClass::GetEventCentralityBin() const
+{
+ // Define the centrality bin for mixing
+ // In pp collisions analysis hardcoded track multiplicities
+
+ Int_t curCentrBin = 0;
+
+ if(fUseTrackMultBins) // pp collisions
+ {
+ return GetTrackMultiplicityBin();
+ }
+ else // Set centrality based on centrality task, PbPb collisions
+ {
+ Float_t minCent = GetReader()->GetCentralityBin(0);
+ Float_t maxCent = GetReader()->GetCentralityBin(1);
+
+ if((minCent< 0 && maxCent< 0) || minCent>=maxCent)
+ {
+ curCentrBin = GetEventCentrality() * GetNCentrBin() / GetReader()->GetCentralityOpt();
+ if(curCentrBin==GetNCentrBin())
+ {
+ curCentrBin = GetNCentrBin()-1;
+ AliDebug(1,Form("Centrality = %d, put it in last bin \n",GetEventCentrality()));
+ }
+ }
+ else
+ {
+ curCentrBin = (Int_t)((GetEventCentrality()-minCent) * GetNCentrBin() / (maxCent-minCent));
+ if(curCentrBin==GetNCentrBin()) curCentrBin = GetNCentrBin()-1;
+ }
+
+ AliDebug(1,Form("Current CentrBin %d, centrality %d, n bins %d, max bin from centrality %d",
+ curCentrBin, GetEventCentrality(), GetNCentrBin(), GetReader()->GetCentralityOpt()));
+ }
+
+ return curCentrBin;
+
+}
+
+//_______________________________________________________
+Int_t AliAnaCaloTrackCorrBaseClass::GetEventRPBin() const
+{
+ //Reaction plane bin
+
+ Int_t curRPBin = 0 ;
+
+ if(GetNRPBin() > 1 && GetEventPlane())
+ {
+ Float_t epAngle = GetEventPlaneAngle();//->GetEventplane(GetEventPlaneMethod(),fReader->GetInputEvent());
+
+ if(epAngle < 0 || epAngle >TMath::Pi())
+ {
+ AliWarning(Form("Wrong event plane angle : %f \n",epAngle));
+ return -1;
+ }
+
+ curRPBin = TMath::Nint(epAngle*(GetNRPBin()-1)/TMath::Pi());
+ if(curRPBin >= GetNRPBin()) printf("RP Bin %d out of range %d",curRPBin,GetNRPBin());
+
+ AliDebug(1,Form("Current RP bin %d, bin float %f, angle %f, n bins %d",
+ curRPBin,epAngle*(GetNRPBin()-1)/TMath::Pi(),epAngle,GetNRPBin()));
+ }
+
+ return curRPBin ;
+
+}
+
+//_______________________________________________________
+Int_t AliAnaCaloTrackCorrBaseClass::GetEventVzBin() const
+{
+ // Return Vz bin, divide vertex in GetNZvertBin() bins,
+ // depending on the vertex cut
+
+ Double_t v[3] = {0,0,0}; //vertex
+ GetReader()->GetVertex(v);
+
+ Int_t curZvertBin = (Int_t)(0.5*GetNZvertBin()*(v[2]+GetZvertexCut())/GetZvertexCut());
+
+ AliDebug(1,Form("AliAnaCaloTrackCorrBaseClass::GetEventVzBin() - %d, vz %2.2f, n bins %d",
+ curZvertBin, v[2], GetNZvertBin()));
+
+ return curZvertBin;
+}
+
+//________________________________________________________________________________________
+Int_t AliAnaCaloTrackCorrBaseClass::GetEventMixBin(Int_t iCen, Int_t iVz, Int_t iRP) const
+{
+ // Event mixing bin, combination of vz, centrality and reaction plane bins
+
+ if(iCen<0 || iVz < 0 || iRP < 0)
+ return -1;
+ else
+ return iCen*GetNZvertBin()*GetNRPBin()+iVz*GetNRPBin()+iRP;
+}
+
+//________________________________________________________
+Int_t AliAnaCaloTrackCorrBaseClass::GetEventMixBin() const
+{
+ // Event mixing bin, combination of vz, centrality and reaction plane bins
+
+ //Get vertex z bin
+ Int_t iVz = GetEventVzBin();
+
+ // centrality (PbPb) or tracks multiplicity (pp) bin
+ Int_t iCen = GetEventCentralityBin();
+
+ // reaction plane bin (PbPb)
+ Int_t iRP = GetEventRPBin();
+
+ Int_t eventBin = GetEventMixBin(iCen, iVz, iRP);
+
+ AliDebug(1,Form("Bins : cent %d, vz %d, RP %d, event %d/%d",
+ iCen,iVz, iRP, eventBin, GetNZvertBin()*GetNRPBin()*GetNCentrBin()));
+
+ return eventBin;
+
+}
+
+//____________________________________________
+void AliAnaCaloTrackCorrBaseClass::InitDebug()
+{
+ // Init once the debugging level, if requested
+
+ // Activate debug level in analysis
+
+ if( fDebug >= 0 )
+ (AliAnalysisManager::GetAnalysisManager())->AddClassDebug(this->ClassName(),fDebug);
+
+ if( GetMCAnalysisUtils()->GetDebug() >= 0 )
+ (AliAnalysisManager::GetAnalysisManager())->AddClassDebug(GetMCAnalysisUtils()->ClassName(),GetMCAnalysisUtils()->GetDebug());
+
+ if( GetIsolationCut()->GetDebug() >= 0 )
+ (AliAnalysisManager::GetAnalysisManager())->AddClassDebug(GetIsolationCut() ->ClassName(),GetIsolationCut()->GetDebug());
+
+ //printf("Debug levels: Ana %d, MC %d, Iso %d\n",fDebug,GetMCAnalysisUtils()->GetDebug(),GetIsolationCut()->GetDebug());
+
+}
+
//_________________________________________________
void AliAnaCaloTrackCorrBaseClass::InitParameters()
{
//Initialize the parameters of the analysis.
fDataMC = kFALSE;
- fDebug = -1;
+ fDebug = 0;
fCheckCaloPID = kTRUE ;
fCheckFidCut = kFALSE ;
+ fCheckRealCaloAcc = kFALSE ;
fRecalculateCaloPID = kFALSE ;
- fMinPt = 0.1 ; //Min pt in particle analysis
+ fMinPt = 0.2 ; //Min pt in particle analysis
fMaxPt = 300. ; //Max pt in particle analysis
- fMultiBin = 1;
fNZvertBin = 1;
fNrpBin = 1;
- fMaxMulti = 1000;
- fMinMulti = 0;
- fUseSelectEvent = kFALSE ;
+
+ fCalorimeterString = "EMCAL";
+ fCalorimeter = kEMCAL ;
+
+ fTrackMultBins[0] = 0; fTrackMultBins[1] = 5; fTrackMultBins[2] = 10;
+ fTrackMultBins[3] = 15; fTrackMultBins[4] = 20; fTrackMultBins[5] = 30;
+ fTrackMultBins[6] = 40; fTrackMultBins[7] = 55; fTrackMultBins[8] = 70;
+ for(Int_t ibin=9; ibin < 20; ibin++) fTrackMultBins[ibin] = 10000;
//fReader = new AliCaloTrackReader(); //Initialized in maker
//fCaloUtils = new AliCalorimeterUtils();//Initialized in maker
if(! opt)
return;
- printf("New AOD: = %d\n",fNewAOD);
- printf("Input AOD name: = %s\n",fInputAODName.Data());
- printf("Output AOD name: = %s\n",fOutputAODName.Data());
- printf("Output AOD Class name: = %s\n",fOutputAODClassName.Data());
- printf("Min Photon pT = %2.2f\n", fMinPt) ;
- printf("Max Photon pT = %3.2f\n", fMaxPt) ;
- printf("Check PID = %d\n", fCheckCaloPID) ;
- printf("Recalculate PID = %d\n", fRecalculateCaloPID) ;
- printf("Check Fiducial cut = %d\n", fCheckFidCut) ;
- printf("Check MC labels = %d\n", fDataMC);
- printf("Make plots? = %d \n", fMakePlots);
- printf("Debug Level = %d\n", fDebug);
-
- printf("Name of reference array : %s\n", fAODObjArrayName.Data());
+ printf("New AOD: = %d\n", fNewAOD);
+ printf("Input AOD name: = %s\n", fInputAODName.Data());
+ printf("Output AOD name: = %s\n", fOutputAODName.Data());
+ printf("Output AOD Class name: = %s\n", fOutputAODClassName.Data());
+ printf("Name of reference array : %s\n", fAODObjArrayName.Data());
printf("String added histograms name : %s\n", fAddToHistogramsName.Data());
-
+
+ printf("Min Photon pT = %2.2f\n", fMinPt) ;
+ printf("Max Photon pT = %3.2f\n", fMaxPt) ;
+ printf("Check PID = %d\n", fCheckCaloPID) ;
+ printf("Recalculate PID = %d\n", fRecalculateCaloPID) ;
+ printf("Check Fiducial cut = %d\n", fCheckFidCut) ;
+ printf("Check Real Calo Acc = %d\n", fCheckRealCaloAcc) ;
+ printf("Check MC labels = %d\n", fDataMC);
+ printf("Make plots? = %d\n", fMakePlots);
+ printf("Debug Level = %d\n", fDebug);
+
printf(" \n") ;
}
+//_______________________________________________________________
+void AliAnaCaloTrackCorrBaseClass::SetCalorimeter(TString & calo)
+{
+ // Set the calorimeter for the analysis
+
+ fCalorimeterString = calo;
+
+ if (calo=="EMCAL") fCalorimeter = kEMCAL;
+ else if(calo=="PHOS" ) fCalorimeter = kPHOS;
+ else if(calo=="CTS") fCalorimeter = kCTS;
+ else if(calo=="DCAL") fCalorimeter = kDCAL;
+ else if(calo.Contains("DCAL") && calo.Contains("PHOS")) fCalorimeter = kDCALPHOS;
+ else AliFatal(Form("Detector < %s > not known!", calo.Data()));
+
+}
+
+//___________________________________________________________
+void AliAnaCaloTrackCorrBaseClass::SetCalorimeter(Int_t calo)
+{
+ // Set the calorimeter for the analysis
+
+ fCalorimeter = calo;
+
+ if (calo==kEMCAL) fCalorimeterString = "EMCAL";
+ else if(calo==kPHOS ) fCalorimeterString = "PHOS";
+ else if(calo==kCTS) fCalorimeterString = "CTS";
+ else if(calo==kDCAL) fCalorimeterString = "DCAL";
+ else if(calo==kDCALPHOS) fCalorimeterString = "DCAL_PHOS";
+ else AliFatal(Form("Detector < %d > not known!", calo));
+
+}