]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
updates for the pilot train
authorabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 7 Apr 2010 13:22:35 +0000 (13:22 +0000)
committerabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 7 Apr 2010 13:22:35 +0000 (13:22 +0000)
PWG1/TRD/AliTRDcheckESD.cxx
PWG1/TRD/AliTRDinfoGen.cxx
PWG1/TRD/AliTRDresolution.cxx

index 6dbe158a0af827aa4d9561768427faef9cb20a4e..1a6bcc399644af1939dc9bb98e7dd3aec31a23ef 100644 (file)
@@ -62,7 +62,7 @@ ClassImp(AliTRDcheckESD)
 const Float_t AliTRDcheckESD::fgkxTPC = 290.;
 const Float_t AliTRDcheckESD::fgkxTOF = 365.;
 const UChar_t AliTRDcheckESD::fgkNgraph[AliTRDcheckESD::kNrefs] ={
 const Float_t AliTRDcheckESD::fgkxTPC = 290.;
 const Float_t AliTRDcheckESD::fgkxTOF = 365.;
 const UChar_t AliTRDcheckESD::fgkNgraph[AliTRDcheckESD::kNrefs] ={
-6, 4, 2, 20};
+8, 4, 2, 20};
 FILE* AliTRDcheckESD::fgFile = NULL;
 
 const Float_t AliTRDcheckESD::fgkEvVertexZ = 15.;
 FILE* AliTRDcheckESD::fgFile = NULL;
 
 const Float_t AliTRDcheckESD::fgkEvVertexZ = 15.;
@@ -165,6 +165,7 @@ Bool_t AliTRDcheckESD::GetRefFigure(Int_t ifig)
     leg->SetBorderSize(0); leg->SetFillStyle(0);
     for(Int_t ig(0); ig<fgkNgraph[kNCl]; ig++){
       if(!(g = (TGraphErrors*)arr->At(ig))) return kFALSE;
     leg->SetBorderSize(0); leg->SetFillStyle(0);
     for(Int_t ig(0); ig<fgkNgraph[kNCl]; ig++){
       if(!(g = (TGraphErrors*)arr->At(ig))) return kFALSE;
+      if(!g->GetN()) continue;
       g->Draw(ig?"pc":"apc"); leg->AddEntry(g, g->GetTitle(), "pl");
       if(ig) continue;
       hF=g->GetHistogram();
       g->Draw(ig?"pc":"apc"); leg->AddEntry(g, g->GetTitle(), "pl");
       if(ig) continue;
       hF=g->GetHistogram();
@@ -570,7 +571,13 @@ void AliTRDcheckESD::Terminate(Option_t *)
           g->SetLineColor(ig+1); 
           g->SetMarkerColor(ig+1); 
           g->SetMarkerStyle(ig+20); 
           g->SetLineColor(ig+1); 
           g->SetMarkerColor(ig+1); 
           g->SetMarkerStyle(ig+20); 
-          g->SetNameTitle(Form("s%d", ig), ig? AliPID::ParticleLatexName(ig-1):"all");
+          g->SetName(Form("s%d", ig));
+          switch(ig){
+          case 0: g->SetTitle("ALL"); break;
+          case 1: g->SetTitle("NEG"); break;
+          case 2: g->SetTitle("POS"); break;
+          default: g->SetTitle(AliPID::ParticleLatexName(ig-3)); break;
+          };
         }
         break;
       case kTRDmom:
         }
         break;
       case kTRDmom:
@@ -627,14 +634,36 @@ void AliTRDcheckESD::Terminate(Option_t *)
   if(!(h2 = (TH2I*)fHistos->At(kNCl))) return;
   ax = h2->GetXaxis();
   arr = (TObjArray*)fResults->At(kNCl);
   if(!(h2 = (TH2I*)fHistos->At(kNCl))) return;
   ax = h2->GetXaxis();
   arr = (TObjArray*)fResults->At(kNCl);
