4 #include <TDatabasePDG.h>
6 #include "AliAnalysisDataSlot.h"
7 #include "AliAnalysisDataContainer.h"
8 #include "AliAnalysisManager.h"
9 #include "AliAODEvent.h"
10 #include "AliAODMCParticle.h"
11 #include "AliAODTrack.h"
12 #include "AliAODTracklets.h"
13 #include "AliMultiplicity.h"
14 #include "AliCFManager.h"
15 #include "AliCFCutBase.h"
16 #include "AliCFContainer.h"
17 #include "AliESDEvent.h"
18 #include "AliESDtrack.h"
19 #include "AliESDtrackCuts.h"
20 #include "AliESDVertex.h"
21 #include "AliInputEventHandler.h"
22 #include "AliMCEvent.h"
23 #include "AliVEvent.h"
24 #include "AliAODEvent.h"
25 #include "AliVVertex.h"
28 #include "AliGenEventHeader.h"
29 #include "AliAODMCHeader.h"
30 #include "AliCentrality.h"
32 #include "AliSingleTrackEffCuts.h"
33 #include "AliCFSingleTrackEfficiencyTask.h"
36 ClassImp(AliCFSingleTrackEfficiencyTask)
38 //__________________________________________________________________________
39 AliCFSingleTrackEfficiencyTask::AliCFSingleTrackEfficiencyTask() :
45 fTriggerMask(AliVEvent::kAny),
46 fSetFilterBit(kFALSE),
48 fEvalCentrality(kFALSE),
49 fCentralityEstimator("V0M"),
50 fHistEventsProcessed(0x0)
57 //___________________________________________________________________________
58 AliCFSingleTrackEfficiencyTask::AliCFSingleTrackEfficiencyTask(const Char_t* name,AliESDtrackCuts *trackcuts, AliSingleTrackEffCuts * mccuts) :
59 AliAnalysisTaskSE(name),
63 fTrackCuts(trackcuts),
65 fTriggerMask(AliVEvent::kAny),
66 fSetFilterBit(kFALSE),
68 fEvalCentrality(kFALSE),
69 fCentralityEstimator("V0M"),
70 fHistEventsProcessed(0x0)
73 // Constructor. Initialization of Inputs and Outputs
75 Info("AliCFSingleTrackEfficiencyTask","Calling Constructor");
77 // Output slot #1 writes into a TList container (nevents histogran)
78 DefineOutput(1,TH1I::Class());
79 // Output slot #2 writes into a TList container (distributions)
80 DefineOutput(2,AliCFContainer::Class());
81 // Output slot #3 writes the QA list
82 DefineOutput(3,TList::Class());
83 // Output slot #3 writes the ESD track cuts used
84 DefineOutput(4,AliESDtrackCuts::Class());
85 // Output slot #4 writes the particle and event selection object
86 DefineOutput(5,AliSingleTrackEffCuts::Class());
89 //_________________________________________________________________________________________________________________
90 AliCFSingleTrackEfficiencyTask& AliCFSingleTrackEfficiencyTask::operator=(const AliCFSingleTrackEfficiencyTask& c)
93 // Assignment operator
96 AliAnalysisTaskSE::operator=(c) ;
98 fReadAODData = c.fReadAODData;
99 fCFManager = c.fCFManager;
100 fQAHistList = c.fQAHistList;
102 if(c.fTrackCuts) { delete fTrackCuts; fTrackCuts = new AliESDtrackCuts(*(c.fTrackCuts)); }
103 if(c.fMCCuts) { delete fMCCuts; fMCCuts = new AliSingleTrackEffCuts(*(c.fMCCuts)); }
104 fTriggerMask = c.fTriggerMask;
106 fSetFilterBit = c.fSetFilterBit;
109 fEvalCentrality = c.fEvalCentrality;
110 fCentralityEstimator = c.fCentralityEstimator;
112 fHistEventsProcessed = c.fHistEventsProcessed;
117 //________________________________________________________________________________________________________
118 AliCFSingleTrackEfficiencyTask::AliCFSingleTrackEfficiencyTask(const AliCFSingleTrackEfficiencyTask& c) :
119 AliAnalysisTaskSE(c),
120 fReadAODData(c.fReadAODData),
121 fCFManager(c.fCFManager),
122 fQAHistList(c.fQAHistList),
123 fTrackCuts(c.fTrackCuts),
125 fTriggerMask(c.fTriggerMask),
126 fSetFilterBit(c.fSetFilterBit),
128 fEvalCentrality(c.fEvalCentrality),
129 fCentralityEstimator(c.fCentralityEstimator),
130 fHistEventsProcessed(c.fHistEventsProcessed)
137 //___________________________________________________________________________
138 AliCFSingleTrackEfficiencyTask::~AliCFSingleTrackEfficiencyTask()
143 Info("~AliCFSingleTrackEfficiencyTask","Calling Destructor");
145 if (fCFManager) delete fCFManager;
146 if (fHistEventsProcessed) delete fHistEventsProcessed;
147 if (fQAHistList) { fQAHistList->Clear(); delete fQAHistList; }
148 if (fTrackCuts) delete fTrackCuts;
149 if (fMCCuts) delete fMCCuts;
152 //_________________________________________________
153 void AliCFSingleTrackEfficiencyTask::Init()
156 // Initialization, checks + copy cuts
159 AliFatal(" MC Cuts not defined");
163 AliFatal(" Track Cuts not defined");
167 AliESDtrackCuts* copyfTrackCuts = new AliESDtrackCuts(*fTrackCuts);
168 const char* nameoutput = GetOutputSlot(4)->GetContainer()->GetName();
169 copyfTrackCuts->SetName(nameoutput);
171 PostData(4,copyfTrackCuts);
173 AliSingleTrackEffCuts* copyfMCCuts = new AliSingleTrackEffCuts(*fMCCuts);
174 nameoutput = GetOutputSlot(5)->GetContainer()->GetName();
175 copyfMCCuts->SetName(nameoutput);
177 PostData(5,copyfMCCuts);
180 if(fEvalCentrality) {
181 Bool_t isCentEstimatorOk = kFALSE;
182 TString validEstimators[9] = { "V0M", "V0A", "V0C", "TRK", "TKL", "CL1", "ZNA", "ZNC" "ZPA" };
183 for(Int_t i=0; i<9; i++ ) {
184 if(fCentralityEstimator==validEstimators[i]) isCentEstimatorOk = kTRUE;
186 if(!isCentEstimatorOk) {
187 AliFatal(Form("Chosen centrality estimator %s is not valid\n",fCentralityEstimator.Data()));
195 //_________________________________________________________________
196 void AliCFSingleTrackEfficiencyTask::UserExec(Option_t *)
202 Info("UserExec","Start of method") ;
204 AliVEvent* event = fInputEvent;
207 AliFatal("NO EVENT FOUND!");
211 AliFatal("NO MC INFO FOUND");
215 fHistEventsProcessed->Fill(0.5); // # of Event proceed
216 Bool_t IsEventMCSelected = kFALSE;
217 Bool_t isAOD = fInputEvent->IsA()->InheritsFrom("AliAODEvent");
220 // Step 0: MC Gen Event Selection
223 if(!event && AODEvent() && IsStandardAOD()) {
224 // In case there is an AOD handler writing a standard AOD, use the AOD
225 // event in memory rather than the input (ESD) event.
226 event = dynamic_cast<AliAODEvent*> (AODEvent());
228 IsEventMCSelected = fMCCuts->IsMCEventSelected(event);//AODs
230 IsEventMCSelected = fMCCuts->IsMCEventSelected(fMCEvent);//ESDs
233 // pass to the manager the event info to the cuts that need it
234 if(!isAOD) fCFManager->SetMCEventInfo(fMCEvent);
235 else fCFManager->SetMCEventInfo(event);
236 fCFManager->SetRecEventInfo(event);
238 if(!IsEventMCSelected) {
239 AliDebug(3,"MC event not passing the quality criteria \n");
240 PostData(1,fHistEventsProcessed);
241 PostData(2,fCFManager->GetParticleContainer());
242 PostData(3,fQAHistList);
245 fHistEventsProcessed->Fill(1.5); // # of Event after passing MC cuts
249 // Step 1-3: Check the MC generated particles
251 if(!isAOD) CheckESDMCParticles();
252 else CheckAODMCParticles();
255 // Step 4-7: Reconstructed event and track selection
257 Bool_t isRecoEventOk = fMCCuts->IsRecoEventSelected(event);
260 fHistEventsProcessed->Fill(2.5); // # of Event after passing all cuts
261 CheckReconstructedParticles();
263 else AliDebug(3,"Event not passing quality criteria\n");
266 PostData(1,fHistEventsProcessed);
267 PostData(2,fCFManager->GetParticleContainer());
268 PostData(3,fQAHistList);
274 //___________________________________________________________________________
275 void AliCFSingleTrackEfficiencyTask::Terminate(Option_t*)
281 Info("Terminate","Start and end of Method");
282 AliAnalysisTaskSE::Terminate();
285 //draw some example plots....
286 AliCFContainer *cont= dynamic_cast<AliCFContainer*> (GetOutputData(2));
288 TH1D* h00 = cont->ShowProjection(5,0) ;
289 TH1D* h01 = cont->ShowProjection(5,1) ;
290 TH1D* h02 = cont->ShowProjection(5,2) ;
291 TH1D* h03 = cont->ShowProjection(5,3) ;
292 TH1D* h04 = cont->ShowProjection(5,4) ;
293 TH1D* h05 = cont->ShowProjection(5,5) ;
294 TH1D* h06 = cont->ShowProjection(5,6) ;
295 TH1D* h07 = cont->ShowProjection(5,7) ;
297 h00->SetMarkerStyle(23) ;
298 h01->SetMarkerStyle(24) ;
299 h02->SetMarkerStyle(25) ;
300 h03->SetMarkerStyle(26) ;
301 h04->SetMarkerStyle(27) ;
302 h05->SetMarkerStyle(28) ;
303 h06->SetMarkerStyle(28) ;
307 TCanvas * c =new TCanvas("c","",1400,800);
327 c->SaveAs("plots.eps");
332 //___________________________________________________________________________
333 void AliCFSingleTrackEfficiencyTask::UserCreateOutputObjects()
336 // UserCreateOutputObjects
339 Info("CreateOutputObjects","CreateOutputObjects of task %s", GetName());
344 const char* nameoutput=GetOutputSlot(1)->GetContainer()->GetName();
345 // fHistEventsProcessed = new TH1I(nameoutput"fHistEventsProcessed","fHistEventsProcessed",3,0,3) ;
346 fHistEventsProcessed = new TH1I(nameoutput,"fHistEventsProcessed",3,0,3) ;
347 fHistEventsProcessed->GetXaxis()->SetBinLabel(1,"All events");
348 fHistEventsProcessed->GetXaxis()->SetBinLabel(2,"Good MC events");
349 fHistEventsProcessed->GetXaxis()->SetBinLabel(3,"Good Reconstructed events");
351 PostData(1,fHistEventsProcessed) ;
352 PostData(2,fCFManager->GetParticleContainer()) ;
353 PostData(3,fQAHistList) ;
359 //_________________________________________________________________________
360 void AliCFSingleTrackEfficiencyTask::CheckESDMCParticles()
363 // Check ESD generated particles
366 AliFatal("NO MC INFO FOUND");
370 Double_t containerInput[7] = { 0., 0., 0., 0., 0., 0., 0. };
373 AliGenEventHeader *genHeader = NULL;
374 genHeader = fMCEvent->GenEventHeader();
375 genHeader->PrimaryVertex(vtxPos);
376 containerInput[4] = vtxPos[2]; // z-vtx position
378 Double_t multiplicity = (Double_t)GetNumberOfTrackletsInEtaRange(-1.0,1.0);
379 containerInput[5] = multiplicity; //reconstructed number of tracklets
381 Double_t centrality = -1.;
382 if(fEvalCentrality) centrality = GetCentrality();
383 containerInput[6] = centrality;
385 // loop on the MC Generated Particles
386 for (Int_t ipart=0; ipart<fMCEvent->GetNumberOfTracks(); ipart++) {
388 AliMCParticle *mcPart = (AliMCParticle*)fMCEvent->GetTrack(ipart);
389 containerInput[0] = (Float_t)mcPart->Pt();
390 containerInput[1] = mcPart->Eta();
391 containerInput[2] = mcPart->Phi();
392 containerInput[3] = mcPart->Theta();
394 // Step 1. Particle passing through Generation criteria and filling
395 if( !fMCCuts->IsMCParticleGenerated(mcPart) ) {
396 AliDebug(3,"MC Particle not passing through genetations criteria\n");
399 fCFManager->GetParticleContainer()->Fill(containerInput,kStepMCGenCut);
401 // Step 2. Particle passing through Kinematic criteria and filling
402 if( !fMCCuts->IsMCParticleInKineAcceptance(mcPart) ) {
403 AliDebug(3,"MC Particle not in the kine acceptance\n");
406 fCFManager->GetParticleContainer()->Fill(containerInput,kStepMCKineCut);
408 // Step 3. Particle passing through Track ref criteria and filling
409 // did leave signal (enough clusters) on the detector
410 if( !fMCCuts->IsMCParticleInReconstructable(mcPart) ) {
411 AliDebug(3,"MC Particle not in the reconstructible\n");
414 fCFManager->GetParticleContainer()->Fill(containerInput,kStepMCAccpCut);
416 }// end of particle loop
422 //________________________________________________________________________
423 void AliCFSingleTrackEfficiencyTask::CheckAODMCParticles()
426 // Check AOD generated particles
429 AliFatal("NO EVENT FOUND!");
433 AliAODEvent* event = dynamic_cast<AliAODEvent*>(fInputEvent);
434 if(!event && AODEvent() && IsStandardAOD()) {
435 // In case there is an AOD handler writing a standard AOD, use the AOD
436 // event in memory rather than the input (ESD) event.
437 event = dynamic_cast<AliAODEvent*> (AODEvent());
439 TClonesArray* mcArray = dynamic_cast<TClonesArray*>(event->FindListObject(AliAODMCParticle::StdBranchName()));
441 AliError("Could not find Monte-Carlo in AOD");
444 AliAODMCHeader *mcHeader=NULL;
445 mcHeader = dynamic_cast<AliAODMCHeader*>(event->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
447 AliError("Could not find MC Header in AOD");
451 Double_t containerInput[7] = { 0., 0., 0., 0., 0., 0., 0. };
452 // Set the z-vertex position
453 containerInput[4] = mcHeader->GetVtxZ();
454 // Multiplicity of the event defined as Ntracklets |eta|<1.0
455 Double_t multiplicity = (Double_t)GetNumberOfTrackletsInEtaRange(-1.0,1.0);
456 containerInput[5] = multiplicity;
457 // Determine the event centrality
458 Double_t centrality = 0.;
459 if(fEvalCentrality) centrality = GetCentrality();
460 containerInput[6] = centrality;
462 for (Int_t ipart=0; ipart<mcArray->GetEntriesFast(); ipart++) {
464 AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(ipart));
466 AliError("Failed casting particle from MC array!, Skipping particle");
469 containerInput[0] = (Float_t)mcPart->Pt();
470 containerInput[1] = mcPart->Eta();
471 containerInput[2] = mcPart->Phi();
472 containerInput[3] = mcPart->Theta();
474 // Step 1. Particle passing through Generation criteria and filling
475 if( !fMCCuts->IsMCParticleGenerated(mcPart) ) {
476 AliDebug(3,"MC Particle not passing quality criteria\n");
479 fCFManager->GetParticleContainer()->Fill(containerInput,kStepMCGenCut);
481 // Step 2. Particle passing through Kinematic criteria and filling
482 if( !fMCCuts->IsMCParticleInKineAcceptance(mcPart) ) {
483 AliDebug(3,"MC Particle not in the acceptance\n");
486 fCFManager->GetParticleContainer()->Fill(containerInput,kStepMCKineCut);
488 // Step 3. Particle passing through Track Ref criteria and filling
489 // but no info available for Track ref in AOD fillng same as above
490 fCFManager->GetParticleContainer()->Fill(containerInput,kStepMCAccpCut);
497 //_______________________________________________________________________________
498 AliESDtrack * AliCFSingleTrackEfficiencyTask::ConvertTrack(AliAODTrack *track)
501 // Convert an AOD track to an ESD track to apply ESDtrackCuts
504 AliAODEvent *aodEvent = (AliAODEvent*)fInputEvent;
505 const AliAODVertex *primary = aodEvent->GetPrimaryVertex();
506 Double_t pos[3],cov[6];
507 primary->GetXYZ(pos);
508 primary->GetCovarianceMatrix(cov);
509 const AliESDVertex vESD(pos,cov,100.,100);
511 AliESDtrack *esdTrack = new AliESDtrack(track);
512 // set the TPC cluster info
513 esdTrack->SetTPCClusterMap(track->GetTPCClusterMap());
514 esdTrack->SetTPCSharedMap(track->GetTPCSharedMap());
515 esdTrack->SetTPCPointsF(track->GetTPCNclsF());
516 // needed to calculate the impact parameters
517 esdTrack->RelateToVertex(&vESD,0.,3.);
518 // std::cout << " primary vtx "<< primary << std::endl;
519 // std::cout << " esdvtx "<< vESD.GetName() << std::endl;
520 // std::cout<< " esdtrack pt "<< esdTrack.Pt() << " and status " << esdTrack.GetStatus() <<endl;
521 // std::cout << " aod track "<< track<< " and status " << track->GetStatus() << std::endl;
522 // std::cout << " esd track "<< esdTrack<< " and status " << esdTrack->GetStatus() << std::endl;
527 //___________________________________________________________________________
528 void AliCFSingleTrackEfficiencyTask::CheckReconstructedParticles()
531 // Check reconstructed particles
534 AliVEvent* event = fInputEvent;
535 Bool_t isAOD = fInputEvent->IsA()->InheritsFrom("AliAODEvent");
536 if(!event && AODEvent() && IsStandardAOD()) {
537 event = dynamic_cast<AliAODEvent*> (AODEvent());
541 Double_t containerInput[7] = { 0, 0, 0, 0, 0, 0, 0}; // contains reconstructed quantities
542 Double_t containerInputMC[7] = { 0, 0, 0, 0, 0, 0, 0}; // contains generated quantities
544 const AliVVertex *vertex = event->GetPrimaryVertex();
545 // set the z-vertex position
546 containerInput[4] = vertex->GetZ();
547 containerInputMC[4] = containerInput[4];
548 // set the event multiplicity as Ntracklets in |eta|<1.0
549 Double_t multiplicity = (Double_t)GetNumberOfTrackletsInEtaRange(-1.0,1.0);
550 containerInput[5] = multiplicity;
551 containerInputMC[5] = multiplicity;
552 // Determine the event centrality
553 Double_t centrality = 0.;
554 if(fEvalCentrality) centrality = GetCentrality();
555 containerInput[6] = centrality;
556 containerInputMC[6] = centrality;
558 // Reco tracks track loop
559 AliVParticle* track = NULL;
560 for (Int_t iTrack = 0; iTrack<event->GetNumberOfTracks(); iTrack++) {
562 track = event->GetTrack(iTrack);
564 AliDebug(3,Form("Track %d not found",iTrack));
570 Double_t pt = TMath::Sqrt(mom[0]*mom[0]+mom[1]*mom[1]);
571 containerInput[0] = pt;
572 containerInput[1] = track->Eta();
573 containerInput[2] = track->Phi();
574 containerInput[3] = track->Theta();
577 // Step 4. Track that are recostructed, filling
579 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed);
582 // Step 5. Track that are recostructed and pass acceptance cuts, filling
584 if (!fMCCuts->IsRecoParticleKineAcceptance(track)) continue;
585 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoKineCuts);
587 // is track associated to particle ? if yes + implimenting the physical primary..
588 Int_t label = TMath::Abs(track->GetLabel());
590 AliDebug(3,"Particle not matching MC label \n");
595 // Step 6-7. Track that are recostructed + Kine + Quality criteria, filling
598 // check particle selections at MC level
599 AliVParticle *mcPart = (AliVParticle*)fMCEvent->GetTrack(label);
600 if(!mcPart) continue;
601 containerInputMC[0] = (Float_t)mcPart->Pt();
602 containerInputMC[1] = mcPart->Eta();
603 containerInputMC[2] = mcPart->Phi();
604 containerInputMC[3] = mcPart->Theta();
606 if (!fMCCuts->IsMCParticleGenerated(mcPart)) continue;
607 // cout<< "MC matching did work"<<endl;
610 // for filter bit selection
611 AliAODTrack *aodTrack = dynamic_cast<AliAODTrack*>(track);
612 if(isAOD && !aodTrack) continue;
613 if(isAOD && fSetFilterBit) if (!aodTrack->TestFilterMask(BIT(fbit))) continue;
614 // cout<<" Filter bit check passed"<<endl;
616 Bool_t isESDtrack = track->IsA()->InheritsFrom("AliESDtrack");
617 AliESDtrack *tmptrack = NULL;
619 tmptrack = dynamic_cast<AliESDtrack*>(track); // ESDs
621 if (aodTrack) tmptrack = ConvertTrack(aodTrack); // AODs
623 if (!tmptrack) continue;
625 // exclude global constrained and TPC only tracks (filter bits 128 and 512)
626 Int_t id = tmptrack->GetID();
628 AliDebug(3,"Track removed bc corresponts to either filter bit 128 or 512 (TPC only tracks)\n");
632 // Apply ESD track cuts
633 if( !fTrackCuts->IsSelected(tmptrack) ){
634 AliDebug(3,"Reconstructed track not passing quality criteria\n");
635 if(isAOD) delete tmptrack;
638 // cout<<" analysis cuts passed"<<endl;
639 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepReconstructedMC);
640 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoQualityCuts);
641 if(isAOD) delete tmptrack;
642 // cout << " checking particle pid"<<endl;
647 if( !fMCCuts->IsRecoParticlePID(track) ){
648 AliDebug(3,"Reconstructed track not passing PID criteria\n");
651 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoPID);
652 // cout << " all steps filled"<<endl;
658 //______________________________________________________________________
659 Int_t AliCFSingleTrackEfficiencyTask::GetNumberOfTrackletsInEtaRange(Double_t mineta, Double_t maxeta)
662 // counts tracklets in given eta range
665 AliAODEvent* event = dynamic_cast<AliAODEvent*>(fInputEvent);
666 Bool_t isAOD = fInputEvent->IsA()->InheritsFrom("AliAODEvent");
667 if(!event && AODEvent() && IsStandardAOD()) {
668 event = dynamic_cast<AliAODEvent*> (AODEvent());
670 if (!event) return -1;
674 AliAODTracklets* tracklets = event->GetTracklets();
675 Int_t nTr=tracklets->GetNumberOfTracklets();
676 for(Int_t iTr=0; iTr<nTr; iTr++){
677 Double_t theta=tracklets->GetTheta(iTr);
678 Double_t eta=-TMath::Log(TMath::Tan(theta/2.));
679 if(eta>mineta && eta<maxeta) count++;
682 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(fInputEvent);
683 if (!esdEvent) return -1;
684 const AliMultiplicity *mult = esdEvent->GetMultiplicity();
686 if (mult->GetNumberOfTracklets()>0) {
687 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
688 Double_t eta = -TMath::Log( TMath::Tan( mult->GetTheta(n) / 2.0 ) );
689 if(eta>mineta && eta<maxeta) count++;
698 //______________________________________________________________________
699 Double_t AliCFSingleTrackEfficiencyTask::GetCentrality()
705 Bool_t isAOD = fInputEvent->IsA()->InheritsFrom("AliAODEvent");
709 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
710 if(!aodEvent) return cent;
711 AliAODHeader* header = aodEvent->GetHeader();
712 if(!header) return cent;
713 AliCentrality *centrality = header->GetCentralityP();
714 if(!centrality) return cent;
715 // cout<<" about to get cent perc AOD"<<endl;
716 cent = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
718 AliESDEvent* esdEvent = dynamic_cast<AliESDEvent*>(fInputEvent);
719 if(!esdEvent) return cent;
720 AliCentrality *centrality = esdEvent->GetCentrality();
721 if(!centrality) return cent;
722 cent = centrality->GetCentralityPercentile(fCentralityEstimator.Data());