]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG1/TRD/AliTRDcheckDET.cxx
add V0 task as cuasi-independent performance task
[u/mrichter/AliRoot.git] / PWG1 / TRD / AliTRDcheckDET.cxx
index 749a8c730d2b3c9036e824515a11126a6012babe..759ede6b8d57ddbafe6cc78f1bdb38c6490582a5 100644 (file)
 #include <TF1.h>
 #include <TGaxis.h>
 #include <TGraph.h>
+#include <TGraphErrors.h>
 #include <TLegend.h>
 #include <TLinearFitter.h>
 #include <TMath.h>
 #include <TMap.h>
+#include <TProfile2D.h>
 #include <TObjArray.h>
 #include <TObject.h>
 #include <TObjString.h>
@@ -119,21 +121,12 @@ AliTRDcheckDET::~AliTRDcheckDET(){
   delete fGeo;
 }
 
-//_______________________________________________________
-void AliTRDcheckDET::ConnectInputData(Option_t *opt){
-  //
-  // Connect the Input data with the task
-  //
-  AliTRDrecoTask::ConnectInputData(opt);
-  fEventInfo = dynamic_cast<AliTRDeventInfo *>(GetInputData(2));
-}
-
 //_______________________________________________________
 void AliTRDcheckDET::UserCreateOutputObjects(){
   //
   // Create Output Objects
   //
-  OpenFile(1,"RECREATE");
+  if(!HasFunctorList()) InitFunctorList();
   fContainer = Histos();
   if(!fTriggerNames) fTriggerNames = new TMap();
 }
