18 #include <TClonesArray.h>
19 #include <TObjString.h>
25 #include "AliVCluster.h"
26 #include "AliAODEvent.h"
27 #include "AliESDEvent.h"
41 fhTimePtNoCut(0), fhTimePtSPD(0),
42 fhTimeNPileUpVertSPD(0), fhTimeNPileUpVertTrack(0),
43 fhTimeNPileUpVertContributors(0),
44 fhTimePileUpMainVertexZDistance(0), fhTimePileUpMainVertexZDiamond(0),
45 fhClusterMultSPDPileUp(), fhClusterMultNoPileUp(),
46 fhEtaPhiBC0(0), fhEtaPhiBCPlus(0), fhEtaPhiBCMinus(0),
47 fhEtaPhiBC0PileUpSPD(0),
48 fhEtaPhiBCPlusPileUpSPD(0), fhEtaPhiBCMinusPileUpSPD(0),
49 fhPtNPileUpSPDVtx(0), fhPtNPileUpTrkVtx(0),
50 fhPtNPileUpSPDVtxTimeCut(0), fhPtNPileUpTrkVtxTimeCut(0),
51 fhPtNPileUpSPDVtxTimeCut2(0), fhPtNPileUpTrkVtxTimeCut2(0)
53 for(
Int_t i = 0; i < 7; i++)
69 for(
Int_t i = 0; i < 4; i++)
84 const Int_t buffersize = 255;
85 char onePar[buffersize] ;
87 snprintf(onePar,buffersize,
"--- AliAnaClusterPileUp---:") ;
95 return new TObjString(parList) ;
105 outputContainer->SetName(
"PhotonHistos") ;
113 fhTimePtNoCut =
new TH2F (
"hTimePt_NoCut",
"time of cluster vs pT of clusters, no event selection", nptbins,ptmin,ptimecluster, ntimebins,timemin,timemax);
118 fhTimePtSPD =
new TH2F (
"hTimePt_SPD",
"time of cluster vs pT of clusters, SPD Pile-up events", nptbins,ptmin,ptimecluster, ntimebins,timemin,timemax);
123 fhTimeNPileUpVertSPD =
new TH2F (
"hTime_NPileUpVertSPD",
"time of cluster vs N pile-up SPD vertex", ntimebins,timemin,timemax,20,0,20);
128 fhTimeNPileUpVertTrack =
new TH2F (
"hTime_NPileUpVertTracks",
"time of cluster vs N pile-up Tracks vertex", ntimebins,timemin,timemax, 20,0,20 );
133 fhTimeNPileUpVertContributors =
new TH2F (
"hTime_NPileUpVertContributors",
"time of cluster vs N constributors to pile-up SPD vertex", ntimebins,timemin,timemax,50,0,50);
138 fhTimePileUpMainVertexZDistance =
new TH2F (
"hTime_PileUpMainVertexZDistance",
"time of cluster vs distance in Z pile-up SPD vertex - main SPD vertex",ntimebins,timemin,timemax,100,0,50);
143 fhTimePileUpMainVertexZDiamond =
new TH2F (
"hTime_PileUpMainVertexZDiamond",
"time of cluster vs distance in Z pile-up SPD vertex - z diamond",ntimebins,timemin,timemax,100,0,50);
148 fhEtaPhiBC0 =
new TH2F (
"hEtaPhiBC0",
"eta-phi for clusters tof corresponding to BC=0",netabins,etamin,etamax, nphibins,phimin,phimax);
153 fhEtaPhiBCPlus =
new TH2F (
"hEtaPhiBCPlus",
"eta-phi for clusters tof corresponding to BC>0",netabins,etamin,etamax, nphibins,phimin,phimax);
158 fhEtaPhiBCMinus =
new TH2F (
"hEtaPhiBCMinus",
"eta-phi for clusters tof corresponding to BC<0",netabins,etamin,etamax, nphibins,phimin,phimax);
163 fhEtaPhiBC0PileUpSPD =
new TH2F (
"hEtaPhiBC0PileUpSPD",
"eta-phi for clusters tof corresponding to BC=0, SPD pile-up",netabins,etamin,etamax, nphibins,phimin,phimax);
168 fhEtaPhiBCPlusPileUpSPD =
new TH2F (
"hEtaPhiBCPlusPileUpSPD",
"eta-phi for clusters tof corresponding to BC>0, SPD pile-up",netabins,etamin,etamax, nphibins,phimin,phimax);
173 fhEtaPhiBCMinusPileUpSPD =
new TH2F (
"hEtaPhiBCMinusPileUpSPD",
"eta-phi for clusters tof corresponding to BC<0, SPD pile-up",netabins,etamin,etamax, nphibins,phimin,phimax);
178 TString title[] = {
"no |t diff| cut",
"|t diff|<20 ns",
"|t diff|>20 ns",
"|t diff|>40 ns"};
179 TString name [] = {
"TDiffNoCut",
"TDiffSmaller20ns",
"TDiffLarger20ns",
"TDiffLarger40ns"};
180 for(
Int_t i = 0; i < 4; i++)
183 Form(
"Number of clusters per pile up event with #it{E} > 0.5 and %s respect cluster max vs cluster max E ",title[i].
Data()),
184 nptbins,ptmin,ptimecluster,100,0,100);
190 Form(
"Number of clusters per non pile up event with #it{E} > 0.5 and %s respect cluster max vs cluster max E ",title[i].
Data()),
191 nptbins,ptmin,ptimecluster,100,0,100);
198 nptbins,ptmin,ptimecluster,20,0,20);
204 nptbins,ptmin,ptimecluster, 20,0,20 );
210 nptbins,ptmin,ptimecluster,20,0,20);
216 nptbins,ptmin,ptimecluster, 20,0,20 );
222 nptbins,ptmin,ptimecluster,20,0,20);
228 nptbins,ptmin,ptimecluster, 20,0,20 );
234 TString pileUpName[] = {
"SPD",
kEMCAL,
"SPDOrEMCAL",
"SPDAndEMCAL",
"SPDAndNotEMCAL",
"EMCALAndNotSPD",
"NotSPDAndNotEMCAL"} ;
236 for(
Int_t i = 0 ; i < 7 ; i++)
238 fhPtPileUp[i] =
new TH1F(Form(
"hPtPileUp%s",pileUpName[i].
Data()),
239 Form(
"Cluster #it{p}_{T} distribution, %s Pile-Up event",pileUpName[i].
Data()), nptbins,ptmin,ptimecluster);
240 fhPtPileUp[i]->SetXTitle(
"#it{p}_{T} (GeV/#it{c})");
244 Form(
"Neutral clusters #it{p}_{T} distribution, %s Pile-Up event",pileUpName[i].
Data()), nptbins,ptmin,ptimecluster);
249 Form(
"Cluster E vs fraction of cluster energy from large T cells, %s Pile-Up event",pileUpName[i].
Data()),
250 nptbins,ptmin,ptimecluster,200,0,1);
256 Form(
"Cluster E vs cell time in cluster, %s Pile-Up event",pileUpName[i].
Data()),
257 nptbins,ptmin,ptimecluster,ntimebins,timemin,timemax);
263 Form(
"Cluster E vs t_{max}-t_{cell} in cluster, %s Pile-Up event",pileUpName[i].
Data()),
264 nptbins,ptmin,ptimecluster,400,-200,200);
270 Form(
"Neutral clusters E vs t_{max}-t_{cell} in cluster, %s Pile-Up event",pileUpName[i].
Data()),
271 nptbins,ptmin,ptimecluster,400,-200,200);
277 Form(
"Cluster E vs #lambda^{2}_{0} in cluster, %s Pile-Up event",pileUpName[i].
Data()),
278 nptbins,ptmin,ptimecluster,ssbins,ssmin,ssmax);
284 Form(
"Neutral clusters E vs #lambda^{2}_{0}in cluster, %s Pile-Up event",pileUpName[i].
Data()), nptbins,ptmin,ptimecluster,ssbins,ssmin,ssmax);
291 return outputContainer ;
301 AliFatal(
"You want to use PHOS in analysis but it is not read!! \n!!Check the configuration file!!");
304 AliFatal(
"You want to use EMCAL in analysis but it is not read!! \n!!Check the configuration file!!");
307 AliFatal(
"You want to use MC data in analysis but this is not possible in pile-up!!");
328 AliVCaloCells* cells = 0;
357 nVtxSPD = esdEv->GetNumberOfPileupVerticesSPD();
358 nVtxTrk = esdEv->GetNumberOfPileupVerticesTracks();
362 nVtxSPD = aodEv->GetNumberOfPileupVerticesSPD();
363 nVtxTrk = aodEv->GetNumberOfPileupVerticesTracks();
368 Int_t nCaloClusters = pl->GetEntriesFast();
377 for(
Int_t icalo = 0; icalo < nCaloClusters; icalo++)
379 AliVCluster * calo = (AliVCluster*) (pl->At(icalo));
388 Float_t l0cluster = calo->GetM02();
391 if(phicluster < 0) phicluster+=TMath::TwoPi();
392 Float_t tofcluster = calo->GetTOF()*1.e9;
412 if(ptcluster > ptMax && tofcluster < 30)
431 if(TMath::Abs(tofcluster) < 30)
437 if(tofcluster < 75 && tofcluster > -30)
453 for(
Int_t iVert=0; iVert<nVtxSPD;iVert++)
457 const AliESDVertex* pv=esdEv->GetPileupVertexSPD(iVert);
458 ncont=pv->GetNContributors();
459 z1 = esdEv->GetPrimaryVertexSPD()->GetZ();
461 diamZ = esdEv->GetDiamondZ();
465 AliAODVertex *pv=aodEv->GetVertex(iVert);
466 if(pv->GetType()!=AliAODVertex::kPileupSPD)
continue;
467 ncont=pv->GetNContributors();
468 z1=aodEv->GetPrimaryVertexSPD()->GetZ();
470 diamZ = aodEv->GetDiamondZ();
474 diamZ = TMath::Abs(z2-diamZ);
493 else if (tofcluster <-28)
519 if(
GetReader()->IsPileUpFromSPDOrEMCal())
524 if(
GetReader()->IsPileUpFromSPDAndEMCal())
529 if(
GetReader()->IsPileUpFromSPDAndNotEMCal())
534 if(
GetReader()->IsPileUpFromEMCalAndNotSPD())
539 if(
GetReader()->IsPileUpFromNotSPDAndNotEMCal())
557 if(
GetReader()->IsPileUpFromSPDOrEMCal())
562 if(
GetReader()->IsPileUpFromSPDAndEMCal())
567 if(
GetReader()->IsPileUpFromSPDAndNotEMCal())
572 if(
GetReader()->IsPileUpFromEMCalAndNotSPD())
577 if(
GetReader()->IsPileUpFromNotSPDAndNotEMCal())
595 if(cells->GetCellAmplitude(absIdMax) < 0.1) continue ;
597 for (
Int_t ipos = 0; ipos < calo->GetNCells(); ipos++)
599 Int_t absId = calo->GetCellsAbsId()[ipos];
601 if( absId == absIdMax ) continue ;
603 Double_t time = cells->GetCellTime(absId);
604 Float_t amp = cells->GetCellAmplitude(absId);
609 Float_t diff = (tofcluster-time);
612 else clusterLongTimePt += amp;
614 if( cells->GetCellAmplitude(absIdMax) < 0.1 )
continue ;
630 if(
GetReader()->IsPileUpFromSPDOrEMCal())
637 if(
GetReader()->IsPileUpFromSPDAndEMCal())
644 if(
GetReader()->IsPileUpFromSPDAndNotEMCal())
651 if(
GetReader()->IsPileUpFromEMCalAndNotSPD())
658 if(
GetReader()->IsPileUpFromNotSPDAndNotEMCal())
667 if(clusterLongTimePt+clusterOKTimePt > 0.001)
668 frac = clusterLongTimePt/(clusterLongTimePt+clusterOKTimePt);
687 for(
Int_t icalo = 0; icalo < nCaloClusters; icalo++)
689 AliVCluster * calo = (AliVCluster*) (pl->At(icalo));
691 if(!calo || calo->E() < 0.3 || icalo == idMax)
continue;
693 Float_t tdiff = TMath::Abs(tMax-calo->GetTOF()*1e9);
695 if(tdiff < 25) nOK++;
699 if(tdiff > 40 ) n40++;
719 AliDebug(1,
"End fill histograms");
732 printf(
"**** Print %s %s ****\n", GetName(), GetTitle() ) ;
Bool_t IsPileUpFromSPD() const
virtual Bool_t IsFiducialCutOn() const
Float_t GetHistoPtMax() const
TH2F * fhLambda0PileUp[7]
! E vs M02 distribution of clusters, before any selection
Float_t GetHistoPtMin() const
Int_t GetHistoShowerShapeBins() const
virtual Int_t GetCalorimeter() const
virtual void AddToHistogramsName(TString add)
virtual AliVCaloCells * GetEMCALCells() const
AliAnaClusterPileUp()
Default constructor. Initialize parameters.
AliEMCALRecoUtils * GetEMCALRecoUtils() const
virtual void GetVertex(Double_t vertex[3]) const
TH2F * fhPtNPileUpTrkVtx
! Cluster pt vs number of track pile-up vertices
TH2F * fhPtNPileUpSPDVtxTimeCut
! Cluster pt vs number of spd pile-up vertices, time cut +-25 ns
virtual AliVEvent * GetInputEvent() const
Bool_t IsPileUpFromSPDAndNotEMCal() const
Check if event is from pile-up determined by SPD and not by EMCal.
virtual Bool_t IsTrackMatched(AliVCluster *cluster, AliVEvent *event)
void MakeAnalysisFillHistograms()
TH2F * fhTimePileUpMainVertexZDiamond
! Time of cluster vs difference of z diamond and pile-up vertex
Int_t GetHistoPhiBins() const
TH2F * fhTimeNPileUpVertContributors
! Time of cluster vs n pile-up vertex from SPD contributors
Bool_t IsPileUpFromNotSPDAndNotEMCal() const
Check if event not from pile-up determined neither by SPD nor by EMCal.
TObjString * GetAnalysisCuts()
Save parameters used for analysis.
TList * GetCreateOutputObjects()
Float_t GetHistoPhiMin() const
Bool_t IsPileUpFromSPDOrEMCal() const
Check if event is from pile-up determined by SPD or EMCal.
TH2F * fhTimePtNoCut
! Time of cluster vs Pt, no cut
Bool_t IsPileUpFromEMCalAndNotSPD() const
Check if event is from pile-up determined by EMCal, not by SPD.
virtual Float_t GetMinEnergy() const
TH2F * fhClusterTimeDiffNeutralPileUp[7]
! E vs Time difference inside cluster for track matched clusters
TH2F * fhTimePileUpMainVertexZDistance
! Time of cluster vs difference of z main vertex and pile-up vertex
TH2F * fhLambda0NeutralPileUp[7]
! E vs M02 distribution of clusters, track matched clusters
TH2F * fhTimeNPileUpVertSPD
! Time of cluster vs n pile-up vertices from SPD
Base class for CaloTrackCorr analysis algorithms.
virtual TString GetCalorimeterString() const
TH2F * fhEtaPhiBCPlusPileUpSPD
! eta/phi of clusters in BC>0, SPD pile-up
virtual AliFiducialCut * GetFiducialCut()
TH2F * fhClusterCellTimePileUp[7]
! E vs Time inside cluster, before any selection, not max cell
TLorentzVector fMomentum
! Cluster momentum
virtual AliHistogramRanges * GetHistogramRanges()
TH2F * fhPtNPileUpTrkVtxTimeCut
! Cluster pt vs number of track pile-up vertices, time cut +- 25 ns
Fill histograms for cluster spectra dependence on pile-up.
Bool_t IsInFiducialCut(Float_t eta, Float_t phi, Int_t det) const
TH2F * fhEtaPhiBC0
! eta/phi of clusters in BC=0
TH2F * fhEtaPhiBC0PileUpSPD
! eta/phi of clusters in BC=0, SPD pile-up
Float_t GetHistoShowerShapeMin() const
virtual AliCalorimeterUtils * GetCaloUtils() const
void InitParameters()
Initialize the parameters of the analysis.
virtual Double_t GetEventWeight() const
TH2F * fhPtNPileUpSPDVtxTimeCut2
! Cluster pt vs number of spd pile-up vertices, time cut +-75 ns
virtual TObjArray * GetPHOSClusters() const
TH2F * fhEtaPhiBCMinus
! eta/phi of clusters in BC<0
TH2F * fhPtNPileUpTrkVtxTimeCut2
! Cluster pt vs number of track pile-up vertices, time cut +- 75 ns
Float_t GetHistoEtaMin() const
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
void Print(const Option_t *opt) const
Print some relevant parameters set for the analysis.
Int_t fNCellsCut
Accept for the analysis clusters with more than fNCellsCut cells.
TH2F * fhTimePtSPD
! Time of cluster vs Pt, IsSPDPileUp
Float_t GetHistoEtaMax() const
TH1F * fhPtNeutralPileUp[7]
! pT distribution of track matched clusters
Int_t GetHistoPtBins() const
TH1F * fhPtPileUp[7]
! pT distribution of clusters before any selection
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
TH2F * fhTimeNPileUpVertTrack
! Time of cluster vs n pile-up vertices from Tracks
virtual Float_t GetMaxEnergy() const
TH2F * fhEtaPhiBCPlus
! eta/phi of clusters in BC>0
Bool_t IsInTimeWindow(Double_t tof, Float_t energy) const
TH2F * fhPtNPileUpSPDVtx
! Cluster pt vs number of spd pile-up vertices
virtual void Print(const Option_t *) const
Print some relevant parameters set for the analysis.
Int_t GetHistoTimeBins() const
Float_t GetHistoTimeMax() const
virtual Int_t GetDataType() const
Float_t GetHistoTimeMin() const
Float_t GetHistoShowerShapeMax() const
Bool_t IsPileUpFromEMCal() const
Check if event is from pile-up determined by EMCal.
Float_t GetHistoPhiMax() const
virtual AliCaloTrackReader * GetReader() const
Int_t GetHistoEtaBins() const
TH2F * fhClusterTimeDiffPileUp[7]
! E vs Time difference inside cluster, before any selection
virtual TObjArray * GetEMCALClusters() const
TH2F * fhClusterMultSPDPileUp[4]
! E max cluster vs event cluster multiplicity, for tmax-tdiff cuts, pile up event ...
TH2F * fhEtaPhiBCMinusPileUpSPD
! eta/phi of clusters in BC<0, SPD pile-up
virtual AliVCaloCells * GetPHOSCells() const
TH2F * fhClusterMultNoPileUp[4]
! E max cluster vs event cluster multiplicity, for tmax-tdiff cuts, not pile up event ...
Int_t GetMaxEnergyCell(AliVCaloCells *cells, AliVCluster *clu, Float_t &fraction) const
For a given CaloCluster, it gets the absId of the cell with maximum energy deposit.
TH2F * fhClusterEFracLongTimePileUp[7]
! E vs fraction of cluster energy from cells with large time
Bool_t IsPileUpFromSPDAndEMCal() const
Check if event is from pile-up determined by SPD and EMCal.