add new mergeable classes for chamber status and trigger statistics
[u/mrichter/AliRoot.git] / PWGPP / TRD / AliTRDrecoTask.cxx
index ee461d8..65b4b49 100644 (file)
@@ -37,6 +37,7 @@
 #include "AliAnalysisManager.h"\r
 #include "AliExternalTrackParam.h"\r
 \r
+#include "info/AliTRDchmbInfo.h"\r
 #include "info/AliTRDeventInfo.h"\r
 #include "info/AliTRDtrendingManager.h"\r
 #include "AliTRDrecoTask.h"\r
@@ -62,9 +63,11 @@ AliTRDrecoTask::AliTRDrecoTask()
   ,fkMC(NULL)\r
   ,fkESD(NULL)\r
   ,fSpecies(-6)\r
+  ,fTriggerSlot(-1)\r
   ,fPt(-1.)\r
   ,fPhi(0.)\r
   ,fEta(0.)\r
+  ,fTriggerList(NULL)\r
   ,fPlotFuncList(NULL)\r
   ,fDetFuncList(NULL)\r
   ,fRunTerminate(kFALSE)\r
@@ -88,9 +91,11 @@ AliTRDrecoTask::AliTRDrecoTask(const char *name, const char *title)
   ,fkMC(NULL)\r
   ,fkESD(NULL)\r
   ,fSpecies(-6)\r
+  ,fTriggerSlot(-1)\r
   ,fPt(-1.)\r
   ,fPhi(0.)\r
   ,fEta(0.)\r
+  ,fTriggerList(NULL)\r
   ,fPlotFuncList(NULL)\r
   ,fDetFuncList(NULL)\r
   ,fRunTerminate(kFALSE)\r
@@ -134,6 +139,7 @@ AliTRDrecoTask::~AliTRDrecoTask()
     fDets = NULL;\r
   }\r
   if(fDetsV) delete fDetsV; fDetsV=NULL;\r
+  if(fTriggerList){fTriggerList->Delete(); delete fTriggerList;}\r
 \r
   if(fContainer && !(AliAnalysisManager::GetAnalysisManager() && AliAnalysisManager::GetAnalysisManager()->IsProofMode())){\r
     if(fContainer->IsOwner()) fContainer->Delete();\r
@@ -185,6 +191,18 @@ void AliTRDrecoTask::UserExec(Option_t *)
 \r
   fTracks   = dynamic_cast<TObjArray *>(GetInputData(1));\r
   fEvent    = dynamic_cast<AliTRDeventInfo *>(GetInputData(2));\r
+  fTriggerSlot=0;\r
+  if(fTriggerList){\r
+    for(Int_t itrig(0); itrig<fTriggerList->GetEntries(); itrig++){\r
+      if(!fEvent->GetFiredTriggerClasses().Contains(((TObjString*)(*fTriggerList)[itrig])->GetName())) continue;\r
+      //printf("\"%s\" selected\n", ((TObjString*)(*fTriggerList)[itrig])->GetName());\r
+      SETBIT(fTriggerSlot,itrig);\r
+    }\r
+    if(!fTriggerSlot){\r
+      AliDebug(2, Form("Triggers[%s] not used for %s", fEvent->GetFiredTriggerClasses().Data(),  GetName()));\r
+      return;\r
+    }\r
+  }\r
   fClusters = dynamic_cast<TObjArray*>(GetInputData(3));\r
 \r
   if(!fPlotFuncList){\r
@@ -317,14 +335,15 @@ Bool_t AliTRDrecoTask::LoadDetectorMap(const Char_t *file, const Char_t *dir)
     AliWarning("Missing TRDinfoGen container.");\r
     return kFALSE;\r
   }\r
-  TObjArray *dets = (TObjArray*)info->FindObject("Chambers");\r
+  TObjArray *dets = (TObjArray*)info->FindObject("Chambers Status");\r
   if(!dets){\r
-    TVector *vdets = (TVector*)info->At(4);\r
-    if(!vdets){\r
-      AliWarning("Missing detector map from TRDinfoGen results.");\r
-      return kFALSE;\r
-    } else fDetsV = (TVector*)vdets->Clone();\r
-  } else fDets = (TObjArray*)dets->Clone("Chambers");\r
+    if(strcmp("TObjArray", info->At(4)->IsA()->GetName())) AliError("Looking for old style chamber status map. Failed.");\r
+    else {\r
+      AliWarning("Looking for old style chamber status map.");\r
+      TObjArray *vdets = (TObjArray*)info->At(4);\r
+      fDetsV = (TObjArray*)vdets->Clone();\r
+    }\r
+  } else fDets = (TObjArray*)dets->Clone();\r
   gFile->Close();\r
   return kTRUE;\r
 }\r
