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 **************************************************************************/
16 ////////////////////////////////////////////////////////////////////////////
17 // ---- CORRECTION FRAMEWORK ----
18 // class AliCFParticleGenCuts implementation
19 // Using this class a user may define selections relative to
20 // MC particle (AliMCParticle) using generation-level information.
21 ////////////////////////////////////////////////////////////////////////////
22 // author : R. Vernet (renaud.vernet@cern.ch)
23 ////////////////////////////////////////////////////////////////////////////
26 #include "AliCFParticleGenCuts.h"
27 #include "TParticle.h"
28 #include "TParticlePDG.h"
29 #include "AliMCEvent.h"
37 ClassImp(AliCFParticleGenCuts)
39 //______________________________
40 AliCFParticleGenCuts::AliCFParticleGenCuts() :
46 fRequireIsSecondary(0),
49 fProdVtxXMin (-1.e+09),
50 fProdVtxYMin (-1.e+09),
51 fProdVtxZMin (-1.e+09),
52 fProdVtxXMax ( 1.e+09),
53 fProdVtxYMax ( 1.e+09),
54 fProdVtxZMax ( 1.e+09),
55 fDecayVtxXMin(-1.e+09),
56 fDecayVtxYMin(-1.e+09),
57 fDecayVtxZMin(-1.e+09),
58 fDecayVtxXMax( 1.e+09),
59 fDecayVtxYMax( 1.e+09),
60 fDecayVtxZMax( 1.e+09),
62 fDecayLengthMax(1.e+09),
66 fhCutCorrelation(0x0),
72 for (int i=0; i<kNCuts; i++)
73 for (int j=0; j<kNStepQA; j++)
77 //______________________________
78 AliCFParticleGenCuts::AliCFParticleGenCuts(const Char_t* name, const Char_t* title) :
79 AliCFCutBase(name,title),
84 fRequireIsSecondary(0),
87 fProdVtxXMin (-1.e+09),
88 fProdVtxYMin (-1.e+09),
89 fProdVtxZMin (-1.e+09),
90 fProdVtxXMax ( 1.e+09),
91 fProdVtxYMax ( 1.e+09),
92 fProdVtxZMax ( 1.e+09),
93 fDecayVtxXMin(-1.e+09),
94 fDecayVtxYMin(-1.e+09),
95 fDecayVtxZMin(-1.e+09),
96 fDecayVtxXMax( 1.e+09),
97 fDecayVtxYMax( 1.e+09),
98 fDecayVtxZMax( 1.e+09),
100 fDecayLengthMax(1.e+09),
102 fDecayRxyMax(1.e+09),
103 fhCutStatistics(0x0),
104 fhCutCorrelation(0x0),
105 fBitmap(new TBits(0))
110 for (int i=0; i<kNCuts; i++)
111 for (int j=0; j<kNStepQA; j++)
115 //______________________________
116 AliCFParticleGenCuts::AliCFParticleGenCuts(const AliCFParticleGenCuts& c) :
119 fRequireIsCharged(c.fRequireIsCharged),
120 fRequireIsNeutral(c.fRequireIsNeutral),
121 fRequireIsPrimary(c.fRequireIsPrimary),
122 fRequireIsSecondary(c.fRequireIsSecondary),
123 fRequirePdgCode(c.fRequirePdgCode),
124 fPdgCode(c.fPdgCode),
125 fProdVtxXMin (c.fProdVtxXMin),
126 fProdVtxYMin (c.fProdVtxYMin),
127 fProdVtxZMin (c.fProdVtxZMin),
128 fProdVtxXMax (c.fProdVtxXMax),
129 fProdVtxYMax (c.fProdVtxYMax),
130 fProdVtxZMax (c.fProdVtxZMax),
131 fDecayVtxXMin(c.fDecayVtxXMin),
132 fDecayVtxYMin(c.fDecayVtxYMin),
133 fDecayVtxZMin(c.fDecayVtxZMin),
134 fDecayVtxXMax(c.fDecayVtxXMax),
135 fDecayVtxYMax(c.fDecayVtxYMax),
136 fDecayVtxZMax(c.fDecayVtxZMax),
137 fDecayLengthMin(c.fDecayLengthMin),
138 fDecayLengthMax(c.fDecayLengthMin),
139 fDecayRxyMin(c.fDecayLengthMin),
140 fDecayRxyMax(c.fDecayLengthMin),
141 fhCutStatistics(new TH1F(*c.fhCutStatistics)),
142 fhCutCorrelation(new TH2F(*c.fhCutCorrelation)),
143 fBitmap(new TBits(*c.fBitmap))
148 if (c.fhCutStatistics) fhCutStatistics = new TH1F(*c.fhCutStatistics) ;
149 if (c.fhCutCorrelation) fhCutCorrelation = new TH2F(*c.fhCutCorrelation) ;
151 for (int i=0; i<kNCuts; i++)
152 for (int j=0; j<kNStepQA; j++)
153 fhQA[i][j]=(TH1F*)c.fhQA[i][j]->Clone();
156 //______________________________
157 AliCFParticleGenCuts& AliCFParticleGenCuts::operator=(const AliCFParticleGenCuts& c)
160 // Assignment operator
163 AliCFCutBase::operator=(c) ;
165 fRequireIsCharged=c.fRequireIsCharged;
166 fRequireIsNeutral=c.fRequireIsNeutral;
167 fRequireIsPrimary=c.fRequireIsPrimary;
168 fRequireIsSecondary=c.fRequireIsSecondary;
169 fRequirePdgCode=c.fRequirePdgCode;
171 fProdVtxXMin=c.fProdVtxXMin;
172 fProdVtxYMin=c.fProdVtxYMin;
173 fProdVtxZMin=c.fProdVtxZMin;
174 fProdVtxXMax=c.fProdVtxXMax;
175 fProdVtxYMax=c.fProdVtxYMax;
176 fProdVtxZMax=c.fProdVtxZMax;
177 fDecayVtxXMin=c.fDecayVtxXMin;
178 fDecayVtxYMin=c.fDecayVtxYMin;
179 fDecayVtxZMin=c.fDecayVtxZMin;
180 fDecayVtxXMax=c.fDecayVtxXMax;
181 fDecayVtxYMax=c.fDecayVtxYMax;
182 fDecayVtxZMax=c.fDecayVtxZMax;
183 fDecayLengthMin=c.fDecayVtxZMax;
184 fDecayLengthMax=c.fDecayLengthMax;
185 fDecayRxyMin=c.fDecayRxyMin;
186 fDecayRxyMax=c.fDecayRxyMax;
187 fBitmap=new TBits(*c.fBitmap);
189 if (fhCutStatistics) fhCutStatistics =new TH1F(*c.fhCutStatistics) ;
190 if (fhCutCorrelation) fhCutCorrelation=new TH2F(*c.fhCutCorrelation);
192 for (int i=0; i<kNCuts; i++)
193 for (int j=0; j<kNStepQA; j++)
194 fhQA[i][j]=(TH1F*)c.fhQA[i][j]->Clone();
199 //______________________________
200 Bool_t AliCFParticleGenCuts::IsSelected(TObject* obj) {
202 // check if selections on 'obj' are passed
203 // 'obj' must be an AliMCParticle
206 SelectionBitMap(obj);
208 if (fIsQAOn) FillHistograms(obj,0);
210 for (UInt_t icut=0; icut<fBitmap->GetNbits();icut++)
211 if (!fBitmap->TestBitNumber(icut)) return kFALSE ;
213 if (fIsQAOn) FillHistograms(obj,1);
217 //__________________________________________________________________________________
218 void AliCFParticleGenCuts::SelectionBitMap(TObject* obj)
221 // test if the track passes the single cuts
222 // and store the information in a bitmap
225 for (UInt_t i=0; i<kNCuts; i++) fBitmap->SetBitNumber(i,kFALSE);
228 TString className(obj->ClassName());
229 if (className.CompareTo("AliMCParticle") != 0) {
230 AliError("argument must point to an AliMCParticle !");
234 AliMCParticle* mcPart = (AliMCParticle*) obj ;
235 TParticle* part = mcPart->Particle();
236 AliStack* stack = fMCInfo->Stack();
238 Double32_t partVx=(Double32_t)part->Vx();
239 Double32_t partVy=(Double32_t)part->Vy();
240 Double32_t partVz=(Double32_t)part->Vz();
242 TParticle* daughter=0x0;
243 Double32_t decayVx=0.;
244 Double32_t decayVy=0.;
245 Double32_t decayVz=0.;
246 Double32_t decayL=0.;
247 Double32_t decayRxy=0.;
249 if ( part->GetNDaughters() > 0 ) {
250 daughter = stack->Particle(part->GetFirstDaughter()) ;
251 decayVx=(Double32_t)daughter->Vx();
252 decayVy=(Double32_t)daughter->Vy();
253 decayVz=(Double32_t)daughter->Vz();
254 decayL = TMath::Sqrt(TMath::Power(partVx-decayVx,2) +
255 TMath::Power(partVy-decayVy,2) +
256 TMath::Power(partVz-decayVz,2) ) ;
257 decayRxy = TMath::Sqrt(TMath::Power(decayVx,2) + TMath::Power(decayVy,2) ) ;
264 if ( fRequireIsCharged || fRequireIsNeutral ) {
265 if(fRequireIsCharged && IsCharged(mcPart)) fBitmap->SetBitNumber(iCutBit,kTRUE);
266 if(fRequireIsNeutral && !IsCharged(mcPart)) fBitmap->SetBitNumber(iCutBit,kTRUE);
268 else fBitmap->SetBitNumber(iCutBit,kTRUE);
271 // cut on primary/secondary
272 if ( fRequireIsPrimary || fRequireIsSecondary) {
273 if (fRequireIsPrimary && IsPrimary(mcPart,stack)) fBitmap->SetBitNumber(iCutBit,kTRUE);
274 if (fRequireIsSecondary && !IsPrimary(mcPart,stack)) fBitmap->SetBitNumber(iCutBit,kTRUE);
276 else fBitmap->SetBitNumber(iCutBit,kTRUE);
280 if ( fRequirePdgCode ){
281 if (IsA(mcPart,fPdgCode,kTRUE)) fBitmap->SetBitNumber(iCutBit,kTRUE);
283 else fBitmap->SetBitNumber(iCutBit,kTRUE);
286 // production vertex cuts
287 if ( partVx > fProdVtxXMin ) fBitmap->SetBitNumber(iCutBit,kTRUE);
289 if ( partVx < fProdVtxXMax ) fBitmap->SetBitNumber(iCutBit,kTRUE);
291 if ( partVy > fProdVtxYMin ) fBitmap->SetBitNumber(iCutBit,kTRUE);
293 if ( partVy < fProdVtxYMax ) fBitmap->SetBitNumber(iCutBit,kTRUE);
295 if ( partVz > fProdVtxZMin ) fBitmap->SetBitNumber(iCutBit,kTRUE);
297 if ( partVz < fProdVtxZMax ) fBitmap->SetBitNumber(iCutBit,kTRUE);
301 if ( decayVx > fDecayVtxXMin ) fBitmap->SetBitNumber(iCutBit,kTRUE);
303 if ( decayVx < fDecayVtxXMax ) fBitmap->SetBitNumber(iCutBit,kTRUE);
305 if ( decayVy > fDecayVtxYMin ) fBitmap->SetBitNumber(iCutBit,kTRUE);
307 if ( decayVy < fDecayVtxYMax ) fBitmap->SetBitNumber(iCutBit,kTRUE);
309 if ( decayVz > fDecayVtxZMin ) fBitmap->SetBitNumber(iCutBit,kTRUE);
311 if ( decayVz < fDecayVtxZMax ) fBitmap->SetBitNumber(iCutBit,kTRUE);
315 if ( decayL > fDecayLengthMin ) fBitmap->SetBitNumber(iCutBit,kTRUE);
317 if ( decayL < fDecayLengthMax ) fBitmap->SetBitNumber(iCutBit,kTRUE);
320 // transverse decay length cuts
321 if ( decayRxy > fDecayRxyMin ) fBitmap->SetBitNumber(iCutBit,kTRUE);
323 if ( decayRxy < fDecayRxyMax ) fBitmap->SetBitNumber(iCutBit,kTRUE);
327 //__________________________________________________________________________________
328 void AliCFParticleGenCuts::FillHistograms(TObject* obj, Bool_t afterCuts)
331 // fill the QA histograms
334 for (int iCutNumber = 0; iCutNumber < kNCuts; iCutNumber++)
335 fhQA[iCutNumber][afterCuts]->Fill(fBitmap->TestBitNumber(iCutNumber));
337 // fill cut statistics and cut correlation histograms with information from the bitmap
338 if (afterCuts) return;
340 // Number of single cuts in this class
341 UInt_t ncuts = fBitmap->GetNbits();
342 for(UInt_t bit=0; bit<ncuts;bit++) {
343 if (!fBitmap->TestBitNumber(bit)) {
344 fhCutStatistics->Fill(bit+1);
345 for (UInt_t bit2=bit; bit2<ncuts;bit2++) {
346 if (!fBitmap->TestBitNumber(bit2))
347 fhCutCorrelation->Fill(bit+1,bit2+1);
353 //__________________________________________________________________________________
354 void AliCFParticleGenCuts::AddQAHistograms(TList *qaList) {
356 // saves the histograms in a TList
361 qaList->Add(fhCutStatistics);
362 qaList->Add(fhCutCorrelation);
364 for (Int_t j=0; j<kNStepQA; j++) {
365 for(Int_t i=0; i<kNCuts; i++)
366 qaList->Add(fhQA[i][j]);
370 //__________________________________________________________________________________
371 void AliCFParticleGenCuts::DefineHistograms() {
373 // histograms for cut variables, cut statistics and cut correlations
377 // book cut statistics and cut correlation histograms
378 fhCutStatistics = new TH1F(Form("%s_cut_statistics",GetName()),"",kNCuts,0.5,kNCuts+0.5);
379 fhCutStatistics->SetLineWidth(2);
381 fhCutStatistics->GetXaxis()->SetBinLabel(k,"charge") ; k++;
382 fhCutStatistics->GetXaxis()->SetBinLabel(k,"prim/sec") ; k++;
383 fhCutStatistics->GetXaxis()->SetBinLabel(k,"PDG") ; k++;
384 fhCutStatistics->GetXaxis()->SetBinLabel(k,"VtxXMin") ; k++;
385 fhCutStatistics->GetXaxis()->SetBinLabel(k,"VtxXMax") ; k++;
386 fhCutStatistics->GetXaxis()->SetBinLabel(k,"VtxYMin") ; k++;
387 fhCutStatistics->GetXaxis()->SetBinLabel(k,"VtxYMax") ; k++;
388 fhCutStatistics->GetXaxis()->SetBinLabel(k,"VtxZMin") ; k++;
389 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecZMax") ; k++;
390 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecXMin") ; k++;
391 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecXMax") ; k++;
392 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecYMin") ; k++;
393 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecYMax") ; k++;
394 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecZMin") ; k++;
395 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecZMax") ; k++;
396 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecLgthMin") ; k++;
397 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecLgthMax") ; k++;
398 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecRxyMin") ; k++;
399 fhCutStatistics->GetXaxis()->SetBinLabel(k,"DecRxyMax") ; k++;
402 fhCutCorrelation = new TH2F(Form("%s_cut_correlation",GetName()),"",kNCuts,0.5,kNCuts+0.5,kNCuts,0.5,kNCuts+0.5);
403 fhCutCorrelation->SetLineWidth(2);
404 for (k=1; k<=kNCuts; k++) {
405 fhCutCorrelation->GetXaxis()->SetBinLabel(k,fhCutStatistics->GetXaxis()->GetBinLabel(k));
406 fhCutCorrelation->GetYaxis()->SetBinLabel(k,fhCutStatistics->GetXaxis()->GetBinLabel(k));
410 for (int i=0; i<kNStepQA; i++) {
411 if (i==0) sprintf(str," ");
412 else sprintf(str,"_cut");
413 fhQA[kCutCharge] [i] = new TH1F(Form("%s_charge%s" ,GetName(),str),"",2,-0.5,1.5);
414 fhQA[kCutPrimSec] [i] = new TH1F(Form("%s_primSec%s" ,GetName(),str),"",2,-0.5,1.5);
415 fhQA[kCutPDGCode] [i] = new TH1F(Form("%s_pdgCode%s" ,GetName(),str),"",10000,-5000,5000);
416 fhQA[kCutProdVtxXMin][i] = new TH1F(Form("%s_prodVtxXMin%s" ,GetName(),str),"",100,0,10);
417 fhQA[kCutProdVtxXMax][i] = new TH1F(Form("%s_prodVtxXMax%s" ,GetName(),str),"",100,0,10);
418 fhQA[kCutProdVtxYMin][i] = new TH1F(Form("%s_prodVtxYMin%s" ,GetName(),str),"",100,0,10);
419 fhQA[kCutProdVtxYMax][i] = new TH1F(Form("%s_prodVtxYMax%s" ,GetName(),str),"",100,0,10);
420 fhQA[kCutProdVtxZMin][i] = new TH1F(Form("%s_prodVtxZMin%s" ,GetName(),str),"",100,0,10);
421 fhQA[kCutProdVtxZMax][i] = new TH1F(Form("%s_prodVtxZMax%s" ,GetName(),str),"",100,0,10);
422 fhQA[kCutDecVtxXMin] [i] = new TH1F(Form("%s_decVtxXMin%s" ,GetName(),str),"",100,0,10);
423 fhQA[kCutDecVtxXMax] [i] = new TH1F(Form("%s_decVtxXMax%s" ,GetName(),str),"",100,0,10);
424 fhQA[kCutDecVtxYMin] [i] = new TH1F(Form("%s_decVtxYMin%s" ,GetName(),str),"",100,0,10);
425 fhQA[kCutDecVtxYMax] [i] = new TH1F(Form("%s_decVtxYMax%s" ,GetName(),str),"",100,0,10);
426 fhQA[kCutDecVtxZMin] [i] = new TH1F(Form("%s_decVtxZMin%s" ,GetName(),str),"",100,0,10);
427 fhQA[kCutDecVtxZMax] [i] = new TH1F(Form("%s_decVtxZMax%s" ,GetName(),str),"",100,0,10);
428 fhQA[kCutDecLgthMin] [i] = new TH1F(Form("%s_decLengthMin%s",GetName(),str),"",100,0,10);
429 fhQA[kCutDecLgthMax] [i] = new TH1F(Form("%s_decLengthMax%s",GetName(),str),"",100,0,10);
430 fhQA[kCutDecRxyMin] [i] = new TH1F(Form("%s_decRxyMin%s" ,GetName(),str),"",100,0,10);
431 fhQA[kCutDecRxyMax] [i] = new TH1F(Form("%s_decRxyMax%s" ,GetName(),str),"",100,0,10);
433 for(Int_t i=0; i<kNCuts; i++) fhQA[i][1]->SetLineColor(color);
437 //______________________________
438 Bool_t AliCFParticleGenCuts::IsCharged(AliMCParticle *mcPart) {
440 //check if particle is charged.
442 TParticle* part = mcPart->Particle();
443 TParticlePDG* pdgPart = part->GetPDG();
444 if(!pdgPart)return kFALSE;
445 if (pdgPart->Charge() == 0) return kFALSE;
448 //______________________________
449 Bool_t AliCFParticleGenCuts::IsPrimary(AliMCParticle *mcPart, AliStack *stack) {
451 //check if particle is primary (standard definition)
453 if (!stack->IsPhysicalPrimary(mcPart->Label())) return kFALSE ;
456 //______________________________
457 Bool_t AliCFParticleGenCuts::IsPrimaryCharged(AliMCParticle *mcPart, AliStack *stack) {
459 //check if a charged particle is primary (standard definition)
461 if (!stack->IsPhysicalPrimary(mcPart->Label()) || !IsCharged(mcPart)) return kFALSE ;
464 //______________________________
465 Bool_t AliCFParticleGenCuts::IsA(AliMCParticle *mcPart, Int_t pdg, Bool_t abs) {
467 //Check on the pdg code of the MC particle. if abs=kTRUE then check on the
468 //absolute value. By default is set to kFALSE.
470 TParticle* part = mcPart->Particle();
471 Int_t pdgCode = part->GetPdgCode();
472 if (abs) pdgCode = TMath::Abs(pdgCode);
473 if (pdgCode != pdg ) return kFALSE;
476 //______________________________
477 void AliCFParticleGenCuts::SetEvtInfo(TObject* mcEvent) {
479 // Sets pointer to MC event information (AliMCEvent)
483 AliError("Pointer to MC Event is null !");
487 TString className(mcEvent->ClassName());
488 if (className.CompareTo("AliMCEvent") != 0) {
489 AliError("argument must point to an AliMCEvent !");
493 fMCInfo = (AliMCEvent*) mcEvent ;