+  // All tracks
   h1[0] = h2->ProjectionX("Ncl_px");
   TGraphErrors *ge=(TGraphErrors*)arr->At(0);
   for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
     ge->SetPoint(ib-2, ax->GetBinCenter(ib), h1[0]->GetBinContent(ib));
   }
   h1[0] = h2->ProjectionX("Ncl_px");
   TGraphErrors *ge=(TGraphErrors*)arr->At(0);
   for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
     ge->SetPoint(ib-2, ax->GetBinCenter(ib), h1[0]->GetBinContent(ib));
   }
+  // All charged tracks
+  TH1 *hNclCh[2] = {(TH1D*)h1[0]->Clone("NEG"), (TH1D*)h1[0]->Clone("POS")};
+  hNclCh[0]->Reset();hNclCh[1]->Reset();
+  for(Int_t is(1); is<=AliPID::kSPECIES; is++){
+    hNclCh[0]->Add(h2->ProjectionX("Ncl_px", 2*is-1, 2*is-1)); // neg
+    hNclCh[1]->Add(h2->ProjectionX("Ncl_px", 2*is, 2*is));     // pos
+  }
+  if(Int_t(hNclCh[0]->GetEntries())){
+    ge=(TGraphErrors*)arr->At(1);
+    for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
+      ge->SetPoint(ib-2, ax->GetBinCenter(ib), hNclCh[0]->GetBinContent(ib));
+    }
+  }
+  if(Int_t(hNclCh[1]->GetEntries())){
+    ge=(TGraphErrors*)arr->At(2);
+    for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
+      ge->SetPoint(ib-2, ax->GetBinCenter(ib), hNclCh[1]->GetBinContent(ib));
+    }
+  }
+  // Species wise
   for(Int_t is(1); is<=AliPID::kSPECIES; is++){
     h1[0] = h2->ProjectionX("Ncl_px", 2*is-1, 2*is);
   for(Int_t is(1); is<=AliPID::kSPECIES; is++){
     h1[0] = h2->ProjectionX("Ncl_px", 2*is-1, 2*is);
-    ge=(TGraphErrors*)arr->At(is);
+    if(!Int_t(h1[0]->GetEntries())) continue;
+    ge=(TGraphErrors*)arr->At(2+is);
     for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
       ge->SetPoint(ib-2, ax->GetBinCenter(ib), h1[0]->GetBinContent(ib));
     }
     for(Int_t ib=2; ib<=ax->GetNbins(); ib++){
       ge->SetPoint(ib-2, ax->GetBinCenter(ib), h1[0]->GetBinContent(ib));
     }
index 38f591d9d10b452839f872d20603a385297577d7..940c635f2de11482a20820c469514d81cf018303 100644 (file)
@@ -399,25 +399,28 @@ void AliTRDinfoGen::UserExec(Option_t *){
             AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] Pt[%5.2f]", fESDev->GetEventNumberInFile(), itrk, esdTrack->Pt()));
             selected = kFALSE;
           }
             AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] Pt[%5.2f]", fESDev->GetEventNumberInFile(), itrk, esdTrack->Pt()));
             selected = kFALSE;
           }
-          if(TMath::Abs(esdTrack->Eta()) > fgkEta){
+          if(selected && TMath::Abs(esdTrack->Eta()) > fgkEta){
             AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] Eta[%5.2f]", fESDev->GetEventNumberInFile(), itrk, TMath::Abs(esdTrack->Eta())));
             selected = kFALSE;
           }
             AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] Eta[%5.2f]", fESDev->GetEventNumberInFile(), itrk, TMath::Abs(esdTrack->Eta())));
             selected = kFALSE;
           }
