fFillAllTH12(kFALSE), fFillAllTH3(kTRUE),
fFillAllTMHisto(kTRUE), fFillAllPi0Histo(kTRUE),
fCorrelate(kTRUE), fStudyBadClusters(kFALSE),
-fStudyClustersAsymmetry(kFALSE), fStudyWeight(kFALSE),
+fStudyClustersAsymmetry(kFALSE), fStudyExotic(kFALSE),
+fStudyWeight(kFALSE),
//Parameters and cuts
fNModules(12), fNRCU(2),
fTimeCutMin(-10000), fTimeCutMax(10000),
fEMCALCellAmpMin(0), fPHOSCellAmpMin(0),
+// Exotic
+fExoNECrossCuts(0), fExoECrossCuts(),
+fExoNDTimeCuts(0), fExoDTimeCuts(),
+
//Histograms
fhE(0), fhPt(0),
fhPhi(0), fhEta(0), fhEtaPhiE(0),
fhDeltaIAMC[0] = 0 ; fhDeltaIAMC[1] = 0;
fhDeltaIAMC[2] = 0 ; fhDeltaIAMC[3] = 0;
+ // Exotic
+ for (Int_t ie = 0; ie < 10 ; ie++)
+ {
+ fhExoDTime[ie] = 0;
+ for (Int_t idt = 0; idt < 5 ; idt++)
+ {
+ fhExoNCell [ie][idt] = 0;
+ fhExoL0 [ie][idt] = 0;
+ fhExoECross [ie][idt] = 0;
+ fhExoTime [ie][idt] = 0;
+ }
+ }
+
// MC
for(Int_t i = 0; i < 6; i++){
if(GetDebug() > 2)
printf("\t module %d, column %d, row %d \n", nModule,icol,irow);
- if(nModule < fNModules) {
-
+ if(nModule < fNModules)
+ {
//Check if the cell is a bad channel
if(GetCaloUtils()->IsBadChannelsRemovalSwitchedOn()){
if(fCalorimeter=="EMCAL")
if(time < fTimeCutMin || time > fTimeCutMax)
{
- if(GetDebug() > 0 )printf("AliAnaCalorimeterQA - Remove cell with Time %f\n",time);
+ //if(GetDebug() > 0 )
+ printf("AliAnaCalorimeterQA - Remove cell with Time %f\n",time);
continue;
}
Float_t ampMax = cells->GetCellAmplitude(absIdMax);
GetCaloUtils()->RecalibrateCellAmplitude(ampMax,fCalorimeter, absIdMax);
+ if(fStudyExotic) ExoticHistograms(absIdMax, ampMax, clus, cells);
+
//Check bad clusters if requested and rejection was not on
Bool_t goodCluster = IsGoodCluster(absIdMax, cells);
-
+
Float_t eCrossFrac = 0;
if(ampMax > 0.01) eCrossFrac = 1-GetECross(absIdMax,cells)/ampMax;
return new TObjString(parList) ;
}
+//___________________________________________________________________________________
+void AliAnaCalorimeterQA::ExoticHistograms(const Int_t absIdMax, const Float_t ampMax,
+ AliVCluster *clus, AliVCaloCells* cells)
+{
+ // Calculate weights
+
+ if(ampMax < 0.01)
+ {
+ printf("AliAnaCalorimeterQA::ExoticHistograms()- Low amplitude energy %f\n",ampMax);
+ return;
+ }
+
+ Float_t l0 = clus->GetM02();
+ Float_t en = clus->E();
+ Int_t nc = clus->GetNCells();
+
+ Double_t tmax = cells->GetCellTime(absIdMax);
+ GetCaloUtils()->RecalibrateCellTime(tmax, fCalorimeter, absIdMax,GetReader()->GetInputEvent()->GetBunchCrossNumber());
+
+ for(Int_t ie = 0; ie < fExoNECrossCuts; ie++)
+ {
+ for(Int_t idt = 0; idt < fExoNDTimeCuts; idt++)
+ {
+ Float_t eCrossFrac = 1-GetECross(absIdMax,cells, fExoDTimeCuts[idt])/ampMax;
+
+ if(eCrossFrac > fExoECrossCuts[ie])
+ {
+ //Exotic
+ fhExoL0 [ie][idt]->Fill(en,l0 );
+ fhExoTime [ie][idt]->Fill(en,tmax);
+
+ // Diff time, do for one cut in e cross
+ if(ie == 0)
+ {
+ for (Int_t icell = 0; icell < clus->GetNCells(); icell++)
+ {
+ Int_t absId = clus->GetCellsAbsId()[icell];
+ Double_t time = cells->GetCellTime(absId);
+ GetCaloUtils()->RecalibrateCellTime(time, fCalorimeter, absId,GetReader()->GetInputEvent()->GetBunchCrossNumber());
+
+ Float_t diff = (tmax-time)*1e9;
+ fhExoDTime[idt]->Fill(en, diff);
+ }
+ }
+ }
+ else
+ {
+ fhExoECross[ie][idt]->Fill(en,eCrossFrac);
+ fhExoNCell[ie][idt]->Fill(en,nc);
+ }
+ } // D time cut loop
+ } // e cross cut loop
+}
+
//____________________________________________________
TList * AliAnaCalorimeterQA::GetCreateOutputObjects()
{
fNMaxRows = 24;
fNRCU = 2 ;
//PHOS
- if(fCalorimeter=="PHOS"){
+ if(fCalorimeter=="PHOS")
+ {
fNMaxCols = 56;
fNMaxRows = 64;
fNRCU = 4 ;
fhE->SetXTitle("E (GeV)");
outputContainer->Add(fhE);
- if(fFillAllTH12){
+ if(fFillAllTH12)
+ {
fhPt = new TH1F ("hPt","p_{T} reconstructed clusters", nptbins,ptmin,ptmax);
fhPt->SetXTitle("p_{T} (GeV/c)");
outputContainer->Add(fhPt);
outputContainer->Add(fhEta);
}
- if(fFillAllTH3){
+ if(fFillAllTH3)
+ {
fhEtaPhiE = new TH3F ("hEtaPhiE","#eta vs #phi vs energy, reconstructed clusters",
netabins,etamin,etamax,nphibins,phimin,phimax,nptbins,ptmin,ptmax);
fhEtaPhiE->SetXTitle("#eta ");
fhClusterMaxCellECross->SetYTitle("1- E_{cross}/E_{cell max}");
outputContainer->Add(fhClusterMaxCellECross);
+ fhNCellsPerClusterNoCut = new TH2F ("hNCellsPerClusterNoCut","# cells per cluster vs energy, no bad clusters cut",
+ nptbins,ptmin,ptmax, nceclbins,nceclmin,nceclmax);
+ fhNCellsPerClusterNoCut->SetXTitle("E (GeV)");
+ fhNCellsPerClusterNoCut->SetYTitle("n cells");
+ outputContainer->Add(fhNCellsPerClusterNoCut);
+
+ fhNCellsPerCluster = new TH2F ("hNCellsPerCluster","# cells per cluster vs energy",nptbins,ptmin,ptmax, nceclbins,nceclmin,nceclmax);
+ fhNCellsPerCluster->SetXTitle("E (GeV)");
+ fhNCellsPerCluster->SetYTitle("n cells");
+ outputContainer->Add(fhNCellsPerCluster);
+
+ fhNClusters = new TH1F ("hNClusters","# clusters", nclbins,nclmin,nclmax);
+ fhNClusters->SetXTitle("number of clusters");
+ outputContainer->Add(fhNClusters);
+
if(fStudyBadClusters)
{
-
fhBadClusterEnergy = new TH1F ("hBadClusterEnergy","Bad cluster energy", nptbins,ptmin,ptmax);
fhBadClusterEnergy->SetXTitle("E_{cluster} (GeV) ");
outputContainer->Add(fhBadClusterEnergy);
}
+ if(fStudyExotic)
+ {
+ for(Int_t ie = 0; ie <fExoNECrossCuts; ie++)
+ {
+
+ fhExoDTime[ie] = new TH2F(Form("hExoDTime_ECross%d",ie),
+ Form("#Delta time = t_{max}-t_{cells} vs E_{cluster} for exotic, 1-E_{+}/E_{max} < %2.2f",fExoECrossCuts[ie]),
+ nptbins,ptmin,ptmax,tdbins,tdmin,tdmax);
+ fhExoDTime[ie] ->SetYTitle("#Delta t (ns)");
+ fhExoDTime[ie] ->SetXTitle("E (GeV)");
+ outputContainer->Add(fhExoDTime[ie]) ;
+
+ for(Int_t idt = 0; idt < fExoNDTimeCuts; idt++)
+ {
+ fhExoNCell[ie][idt] = new TH2F(Form("hExoNCell_ECross%d_DT%d",ie,idt),
+ Form("N cells per cluster vs E cluster, 1-E_{+}/E_{max} < %2.2f, #Delta t < %2.0f",fExoECrossCuts[ie],fExoDTimeCuts[idt]),
+ nptbins,ptmin,ptmax,nceclbins,nceclmin,nceclmax);
+ fhExoNCell[ie][idt] ->SetYTitle("N cells");
+ fhExoNCell[ie][idt] ->SetXTitle("E (GeV)");
+ outputContainer->Add(fhExoNCell[ie][idt]) ;
+
+ fhExoL0 [ie][idt] = new TH2F(Form("hExoL0_ECross%d_DT%d",ie,idt),
+ Form("M02 vs E cluster for exotic, 1-E_{+}/E_{max} < %2.2f, #Delta t = %2.0f",fExoECrossCuts[ie],fExoDTimeCuts[idt]),
+ nptbins,ptmin,ptmax,ssbins,ssmin,ssmax);
+ fhExoL0 [ie][idt] ->SetYTitle("#lambda^{2}_{0}");
+ fhExoL0 [ie][idt] ->SetXTitle("E (GeV)");
+ outputContainer->Add(fhExoL0[ie][idt]) ;
+
+ fhExoECross[ie][idt] = new TH2F(Form("hExoECross_ECross%d_DT%d",ie,idt),
+ Form("E cross for cells vs E cell, 1-E_{+}/E_{max} < %2.2f, #Delta t < %2.0f",fExoECrossCuts[ie],fExoDTimeCuts[idt]),
+ nptbins,ptmin,ptmax,400,0,1);
+ fhExoECross[ie][idt] ->SetYTitle("1-E_{+}/E_{cell max}");
+ fhExoECross[ie][idt] ->SetXTitle("E_{cell} (GeV)");
+ outputContainer->Add(fhExoECross[ie][idt]) ;
+
+ fhExoTime [ie][idt] = new TH2F(Form("hExoTime_ECross%d_DT%d",ie,idt),
+ Form("Time of cluster (max cell) vs E cluster for exotic, 1-E_{+}/E_{max} < %2.2f, #Delta t = %2.0f",fExoECrossCuts[ie],fExoDTimeCuts[idt]),
+ nptbins,ptmin,ptmax,ntimebins,timemin,timemax);
+ fhExoTime [ie][idt] ->SetYTitle("time_{max} (ns)");
+ fhExoTime [ie][idt] ->SetXTitle("E (GeV)");
+ outputContainer->Add(fhExoTime[ie][idt]) ;
+
+ }
+ }
+ }
+
// Cluster size in terms of cells
- if(fStudyClustersAsymmetry){
+ if(fStudyClustersAsymmetry)
+ {
fhDeltaIEtaDeltaIPhiE0[0] = new TH2F ("hDeltaIEtaDeltaIPhiE0"," Cluster size in columns vs rows for E < 2 GeV, n cells > 3",
50,0,50,50,0,50);
fhDeltaIEtaDeltaIPhiE0[0]->SetXTitle("#Delta Column");
outputContainer->Add(fhDeltaIAMC[iPart]);
}
}
+
if(fStudyBadClusters)
{
fhBadClusterDeltaIEtaDeltaIPhiE0 = new TH2F ("hBadClusterDeltaIEtaDeltaIPhiE0"," Cluster size in columns vs rows for E < 2 GeV, n cells > 3",
}
}
- if(fStudyWeight){
-
+ if(fStudyWeight)
+ {
fhECellClusterRatio = new TH2F ("hECellClusterRatio"," cell energy / cluster energy vs cluster energy",
nptbins,ptmin,ptmax, 100,0,1.);
fhECellClusterRatio->SetXTitle("E_{cluster} (GeV) ");
// outputContainer->Add(fhLambda1ForW0MC[iw][imc]);
}
}
-
- }
-
+ }
}
//Track Matching
- if(fFillAllTMHisto){
- if(fFillAllTH12){
+ if(fFillAllTMHisto)
+ {
+ if(fFillAllTH12)
+ {
fhECharged = new TH1F ("hECharged","E reconstructed clusters, matched with track", nptbins,ptmin,ptmax);
fhECharged->SetXTitle("E (GeV)");
outputContainer->Add(fhECharged);
outputContainer->Add(fh1EOverPR02);
}
- if(fFillAllPi0Histo){
+ if(fFillAllPi0Histo)
+ {
fhIM = new TH2F ("hIM","Cluster pairs Invariant mass vs reconstructed pair energy, ncell > 1",nptbins,ptmin,ptmax,nmassbins,massmin,massmax);
fhIM->SetXTitle("p_{T, cluster pairs} (GeV) ");
fhIM->SetYTitle("M_{cluster pairs} (GeV/c^{2})");
fhAsym->SetXTitle("p_{T, cluster pairs} (GeV) ");
fhAsym->SetYTitle("Asymmetry");
outputContainer->Add(fhAsym);
-
}
- fhNCellsPerClusterNoCut = new TH2F ("hNCellsPerClusterNoCut","# cells per cluster vs energy, no bad clusters cut",
- nptbins,ptmin,ptmax, nceclbins,nceclmin,nceclmax);
- fhNCellsPerClusterNoCut->SetXTitle("E (GeV)");
- fhNCellsPerClusterNoCut->SetYTitle("n cells");
- outputContainer->Add(fhNCellsPerClusterNoCut);
- fhNCellsPerCluster = new TH2F ("hNCellsPerCluster","# cells per cluster vs energy",nptbins,ptmin,ptmax, nceclbins,nceclmin,nceclmax);
- fhNCellsPerCluster->SetXTitle("E (GeV)");
- fhNCellsPerCluster->SetYTitle("n cells");
- outputContainer->Add(fhNCellsPerCluster);
-
- fhNClusters = new TH1F ("hNClusters","# clusters", nclbins,nclmin,nclmax);
- fhNClusters->SetXTitle("number of clusters");
- outputContainer->Add(fhNClusters);
-
- if(fFillAllPosHisto2){
-
- if(fFillAllTH3){
+ if(fFillAllPosHisto2)
+ {
+ if(fFillAllTH3)
+ {
fhXYZ = new TH3F ("hXYZ","Cluster: x vs y vs z",xbins,xmin,xmax,ybins,ymin,ymax,zbins,zmin,zmax);
fhXYZ->SetXTitle("x (cm)");
fhXYZ->SetYTitle("y (cm)");
fhYE->SetYTitle("E (GeV)");
outputContainer->Add(fhYE);
}
- if(fFillAllPosHisto){
-
+
+ if(fFillAllPosHisto)
+ {
fhRCellE = new TH2F ("hRCellE","Cell R position vs cell energy",rbins,rmin,rmax,nptbins,ptmin,ptmax);
fhRCellE->SetXTitle("r = #sqrt{x^{2}+y^{2}} (cm)");
fhRCellE->SetYTitle("E (GeV)");
outputContainer->Add(fhCellECross);
- if(fCorrelate){
+ if(fCorrelate)
+ {
//PHOS vs EMCAL
fhCaloCorrNClusters = new TH2F ("hCaloCorrNClusters","# clusters in EMCAL vs PHOS", nclbins,nclmin,nclmax,nclbins,nclmin,nclmax);
fhCaloCorrNClusters->SetXTitle("number of clusters in EMCAL");
TString particleName[] = { "Photon", "Pi0", "Eta", "Electron", "NeutralHadron", "ChargedHadron" };
- if(IsDataMC()){
- for(Int_t iPart = 0; iPart < 6; iPart++){
-
- for(Int_t iCh = 0; iCh < 2; iCh++){
-
+ if(IsDataMC())
+ {
+ for(Int_t iPart = 0; iPart < 6; iPart++)
+ {
+ for(Int_t iCh = 0; iCh < 2; iCh++)
+ {
fhRecoMCRatioE[iPart][iCh] = new TH2F (Form("hRecoMCRatioE_%s_Match%d",particleName[iPart].Data(),iCh),
Form("Reco/Gen E, %s, Matched %d",particleName[iPart].Data(),iCh),
nptbins, ptmin, ptmax, 200,0,2);
}
//Pure MC
- for(Int_t iPart = 0; iPart < 4; iPart++){
+ for(Int_t iPart = 0; iPart < 4; iPart++)
+ {
fhGenMCE[iPart] = new TH1F(Form("hGenMCE_%s",particleName[iPart].Data()) ,
Form("p_{T} of generated %s",particleName[iPart].Data()),
nptbins,ptmin,ptmax);
return outputContainer;
}
-//_____________________________________________________________________________________________
-Float_t AliAnaCalorimeterQA::GetECross(const Int_t absID, AliVCaloCells* cells)
+//__________________________________________________________________________________________________
+Float_t AliAnaCalorimeterQA::GetECross(const Int_t absID, AliVCaloCells* cells, const Float_t dtcut)
{
// Get energy in cross axis around maximum cell, for EMCAL only
tcell4 = cells->GetCellTime(absID4);
GetCaloUtils()->RecalibrateCellTime (tcell4, fCalorimeter, absID4, GetReader()->GetInputEvent()->GetBunchCrossNumber());
}
-
- if(TMath::Abs(tcell-tcell1)*1.e9 > 50) ecell1 = 0 ;
- if(TMath::Abs(tcell-tcell2)*1.e9 > 50) ecell2 = 0 ;
- if(TMath::Abs(tcell-tcell3)*1.e9 > 50) ecell3 = 0 ;
- if(TMath::Abs(tcell-tcell4)*1.e9 > 50) ecell4 = 0 ;
+
+ if(TMath::Abs(tcell-tcell1)*1.e9 > dtcut) ecell1 = 0 ;
+ if(TMath::Abs(tcell-tcell2)*1.e9 > dtcut) ecell2 = 0 ;
+ if(TMath::Abs(tcell-tcell3)*1.e9 > dtcut) ecell3 = 0 ;
+ if(TMath::Abs(tcell-tcell4)*1.e9 > dtcut) ecell4 = 0 ;
return ecell1+ecell2+ecell3+ecell4;
}
fEMCALCellAmpMin = 0.2;
fPHOSCellAmpMin = 0.2;
+ // Exotic studies
+ fExoNECrossCuts = 10 ;
+ fExoNDTimeCuts = 4 ;
+
+ fExoDTimeCuts [0] = 1.e4 ; fExoDTimeCuts [1] = 50.0 ; fExoDTimeCuts [2] = 25.0 ; fExoDTimeCuts [3] = 10.0 ;
+ fExoECrossCuts[0] = 0.80 ; fExoECrossCuts[1] = 0.85 ; fExoECrossCuts[2] = 0.90 ; fExoECrossCuts[3] = 0.92 ; fExoECrossCuts[4] = 0.94 ;
+ fExoECrossCuts[5] = 0.95 ; fExoECrossCuts[6] = 0.96 ; fExoECrossCuts[7] = 0.97 ; fExoECrossCuts[8] = 0.98 ; fExoECrossCuts[9] = 0.99 ;
+
}
//___________________________________________________________________________________
void Correlate();
- Float_t GetECross(const Int_t absId, AliVCaloCells* cells);
+ void ExoticHistograms(const Int_t absIdMax, const Float_t ampMax,
+ AliVCluster *clus, AliVCaloCells* cells);
+
+ Float_t GetECross(const Int_t absId, AliVCaloCells* cells,const Float_t dtcut = 10000);
void InvariantMassHistograms(const Int_t iclus, const TLorentzVector mom, const Int_t nModule,
const TObjArray* caloClusters, AliVCaloCells * cells);
void SwitchOnStudyWeight() { fStudyWeight = kTRUE ; }
void SwitchOffStudyWeight() { fStudyWeight = kFALSE ; }
-
-
+
+ void SwitchOnStudyExotic() { fStudyExotic = kTRUE ; }
+ void SwitchOffStudyExotic() { fStudyExotic = kFALSE ; }
+
+ void SetNECrossCuts(Int_t n) { fExoNECrossCuts = n ; }
+ void SetNDTimeCuts (Int_t n) { fExoNDTimeCuts = n ; }
+
+ void SetExoECrossCuts (Int_t i, Float_t c) { if (i<fExoNECrossCuts) fExoECrossCuts[i] = c ; }
+ void SetExoDTimeCuts (Int_t i, Float_t c) { if (i<fExoNDTimeCuts ) fExoDTimeCuts [i] = c ; }
private:
Bool_t fCorrelate ; // Correlate PHOS/EMCAL cells/clusters, also with V0 and track multiplicity
Bool_t fStudyBadClusters; // Study bad clusters
Bool_t fStudyClustersAsymmetry; // Study asymmetry of clusters
+ Bool_t fStudyExotic; // Study the exotic cluster for different cuts
Bool_t fStudyWeight; // Study the energy weight used in different cluster calculations
// Parameters
Float_t fEMCALCellAmpMin; // amplitude Threshold on emcal cells
Float_t fPHOSCellAmpMin ; // amplitude Threshold on phos cells
+ // Exotic studies
+ Float_t fExoNECrossCuts ; // Number of ecross cuts
+ Float_t fExoECrossCuts[10]; // List of ecross cuts
+ Float_t fExoNDTimeCuts ; // Number of time cuts
+ Float_t fExoDTimeCuts[5] ; // List of time cuts
+
//CaloClusters
TH1F * fhE ; //! E distribution, Reco
TH1F * fhPt ; //! pT distribution, Reco
// Weight studies
- TH2F* fhECellClusterRatio; //! e cell / e cluster vs e cluster
- TH2F* fhECellClusterLogRatio; //! log (e cell / e cluster) vs e cluster
- TH2F* fhEMaxCellClusterRatio; //! e max cell / e cluster vs e cluster
- TH2F* fhEMaxCellClusterLogRatio; //! log (e max cell / e cluster) vs e cluster
+ TH2F * fhECellClusterRatio; //! e cell / e cluster vs e cluster
+ TH2F * fhECellClusterLogRatio; //! log (e cell / e cluster) vs e cluster
+ TH2F * fhEMaxCellClusterRatio; //! e max cell / e cluster vs e cluster
+ TH2F * fhEMaxCellClusterLogRatio; //! log (e max cell / e cluster) vs e cluster
- TH2F* fhLambda0ForW0[14]; //! L0 for 7 defined w0= 3, 3.5 ... 6
- //TH2F* fhLambda1ForW0[7]; //! L1 for 7 defined w0= 3, 3.5 ... 6
+ TH2F * fhLambda0ForW0[14]; //! L0 for 7 defined w0= 3, 3.5 ... 6
+ //TH2F * fhLambda1ForW0[7]; //! L1 for 7 defined w0= 3, 3.5 ... 6
- TH2F* fhLambda0ForW0MC[14][5]; //! L0 for 7 defined w0= 3, 3.5 ... 6, depending on the particle of origin
- //TH2F* fhLambda1ForW0MC[7][5]; //! L1 for 7 defined w0= 3, 3.5 ... 6, depending on the particle of origin
+ TH2F * fhLambda0ForW0MC[14][5]; //! L0 for 7 defined w0= 3, 3.5 ... 6, depending on the particle of origin
+ //TH2F * fhLambda1ForW0MC[7][5]; //! L1 for 7 defined w0= 3, 3.5 ... 6, depending on the particle of origin
+
+ // Exotic studies
+
+ TH2F * fhExoNCell [10][5] ; //! Number of cells per cluster for different cuts
+ TH2F * fhExoL0 [10][5] ; //! Long shower shape axis for exotic
+ TH2F * fhExoECross[10][5] ; //! E cross for max cell in cluster, for different cuts
+ TH2F * fhExoTime [10][5] ; //! Time of exotic cluster, for different cuts
+ TH2F * fhExoDTime [10] ; //! Difference in time between cell with max energy and rest of cells for exotic
//Pure MC
AliAnaCalorimeterQA & operator = (const AliAnaCalorimeterQA & qa) ;//cpy assignment
AliAnaCalorimeterQA( const AliAnaCalorimeterQA & qa) ; // cpy ctor
- ClassDef(AliAnaCalorimeterQA,24)
+ ClassDef(AliAnaCalorimeterQA,25)
} ;