1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 //______________________________________________________
18 // Class for output (histograms) definition and filling.
19 // Contains also the methods for calculation of correlation parameters.
20 //-- Author: Paul Constantin
22 #include "AliJetCorrelWriter.h"
26 ClassImp(AliJetCorrelWriter)
28 AliJetCorrelWriter::AliJetCorrelWriter() :
29 fSelector(NULL), fMaker(NULL), fHname(""), fHtit(""), fRecoTrigg(kFALSE), fRndm(6251093), fNtuParent(NULL),
30 fHBinsCentr(NULL), fHBinsZVert(NULL), fHBinsTrigg(NULL), fHBinsAssoc(NULL), fHCentr(NULL), fHZVert(NULL) {
32 for(UInt_t i=0; i<2; i++){
33 fHTrkITSQA[i] = NULL; fHTrkTPCQA[i] = NULL; fHTrkVTXQA[i] = NULL;
34 for(UInt_t ic=0; ic<AliJetCorrelSelector::kMaxCent; ic++) fHTrkProx[i][ic] = NULL;
36 for(UInt_t ik=0; ik<AliJetCorrelSelector::kMaxCorrel; ik++){
37 fHTriggAcc[ik] = NULL; fHAssocAcc[ik] = NULL;
38 for(UInt_t ic=0; ic<AliJetCorrelSelector::kMaxCent; ic++){
39 fHTriggPt[ik][ic] = NULL; fHAssocPt[ik][ic] = NULL;
40 for(UInt_t iv=0; iv<AliJetCorrelSelector::kMaxVert; iv++)
41 for(UInt_t it=0; it<AliJetCorrelSelector::kMaxTrig; it++)
42 for(UInt_t ia=0; ia<AliJetCorrelSelector::kMaxAsso; ia++){
43 fHReal[ik][ic][iv][it][ia] = NULL;
44 fHMix[ik][ic][iv][it][ia] = NULL;
50 AliJetCorrelWriter::~AliJetCorrelWriter(){
54 void AliJetCorrelWriter::Init(AliJetCorrelSelector * const s, AliJetCorrelMaker * const m){
55 // initialization method
58 fRecoTrigg = m->RecoTrigger();
61 ////////////////////////////////////////////
62 // METHODS FOR CREATION OF OUTPUT HISTOGRAMS
63 ////////////////////////////////////////////
65 void AliJetCorrelWriter::CreateGeneric(TList *histosContainer){
66 // books generic histograms
67 UInt_t nTypeTrigg = fMaker->NoOfTrigg();
68 UInt_t nTypeAssoc = fMaker->NoOfAssoc();
69 UInt_t nBinsCentr = fSelector->NoOfBins(centr);
70 UInt_t nBinsZVert = fSelector->NoOfBins(zvert);
71 UInt_t nBinsTrigg = fSelector->NoOfBins(trigg);
72 UInt_t nBinsAssoc = fSelector->NoOfBins(assoc);
73 Float_t minTrigg = fSelector->MinLowBin(trigg);
74 Float_t maxTrigg = fSelector->MaxHighBin(trigg);
75 Float_t minAssoc = fSelector->MinLowBin(assoc);
76 Float_t maxAssoc = fSelector->MaxHighBin(assoc);
78 for(UInt_t ic=0; ic<nBinsCentr; ic++){ // loop over centrality bins
79 for(UInt_t tt=0; tt<nTypeTrigg; tt++){ // loop over trigger types
80 fHtit="type:"; fHtit+=tt; fHtit+=" cent:"; fHtit+=ic;
81 fHname = "fHTriggPt"; fHname+=tt; fHname+=ic;
82 fHTriggPt[tt][ic] = new TH1F(fHname, fHtit, 10*nBinsTrigg, minTrigg, maxTrigg); // for <pT> each bin
83 histosContainer->AddLast(fHTriggPt[tt][ic]);
84 } // loop over trigger types
85 for(UInt_t at=0; at<nTypeAssoc; at++){ // loop over trigger types
86 fHtit="type:"; fHtit+=at; fHtit+=" cent:"; fHtit+=ic;
87 fHname = "fHAssocPt"; fHname+=at; fHname+=ic;
88 fHAssocPt[at][ic] = new TH1F(fHname, fHtit, 10*nBinsAssoc, minAssoc, maxAssoc); // for <pT> each bin
89 histosContainer->AddLast(fHAssocPt[at][ic]);
90 } // loop over trigger types
91 } // centrality binning loop
93 fHCentr = new TH1F("fHCentr","centrality distribution",100, 0., 100.);
94 histosContainer->AddLast(fHCentr);
95 fHZVert = new TH1F("fHZVert","vertex distribution",100, -50., 50.);
96 histosContainer->AddLast(fHZVert);
98 fHBinsCentr = new TH1F("fHBinsCentr","centrality binning", nBinsCentr+1, 0, 1);
99 histosContainer->AddLast(fHBinsCentr);
100 for(UInt_t i=1;i<=nBinsCentr+1; i++)
101 fHBinsCentr->SetBinContent(i,fSelector->BinBorder(centr,i-1));
102 fHBinsZVert = new TH1F("fHBinsZVert","centrality binning", nBinsZVert+1, 0, 1);
103 histosContainer->AddLast(fHBinsZVert);
104 for(UInt_t i=1;i<=nBinsZVert+1; i++)
105 fHBinsZVert->SetBinContent(i,fSelector->BinBorder(zvert,i-1));
106 fHBinsTrigg = new TH1F("fHBinsTrigg","trigger binning", nBinsTrigg+1, 0, 1);
107 histosContainer->AddLast(fHBinsTrigg);
108 for(UInt_t i=1;i<=nBinsTrigg+1; i++)
109 fHBinsTrigg->SetBinContent(i,fSelector->BinBorder(trigg,i-1));
110 fHBinsAssoc = new TH1F("fHBinsAssoc","associated binning", nBinsAssoc+1, 0, 1);
111 histosContainer->AddLast(fHBinsAssoc);
112 for(UInt_t i=1;i<=nBinsAssoc+1; i++)
113 fHBinsAssoc->SetBinContent(i,fSelector->BinBorder(assoc,i-1));
116 void AliJetCorrelWriter::CreateQA(TList *histosContainer){
117 // books QA histograms
118 TString when[2] = {"before cuts","after cuts"};
119 for(UInt_t i=0; i<2; i++){
120 fHname = "fHTrkITSQA"; fHname += i;
121 fHtit = "ITS nClust vs Chi2/nClust "; fHtit += when[i];
122 fHTrkITSQA[i] = new TH2F(fHname,fHtit,20,0.,20.,50,0.,10.);
123 histosContainer->AddLast(fHTrkITSQA[i]);
124 fHname = "fHTrkTPCQA"; fHname += i;
125 fHtit = "TPC nClust vs Chi2/nClust "; fHtit += when[i];
126 fHTrkTPCQA[i] = new TH2F(fHname,fHtit,30,0.,150.,50,0.,10.);
127 histosContainer->AddLast(fHTrkTPCQA[i]);
128 fHname = "fHTrkVTXQA"; fHname += i;
129 fHtit = "VTX KinkIndex vs nSigma "; fHtit += when[i];
130 fHTrkVTXQA[i] = new TH2F(fHname,fHtit,21,-10.,10,50,0.,10.);
131 histosContainer->AddLast(fHTrkVTXQA[i]);
134 UInt_t nTypeTrigg = fMaker->NoOfTrigg();
135 UInt_t nTypeAssoc = fMaker->NoOfAssoc();
136 UInt_t nBinsCentr = fSelector->NoOfBins(centr);
137 UInt_t nBinsTrigg = fSelector->NoOfBins(trigg);
138 UInt_t nBinsAssoc = fSelector->NoOfBins(assoc);
139 Float_t minTrigg = fSelector->MinLowBin(trigg);
140 Float_t maxTrigg = fSelector->MaxHighBin(trigg);
141 Float_t minAssoc = fSelector->MinLowBin(assoc);
142 Float_t maxAssoc = fSelector->MaxHighBin(assoc);
143 for(UInt_t ic=0; ic<nBinsCentr; ic++){ // centrality loop
144 for(UInt_t it=0; it<2; it++){ // mixing type loop (real/mixed)
145 fHname="fHTrkProx"; fHname+=it; fHname+=ic;
146 fHtit="fHTrkProx"; fHtit+=it; fHtit+=ic;
147 fHTrkProx[it][ic] = new TH3F(fHname,fHtit,100,0.,10.,
148 nBinsTrigg,minTrigg,maxTrigg,nBinsAssoc,minAssoc,maxAssoc);
149 histosContainer->AddLast(fHTrkProx[it][ic]);
150 } // loop over mixing type
151 } // loop over centrality
152 for(UInt_t tt=0; tt<nTypeTrigg; tt++){ // loop over trigger types
153 fHname = "fHTriggAcc"; fHname+=tt;
154 fHTriggAcc[tt] = new TH3F(fHname,fHname,62,0.,2*TMath::Pi(),20,-1.,1.,nBinsTrigg,minTrigg,maxTrigg);
155 histosContainer->AddLast(fHTriggAcc[tt]);
156 } // loop over trigger types
157 for(UInt_t ta=0; ta<nTypeAssoc; ta++){ // loop over associated types
158 fHname="fHAssocAcc"; fHname+=ta;
159 fHAssocAcc[ta] = new TH3F(fHname,fHname,62,0.,2*TMath::Pi(),20,-1.,1.,nBinsAssoc,minAssoc,maxAssoc);
160 histosContainer->AddLast(fHAssocAcc[ta]);
161 } // loop over associated types
164 void AliJetCorrelWriter::CreateCorrelations(TList* histosContainer){
165 // books correlation histograms
166 const Float_t lr=-TMath::Pi()/3, ur=5*TMath::Pi()/3, bwPout=0.2;
167 UInt_t nTypeCorrel = fMaker->NoOfCorrel();
168 UInt_t nBinsCentr = fSelector->NoOfBins(centr);
169 UInt_t nBinsZVert = fSelector->NoOfBins(zvert);
170 UInt_t nBinsTrigg = fSelector->NoOfBins(trigg);
171 UInt_t nBinsAssoc = fSelector->NoOfBins(assoc);
172 Float_t maxAssoc = fSelector->MaxHighBin(assoc);
173 UInt_t kDPhiNumBins = fSelector->DPhiNumBins();
174 UInt_t kDEtaNumBins = fSelector->DEtaNumBins();
175 UInt_t nPoutBins = UInt_t(TMath::Ceil(2.2*maxAssoc/bwPout)); // since |p_out|<p_Ta
176 if(fRecoTrigg) { // if any correlation has reconstructed trigger, define ntuple; use id to differentiate
177 fNtuParent = new TNtuple("fNtuParent","Reconstructed Parent Ntuple","id:q:m:pT:phi:eta:assym:open");
178 histosContainer->AddLast(fNtuParent);
180 for(UInt_t htc=0; htc<nTypeCorrel; htc++){ // loop over correlation types
181 for(UInt_t hic=0; hic<nBinsCentr; hic++){ // centrality loop
182 for(UInt_t hiv=0; hiv<nBinsZVert; hiv++){ // vertex loop
183 for(UInt_t hit=0; hit<nBinsTrigg; hit++){ // trigger loop
184 for(UInt_t hia=0; hia<nBinsAssoc; hia++){ // associated loop
185 fHtit = fMaker->Descriptor(htc); fHtit+=":"; fHtit+=hic; fHtit+=hiv; fHtit+=hit; fHtit+=hia;
186 fHname="fHReal"; fHname+=htc; fHname+=hic; fHname+=hiv; fHname+=hit; fHname+=hia;
187 fHReal[htc][hic][hiv][hit][hia] = new TH3F(fHname,fHtit, kDPhiNumBins,lr,ur,
189 nPoutBins,-1.1*maxAssoc,1.1*maxAssoc);
190 histosContainer->AddLast(fHReal[htc][hic][hiv][hit][hia]);
191 fHname="fHMix"; fHname+=htc; fHname+=hic; fHname+=hiv; fHname+=hit; fHname+=hia;
192 fHMix[htc][hic][hiv][hit][hia] = new TH3F(fHname,fHtit, kDPhiNumBins,lr,ur,
194 nPoutBins,-1.1*maxAssoc,1.1*maxAssoc);
195 histosContainer->AddLast(fHMix[htc][hic][hiv][hit][hia]);
196 } // loop over associated bins
197 } // loop over trigger bins
198 } // loop over vertex bins
199 } // loop over centrality bins
200 } // loop over correlation types
203 /////////////////////////////////////////////////////////
204 // METHODS FOR FILLING THE OUTPUT HISTOGRAMS
205 /////////////////////////////////////////////////////////
207 void AliJetCorrelWriter::FillGlobal(Float_t cent, Float_t zvert){
208 // some global event histos
210 fHZVert->Fill(zvert);
213 void AliJetCorrelWriter::FillSingleHistos(UInt_t cBin, CorrelList_t * const TriggList, UInt_t tIdx,
214 CorrelList_t * const AssocList, UInt_t aIdx){
215 // fills single-particle histograms
216 if(TriggList->Size()>0){
217 CorrelListIter_t trigIter = TriggList->Head();
218 while(!trigIter.HasEnded()){
219 CorrelParticle_t *particle = trigIter.Data();
220 fHTriggPt[tIdx][cBin]->Fill(particle->Pt());
221 if(fSelector->GenQA()) fHTriggAcc[tIdx]->Fill(particle->Phi(),particle->Eta(),particle->Pt());
225 if(AssocList->Size()>0){
226 CorrelListIter_t assoIter = AssocList->Head();
227 while(!assoIter.HasEnded()){
228 CorrelParticle_t *particle = assoIter.Data();
229 fHAssocPt[aIdx][cBin]->Fill(particle->Pt());
230 if(fSelector->GenQA()) fHAssocAcc[aIdx]->Fill(particle->Phi(),particle->Eta(),particle->Pt());
236 void AliJetCorrelWriter::FillTrackQA(AliESDtrack * const track, UInt_t idx){
237 // fills single-particle QA
238 if(idx>1){std::cerr<<"AliJetCorrelWriter::FillTrackQA: wrong idx!"<<std::endl; exit(-1);}
240 UInt_t nClusITS = track->GetITSclusters(0);
241 UInt_t nClusTPC = track->GetTPCclusters(0); // or track->GetTPCNcls() ?
242 Float_t chi2ITS=-1., chi2TPC=-1.;
243 if(nClusITS!=0) chi2ITS = track->GetITSchi2()/Float_t(nClusITS);
244 if(nClusTPC!=0) chi2TPC = track->GetTPCchi2()/Float_t(nClusTPC);
245 UInt_t kinkIndex = track->GetKinkIndex(0);
246 Float_t sigVtx = fSelector->GetSigmaToVertex(track);
248 fHTrkITSQA[idx]->Fill(Float_t(nClusITS),chi2ITS);
249 fHTrkTPCQA[idx]->Fill(Float_t(nClusTPC),chi2TPC);
250 fHTrkVTXQA[idx]->Fill(Float_t(kinkIndex),sigVtx);
253 void AliJetCorrelWriter::FillParentNtuple(CorrelList_t * const ParentList){
254 // fills ntuple of triggers when they are reconstructed parents (pi0,Z0,etc.)
256 {std::cerr<<"AliJetCorrelWriter::FillParentNtuple: you shouldn't be here!"<<std::endl; exit(-1);}
257 if(ParentList->Size()<1) return;
258 Float_t parVar[8]={0.};
259 CorrelListIter_t parIter = ParentList->Head();
260 while(!parIter.HasEnded()){
261 CorrelRecoParent_t *parent = dynamic_cast<CorrelRecoParent_t*>(parIter.Data());
263 {std::cerr<<"AliJetCorrelWriter::FillParentNtuple: failed casting!"<<std::endl; exit(-1);}
264 parVar[0] = parent->ID();
265 parVar[1] = parent->Q();
266 parVar[2] = parent->M();
267 parVar[3] = parent->Pt();
268 parVar[4] = parent->Phi();
269 parVar[5] = parent->Eta();
270 parVar[6] = parent->Assym();
271 parVar[7] = parent->OpenAng();
272 fNtuParent->Fill(parVar);
277 void AliJetCorrelWriter::FillCorrelations(FillType_t fTyp, UInt_t iCorr, UInt_t cBin, UInt_t vBin,
278 CorrelParticle_t * const Trigg, CorrelParticle_t * const Assoc){
279 // fills the correlation (two-particle) histograms
280 // trigger information (this is why the first particle has to be the trigger):
281 Float_t ptt = Trigg->Pt();
282 Float_t phit = Trigg->Phi();
283 Float_t etat = Trigg->Eta();
284 Int_t tBin = fSelector->GetBin(trigg,ptt);
285 // associated information:
286 Float_t pta = Assoc->Pt();
287 Float_t phia = Assoc->Phi();
288 Float_t etaa = Assoc->Eta();
289 Int_t aBin = fSelector->GetBin(assoc,pta);
290 // Short_t qprod= Trigg->Q()*Assoc->Q();
292 if(tBin<0 || aBin<0) return; // one of them is not in the required pT range
293 if(pta>=ptt) return; // use only associated particles below the trigger
294 if(fabs(ptt-pta)<1.e-6 && fabs(phit-phia)<1.e-6 && fabs(etat-etaa)<1.e-6) return; // don't auto-correlate
296 // store track pair proximity
297 if(Trigg->ID()==hadron && Assoc->ID()==hadron){
298 CorrelTrack_t* trk1 = dynamic_cast<CorrelTrack_t*>(Trigg);
299 CorrelTrack_t* trk2 = dynamic_cast<CorrelTrack_t*>(Assoc);
301 {std::cerr<<"AliJetCorrelWriter::FillCorrelations: failed casting!"<<std::endl; exit(-1);}
302 Float_t pairDist = trk1->Dist(trk2);
303 if(fSelector->CloseTrackPair(pairDist)) return; // proximity cut
304 if(fSelector->GenQA()) fHTrkProx[fTyp][cBin]->Fill(pairDist,ptt,pta);
307 // Fill correlation histograms:
308 Float_t dphi = DeltaPhi(phit,phia);
309 Float_t deta = etat-etaa;
310 Float_t pout = pta*TMath::Sin(dphi);
312 fHReal[iCorr][cBin][vBin][tBin][aBin]->Fill(dphi,deta,pout);
314 fHMix[iCorr][cBin][vBin][tBin][aBin]->Fill(dphi,deta,pout);
317 Float_t AliJetCorrelWriter::DeltaPhi(Float_t phi1, Float_t phi2) {
318 // wrapps dphi in (-pi/3,5pi/3)
319 Float_t kPi = TMath::Pi();
320 Float_t res = phi2-phi1;
321 if(fRndm.Uniform()<0.5) res = phi1-phi2;
322 if(5.*kPi/3.<res && res<=2.*kPi) res-=2*kPi;
323 else if(-2.*kPi<=res && res<-kPi/3.) res+=2*kPi;
324 // if(3.*kPi/2.<res && res<=2*kPi) res-=2*kPi;
325 // else if(-2.*kPi<=res && res<-kPi/2.) res+=2*kPi;