-          if(esdTrack->GetTPCNcls() < fgkNclTPC){ 
+          if(selected && esdTrack->GetTPCNcls() < fgkNclTPC){ 
             AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] NclTPC[%d]", fESDev->GetEventNumberInFile(), itrk, esdTrack->GetTPCNcls()));
             selected = kFALSE;
           }
           Float_t par[2], cov[3];
           esdTrack->GetImpactParameters(par, cov);
           if(IsCollision()){ // cuts on DCA
             AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] NclTPC[%d]", fESDev->GetEventNumberInFile(), itrk, esdTrack->GetTPCNcls()));
             selected = kFALSE;
           }
           Float_t par[2], cov[3];
           esdTrack->GetImpactParameters(par, cov);
           if(IsCollision()){ // cuts on DCA
-            if(TMath::Abs(par[0]) > fgkTrkDCAxy){ 
+            if(selected && TMath::Abs(par[0]) > fgkTrkDCAxy){ 
               AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] DCAxy[%f]", fESDev->GetEventNumberInFile(), itrk, TMath::Abs(par[0])));
               selected = kFALSE;
             }
               AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] DCAxy[%f]", fESDev->GetEventNumberInFile(), itrk, TMath::Abs(par[0])));
               selected = kFALSE;
             }
-            if(TMath::Abs(par[1]) > fgkTrkDCAz){ 
+            if(selected && TMath::Abs(par[1]) > fgkTrkDCAz){ 
               AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] DCAz[%f]", fESDev->GetEventNumberInFile(), itrk, TMath::Abs(par[1])));
               selected = kFALSE;
             }
               AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] DCAz[%f]", fESDev->GetEventNumberInFile(), itrk, TMath::Abs(par[1])));
               selected = kFALSE;
             }
+          } else if(selected && fMCev && !fMCev->IsPhysicalPrimary(alab)){;
+            AliDebug(2, Form("Reject Ev[%4d] Trk[%3d] Primary", fESDev->GetEventNumberInFile(), itrk));
+            selected = kFALSE;
           }
         }
         if(fTrackCut && !fTrackCut->IsSelected(esdTrack)) selected = kFALSE;
           }
         }
         if(fTrackCut && !fTrackCut->IsSelected(esdTrack)) selected = kFALSE;
index b62362776915172bbde93667d0960f5d035c83e0..15408e522d8ccb20eab2349c2ac1f5e0382692f3 100644 (file)
@@ -113,9 +113,9 @@ const Int_t AliTRDresolution::fgkNresYsegm = 18; const Char_t *AliTRDresolution:
 UChar_t const AliTRDresolution::fgNcomp[kNprojs] = {
   1,  1, //2, 
   AliTRDresolution::fgkNresYsegm, 2, //2, 
 UChar_t const AliTRDresolution::fgNcomp[kNprojs] = {
   1,  1, //2, 
   AliTRDresolution::fgkNresYsegm, 2, //2, 
-  AliTRDresolution::fgkNresYsegm, 2, 2, 2, 1, //5, 
-  AliTRDresolution::fgkNresYsegm, 2, 2, 2, 1, //5,
-  AliTRDresolution::fgkNresYsegm, 2, 2, 2, 1, //5,
+  2*AliTRDresolution::fgkNresYsegm, 2, 2, 2, 1, //5, 
+  2*AliTRDresolution::fgkNresYsegm, 2, 2, 2, 1, //5,
+  2*AliTRDresolution::fgkNresYsegm, 2, 2, 2, 1, //5,
 // MC
   AliTRDresolution::fgkNresYsegm, 2,          //2, 
   AliTRDresolution::fgkNresYsegm, 2, 2, 2, 1, //5, 
 // MC
   AliTRDresolution::fgkNresYsegm, 2,          //2, 
   AliTRDresolution::fgkNresYsegm, 2, 2, 2, 1, //5, 
@@ -395,7 +395,7 @@ TH1* AliTRDresolution::PlotCluster(const AliTRDtrackV1 *track)
   Int_t sec(-1), stk(-1), det(-1);
   Double_t covR[7], cov[3], dy[2], dz[2];
   Float_t pt, x0, y0, z0, dydx, dzdx;
   Int_t sec(-1), stk(-1), det(-1);
   Double_t covR[7], cov[3], dy[2], dz[2];
   Float_t pt, x0, y0, z0, dydx, dzdx;
-  AliTRDseedV1 *fTracklet(NULL);  
+  AliTRDseedV1 *fTracklet(NULL);  TObjArray *clInfoArr(NULL);
   for(Int_t ily=0; ily<AliTRDgeometry::kNlayer; ily++){
     if(!(fTracklet = fkTrack->GetTracklet(ily))) continue;
     if(!fTracklet->IsOK()) continue;
   for(Int_t ily=0; ily<AliTRDgeometry::kNlayer; ily++){
     if(!(fTracklet = fkTrack->GetTracklet(ily))) continue;
     if(!fTracklet->IsOK()) continue;
@@ -441,30 +441,34 @@ TH1* AliTRDresolution::PlotCluster(const AliTRDtrackV1 *track)
       Pulls(dyz, cov, tilt);
       ((TH3S*)arr->At(1))->Fill(sec, dyz[0], dyz[1]);
   
       Pulls(dyz, cov, tilt);
       ((TH3S*)arr->At(1))->Fill(sec, dyz[0], dyz[1]);
   
+      // 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;
+      fCl->Add(clInfo);
+      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(DebugLevel()>=2){
       if(DebugLevel()>=2){
-        // 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;
-        fCl->Add(clInfo);
-        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);
-        (*DebugStream()) << "ClusterREC"
-          <<"status="  << status
-          <<"clInfo.=" << clInfo
-          << "\n";
+        if(!clInfoArr) clInfoArr=new TObjArray(AliTRDseedV1::kNclusters);
+        clInfoArr->Add(clInfo);
       }
     }
       }
     }
+    if(DebugLevel()>=2 && clInfoArr){
+      (*DebugStream()) << "cluster"
+        <<"status="  << status
+        <<"clInfo.=" << clInfoArr
+        << "\n";
+    }
   }
   return (TH3S*)arr->At(0);
 }
   }
   return (TH3S*)arr->At(0);
 }
