X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PWG1%2FTRD%2FAliTRDresolution.cxx;h=a75d4ba0f8c6ca470a43f543f1aaca0142460b49;hb=fe1d1beb34572a5839adbcfc7aba6d4fcdcfa276;hp=3f346e3d2ab375b6045b4dd54d3bdf1515924957;hpb=1ee39b3a7eaefd7a1b25741a34738772c5607262;p=u%2Fmrichter%2FAliRoot.git diff --git a/PWG1/TRD/AliTRDresolution.cxx b/PWG1/TRD/AliTRDresolution.cxx index 3f346e3d2ab..a75d4ba0f8c 100644 --- a/PWG1/TRD/AliTRDresolution.cxx +++ b/PWG1/TRD/AliTRDresolution.cxx @@ -48,6 +48,8 @@ // // //////////////////////////////////////////////////////////////////////////// +#include + #include #include #include @@ -57,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -64,8 +67,11 @@ #include #include #include +#include #include "AliPID.h" +#include "AliLog.h" +#include "AliESDtrack.h" #include "AliTRDresolution.h" #include "AliTRDgeometry.h" @@ -75,97 +81,80 @@ #include "AliTRDtrackV1.h" #include "AliTRDReconstructor.h" #include "AliTRDrecoParam.h" +#include "AliTRDpidUtil.h" #include "info/AliTRDclusterInfo.h" ClassImp(AliTRDresolution) -UChar_t const AliTRDresolution::fgNElements[kNhistos] = { - 2, 2, 5, 5, - 2, 5, 12, 2, 11 +UChar_t const AliTRDresolution::fgNproj[kNviews] = { + 2, 2, 5, 5, 5, + 2, 5, 11, 11, 11 }; -Char_t const * AliTRDresolution::fgPerformanceName[kNhistos] = { +Char_t const * AliTRDresolution::fgPerformanceName[kNviews] = { "Charge" ,"Cluster2Track" ,"Tracklet2Track" - ,"Tracklet2TPC" + ,"Tracklet2TRDin" + ,"Tracklet2TRDout" ,"Cluster2MC" ,"Tracklet2MC" - ,"TPC2MC" - ,"TOF/HMPID2MC" + ,"TRDin2MC" + ,"TRDout2MC" ,"TRD2MC" }; -Char_t const *AliTRDresolution::fgAxTitle[46][4] = { - // Charge - {"Impv", "x [cm]", "I_{mpv}", "x/x_{0}"} - ,{"dI/Impv", "x/x_{0}", "#delta I/I_{mpv}", "x[cm]"} - // Clusters to Kalman - ,{"Pos", "tg(#phi)", "#mu_{y}^{cl} [#mum]", "#sigma_{y}^{cl} [#mum]"} - ,{"Pulls", "tg(#phi)", "PULL: #mu_{y}^{cl}", "PULL: #sigma_{y}^{cl}"} - // TRD tracklet to Kalman fit - ,{"PosY", "tg(#phi)", "#mu_{y}^{trklt} [#mum]", "#sigma_{y}^{trklt} [#mum]"} - ,{"PullsY", "tg(#phi)", "PULL: #mu_{y}^{trklt}", "PULL: #sigma_{y}^{trklt}"} - ,{"PosZ", "tg(#theta)", "#mu_{z}^{trklt} [#mum]", "#sigma_{z}^{trklt} [#mum]"} - ,{"PullsZ", "tg(#theta)", "PULL: #mu_{z}^{trklt}", "PULL: #sigma_{z}^{trklt}"} - ,{"Phi", "tg(#phi)", "#mu_{#phi}^{trklt} [mrad]", "#sigma_{#phi}^{trklt} [mrad]"} - // TPC track 2 first TRD tracklet - ,{"PosY", "tg(#phi)", "#mu_{y}^{TPC trklt} [#mum]", "#sigma_{y}^{TPC trklt} [#mum]"} - ,{"PullsY", "tg(#phi)", "PULL: #mu_{y}^{TPC trklt}", "PULL: #sigma_{y}^{TPC trklt}"} - ,{"PosZ", "tg(#theta)", "#mu_{z}^{TPC trklt} [#mum]", "#sigma_{z}^{TPC trklt} [#mum]"} - ,{"PullsZ", "tg(#theta)", "PULL: #mu_{z}^{TPC trklt}", "PULL: #sigma_{z}^{TPC trklt}"} - ,{"Phi", "tg(#phi)", "#mu_{#phi}^{TPC trklt} [mrad]", "#sigma_{#phi}^{TPC trklt} [mrad]"} - // MC cluster - ,{"Pos", "tg(#phi)", "MC: #mu_{y}^{cl} [#mum]", "MC: #sigma_{y}^{cl} [#mum]"} - ,{"Pulls", "tg(#phi)", "MC PULL: #mu_{y}^{cl}", "MC PULL: #sigma_{y}^{cl}"} - // MC tracklet - ,{"PosY", "tg(#phi)", "MC: #mu_{y}^{trklt} [#mum]", "MC: #sigma_{y}^{trklt} [#mum]"} - ,{"PullsY", "tg(#phi)", "MC PULL: #mu_{y}^{trklt}", "MC PULL: #sigma_{y}^{trklt}"} - ,{"PosZ", "tg(#theta)", "MC: #mu_{z}^{trklt} [#mum]", "MC: #sigma_{z}^{trklt} [#mum]"} - ,{"PullsZ", "tg(#theta)", "MC PULL: #mu_{z}^{trklt}", "MC PULL: #sigma_{z}^{trklt}"} - ,{"Phi", "tg(#phi)", "MC: #mu_{#phi}^{trklt} [mrad]", "MC: #sigma_{#phi}^{trklt} [mrad]"} - // MC track TPC - ,{"PosY", "tg(#phi)", "MC: #mu_{y}^{TPC} [#mum]", "MC: #sigma_{y}^{TPC} [#mum]"} - ,{"PullsY", "tg(#phi)", "MC PULL: #mu_{y}^{TPC}", "MC PULL: #sigma_{y}^{TPC}"} - ,{"PosZ", "tg(#theta)", "MC: #mu_{z}^{TPC} [#mum]", "MC: #sigma_{z}^{TPC} [#mum]"} - ,{"PullsZ", "tg(#theta)", "MC PULL: #mu_{z}^{TPC}", "MC PULL: #sigma_{z}^{TPC}"} - ,{"Phi", "tg(#phi)", "MC: #mu_{#phi}^{TPC} [mrad]", "MC: #sigma_{#phi}^{TPC} [mrad]"} - ,{"PullsSNP", "tg(#phi)", "MC PULL: #mu_{snp}^{TPC}", "MC PULL: #sigma_{snp}^{TPC}"} - ,{"Theta", "tg(#theta)", "MC: #mu_{#theta}^{TPC} [mrad]", "MC: #sigma_{#theta}^{TPC} [mrad]"} - ,{"PullsTGL", "tg(#theta)", "MC PULL: #mu_{tgl}^{TPC}", "MC PULL: #sigma_{tgl}^{TPC}"} - ,{"Pt", "p_{t}^{MC} [GeV/c]", "MC: #mu^{TPC}(#Deltap_{t}/p_{t}^{MC}) [%]", "MC: #sigma^{TPC}(#Deltap_{t}/p_{t}^{MC}) [%]"} - ,{"Pulls1Pt", "1/p_{t}^{MC} [c/GeV]", "MC PULL: #mu_{1/p_{t}}^{TPC}", "MC PULL: #sigma_{1/p_{t}}^{TPC}"} - ,{"P", "p^{MC} [GeV/c]", "MC: #mu^{TPC}(#Deltap/p^{MC}) [%]", "MC: #sigma^{TPC}(#Deltap/p^{MC}) [%]"} - ,{"PullsP", "p^{MC} [GeV/c]", "MC PULL: #mu^{TPC}(#Deltap/#sigma_{p})", "MC PULL: #sigma^{TPC}(#Deltap/#sigma_{p})"} - // MC track TOF - ,{"PosZ", "tg(#theta)", "MC: #mu_{z}^{TOF} [#mum]", "MC: #sigma_{z}^{TOF} [#mum]"} - ,{"PullsZ", "tg(#theta)", "MC PULL: #mu_{z}^{TOF}", "MC PULL: #sigma_{z}^{TOF}"} - // MC track in TRD - ,{"PosY", "tg(#phi)", "MC: #mu_{y}^{Trk} [#mum]", "MC: #sigma_{y}^{Trk} [#mum]"} - ,{"PullsY", "tg(#phi)", "MC PULL: #mu_{y}^{Trk}", "MC PULL: #sigma_{y}^{Trk}"} - ,{"PosZ", "tg(#theta)", "MC: #mu_{z}^{Trk} [#mum]", "MC: #sigma_{z}^{Trk} [#mum]"} - ,{"PullsZ", "tg(#theta)", "MC PULL: #mu_{z}^{Trk}", "MC PULL: #sigma_{z}^{Trk}"} - ,{"Phi", "tg(#phi)", "MC: #mu_{#phi}^{Trk} [mrad]", "MC: #sigma_{#phi}^{Trk} [mrad]"} - ,{"PullsSNP", "tg(#phi)", "MC PULL: #mu_{snp}^{Trk}", "MC PULL: #sigma_{snp}^{Trk}"} - ,{"Theta", "tg(#theta)", "MC: #mu_{#theta}^{Trk} [mrad]", "MC: #sigma_{#theta}^{Trk} [mrad]"} - ,{"PullsTGL", "tg(#theta)", "MC PULL: #mu_{tgl}^{Trk}", "MC PULL: #sigma_{tgl}^{Trk}"} - ,{"Pt", "p_{t}^{MC} [GeV/c]", "MC: #mu^{Trk}(#Deltap_{t}/p_{t}^{MC}) [%]", "MC: #sigma^{Trk}(#Deltap_{t}/p_{t}^{MC}) [%]"} - ,{"Pulls1Pt", "1/p_{t}^{MC} [c/GeV]", "MC PULL: #mu_{1/p_{t}}^{Trk}", "MC PULL: #sigma_{1/p_{t}}^{Trk}"} - ,{"P", "p^{MC} [GeV/c]", "MC: #mu^{Trk}(#Deltap/p^{MC}) [%]", "MC: #sigma^{Trk}(#Deltap/p^{MC}) [%]"} +// Configure segmentation for y resolution/residuals +Int_t const AliTRDresolution::fgkNresYsegm[3] = { + AliTRDgeometry::kNsector + ,AliTRDgeometry::kNsector*AliTRDgeometry::kNstack + ,AliTRDgeometry::kNdet }; +Char_t const *AliTRDresolution::fgkResYsegmName[3] = { + "Sector", "Stack", "Detector"}; + //________________________________________________________ AliTRDresolution::AliTRDresolution() - :AliTRDrecoTask("resolution", "Spatial and momentum TRD resolution checker") + :AliTRDrecoTask() + ,fStatus(0) + ,fSegmentLevel(0) + ,fIdxPlot(0) + ,fIdxFrame(0) + ,fPtThreshold(1.) + ,fReconstructor(NULL) + ,fGeo(NULL) + ,fDBPDG(NULL) + ,fGraphS(NULL) + ,fGraphM(NULL) + ,fCl(NULL) + ,fMCcl(NULL) +/* ,fTrklt(NULL) + ,fMCtrklt(NULL)*/ +{ + // + // Default constructor + // + SetNameTitle("TRDresolution", "TRD spatial and momentum resolution"); + SetSegmentationLevel(); +} + +//________________________________________________________ +AliTRDresolution::AliTRDresolution(char* name) + :AliTRDrecoTask(name, "TRD spatial and momentum resolution") ,fStatus(0) + ,fSegmentLevel(0) ,fIdxPlot(0) - ,fReconstructor(0x0) - ,fGeo(0x0) - ,fGraphS(0x0) - ,fGraphM(0x0) - ,fCl(0x0) - ,fTrklt(0x0) - ,fMCcl(0x0) - ,fMCtrklt(0x0) + ,fIdxFrame(0) + ,fPtThreshold(1.) + ,fReconstructor(NULL) + ,fGeo(NULL) + ,fDBPDG(NULL) + ,fGraphS(NULL) + ,fGraphM(NULL) + ,fCl(NULL) + ,fMCcl(NULL) +/* ,fTrklt(NULL) + ,fMCtrklt(NULL)*/ { // // Default constructor @@ -176,11 +165,12 @@ AliTRDresolution::AliTRDresolution() fGeo = new AliTRDgeometry(); InitFunctorList(); + SetSegmentationLevel(); - DefineOutput(1, TObjArray::Class()); // cluster2track - DefineOutput(2, TObjArray::Class()); // tracklet2track - DefineOutput(3, TObjArray::Class()); // cluster2mc - DefineOutput(4, TObjArray::Class()); // tracklet2mc + DefineOutput(kClToTrk, TObjArray::Class()); // cluster2track + DefineOutput(kClToMC, TObjArray::Class()); // cluster2mc +/* DefineOutput(kTrkltToTrk, TObjArray::Class()); // tracklet2track + DefineOutput(kTrkltToMC, TObjArray::Class()); // tracklet2mc*/ } //________________________________________________________ @@ -196,48 +186,82 @@ AliTRDresolution::~AliTRDresolution() delete fReconstructor; if(gGeoManager) delete gGeoManager; if(fCl){fCl->Delete(); delete fCl;} - if(fTrklt){fTrklt->Delete(); delete fTrklt;} if(fMCcl){fMCcl->Delete(); delete fMCcl;} - if(fMCtrklt){fMCtrklt->Delete(); delete fMCtrklt;} +/* if(fTrklt){fTrklt->Delete(); delete fTrklt;} + if(fMCtrklt){fMCtrklt->Delete(); delete fMCtrklt;}*/ } //________________________________________________________ -void AliTRDresolution::CreateOutputObjects() +void AliTRDresolution::UserCreateOutputObjects() { // spatial resolution - OpenFile(0, "RECREATE"); + if(!fReconstructor){ + fReconstructor = new AliTRDReconstructor(); + fReconstructor->SetRecoParam(AliTRDrecoParam::GetLowFluxParam()); + } + if(!fGeo) fGeo = new AliTRDgeometry(); + + if(!HasFunctorList()) InitFunctorList(); fContainer = Histos(); + InitExchangeContainers(); +} +//________________________________________________________ +void AliTRDresolution::InitExchangeContainers() +{ fCl = new TObjArray(); fCl->SetOwner(kTRUE); - fTrklt = new TObjArray(); - fTrklt->SetOwner(kTRUE); fMCcl = new TObjArray(); fMCcl->SetOwner(kTRUE); +/* fTrklt = new TObjArray(); + fTrklt->SetOwner(kTRUE); fMCtrklt = new TObjArray(); - fMCtrklt->SetOwner(kTRUE); + fMCtrklt->SetOwner(kTRUE);*/ } //________________________________________________________ -void AliTRDresolution::Exec(Option_t *opt) +void AliTRDresolution::UserExec(Option_t *opt) { // // Execution part // fCl->Delete(); - fTrklt->Delete(); fMCcl->Delete(); - fMCtrklt->Delete(); - - AliTRDrecoTask::Exec(opt); +/* fTrklt->Delete(); + fMCtrklt->Delete();*/ + AliTRDrecoTask::UserExec(opt); + PostData(kClToTrk, fCl); + PostData(kClToMC, fMCcl); +/* PostData(kTrkltToTrk, fTrklt); + PostData(kTrkltToMC, fMCtrklt);*/ +} - PostData(1, fCl); - PostData(2, fTrklt); - PostData(3, fMCcl); - PostData(4, fMCtrklt); +//________________________________________________________ +Bool_t AliTRDresolution::Pulls(Double_t dyz[2], Double_t cov[3], Double_t tilt) +{ +// Helper function to calculate pulls in the yz plane +// using proper tilt rotation +// Uses functionality defined by AliTRDseedV1. + + Double_t t2(tilt*tilt); + + // rotate along pad + Double_t cc[3]; + cc[0] = cov[0] - 2.*tilt*cov[1] + t2*cov[2]; + cc[1] = cov[1]*(1.-t2) + tilt*(cov[0] - cov[2]); + cc[2] = t2*cov[0] + 2.*tilt*cov[1] + cov[2]; + // do sqrt + Double_t sqr[3]={0., 0., 0.}; + if(AliTRDseedV1::GetCovSqrt(cc, sqr)) return kFALSE; + Double_t invsqr[3]={0., 0., 0.}; + if(AliTRDseedV1::GetCovInv(sqr, invsqr)<1.e-40) return kFALSE; + Double_t tmp(dyz[0]); + dyz[0] = invsqr[0]*tmp + invsqr[1]*dyz[1]; + dyz[1] = invsqr[1]*tmp + invsqr[2]*dyz[1]; + return kTRUE; } //________________________________________________________ @@ -249,18 +273,18 @@ TH1* AliTRDresolution::PlotCharge(const AliTRDtrackV1 *track) if(track) fkTrack = track; if(!fkTrack){ - AliWarning("No Track defined."); - return 0x0; + AliDebug(4, "No Track defined."); + return NULL; } - TObjArray *arr = 0x0; - if(!(arr = ((TObjArray*)fContainer->At(kCharge)))){ + TObjArray *arr = NULL; + if(!fContainer || !(arr = ((TObjArray*)fContainer->At(kCharge)))){ AliWarning("No output container defined."); - return 0x0; + return NULL; } - TH3S* h = 0x0; + TH3S* h = NULL; - AliTRDseedV1 *fTracklet = 0x0; - AliTRDcluster *c = 0x0; + AliTRDseedV1 *fTracklet = NULL; + AliTRDcluster *c = NULL; for(Int_t ily=0; ilyGetTracklet(ily))) continue; if(!fTracklet->IsOK()) continue; @@ -294,31 +318,40 @@ TH1* AliTRDresolution::PlotCluster(const AliTRDtrackV1 *track) if(track) fkTrack = track; if(!fkTrack){ - AliWarning("No Track defined."); - return 0x0; + AliDebug(4, "No Track defined."); + return NULL; } - TObjArray *arr = 0x0; - if(!(arr = ((TObjArray*)fContainer->At(kCluster)))){ + TObjArray *arr = NULL; + if(!fContainer || !(arr = ((TObjArray*)fContainer->At(kCluster)))){ AliWarning("No output container defined."); - return 0x0; + return NULL; } + ULong_t status = fkESD ? fkESD->GetStatus():0; - Double_t cov[7]; - Float_t x0, y0, z0, dy, dydx, dzdx; - AliTRDseedV1 *fTracklet = 0x0; + Int_t sgm[3]; + Double_t covR[7], cov[3], dy[2], dz[2]; + Float_t pt, x0, y0, z0, dydx, dzdx; + AliTRDseedV1 *fTracklet(NULL); TObjArray *clInfoArr(NULL); for(Int_t ily=0; ilyGetTracklet(ily))) continue; if(!fTracklet->IsOK()) continue; x0 = fTracklet->GetX0(); - + pt = fTracklet->GetPt(); + sgm[2] = fTracklet->GetDetector(); + sgm[0] = AliTRDgeometry::GetSector(sgm[2]); + sgm[1] = sgm[0] * AliTRDgeometry::kNstack + AliTRDgeometry::GetStack(sgm[2]); + // retrive the track angle with the chamber y0 = fTracklet->GetYref(0); z0 = fTracklet->GetZref(0); dydx = fTracklet->GetYref(1); dzdx = fTracklet->GetZref(1); - fTracklet->GetCovRef(cov); - Float_t tilt = fTracklet->GetTilt(); - AliTRDcluster *c = 0x0; + fTracklet->GetCovRef(covR); + Double_t tilt(fTracklet->GetTilt()) + ,t2(tilt*tilt) + ,corr(1./(1. + t2)) + ,cost(TMath::Sqrt(corr)); + AliTRDcluster *c = NULL; fTracklet->ResetClusterIter(kFALSE); while((c = fTracklet->PrevCluster())){ Float_t xc = c->GetX(); @@ -327,39 +360,56 @@ TH1* AliTRDresolution::PlotCluster(const AliTRDtrackV1 *track) Float_t dx = x0 - xc; Float_t yt = y0 - dx*dydx; Float_t zt = z0 - dx*dzdx; - yc -= tilt*(zc-zt); // tilt correction - dy = yt - yc; - - //Float_t sx2 = dydx*c->GetSX(c->GetLocalTimeBin()); sx2*=sx2; - Float_t sy2 = c->GetSigmaY2(); - if(sy2<=0.) continue; - ((TH2I*)arr->At(0))->Fill(dydx, dy); - ((TH2I*)arr->At(1))->Fill(dydx, dy/TMath::Sqrt(cov[0] /*+ sx2*/ + sy2)); + dy[0] = yc-yt; dz[0]= zc-zt; + + // rotate along pad + dy[1] = cost*(dy[0] - dz[0]*tilt); + dz[1] = cost*(dz[0] + dy[0]*tilt); + if(pt>fPtThreshold && c->IsInChamber()) ((TH3S*)arr->At(0))->Fill(dydx, dy[1], sgm[fSegmentLevel]); + + // tilt rotation of covariance for clusters + Double_t sy2(c->GetSigmaY2()), sz2(c->GetSigmaZ2()); + cov[0] = (sy2+t2*sz2)*corr; + cov[1] = tilt*(sz2 - sy2)*corr; + cov[2] = (t2*sy2+sz2)*corr; + // sum with track covariance + cov[0]+=covR[0]; cov[1]+=covR[1]; cov[2]+=covR[2]; + Double_t dyz[2]= {dy[1], dz[1]}; + Pulls(dyz, cov, tilt); + ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], dyz[0], dyz[1]); -/* if(DebugLevel()>=3){ - // Get z-position with respect to anode wire - //AliTRDSimParam *simParam = AliTRDSimParam::Instance(); - Int_t istk = fGeo->GetStack(c->GetDetector()); - AliTRDpadPlane *pp = fGeo->GetPadPlane(ily, istk); - Float_t row0 = pp->GetRow0(); - Float_t d = row0 - zt + pp->GetAnodeWireOffset(); - d -= ((Int_t)(2 * d)) / 2.0; - if (d > 0.25) d = 0.5 - d; - - AliTRDclusterInfo *clInfo = new AliTRDclusterInfo; - fCl->Add(clInfo); - clInfo->SetCluster(c); - clInfo->SetGlobalPosition(yt, zt, dydx, dzdx); - clInfo->SetResolution(dy); - clInfo->SetAnisochronity(d); - clInfo->SetDriftLength(dx); - (*DebugStream()) << "ClusterResiduals" - <<"clInfo.=" << clInfo - << "\n"; - }*/ + // Get z-position with respect to anode wire + Int_t istk = fGeo->GetStack(c->GetDetector()); + AliTRDpadPlane *pp = fGeo->GetPadPlane(ily, istk); + Float_t row0 = pp->GetRow0(); + Float_t d = row0 - zt + pp->GetAnodeWireOffset(); + d -= ((Int_t)(2 * d)) / 2.0; + if (d > 0.25) d = 0.5 - d; + + AliTRDclusterInfo *clInfo = new AliTRDclusterInfo; + clInfo->SetCluster(c); + Float_t covF[] = {cov[0], cov[1], cov[2]}; + clInfo->SetGlobalPosition(yt, zt, dydx, dzdx, covF); + clInfo->SetResolution(dy[1]); + clInfo->SetAnisochronity(d); + clInfo->SetDriftLength(dx); + clInfo->SetTilt(tilt); + if(fCl) fCl->Add(clInfo); + else AliDebug(1, "Cl exchange container missing. Activate by calling \"InitExchangeContainers()\""); + + if(DebugLevel()>=1){ + if(!clInfoArr) clInfoArr=new TObjArray(AliTRDseedV1::kNclusters); + clInfoArr->Add(clInfo); + } + } + if(DebugLevel()>=1 && clInfoArr){ + (*DebugStream()) << "cluster" + <<"status=" << status + <<"clInfo.=" << clInfoArr + << "\n"; } } - return (TH2I*)arr->At(0); + return (TH3S*)arr->At(0); } @@ -376,45 +426,77 @@ TH1* AliTRDresolution::PlotTracklet(const AliTRDtrackV1 *track) // reference position. if(track) fkTrack = track; if(!fkTrack){ - AliWarning("No Track defined."); - return 0x0; + AliDebug(4, "No Track defined."); + return NULL; } - TObjArray *arr = 0x0; - if(!(arr = (TObjArray*)fContainer->At(kTrackTRD ))){ + TObjArray *arr = NULL; + if(!fContainer || !(arr = (TObjArray*)fContainer->At(kTrack ))){ AliWarning("No output container defined."); - return 0x0; + return NULL; } + Int_t sgm[3]; Double_t cov[3], covR[7]/*, sqr[3], inv[3]*/; - Float_t x, dx, dy, dz; - AliTRDseedV1 *fTracklet = 0x0; - for(Int_t il=AliTRDgeometry::kNlayer; il--;){ + Double_t pt, phi, tht, x, dx, dy[2], dz[2]; + AliTRDseedV1 *fTracklet(NULL); + for(Int_t il(0); ilGetTracklet(il))) continue; if(!fTracklet->IsOK()) continue; - x = fTracklet->GetX(); - dx = fTracklet->GetX0() - x; - // compute dy^2 and dz^2 - dy = fTracklet->GetYref(0)-dx*fTracklet->GetYref(1) - fTracklet->GetY(); - dz = fTracklet->GetZref(0)-dx*fTracklet->GetZref(1) - fTracklet->GetZ(); + sgm[2] = fTracklet->GetDetector(); + sgm[0] = AliTRDgeometry::GetSector(sgm[2]); + sgm[1] = sgm[0] * AliTRDgeometry::kNstack + AliTRDgeometry::GetStack(sgm[2]); + x = fTracklet->GetX(); + dx = fTracklet->GetX0() - x; + pt = fTracklet->GetPt(); + phi = fTracklet->GetYref(1); + tht = fTracklet->GetZref(1); + // compute dy and dz + dy[0]= fTracklet->GetYref(0)-dx*fTracklet->GetYref(1) - fTracklet->GetY(); + dz[0]= fTracklet->GetZref(0)-dx*fTracklet->GetZref(1) - fTracklet->GetZ(); + Double_t tilt(fTracklet->GetTilt()) + ,t2(tilt*tilt) + ,corr(1./(1. + t2)) + ,cost(TMath::Sqrt(corr)); + Bool_t rc(fTracklet->IsRowCross()); + + // calculate residuals using tilt rotation + dy[1]= cost*(dy[0] - dz[0]*tilt); + dz[1]= cost*(dz[0] + dy[0]*tilt); + ((TH3S*)arr->At(0))->Fill(phi, dy[1], sgm[fSegmentLevel]+rc*fgkNresYsegm[fSegmentLevel]); + ((TH3S*)arr->At(2))->Fill(tht, dz[1], rc); + // compute covariance matrix fTracklet->GetCovAt(x, cov); fTracklet->GetCovRef(covR); cov[0] += covR[0]; cov[1] += covR[1]; cov[2] += covR[2]; -/* // Correct PULL calculation by considering off - // diagonal elements in the covariance matrix - // compute square root matrix - if(AliTRDseedV1::GetCovInv(cov, inv)==0.) continue; - if(AliTRDseedV1::GetCovSqrt(inv, sqr)<0.) continue; - Double_t y = sqr[0]*dy+sqr[1]*dz; - Double_t z = sqr[1]*dy+sqr[2]*dz; - ((TH3*)h)->Fill(y, z, fTracklet->GetYref(1));*/ - - ((TH2I*)arr->At(0))->Fill(fTracklet->GetYref(1), dy); - ((TH2I*)arr->At(1))->Fill(fTracklet->GetYref(1), dy/TMath::Sqrt(cov[0])); - ((TH2I*)arr->At(4))->Fill(fTracklet->GetYref(1), TMath::ATan((fTracklet->GetYref(1)-fTracklet->GetYfit(1))/(1-fTracklet->GetYref(1)*fTracklet->GetYfit(1)))); - if(!fTracklet->IsRowCross()) continue; - ((TH2I*)arr->At(2))->Fill(fTracklet->GetZref(1), dz); - ((TH2I*)arr->At(3))->Fill(fTracklet->GetZref(1), dz/TMath::Sqrt(cov[2])); + Double_t dyz[2]= {dy[1], dz[1]}; + Pulls(dyz, cov, tilt); + ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], dyz[0], dyz[1]); + ((TH3S*)arr->At(3))->Fill(tht, dyz[1], rc); + + Double_t dphi((phi-fTracklet->GetYfit(1))/(1-phi*fTracklet->GetYfit(1))); + Double_t dtht((tht-fTracklet->GetZfit(1))/(1-tht*fTracklet->GetZfit(1))); + ((TH2I*)arr->At(4))->Fill(phi, TMath::ATan(dphi)); + + if(DebugLevel()>=1){ + UChar_t err(fTracklet->GetErrorMsg()); + (*DebugStream()) << "tracklet" + <<"pt=" << pt + <<"phi=" << phi + <<"tht=" << tht + <<"det=" << sgm[2] + <<"dy0=" << dy[0] + <<"dz0=" << dz[0] + <<"dy=" << dy[1] + <<"dz=" << dz[1] + <<"dphi="<< dphi + <<"dtht="<< dtht + <<"dyp=" << dyz[0] + <<"dzp=" << dyz[1] + <<"rc=" << rc + <<"err=" << err + << "\n"; + } } @@ -423,7 +505,7 @@ TH1* AliTRDresolution::PlotTracklet(const AliTRDtrackV1 *track) //________________________________________________________ -TH1* AliTRDresolution::PlotTrackTPC(const AliTRDtrackV1 *track) +TH1* AliTRDresolution::PlotTrackIn(const AliTRDtrackV1 *track) { // Store resolution/pulls of Kalman before updating with the TRD information // at the radial position of the first tracklet. The following points are used @@ -436,30 +518,45 @@ TH1* AliTRDresolution::PlotTrackTPC(const AliTRDtrackV1 *track) if(track) fkTrack = track; if(!fkTrack){ - AliWarning("No Track defined."); - return 0x0; + AliDebug(4, "No Track defined."); + return NULL; } - AliExternalTrackParam *tin = 0x0; - if(!(tin = fkTrack->GetTrackLow())){ + TObjArray *arr = NULL; + if(!fContainer || !(arr = (TObjArray*)fContainer->At(kTrackIn))){ + AliWarning("No output container defined."); + return NULL; + } + AliExternalTrackParam *tin = NULL; + if(!(tin = fkTrack->GetTrackIn())){ AliWarning("Track did not entered TRD fiducial volume."); - return 0x0; + return NULL; } - TH1 *h = 0x0; + TH1 *h = NULL; Double_t x = tin->GetX(); - AliTRDseedV1 *tracklet = 0x0; + AliTRDseedV1 *fTracklet = NULL; for(Int_t ily=0; ilyGetTracklet(ily))) continue; + if(!(fTracklet = fkTrack->GetTracklet(ily))) continue; break; } - if(!tracklet || TMath::Abs(x-tracklet->GetX())>1.e-3){ - AliWarning("Tracklet did not match TRD entrance."); - return 0x0; + if(!fTracklet || TMath::Abs(x-fTracklet->GetX())>1.e-3){ + AliWarning("Tracklet did not match Track."); + return NULL; } + Int_t sgm[3]; + sgm[2] = fTracklet->GetDetector(); + sgm[0] = AliTRDgeometry::GetSector(sgm[2]); + sgm[1] = sgm[0] * AliTRDgeometry::kNstack + AliTRDgeometry::GetStack(sgm[2]); + Double_t tilt(fTracklet->GetTilt()) + ,t2(tilt*tilt) + ,corr(1./(1. + t2)) + ,cost(TMath::Sqrt(corr)); + Bool_t rc(fTracklet->IsRowCross()); + const Int_t kNPAR(5); Double_t parR[kNPAR]; memcpy(parR, tin->GetParameter(), kNPAR*sizeof(Double_t)); Double_t covR[3*kNPAR]; memcpy(covR, tin->GetCovariance(), 3*kNPAR*sizeof(Double_t)); - Double_t cov[3]; tracklet->GetCovAt(x, cov); + Double_t cov[3]; fTracklet->GetCovAt(x, cov); // define sum covariances TMatrixDSym COV(kNPAR); TVectorD PAR(kNPAR); @@ -474,30 +571,37 @@ TH1* AliTRDresolution::PlotTrackTPC(const AliTRDtrackV1 *track) //COV.Print(); PAR.Print(); //TODO Double_t dydx = TMath::Sqrt(1.-parR[2]*parR[2])/parR[2]; - Double_t dy = parR[0] - tracklet->GetY(); - TObjArray *arr = (TObjArray*)fContainer->At(kTrackTPC); - ((TH2I*)arr->At(0))->Fill(tracklet->GetYref(1), dy); - ((TH2I*)arr->At(1))->Fill(tracklet->GetYref(1), dy/TMath::Sqrt(COV(0,0)+cov[0])); - if(tracklet->IsRowCross()){ - Double_t dz = parR[1] - tracklet->GetZ(); - ((TH2I*)arr->At(2))->Fill(tracklet->GetZref(1), dz); - ((TH2I*)arr->At(3))->Fill(tracklet->GetZref(1), dz/TMath::Sqrt(COV(1,1)+cov[2])); - } - Double_t dphi = TMath::ASin(PAR[2])-TMath::ATan(tracklet->GetYfit(1)); ((TH2I*)arr->At(4))->Fill(tracklet->GetYref(1), dphi); + Double_t dy[2]={parR[0] - fTracklet->GetY(), 0.} + ,dz[2]={parR[1] - fTracklet->GetZ(), 0.} + ,dphi(TMath::ASin(PAR[2])-TMath::ATan(fTracklet->GetYfit(1))); + // calculate residuals using tilt rotation + dy[1] = cost*(dy[0] - dz[0]*tilt); + dz[1] = cost*(dz[0] + dy[0]*tilt); + + if(1./PAR[4]>fPtThreshold) ((TH3S*)arr->At(0))->Fill(fTracklet->GetYref(1), dy[1], sgm[fSegmentLevel]+rc*fgkNresYsegm[fSegmentLevel]); + ((TH3S*)arr->At(2))->Fill(fTracklet->GetZref(1), dz[1], rc); + ((TH2I*)arr->At(4))->Fill(fTracklet->GetYref(1), dphi); + + Double_t dyz[2] = {dy[1], dz[1]}; + Double_t cc[3] = {COV(0,0)+cov[0], COV(0,1)+cov[1], COV(1,1)+cov[2]}; + Pulls(dyz, cc, tilt); + ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], dyz[0], dyz[1]); + ((TH3S*)arr->At(3))->Fill(fTracklet->GetZref(1), dyz[1], rc); + // register reference histo for mini-task h = (TH2I*)arr->At(0); - if(DebugLevel()>=1){ + if(DebugLevel()>=2){ (*DebugStream()) << "trackIn" << "x=" << x << "P=" << &PAR << "C=" << &COV << "\n"; - Double_t y = tracklet->GetY(); - Double_t z = tracklet->GetZ(); + Double_t y = fTracklet->GetY(); + Double_t z = fTracklet->GetZ(); (*DebugStream()) << "trackletIn" << "y=" << y << "z=" << z @@ -510,8 +614,15 @@ TH1* AliTRDresolution::PlotTrackTPC(const AliTRDtrackV1 *track) if(!HasMCdata()) return h; UChar_t s; - Float_t dx, pt0, x0=tracklet->GetX0(), y0, z0, dydx0, dzdx0; + Float_t dx, pt0, x0=fTracklet->GetX0(), y0, z0, dydx0, dzdx0; if(!fkMC->GetDirections(x0, y0, z0, dydx0, dzdx0, pt0, s)) return h; + Int_t pdg = fkMC->GetPDG(), + sIdx(AliTRDpidUtil::Pdg2Pid(TMath::Abs(pdg))+1), // species index + sign(0); + if(!fDBPDG) fDBPDG=TDatabasePDG::Instance(); + TParticlePDG *ppdg(fDBPDG->GetParticle(pdg)); + if(ppdg) sign = ppdg->Charge() > 0. ? 1 : -1; + // translate to reference radial position dx = x0 - x; y0 -= dx*dydx0; z0 -= dx*dzdx0; Float_t norm = 1./TMath::Sqrt(1.+dydx0*dydx0); // 1/sqrt(1+tg^2(phi)) @@ -529,13 +640,17 @@ TH1* AliTRDresolution::PlotTrackTPC(const AliTRDtrackV1 *track) // TMatrixD sqrcov(evecs, TMatrixD::kMult, TMatrixD(evalsm, TMatrixD::kMult, evecs.T())); // fill histos - arr = (TObjArray*)fContainer->At(kMCtrackTPC); + if(!(arr = (TObjArray*)fContainer->At(kMCtrackIn))) { + AliWarning("No MC container defined."); + return h; + } + // y resolution/pulls - ((TH2I*)arr->At(0))->Fill(dydx0, PARMC[0]-PAR[0]); - ((TH2I*)arr->At(1))->Fill(dydx0, (PARMC[0]-PAR[0])/TMath::Sqrt(COV(0,0))); + if(pt0>fPtThreshold) ((TH3S*)arr->At(0))->Fill(dydx0, PARMC[0]-PAR[0], sgm[fSegmentLevel]); + ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], (PARMC[0]-PAR[0])/TMath::Sqrt(COV(0,0)), (PARMC[1]-PAR[1])/TMath::Sqrt(COV(1,1))); // z resolution/pulls - ((TH2I*)arr->At(2))->Fill(dzdx0, PARMC[1]-PAR[1]); - ((TH2I*)arr->At(3))->Fill(dzdx0, (PARMC[1]-PAR[1])/TMath::Sqrt(COV(1,1))); + ((TH3S*)arr->At(2))->Fill(dzdx0, PARMC[1]-PAR[1], 0); + ((TH3S*)arr->At(3))->Fill(dzdx0, (PARMC[1]-PAR[1])/TMath::Sqrt(COV(1,1)), 0); // phi resolution/snp pulls ((TH2I*)arr->At(4))->Fill(dydx0, TMath::ASin(PARMC[2])-TMath::ASin(PAR[2])); ((TH2I*)arr->At(5))->Fill(dydx0, (PARMC[2]-PAR[2])/TMath::Sqrt(COV(2,2))); @@ -543,22 +658,193 @@ TH1* AliTRDresolution::PlotTrackTPC(const AliTRDtrackV1 *track) ((TH2I*)arr->At(6))->Fill(dzdx0, TMath::ATan((PARMC[3]-PAR[3])/(1-PARMC[3]*PAR[3]))); ((TH2I*)arr->At(7))->Fill(dzdx0, (PARMC[3]-PAR[3])/TMath::Sqrt(COV(3,3))); // pt resolution\\1/pt pulls\\p resolution/pull - for(Int_t is=AliPID::kSPECIES; is--;){ - if(TMath::Abs(fkMC->GetPDG())!=AliPID::ParticleCode(is)) continue; - ((TH3S*)arr->At(8))->Fill(pt0, PARMC[4]/PAR[4]-1., is); - ((TH3S*)arr->At(9))->Fill(PARMC[4], (PARMC[4]-PAR[4])/TMath::Sqrt(COV(4,4)), is); - - Double_t p0 = TMath::Sqrt(1.+ PARMC[3]*PARMC[3])*pt0, p; - Float_t sp; - p = tracklet->GetMomentum(&sp); - ((TH3S*)arr->At(10))->Fill(p0, p/p0-1., is); - ((TH3S*)arr->At(11))->Fill(p0, (p0-p)/sp, is); + ((TH3S*)arr->At(8))->Fill(pt0, PARMC[4]/PAR[4]-1., sign*sIdx); + ((TH3S*)arr->At(9))->Fill(PARMC[4], (PARMC[4]-PAR[4])/TMath::Sqrt(COV(4,4)), sign*sIdx); + + Double_t p0 = TMath::Sqrt(1.+ PARMC[3]*PARMC[3])*pt0, p; + p = TMath::Sqrt(1.+ PAR[3]*PAR[3])/PAR[4]; + ((TH3S*)arr->At(10))->Fill(p0, p/p0-1., sign*sIdx); +// Float_t sp = +// p*p*PAR[4]*PAR[4]*COV(4,4) +// +2.*PAR[3]*COV(3,4)/PAR[4] +// +PAR[3]*PAR[3]*COV(3,3)/p/p/PAR[4]/PAR[4]/PAR[4]/PAR[4]; +// if(sp>0.) ((TH3S*)arr->At(11))->Fill(p0, (p0-p)/TMath::Sqrt(sp), sign*sIdx); + + // fill debug for MC + if(DebugLevel()>=3){ + (*DebugStream()) << "trackInMC" + << "P=" << &PARMC + << "\n"; + } + return h; +} + +//________________________________________________________ +TH1* AliTRDresolution::PlotTrackOut(const AliTRDtrackV1 *track) +{ +// Store resolution/pulls of Kalman after last update with the TRD information +// at the radial position of the first tracklet. The following points are used +// for comparison +// - the (y,z,snp) of the first TRD tracklet +// - the (y, z, snp, tgl, pt) of the MC track reference +// +// Additionally the momentum resolution/pulls are calculated for usage in the +// PID calculation. + + if(track) fkTrack = track; + if(!fkTrack){ + AliDebug(4, "No Track defined."); + return NULL; + } + TObjArray *arr = NULL; + if(!fContainer || !(arr = (TObjArray*)fContainer->At(kTrackOut))){ + AliWarning("No output container defined."); + return NULL; + } + AliExternalTrackParam *tout = NULL; + if(!(tout = fkTrack->GetTrackOut())){ + AliWarning("Track did not exit TRD."); + return NULL; + } + TH1 *h(NULL); + + Double_t x = tout->GetX(); + AliTRDseedV1 *fTracklet(NULL); + for(Int_t ily=0; ilyGetTracklet(ily))) continue; break; } + if(!fTracklet || TMath::Abs(x-fTracklet->GetX())>1.e-3){ + AliWarning("Tracklet did not match Track position."); + return NULL; + } + Int_t sgm[3]; + sgm[2] = fTracklet->GetDetector(); + sgm[0] = AliTRDgeometry::GetSector(sgm[2]); + sgm[1] = sgm[0] * AliTRDgeometry::kNstack + AliTRDgeometry::GetStack(sgm[2]); + Double_t tilt(fTracklet->GetTilt()) + ,t2(tilt*tilt) + ,corr(1./(1. + t2)) + ,cost(TMath::Sqrt(corr)); + Bool_t rc(fTracklet->IsRowCross()); + + const Int_t kNPAR(5); + Double_t parR[kNPAR]; memcpy(parR, tout->GetParameter(), kNPAR*sizeof(Double_t)); + Double_t covR[3*kNPAR]; memcpy(covR, tout->GetCovariance(), 3*kNPAR*sizeof(Double_t)); + Double_t cov[3]; fTracklet->GetCovAt(x, cov); + + // define sum covariances + TMatrixDSym COV(kNPAR); TVectorD PAR(kNPAR); + Double_t *pc = &covR[0], *pp = &parR[0]; + for(Int_t ir=0; irGetY(), 0., 0.} + ,dz[3]={parR[1] - fTracklet->GetZ(), 0., 0.} + ,dphi(TMath::ASin(PAR[2])-TMath::ATan(fTracklet->GetYfit(1))); + // calculate residuals using tilt rotation + dy[1] = cost*(dy[0] - dz[0]*tilt); + dz[1] = cost*(dz[0] + dy[0]*tilt); + + if(1./PAR[4]>fPtThreshold) ((TH3S*)arr->At(0))->Fill(fTracklet->GetYref(1), 1.e2*dy[1], sgm[fSegmentLevel]+rc*fgkNresYsegm[fSegmentLevel]); // scale to fit general residual range !!! + ((TH3S*)arr->At(2))->Fill(fTracklet->GetZref(1), dz[1], rc); + ((TH2I*)arr->At(4))->Fill(fTracklet->GetYref(1), dphi); + + Double_t dyz[2] = {dy[1], dz[1]}; + Double_t cc[3] = {COV(0,0)+cov[0], COV(0,1)+cov[1], COV(1,1)+cov[2]}; + Pulls(dyz, cc, tilt); + ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], dyz[0], dyz[1]); + ((TH3S*)arr->At(3))->Fill(fTracklet->GetZref(1), dyz[1], rc); + + // register reference histo for mini-task + h = (TH2I*)arr->At(0); + + if(DebugLevel()>=2){ + (*DebugStream()) << "trackOut" + << "x=" << x + << "P=" << &PAR + << "C=" << &COV + << "\n"; + + Double_t y = fTracklet->GetY(); + Double_t z = fTracklet->GetZ(); + (*DebugStream()) << "trackletOut" + << "y=" << y + << "z=" << z + << "Vy=" << cov[0] + << "Cyz=" << cov[1] + << "Vz=" << cov[2] + << "\n"; + } + + + if(!HasMCdata()) return h; + UChar_t s; + Float_t dx, pt0, x0=fTracklet->GetX0(), y0, z0, dydx0, dzdx0; + if(!fkMC->GetDirections(x0, y0, z0, dydx0, dzdx0, pt0, s)) return h; + Int_t pdg = fkMC->GetPDG(), + sIdx(AliTRDpidUtil::Pdg2Pid(TMath::Abs(pdg))+1), // species index + sign(0); + if(!fDBPDG) fDBPDG=TDatabasePDG::Instance(); + TParticlePDG *ppdg(fDBPDG->GetParticle(pdg)); + if(ppdg) sign = ppdg->Charge() > 0. ? 1 : -1; + + // translate to reference radial position + dx = x0 - x; y0 -= dx*dydx0; z0 -= dx*dzdx0; + Float_t norm = 1./TMath::Sqrt(1.+dydx0*dydx0); // 1/sqrt(1+tg^2(phi)) + //Fill MC info + TVectorD PARMC(kNPAR); + PARMC[0]=y0; PARMC[1]=z0; + PARMC[2]=dydx0*norm; PARMC[3]=dzdx0*norm; + PARMC[4]=1./pt0; + +// TMatrixDSymEigen eigen(COV); +// TVectorD evals = eigen.GetEigenValues(); +// TMatrixDSym evalsm(kNPAR); +// for(Int_t ir=0; irAt(kMCtrackOut))){ + AliWarning("No MC container defined."); + return h; + } + // y resolution/pulls + if(pt0>fPtThreshold) ((TH3S*)arr->At(0))->Fill(dydx0, PARMC[0]-PAR[0], sgm[fSegmentLevel]); + ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], (PARMC[0]-PAR[0])/TMath::Sqrt(COV(0,0)), (PARMC[1]-PAR[1])/TMath::Sqrt(COV(1,1))); + // z resolution/pulls + ((TH3S*)arr->At(2))->Fill(dzdx0, PARMC[1]-PAR[1], 0); + ((TH3S*)arr->At(3))->Fill(dzdx0, (PARMC[1]-PAR[1])/TMath::Sqrt(COV(1,1)), 0); + // phi resolution/snp pulls + ((TH2I*)arr->At(4))->Fill(dydx0, TMath::ASin(PARMC[2])-TMath::ASin(PAR[2])); + ((TH2I*)arr->At(5))->Fill(dydx0, (PARMC[2]-PAR[2])/TMath::Sqrt(COV(2,2))); + // theta resolution/tgl pulls + ((TH2I*)arr->At(6))->Fill(dzdx0, TMath::ATan((PARMC[3]-PAR[3])/(1-PARMC[3]*PAR[3]))); + ((TH2I*)arr->At(7))->Fill(dzdx0, (PARMC[3]-PAR[3])/TMath::Sqrt(COV(3,3))); + // pt resolution\\1/pt pulls\\p resolution/pull + ((TH3S*)arr->At(8))->Fill(pt0, PARMC[4]/PAR[4]-1., sign*sIdx); + ((TH3S*)arr->At(9))->Fill(PARMC[4], (PARMC[4]-PAR[4])/TMath::Sqrt(COV(4,4)), sign*sIdx); + + Double_t p0 = TMath::Sqrt(1.+ PARMC[3]*PARMC[3])*pt0, p; + p = TMath::Sqrt(1.+ PAR[3]*PAR[3])/PAR[4]; + ((TH3S*)arr->At(10))->Fill(p0, p/p0-1., sign*sIdx); +// Float_t sp = +// p*p*PAR[4]*PAR[4]*COV(4,4) +// +2.*PAR[3]*COV(3,4)/PAR[4] +// +PAR[3]*PAR[3]*COV(3,3)/p/p/PAR[4]/PAR[4]/PAR[4]/PAR[4]; +// if(sp>0.) ((TH3S*)arr->At(11))->Fill(p0, (p0-p)/TMath::Sqrt(sp), sign*sIdx); // fill debug for MC - if(DebugLevel()>=1){ - (*DebugStream()) << "trackInMC" + if(DebugLevel()>=3){ + (*DebugStream()) << "trackOutMC" << "P=" << &PARMC << "\n"; } @@ -574,61 +860,74 @@ TH1* AliTRDresolution::PlotMC(const AliTRDtrackV1 *track) if(!HasMCdata()){ AliWarning("No MC defined. Results will not be available."); - return 0x0; + return NULL; } if(track) fkTrack = track; if(!fkTrack){ - AliWarning("No Track defined."); - return 0x0; + AliDebug(4, "No Track defined."); + return NULL; + } + if(!fContainer){ + AliWarning("No output container defined."); + return NULL; } - TObjArray *arr = 0x0; - TH1 *h = 0x0; + // retriev track characteristics + Int_t pdg = fkMC->GetPDG(), + sIdx(AliTRDpidUtil::Pdg2Pid(TMath::Abs(pdg))+1), // species index + sign(0), + sgm[3], + label(fkMC->GetLabel()); + if(!fDBPDG) fDBPDG=TDatabasePDG::Instance(); + TParticlePDG *ppdg(fDBPDG->GetParticle(pdg)); + if(ppdg) sign = ppdg->Charge() > 0. ? 1 : -1; + + TObjArray *arr(NULL);TH1 *h(NULL); UChar_t s; - Int_t pdg = fkMC->GetPDG(), det=-1; - Int_t label = fkMC->GetLabel(); Double_t xAnode, x, y, z, pt, dydx, dzdx, dzdl; Float_t pt0, x0, y0, z0, dx, dy, dz, dydx0, dzdx0; Double_t covR[7]/*, cov[3]*/; - if(DebugLevel()>=1){ - Double_t dX[12], dY[12], dZ[12], dPt[12], cCOV[12][15]; - fkMC->PropagateKalman(dX, dY, dZ, dPt, cCOV); + if(DebugLevel()>=3){ + TVectorD dX(12), dY(12), dZ(12), Pt(12), dPt(12), cCOV(12*15); + fkMC->PropagateKalman(&dX, &dY, &dZ, &Pt, &dPt, &cCOV); (*DebugStream()) << "MCkalman" - << "pdg=" << pdg - << "dx0=" << dX[0] - << "dx1=" << dX[1] - << "dx2=" << dX[2] - << "dy0=" << dY[0] - << "dy1=" << dY[1] - << "dy2=" << dY[2] - << "dz0=" << dZ[0] - << "dz1=" << dZ[1] - << "dz2=" << dZ[2] - << "dpt0=" << dPt[0] - << "dpt1=" << dPt[1] - << "dpt2=" << dPt[2] + << "pdg=" << pdg + << "dx=" << &dX + << "dy=" << &dY + << "dz=" << &dZ + << "pt=" << &Pt + << "dpt=" << &dPt + << "cov=" << &cCOV << "\n"; } AliTRDReconstructor rec; - AliTRDseedV1 *fTracklet = 0x0; + AliTRDseedV1 *fTracklet(NULL); TObjArray *clInfoArr(NULL); for(Int_t ily=0; ilyGetTracklet(ily)))/* || !fTracklet->IsOK())*/ continue; - det = fTracklet->GetDetector(); + sgm[2] = fTracklet->GetDetector(); + sgm[0] = AliTRDgeometry::GetSector(sgm[2]); + sgm[1] = sgm[0] * AliTRDgeometry::kNstack + AliTRDgeometry::GetStack(sgm[2]); + Double_t tilt(fTracklet->GetTilt()) + ,t2(tilt*tilt) + ,corr(1./(1. + t2)) + ,cost(TMath::Sqrt(corr)); x0 = fTracklet->GetX0(); //radial shift with respect to the MC reference (radial position of the pad plane) x= fTracklet->GetX(); + Bool_t rc(fTracklet->IsRowCross()); if(!fkMC->GetDirections(x0, y0, z0, dydx0, dzdx0, pt0, s)) continue; xAnode = fTracklet->GetX0(); // MC track position at reference radial position dx = x0 - x; - if(DebugLevel()>=1){ + if(DebugLevel()>=4){ (*DebugStream()) << "MC" - << "det=" << det + << "det=" << sgm[2] << "pdg=" << pdg + << "sgn=" << sign << "pt=" << pt0 << "x=" << x0 << "y=" << y0 @@ -653,13 +952,13 @@ TH1* AliTRDresolution::PlotMC(const AliTRDtrackV1 *track) pt = TMath::Abs(fTracklet->GetPt()); fTracklet->GetCovRef(covR); - arr = (TObjArray*)fContainer->At(kMCtrackTRD); + arr = (TObjArray*)((TObjArray*)fContainer->At(kMCtrack))->At(ily); // y resolution/pulls - ((TH2I*)arr->At(0))->Fill(dydx0, dy); - ((TH2I*)arr->At(1))->Fill(dydx0, dy/TMath::Sqrt(covR[0])); + if(pt0>fPtThreshold) ((TH3S*)arr->At(0))->Fill(dydx0, dy, sgm[fSegmentLevel]); + ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], dy/TMath::Sqrt(covR[0]), dz/TMath::Sqrt(covR[2])); // z resolution/pulls - ((TH2I*)arr->At(2))->Fill(dzdx0, dz); - ((TH2I*)arr->At(3))->Fill(dzdx0, dz/TMath::Sqrt(covR[2])); + ((TH3S*)arr->At(2))->Fill(dzdx0, dz, 0); + ((TH3S*)arr->At(3))->Fill(dzdx0, dz/TMath::Sqrt(covR[2]), 0); // phi resolution/ snp pulls Double_t dtgp = (dydx - dydx0)/(1.- dydx*dydx0); ((TH2I*)arr->At(4))->Fill(dydx0, TMath::ATan(dtgp)); @@ -672,18 +971,14 @@ TH1* AliTRDresolution::PlotMC(const AliTRDtrackV1 *track) TMath::ATan(dtgl)); ((TH2I*)arr->At(7))->Fill(dzdl0, (dzdl - dzdl0)/TMath::Sqrt(covR[4])); // pt resolution \\ 1/pt pulls \\ p resolution for PID - for(Int_t is=AliPID::kSPECIES; is--;){ - if(TMath::Abs(pdg)!=AliPID::ParticleCode(is)) continue; - ((TH3S*)((TObjArray*)arr->At(8))->At(ily))->Fill(pt0, pt/pt0-1., is); - ((TH3S*)((TObjArray*)arr->At(9))->At(ily))->Fill(1./pt0, (1./pt-1./pt0)/TMath::Sqrt(covR[6]), is); - Double_t p0 = TMath::Sqrt(1.+ dzdl0*dzdl0)*pt0, - p = TMath::Sqrt(1.+ dzdl*dzdl)*pt; - ((TH3S*)((TObjArray*)arr->At(10))->At(ily))->Fill(p0, p/p0-1., is); - break; - } + Double_t p0 = TMath::Sqrt(1.+ dzdl0*dzdl0)*pt0, + p = TMath::Sqrt(1.+ dzdl*dzdl)*pt; + ((TH3S*)((TObjArray*)arr->At(8)))->Fill(pt0, pt/pt0-1., sign*sIdx); + ((TH3S*)((TObjArray*)arr->At(9)))->Fill(1./pt0, (1./pt-1./pt0)/TMath::Sqrt(covR[6]), sign*sIdx); + ((TH3S*)((TObjArray*)arr->At(10)))->Fill(p0, p/p0-1., sign*sIdx); // Fill Debug stream for Kalman track - if(DebugLevel()>=1){ + if(DebugLevel()>=4){ (*DebugStream()) << "MCtrack" << "pt=" << pt << "x=" << x @@ -707,28 +1002,22 @@ TH1* AliTRDresolution::PlotMC(const AliTRDtrackV1 *track) dx = x0 - x; ymc = y0 - dx*dydx0; zmc = z0 - dx*dzdx0; - Bool_t rc = tt.IsRowCross(); - + dy = y-ymc; + dz = z-zmc; + Float_t dphi = (dydx - dydx0); + dphi /= (1.- dydx*dydx0); + // add tracklet residuals for y and dydx arr = (TObjArray*)fContainer->At(kMCtracklet); - if(!rc){ - dy = y-ymc; - - Float_t dphi = (dydx - dydx0); - dphi /= (1.- dydx*dydx0); - ((TH2I*)arr->At(0))->Fill(dydx0, dy); - if(tt.GetS2Y()>0.) ((TH2I*)arr->At(1))->Fill(dydx0, dy/TMath::Sqrt(tt.GetS2Y())); - ((TH2I*)arr->At(4))->Fill(dydx0, TMath::ATan(dphi)); - } else { - // add tracklet residuals for z - dz = z-zmc; - ((TH2I*)arr->At(2))->Fill(dzdl0, dz); - if(tt.GetS2Z()>0.) ((TH2I*)arr->At(3))->Fill(dzdl0, dz/TMath::Sqrt(tt.GetS2Z())); - } + if(pt0>fPtThreshold) ((TH3S*)arr->At(0))->Fill(dydx0, dy, sgm[fSegmentLevel]); + if(tt.GetS2Y()>0. && tt.GetS2Z()>0.) ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], dy/TMath::Sqrt(tt.GetS2Y()), dz/TMath::Sqrt(tt.GetS2Z())); + ((TH3S*)arr->At(2))->Fill(dzdl0, dz, rc); + if(tt.GetS2Z()>0.) ((TH3S*)arr->At(3))->Fill(dzdl0, dz/TMath::Sqrt(tt.GetS2Z()), rc); + ((TH2I*)arr->At(4))->Fill(dydx0, TMath::ATan(dphi)); // Fill Debug stream for tracklet - if(DebugLevel()>=1){ + if(DebugLevel()>=4){ Float_t s2y = tt.GetS2Y(); Float_t s2z = tt.GetS2Z(); (*DebugStream()) << "MCtracklet" @@ -742,26 +1031,26 @@ TH1* AliTRDresolution::PlotMC(const AliTRDtrackV1 *track) << "\n"; } - Int_t istk = AliTRDgeometry::GetStack(det); - AliTRDpadPlane *pp = fGeo->GetPadPlane(ily, istk); + AliTRDpadPlane *pp = fGeo->GetPadPlane(ily, AliTRDgeometry::GetStack(sgm[2])); Float_t zr0 = pp->GetRow0() + pp->GetAnodeWireOffset(); - Float_t tilt = fTracklet->GetTilt(); //Double_t exb = AliTRDCommonParam::Instance()->GetOmegaTau(1.5); arr = (TObjArray*)fContainer->At(kMCcluster); - AliTRDcluster *c = 0x0; - fTracklet->ResetClusterIter(kFALSE); - while((c = fTracklet->PrevCluster())){ + AliTRDcluster *c = NULL; + tt.ResetClusterIter(kFALSE); + while((c = tt.PrevCluster())){ Float_t q = TMath::Abs(c->GetQ()); x = c->GetX(); y = c->GetY();z = c->GetZ(); dx = x0 - x; ymc= y0 - dx*dydx0; zmc= z0 - dx*dzdx0; - dy = ymc - (y - tilt*(z-zmc)); + dy = cost*(y - ymc - tilt*(z-zmc)); + dz = cost*(z - zmc + tilt*(y-ymc)); + // Fill Histograms - if(q>20. && q<250.){ - ((TH2I*)arr->At(0))->Fill(dydx0, dy); - ((TH2I*)arr->At(1))->Fill(dydx0, dy/TMath::Sqrt(c->GetSigmaY2())); + if(q>20. && q<250. && pt0>fPtThreshold && c->IsInChamber()){ + ((TH3S*)arr->At(0))->Fill(dydx0, dy, sgm[fSegmentLevel]); + ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], dy/TMath::Sqrt(c->GetSigmaY2()), dz/TMath::Sqrt(c->GetSigmaZ2())); } // Fill calibration container @@ -769,25 +1058,29 @@ TH1* AliTRDresolution::PlotMC(const AliTRDtrackV1 *track) d -= ((Int_t)(2 * d)) / 2.0; if (d > 0.25) d = 0.5 - d; AliTRDclusterInfo *clInfo = new AliTRDclusterInfo; - fMCcl->Add(clInfo); clInfo->SetCluster(c); clInfo->SetMC(pdg, label); clInfo->SetGlobalPosition(ymc, zmc, dydx0, dzdx0); clInfo->SetResolution(dy); clInfo->SetAnisochronity(d); - clInfo->SetDriftLength(((c->GetPadTime()+0.5)*.1)*1.5); - //dx-.5*AliTRDgeometry::CamHght()); + clInfo->SetDriftLength(dx); clInfo->SetTilt(tilt); - - // Fill Debug Tree - if(DebugLevel()>=2){ - //clInfo->Print(); - (*DebugStream()) << "MCcluster" - <<"clInfo.=" << clInfo - << "\n"; + if(fMCcl) fMCcl->Add(clInfo); + else AliDebug(1, "MCcl exchange container missing. Activate by calling \"InitExchangeContainers()\""); + if(DebugLevel()>=5){ + if(!clInfoArr) clInfoArr=new TObjArray(AliTRDseedV1::kNclusters); + clInfoArr->Add(clInfo); } } + // Fill Debug Tree + if(DebugLevel()>=5 && clInfoArr){ + (*DebugStream()) << "MCcluster" + <<"clInfo.=" << clInfoArr + << "\n"; + clInfoArr->Clear(); + } } + if(clInfoArr) delete clInfoArr; return h; } @@ -804,311 +1097,744 @@ Bool_t AliTRDresolution::GetRefFigure(Int_t ifig) AliWarning("Please provide a canvas to draw results."); return kFALSE; } - TList *l = 0x0; TVirtualPad *pad=0x0; + Int_t selection[100], n(0), selStart(0); // + Int_t ly0(0), dly(5); + //Int_t ly0(1), dly(2); // used for SA + TList *l(NULL); TVirtualPad *pad(NULL); + TGraphErrors *g(NULL);TGraphAsymmErrors *ga(NULL); switch(ifig){ - case kCharge: + case 0: // charge resolution gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); ((TVirtualPad*)l->At(0))->cd(); - ((TGraphAsymmErrors*)((TObjArray*)fGraphM->At(kCharge))->At(0))->Draw("apl"); + ga=((TGraphAsymmErrors*)((TObjArray*)fGraphM->At(kCharge))->At(0)); + if(ga->GetN()) ga->Draw("apl"); ((TVirtualPad*)l->At(1))->cd(); - ((TGraphErrors*)((TObjArray*)fGraphS->At(kCharge))->At(0))->Draw("apl"); + g = ((TGraphErrors*)((TObjArray*)fGraphS->At(kCharge))->At(0)); + if(g->GetN()) g->Draw("apl"); break; - case kCluster: + case 1: // cluster2track residuals + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = -.3; xy[1] = -100.; xy[2] = .3; xy[3] = 1000.; + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + selStart=0; for(n=0; nAt(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + selStart=fgkNresYsegm[fSegmentLevel]/3; for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0] = -.3; xy[1] = -200.; xy[2] = .3; xy[3] = 1000.; + xy[0] = -.3; xy[1] = -100.; xy[2] = .3; xy[3] = 1000.; + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + selStart=2*fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + if(!GetGraphArray(xy, kCluster, 1, 1)) break; + return kTRUE; + case 3: // kTrack y + gPad->Divide(3, 2, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = -.3; xy[1] = -20.; xy[2] = .3; xy[3] = 100.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kCluster, 0)) break; - xy[0] = -.3; xy[1] = -0.5; xy[2] = .3; xy[3] = 2.5; + selStart=0; for(n=0; nAt(1))->cd(); - if(!GetGraphPlot(&xy[0], kCluster, 1)) break; + selStart=fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(2))->cd(); + selStart=2*fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(3))->cd(); + selStart=fgkNresYsegm[fSegmentLevel]; for(n=0; nAt(4))->cd(); + selStart=fgkNresYsegm[fSegmentLevel]/3+fgkNresYsegm[fSegmentLevel]; for(n=0; nAt(5))->cd(); + selStart=2*fgkNresYsegm[fSegmentLevel]/3+fgkNresYsegm[fSegmentLevel]; for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0] = -.3; xy[1] = -500.; xy[2] = .3; xy[3] = 1500.; + + xy[0] = -1.; xy[1] = -150.; xy[2] = 1.; xy[3] = 1000.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kTrackTRD , 0)) break; - xy[0] = -.3; xy[1] = -0.5; xy[2] = .3; xy[3] = 2.5; + selection[0]=1; + if(!GetGraphArray(xy, kTrack, 2, 1, 1, selection)) break; + + xy[0] = -1.; xy[1] = -1500.; xy[2] = 1.; xy[3] = 10000.; ((TVirtualPad*)l->At(1))->cd(); - if(!GetGraphPlot(&xy[0], kTrackTRD , 1)) break; + selection[0]=0; + if(!GetGraphArray(xy, kTrack, 2, 1, 1, selection)) break; + return kTRUE; - case 3: // kTrackTRD z + case 5: // kTrack pulls gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0] = -1.; xy[1] = -1000.; xy[2] = 1.; xy[3] = 4000.; + + xy[0] = -.5; xy[1] = -0.5; xy[2] = fgkNresYsegm[fSegmentLevel]-.5; xy[3] = 2.5; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kTrackTRD , 2)) break; + if(!GetGraphArray(xy, kTrack, 1, 1)) break; + xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5; ((TVirtualPad*)l->At(1))->cd(); - if(!GetGraphPlot(&xy[0], kTrackTRD , 3)) break; + if(!GetGraphArray(xy, kTrack, 3, 1)) break; + return kTRUE; + case 6: // kTrack phi + xy[0] = -.3; xy[1] = -5.; xy[2] = .3; xy[3] = 50.; + if(GetGraph(&xy[0], kTrack , 4)) return kTRUE; + break; + case 7: // kTrackIn y + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = -.3; xy[1] = -1500.; xy[2] = .3; xy[3] = 5000.; + pad = ((TVirtualPad*)l->At(0)); pad->cd(); + pad->SetMargin(0.1, 0.1, 0.1, 0.01); + selStart=0; for(n=0; nAt(1)); pad->cd(); + pad->SetMargin(0.1, 0.1, 0.1, 0.01); + selStart=fgkNresYsegm[fSegmentLevel]/3; for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = -.3; xy[1] = -1500.; xy[2] = .3; xy[3] = 5000.; + pad = ((TVirtualPad*)l->At(0)); pad->cd(); + pad->SetMargin(0.1, 0.1, 0.1, 0.01); + selStart=2*fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(1)); pad->cd(); + pad->SetMargin(0.1, 0.1, 0.1, 0.01); + if(!GetGraphArray(xy, kTrackIn, 1, 1)) break; + return kTRUE; + case 9: // kTrackIn z + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = -1.; xy[1] = -1000.; xy[2] = 1.; xy[3] = 4000.; + pad = ((TVirtualPad*)l->At(0)); pad->cd(); + pad->SetMargin(0.1, 0.1, 0.1, 0.01); + selection[0]=1; + if(!GetGraphArray(xy, kTrackIn, 2, 1, 1, selection)) break; + xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5; + pad = ((TVirtualPad*)l->At(1)); pad->cd(); + pad->SetMargin(0.1, 0.1, 0.1, 0.01); + if(!GetGraphArray(xy, kTrackIn, 3, 1)) break; return kTRUE; - case 4: // kTrackTRD phi + case 10: // kTrackIn phi xy[0] = -.3; xy[1] = -5.; xy[2] = .3; xy[3] = 50.; - if(GetGraphPlot(&xy[0], kTrackTRD , 4)) return kTRUE; + if(GetGraph(&xy[0], kTrackIn, 4)) return kTRUE; break; - case 5: // kTrackTPC y + case 11: // kTrackOut y + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = -.3; xy[1] = -50.; xy[2] = .3; xy[3] = 150.; + pad = ((TVirtualPad*)l->At(0)); pad->cd(); + pad->SetMargin(0.1, 0.1, 0.1, 0.01); + selStart=0; for(n=0; nAt(1)); pad->cd(); + pad->SetMargin(0.1, 0.1, 0.1, 0.01); + selStart=fgkNresYsegm[fSegmentLevel]/3; for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0] = -.3; xy[1] = -500.; xy[2] = .3; xy[3] = 1500.; + xy[0] = -.3; xy[1] = -50.; xy[2] = .3; xy[3] = 150.; pad = ((TVirtualPad*)l->At(0)); pad->cd(); pad->SetMargin(0.1, 0.1, 0.1, 0.01); - if(!GetGraphPlot(&xy[0], kTrackTPC, 0)) break; - xy[0] = -.3; xy[1] = -0.5; xy[2] = .3; xy[3] = 2.5; + selStart=2*fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(1)); pad->cd(); pad->SetMargin(0.1, 0.1, 0.1, 0.01); - if(!GetGraphPlot(&xy[0], kTrackTPC, 1)) break; + if(!GetGraphArray(xy, kTrackOut, 1, 1)) break; return kTRUE; - case 6: // kTrackTPC z + case 13: // kTrackOut z gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); xy[0] = -1.; xy[1] = -1000.; xy[2] = 1.; xy[3] = 4000.; pad = ((TVirtualPad*)l->At(0)); pad->cd(); pad->SetMargin(0.1, 0.1, 0.1, 0.01); - if(!GetGraphPlot(&xy[0], kTrackTPC, 2)) break; + if(!GetGraphArray(xy, kTrackOut, 2, 1)) break; xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5; pad = ((TVirtualPad*)l->At(1)); pad->cd(); pad->SetMargin(0.1, 0.1, 0.1, 0.01); - if(!GetGraphPlot(&xy[0], kTrackTPC, 3)) break; + if(!GetGraphArray(xy, kTrackOut, 3, 1)) break; return kTRUE; - case 7: // kTrackTPC phi + case 14: // kTrackOut phi xy[0] = -.3; xy[1] = -5.; xy[2] = .3; xy[3] = 50.; - if(GetGraphPlot(&xy[0], kTrackTPC, 4)) return kTRUE; + if(GetGraph(&xy[0], kTrackOut, 4)) return kTRUE; break; - case 8: // kMCcluster + case 15: // kMCcluster gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); xy[0]=-.3; xy[1]=-50.; xy[2]=.3; xy[3]=650.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCcluster, 0)) break; - xy[0] = -.3; xy[1] = -0.5; xy[2] = .3; xy[3] = 2.5; + selStart=0; for(n=0; nAt(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCcluster, 1)) break; + selStart=fgkNresYsegm[fSegmentLevel]/3; for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-.2; xy[1]=-50.; xy[2]=.2; xy[3] =250.; + xy[0]=-.3; xy[1]=-50.; xy[2]=.3; xy[3]=650.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtracklet, 0)) break; - xy[0] = -.2; xy[1] = -0.5; xy[2] = .2; xy[3] = 2.5; + selStart=2*fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(1))->cd(); + xy[0]=-.5; xy[1]=-0.5; xy[2]=fgkNresYsegm[fSegmentLevel]-.5; xy[3]=2.5; + if(!GetGraphArray(xy, kMCcluster, 1, 1)) break; + return kTRUE; + case 17: //kMCtracklet [y] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.3; xy[1]=-50.; xy[2]=.3; xy[3] =500.; + ((TVirtualPad*)l->At(0))->cd(); + selStart=0; for(n=0; nAt(1))->cd(); + selStart=fgkNresYsegm[fSegmentLevel]/3; for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.3; xy[1]=-50.; xy[2]=.3; xy[3] =500.; + ((TVirtualPad*)l->At(0))->cd(); + selStart=2*fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtracklet, 1)) break; + xy[0]=-.5; xy[1]=-0.5; xy[2]=fgkNresYsegm[fSegmentLevel]-.5; xy[3]=2.5; + if(!GetGraphArray(xy, kMCtracklet, 1, 1)) break; return kTRUE; - case 10: //kMCtracklet [z] + case 19: //kMCtracklet [z] gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); xy[0]=-1.; xy[1]=-100.; xy[2]=1.; xy[3] =2500.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtracklet, 2)) break; + if(!GetGraphArray(xy, kMCtracklet, 2)) break; xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5; ((TVirtualPad*)l->At(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtracklet, 3)) break; + if(!GetGraphArray(xy, kMCtracklet, 3)) break; return kTRUE; - case 11: //kMCtracklet [phi] + case 20: //kMCtracklet [phi] xy[0]=-.3; xy[1]=-3.; xy[2]=.3; xy[3] =25.; - if(!GetGraphPlot(&xy[0], kMCtracklet, 4)) break; + if(!GetGraph(&xy[0], kMCtracklet, 4)) break; return kTRUE; - case 12: //kMCtrackTRD [y] + case 21: //kMCtrack [y] ly [0] gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-.2; xy[1]=-50.; xy[2]=.2; xy[3] =200.; + xy[0]=-.2; xy[1]=-50.; xy[2]=.2; xy[3] =400.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTRD, 0)) break; - xy[0] = -.2; xy[1] = -0.5; xy[2] = .2; xy[3] = 2.5; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*0.); for(n=0; nAt(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTRD, 1)) break; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*0.5); for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-1.; xy[1]=-700.; xy[2]=1.; xy[3] =1500.; + xy[0]=-.2; xy[1]=-50.; xy[2]=.2; xy[3] =400.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTRD, 2)) break; - xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*1.); for(n=0; nAt(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTRD, 3)) break; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*1.5); for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-.2; xy[1]=-0.2; xy[2]=.2; xy[3] =2.; + xy[0]=-.2; xy[1]=-50.; xy[2]=.2; xy[3] =400.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTRD, 4)) break; - xy[0] = -.2; xy[1] = -0.5; xy[2] = .2; xy[3] = 2.5; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*2.); for(n=0; nAt(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTRD, 5)) break; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*2.5); for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-1.; xy[1]=-0.5; xy[2]=1.; xy[3] =5.; + xy[0]=-.2; xy[1]=-50.; xy[2]=.2; xy[3] =400.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTRD, 6)) break; - xy[0] = -.2; xy[1] = -0.5; xy[2] = .2; xy[3] = 2.5; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*3.); for(n=0; nAt(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTRD, 7)) break; - return kTRUE; - case 16: //kMCtrackTRD [pt] - xy[0] = 0.; xy[1] = -5.; xy[2] = 12.; xy[3] = 7.; - gPad->Divide(2, 3, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - for(Int_t il=0; ilAt(il); pad->cd(); - pad->SetMargin(0.07, 0.07, 0.1, 0.); - if(!GetGraphTrack(&xy[0], 8, il)) break; - } - return kTRUE; - case 17: //kMCtrackTRD [1/pt] pulls - xy[0] = 0.; xy[1] = -1.5; xy[2] = 2.; xy[3] = 2.; - gPad->Divide(2, 3, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - for(Int_t il=0; ilAt(il); pad->cd(); - pad->SetMargin(0.07, 0.07, 0.1, 0.); - if(!GetGraphTrack(&xy[0], 9, il)) break; - } + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*3.5); for(n=0; nDivide(2, 3, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - for(Int_t il=0; ilAt(il); pad->cd(); - pad->SetMargin(0.07, 0.07, 0.1, 0.); - if(!GetGraphTrack(&xy[0], 10, il)) break; - } + case 25: //kMCtrack [y] ly [4] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.2; xy[1]=-50.; xy[2]=.2; xy[3] =400.; + ((TVirtualPad*)l->At(0))->cd(); + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*4.); for(n=0; nAt(1))->cd(); + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*4.5); for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-.25; xy[1]=-50.; xy[2]=.25; xy[3] =800.; + xy[0]=-.2; xy[1]=-50.; xy[2]=.2; xy[3] =400.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTPC, 0)) break; - xy[0] = -.25; xy[1] = -0.5; xy[2] = .25; xy[3] = 2.5; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*5.); for(n=0; nAt(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTPC, 1)) break; + selStart=Int_t(fgkNresYsegm[fSegmentLevel]*5.5); for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-1.; xy[1]=-500.; xy[2]=1.; xy[3] =800.; + xy[0] = -.5; xy[1] = -0.5; xy[2] = fgkNresYsegm[fSegmentLevel]-.5; xy[3] = 5.5; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTPC, 2)) break; - xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5; + selStart=0; for(n=0; n<6; n++) selection[n]=selStart+n; + if(!GetGraphArray(xy, kMCtrack, 1, 1, n, selection)) break; ((TVirtualPad*)l->At(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTPC, 3)) break; + selStart=6; for(n=0; n<6; n++) selection[n]=selStart+n; + if(!GetGraphArray(xy, kMCtrack, 1, 1, n, selection)) break; return kTRUE; - case 21: // kMCtrackTPC [phi|snp] + case 28: //kMCtrack [z] gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-.25; xy[1]=-0.5; xy[2]=.25; xy[3] =2.5; + xy[0]=-1.; xy[1]=-1500.; xy[2]=1.; xy[3] =6000.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTPC, 4)) break; - xy[0] = -.25; xy[1] = -0.5; xy[2] = .25; xy[3] = 1.5; + if(!GetGraphArray(xy, kMCtrack, 2)) break; + xy[0] = -1.; xy[1] = -1.5; xy[2] = 1.; xy[3] = 5.; ((TVirtualPad*)l->At(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTPC, 5)) break; + if(!GetGraphArray(xy, kMCtrack, 3)) break; return kTRUE; - case 22: // kMCtrackTPC [theta|tgl] + case 29: //kMCtrack [phi/snp] gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0]=-1.; xy[1]=-1.; xy[2]=1.; xy[3] =4.; + xy[0]=-.2; xy[1]=-0.5; xy[2]=.2; xy[3] =10.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTPC, 6)) break; - xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 1.5; + if(!GetGraphArray(xy, kMCtrack, 4)) break; + xy[0] = -.2; xy[1] = -1.5; xy[2] = .2; xy[3] = 5.; ((TVirtualPad*)l->At(1))->cd(); - if(!GetGraphPlot(&xy[0], kMCtrackTPC, 7)) break; + if(!GetGraphArray(xy, kMCtrack, 5)) break; return kTRUE; - case 23: // kMCtrackTPC [pt] + case 30: //kMCtrack [theta/tgl] gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0] = 0.; xy[1] = -.8; xy[2] = 12.; xy[3] = 2.3; + xy[0]=-1.; xy[1]=-0.5; xy[2]=1.; xy[3] =5.; ((TVirtualPad*)l->At(0))->cd(); - if(!GetGraphTrackTPC(xy, 8)) break; - xy[0]=0.; xy[1]=-0.5; xy[2]=2.; xy[3] =2.5; + if(!GetGraphArray(xy, kMCtrack, 6)) break; + xy[0] = -.2; xy[1] = -0.5; xy[2] = .2; xy[3] = 2.5; ((TVirtualPad*)l->At(1))->cd(); - if(!GetGraphTrackTPC(xy, 9)) break; + if(!GetGraphArray(xy, kMCtrack, 7)) break; return kTRUE; - case 24: // kMCtrackTPC [p] + case 31: //kMCtrack [pt] gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); - xy[0] = 0.; xy[1] = -.8; xy[2] = 12.; xy[3] = 2.3; - pad = ((TVirtualPad*)l->At(0));pad->cd(); - pad->SetMargin(0.12, 0.12, 0.1, 0.04); - if(!GetGraphTrackTPC(xy, 10)) break; - xy[0]=0.; xy[1]=-1.5; xy[2]=12.; xy[3] =2.5; - pad = ((TVirtualPad*)l->At(1)); pad->cd(); - pad->SetMargin(0.12, 0.12, 0.1, 0.04); - if(!GetGraphTrackTPC(xy, 11)) break; + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // pi selection + n=0; + for(Int_t il(ly0); ilModified(); pad->Update(); pad->SetLogx(); + pad = (TVirtualPad*)l->At(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // mu selection + n=0; + for(Int_t il(ly0); ilModified(); pad->Update(); pad->SetLogx(); return kTRUE; - case 25: // kMCtrackTOF [z] + case 32: //kMCtrack [pt] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // p selection + n=0; + for(Int_t il(ly0); ilModified(); pad->Update(); pad->SetLogx(); + pad = (TVirtualPad*)l->At(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // e selection + n=0; + for(Int_t il(ly0); ilModified(); pad->Update(); pad->SetLogx(); return kTRUE; - } - AliWarning(Form("Reference plot [%d] missing result", ifig)); - return kFALSE; -} - - -//________________________________________________________ -Bool_t AliTRDresolution::PostProcess() -{ - //fContainer = dynamic_cast(GetOutputData(0)); - if (!fContainer) { + case 33: //kMCtrack [1/pt] pulls + xy[0] = 0.; xy[1] = -1.; xy[2] = 2.; xy[3] = 3.5; + //xy[0] = 0.; xy[1] = -1.; xy[2] = 2.; xy[3] = 4.5; // SA + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // pi selection + n=0; + for(Int_t il(ly0); ilAt(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // mu selection + n=0; + for(Int_t il(ly0); ilDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // p selection + n=0; + for(Int_t il(ly0); ilAt(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // e selection + n=0; + for(Int_t il(ly0); ilDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // pi selection + n=0; + for(Int_t il(ly0); ilModified(); pad->Update(); pad->SetLogx(); + pad = (TVirtualPad*)l->At(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // mu selection + n=0; + for(Int_t il(ly0); ilModified(); pad->Update(); pad->SetLogx(); + return kTRUE; + case 36: //kMCtrack [p] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // p selection + n=0; + for(Int_t il(ly0); ilModified(); pad->Update(); pad->SetLogx(); + pad = (TVirtualPad*)l->At(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + // e selection + n=0; + for(Int_t il(ly0); ilModified(); pad->Update(); pad->SetLogx(); + return kTRUE; + case 37: // kMCtrackIn [y] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.25; xy[1]=-1000.; xy[2]=.25; xy[3] =3000.; + ((TVirtualPad*)l->At(0))->cd(); + selStart=0; for(n=0; nAt(1))->cd(); + selStart=fgkNresYsegm[fSegmentLevel]/3; for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.25; xy[1]=-1000.; xy[2]=.25; xy[3] =3000.; + ((TVirtualPad*)l->At(0))->cd(); + selStart=2*fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(1))->cd(); + if(!GetGraphArray(xy, kMCtrackIn, 1, 1)) break; + return kTRUE; + case 39: // kMCtrackIn [z] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-1.; xy[1]=-500.; xy[2]=1.; xy[3] =800.; + ((TVirtualPad*)l->At(0))->cd(); + if(!GetGraphArray(xy, kMCtrackIn, 2, 1)) break; + xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5; + ((TVirtualPad*)l->At(1))->cd(); + if(!GetGraphArray(xy, kMCtrackIn, 3, 1)) break; + return kTRUE; + case 40: // kMCtrackIn [phi|snp] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.25; xy[1]=-0.5; xy[2]=.25; xy[3] =2.5; + ((TVirtualPad*)l->At(0))->cd(); + if(!GetGraph(&xy[0], kMCtrackIn, 4)) break; + xy[0] = -.25; xy[1] = -0.5; xy[2] = .25; xy[3] = 1.5; + ((TVirtualPad*)l->At(1))->cd(); + if(!GetGraph(&xy[0], kMCtrackIn, 5)) break; + return kTRUE; + case 41: // kMCtrackIn [theta|tgl] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-1.; xy[1]=-1.; xy[2]=1.; xy[3] =4.; + ((TVirtualPad*)l->At(0))->cd(); + if(!GetGraph(&xy[0], kMCtrackIn, 6)) break; + xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 1.5; + ((TVirtualPad*)l->At(1))->cd(); + if(!GetGraph(&xy[0], kMCtrackIn, 7)) break; + return kTRUE; + case 42: // kMCtrackIn [pt] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = 0.2; xy[1] = -.8; xy[2] = 7.; xy[3] = 6.; + //xy[0] = 0.2; xy[1] = -1.5; xy[2] = 7.; xy[3] = 10.; // SA + pad=(TVirtualPad*)l->At(0); pad->cd(); pad->SetLogx(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=2; selection[n++]=3; selection[n++]=7; selection[n++]=8; + if(!GetGraphArray(xy, kMCtrackIn, 8, 1, n, selection)) break; + pad = (TVirtualPad*)l->At(1); pad->cd(); pad->SetLogx(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=0; selection[n++]=4; selection[n++]=6; selection[n++]=10; + if(!GetGraphArray(xy, kMCtrackIn, 8, 1, n, selection)) break; + return kTRUE; + case 43: //kMCtrackIn [1/pt] pulls + xy[0] = 0.; xy[1] = -1.; xy[2] = 2.; xy[3] = 3.5; + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=2; selection[n++]=3; selection[n++]=7; selection[n++]=8; + if(!GetGraphArray(xy, kMCtrackIn, 9, 1, n, selection)) break; + pad = (TVirtualPad*)l->At(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=0; selection[n++]=4; selection[n++]=6; selection[n++]=10; + if(!GetGraphArray(xy, kMCtrackIn, 9, 1, n, selection)) break; + return kTRUE; + case 44: // kMCtrackIn [p] + xy[0] = 0.2; xy[1] = -.8; xy[2] = 7.; xy[3] = 6.; + //xy[0] = 0.2; xy[1] = -1.5; xy[2] = 7.; xy[3] = 10.; + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + pad = ((TVirtualPad*)l->At(0));pad->cd();pad->SetLogx(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=2; selection[n++]=3; selection[n++]=7; selection[n++]=8; + if(!GetGraphArray(xy, kMCtrackIn, 10, 1, n, selection)) break; + pad = ((TVirtualPad*)l->At(1)); pad->cd();pad->SetLogx(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=0; selection[n++]=4; selection[n++]=6; selection[n++]=10; + if(!GetGraphArray(xy, kMCtrackIn, 10, 1, n, selection)) break; + return kTRUE; + case 45: // kMCtrackOut [y] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.3; xy[1]=-50.; xy[2]=.3; xy[3] =400.; + ((TVirtualPad*)l->At(0))->cd(); + selStart=0; for(n=0; nAt(1))->cd(); + selStart=fgkNresYsegm[fSegmentLevel]/3; for(n=0; nDivide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.3; xy[1]=-50.; xy[2]=.3; xy[3] =400.; + ((TVirtualPad*)l->At(0))->cd(); + selStart=2*fgkNresYsegm[fSegmentLevel]/3; for(n=0; nAt(1))->cd(); + if(!GetGraphArray(xy, kMCtrackOut, 1, 1)) break; + return kTRUE; + case 47: // kMCtrackOut [z] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-1.; xy[1]=-500.; xy[2]=1.; xy[3] =1500.; + ((TVirtualPad*)l->At(0))->cd(); + if(!GetGraphArray(xy, kMCtrackOut, 2, 1)) break; + xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5; + ((TVirtualPad*)l->At(1))->cd(); + if(!GetGraphArray(xy, kMCtrackOut, 3, 1)) break; + return kTRUE; + case 48: // kMCtrackOut [phi|snp] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-.25; xy[1]=-0.5; xy[2]=.25; xy[3] =2.5; + ((TVirtualPad*)l->At(0))->cd(); + if(!GetGraph(&xy[0], kMCtrackOut, 4)) break; + xy[0] = -.25; xy[1] = -0.5; xy[2] = .25; xy[3] = 1.5; + ((TVirtualPad*)l->At(1))->cd(); + if(!GetGraph(&xy[0], kMCtrackOut, 5)) break; + return kTRUE; + case 49: // kMCtrackOut [theta|tgl] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0]=-1.; xy[1]=-1.; xy[2]=1.; xy[3] =4.; + ((TVirtualPad*)l->At(0))->cd(); + if(!GetGraph(&xy[0], kMCtrackOut, 6)) break; + xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 15.; + ((TVirtualPad*)l->At(1))->cd(); + if(!GetGraph(&xy[0], kMCtrackOut, 7)) break; + return kTRUE; + case 50: // kMCtrackOut [pt] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = 0.2; xy[1] = -.8; xy[2] = 7.; xy[3] = 6.; + pad=(TVirtualPad*)l->At(0); pad->cd(); pad->SetLogx(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=2; selection[n++]=3; selection[n++]=7; selection[n++]=8; + if(!GetGraphArray(xy, kMCtrackOut, 8, 1, n, selection)) break; + pad = (TVirtualPad*)l->At(1); pad->cd();pad->SetLogx(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=0; selection[n++]=4; selection[n++]=6; selection[n++]=10; + if(!GetGraphArray(xy, kMCtrackOut, 8, 1, n, selection)) break; + return kTRUE; + case 51: //kMCtrackOut [1/pt] pulls + xy[0] = 0.; xy[1] = -1.; xy[2] = 2.; xy[3] = 3.5; + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + pad = (TVirtualPad*)l->At(0); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=2; selection[n++]=3; selection[n++]=7; selection[n++]=8; + if(!GetGraphArray(xy, kMCtrackOut, 9, 1, n, selection)) break; + pad = (TVirtualPad*)l->At(1); pad->cd(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=0; selection[n++]=4; selection[n++]=6; selection[n++]=10; + if(!GetGraphArray(xy, kMCtrackOut, 9, 1, n, selection)) break; + return kTRUE; + case 52: // kMCtrackOut [p] + gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); + xy[0] = 0.2; xy[1] = -.8; xy[2] = 7.; xy[3] = 6.; + pad = ((TVirtualPad*)l->At(0));pad->cd();pad->SetLogx(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=2; selection[n++]=3; selection[n++]=7; selection[n++]=8; + if(!GetGraphArray(xy, kMCtrackOut, 10, 1, n, selection)) break; + pad = ((TVirtualPad*)l->At(1)); pad->cd();pad->SetLogx(); + pad->SetMargin(0.125, 0.015, 0.1, 0.015); + n=0; selection[n++]=0; selection[n++]=4; selection[n++]=6; selection[n++]=10; + if(!GetGraphArray(xy, kMCtrackOut, 10, 1, n, selection)) break; + return kTRUE; + } + AliWarning(Form("Reference plot [%d] missing result", ifig)); + return kFALSE; +} + +Char_t const *fgParticle[11]={ + " p bar", " K -", " #pi -", " #mu -", " e -", + " No PID", + " e +", " #mu +", " #pi +", " K +", " p", +}; +const Color_t fgColorS[11]={ +kOrange, kOrange-3, kMagenta+1, kViolet, kRed, +kGray, +kRed, kViolet, kMagenta+1, kOrange-3, kOrange +}; +const Color_t fgColorM[11]={ +kCyan-5, kAzure-4, kBlue-7, kBlue+2, kViolet+10, +kBlack, +kViolet+10, kBlue+2, kBlue-7, kAzure-4, kCyan-5 +}; +const Marker_t fgMarker[11]={ +30, 30, 26, 25, 24, +28, +20, 21, 22, 29, 29 +}; +//________________________________________________________ +Bool_t AliTRDresolution::PostProcess() +{ + //fContainer = dynamic_cast(GetOutputData(0)); + if (!fContainer) { AliError("ERROR: list not available"); return kFALSE; } - TGraph *gm= 0x0, *gs= 0x0; + TGraph *gm= NULL, *gs= NULL; if(!fGraphS && !fGraphM){ - TObjArray *aM(0x0), *aS(0x0), *a(0x0); + TObjArray *aM(NULL), *aS(NULL); Int_t n = fContainer->GetEntriesFast(); fGraphS = new TObjArray(n); fGraphS->SetOwner(); fGraphM = new TObjArray(n); fGraphM->SetOwner(); - for(Int_t ig=0; igAddAt(aM = new TObjArray(fgNElements[ig]), ig); - fGraphS->AddAt(aS = new TObjArray(fgNElements[ig]), ig); - - for(Int_t ic=0; ic=8&&ic<=12)){ // TPC momentum plot - aS->AddAt(a = new TObjArray(AliPID::kSPECIES), ic); - for(Int_t is=AliPID::kSPECIES; is--;){ - a->AddAt(gs = new TGraphErrors(), is); - gs->SetMarkerStyle(23); - gs->SetMarkerColor(is ? kRed : kMagenta); - gs->SetLineStyle(is); - gs->SetLineColor(is ? kRed : kMagenta); - gs->SetLineWidth(is ? 1 : 3); - gs->SetNameTitle(Form("s_%d%02d%d", ig, ic, is), ""); - } - aM->AddAt(a = new TObjArray(AliPID::kSPECIES), ic); - for(Int_t is=AliPID::kSPECIES; is--;){ - a->AddAt(gm = new TGraphErrors(), is); - gm->SetLineColor(is ? kBlack : kBlue); - gm->SetLineStyle(is); - gm->SetMarkerStyle(7); - gm->SetMarkerColor(is ? kBlack : kBlue); - gm->SetLineWidth(is ? 1 : 3); - gm->SetNameTitle(Form("m_%d%02d%d", ig, ic, is), ""); - } - continue; - } else if(ig==kMCtrackTRD&&(ic==8||ic==9||ic==10)){ // TRD momentum plot - TObjArray *aaS, *aaM; - aS->AddAt(aaS = new TObjArray(AliTRDgeometry::kNlayer), ic); - aM->AddAt(aaM = new TObjArray(AliTRDgeometry::kNlayer), ic); - for(Int_t il=AliTRDgeometry::kNlayer; il--;){ - aaS->AddAt(a = new TObjArray(AliPID::kSPECIES), il); - for(Int_t is=AliPID::kSPECIES; is--;){ - a->AddAt(gs = new TGraphErrors(), is); - gs->SetMarkerStyle(23); - gs->SetMarkerColor(is ? kRed : kMagenta); - gs->SetLineStyle(is); - gs->SetLineColor(is ? kRed : kMagenta); - gs->SetLineWidth(is ? 1 : 3); - gs->SetNameTitle(Form("s_%d%02d%d%d", ig, ic, is, il), ""); - } - aaM->AddAt(a = new TObjArray(AliPID::kSPECIES), il); - for(Int_t is=AliPID::kSPECIES; is--;){ - a->AddAt(gm = new TGraphErrors(), is); - gm->SetMarkerStyle(7); - gm->SetMarkerColor(is ? kBlack : kBlue); - gm->SetLineStyle(is); - gm->SetLineColor(is ? kBlack : kBlue); - gm->SetLineWidth(is ? 1 : 3); - gm->SetNameTitle(Form("m_%d%02d%d%d", ig, ic, is, il), ""); + for(Int_t ig(0), nc(0); igAddAt(aM = new TObjArray(fgNproj[ig]), ig); + fGraphS->AddAt(aS = new TObjArray(fgNproj[ig]), ig); + + for(Int_t ic=0; ic1){ + TObjArray *agS(NULL), *agM(NULL); + aS->AddAt(agS = new TObjArray(fNcomp[nc]), ic); + aM->AddAt(agM = new TObjArray(fNcomp[nc]), ic); + for(Int_t is=fNcomp[nc]; is--;){ + agS->AddAt(gs = new TGraphErrors(), is); + Int_t is0(is%11), il0(is/11); + gs->SetMarkerStyle(fgMarker[is0]); + gs->SetMarkerColor(fgColorS[is0]); + gs->SetLineColor(fgColorS[is0]); + gs->SetLineStyle(il0);gs->SetLineWidth(2); + gs->SetName(Form("s_%d_%02d_%02d", ig, ic, is)); + + agM->AddAt(gm = new TGraphErrors(), is); + gm->SetMarkerStyle(fgMarker[is0]); + gm->SetMarkerColor(fgColorM[is0]); + gm->SetLineColor(fgColorM[is0]); + gm->SetLineStyle(il0);gm->SetLineWidth(2); + gm->SetName(Form("m_%d_%02d_%02d", ig, ic, is)); + // this is important for labels in the legend + if(ic==0) { + gs->SetTitle(Form("%s %02d", fgkResYsegmName[fSegmentLevel], is%fgkNresYsegm[fSegmentLevel])); + gm->SetTitle(Form("%s %02d", fgkResYsegmName[fSegmentLevel], is%fgkNresYsegm[fSegmentLevel])); + } else if(ic==1) { + gs->SetTitle(Form("%s Ly[%d]", is%2 ?"z":"y", is/2)); + gm->SetTitle(Form("%s Ly[%d]", is%2?"z":"y", is/2)); + } else if(ic==2||ic==3) { + gs->SetTitle(Form("%s Ly[%d]", is%2 ?"RC":"no RC", is/2)); + gm->SetTitle(Form("%s Ly[%d]", is%2?"RC":"no RC", is/2)); + } else if(ic<=7) { + gs->SetTitle(Form("Layer[%d]", is%AliTRDgeometry::kNlayer)); + gm->SetTitle(Form("Layer[%d]", is%AliTRDgeometry::kNlayer)); + } else { + gs->SetTitle(Form("%s @ ly[%d]", fgParticle[is0], il0)); + gm->SetTitle(Form("%s @ ly[%d]", fgParticle[is0], il0)); } - } - continue; + } + } else { + aS->AddAt(gs = new TGraphErrors(), ic); + gs->SetMarkerStyle(23); + gs->SetMarkerColor(kRed); + gs->SetLineColor(kRed); + gs->SetNameTitle(Form("s_%d_%02d", ig, ic), "sigma"); + + aM->AddAt(gm = ig ? (TGraph*)new TGraphErrors() : (TGraph*)new TGraphAsymmErrors(), ic); + gm->SetLineColor(kBlack); + gm->SetMarkerStyle(7); + gm->SetMarkerColor(kBlack); + gm->SetNameTitle(Form("m_%d_%02d", ig, ic), "mean"); } - - aS->AddAt(gs = new TGraphErrors(), ic); - gs->SetMarkerStyle(23); - gs->SetMarkerColor(kRed); - gs->SetLineColor(kRed); - gs->SetNameTitle(Form("s_%d%02d", ig, ic), ""); - - aM->AddAt(gm = ig ? (TGraph*)new TGraphErrors() : (TGraph*)new TGraphAsymmErrors(), ic); - gm->SetLineColor(kBlack); - gm->SetMarkerStyle(7); - gm->SetMarkerColor(kBlack); - gm->SetNameTitle(Form("m_%d%02d", ig, ic), ""); } } } @@ -1121,29 +1847,38 @@ Bool_t AliTRDresolution::PostProcess() // simple gauss TF1 fg("fGauss", "gaus", -.5, .5); // Landau for charge resolution - TF1 fl("fLandau", "landau", 0., 1000.); + TF1 fch("fClCh", "landau", 0., 1000.); + // Landau for e+- pt resolution + TF1 fpt("fPt", "landau", -0.1, 0.2); //PROCESS EXPERIMENTAL DISTRIBUTIONS // Charge resolution //Process3DL(kCharge, 0, &fl); // Clusters residuals - Process2D(kCluster, 0, &fg, 1.e4); - Process2D(kCluster, 1, &fg); - fNRefFigures = 1; + Process3D(kCluster, 0, &fg, 1.e4); + Process3Dlinked(kCluster, 1, &fg); + fNRefFigures = 3; // Tracklet residual/pulls - Process2D(kTrackTRD , 0, &fg, 1.e4); - Process2D(kTrackTRD , 1, &fg); - Process2D(kTrackTRD , 2, &fg, 1.e4); - Process2D(kTrackTRD , 3, &fg); - Process2D(kTrackTRD , 4, &fg, 1.e3); - fNRefFigures = 4; - // TPC track residual/pulls - Process2D(kTrackTPC, 0, &fg, 1.e4); - Process2D(kTrackTPC, 1, &fg); - Process2D(kTrackTPC, 2, &fg, 1.e4); - Process2D(kTrackTPC, 3, &fg); - Process2D(kTrackTPC, 4, &fg, 1.e3); + Process3D(kTrack , 0, &fg, 1.e4); + Process3Dlinked(kTrack , 1, &fg); + Process3D(kTrack , 2, &fg, 1.e4); + Process3D(kTrack , 3, &fg); + Process2D(kTrack , 4, &fg, 1.e3); fNRefFigures = 7; + // TRDin residual/pulls + Process3D(kTrackIn, 0, &fg, 1.e4); + Process3Dlinked(kTrackIn, 1, &fg); + Process3D(kTrackIn, 2, &fg, 1.e4); + Process3D(kTrackIn, 3, &fg); + Process2D(kTrackIn, 4, &fg, 1.e3); + fNRefFigures = 11; + // TRDout residual/pulls + Process3D(kTrackOut, 0, &fg, 1.e3); // scale to fit - see PlotTrackOut + Process3Dlinked(kTrackOut, 1, &fg); + Process3D(kTrackOut, 2, &fg, 1.e4); + Process3D(kTrackOut, 3, &fg); + Process2D(kTrackOut, 4, &fg, 1.e3); + fNRefFigures = 15; if(!HasMCdata()) return kTRUE; @@ -1151,51 +1886,59 @@ Bool_t AliTRDresolution::PostProcess() //PROCESS MC RESIDUAL DISTRIBUTIONS // CLUSTER Y RESOLUTION/PULLS - Process2D(kMCcluster, 0, &fg, 1.e4); - Process2D(kMCcluster, 1, &fg); - fNRefFigures = 8; + Process3D(kMCcluster, 0, &fg, 1.e4); + Process3Dlinked(kMCcluster, 1, &fg, 1.); + fNRefFigures = 17; // TRACKLET RESOLUTION/PULLS - Process2D(kMCtracklet, 0, &fg, 1.e4); // y - Process2D(kMCtracklet, 1, &fg); // y pulls - Process2D(kMCtracklet, 2, &fg, 1.e4); // z - Process2D(kMCtracklet, 3, &fg); // z pulls + Process3D(kMCtracklet, 0, &fg, 1.e4); // y + Process3Dlinked(kMCtracklet, 1, &fg, 1.); // y pulls + Process3D(kMCtracklet, 2, &fg, 1.e4); // z + Process3D(kMCtracklet, 3, &fg, 1.); // z pulls Process2D(kMCtracklet, 4, &fg, 1.e3); // phi - fNRefFigures = 11; + fNRefFigures = 21; // TRACK RESOLUTION/PULLS - Process2D(kMCtrackTRD, 0, &fg, 1.e4); // y - Process2D(kMCtrackTRD, 1, &fg); // y PULL - Process2D(kMCtrackTRD, 2, &fg, 1.e4); // z - Process2D(kMCtrackTRD, 3, &fg); // z PULL - Process2D(kMCtrackTRD, 4, &fg, 1.e3); // phi - Process2D(kMCtrackTRD, 5, &fg); // snp PULL - Process2D(kMCtrackTRD, 6, &fg, 1.e3); // theta - Process2D(kMCtrackTRD, 7, &fg); // tgl PULL - Process4D(kMCtrackTRD, 8, &fg, 1.e2); // pt resolution - Process4D(kMCtrackTRD, 9, &fg); // 1/pt pulls - Process4D(kMCtrackTRD, 10, &fg, 1.e2); // p resolution - fNRefFigures = 18; - - // TRACK TPC RESOLUTION/PULLS - Process2D(kMCtrackTPC, 0, &fg, 1.e4);// y resolution - Process2D(kMCtrackTPC, 1, &fg); // y pulls - Process2D(kMCtrackTPC, 2, &fg, 1.e4);// z resolution - Process2D(kMCtrackTPC, 3, &fg); // z pulls - Process2D(kMCtrackTPC, 4, &fg, 1.e3);// phi resolution - Process2D(kMCtrackTPC, 5, &fg); // snp pulls - Process2D(kMCtrackTPC, 6, &fg, 1.e3);// theta resolution - Process2D(kMCtrackTPC, 7, &fg); // tgl pulls - Process3D(kMCtrackTPC, 8, &fg, 1.e2);// pt resolution - Process3D(kMCtrackTPC, 9, &fg); // 1/pt pulls - Process3D(kMCtrackTPC, 10, &fg, 1.e2);// p resolution - Process3D(kMCtrackTPC, 11, &fg); // p pulls - fNRefFigures = 24; - - // TRACK HMPID RESOLUTION/PULLS - Process2D(kMCtrackTOF, 0, &fg, 1.e4); // z towards TOF - Process2D(kMCtrackTOF, 1, &fg); // z towards TOF - fNRefFigures = 25; + Process3Darray(kMCtrack, 0, &fg, 1.e4); // y + Process3DlinkedArray(kMCtrack, 1, &fg); // y PULL + Process3Darray(kMCtrack, 2, &fg, 1.e4); // z + Process3Darray(kMCtrack, 3, &fg); // z PULL + Process2Darray(kMCtrack, 4, &fg, 1.e3); // phi + Process2Darray(kMCtrack, 5, &fg); // snp PULL + Process2Darray(kMCtrack, 6, &fg, 1.e3); // theta + Process2Darray(kMCtrack, 7, &fg); // tgl PULL + Process3Darray(kMCtrack, 8, &fg, 1.e2); // pt resolution + Process3Darray(kMCtrack, 9, &fg); // 1/pt pulls + Process3Darray(kMCtrack, 10, &fg, 1.e2); // p resolution + fNRefFigures+=16; + + // TRACK TRDin RESOLUTION/PULLS + Process3D(kMCtrackIn, 0, &fg, 1.e4);// y resolution + Process3Dlinked(kMCtrackIn, 1, &fg); // y pulls + Process3D(kMCtrackIn, 2, &fg, 1.e4);// z resolution + Process3D(kMCtrackIn, 3, &fg); // z pulls + Process2D(kMCtrackIn, 4, &fg, 1.e3);// phi resolution + Process2D(kMCtrackIn, 5, &fg); // snp pulls + Process2D(kMCtrackIn, 6, &fg, 1.e3);// theta resolution + Process2D(kMCtrackIn, 7, &fg); // tgl pulls + Process3D(kMCtrackIn, 8, &fg, 1.e2);// pt resolution + Process3D(kMCtrackIn, 9, &fg); // 1/pt pulls + Process3D(kMCtrackIn, 10, &fg, 1.e2);// p resolution + fNRefFigures+=8; + + // TRACK TRDout RESOLUTION/PULLS + Process3D(kMCtrackOut, 0, &fg, 1.e4);// y resolution + Process3Dlinked(kMCtrackOut, 1, &fg); // y pulls + Process3D(kMCtrackOut, 2, &fg, 1.e4);// z resolution + Process3D(kMCtrackOut, 3, &fg); // z pulls + Process2D(kMCtrackOut, 4, &fg, 1.e3);// phi resolution + Process2D(kMCtrackOut, 5, &fg); // snp pulls + Process2D(kMCtrackOut, 6, &fg, 1.e3);// theta resolution + Process2D(kMCtrackOut, 7, &fg); // tgl pulls + Process3D(kMCtrackOut, 8, &fg, 1.e2);// pt resolution + Process3D(kMCtrackOut, 9, &fg); // 1/pt pulls + Process3D(kMCtrackOut, 10, &fg, 1.e2);// p resolution + fNRefFigures+=8; return kTRUE; } @@ -1238,6 +1981,156 @@ void AliTRDresolution::AdjustF1(TH1 *h, TF1 *f) f->SetParameter(5, 2.e-1); } +//________________________________________________________ +TObjArray* AliTRDresolution::BuildMonitorContainerCluster(const char* name, Bool_t expand) +{ +// Build performance histograms for AliTRDcluster.vs TRD track or MC +// - y reziduals/pulls + + TObjArray *arr = new TObjArray(2); + arr->SetName(name); arr->SetOwner(); + TH1 *h(NULL); char hname[100], htitle[300]; + + // tracklet resolution/pull in y direction + sprintf(hname, "%s_%s_Y", GetNameId(), name); + sprintf(htitle, "Y res for \"%s\" @ %s;tg(#phi);#Delta y [cm];%s", GetNameId(), name, fgkResYsegmName[fSegmentLevel]); + if(!(h = (TH3S*)gROOT->FindObject(hname))){ + Int_t nybins=fgkNresYsegm[fSegmentLevel]; + if(expand) nybins*=2; + h = new TH3S(hname, htitle, + 48, -.48, .48, 60, -.15, .15, nybins, -0.5, nybins-0.5); + } else h->Reset(); + arr->AddAt(h, 0); + sprintf(hname, "%s_%s_YZpull", GetNameId(), name); + sprintf(htitle, "YZ pull for \"%s\" @ %s;%s;#Delta y / #sigma_{y};#Delta z / #sigma_{z}", GetNameId(), name, fgkResYsegmName[fSegmentLevel]); + if(!(h = (TH3S*)gROOT->FindObject(hname))){ + h = new TH3S(hname, htitle, fgkNresYsegm[fSegmentLevel], -0.5, fgkNresYsegm[fSegmentLevel]-0.5, 100, -4.5, 4.5, 100, -4.5, 4.5); + } else h->Reset(); + arr->AddAt(h, 1); + + return arr; +} + +//________________________________________________________ +TObjArray* AliTRDresolution::BuildMonitorContainerTracklet(const char* name, Bool_t expand) +{ +// Build performance histograms for AliExternalTrackParam.vs TRD tracklet +// - y reziduals/pulls +// - z reziduals/pulls +// - phi reziduals + TObjArray *arr = BuildMonitorContainerCluster(name, expand); + arr->Expand(5); + TH1 *h(NULL); char hname[100], htitle[300]; + + // tracklet resolution/pull in z direction + sprintf(hname, "%s_%s_Z", GetNameId(), name); + sprintf(htitle, "Z res for \"%s\" @ %s;tg(#theta);#Delta z [cm];row cross", GetNameId(), name); + if(!(h = (TH3S*)gROOT->FindObject(hname))){ + h = new TH3S(hname, htitle, 50, -1., 1., 100, -1.5, 1.5, 2, -0.5, 1.5); + } else h->Reset(); + arr->AddAt(h, 2); + sprintf(hname, "%s_%s_Zpull", GetNameId(), name); + sprintf(htitle, "Z pull for \"%s\" @ %s;tg(#theta);#Delta z / #sigma_{z};row cross", GetNameId(), name); + if(!(h = (TH3S*)gROOT->FindObject(hname))){ + h = new TH3S(hname, htitle, 50, -1., 1., 100, -5.5, 5.5, 2, -0.5, 1.5); + h->GetZaxis()->SetBinLabel(1, "no RC"); + h->GetZaxis()->SetBinLabel(2, "RC"); + } else h->Reset(); + arr->AddAt(h, 3); + + // tracklet to track phi resolution + sprintf(hname, "%s_%s_PHI", GetNameId(), name); + sprintf(htitle, "#Phi res for \"%s\" @ %s;tg(#phi);#Delta #phi [rad];entries", GetNameId(), name); + if(!(h = (TH2I*)gROOT->FindObject(hname))){ + h = new TH2I(hname, htitle, 21, -.33, .33, 100, -.5, .5); + } else h->Reset(); + arr->AddAt(h, 4); + + return arr; +} + +//________________________________________________________ +TObjArray* AliTRDresolution::BuildMonitorContainerTrack(const char* name) +{ +// Build performance histograms for AliExternalTrackParam.vs MC +// - y resolution/pulls +// - z resolution/pulls +// - phi resolution, snp pulls +// - theta resolution, tgl pulls +// - pt resolution, 1/pt pulls, p resolution + + TObjArray *arr = BuildMonitorContainerTracklet(name); + arr->Expand(11); + TH1 *h(NULL); char hname[100], htitle[300]; + TAxis *ax(NULL); + + // snp pulls + sprintf(hname, "%s_%s_SNPpull", GetNameId(), name); + sprintf(htitle, "SNP pull for \"%s\" @ %s;tg(#phi);#Delta snp / #sigma_{snp};entries", GetNameId(), name); + if(!(h = (TH2I*)gROOT->FindObject(hname))){ + h = new TH2I(hname, htitle, 60, -.3, .3, 100, -4.5, 4.5); + } else h->Reset(); + arr->AddAt(h, 5); + + // theta resolution + sprintf(hname, "%s_%s_THT", GetNameId(), name); + sprintf(htitle, "#Theta res for \"%s\" @ %s;tg(#theta);#Delta #theta [rad];entries", GetNameId(), name); + if(!(h = (TH2I*)gROOT->FindObject(hname))){ + h = new TH2I(hname, htitle, 100, -1., 1., 100, -5e-3, 5e-3); + } else h->Reset(); + arr->AddAt(h, 6); + // tgl pulls + sprintf(hname, "%s_%s_TGLpull", GetNameId(), name); + sprintf(htitle, "TGL pull for \"%s\" @ %s;tg(#theta);#Delta tgl / #sigma_{tgl};entries", GetNameId(), name); + if(!(h = (TH2I*)gROOT->FindObject(hname))){ + h = new TH2I(hname, htitle, 100, -1., 1., 100, -4.5, 4.5); + } else h->Reset(); + arr->AddAt(h, 7); + + const Int_t kNpt(14); + const Int_t kNdpt(150); + const Int_t kNspc = 2*AliPID::kSPECIES+1; + Float_t Pt=0.1, DPt=-.1, Spc=-5.5; + Float_t binsPt[kNpt+1], binsSpc[kNspc+1], binsDPt[kNdpt+1]; + for(Int_t i=0;iFindObject(hname))){ + h = new TH3S(hname, htitle, + kNpt, binsPt, kNdpt, binsDPt, kNspc, binsSpc); + ax = h->GetZaxis(); + for(Int_t ib(1); ib<=ax->GetNbins(); ib++) ax->SetBinLabel(ib, fgParticle[ib-1]); + } else h->Reset(); + arr->AddAt(h, 8); + // 1/Pt pulls + sprintf(hname, "%s_%s_1Pt", GetNameId(), name); + sprintf(htitle, "1/P_{t} pull for \"%s\" @ %s;1/p_{t}^{MC} [c/GeV];#Delta(1/p_{t})/#sigma(1/p_{t});SPECIES", GetNameId(), name); + if(!(h = (TH3S*)gROOT->FindObject(hname))){ + h = new TH3S(hname, htitle, + kNpt, 0., 2., 100, -4., 4., kNspc, -5.5, 5.5); + ax = h->GetZaxis(); + for(Int_t ib(1); ib<=ax->GetNbins(); ib++) ax->SetBinLabel(ib, fgParticle[ib-1]); + } else h->Reset(); + arr->AddAt(h, 9); + // P resolution + sprintf(hname, "%s_%s_P", GetNameId(), name); + sprintf(htitle, "P res for \"%s\" @ %s;p [GeV/c];#Delta p/p^{MC};SPECIES", GetNameId(), name); + if(!(h = (TH3S*)gROOT->FindObject(hname))){ + h = new TH3S(hname, htitle, + kNpt, binsPt, kNdpt, binsDPt, kNspc, binsSpc); + ax = h->GetZaxis(); + for(Int_t ib(1); ib<=ax->GetNbins(); ib++) ax->SetBinLabel(ib, fgParticle[ib-1]); + } else h->Reset(); + arr->AddAt(h, 10); + + return arr; +} + + //________________________________________________________ TObjArray* AliTRDresolution::Histos() { @@ -1247,13 +2140,21 @@ TObjArray* AliTRDresolution::Histos() if(fContainer) return fContainer; - fContainer = new TObjArray(kNhistos); + fContainer = new TObjArray(kNviews); //fContainer->SetOwner(kTRUE); - TH1 *h = 0x0; - TObjArray *arr = 0x0; + TH1 *h(NULL); + TObjArray *arr(NULL); + + // binnings for plots containing momentum or pt + const Int_t kNpt(14), kNphi(48), kNdy(60); + Float_t Phi=-.48, Dy=-.3, Pt=0.1; + Float_t binsPhi[kNphi+1], binsDy[kNdy+1], binsPt[kNpt+1]; + for(Int_t i=0; iAddAt(arr = new TObjArray(fgNElements[kCharge]), kCharge); + fContainer->AddAt(arr = new TObjArray(2), kCharge); arr->SetName("Charge"); if(!(h = (TH3S*)gROOT->FindObject("hCharge"))){ h = new TH3S("hCharge", "Charge Resolution", 20, 1., 2., 24, 0., 3.6, 100, 0., 500.); @@ -1264,404 +2165,64 @@ TObjArray* AliTRDresolution::Histos() arr->AddAt(h, 0); // cluster to track residuals/pulls - fContainer->AddAt(arr = new TObjArray(fgNElements[kCluster]), kCluster); - arr->SetName("Cl"); - if(!(h = (TH2I*)gROOT->FindObject("hCl"))){ - h = new TH2I("hCl", "Cluster Residuals", 21, -.33, .33, 100, -.5, .5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 0); - if(!(h = (TH2I*)gROOT->FindObject("hClpull"))){ - h = new TH2I("hClpull", "Cluster Pulls", 21, -.33, .33, 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y/#sigma_{y}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 1); + fContainer->AddAt(BuildMonitorContainerCluster("Cl"), kCluster); + // tracklet to TRD track + fContainer->AddAt(BuildMonitorContainerTracklet("Trk", kTRUE), kTrack); + // tracklet to TRDin + fContainer->AddAt(BuildMonitorContainerTracklet("TrkIN", kTRUE), kTrackIn); + // tracklet to TRDout + fContainer->AddAt(BuildMonitorContainerTracklet("TrkOUT"), kTrackOut); - // tracklet to track residuals/pulls in y direction - fContainer->AddAt(arr = new TObjArray(fgNElements[kTrackTRD ]), kTrackTRD ); - arr->SetName("Trklt"); - if(!(h = (TH2I*)gROOT->FindObject("hTrkltY"))){ - h = new TH2I("hTrkltY", "Tracklet Y Residuals", 21, -.33, .33, 100, -.5, .5); - h->GetXaxis()->SetTitle("#tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 0); - if(!(h = (TH2I*)gROOT->FindObject("hTrkltYpull"))){ - h = new TH2I("hTrkltYpull", "Tracklet Y Pulls", 21, -.33, .33, 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("#tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y/#sigma_{y}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 1); - // tracklet to track residuals/pulls in z direction - if(!(h = (TH2I*)gROOT->FindObject("hTrkltZ"))){ - h = new TH2I("hTrkltZ", "Tracklet Z Residuals", 50, -1., 1., 100, -1.5, 1.5); - h->GetXaxis()->SetTitle("#tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 2); - if(!(h = (TH2I*)gROOT->FindObject("hTrkltZpull"))){ - h = new TH2I("hTrkltZpull", "Tracklet Z Pulls", 50, -1., 1., 100, -5.5, 5.5); - h->GetXaxis()->SetTitle("#tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z/#sigma_{z}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 3); - // tracklet to track phi residuals - if(!(h = (TH2I*)gROOT->FindObject("hTrkltPhi"))){ - h = new TH2I("hTrkltPhi", "Tracklet #phi Residuals", 21, -.33, .33, 100, -.5, .5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta phi [rad]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 4); + // Resolution histos + if(!HasMCdata()) return fContainer; - // tracklet to TPC track residuals/pulls in y direction - fContainer->AddAt(arr = new TObjArray(fgNElements[kTrackTPC]), kTrackTPC); - arr->SetName("TrkTPC"); - if(!(h = (TH2I*)gROOT->FindObject("hTrkTPCY"))){ - h = new TH2I("hTrkTPCY", "Track[TPC] Y Residuals", 21, -.33, .33, 100, -.5, .5); - h->GetXaxis()->SetTitle("#tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 0); - if(!(h = (TH2I*)gROOT->FindObject("hTrkTPCYpull"))){ - h = new TH2I("hTrkTPCYpull", "Track[TPC] Y Pulls", 21, -.33, .33, 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("#tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y/#sigma_{y}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 1); - // tracklet to TPC track residuals/pulls in z direction - if(!(h = (TH2I*)gROOT->FindObject("hTrkTPCZ"))){ - h = new TH2I("hTrkTPCZ", "Track[TPC] Z Residuals", 50, -1., 1., 100, -1.5, 1.5); - h->GetXaxis()->SetTitle("#tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 2); - if(!(h = (TH2I*)gROOT->FindObject("hTrkTPCZpull"))){ - h = new TH2I("hTrkTPCZpull", "Track[TPC] Z Pulls", 50, -1., 1., 100, -5.5, 5.5); - h->GetXaxis()->SetTitle("#tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z/#sigma_{z}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 3); - // tracklet to TPC track phi residuals - if(!(h = (TH2I*)gROOT->FindObject("hTrkTPCPhi"))){ - h = new TH2I("hTrkTPCPhi", "Track[TPC] #phi Residuals", 21, -.33, .33, 100, -.5, .5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta phi [rad]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 4); + // cluster resolution + fContainer->AddAt(BuildMonitorContainerCluster("MCcl"), kMCcluster); + // tracklet resolution + fContainer->AddAt(BuildMonitorContainerTracklet("MCtracklet"), kMCtracklet); - // Resolution histos - if(!HasMCdata()) return fContainer; + // track resolution + fContainer->AddAt(arr = new TObjArray(AliTRDgeometry::kNlayer), kMCtrack); + arr->SetName("MCtrk"); + for(Int_t il(0); ilAddAt(BuildMonitorContainerTrack(Form("MCtrk_Ly%d", il)), il); - // cluster y resolution [0] - fContainer->AddAt(arr = new TObjArray(fgNElements[kMCcluster]), kMCcluster); - arr->SetName("McCl"); - if(!(h = (TH2I*)gROOT->FindObject("hMcCl"))){ - h = new TH2I("hMcCl", "Cluster Resolution", 48, -.48, .48, 100, -.3, .3); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 0); - if(!(h = (TH2I*)gROOT->FindObject("hMcClPull"))){ - h = new TH2I("hMcClPull", "Cluster Pulls", 48, -.48, .48, 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Deltay/#sigma_{y}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 1); + // TRDin TRACK RESOLUTION + fContainer->AddAt(BuildMonitorContainerTrack("MCtrkIN"), kMCtrackIn); + // TRDout TRACK RESOLUTION + fContainer->AddAt(BuildMonitorContainerTrack("MCtrkOUT"), kMCtrackOut); - // TRACKLET RESOLUTION - fContainer->AddAt(arr = new TObjArray(fgNElements[kMCtracklet]), kMCtracklet); - arr->SetName("McTrklt"); - // tracklet y resolution - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkltY"))){ - h = new TH2I("hMcTrkltY", "Tracklet Resolution (Y)", 48, -.48, .48, 100, -.2, .2); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 0); - // tracklet y pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkltYPull"))){ - h = new TH2I("hMcTrkltYPull", "Tracklet Pulls (Y)", 48, -.48, .48, 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y / #sigma_{y}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 1); - // tracklet z resolution - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkltZ"))){ - h = new TH2I("hMcTrkltZ", "Tracklet Resolution (Z)", 100, -1., 1., 100, -1., 1.); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 2); - // tracklet z pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkltZPull"))){ - h = new TH2I("hMcTrkltZPull", "Tracklet Pulls (Z)", 100, -1., 1., 100, -3.5, 3.5); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z / #sigma_{z}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 3); - // tracklet phi resolution - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkltPhi"))){ - h = new TH2I("hMcTrkltPhi", "Tracklet Resolution (#Phi)", 48, -.48, .48, 100, -.15, .15); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta #phi [rad]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 4); + return fContainer; +} +//________________________________________________________ +Bool_t AliTRDresolution::Load(const Char_t *file, const Char_t *dir) +{ +// Custom load function. Used to guess the segmentation level of the data. - // KALMAN TRACK RESOLUTION - fContainer->AddAt(arr = new TObjArray(fgNElements[kMCtrackTRD]), kMCtrackTRD); - arr->SetName("McTrkTRD"); - // Kalman track y resolution - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkY"))){ - h = new TH2I("hMcTrkY", "Track Y Resolution", 48, -.48, .48, 100, -.2, .2); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 0); - // Kalman track y pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkYPull"))){ - h = new TH2I("hMcTrkYPull", "Track Y Pulls", 48, -.48, .48, 100, -4., 4.); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y / #sigma_{y}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 1); - // Kalman track Z - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkZ"))){ - h = new TH2I("hMcTrkZ", "Track Z Resolution", 100, -1., 1., 100, -1., 1.); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 2); - // Kalman track Z pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkZPull"))){ - h = new TH2I("hMcTrkZPull", "Track Z Pulls", 100, -1., 1., 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z / #sigma_{z}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 3); - // Kalman track SNP - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkSNP"))){ - h = new TH2I("hMcTrkSNP", "Track Phi Resolution", 60, -.3, .3, 100, -5e-3, 5e-3); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta #phi [rad]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 4); - // Kalman track SNP pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkSNPPull"))){ - h = new TH2I("hMcTrkSNPPull", "Track SNP Pulls", 60, -.3, .3, 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta(sin(#phi)) / #sigma_{sin(#phi)}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 5); - // Kalman track TGL - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTGL"))){ - h = new TH2I("hMcTrkTGL", "Track Theta Resolution", 100, -1., 1., 100, -5e-3, 5e-3); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta#theta [rad]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 6); - // Kalman track TGL pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTGLPull"))){ - h = new TH2I("hMcTrkTGLPull", "Track TGL Pulls", 100, -1., 1., 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta(tg(#theta)) / #sigma_{tg(#theta)}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 7); - // Kalman track Pt resolution - const Int_t n = AliPID::kSPECIES; - TObjArray *arr2 = 0x0; TH3S* h3=0x0; - arr->AddAt(arr2 = new TObjArray(AliTRDgeometry::kNlayer), 8); - arr2->SetName("Track Pt Resolution"); - for(Int_t il=0; ilFindObject(Form("hMcTrkPt%d", il)))){ - h3 = new TH3S(Form("hMcTrkPt%d", il), "Track Pt Resolution", 40, 0., 20., 150, -.1, .2, n, -.5, n-.5); - h3->GetXaxis()->SetTitle("p_{t} [GeV/c]"); - h3->GetYaxis()->SetTitle("#Delta p_{t}/p_{t}^{MC}"); - h3->GetZaxis()->SetTitle("SPECIES"); - } else h3->Reset(); - arr2->AddAt(h3, il); - } - // Kalman track Pt pulls - arr->AddAt(arr2 = new TObjArray(AliTRDgeometry::kNlayer), 9); - arr2->SetName("Track 1/Pt Pulls"); - for(Int_t il=0; ilFindObject(Form("hMcTrkPtPulls%d", il)))){ - h3 = new TH3S(Form("hMcTrkPtPulls%d", il), "Track 1/Pt Pulls", 40, 0., 2., 100, -4., 4., n, -.5, n-.5); - h3->GetXaxis()->SetTitle("1/p_{t}^{MC} [c/GeV]"); - h3->GetYaxis()->SetTitle("#Delta(1/p_{t})/#sigma(1/p_{t}) "); - h3->GetZaxis()->SetTitle("SPECIES"); - } else h3->Reset(); - arr2->AddAt(h3, il); - } - // Kalman track P resolution - arr->AddAt(arr2 = new TObjArray(AliTRDgeometry::kNlayer), 10); - arr2->SetName("Track P Resolution [PID]"); - for(Int_t il=0; ilFindObject(Form("hMcTrkP%d", il)))){ - h3 = new TH3S(Form("hMcTrkP%d", il), "Track P Resolution", 40, 0., 20., 150, -.15, .35, n, -.5, n-.5); - h3->GetXaxis()->SetTitle("p [GeV/c]"); - h3->GetYaxis()->SetTitle("#Delta p/p^{MC}"); - h3->GetZaxis()->SetTitle("SPECIES"); - } else h3->Reset(); - arr2->AddAt(h3, il); - } + if(!AliTRDrecoTask::Load(file, dir)) return kFALSE; - // TPC TRACK RESOLUTION - fContainer->AddAt(arr = new TObjArray(fgNElements[kMCtrackTPC]), kMCtrackTPC); - arr->SetName("McTrkTPC"); - // Kalman track Y - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTPCY"))){ - h = new TH2I("hMcTrkTPCY", "Track[TPC] Y Resolution", 60, -.3, .3, 100, -.5, .5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 0); - // Kalman track Y pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTPCYPull"))){ - h = new TH2I("hMcTrkTPCYPull", "Track[TPC] Y Pulls", 60, -.3, .3, 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta y / #sigma_{y}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 1); - // Kalman track Z - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTPCZ"))){ - h = new TH2I("hMcTrkTPCZ", "Track[TPC] Z Resolution", 100, -1., 1., 100, -1., 1.); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 2); - // Kalman track Z pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTPCZPull"))){ - h = new TH2I("hMcTrkTPCZPull", "Track[TPC] Z Pulls", 100, -1., 1., 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z / #sigma_{z}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 3); - // Kalman track SNP - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTPCSNP"))){ - h = new TH2I("hMcTrkTPCSNP", "Track[TPC] Phi Resolution", 60, -.3, .3, 100, -5e-3, 5e-3); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta #phi [rad]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 4); - // Kalman track SNP pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTPCSNPPull"))){ - h = new TH2I("hMcTrkTPCSNPPull", "Track[TPC] SNP Pulls", 60, -.3, .3, 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#phi)"); - h->GetYaxis()->SetTitle("#Delta(sin(#phi)) / #sigma_{sin(#phi)}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 5); - // Kalman track TGL - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTPCTGL"))){ - h = new TH2I("hMcTrkTPCTGL", "Track[TPC] Theta Resolution", 100, -1., 1., 100, -5e-3, 5e-3); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta#theta [rad]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 6); - // Kalman track TGL pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTPCTGLPull"))){ - h = new TH2I("hMcTrkTPCTGLPull", "Track[TPC] TGL Pulls", 100, -1., 1., 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta(tg(#theta)) / #sigma_{tg(#theta)}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 7); - // Kalman track Pt resolution - if(!(h3 = (TH3S*)gROOT->FindObject("hMcTrkTPCPt"))){ - h3 = new TH3S("hMcTrkTPCPt", "Track[TPC] Pt Resolution", 80, 0., 20., 150, -.1, .2, n, -.5, n-.5); - h3->GetXaxis()->SetTitle("p_{t} [GeV/c]"); - h3->GetYaxis()->SetTitle("#Delta p_{t}/p_{t}^{MC}"); - h3->GetZaxis()->SetTitle("SPECIES"); - } else h3->Reset(); - arr->AddAt(h3, 8); - // Kalman track Pt pulls - if(!(h3 = (TH3S*)gROOT->FindObject("hMcTrkTPCPtPulls"))){ - h3 = new TH3S("hMcTrkTPCPtPulls", "Track[TPC] 1/Pt Pulls", 80, 0., 2., 100, -4., 4., n, -.5, n-.5); - h3->GetXaxis()->SetTitle("1/p_{t}^{MC} [c/GeV]"); - h3->GetYaxis()->SetTitle("#Delta(1/p_{t})/#sigma(1/p_{t}) "); - h3->GetZaxis()->SetTitle("SPECIES"); - } else h3->Reset(); - arr->AddAt(h3, 9); - // Kalman track P resolution - if(!(h3 = (TH3S*)gROOT->FindObject("hMcTrkTPCP"))){ - h3 = new TH3S("hMcTrkTPCP", "Track[TPC] P Resolution", 80, 0., 20., 150, -.15, .35, n, -.5, n-.5); - h3->GetXaxis()->SetTitle("p [GeV/c]"); - h3->GetYaxis()->SetTitle("#Delta p/p^{MC}"); - h3->GetZaxis()->SetTitle("SPECIES"); - } else h3->Reset(); - arr->AddAt(h3, 10); - // Kalman track Pt pulls - if(!(h3 = (TH3S*)gROOT->FindObject("hMcTrkTPCPPulls"))){ - h3 = new TH3S("hMcTrkTPCPPulls", "Track[TPC] P Pulls", 80, 0., 20., 100, -5., 5., n, -.5, n-.5); - h3->GetXaxis()->SetTitle("p^{MC} [GeV/c]"); - h3->GetYaxis()->SetTitle("#Deltap/#sigma_{p}"); - h3->GetZaxis()->SetTitle("SPECIES"); - } else h3->Reset(); - arr->AddAt(h3, 11); - - - - // Kalman track Z resolution [TOF] - fContainer->AddAt(arr = new TObjArray(fgNElements[kMCtrackTOF]), kMCtrackTOF); - arr->SetName("McTrkTOF"); - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTOFZ"))){ - h = new TH2I("hMcTrkTOFZ", "Track[TOF] Z Resolution", 100, -1., 1., 100, -1., 1.); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z [cm]"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 0); - // Kalman track Z pulls - if(!(h = (TH2I*)gROOT->FindObject("hMcTrkTOFZPull"))){ - h = new TH2I("hMcTrkTOFZPull", "Track[TOF] Z Pulls", 100, -1., 1., 100, -4.5, 4.5); - h->GetXaxis()->SetTitle("tg(#theta)"); - h->GetYaxis()->SetTitle("#Delta z / #sigma_{z}"); - h->GetZaxis()->SetTitle("entries"); - } else h->Reset(); - arr->AddAt(h, 1); + // look for cluster residual plot - always available + TH3S* h3((TH3S*)((TObjArray*)fContainer->At(kClToTrk))->At(0)); + Int_t segmentation(h3->GetNbinsZ()/2); + if(segmentation==fgkNresYsegm[0]){ // default segmentation. Nothing to do + return kTRUE; + } else if(segmentation==fgkNresYsegm[1]){ // stack segmentation. + SetSegmentationLevel(1); + } else if(segmentation==fgkNresYsegm[2]){ // detector segmentation. + SetSegmentationLevel(2); + } else { + AliError(Form("Unknown segmentation [%d].", h3->GetNbinsZ())); + return kFALSE; + } - return fContainer; + AliDebug(2, Form("Segmentation set to level \"%s\"", fgkResYsegmName[fSegmentLevel])); + return kTRUE; } + //________________________________________________________ Bool_t AliTRDresolution::Process(TH2 * const h2, TF1 *f, Float_t k, TGraphErrors **g) { @@ -1669,25 +2230,34 @@ Bool_t AliTRDresolution::Process(TH2 * const h2, TF1 *f, Float_t k, TGraphErrors // Do the processing // - Char_t pn[10]; sprintf(pn, "p%02d", fIdxPlot); + Char_t pn[10]; sprintf(pn, "p%03d", fIdxPlot); Int_t n = 0; if((n=g[0]->GetN())) for(;n--;) g[0]->RemovePoint(n); if((n=g[1]->GetN())) for(;n--;) g[1]->RemovePoint(n); + if(Int_t(h2->GetEntries())){ + AliDebug(4, Form("%s: g[%s %s]", pn, g[0]->GetName(), g[0]->GetTitle())); + } else { + AliDebug(2, Form("%s: g[%s %s]: Missing entries.", pn, g[0]->GetName(), g[0]->GetTitle())); + fIdxPlot++; + return kTRUE; + } - for(Int_t ibin = 1; ibin <= h2->GetNbinsX(); ibin++){ - Double_t x = h2->GetXaxis()->GetBinCenter(ibin); - TH1D *h = h2->ProjectionY(pn, ibin, ibin); - if(h->GetEntries()<100) continue; - //AdjustF1(h, f); - + const Int_t kINTEGRAL=1; + for(Int_t ibin = 0; ibin < Int_t(h2->GetNbinsX()/kINTEGRAL); ibin++){ + Int_t abin(ibin*kINTEGRAL+1),bbin(abin+kINTEGRAL-1),mbin(abin+Int_t(kINTEGRAL/2)); + Double_t x = h2->GetXaxis()->GetBinCenter(mbin); + TH1D *h = h2->ProjectionY(pn, abin, bbin); + if((n=(Int_t)h->GetEntries())<100){ + AliDebug(4, Form(" x[%f] range[%d %d] stat[%d] low statistics !", x, abin, bbin, n)); + continue; + } h->Fit(f, "QN"); - Int_t ip = g[0]->GetN(); + AliDebug(4, Form(" x_%d[%f] range[%d %d] stat[%d] M[%f] Sgm[%f]", ip, x, abin, bbin, n, f->GetParameter(1), f->GetParameter(2))); g[0]->SetPoint(ip, x, k*f->GetParameter(1)); g[0]->SetPointError(ip, 0., k*f->GetParError(1)); g[1]->SetPoint(ip, x, k*f->GetParameter(2)); g[1]->SetPointError(ip, 0., k*f->GetParError(2)); - /* g[0]->SetPoint(ip, x, k*h->GetMean()); g[0]->SetPointError(ip, 0., k*h->GetMeanError()); @@ -1699,7 +2269,7 @@ Bool_t AliTRDresolution::Process(TH2 * const h2, TF1 *f, Float_t k, TGraphErrors } //________________________________________________________ -Bool_t AliTRDresolution::Process2D(ETRDresolutionPlot plot, Int_t idx, TF1 *f, Float_t k) +Bool_t AliTRDresolution::Process2D(ETRDresolutionPlot plot, Int_t idx, TF1 *f, Float_t k, Int_t gidx) { // // Do the processing @@ -1708,12 +2278,26 @@ Bool_t AliTRDresolution::Process2D(ETRDresolutionPlot plot, Int_t idx, TF1 *f, F if(!fContainer || !fGraphS || !fGraphM) return kFALSE; // retrive containers - TH2I *h2 = idx<0 ? (TH2I*)(fContainer->At(plot)) : (TH2I*)((TObjArray*)(fContainer->At(plot)))->At(idx); - if(!h2) return kFALSE; + TH2I *h2(NULL); + if(idx<0){ + if(!(h2= (TH2I*)(fContainer->At(plot)))) return kFALSE; + } else{ + TObjArray *a0(NULL); + if(!(a0=(TObjArray*)(fContainer->At(plot)))) return kFALSE; + if(!(h2=(TH2I*)a0->At(idx))) return kFALSE; + } + if(Int_t(h2->GetEntries())){ + AliDebug(2, Form("p[%d] idx[%d] : h[%s] %s", plot, idx, h2->GetName(), h2->GetTitle())); + } else { + AliDebug(2, Form("p[%d] idx[%d] : Missing entries.", plot, idx)); + return kFALSE; + } + TGraphErrors *g[2]; - if(!(g[0] = idx<0 ? (TGraphErrors*)fGraphM->At(plot) : (TGraphErrors*)((TObjArray*)(fGraphM->At(plot)))->At(idx))) return kFALSE; + if(gidx<0) gidx=idx; + if(!(g[0] = gidx<0 ? (TGraphErrors*)fGraphM->At(plot) : (TGraphErrors*)((TObjArray*)(fGraphM->At(plot)))->At(gidx))) return kFALSE; - if(!(g[1] = idx<0 ? (TGraphErrors*)fGraphS->At(plot) : (TGraphErrors*)((TObjArray*)(fGraphS->At(plot)))->At(idx))) return kFALSE; + if(!(g[1] = gidx<0 ? (TGraphErrors*)fGraphS->At(plot) : (TGraphErrors*)((TObjArray*)(fGraphS->At(plot)))->At(gidx))) return kFALSE; return Process(h2, f, k, g); } @@ -1728,8 +2312,20 @@ Bool_t AliTRDresolution::Process3D(ETRDresolutionPlot plot, Int_t idx, TF1 *f, F if(!fContainer || !fGraphS || !fGraphM) return kFALSE; // retrive containers - TH3S *h3 = idx<0 ? (TH3S*)(fContainer->At(plot)) : (TH3S*)((TObjArray*)(fContainer->At(plot)))->At(idx); - if(!h3) return kFALSE; + TH3S *h3(NULL); + if(idx<0){ + if(!(h3= (TH3S*)(fContainer->At(plot)))) return kFALSE; + } else{ + TObjArray *a0(NULL); + if(!(a0=(TObjArray*)(fContainer->At(plot)))) return kFALSE; + if(!(h3=(TH3S*)a0->At(idx))) return kFALSE; + } + if(Int_t(h3->GetEntries())){ + AliDebug(2, Form("p[%d] idx[%d] h[%s] %s", plot, idx, h3->GetName(), h3->GetTitle())); + } else { + AliDebug(2, Form("p[%d] idx[%d] : Missing entries.", plot, idx)); + return kFALSE; + } TObjArray *gm, *gs; if(!(gm = (TObjArray*)((TObjArray*)(fGraphM->At(plot)))->At(idx))) return kFALSE; @@ -1737,16 +2333,59 @@ Bool_t AliTRDresolution::Process3D(ETRDresolutionPlot plot, Int_t idx, TF1 *f, F TGraphErrors *g[2]; TAxis *az = h3->GetZaxis(); - for(Int_t iz=1; iz<=az->GetNbins(); iz++){ - if(!(g[0] = (TGraphErrors*)gm->At(iz-1))) return kFALSE; - if(!(g[1] = (TGraphErrors*)gs->At(iz-1))) return kFALSE; - az->SetRange(iz, iz); + for(Int_t iz(0); izGetEntriesFast(); iz++){ + if(!(g[0] = (TGraphErrors*)gm->At(iz))) return kFALSE; + if(!(g[1] = (TGraphErrors*)gs->At(iz))) return kFALSE; + az->SetRange(iz+1, iz+1); if(!Process((TH2*)h3->Project3D("yx"), f, k, g)) return kFALSE; } return kTRUE; } + +//________________________________________________________ +Bool_t AliTRDresolution::Process3Dlinked(ETRDresolutionPlot plot, Int_t idx, TF1 *f, Float_t k) +{ + // + // Do the processing + // + + if(!fContainer || !fGraphS || !fGraphM) return kFALSE; + + // retrive containers + TH3S *h3(NULL); + if(idx<0){ + if(!(h3= (TH3S*)(fContainer->At(plot)))) return kFALSE; + } else{ + TObjArray *a0(NULL); + if(!(a0=(TObjArray*)(fContainer->At(plot)))) return kFALSE; + if(!(h3=(TH3S*)a0->At(idx))) return kFALSE; + } + if(Int_t(h3->GetEntries())){ + AliDebug(2, Form("p[%d] idx[%d] h[%s] %s", plot, idx, h3->GetName(), h3->GetTitle())); + } else { + AliDebug(2, Form("p[%d] idx[%d] : Missing entries.", plot, idx)); + return kFALSE; + } + + TObjArray *gm, *gs; + if(!(gm = (TObjArray*)((TObjArray*)(fGraphM->At(plot)))->At(idx))) return kFALSE; + if(!(gs = (TObjArray*)((TObjArray*)(fGraphS->At(plot)))->At(idx))) return kFALSE; + TGraphErrors *g[2]; + + if(!(g[0] = (TGraphErrors*)gm->At(0))) return kFALSE; + if(!(g[1] = (TGraphErrors*)gs->At(0))) return kFALSE; + if(!Process((TH2*)h3->Project3D("yx"), f, k, g)) return kFALSE; + + if(!(g[0] = (TGraphErrors*)gm->At(1))) return kFALSE; + if(!(g[1] = (TGraphErrors*)gs->At(1))) return kFALSE; + if(!Process((TH2*)h3->Project3D("zx"), f, k, g)) return kFALSE; + + return kTRUE; +} + + //________________________________________________________ Bool_t AliTRDresolution::Process3DL(ETRDresolutionPlot plot, Int_t idx, TF1 *f, Float_t k) { @@ -1759,6 +2398,7 @@ Bool_t AliTRDresolution::Process3DL(ETRDresolutionPlot plot, Int_t idx, TF1 *f, // retrive containers TH3S *h3 = (TH3S*)((TObjArray*)fContainer->At(plot))->At(idx); if(!h3) return kFALSE; + AliDebug(2, Form("p[%d] idx[%d] h[%s] %s", plot, idx, h3->GetName(), h3->GetTitle())); TGraphAsymmErrors *gm; TGraphErrors *gs; @@ -1791,7 +2431,7 @@ Bool_t AliTRDresolution::Process3DL(ETRDresolutionPlot plot, Int_t idx, TF1 *f, } //________________________________________________________ -Bool_t AliTRDresolution::Process4D(ETRDresolutionPlot plot, Int_t idx, TF1 *f, Float_t k) +Bool_t AliTRDresolution::Process2Darray(ETRDresolutionPlot plot, Int_t idx, TF1 *f, Float_t k) { // // Do the processing @@ -1800,161 +2440,192 @@ Bool_t AliTRDresolution::Process4D(ETRDresolutionPlot plot, Int_t idx, TF1 *f, F if(!fContainer || !fGraphS || !fGraphM) return kFALSE; // retrive containers - TObjArray *arr = (TObjArray*)((TObjArray*)(fContainer->At(plot)))->At(idx); + TObjArray *arr = (TObjArray*)(fContainer->At(plot)); if(!arr) return kFALSE; + AliDebug(2, Form("p[%d] idx[%d] arr[%s]", plot, idx, arr->GetName())); + TObjArray *gm, *gs; + if(!(gm = (TObjArray*)((TObjArray*)(fGraphM->At(plot)))->At(idx))) return kFALSE; + if(!(gs = (TObjArray*)((TObjArray*)(fGraphS->At(plot)))->At(idx))) return kFALSE; - TObjArray *gm[2], *gs[2]; - if(!(gm[0] = (TObjArray*)((TObjArray*)(fGraphM->At(plot)))->At(idx))) return kFALSE; - if(!(gs[0] = (TObjArray*)((TObjArray*)(fGraphS->At(plot)))->At(idx))) return kFALSE; + TGraphErrors *g[2]; TH2I *h2(NULL); TObjArray *a0(NULL); + for(Int_t ia(0); iaGetEntriesFast(); ia++){ + if(!(a0 = (TObjArray*)arr->At(ia))) continue; - TGraphErrors *g[2]; + if(!(h2 = (TH2I*)a0->At(idx))) return kFALSE; + if(Int_t(h2->GetEntries())){ + AliDebug(4, Form(" idx[%d] h[%s] %s", ia, h2->GetName(), h2->GetTitle())); + } else { + AliDebug(2, Form(" idx[%d] : Missing entries.", ia)); + continue; + } + + if(!(g[0] = (TGraphErrors*)gm->At(ia))) return kFALSE; + if(!(g[1] = (TGraphErrors*)gs->At(ia))) return kFALSE; + if(!Process(h2, f, k, g)) return kFALSE; + } + + return kTRUE; +} + +//________________________________________________________ +Bool_t AliTRDresolution::Process3Darray(ETRDresolutionPlot plot, Int_t idx, TF1 *f, Float_t k) +{ + // + // Do the processing + // + + if(!fContainer || !fGraphS || !fGraphM) return kFALSE; + //printf("Process4D : processing plot[%d] idx[%d]\n", plot, idx); + + // retrive containers + TObjArray *arr = (TObjArray*)(fContainer->At(plot)); + if(!arr) return kFALSE; + AliDebug(2, Form("p[%d] idx[%d] arr[%s]", plot, idx, arr->GetName())); + + TObjArray *gm, *gs; + if(!(gm = (TObjArray*)((TObjArray*)(fGraphM->At(plot)))->At(idx))) return kFALSE; + if(!(gs = (TObjArray*)((TObjArray*)(fGraphS->At(plot)))->At(idx))) return kFALSE; - TH3S *h3 = 0x0; - for(Int_t ix=0; ixGetEntriesFast(); ix++){ - if(!(h3 = (TH3S*)arr->At(ix))) return kFALSE; - if(!(gm[1] = (TObjArray*)gm[0]->At(ix))) return kFALSE; - if(!(gs[1] = (TObjArray*)gs[0]->At(ix))) return kFALSE; + TGraphErrors *g[2]; TH3S *h3(NULL); TObjArray *a0(NULL); + Int_t in(0); + for(Int_t ia(0); iaGetEntriesFast(); ia++){ + if(!(a0 = (TObjArray*)arr->At(ia))) continue; + + if(!(h3 = (TH3S*)a0->At(idx))) return kFALSE; + if(Int_t(h3->GetEntries())){ + AliDebug(4, Form(" idx[%d] h[%s] %s", ia, h3->GetName(), h3->GetTitle())); + } else { + AliDebug(2, Form(" idx[%d] : Missing entries.", ia)); + continue; + } TAxis *az = h3->GetZaxis(); - for(Int_t iz=1; iz<=az->GetNbins(); iz++){ - if(!(g[0] = (TGraphErrors*)gm[1]->At(iz-1))) return kFALSE; - if(!(g[1] = (TGraphErrors*)gs[1]->At(iz-1))) return kFALSE; + for(Int_t iz=1; iz<=az->GetNbins(); iz++, in++){ + if(in >= gm->GetEntriesFast()) break; + if(!(g[0] = (TGraphErrors*)gm->At(in))) return kFALSE; + if(!(g[1] = (TGraphErrors*)gs->At(in))) return kFALSE; az->SetRange(iz, iz); if(!Process((TH2*)h3->Project3D("yx"), f, k, g)) return kFALSE; } } + AliDebug(2, Form("Projections [%d] from [%d]", in, gs->GetEntriesFast())); return kTRUE; } //________________________________________________________ -Bool_t AliTRDresolution::GetGraphPlot(Float_t *bb, ETRDresolutionPlot ip, Int_t idx) +Bool_t AliTRDresolution::Process3DlinkedArray(ETRDresolutionPlot plot, Int_t idx, TF1 *f, Float_t k) { // - // Get the graphs + // Do the processing // - if(!fGraphS || !fGraphM) return kFALSE; - TGraphErrors *gm = idx<0 ? (TGraphErrors*)fGraphM->At(ip) : (TGraphErrors*)((TObjArray*)(fGraphM->At(ip)))->At(idx); - if(!gm) return kFALSE; - TGraphErrors *gs = idx<0 ? (TGraphErrors*)fGraphS->At(ip) : (TGraphErrors*)((TObjArray*)(fGraphS->At(ip)))->At(idx); - if(!gs) return kFALSE; - gs->Draw("apl"); gm->Draw("pl"); - - // titles look up - Int_t nref = 0; - for(Int_t jp=0; jp<(Int_t)ip; jp++) nref+=fgNElements[jp]; - UChar_t jdx = idx<0?0:idx; - for(Int_t jc=0; jcGetN())) { - PutTrendValue(Form("%s_%s", fgPerformanceName[ip], at[0]), gm->GetMean(2)); - PutTrendValue(Form("%s_%sRMS", fgPerformanceName[ip], at[0]), gm->GetRMS(2)); - } + if(!fContainer || !fGraphS || !fGraphM) return kFALSE; + //printf("Process4D : processing plot[%d] idx[%d]\n", plot, idx); - if((n=gs->GetN())){ - gs->Sort(&TGraph::CompareY); - PutTrendValue(Form("%s_%sSigMin", fgPerformanceName[ip], at[0]), gs->GetY()[0]); - PutTrendValue(Form("%s_%sSigMax", fgPerformanceName[ip], at[0]), gs->GetY()[n-1]); - gs->Sort(&TGraph::CompareX); - } + // retrive containers + TObjArray *arr = (TObjArray*)(fContainer->At(plot)); + if(!arr) return kFALSE; + AliDebug(2, Form("p[%d] idx[%d] arr[%s]", plot, idx, arr->GetName())); - // axis range - TAxis *ax = 0x0; - ax = gs->GetHistogram()->GetXaxis(); - ax->SetRangeUser(bb[0], bb[2]); - ax->SetTitle(at[1]);ax->CenterTitle(); + TObjArray *gm, *gs; + if(!(gm = (TObjArray*)((TObjArray*)(fGraphM->At(plot)))->At(idx))) return kFALSE; + if(!(gs = (TObjArray*)((TObjArray*)(fGraphS->At(plot)))->At(idx))) return kFALSE; - ax = gs->GetHistogram()->GetYaxis(); - ax->SetRangeUser(bb[1], bb[3]); - ax->SetTitleOffset(1.1); - ax->SetTitle(at[2]);ax->CenterTitle(); + TGraphErrors *g[2]; TH3S *h3(NULL); TObjArray *a0(NULL); + Int_t in(0); + for(Int_t ia(0); iaGetEntriesFast(); ia++){ + if(!(a0 = (TObjArray*)arr->At(ia))) continue; + if(!(h3 = (TH3S*)a0->At(idx))) return kFALSE; + if(Int_t(h3->GetEntries())){ + AliDebug(4, Form(" idx[%d] h[%s] %s", ia, h3->GetName(), h3->GetTitle())); + } else { + AliDebug(2, Form(" idx[%d] : Missing entries.", ia)); + continue; + } + if(!(g[0] = (TGraphErrors*)gm->At(in))) return kFALSE; + if(!(g[1] = (TGraphErrors*)gs->At(in))) return kFALSE; + if(!Process((TH2*)h3->Project3D("yx"), f, k, g)) return kFALSE; + in++; - TGaxis *gax = 0x0; - gax = new TGaxis(bb[2], bb[1], bb[2], bb[3], bb[1], bb[3], 510, "+U"); - gax->SetLineColor(kRed);gax->SetLineWidth(2);gax->SetTextColor(kRed); - //gax->SetVertical(); - gax->CenterTitle(); gax->SetTitleOffset(.7); - gax->SetTitle(at[3]); gax->Draw(); + if(!(g[0] = (TGraphErrors*)gm->At(in))) return kFALSE; + if(!(g[1] = (TGraphErrors*)gs->At(in))) return kFALSE; + if(!Process((TH2*)h3->Project3D("zx"), f, k, g)) return kFALSE; + in++; + } + AliDebug(2, Form("Projections [%d] from [%d]", in, gs->GetEntriesFast())); - // bounding box - TBox *b = new TBox(-.15, bb[1], .15, bb[3]); - b->SetFillStyle(3002);b->SetLineColor(0); - b->SetFillColor(ip<=Int_t(kMCcluster)?kGreen:kBlue); - b->Draw(); return kTRUE; } - //________________________________________________________ -Bool_t AliTRDresolution::GetGraphTrack(Float_t *bb, Int_t idx, Int_t il) +Bool_t AliTRDresolution::GetGraph(Float_t *bb, ETRDresolutionPlot ip, Int_t idx, Bool_t kLEG, const Char_t *explain) { // // Get the graphs // if(!fGraphS || !fGraphM) return kFALSE; - // axis titles look up Int_t nref = 0; - for(Int_t jp=0; jpAt(kMCtrackTRD); a0 = a1; - a1 = (TObjArray*)a0->At(idx); a0 = a1; - a1 = (TObjArray*)a0->At(il); a0 = a1; - for(Int_t is=0; isAt(is))) return kFALSE; - if(!gs->GetN()) continue; - gs->Draw(is ? "pl" : "apl"); - gs->Sort(&TGraph::CompareY); Int_t n = gs->GetN(); - PutTrendValue(Form("%s_%sSigMin%s", fgPerformanceName[kMCtrackTRD], at[0], AliPID::ParticleShortName(is)), gs->GetY()[0]); - PutTrendValue(Form("%s_%sSigMax%s", fgPerformanceName[kMCtrackTRD], at[0], AliPID::ParticleShortName(is)), gs->GetY()[n-1]); - gs->Sort(&TGraph::CompareX); + for(Int_t jp=0; jp<(Int_t)ip; jp++) nref+=fgNproj[jp]; + UChar_t jdx = idx<0?0:idx; + for(Int_t jc=0; jcSetBorderSize(0); + leg->SetFillStyle(0); } - gs = (TGraphErrors*)a0->At(0); - + // build frame + TH1S *h1(NULL); + h1 = new TH1S(Form("h1TF_%02d", fIdxFrame++), Form("%s %s;%s;%s", at[0], explain?explain:"", at[1], at[2]), 2, bb[0], bb[2]); + h1->SetMinimum(bb[1]);h1->SetMaximum(bb[3]); + h1->SetLineColor(kBlack); h1->SetLineWidth(1);h1->SetLineStyle(2); // axis range - TAxis *ax = gs->GetHistogram()->GetXaxis(); - ax->SetRangeUser(bb[0], bb[2]); - ax->SetTitle(at[1]);ax->CenterTitle(); - - ax = gs->GetHistogram()->GetYaxis(); + TAxis *ax = h1->GetXaxis(); + ax->CenterTitle();ax->SetMoreLogLabels();ax->SetTitleOffset(1.2); + ax = h1->GetYaxis(); ax->SetRangeUser(bb[1], bb[3]); - ax->SetTitleOffset(.5);ax->SetTitleSize(.06); - ax->SetTitle(at[2]);ax->CenterTitle(); - - TGaxis *gax = 0x0; - gax = new TGaxis(bb[2], bb[1], bb[2], bb[3], bb[1], bb[3], 510, "+U"); - gax->SetLineColor(kRed);gax->SetLineWidth(2);gax->SetTextColor(kRed); - //gax->SetVertical(); - gax->CenterTitle(); gax->SetTitleOffset(.5);gax->SetTitleSize(.06); - gax->SetTitle(at[3]); gax->Draw(); - - - a0 = fGraphM; - a1 = (TObjArray*)a0->At(kMCtrackTRD); a0 = a1; - a1 = (TObjArray*)a0->At(idx); a0 = a1; - a1 = (TObjArray*)a0->At(il); a0 = a1; - for(Int_t is=0; isAt(is))) return kFALSE; - if(!gm->GetN()) continue; - gm->Draw("pl"); - PutTrendValue(Form("%s_%s_%s", fgPerformanceName[kMCtrackTRD], at[0], AliPID::ParticleShortName(is)), gm->GetMean(2)); - PutTrendValue(Form("%s_%s_%sRMS", fgPerformanceName[kMCtrackTRD], at[0], AliPID::ParticleShortName(is)), gm->GetRMS(2)); + ax->CenterTitle(); ax->SetTitleOffset(1.4); + h1->Draw(); + // bounding box + TBox *b = new TBox(-.15, bb[1], .15, bb[3]); + b->SetFillStyle(3002);b->SetLineColor(0); + b->SetFillColor(ip<=Int_t(kMCcluster)?kGreen:kBlue); + b->Draw(); + + TGraphErrors *gm = idx<0 ? (TGraphErrors*)fGraphM->At(ip) : (TGraphErrors*)((TObjArray*)(fGraphM->At(ip)))->At(idx); + if(!gm) return kFALSE; + TGraphErrors *gs = idx<0 ? (TGraphErrors*)fGraphS->At(ip) : (TGraphErrors*)((TObjArray*)(fGraphS->At(ip)))->At(idx); + if(!gs) return kFALSE; + + Int_t n(0), nPlots(0); + if((n=gm->GetN())) { + nPlots++; + gm->Draw("pl"); if(leg) leg->AddEntry(gm, gm->GetTitle(), "pl"); + PutTrendValue(Form("%s_%s", fgPerformanceName[ip], at[0]), gm->GetMean(2)); + PutTrendValue(Form("%s_%sRMS", fgPerformanceName[ip], at[0]), gm->GetRMS(2)); } + if((n=gs->GetN())){ + nPlots++; + gs->Draw("pl"); if(leg) leg->AddEntry(gs, gs->GetTitle(), "pl"); + gs->Sort(&TGraph::CompareY); + PutTrendValue(Form("%s_%sSigMin", fgPerformanceName[ip], at[0]), gs->GetY()[0]); + PutTrendValue(Form("%s_%sSigMax", fgPerformanceName[ip], at[0]), gs->GetY()[n-1]); + gs->Sort(&TGraph::CompareX); + } + if(!nPlots) return kFALSE; + if(leg) leg->Draw(); return kTRUE; } - //________________________________________________________ -Bool_t AliTRDresolution::GetGraphTrackTPC(Float_t *bb, Int_t sel) +Bool_t AliTRDresolution::GetGraphArray(Float_t *bb, ETRDresolutionPlot ip, Int_t idx, Bool_t kLEG, Int_t n, Int_t *sel, const Char_t *explain) { // // Get the graphs @@ -1963,54 +2634,76 @@ Bool_t AliTRDresolution::GetGraphTrackTPC(Float_t *bb, Int_t sel) if(!fGraphS || !fGraphM) return kFALSE; // axis titles look up - Int_t nref = 0; - for(Int_t jp=0; jpAt(kMCtrackTPC); a0 = a1; - a1 = (TObjArray*)a0->At(sel); a0 = a1; - for(Int_t is=0; isAt(is))) return kFALSE; - if(!gs->GetN()) continue; - gs->Draw(is ? "pl" : "apl"); - gs->Sort(&TGraph::CompareY); Int_t n = gs->GetN(); - PutTrendValue(Form("%s_%sSigMin%s", fgPerformanceName[kMCtrackTPC], at[0], AliPID::ParticleShortName(is)), gs->GetY()[0]); - PutTrendValue(Form("%s_%sSigMax%s", fgPerformanceName[kMCtrackTPC], at[0], AliPID::ParticleShortName(is)), gs->GetY()[n-1]); - gs->Sort(&TGraph::CompareX); + Int_t nref(0); + for(Int_t jp(0); jpSetHeader("Mean"); + legM->SetBorderSize(0); + legM->SetFillStyle(0); + legS=new TLegend(.65, .6, .95, .9); + legS->SetHeader("Sigma"); + legS->SetBorderSize(0); + legS->SetFillStyle(0); } - gs = (TGraphErrors*)a0->At(0); + // build frame + TH1S *h1(NULL); + h1 = new TH1S(Form("h1TF_%02d", fIdxFrame++), Form("%s %s;%s;%s", at[0], explain?explain:"", at[1], at[2]), 2, bb[0], bb[2]); + h1->SetMinimum(bb[1]);h1->SetMaximum(bb[3]); + h1->SetLineColor(kBlack); h1->SetLineWidth(1);h1->SetLineStyle(2); // axis range - TAxis *ax = gs->GetHistogram()->GetXaxis(); - ax->SetRangeUser(bb[0], bb[2]); - ax->SetTitle(at[1]);ax->CenterTitle(); - - ax = gs->GetHistogram()->GetYaxis(); + TAxis *ax = h1->GetXaxis(); + ax->CenterTitle();ax->SetMoreLogLabels();ax->SetTitleOffset(1.2); + ax = h1->GetYaxis(); ax->SetRangeUser(bb[1], bb[3]); - ax->SetTitleOffset(1.);ax->SetTitleSize(0.05); - ax->SetTitle(at[2]);ax->CenterTitle(); - - TGaxis *gax = 0x0; - gax = new TGaxis(bb[2], bb[1], bb[2], bb[3], bb[1], bb[3], 510, "+U"); - gax->SetLineColor(kRed);gax->SetLineWidth(2);gax->SetTextColor(kRed); - //gax->SetVertical(); - gax->CenterTitle(); gax->SetTitleOffset(.7);gax->SetTitleSize(0.05); - gax->SetTitle(at[3]); gax->Draw(); - - - a0 = fGraphM; - a1 = (TObjArray*)a0->At(kMCtrackTPC); a0 = a1; - a1 = (TObjArray*)a0->At(sel); a0 = a1; - for(Int_t is=0; isAt(is))) return kFALSE; - if(!gm->GetN()) continue; - gm->Draw("pl"); - PutTrendValue(Form("%s_%s_%s", fgPerformanceName[kMCtrackTPC], at[0], AliPID::ParticleShortName(is)), gm->GetMean(2)); - PutTrendValue(Form("%s_%s_%sRMS", fgPerformanceName[kMCtrackTPC], at[0], AliPID::ParticleShortName(is)), gm->GetRMS(2)); + ax->CenterTitle(); ax->SetTitleOffset(1.4); + h1->Draw(); + + TGraphErrors *gm(NULL), *gs(NULL); + TObjArray *a0(NULL), *a1(NULL); + a0 = (TObjArray*)((TObjArray*)fGraphM->At(ip))->At(idx); + a1 = (TObjArray*)((TObjArray*)fGraphS->At(ip))->At(idx); + if(!n) n=a0->GetEntriesFast(); + AliDebug(4, Form("Graph : Ref[%d] Title[%s] Limits{x[%f %f] y[%f %f]} Comp[%d] Selection[%c]", nref, at[0], bb[0], bb[2], bb[1], bb[3], n, sel ? 'y' : 'n')); + Int_t nn(0), nPlots(0); + for(Int_t is(0), is0(0); isAt(is0))) return kFALSE; + if(!(gm = (TGraphErrors*)a0->At(is0))) return kFALSE; + + if((nn=gs->GetN())){ + nPlots++; + gs->Draw("pc"); + if(legS){ + //printf("LegEntry %s [%s]%s\n", at[0], gs->GetName(), gs->GetTitle()); + legS->AddEntry(gs, gs->GetTitle(), "pl"); + } + gs->Sort(&TGraph::CompareY); + PutTrendValue(Form("%s_%sSigMin", fgPerformanceName[kMCtrack], at[0]), gs->GetY()[0]); + PutTrendValue(Form("%s_%sSigMax", fgPerformanceName[kMCtrack], at[0]), gs->GetY()[nn-1]); + gs->Sort(&TGraph::CompareX); + } + if(gm->GetN()){ + nPlots++; + gm->Draw("pc"); + if(legM){ + //printf("LegEntry %s [%s]%s\n", at[0], gm->GetName(), gm->GetTitle()); + legM->AddEntry(gm, gm->GetTitle(), "pl"); + } + PutTrendValue(Form("%s_%s", fgPerformanceName[kMCtrack], at[0]), gm->GetMean(2)); + PutTrendValue(Form("%s_%sRMS", fgPerformanceName[kMCtrack], at[0]), gm->GetRMS(2)); + } + } + if(!nPlots) return kFALSE; + if(kLEG){ + legM->Draw(); + legS->Draw(); } - return kTRUE; } @@ -2046,3 +2739,99 @@ void AliTRDresolution::SetRecoParam(AliTRDrecoParam *r) fReconstructor->SetRecoParam(r); } + + +//________________________________________________________ +void AliTRDresolution::SetSegmentationLevel(Int_t l) +{ +// Setting the segmentation level to "l" + fSegmentLevel = l; + + UShort_t const lNcomp[kNprojs] = { + 1, 1, //2, + fgkNresYsegm[fSegmentLevel], 2, //2, + 2*fgkNresYsegm[fSegmentLevel], 2, 2, 2, 1, //5, + 2*fgkNresYsegm[fSegmentLevel], 2, 2, 2, 1, //5, + 2*fgkNresYsegm[fSegmentLevel], 2, 2, 2, 1, //5, + // MC + fgkNresYsegm[fSegmentLevel], 2, //2, + fgkNresYsegm[fSegmentLevel], 2, 2, 2, 1, //5, + fgkNresYsegm[fSegmentLevel], 2, 2, 2, 1, 1, 1, 1, 11, 11, 11, //11 + fgkNresYsegm[fSegmentLevel], 2, 2, 2, 1, 1, 1, 1, 11, 11, 11, //11 + 6*fgkNresYsegm[fSegmentLevel], 6*2, 6*2, 6*2, 6, 6, 6, 6, 6*11, 6*11, 6*11 //11 + }; + memcpy(fNcomp, lNcomp, kNprojs*sizeof(UShort_t)); + + Char_t const *lAxTitle[kNprojs][4] = { + // Charge + {"Impv", "x [cm]", "I_{mpv}", "x/x_{0}"} + ,{"dI/Impv", "x/x_{0}", "#delta I/I_{mpv}", "x[cm]"} + // Clusters to Kalman + ,{"Cluster2Track residuals", "tg(#phi)", "y [#mum]", "#sigma_{y} [#mum]"} + ,{"Cluster2Track YZ pulls", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + // TRD tracklet to Kalman fit + ,{"Tracklet2Track Y residuals", "tg(#phi)", "y [#mum]", "#sigma_{y} [#mum]"} + ,{"Tracklet2Track YZ pulls", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + ,{"Tracklet2Track Z residuals", "tg(#theta)", "z [#mum]", "#sigma_{z} [#mum]"} + ,{"Tracklet2Track Z pulls", "tg(#theta)", "z", "#sigma_{z}"} + ,{"Tracklet2Track Phi residuals", "tg(#phi)", "#phi [mrad]", "#sigma_{#phi} [mrad]"} + // TRDin 2 first TRD tracklet + ,{"Tracklet2Track Y residuals @ TRDin", "tg(#phi)", "y [#mum]", "#sigma_{y} [#mum]"} + ,{"Tracklet2Track YZ pulls @ TRDin", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + ,{"Tracklet2Track Z residuals @ TRDin", "tg(#theta)", "z [#mum]", "#sigma_{z} [#mum]"} + ,{"Tracklet2Track Z pulls @ TRDin", "tg(#theta)", "z", "#sigma_{z}"} + ,{"Tracklet2Track Phi residuals @ TRDin", "tg(#phi)", "#phi [mrad]", "#sigma_{#phi} [mrad]"} + // TRDout 2 first TRD tracklet + ,{"Tracklet2Track Y residuals @ TRDout", "tg(#phi)", "y [#mum]", "#sigma_{y} [#mum]"} + ,{"Tracklet2Track YZ pulls @ TRDout", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + ,{"Tracklet2Track Z residuals @ TRDout", "tg(#theta)", "z [#mum]", "#sigma_{z} [#mum]"} + ,{"Tracklet2Track Z pulls @ TRDout", "tg(#theta)", "z", "#sigma_{z}"} + ,{"Tracklet2Track Phi residuals @ TRDout", "tg(#phi)", "#phi [mrad]", "#sigma_{#phi} [mrad]"} + // MC cluster + ,{"MC Cluster Y resolution", "tg(#phi)", "y [#mum]", "#sigma_{y} [#mum]"} + ,{"MC Cluster YZ pulls", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + // MC tracklet + ,{"MC Tracklet Y resolution", "tg(#phi)", "y [#mum]", "#sigma_{y}[#mum]"} + ,{"MC Tracklet YZ pulls", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + ,{"MC Tracklet Z resolution", "tg(#theta)", "z [#mum]", "#sigma_{z} [#mum]"} + ,{"MC Tracklet Z pulls", "tg(#theta)", "z", "#sigma_{z}"} + ,{"MC Tracklet Phi resolution", "tg(#phi)", "#phi [mrad]", "#sigma_{#phi} [mrad]"} + // MC track TRDin + ,{"MC Y resolution @ TRDin", "tg(#phi)", "y [#mum]", "#sigma_{y}[#mum]"} + ,{"MC YZ pulls @ TRDin", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + ,{"MC Z resolution @ TRDin", "tg(#theta)", "z [#mum]", "#sigma_{z} [#mum]"} + ,{"MC Z pulls @ TRDin", "tg(#theta)", "z", "#sigma_{z}"} + ,{"MC #Phi resolution @ TRDin", "tg(#phi)", "#phi [mrad]", "#sigma_{#phi} [mrad]"} + ,{"MC SNP pulls @ TRDin", "tg(#phi)", "SNP", "#sigma_{snp}"} + ,{"MC #Theta resolution @ TRDin", "tg(#theta)", "#theta [mrad]", "#sigma_{#theta} [mrad]"} + ,{"MC TGL pulls @ TRDin", "tg(#theta)", "TGL", "#sigma_{tgl}"} + ,{"MC P_{t} resolution @ TRDin", "p_{t}^{MC} [GeV/c]", "(p_{t}^{REC}-p_{t}^{MC})/p_{t}^{MC} [%]", "MC: #sigma^{TPC}(#Deltap_{t}/p_{t}^{MC}) [%]"} + ,{"MC 1/P_{t} pulls @ TRDin", "1/p_{t}^{MC} [c/GeV]", "1/p_{t}^{REC}-1/p_{t}^{MC}", "MC PULL: #sigma_{1/p_{t}}^{TPC}"} + ,{"MC P resolution @ TRDin", "p^{MC} [GeV/c]", "(p^{REC}-p^{MC})/p^{MC} [%]", "MC: #sigma^{TPC}(#Deltap/p^{MC}) [%]"} + // MC track TRDout + ,{"MC Y resolution @ TRDout", "tg(#phi)", "y [#mum]", "#sigma_{y}[#mum]"} + ,{"MC YZ pulls @ TRDout", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + ,{"MC Z resolution @ TRDout", "tg(#theta)", "z [#mum]", "#sigma_{z} [#mum]"} + ,{"MC Z pulls @ TRDout", "tg(#theta)", "z", "#sigma_{z}"} + ,{"MC #Phi resolution @ TRDout", "tg(#phi)", "#phi [mrad]", "#sigma_{#phi} [mrad]"} + ,{"MC SNP pulls @ TRDout", "tg(#phi)", "SNP", "#sigma_{snp}"} + ,{"MC #Theta resolution @ TRDout", "tg(#theta)", "#theta [mrad]", "#sigma_{#theta} [mrad]"} + ,{"MC TGL pulls @ TRDout", "tg(#theta)", "TGL", "#sigma_{tgl}"} + ,{"MC P_{t} resolution @ TRDout", "p_{t}^{MC} [GeV/c]", "(p_{t}^{REC}-p_{t}^{MC})/p_{t}^{MC} [%]", "MC: #sigma^{TPC}(#Deltap_{t}/p_{t}^{MC}) [%]"} + ,{"MC 1/P_{t} pulls @ TRDout", "1/p_{t}^{MC} [c/GeV]", "1/p_{t}^{REC}-1/p_{t}^{MC}", "MC PULL: #sigma_{1/p_{t}}^{TPC}"} + ,{"MC P resolution @ TRDout", "p^{MC} [GeV/c]", "(p^{REC}-p^{MC})/p^{MC} [%]", "MC: #sigma^{TPC}(#Deltap/p^{MC}) [%]"} + // MC track in TRD + ,{"MC Track Y resolution", "tg(#phi)", "y [#mum]", "#sigma_{y} [#mum]"} + ,{"MC Track YZ pulls", fgkResYsegmName[fSegmentLevel], "y / z", "#sigma_{y}"} + ,{"MC Track Z resolution", "tg(#theta)", "z [#mum]", "#sigma_{z} [#mum]"} + ,{"MC Track Z pulls", "tg(#theta)", "z", "#sigma_{z}"} + ,{"MC Track #Phi resolution", "tg(#phi)", "#phi [mrad]", "#sigma_{#phi} [mrad]"} + ,{"MC Track SNP pulls", "tg(#phi)", "SNP", "#sigma_{snp}"} + ,{"MC Track #Theta resolution", "tg(#theta)", "#theta [mrad]", "#sigma_{#theta} [mrad]"} + ,{"MC Track TGL pulls", "tg(#theta)", "TGL", "#sigma_{tgl}"} + ,{"MC P_{t} resolution", "p_{t} [GeV/c]", "(p_{t}^{REC}-p_{t}^{MC})/p_{t}^{MC} [%]", "#sigma(#Deltap_{t}/p_{t}^{MC}) [%]"} + ,{"MC 1/P_{t} pulls", "1/p_{t}^{MC} [c/GeV]", "1/p_{t}^{REC} - 1/p_{t}^{MC}", "#sigma_{1/p_{t}}"} + ,{"MC P resolution", "p [GeV/c]", "(p^{REC}-p^{MC})/p^{MC} [%]", "#sigma(#Deltap/p^{MC}) [%]"} + }; + memcpy(fAxTitle, lAxTitle, 4*kNprojs*sizeof(Char_t*)); +}