@@ -369,91 +388,74 @@ void AliTRDrecoTask::MakeDetectorPlot(Int_t ly, const Option_t *opt)
 // based on info collected by AliTRDinfoGen\r
 \r
   if(!fDets){\r
-    AliWarning("OLD Detector map and status not available. Try NEW");\r
-    MakeDetectorPlotNEW(ly, opt);\r
+    AliWarning("NEW Detector map and status not available. Try OLD");\r
+    MakeDetectorPlotOLD(ly, opt);\r
     return;\r
   }\r
-  Float_t xmin(0.), xmax(0.);\r
-  TBox *gdet = new TBox();\r
-  gdet->SetLineColor(kBlack);gdet->SetFillColor(kBlack);\r
-  Int_t style[] = {0, 3003};\r
-  for(Int_t idet(0); idet<540; idet++){\r
-    if(idet%6 != ly) continue;\r
-    TVectorF *det((TVectorF*)fDets->At(idet));\r
-    if(!det) continue;\r
-    Int_t iopt = Int_t((*det)[4]);\r
-    if(strcmp(opt, "eta")==0){\r
-      xmin=(*det)[0]; xmax=(*det)[2];\r
-    } else if(strcmp(opt, "pad")==0){\r
-      Int_t stk(AliTRDgeometry::GetStack(idet));\r
-      xmin=-0.6+16*(4-stk)-(stk<2?4:0); xmax=xmin+(stk==2?12:16)-0.2;\r
-    } else continue;\r
-    AliDebug(2, Form("det[%03d] 0[%+4.1f(%+4.1f) %+4.1f] 1[%+4.1f(%+4.1f) %+4.1f] opt[%d]", idet, xmin, (*det)[0], (*det)[1], xmax, (*det)[2], (*det)[3], iopt));\r
-    if(iopt==1){\r
-      gdet->SetFillStyle(style[1]);gdet->SetFillColor(kBlack);\r
-      gdet->DrawBox(xmin, (*det)[1], xmax, (*det)[3]);\r
-    } else {\r
-      gdet->SetFillStyle(style[0]);\r
-      gdet->DrawBox(xmin, (*det)[1], xmax, (*det)[3]);\r
-      if(iopt==2){\r
-        gdet->SetFillStyle(style[1]);gdet->SetFillColor(kGreen);\r
-        gdet->DrawBox(xmin, (*det)[1], xmax, 0.5*((*det)[3]+(*det)[1]));\r
-      } else if(iopt==3){\r
-        gdet->SetFillStyle(style[1]);gdet->SetFillColor(kRed);\r
-        gdet->DrawBox(xmin, 0.5*((*det)[3]+(*det)[1]), xmax, (*det)[3]);\r
-      } else if(iopt!=0) AliError(Form("Wrong chmb. status[%d] for det[%03d]", iopt, idet));\r
-    }\r
+  AliTRDchmbInfo *ci(NULL);\r
+  for(Int_t idet(0); idet<fDets->GetEntriesFast(); idet++){\r
+    if(!(ci = (AliTRDchmbInfo*)fDets->At(idet))) continue;\r
+    if(AliTRDgeometry::GetLayer(ci->GetDetector()) != ly) continue;\r
+    ci->Draw(opt);\r
   }\r
+  \r
   Float_t dsm = TMath::TwoPi()/AliTRDgeometry::kNsector;\r
-  xmin=0.;\r
-  if(strcmp(opt, "pad")==0) xmin=38.;\r
-  TLatex *sm = new TLatex(); sm->SetTextAlign(22);sm->SetTextColor(0); sm->SetTextFont(32);sm->SetTextSize(0.03);\r
-  for(Int_t is(0); is<AliTRDgeometry::kNsector; is++) sm->DrawLatex(xmin, -TMath::Pi()+(is+0.5)*dsm, Form("%02d", is>=9?(is-9):(is+9)));\r
+  Float_t xmed=0.;\r
+  if(strcmp(opt, "pad")==0) xmed=38.;\r
+  TLatex *sm = new TLatex(); sm->SetTextAlign(22);sm->SetTextColor(kBlack); sm->SetTextFont(32);sm->SetTextSize(0.03);\r
+  for(Int_t is(0); is<AliTRDgeometry::kNsector; is++) sm->DrawLatex(xmed, -TMath::Pi()+(is+0.5)*dsm, Form("%02d", is>=9?(is-9):(is+9)));\r
 }\r
 \r
 //_______________________________________________________\r