@@ -517,7 +521,7 @@ TH1* AliTRDresolution::PlotTracklet(const AliTRDtrackV1 *track)
     // calculate residuals using tilt rotation
     dy[1]= cost*(dy[0] - dz[0]*tilt);
     dz[1]= cost*(dz[0] + dy[0]*tilt);
     // 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(fTracklet->GetYref(1), dy[1], sec);
+    ((TH3S*)arr->At(0))->Fill(fTracklet->GetYref(1), dy[1], sec+rc*fgkNresYsegm);
     ((TH3S*)arr->At(2))->Fill(fTracklet->GetZref(1), dz[1], rc);
 
     // compute covariance matrix
     ((TH3S*)arr->At(2))->Fill(fTracklet->GetZref(1), dz[1], rc);
 
     // compute covariance matrix
@@ -526,20 +530,26 @@ TH1* AliTRDresolution::PlotTracklet(const AliTRDtrackV1 *track)
     cov[0] += covR[0]; cov[1] += covR[1]; cov[2] += covR[2]; 
     Double_t dyz[2]= {dy[1], dz[1]};
     Pulls(dyz, cov, tilt);
     cov[0] += covR[0]; cov[1] += covR[1]; cov[2] += covR[2]; 
     Double_t dyz[2]= {dy[1], dz[1]};
     Pulls(dyz, cov, tilt);
-      if(DebugLevel()>=1){
-        (*DebugStream()) << "TrackletPulls"
-          <<"dy="  << dy[1]
-          <<"dz="  << dz[1]
-          <<"dyp=" << dyz[0]
-          <<"dzp=" << dyz[1]
-          <<"rc="  << rc
-          << "\n";
-      }
-
     ((TH3S*)arr->At(1))->Fill(sec, dyz[0], dyz[1]);
     ((TH3S*)arr->At(3))->Fill(fTracklet->GetZref(1), dyz[1], rc);
 
     ((TH3S*)arr->At(1))->Fill(sec, dyz[0], dyz[1]);
     ((TH3S*)arr->At(3))->Fill(fTracklet->GetZref(1), dyz[1], rc);
 
