#include "TCanvas.h"
#include "TH1.h"
#include "TH2.h"
#include "TAxis.h"
#include "TF1.h"
#include "AliPerformanceMC.h"
#include "AliESDEvent.h"
#include "AliESDVertex.h"
#include "AliESDtrack.h"
#include "AliESDfriendTrack.h"
#include "AliESDfriend.h"
#include "AliLog.h"
#include "AliMCEvent.h"
#include "AliMCParticle.h"
#include "AliHeader.h"
#include "AliGenEventHeader.h"
#include "AliStack.h"
#include "AliMCInfoCuts.h"
#include "AliRecInfoCuts.h"
#include "AliTracker.h"
#include "AliTreeDraw.h"
#include "AliTPCseed.h"
using namespace std;
ClassImp(AliPerformanceMC)
AliPerformanceMC::AliPerformanceMC(const Char_t* name, const Char_t* title, Int_t analysisMode, Bool_t hptGenerator):
AliPerformanceObject(name,title),
fResolHisto(0),
fPullHisto(0),
fCutsRC(0),
fCutsMC(0),
fAnalysisFolder(0)
{
SetAnalysisMode(analysisMode);
SetHptGenerator(hptGenerator);
Init();
}
AliPerformanceMC::~AliPerformanceMC()
{
if(fResolHisto) delete fResolHisto; fResolHisto=0;
if(fPullHisto) delete fPullHisto; fPullHisto=0;
if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
}
void AliPerformanceMC::Init(){
Int_t nPtBins = 50;
Double_t ptMin = 1.e-2, ptMax = 20.;
Double_t *binsPt = 0;
if (IsHptGenerator()) {
ptMax = 100.;
}
binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
Double_t yMin = -0.02, yMax = 0.02;
Double_t zMin = -12.0, zMax = 12.0;
if(GetAnalysisMode() == 3) {
yMin = -100.; yMax = 100.;
zMin = -100.; zMax = 100.;
}
Int_t binsResolHisto[10]={100,100,100,100,100,25,50,90,30,nPtBins};
Double_t minResolHisto[10]={-0.2,-0.2,-0.002,-0.002,-0.002, yMin, zMin, 0., -1.5, ptMin};
Double_t maxResolHisto[10]={ 0.2, 0.2, 0.002, 0.002, 0.002, yMax, zMax, 2.*TMath::Pi(), 1.5, ptMax};
fResolHisto = new THnSparseF("fResolHisto","res_y:res_z:res_phi:res_lambda:res_pt:y:z:phi:eta:pt",10,binsResolHisto,minResolHisto,maxResolHisto);
fResolHisto->SetBinEdges(9,binsPt);
fResolHisto->GetAxis(0)->SetTitle("y-y_{mc} (cm)");
fResolHisto->GetAxis(1)->SetTitle("z-z_{mc} (cm)");
fResolHisto->GetAxis(2)->SetTitle("#phi-#phi_{mc} (rad)");
fResolHisto->GetAxis(3)->SetTitle("#lambda-#lambda_{mc} (rad)");
fResolHisto->GetAxis(4)->SetTitle("(p_{T}/p_{Tmc}-1)");
fResolHisto->GetAxis(5)->SetTitle("y_{mc} (cm)");
fResolHisto->GetAxis(6)->SetTitle("z_{mc} (cm)");
fResolHisto->GetAxis(7)->SetTitle("#phi_{mc} (rad)");
fResolHisto->GetAxis(8)->SetTitle("#eta_{mc}");
fResolHisto->GetAxis(9)->SetTitle("p_{Tmc} (GeV/c)");
fResolHisto->Sumw2();
Int_t binsPullHisto[10]={100,100,100,100,100,50,50,50,50,nPtBins};
Double_t minPullHisto[10]={-5.,-5.,-5.,-5.,-5., yMin, zMin,-1., -2.0, ptMin};
Double_t maxPullHisto[10]={ 5., 5., 5., 5., 5., yMax, zMax, 1., 2.0, ptMax};
fPullHisto = new THnSparseF("fPullHisto","pull_y:pull_z:pull_y:pull_z:pull_snp:pull_tgl:pull_1pt:y:z:snp:tgl:1pt",10,binsPullHisto,minPullHisto,maxPullHisto);
fPullHisto->GetAxis(0)->SetTitle("(y-y_{mc})/#sigma");
fPullHisto->GetAxis(1)->SetTitle("(z-z_{mc})/#sigma");
fPullHisto->GetAxis(2)->SetTitle("(sin#phi-sin#phi_{mc})/#sigma");
fPullHisto->GetAxis(3)->SetTitle("(tan#lambda-tan#lambda_{mc})/#sigma");
fPullHisto->GetAxis(4)->SetTitle("(p_{Tmc}/p_{T}-1)/#sigma");
fPullHisto->GetAxis(5)->SetTitle("y_{mc} (cm)");
fPullHisto->GetAxis(6)->SetTitle("z_{mc} (cm)");
fPullHisto->GetAxis(7)->SetTitle("sin#phi_{mc}");
fPullHisto->GetAxis(8)->SetTitle("tan#lambda_{mc}");
fPullHisto->GetAxis(9)->SetTitle("1/p_{Tmc} (GeV/c)^{-1}");
fPullHisto->Sumw2();
if(!fCutsMC)
AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
if(!fCutsRC)
AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
fAnalysisFolder = CreateFolder("folderMC","Analysis MC Folder");
}
void AliPerformanceMC::Exec(AliMCEvent* const mcEvent, AliESDEvent *const , AliESDfriend *const , const Bool_t bUseMC, const Bool_t )
{
AliHeader* header = 0;
AliGenEventHeader* genHeader = 0;
AliStack* stack = 0;
TArrayF vtxMC(3);
if(bUseMC)
{
if(!mcEvent) {
Error("Exec","mcEvent not available");
return;
}
header = mcEvent->Header();
if (!header) {
Error("Exec","Header not available");
return;
}
stack = mcEvent->Stack();
if (!stack) {
Error("Exec","Stack not available");
return;
}
genHeader = header->GenEventHeader();
if (!genHeader) {
Error("Exec","Could not retrieve genHeader from Header");
return;
}
genHeader->PrimaryVertex(vtxMC);
}
else {
Error("Exec","MC information required!");
return;
}
Int_t nPart = mcEvent->GetNumberOfTracks();
if (nPart==0) return;
TParticle *part=0;
TClonesArray *trefs=0;
for (Int_t iPart = 0; iPart < nPart; iPart++)
{
Int_t status = mcEvent->GetParticleAndTR(iPart, part, trefs);
if (status<0) continue;
if(!part) continue;
if(!trefs) continue;
AliMCParticle *mcParticle = (AliMCParticle*) mcEvent->GetTrack(iPart);
if(!mcParticle) continue;
TParticle *particle = mcParticle->Particle();
if(!particle) continue;
Bool_t prim = stack->IsPhysicalPrimary(iPart);
if (fCutsMC->IsPdgParticle(TMath::Abs(particle->GetPdgCode())) == kFALSE) break;
if (fCutsMC->GetEP()==TMath::Abs(particle->GetPdgCode())) return;
AliTrackReference *refTPCIn = 0;
AliTrackReference *refTPCOut = 0;
AliTrackReference *refITSIn = 0;
AliTrackReference *refITSOut = 0;
AliTrackReference *refTRDIn = 0;
AliTrackReference *refTRDOut = 0;
Float_t rmax = 0.;
Int_t nTrackRef = mcParticle->GetNumberOfTrackReferences();
if(nTrackRef < 5) continue;
for (Int_t iref = 0; iref < nTrackRef; iref++)
{
AliTrackReference *ref = mcParticle->GetTrackReference(iref);
if(!ref) continue;
Float_t dir = ref->X()*ref->Px()+ref->Y()*ref->Py();
if(dir < 0.) break;
if (ref->R()<rmax) break;
if(ref->Pt() < fCutsRC->GetPtMin()) break;
if(ref->DetectorId()==AliTrackReference::kTPC)
{
if(!refTPCIn) {
refTPCIn = ref;
}
else {
if(ref->R() > refTPCIn->R())
refTPCOut = ref;
}
}
if(ref->DetectorId()==AliTrackReference::kITS)
{
if(!refITSIn) {
refITSIn = ref;
}
else {
if(ref->R() > refITSIn->R())
refITSOut = ref;
}
}
if(ref->DetectorId()==AliTrackReference::kTRD)
{
if(!refTRDIn) {
refTRDIn = ref;
}
else {
if(ref->R() > refTRDIn->R())
refTRDOut = ref;
}
}
if (ref->R()>rmax) rmax=ref->R();
}
if(GetAnalysisMode() == 0) {
if(refTPCIn) {
if(prim) ProcessTPC(refTPCIn,particle);
}
}
if(GetAnalysisMode() == 3) {
if(refTPCIn && refTPCOut)
ProcessInnerTPC(refTPCIn,refTPCOut,particle);
}
if(GetAnalysisMode() == 4) {
ProcessOuterTPCExt(part,trefs);
}
}
}
void AliPerformanceMC::ProcessTPC(AliTrackReference* const refIn, TParticle *const particle) {
if(!refIn) return;
if(!particle) return;
AliExternalTrackParam *track = 0;
Double_t radius = 2.8;
Double_t mass = particle->GetMass();
Double_t step=1;
track=MakeTrack(refIn,particle);
if (!track) return;
AliTracker::PropagateTrackToBxByBz(track, radius+step, mass, step, kTRUE,0.99);
AliTracker::PropagateTrackToBxByBz(track, radius+0.5, mass, step*0.1, kTRUE,0.99);
Double_t xyz[3] = {particle->Vx(),particle->Vy(),particle->Vz()};
Double_t sxyz[3]={0.0,0.0,0.0};
AliESDVertex vertex(xyz,sxyz);
Double_t dca[2], cov[3];
Double_t field[3]; track->GetBxByBz(field);
Bool_t isOK = track->PropagateToDCABxByBz(&vertex,field,10,dca,cov);
if(!isOK) return;
Float_t deltaPtTPC, deltaYTPC, deltaZTPC, deltaPhiTPC, deltaLambdaTPC;
Float_t pull1PtTPC, pullYTPC, pullZTPC, pullPhiTPC, pullLambdaTPC;
Float_t mceta = particle->Eta();
Float_t mcphi = particle->Phi();
if(mcphi<0) mcphi += 2.*TMath::Pi();
Float_t mcpt = particle->Pt();
Float_t mcsnp = TMath::Sin(TMath::ATan2(particle->Py(),particle->Px()));
Float_t mctgl = TMath::Tan(TMath::ATan2(particle->Pz(),particle->Pt()));
if(mcpt == 0) return;
deltaYTPC= track->GetY();
deltaZTPC = track->GetZ()-particle->Vz();
deltaLambdaTPC = TMath::ATan2(track->Pz(),track->Pt())-TMath::ATan2(particle->Pz(),particle->Pt());
deltaPhiTPC = TMath::ATan2(track->Py(),track->Px())-TMath::ATan2(particle->Py(),particle->Px());
deltaPtTPC = (track->Pt()-mcpt) / mcpt;
pullYTPC= (track->GetY()-particle->Vy()) / TMath::Sqrt(track->GetSigmaY2());
pullZTPC = (track->GetZ()-particle->Vz()) / TMath::Sqrt(track->GetSigmaZ2());
pullPhiTPC = (track->GetSnp() - mcsnp) / TMath::Sqrt(track->GetSigmaSnp2());
pullLambdaTPC = (track->GetTgl() - mctgl) / TMath::Sqrt(track->GetSigmaTgl2());
if (mcpt) pull1PtTPC = (track->OneOverPt()-1./mcpt) / TMath::Sqrt(track->GetSigma1Pt2());
else pull1PtTPC = 0.;
Double_t vResolHisto[10] = {deltaYTPC,deltaZTPC,deltaPhiTPC,deltaLambdaTPC,deltaPtTPC,particle->Vy(),particle->Vz(),mcphi,mceta,mcpt};
fResolHisto->Fill(vResolHisto);
Double_t vPullHisto[10] = {pullYTPC,pullZTPC,pullPhiTPC,pullLambdaTPC,pull1PtTPC,particle->Vy(),particle->Vz(),mcsnp,mctgl,1./mcpt};
fPullHisto->Fill(vPullHisto);
if(track) delete track;
}
void AliPerformanceMC::ProcessInnerTPC(AliTrackReference* const refIn, AliTrackReference *const refOut, TParticle *const particle) {
if(!refIn) return;
if(!refOut) return;
if(!particle) return;
AliExternalTrackParam *track=MakeTrack(refOut,particle);
if (!track) return;
Double_t mass = particle->GetMass();
Double_t step=1;
Float_t alphaIn= TMath::ATan2(refIn->Y(),refIn->X());
track->Rotate(alphaIn);
Bool_t isOK = AliTracker::PropagateTrackToBxByBz(track, refIn->R(), mass, step, kFALSE,0.99);
if(!isOK) return;
Float_t mceta = -TMath::Log(TMath::Tan(0.5 * refIn->Theta()));
Float_t mcphi = refIn->Phi();
if(mcphi<0) mcphi += 2.*TMath::Pi();
Float_t mcpt = refIn->Pt();
Float_t mcsnp = TMath::Sin(TMath::ATan2(refIn->Py(),refIn->Px()));
Float_t mctgl = TMath::Tan(TMath::ATan2(refIn->Pz(),refIn->Pt()));
Float_t deltaPtTPC, deltaYTPC, deltaZTPC, deltaPhiTPC, deltaLambdaTPC;
Float_t pull1PtTPC=0., pullYTPC=0., pullZTPC=0., pullPhiTPC=0., pullLambdaTPC=0.;
if(mcpt == 0) return;
deltaYTPC = track->GetY();
deltaZTPC = track->GetZ()-refIn->Z();
deltaLambdaTPC = TMath::ATan2(track->Pz(),track->Pt())-TMath::ATan2(refIn->Pz(),refIn->Pt());
deltaPhiTPC = TMath::ATan2(track->Py(),track->Px())-TMath::ATan2(refIn->Py(),refIn->Px());
deltaPtTPC = (track->Pt()-mcpt) / mcpt;
if(TMath::Sqrt(track->GetSigmaY2())) pullYTPC = track->GetY() / TMath::Sqrt(track->GetSigmaY2());
if(TMath::Sqrt(track->GetSigmaZ2())) pullZTPC = (track->GetZ()-refIn->Z()) / TMath::Sqrt(track->GetSigmaZ2());
if(TMath::Sqrt(track->GetSigmaSnp2())) pullPhiTPC = (track->GetSnp() - mcsnp) / TMath::Sqrt(track->GetSigmaSnp2());
if(TMath::Sqrt(track->GetSigmaTgl2())) pullLambdaTPC = (track->GetTgl() - mctgl) / TMath::Sqrt(track->GetSigmaTgl2());
if(TMath::Sqrt(track->GetSigma1Pt2())) pull1PtTPC = (track->OneOverPt()-1./mcpt) / TMath::Sqrt(track->GetSigma1Pt2());
Double_t vResolHisto[10] = {deltaYTPC,deltaZTPC,deltaPhiTPC,deltaLambdaTPC,deltaPtTPC,refIn->Y(),refIn->Z(),mcphi,mceta,mcpt};
fResolHisto->Fill(vResolHisto);
Double_t vPullHisto[10] = {pullYTPC,pullZTPC,pullPhiTPC,pullLambdaTPC,pull1PtTPC,refIn->Y(),refIn->Z(),mcsnp,mctgl,1./mcpt};
fPullHisto->Fill(vPullHisto);
if(track) delete track;
}
void AliPerformanceMC::ProcessOuterTPCExt(TParticle *const part, TClonesArray * const trefs)
{
const Int_t kMinRefs=5;
Int_t nrefs = trefs->GetEntries();
if (nrefs<kMinRefs) return;
Int_t iref0 =-1;
Int_t iref1 =-1;
for (Int_t iref=0; iref<nrefs; iref++){
AliTrackReference * ref = (AliTrackReference*)trefs->At(iref);
if (!ref) continue;
Float_t dir = ref->X()*ref->Px()+ref->Y()*ref->Py();
if (dir<0) break;
if (ref->DetectorId()!=AliTrackReference::kTPC) continue;
if (iref0<0) iref0 = iref;
iref1 = iref;
}
if (iref1-iref0<kMinRefs) return;
Double_t covar[15];
for (Int_t icov=0; icov<15; icov++) covar[icov]=0;
covar[0]=1;
covar[2]=1;
covar[5]=1;
covar[9]=1;
covar[14]=1;
AliTrackReference * refIn = (AliTrackReference*)trefs->At(iref0);
AliTrackReference * refOut = (AliTrackReference*)trefs->At(iref1);
AliExternalTrackParam *paramPropagate= MakeTrack(refIn,part);
AliExternalTrackParam *paramUpdate = MakeTrack(refIn,part);
paramUpdate->AddCovariance(covar);
Bool_t isOKP=kTRUE;
Bool_t isOKU=kTRUE;
AliMagF * field = (AliMagF*) TGeoGlobalMagField::Instance()->GetField();
if(!field) return;
for (Int_t iref = iref0; iref<=iref1; iref++){
AliTrackReference * ref = (AliTrackReference*)trefs->At(iref);
if(!ref) continue;
Float_t alphaC= TMath::ATan2(ref->Y(),ref->X());
Double_t pos[3] = {ref->X(), ref->Y(), ref->Z()};
Double_t mag[3];
field->Field(pos,mag);
isOKP&=paramPropagate->Rotate(alphaC);
isOKU&=paramUpdate->Rotate(alphaC);
for (Float_t xref= paramPropagate->GetX(); xref<ref->R(); xref++){
isOKP&=paramPropagate->PropagateToBxByBz(xref, mag);
isOKU&=paramUpdate->PropagateToBxByBz(xref, mag);
}
isOKP&=paramPropagate->PropagateToBxByBz(ref->R(), mag);
isOKU&=paramUpdate->PropagateToBxByBz(ref->R(), mag);
Double_t clpos[2] = {0, ref->Z()};
Double_t clcov[3] = { 0.005,0,0.005};
isOKU&= paramUpdate->Update(clpos, clcov);
}
Float_t mceta = -TMath::Log(TMath::Tan(0.5 * refOut->Theta()));
Float_t mcphi = refOut->Phi();
if(mcphi<0) mcphi += 2.*TMath::Pi();
Float_t mcpt = refOut->Pt();
Float_t mcsnp = TMath::Sin(TMath::ATan2(refOut->Py(),refOut->Px()));
Float_t mctgl = TMath::Tan(TMath::ATan2(refOut->Pz(),refOut->Pt()));
Float_t deltaPtTPC, deltaYTPC, deltaZTPC, deltaPhiTPC, deltaLambdaTPC;
Float_t pull1PtTPC=0., pullYTPC=0., pullZTPC=0., pullPhiTPC=0., pullLambdaTPC=0.;
if(mcpt == 0) return;
deltaYTPC = paramPropagate->GetY();
deltaZTPC = paramPropagate->GetZ()-refOut->Z();
deltaLambdaTPC = TMath::ATan2(paramPropagate->Pz(),paramPropagate->Pt())-TMath::ATan2(refOut->Pz(),refOut->Pt());
deltaPhiTPC = TMath::ATan2(paramPropagate->Py(),paramPropagate->Px())-TMath::ATan2(refOut->Py(),refOut->Px());
deltaPtTPC = (paramPropagate->Pt()-mcpt) / mcpt;
if(TMath::Sqrt(paramPropagate->GetSigmaY2())) pullYTPC = paramPropagate->GetY() / TMath::Sqrt(paramPropagate->GetSigmaY2());
if(TMath::Sqrt(paramPropagate->GetSigmaZ2())) pullZTPC = (paramPropagate->GetZ()-refOut->Z()) / TMath::Sqrt(paramPropagate->GetSigmaZ2());
if(TMath::Sqrt(paramPropagate->GetSigmaSnp2())) pullPhiTPC = (paramPropagate->GetSnp() - mcsnp) / TMath::Sqrt(paramPropagate->GetSigmaSnp2());
if(TMath::Sqrt(paramPropagate->GetSigmaTgl2())) pullLambdaTPC = (paramPropagate->GetTgl() - mctgl) / TMath::Sqrt(paramPropagate->GetSigmaTgl2());
if(TMath::Sqrt(paramPropagate->GetSigma1Pt2())) pull1PtTPC = (paramPropagate->OneOverPt()-1./mcpt) / TMath::Sqrt(paramPropagate->GetSigma1Pt2());
Double_t vResolHisto[10] = {deltaYTPC,deltaZTPC,deltaPhiTPC,deltaLambdaTPC,deltaPtTPC,refIn->Y(),refIn->Z(),mcphi,mceta,mcpt};
fResolHisto->Fill(vResolHisto);
Double_t vPullHisto[10] = {pullYTPC,pullZTPC,pullPhiTPC,pullLambdaTPC,pull1PtTPC,refIn->Y(),refIn->Z(),mcsnp,mctgl,1./mcpt};
fPullHisto->Fill(vPullHisto);
}
AliExternalTrackParam * AliPerformanceMC::MakeTrack(const AliTrackReference* const ref, TParticle* const part)
{
Double_t xyz[3]={ref->X(),ref->Y(),ref->Z()};
Double_t pxyz[3]={ref->Px(),ref->Py(),ref->Pz()};
Double_t cv[21];
for (Int_t i=0; i<21;i++) cv[i]=0;
if (!part->GetPDG()) return 0;
AliExternalTrackParam * param = new AliExternalTrackParam(xyz,pxyz,cv,TMath::Nint(part->GetPDG()->Charge()/3.));
return param;
}
TH1F* AliPerformanceMC::MakeResol(TH2F * his, Int_t integ, Bool_t type, Int_t cut){
TH1F *hisr, *hism;
if (!gPad) new TCanvas;
hisr = AliTreeDraw::CreateResHistoII(his,&hism,integ,kTRUE,cut);
if (type) return hism;
else
return hisr;
}
void AliPerformanceMC::Analyse() {
TH1::AddDirectory(kFALSE);
TH1F *h=0;
TH2F *h2D=0;
TObjArray *aFolderObj = new TObjArray;
if(!aFolderObj) return;
TCanvas * c = new TCanvas("Phi resol Tan","Phi resol Tan");
c->cd();
char name[256];
char title[256];
for(Int_t i=0; i<5; i++)
{
for(Int_t j=5; j<10; j++)
{
fResolHisto->GetAxis(9)->SetRangeUser(0.16,10.);
if(j!=8) fResolHisto->GetAxis(8)->SetRangeUser(0.,0.9);
if(GetAnalysisMode() == 3) fResolHisto->GetAxis(5)->SetRangeUser(-80.,80.);
h2D = (TH2F*)fResolHisto->Projection(i,j);
h = AliPerformanceMC::MakeResol(h2D,1,0,20);
snprintf(name,256,"h_res_%d_vs_%d",i,j);
h->SetName(name);
h->GetXaxis()->SetTitle(fResolHisto->GetAxis(j)->GetTitle());
snprintf(title,256,"%s %s",fResolHisto->GetAxis(i)->GetTitle(),"(resolution)");
h->GetYaxis()->SetTitle(title);
snprintf(title,256,"%s vs %s",title,fResolHisto->GetAxis(j)->GetTitle());
h->SetTitle(title);
if(j==9) h->SetBit(TH1::kLogX);
aFolderObj->Add(h);
h = AliPerformanceMC::MakeResol(h2D,1,1,20);
snprintf(name,256,"h_mean_res_%d_vs_%d",i,j);
h->SetName(name);
h->GetXaxis()->SetTitle(fResolHisto->GetAxis(j)->GetTitle());
snprintf(title,256,"%s %s",fResolHisto->GetAxis(i)->GetTitle(),"(mean)");
h->GetYaxis()->SetTitle(title);
snprintf(title,256,"%s vs %s",title,fResolHisto->GetAxis(j)->GetTitle());
h->SetTitle(title);
if(j==9) h->SetBit(TH1::kLogX);
aFolderObj->Add(h);
fResolHisto->GetAxis(8)->SetRangeUser(-1.5,1.5);
fResolHisto->GetAxis(9)->SetRangeUser(0.0,10.);
if(j!=8) fPullHisto->GetAxis(8)->SetRangeUser(-1.0,0.99);
else fPullHisto->GetAxis(8)->SetRangeUser(-1.5,1.5);
fPullHisto->GetAxis(9)->SetRangeUser(0.0,10.);
if(GetAnalysisMode() == 3) fPullHisto->GetAxis(5)->SetRangeUser(-80.,80.);
h2D = (TH2F*)fPullHisto->Projection(i,j);
h = AliPerformanceMC::MakeResol(h2D,1,0,20);
snprintf(name,256,"h_pull_%d_vs_%d",i,j);
h->SetName(name);
h->GetXaxis()->SetTitle(fPullHisto->GetAxis(j)->GetTitle());
snprintf(title,256,"%s %s",fPullHisto->GetAxis(i)->GetTitle(),"(resolution)");
h->GetYaxis()->SetTitle(title);
snprintf(title,256,"%s vs %s",title,fPullHisto->GetAxis(j)->GetTitle());
h->SetTitle(title);
aFolderObj->Add(h);
h = AliPerformanceMC::MakeResol(h2D,1,1,20);
snprintf(name,256,"h_mean_pull_%d_vs_%d",i,j);
h->SetName(name);
h->GetXaxis()->SetTitle(fPullHisto->GetAxis(j)->GetTitle());
snprintf(title,256,"%s %s",fPullHisto->GetAxis(i)->GetTitle(),"(mean)");
h->GetYaxis()->SetTitle(title);
snprintf(title,256,"%s vs %s",title,fPullHisto->GetAxis(j)->GetTitle());
h->SetTitle(title);
aFolderObj->Add(h);
}
}
fAnalysisFolder = ExportToFolder(aFolderObj);
if(aFolderObj) delete aFolderObj;
}
TFolder* AliPerformanceMC::ExportToFolder(TObjArray * array)
{
AliPerformanceMC * comp=this;
TFolder *folder = comp->GetAnalysisFolder();
TString name, title;
TFolder *newFolder = 0;
Int_t i = 0;
Int_t size = array->GetSize();
if(folder) {
name = folder->GetName();
title = folder->GetTitle();
delete folder;
newFolder = CreateFolder(name.Data(),title.Data());
newFolder->SetOwner();
while(i < size) {
newFolder->Add(array->At(i));
i++;
}
}
return newFolder;
}
Long64_t AliPerformanceMC::Merge(TCollection* const list)
{
if (!list)
return 0;
if (list->IsEmpty())
return 1;
TIterator* iter = list->MakeIterator();
TObject* obj = 0;
Int_t count=0;
while((obj = iter->Next()) != 0)
{
AliPerformanceMC* entry = dynamic_cast<AliPerformanceMC*>(obj);
if (entry == 0) continue;
fResolHisto->Add(entry->fResolHisto);
fPullHisto->Add(entry->fPullHisto);
count++;
}
return count;
}
TFolder* AliPerformanceMC::CreateFolder(TString name,TString title) {
TFolder *folder = 0;
folder = new TFolder(name.Data(),title.Data());
return folder;
}