-void AliTRDrecoTask::MakeDetectorPlotNEW(Int_t ly, const Option_t *opt)\r
+void AliTRDrecoTask::MakeDetectorPlotOLD(Int_t ly, const Option_t *opt)\r
 {\r
 // Draw chamber boundaries in eta/phi plots with misalignments\r
-// based on info collected by AliTRDinfoGen NEW data storage\r
+// based on info collected by AliTRDinfoGen OLD data storage\r
 \r
   if(!fDetsV){\r
-    AliWarning("NEW Detector map and status not available.");\r
+    AliError("OLD Detector map and status not available.");\r
+    return;\r
+  }\r
+  if(!fDetsV->GetEntries()){\r
+    AliError("OLD Detector map and status not filled.");\r
     return;\r
   }\r
+\r
   Float_t xmin(0.), xmax(0.);\r
   TBox *gdet = new TBox();\r
   gdet->SetLineColor(kBlack);gdet->SetFillColor(kBlack);\r
   Int_t style[] = {0, 3003};\r
-  for(Int_t idet(0), jdet(0); idet<AliTRDgeometry::kNdet; idet++, jdet+=5){\r
+  for(Int_t idet(0); idet<540; idet++){\r
     if(idet%6 != ly) continue;\r
-    Int_t iopt = Int_t((*fDetsV)[jdet+4]);\r
+    TVectorF *det((TVectorF*)fDetsV->At(idet));\r
+    if(!det) continue;\r
+    Int_t iopt = Int_t((*det)[4]);\r
     if(strcmp(opt, "eta")==0){\r
-      xmin=(*fDetsV)[jdet+0]; xmax=(*fDetsV)[jdet+2];\r
+      xmin=(*det)[0]; xmax=(*det)[2];\r
     } else if(strcmp(opt, "pad")==0){\r
       Int_t stk(AliTRDgeometry::GetStack(idet));\r
       xmin=-0.6+16*(4-stk)-(stk<2?4:0); xmax=xmin+(stk==2?12:16)-0.2;\r
     } else continue;\r
-    AliDebug(2, Form("det[%03d] 0[%+4.1f(%+4.1f) %+4.1f] 1[%+4.1f(%+4.1f) %+4.1f] opt[%d]", idet, xmin, (*fDetsV)[jdet+0], (*fDetsV)[jdet+1], xmax, (*fDetsV)[jdet+2], (*fDetsV)[jdet+3], iopt));\r
+    AliDebug(2, Form("det[%03d] 0[%+4.1f(%+4.1f) %+4.1f] 1[%+4.1f(%+4.1f) %+4.1f] opt[%d]", idet, xmin, (*det)[0], (*det)[1], xmax, (*det)[2], (*det)[3], iopt));\r
     if(iopt==1){\r
       gdet->SetFillStyle(style[1]);gdet->SetFillColor(kBlack);\r
-      gdet->DrawBox(xmin, (*fDetsV)[jdet+1], xmax, (*fDetsV)[jdet+3]);\r
+      gdet->DrawBox(xmin, (*det)[1], xmax, (*det)[3]);\r
     } else {\r
       gdet->SetFillStyle(style[0]);\r
-      gdet->DrawBox(xmin, (*fDetsV)[jdet+1], xmax, (*fDetsV)[jdet+3]);\r
+      gdet->DrawBox(xmin, (*det)[1], xmax, (*det)[3]);\r
       if(iopt==2){\r
         gdet->SetFillStyle(style[1]);gdet->SetFillColor(kGreen);\r
-        gdet->DrawBox(xmin, (*fDetsV)[jdet+1], xmax, 0.5*((*fDetsV)[jdet+3]+(*fDetsV)[jdet+1]));\r
+        gdet->DrawBox(xmin, (*det)[1], xmax, 0.5*((*det)[3]+(*det)[1]));\r
       } else if(iopt==3){\r
         gdet->SetFillStyle(style[1]);gdet->SetFillColor(kRed);\r
-        gdet->DrawBox(xmin, 0.5*((*fDetsV)[jdet+3]+(*fDetsV)[jdet+1]), xmax, (*fDetsV)[jdet+3]);\r
+        gdet->DrawBox(xmin, 0.5*((*det)[3]+(*det)[1]), xmax, (*det)[3]);\r
       } else if(iopt!=0) AliError(Form("Wrong chmb. status[%d] for det[%03d]", iopt, idet));\r
     }\r
   }\r
   Float_t dsm = TMath::TwoPi()/AliTRDgeometry::kNsector;\r
   xmin=0.;\r
   if(strcmp(opt, "pad")==0) xmin=38.;\r
-  TLatex *sm = new TLatex(); sm->SetTextAlign(22);sm->SetTextColor(0); sm->SetTextFont(32);sm->SetTextSize(0.03);\r
+  TLatex *sm = new TLatex(); sm->SetTextAlign(22);sm->SetTextColor(kBlack); sm->SetTextFont(32);sm->SetTextSize(0.03);\r
   for(Int_t is(0); is<AliTRDgeometry::kNsector; is++) sm->DrawLatex(xmin, -TMath::Pi()+(is+0.5)*dsm, Form("%02d", is>=9?(is-9):(is+9)));\r
 }\r
 \r
@@ -730,6 +732,7 @@ TH2* AliTRDrecoTask::AliTRDrecoProjection::Projection2D(const Int_t nstat, const
   h2 = new TH2F(Form("%s_2D", fH->GetName()),\r
             Form("%s;%s;%s;%s(%s) %s", fH->GetTitle(), ax->GetTitle(), ay->GetTitle(), title[mid], nt>0?(*tokenTitle)[0]->GetName():"", nt>1?(*tokenTitle)[1]->GetName():""),\r
             nx, ax->GetXmin(), ax->GetXmax(), ny, ay->GetXmin(), ay->GetXmax());\r
+  tokenTitle->Delete(); delete tokenTitle;\r
   h2->SetContour(ncol);\r
   h2->GetZaxis()->CenterTitle();\r
   h2->GetZaxis()->SetTitleOffset(1.4);\r
@@ -789,5 +792,17 @@ void AliTRDrecoTask::AliTRDrecoProjection::SetRebinStrategy(Int_t n, Int_t rebx[
   fRebinY = new Int_t[n]; memcpy(fRebinY, reby, n*sizeof(Int_t));\r
 }\r
 \r
+//________________________________________________________\r
+void AliTRDrecoTask::SetTriggerList(const Char_t *tl)\r
+{\r
+// Store list of triggers to be monitored\r
+  TString stl(tl);\r
+  if(fTriggerList){ fTriggerList->Delete(); delete fTriggerList;}\r
+  TObjArray *atl = stl.Tokenize(" ");\r
+  fTriggerList = (TObjArray*)atl->Clone("");\r
+  atl->Delete(); delete atl;\r
+  AliInfo("Running only for triggers::");\r
+  fTriggerList->Print();\r
+}\r
 \r
 \r