-    ((TH2I*)arr->At(4))->Fill(fTracklet->GetYref(1), TMath::ATan((fTracklet->GetYref(1)-fTracklet->GetYfit(1))/(1-fTracklet->GetYref(1)*fTracklet->GetYfit(1))));
+    Double_t dphi((fTracklet->GetYref(1)-fTracklet->GetYfit(1))/(1-fTracklet->GetYref(1)*fTracklet->GetYfit(1)));
+    Double_t dtht((fTracklet->GetZref(1)-fTracklet->GetZfit(1))/(1-fTracklet->GetZref(1)*fTracklet->GetZfit(1)));
+    ((TH2I*)arr->At(4))->Fill(fTracklet->GetYref(1), TMath::ATan(dphi));
+
+    if(DebugLevel()>=1){
+      UChar_t err(fTracklet->GetErrorMsg());
+      (*DebugStream()) << "tracklet"
+        <<"dy="  << dy[1]
+        <<"dz="  << dz[1]
+        <<"dphi="<< dphi
+        <<"dtht="<< dtht
+        <<"dyp=" << dyz[0]
+        <<"dzp=" << dyz[1]
+        <<"rc="  << rc
+        <<"err=" << err
+        << "\n";
+    }
   }
 
 
   }
 
 
@@ -617,7 +627,7 @@ TH1* AliTRDresolution::PlotTrackIn(const AliTRDtrackV1 *track)
   dz[1] = cost*(dz[0] + dy[0]*tilt);
 
   TObjArray *arr = (TObjArray*)fContainer->At(kTrackIn);
   dz[1] = cost*(dz[0] + dy[0]*tilt);
 
   TObjArray *arr = (TObjArray*)fContainer->At(kTrackIn);
-  if(1./PAR[4]>fgPtThreshold) ((TH3S*)arr->At(0))->Fill(fTracklet->GetYref(1), dy[1], sec);
+  if(1./PAR[4]>fgPtThreshold) ((TH3S*)arr->At(0))->Fill(fTracklet->GetYref(1), dy[1], sec+rc*fgkNresYsegm);
   ((TH3S*)arr->At(2))->Fill(fTracklet->GetZref(1), dz[1], rc);
   ((TH2I*)arr->At(4))->Fill(fTracklet->GetYref(1), dphi);
 
   ((TH3S*)arr->At(2))->Fill(fTracklet->GetZref(1), dz[1], rc);
   ((TH2I*)arr->At(4))->Fill(fTracklet->GetYref(1), dphi);
 
@@ -784,7 +794,7 @@ TH1* AliTRDresolution::PlotTrackOut(const AliTRDtrackV1 *track)
   dz[1] = cost*(dz[0] + dy[0]*tilt);
 
   TObjArray *arr = (TObjArray*)fContainer->At(kTrackOut);
   dz[1] = cost*(dz[0] + dy[0]*tilt);
 
   TObjArray *arr = (TObjArray*)fContainer->At(kTrackOut);
-  if(1./PAR[4]>fgPtThreshold) ((TH3S*)arr->At(0))->Fill(fTracklet->GetYref(1), 1.e2*dy[1], sec); // scale to fit general residual range !!!
+  if(1./PAR[4]>fgPtThreshold) ((TH3S*)arr->At(0))->Fill(fTracklet->GetYref(1), 1.e2*dy[1], sec+rc*fgkNresYsegm); // 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);
 
   ((TH3S*)arr->At(2))->Fill(fTracklet->GetZref(1), dz[1], rc);
   ((TH2I*)arr->At(4))->Fill(fTracklet->GetYref(1), dphi);
 
@@ -1163,30 +1173,53 @@ Bool_t AliTRDresolution::GetRefFigure(Int_t ifig)
     if(!GetGraphArray(xy, kCluster, 1, 1)) break;
     return kTRUE;
   case 3: // kTrack y
     if(!GetGraphArray(xy, kCluster, 1, 1)) break;
     return kTRUE;
   case 3: // kTrack 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] = 300.;
+    gPad->Divide(3, 2, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); 
+    xy[0] = -.3; xy[1] = -75.; xy[2] = .3; xy[3] = 500.;
     ((TVirtualPad*)l->At(0))->cd();
     selStart=0; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
     if(!GetGraphArray(xy, kTrack, 0, 1, n, selection)) break;
     ((TVirtualPad*)l->At(0))->cd();
     selStart=0; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
     if(!GetGraphArray(xy, kTrack, 0, 1, n, selection)) break;