@@ -144,7 +137,10 @@ void AliTRDcheckDET::UserExec(Option_t *opt){
   // Execution function
   // Filling TRD quality histos
   //
-  if(!HasMCdata() && fEventInfo->GetEventHeader()->GetEventType() != 7) return;        // For real data we select only physical events
+
+  fEventInfo = dynamic_cast<AliTRDeventInfo *>(GetInputData(2));
+  AliDebug(2, Form("EventInfo[%p] Header[%p]", (void*)fEventInfo, (void*)(fEventInfo?fEventInfo->GetEventHeader():NULL)));
+
   AliTRDrecoTask::UserExec(opt);  
   Int_t nTracks = 0;           // Count the number of tracks per event
   Int_t triggermask = fEventInfo->GetEventHeader()->GetTriggerMask();
@@ -210,7 +206,7 @@ Bool_t AliTRDcheckDET::PostProcess(){
   Float_t ok = h->GetBinContent(1);
   Int_t nerr = h->GetNbinsX();
   for(Int_t ierr=nerr; ierr--;){
-    h->SetBinContent(ierr+1, 1.e2*h->GetBinContent(ierr+1)/ok);
+    h->SetBinContent(ierr+1, ok>0.?1.e2*h->GetBinContent(ierr+1)/ok:0.);
   }
   h->SetBinContent(1, 0.);
 
@@ -222,7 +218,7 @@ Bool_t AliTRDcheckDET::PostProcess(){
     Float_t okB = h->GetBinContent(1);
     Int_t nerrB = h->GetNbinsX();
     for(Int_t ierr=nerrB; ierr--;){
-      h->SetBinContent(ierr+1, 1.e2*h->GetBinContent(ierr+1)/okB);
+      h->SetBinContent(ierr+1, okB>0.?1.e2*h->GetBinContent(ierr+1)/okB:0.);
     }
     h->SetBinContent(1, 0.);
   }
@@ -232,30 +228,50 @@ Bool_t AliTRDcheckDET::PostProcess(){
   return kTRUE;
 }
 
+//_______________________________________________________
+void AliTRDcheckDET::MakeSummary(){
+  //
+  // Create summary plots for TRD check DET
+  // This function creates 2 summary plots:
+  // - General Quantities
+  // - PHS
+  // The function will reuse GetRefFigure
+  //
+  
+  TCanvas *cOut = new TCanvas(Form("summary%s1", GetName()), Form("Summary 1 for task %s", GetName()), 1024, 768);
+  cOut->Divide(3,3);
+
+  // Create figures using GetRefFigure
+  cOut->cd(1); GetRefFigure(kFigNtracksEvent);  
+  cOut->cd(2); GetRefFigure(kFigNtracksSector);
+  cOut->cd(3); GetRefFigure(kFigNclustersTrack);
+  cOut->cd(4); GetRefFigure(kFigNclustersTracklet);
+  cOut->cd(5); GetRefFigure(kFigNtrackletsTrack);
+  cOut->cd(6); GetRefFigure(kFigNTrackletsP);
+  cOut->cd(7); GetRefFigure(kFigChargeCluster);
+  cOut->cd(8); GetRefFigure(kFigChargeTracklet);
+  cOut->SaveAs(Form("TRDsummary%s1.gif", GetName()));
+  delete cOut;
+
+  // Second Plot: PHS
+  cOut = new TCanvas(Form("summary%s2", GetName()), Form("Summary 2 for task %s", GetName()), 1024, 512);
+  cOut->cd(); GetRefFigure(kFigPH);
+  cOut->SaveAs(Form("TRDsummary%s2.gif", GetName())); 
+  delete cOut;
+
+  // Third Plot: Mean Number of clusters as function of eta, phi and layer
+   cOut = new TCanvas(Form("summary%s3", GetName()), Form("Summary 3 for task %s", GetName()), 1024, 768);
+  cOut->cd(); MakePlotMeanClustersLayer();
+  cOut->SaveAs(Form("TRDsummary%s3.gif", GetName())); 
+  delete cOut;
+
+}
+
 //_______________________________________________________
 Bool_t AliTRDcheckDET::GetRefFigure(Int_t ifig){
   //
   // Setting Reference Figures
   //
-  enum FigureType_t{
-    kFigNclustersTrack,
-    kFigNclustersTracklet,
-    kFigNtrackletsTrack,
-    kFigNTrackletsP,
-    kFigNtrackletsCross,
-    kFigNtrackletsFindable,
-    kFigNtracksEvent,
-    kFigNtracksSector,
-    kFigTrackStatus,
-    kFigTrackletStatus,
-    kFigChi2,
-    kFigPH,
-    kFigChargeCluster,
-    kFigChargeTracklet,
-    kFigNeventsTrigger,
-    kFigNeventsTriggerTracks,
-    kFigTriggerPurity
-  };
   gPad->SetLogy(0);
   gPad->SetLogx(0);
   TH1 *h = NULL; TObjArray *arr=NULL;
@@ -312,24 +328,25 @@ Bool_t AliTRDcheckDET::GetRefFigure(Int_t ifig){
     return kTRUE;
   case kFigTrackletStatus:
     if(!(arr = dynamic_cast<TObjArray*>(fContainer->At(kTrackletStatus)))) break;
-    leg = new TLegend(.68, .7, .98, .98);
-    leg->SetBorderSize(1);leg->SetFillColor(0);
+    leg = new TLegend(.68, .7, .97, .97);
+    leg->SetBorderSize(0);leg->SetFillStyle(0);
     leg->SetHeader("TRD layer");
-    for(Int_t ily=0; ily<AliTRDgeometry::kNlayer; ily++){
+    for(Int_t ily=AliTRDgeometry::kNlayer; ily--;){
       if(!(h=dynamic_cast<TH1F*>(arr->At(ily)))) continue;
       if(kFIRST){
-        h->Draw("c");
+        h->Draw("pl");
         h->GetXaxis()->SetRangeUser(0.5, -1);
         h->GetYaxis()->CenterTitle();
         kFIRST = kFALSE;
-      } else h->Draw("samec");
-      leg->AddEntry(h, Form("%d", ily), "l");
+      } else h->Draw("samepl");
+      leg->AddEntry(h, Form("ly = %d", ily), "l");
       PutTrendValue(Form("TrackletStatus%d", ily), h->Integral());
     }
     leg->Draw();
     gPad->SetLogy(0);
     return kTRUE;
   case kFigChi2:
+    return kTRUE;
     MakePlotChi2();
     return kTRUE;
   case kFigPH:
@@ -385,6 +402,18 @@ TObjArray *AliTRDcheckDET::Histos(){
   } else h->Reset();
   fContainer->AddAt(h, kNclustersTrack);
 
+  TObjArray *arr = new TObjArray(AliTRDgeometry::kNlayer);
+  arr->SetOwner(kTRUE);  arr->SetName("clusters");
+  fContainer->AddAt(arr, kNclustersLayer);
+  for(Int_t ily=AliTRDgeometry::kNlayer; ily--;){
+    if(!(h = (TProfile2D *)gROOT->FindObject(Form("hNcl%d", ily)))){
+      h = new TProfile2D(Form("hNcl%d", ily), Form("Mean Number of clusters in Layer %d", ily), 100, -1.0, 1.0, 50, -1.1*TMath::Pi(), 1.1*TMath::Pi());
+      h->GetXaxis()->SetTitle("#eta");
+      h->GetYaxis()->SetTitle("#phi");
+    } else h->Reset();
+    arr->AddAt(h, ily);
+  }
+
   if(!(h = (TH1F *)gROOT->FindObject("hNclTls"))){
     h = new TH1F("hNclTls","N_{clusters} / tracklet", 51, -0.5, 50.5);
     h->GetXaxis()->SetTitle("N_{clusters}");
@@ -407,17 +436,16 @@ TObjArray *AliTRDcheckDET::Histos(){
   fContainer->AddAt(h, kNtrackletsSTA);
 
   // Binning for momentum dependent tracklet Plots
-  const Int_t kNPbins = 11;
-  Double_t binTracklets[AliTRDgeometry::kNlayer + 1];
-  for(Int_t il = 0; il <= AliTRDgeometry::kNlayer; il++) binTracklets[il] = 0.5 + il;
-  Double_t binMomentum[kNPbins + 1] = {0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.5, 2., 3., 4., 5., 10};
-
+  const Int_t kNp(30);
+  Float_t P=0.2;
+  Float_t binsP[kNp+1], binsTrklt[AliTRDgeometry::kNlayer+1];
+  for(Int_t i=0;i<kNp+1; i++,P+=(TMath::Exp(i*i*.001)-1.)) binsP[i]=P;
+  for(Int_t il = 0; il <= AliTRDgeometry::kNlayer; il++) binsTrklt[il] = 0.5 + il;
   if(!(h = (TH1F *)gROOT->FindObject("htlsBAR"))){
     // Make tracklets for barrel tracks momentum dependent (if we do not exceed min and max values)
-    h = new TH2F("hNtlsBAR", "N_{tracklets} / track (Barrel)", kNPbins, binMomentum, AliTRDgeometry::kNlayer, binTracklets);
-    h->GetXaxis()->SetTitle("p / GeV/c");
-    h->GetYaxis()->SetTitle("N^{tracklet}");
-    h->GetZaxis()->SetTitle("freq. [%]");
+    h = new TH2F("hNtlsBAR", 
+    "N_{tracklets} / track;p [GeV/c];N^{tracklet};freq. [%]", 
+    kNp, binsP, AliTRDgeometry::kNlayer, binsTrklt);
   }
   fContainer->AddAt(h, kNtrackletsBAR);
 
@@ -460,7 +488,7 @@ TObjArray *AliTRDcheckDET::Histos(){
   }
   fContainer->AddAt(h, kTrackStatus);
 
-  TObjArray *arr = new TObjArray(AliTRDgeometry::kNlayer);
+  arr = new TObjArray(AliTRDgeometry::kNlayer);
   arr->SetOwner(kTRUE);  arr->SetName("TrackletStatus");
   fContainer->AddAt(arr, kTrackletStatus);
   for(Int_t ily=AliTRDgeometry::kNlayer; ily--;){
@@ -477,7 +505,7 @@ TObjArray *AliTRDcheckDET::Histos(){
   }
 
   // <PH> histos
-  arr = new TObjArray(2);
+  arr = new TObjArray(3);
   arr->SetOwner(kTRUE);  arr->SetName("<PH>");
   fContainer->AddAt(arr, kPH);
   if(!(h = (TH1F *)gROOT->FindObject("hPHt"))){
@@ -490,6 +518,12 @@ TObjArray *AliTRDcheckDET::Histos(){
     h = new TProfile("hPHx", "<PH>", 31, -0.08, 4.88);
   else h->Reset();
   arr->AddAt(h, 1);
+  if(!(h = (TH2F *)gROOT->FindObject("hPH2D"))){
+    h = new TH2F("hPH2D", "Charge Distribution / time", 31, -0.5, 30.5, 100, 0, 1024);
+    h->GetXaxis()->SetTitle("Time / 100ns");
+    h->GetYaxis()->SetTitle("Charge / a.u.");
+  } else h->Reset();
+  arr->AddAt(h, 2);
 
   // Chi2 histos
   if(!(h = (TH2S*)gROOT->FindObject("hChi2"))){
@@ -560,7 +594,7 @@ TH1 *AliTRDcheckDET::PlotTrackStatus(const AliTRDtrackV1 *track)
 //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL;
@@ -592,7 +626,7 @@ TH1 *AliTRDcheckDET::PlotTrackletStatus(const AliTRDtrackV1 *track)
 //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TObjArray *arr =NULL;
@@ -619,18 +653,31 @@ TH1 *AliTRDcheckDET::PlotNClustersTracklet(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
+  AliExternalTrackParam *par = fkTrack->GetTrackIn() ? fkTrack->GetTrackIn() : fkTrack->GetTrackOut();
   TH1 *h = NULL;
+  TProfile2D *hlayer = NULL;
+  Double_t eta = 0., phi = 0.;
   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kNclustersTracklet)))){
     AliWarning("No Histogram defined.");
     return NULL;
   }
   AliTRDseedV1 *tracklet = NULL;
+  TObjArray *histosLayer = dynamic_cast<TObjArray *>(fContainer->At(kNclustersLayer));
+  if(!histosLayer){
+    AliWarning("No Histograms for single layer defined");
+  }
   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
     if(!(tracklet = fkTrack->GetTracklet(itl)) || !tracklet->IsOK()) continue;
     h->Fill(tracklet->GetN2());
+    if(histosLayer && par){
+      if((hlayer = dynamic_cast<TProfile2D *>(histosLayer->At(itl)))){
+        GetEtaPhiAt(par, tracklet->GetX0(), eta, phi);
+        hlayer->Fill(eta, phi, tracklet->GetN2());
+      }
+    }
   }
   return h;
 }
@@ -642,7 +689,7 @@ TH1 *AliTRDcheckDET::PlotNClustersTrack(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL;
@@ -654,6 +701,7 @@ TH1 *AliTRDcheckDET::PlotNClustersTrack(const AliTRDtrackV1 *track){
   Int_t nclusters = 0;
   AliTRDseedV1 *tracklet = NULL;
   AliExternalTrackParam *par = fkTrack->GetTrackOut() ? fkTrack->GetTrackOut() : fkTrack->GetTrackIn();
+  if(!par) return NULL;
   Double_t momentumRec = par->P();
   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
     if(!(tracklet = fkTrack->GetTracklet(itl)) || !tracklet->IsOK()) continue;
@@ -698,7 +746,7 @@ TH1 *AliTRDcheckDET::PlotNTrackletsTrack(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL, *hSta = NULL; TH2 *hBarrel = NULL;
@@ -719,53 +767,51 @@ TH1 *AliTRDcheckDET::PlotNTrackletsTrack(const AliTRDtrackV1 *track){
     // Full Barrel Track: Save momentum dependence
     if(!(hBarrel = dynamic_cast<TH2F *>(fContainer->At(kNtrackletsBAR)))){
       AliWarning("Method: Barrel.  Histogram not processed!");
-    } else {
-      AliExternalTrackParam *par = fkTrack->GetTrackOut() ? fkTrack->GetTrackOut() : fkTrack->GetTrackIn();
-      if(!par){
-       AliError("Outer track params missing");
-      } else {
-        p = par->P();
-      }
-      hBarrel->Fill(p, nTracklets);
+      return NULL;
+    }
+    AliExternalTrackParam *par(fkTrack->GetTrackIn());
+    if(!par){
+      AliError("Input track params missing");
+      return NULL;
     }
+    p = par->P(); // p needed later in the debug streaming
+    hBarrel->Fill(p, nTracklets);
   } else {
     // Stand alone Track: momentum dependence not usefull
     method = 0;
     if(!(hSta = dynamic_cast<TH1F *>(fContainer->At(kNtrackletsSTA)))) {
       AliWarning("Method: StandAlone.  Histogram not processed!");
-    } else {
-      hSta->Fill(nTracklets);
+      return NULL;
     }
+    hSta->Fill(nTracklets);
   }
 
   if(DebugLevel() > 2){
     AliTRDseedV1 *tracklet = NULL;
-    Int_t sector = -1;
+    Int_t sector = -1, stack = -1, detector;
     for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
       if(!(tracklet = fkTrack->GetTracklet(itl)) || !(tracklet->IsOK())) continue;
-      sector = fGeo->GetSector(tracklet->GetDetector());
+      detector = tracklet->GetDetector();
+      sector = fGeo->GetSector(detector);
+      stack = fGeo->GetStack(detector);
       break;
     }
     (*DebugStream()) << "NTrackletsTrack"
       << "Sector="      << sector
+      << "Stack="        << stack 
       << "NTracklets="  << nTracklets
       << "Method="      << method
       << "p="           << p
       << "\n";
   }
   if(DebugLevel() > 3){
-    if(nTracklets == 1){
-      // If we have one Tracklet, check in which layer this happens
-      Int_t layer = -1;
-      AliTRDseedV1 *tracklet = NULL;
-      for(Int_t il = 0; il < AliTRDgeometry::kNlayer; il++){
-        if((tracklet = fkTrack->GetTracklet(il)) && tracklet->IsOK()){layer =  il; break;}
-      }
-      if(layer >= 0){
+    AliTRDseedV1 *tracklet = NULL;
+    for(Int_t il = 0; il < AliTRDgeometry::kNlayer; il++){
+      if((tracklet = fkTrack->GetTracklet(il)) && tracklet->IsOK()){
         (*DebugStream()) << "NTrackletsLayer"
-          << "Layer=" << layer
-          << "p=" << p
-          << "\n";
+        << "Layer=" << il
+        << "p=" << p
+        << "\n";
       }
     }
   }
@@ -780,7 +826,7 @@ TH1 *AliTRDcheckDET::PlotNTrackletsRowCross(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL;
@@ -832,7 +878,7 @@ TH1 *AliTRDcheckDET::PlotFindableTracklets(const AliTRDtrackV1 *track){
  
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL;
@@ -930,7 +976,7 @@ TH1 *AliTRDcheckDET::PlotChi2(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL;
@@ -953,14 +999,17 @@ TH1 *AliTRDcheckDET::PlotPHt(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
-  TProfile *h = NULL;
+  TProfile *h = NULL; TH2F *phs2D = NULL;
   if(!(h = dynamic_cast<TProfile *>(((TObjArray*)(fContainer->At(kPH)))->At(0)))){
     AliWarning("No Histogram defined.");
     return NULL;
   }
+  if(!(phs2D = dynamic_cast<TH2F *>(((TObjArray*)(fContainer->At(kPH)))->At(2)))){
+    AliWarning("2D Pulse Height histogram not defined. Histogramm cannot be filled");
+  }
   AliTRDseedV1 *tracklet = NULL;
   AliTRDcluster *c = NULL;
   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
@@ -973,25 +1022,30 @@ TH1 *AliTRDcheckDET::PlotPHt(const AliTRDtrackV1 *track){
       Int_t localtime        = c->GetLocalTimeBin();
       Double_t absoluteCharge = TMath::Abs(c->GetQ());
       h->Fill(localtime, absoluteCharge);
+      phs2D->Fill(localtime, absoluteCharge); 
       if(DebugLevel() > 3){
+        Int_t inChamber = c->IsInChamber() ? 1 : 0;
         Double_t distance[2];
         GetDistanceToTracklet(distance, tracklet, c);
         Float_t theta = TMath::ATan(tracklet->GetZref(1));
         Float_t phi = TMath::ATan(tracklet->GetYref(1));
-        Float_t momentum = 0.;
+        AliExternalTrackParam *trdPar = fkTrack->GetTrackIn();
+        Float_t momentumMC = 0, momentumRec = trdPar ? trdPar->P() : track->P(); // prefer Track Low
         Int_t pdg = 0;
         Int_t kinkIndex = fkESD ? fkESD->GetKinkIndex() : 0;
         UShort_t TPCncls = fkESD ? fkESD->GetTPCncls() : 0;
         if(fkMC){
-          if(fkMC->GetTrackRef()) momentum = fkMC->GetTrackRef()->P();
+          if(fkMC->GetTrackRef()) momentumMC = fkMC->GetTrackRef()->P();
           pdg = fkMC->GetPDG();
         }
         (*DebugStream()) << "PHt"
           << "Detector="       << detector
           << "crossing="       << crossing
+          << "inChamber=" << inChamber
           << "Timebin="                << localtime
           << "Charge="         << absoluteCharge
-          << "momentum="       << momentum
+          << "momentumMC="     << momentumMC
+          << "momentumRec="    << momentumRec
           << "pdg="                            << pdg
           << "theta="                  << theta
           << "phi="                            << phi
@@ -1015,29 +1069,42 @@ TH1 *AliTRDcheckDET::PlotPHx(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
-    return NULL;
+     AliDebug(4, "No Track defined.");
+     return NULL;
   }
   TProfile *h = NULL;
   if(!(h = dynamic_cast<TProfile *>(((TObjArray*)(fContainer->At(kPH)))->At(1)))){
     AliWarning("No Histogram defined.");
     return NULL;
   }
-  Float_t offset = .5*AliTRDgeometry::CamHght();
-  AliTRDseedV1 *tracklet = NULL;
-  AliTRDcluster *c = NULL;
-  Double_t distance = 0;
-  Double_t x, y;
+  AliTRDseedV1 *tracklet(NULL);
+  AliTRDcluster *c(NULL);
+  Double_t xd(0.), dqdl(0.);
+  TVectorD vq(AliTRDseedV1::kNtb), vxd(AliTRDseedV1::kNtb), vdqdl(AliTRDseedV1::kNtb);
   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
     if(!(tracklet = fkTrack->GetTracklet(itl)) || !(tracklet->IsOK())) continue;
-    tracklet->ResetClusterIter();
-    while((c = tracklet->NextCluster())){
+    Int_t det(tracklet->GetDetector());
+    Bool_t rc(tracklet->IsRowCross());
+    for(Int_t ic(0); ic<AliTRDseedV1::kNtb; ic++){
+      Bool_t kFIRST(kFALSE);
+      if(!(c = tracklet->GetClusters(ic))){
+         if(!(c = tracklet->GetClusters(AliTRDseedV1::kNtb+ic))) continue;
+      } else kFIRST=kTRUE;
       if(!IsUsingClustersOutsideChamber() && !c->IsInChamber()) continue;
-      x = c->GetX()-AliTRDcluster::GetXcorr(c->GetLocalTimeBin());
-      y = c->GetY()-AliTRDcluster::GetYcorr(AliTRDgeometry::GetLayer(c->GetDetector()), c->GetCenter());
-
-      distance = tracklet->GetX0() - (c->GetX() + 0.3) + offset;
-      h->Fill(distance, TMath::Abs(c->GetQ()));
+      xd = tracklet->GetX0() - c->GetX(); vxd[ic] = xd;
+      dqdl=tracklet->GetdQdl(ic); vdqdl[ic] = dqdl;
+      vq[ic]=c->GetQ();
+      if(kFIRST && (c = tracklet->GetClusters(AliTRDseedV1::kNtb+ic))) vq[ic]+=c->GetQ();
+      h->Fill(xd, dqdl);
+    }
+    if(DebugLevel() > 3){
+      (*DebugStream()) << "PHx"
+        << "det="  << det
+        << "rc="   << rc
+        << "xd="   << &vxd
+        << "q="    << &vq
+        << "dqdl=" << &vdqdl
+        << "\n";
     }
   }  
   return h;
@@ -1050,7 +1117,7 @@ TH1 *AliTRDcheckDET::PlotChargeCluster(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL;
@@ -1062,9 +1129,14 @@ TH1 *AliTRDcheckDET::PlotChargeCluster(const AliTRDtrackV1 *track){
   AliTRDcluster *c = NULL;
   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
     if(!(tracklet = fkTrack->GetTracklet(itl)) || !tracklet->IsOK())continue;
-    for(Int_t itime = 0; itime < AliTRDtrackerV1::GetNTimeBins(); itime++){
-      if(!(c = tracklet->GetClusters(itime))) continue;
-      h->Fill(c->GetQ());
+    for(Int_t ic(0); ic < AliTRDseedV1::kNtb; ic++){
+      Bool_t kFIRST(kFALSE);
+      if(!(c = tracklet->GetClusters(ic))) {
+        if(!(c = tracklet->GetClusters(AliTRDseedV1::kNtb+ic))) continue;
+      } else kFIRST = kTRUE;
+      Float_t q(c->GetQ());
+      if(kFIRST && (c = tracklet->GetClusters(AliTRDseedV1::kNtb+ic))) q+=c->GetQ();
+      h->Fill(q);
     }
   }
   return h;
@@ -1077,7 +1149,7 @@ TH1 *AliTRDcheckDET::PlotChargeTracklet(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL;
@@ -1134,7 +1206,7 @@ TH1 *AliTRDcheckDET::PlotNTracksSector(const AliTRDtrackV1 *track){
   //
   if(track) fkTrack = track;
   if(!fkTrack){
-    AliWarning("No Track defined.");
+    AliDebug(4, "No Track defined.");
     return NULL;
   }
   TH1 *h = NULL;
@@ -1173,6 +1245,20 @@ void AliTRDcheckDET::GetDistanceToTracklet(Double_t *dist, AliTRDseedV1 * const
   dist[1] = c->GetZ() - tracklet->GetZat(x);
 }
 
+//________________________________________________________
+void AliTRDcheckDET::GetEtaPhiAt(AliExternalTrackParam *track, Double_t x, Double_t &eta, Double_t &phi){
+  //
+  // Get phi and eta at a given radial position
+  // 
+  AliExternalTrackParam workpar(*track);
+
+  Double_t posLocal[3];
+  Bool_t sucPos = workpar.GetXYZAt(x, fEventInfo->GetRunInfo()->GetMagneticField(), posLocal);
+  Double_t sagPhi = sucPos ? TMath::ATan2(posLocal[1], posLocal[0]) : 0.;
+  phi = sagPhi;
+  eta = workpar.Eta();
+}
+
 
 //_______________________________________________________
 TH1* AliTRDcheckDET::MakePlotChi2()
@@ -1182,8 +1268,11 @@ TH1* AliTRDcheckDET::MakePlotChi2()
 // 
 // Alex Bercuci <A.Bercuci@gsi.de>
 
+  return NULL;
+
   TH2S *h2 = (TH2S*)fContainer->At(kChi2);
   TF1 f("fChi2", "[0]*pow(x, [1]-1)*exp(-0.5*x)", 0., 50.);
+  f.SetParLimits(1,1, 1e100);
   TLegend *leg = new TLegend(.7,.7,.95,.95);
   leg->SetBorderSize(1); leg->SetHeader("Tracklets per Track");
   TH1D *h1 = NULL;
@@ -1261,43 +1350,74 @@ void AliTRDcheckDET::MakePlotnTrackletsVsP(){
   //
   // Plot abundance of tracks with number of tracklets as function of momentum
   //
-  TH1 *hLayer[6];
+
+
+
+
+  Color_t color[AliTRDgeometry::kNlayer] = {kBlue, kOrange, kBlack, kGreen, kCyan, kRed};
+  TH1 *h(NULL); TGraphErrors *g[AliTRDgeometry::kNlayer];
+  for(Int_t itl(0); itl<AliTRDgeometry::kNlayer; itl++){
+    g[itl] = new TGraphErrors();
+    g[itl]->SetLineColor(color[itl]);
+    g[itl]->SetMarkerColor(color[itl]);
+    g[itl]->SetMarkerStyle(20 + itl);
+  }
+
   TH2 *hBar = (TH2F *)fContainer->FindObject("hNtlsBAR");
-  TLegend *leg = new TLegend(0.13, 0.75, 0.2, 0.9);
+  TAxis *ax(hBar->GetXaxis());
+  Int_t np(ax->GetNbins());
+  for(Int_t ipBin(1); ipBin<np; ipBin++){
+    h = hBar->ProjectionY("npBin", ipBin, ipBin);
+    if(!Int_t(h->Integral())) continue;
+    h->Scale(100./h->Integral());
+    Float_t p(ax->GetBinCenter(ipBin)); 
+    Float_t dp(ax->GetBinWidth(ipBin)); 
+    Int_t ip(g[0]->GetN());
+    for(Int_t itl(AliTRDgeometry::kNlayer); itl--;){
+      g[itl]->SetPoint(ip, p, h->GetBinContent(itl+1));
+      g[itl]->SetPointError(ip, dp/3.46, h->GetBinError(itl+1));
+    }
+  }
+
+  TLegend *leg = new TLegend(0.76, 0.6, 1., 0.9);
   leg->SetBorderSize(0);
   leg->SetHeader("Tracklet/Track");
   leg->SetFillStyle(0);
-  Color_t color[6] = {kBlue, kOrange, kBlack, kGreen, kCyan, kRed};
-  Bool_t first = kTRUE;
-  for(Int_t itl = 1; itl <= 6; itl++){
-    hLayer[itl-1]= hBar->ProjectionX(Form("ntl%d", itl), itl, itl);
-    hLayer[itl-1]->Scale(100./hLayer[itl-1]->Integral());
-    hLayer[itl-1]->SetLineColor(color[itl-1]);
-    hLayer[itl-1]->GetYaxis()->SetRangeUser(0., 60.);
-    hLayer[itl-1]->GetXaxis()->SetMoreLogLabels();
-    hLayer[itl-1]->SetYTitle("Prob. [%]");
-    if(first){
-      hLayer[itl-1]->Draw("c");
-      first=kFALSE;
-    } else
-      hLayer[itl-1]->Draw("csame");
-    leg->AddEntry(hLayer[itl-1], Form("n = %d", itl),"l");
+  h = hBar->ProjectionX("npxBin"); h->Reset();
+  h->SetTitle("");
+  h->GetYaxis()->SetRangeUser(1., 99.);
+  h->GetYaxis()->SetMoreLogLabels();
+  h->GetYaxis()->CenterTitle();
+  h->GetYaxis()->SetTitleOffset(1.2);
+  h->SetYTitle("Prob. [%]");
+  h->GetXaxis()->SetRangeUser(0.4, 12.);
+  h->GetXaxis()->SetMoreLogLabels();
+  h->GetXaxis()->CenterTitle();
+  h->Draw("p");
+  for(Int_t itl(AliTRDgeometry::kNlayer); itl--;){
+    g[itl]->Draw("pc");
+    leg->AddEntry(g[itl], Form("n = %d", itl+1),"pl");
   }
+
   leg->Draw();
-  gPad->Update();
+  gPad->SetLogx();gPad->SetLogy();
 }
 
 //________________________________________________________
-TH1* AliTRDcheckDET::MakePlotPulseHeight(){
+Bool_t AliTRDcheckDET::MakePlotPulseHeight(){
   //
   // Create Plot of the Pluse Height Spectrum
   //
+  TCanvas *output = gPad->GetCanvas();
+  output->Divide(2);
+  output->cd(1);
   TH1 *h, *h1, *h2;
   TObjArray *arr = (TObjArray*)fContainer->FindObject("<PH>");
   h = (TH1F*)arr->At(0);
   h->SetMarkerStyle(24);
   h->SetMarkerColor(kBlack);
   h->SetLineColor(kBlack);
+  h->GetYaxis()->SetTitleOffset(1.5);
   h->Draw("e1");
   // Trending for the pulse height: plateau value, slope and timebin of the maximum
   TLinearFitter fit(1,"pol1");
@@ -1334,7 +1454,34 @@ TH1* AliTRDcheckDET::MakePlotPulseHeight(){
   axis->SetTextColor(kBlue);
   axis->SetTitle("x_{0}-x_{c} [cm]");
   axis->Draw();
-  return h1;
+
+  output->cd(2);
+  TH2 *ph2d = (TH2F *)arr->At(2);
+  ph2d->GetYaxis()->SetTitleOffset(1.8);
+  ph2d->SetStats(kFALSE);
+  ph2d->Draw("colz");
+  return kTRUE;
+}
+
+//________________________________________________________
+void AliTRDcheckDET::MakePlotMeanClustersLayer(){
+  //
+  // Create Summary plot for the mean number of clusters per layer
+  //
+  TCanvas *output = gPad->GetCanvas();
+  output->Divide(3,2);
+  TObjArray *histos = (TObjArray *)fContainer->At(kNclustersLayer);
+  if(!histos){
+    AliWarning("Histos for each layer not found");
+    return;
+  }
+  TProfile2D *hlayer = NULL;
+  for(Int_t ily = 0; ily < AliTRDgeometry::kNlayer; ily++){
+    hlayer = dynamic_cast<TProfile2D *>(histos->At(ily));
+    output->cd(ily + 1);
+    gPad->SetGrid(0,0);
+    hlayer->Draw("colz");
+  }
 }
 
 //________________________________________________________