+
     ((TVirtualPad*)l->At(1))->cd();
     selStart=fgkNresYsegm/3; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
     if(!GetGraphArray(xy, kTrack, 0, 1, n, selection)) break;
     ((TVirtualPad*)l->At(1))->cd();
     selStart=fgkNresYsegm/3; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
     if(!GetGraphArray(xy, kTrack, 0, 1, n, selection)) break;
+
+    ((TVirtualPad*)l->At(2))->cd();
+    selStart=2*fgkNresYsegm/3; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
+    if(!GetGraphArray(xy, kTrack, 0, 1, n, selection)) break;
+
+    ((TVirtualPad*)l->At(3))->cd();
+    selStart=fgkNresYsegm; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
+    if(!GetGraphArray(xy, kTrack, 0, 1, n, selection, "[RC]")) break;
+
+    ((TVirtualPad*)l->At(4))->cd();
+    selStart=fgkNresYsegm/3+fgkNresYsegm; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
+    if(!GetGraphArray(xy, kTrack, 0, 1, n, selection, "[RC]")) break;
+
+    ((TVirtualPad*)l->At(5))->cd();
+    selStart=2*fgkNresYsegm/3+fgkNresYsegm; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
+    if(!GetGraphArray(xy, kTrack, 0, 1, n, selection, "[RC]")) break;
     return kTRUE;
     return kTRUE;
-  case 4: // kTrack y
+  case 4: // kTrack z
     gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); 
     gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); 
-    xy[0] = -.3; xy[1] = -50.; xy[2] = .3; xy[3] = 300.;
+
+    xy[0] = -1.; xy[1] = -150.; xy[2] = 1.; xy[3] = 1000.;
     ((TVirtualPad*)l->At(0))->cd();
     ((TVirtualPad*)l->At(0))->cd();
-    selStart=2*fgkNresYsegm/3; for(n=0; n<fgkNresYsegm/3; n++) selection[n]=selStart+n;
-    if(!GetGraphArray(xy, kTrack, 0, 1, n, selection)) break;
-    xy[0] = -.5; xy[1] = -0.5; xy[2] = fgkNresYsegm-.5; 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();
     ((TVirtualPad*)l->At(1))->cd();
-    if(!GetGraphArray(xy, kTrack, 1, 1)) break;
+    selection[0]=0;
+    if(!GetGraphArray(xy, kTrack, 2, 1, 1, selection)) break;
+
     return kTRUE;
     return kTRUE;
-  case 5: // kTrack  z
+  case 5: // kTrack  pulls
     gPad->Divide(2, 1, 1.e-5, 1.e-5); l=gPad->GetListOfPrimitives(); 
     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-.5; xy[3] = 2.5;
     ((TVirtualPad*)l->At(0))->cd();
     ((TVirtualPad*)l->At(0))->cd();
-    if(!GetGraphArray(xy, kTrack, 2, 1)) 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(!GetGraphArray(xy, kTrack, 3, 1)) break;
     xy[0] = -1.; xy[1] = -0.5; xy[2] = 1.; xy[3] = 2.5;
     ((TVirtualPad*)l->At(1))->cd();
     if(!GetGraphArray(xy, kTrack, 3, 1)) break;
@@ -1224,7 +1257,8 @@ Bool_t AliTRDresolution::GetRefFigure(Int_t ifig)
     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);
     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(!GetGraphArray(xy, kTrackIn, 2, 1)) break;
+    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);
     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);
@@ -1995,17 +2029,17 @@ TObjArray* AliTRDresolution::BuildMonitorContainerCluster(const char* name)
 
   const Int_t kNro(fgkNresYsegm), kNphi(48), kNdy(60);
   Float_t Phi=-.48, Dy=-.15, RO=-0.5;
 
   const Int_t kNro(fgkNresYsegm), kNphi(48), kNdy(60);
   Float_t Phi=-.48, Dy=-.15, RO=-0.5;
-  Float_t binsPhi[kNphi+1], binsDy[kNdy+1], binsRO[kNro+1];
+  Float_t binsPhi[kNphi+1], binsDy[kNdy+1], binsRO[2*kNro+1];
   for(Int_t i=0; i<kNphi+1; i++,Phi+=.02) binsPhi[i]=Phi;
   for(Int_t i=0; i<kNdy+1; i++,Dy+=5.e-3) binsDy[i]=Dy;
   for(Int_t i=0; i<kNphi+1; i++,Phi+=.02) binsPhi[i]=Phi;
   for(Int_t i=0; i<kNdy+1; i++,Dy+=5.e-3) binsDy[i]=Dy;
-  for(Int_t i=0;i<kNro+1; i++,RO+=1.) binsRO[i]=RO;
+  for(Int_t i=0;i<2*kNro+1; i++,RO+=1.) binsRO[i]=RO;
 
   // 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];sector", GetNameId(), name);
   if(!(h = (TH3S*)gROOT->FindObject(hname))){
     h = new TH3S(hname, htitle, 
 
   // 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];sector", GetNameId(), name);
   if(!(h = (TH3S*)gROOT->FindObject(hname))){
     h = new TH3S(hname, htitle, 
-                 kNphi, binsPhi, kNdy, binsDy, kNro, binsRO);
+                 kNphi, binsPhi, kNdy, binsDy, 2*kNro, binsRO);
   } else h->Reset();
   arr->AddAt(h, 0);
   sprintf(hname, "%s_%s_YZpull", GetNameId(), name);
   } else h->Reset();
   arr->AddAt(h, 0);
   sprintf(hname, "%s_%s_YZpull", GetNameId(), name);
@@ -2040,6 +2074,8 @@ TObjArray* AliTRDresolution::BuildMonitorContainerTracklet(const char* 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);
   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);
 
   } else h->Reset();
   arr->AddAt(h, 3);
 
@@ -2215,9 +2251,11 @@ Bool_t AliTRDresolution::Process(TH2 * const h2, TF1 *f, Float_t k, TGraphErrors
   if((n=g[1]->GetN())) for(;n--;) g[1]->RemovePoint(n);
   AliDebug(4, Form("%s: g[%s %s]", pn, g[0]->GetName(), g[0]->GetTitle()));
 
   if((n=g[1]->GetN())) for(;n--;) g[1]->RemovePoint(n);
   AliDebug(4, Form("%s: g[%s %s]", pn, g[0]->GetName(), g[0]->GetTitle()));
 
-  for(Int_t ibin = 1; ibin <= h2->GetNbinsX(); ibin++){
-    Double_t x = h2->GetXaxis()->GetBinCenter(ibin);
-    TH1D *h = h2->ProjectionY(pn, ibin, ibin);
+  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) continue;
 
     h->Fit(f, "QN");
     if((n=(Int_t)h->GetEntries())<100) continue;
 
     h->Fit(f, "QN");
@@ -2293,10 +2331,10 @@ Bool_t AliTRDresolution::Process3D(ETRDresolutionPlot plot, Int_t idx, TF1 *f, F
   TGraphErrors *g[2];
 
   TAxis *az = h3->GetZaxis();
   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); iz<gm->GetEntriesFast(); 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;
   }
 
     if(!Process((TH2*)h3->Project3D("yx"), f, k, g)) return kFALSE;
   }
 
@@ -2446,6 +2484,7 @@ Bool_t AliTRDresolution::Process3Darray(ETRDresolutionPlot plot, Int_t idx, TF1
     AliDebug(4, Form("   idx[%d] h[%s] %s", ia, h3->GetName(), h3->GetTitle()));
     TAxis *az = h3->GetZaxis();
     for(Int_t iz=1; iz<=az->GetNbins(); iz++, in++){
     AliDebug(4, Form("   idx[%d] h[%s] %s", ia, h3->GetName(), h3->GetTitle()));
     TAxis *az = h3->GetZaxis();
     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(!(g[0] = (TGraphErrors*)gm->At(in))) return kFALSE;
       if(!(g[1] = (TGraphErrors*)gs->At(in))) return kFALSE;
       az->SetRange(iz, iz);