Update by Sylwester
authorcblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 7 May 2008 09:33:17 +0000 (09:33 +0000)
committercblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 7 May 2008 09:33:17 +0000 (09:33 +0000)
TRD/AliTRDqaBlackEvents.cxx
TRD/AliTRDqaBlackEvents.h

index 9e1e959..0e779a7 100644 (file)
@@ -26,7 +26,8 @@
 \r
 #include "TH1D.h"\r
 #include "TH2D.h"\r
-#include "TH3D.h"\r
+#include "TH2S.h"\r
+#include "TH3F.h"\r
 #include "TF1.h"\r
 #include "TFile.h"\r
 #include "TCanvas.h"\r
 \r
 ClassImp(AliTRDqaBlackEvents)\r
 \r
-\r
 ///////////////////////////////////////////////////////////////////////////////////////////////////\r
 \r
 AliTRDqaBlackEvents::AliTRDqaBlackEvents() \r
   :TObject() \r
   ,fnEvents(0)\r
+  ,fCreateFull(0)\r
+  ,fThresh(0)\r
+  ,fCount(0)\r
   ,fOccupancy(0)\r
+  ,fDetRob(0)\r
+  ,fTBEvent(0)\r
   ,fFitType(0)\r
   ,fMinNoise(0.5)\r
   ,fMaxNoise(2) \r
@@ -62,7 +67,12 @@ AliTRDqaBlackEvents::AliTRDqaBlackEvents()
 AliTRDqaBlackEvents::AliTRDqaBlackEvents(const AliTRDqaBlackEvents &qa) \r
   :TObject(qa) \r
   ,fnEvents(0)\r
+  ,fCreateFull(0)\r
+  ,fThresh(0)\r
+  ,fCount(0)\r
   ,fOccupancy(0)\r
+  ,fDetRob(0)\r
+  ,fTBEvent(0)\r
   ,fFitType(0)\r
   ,fMinNoise(0.5)\r
   ,fMaxNoise(2) \r
@@ -86,9 +96,10 @@ void AliTRDqaBlackEvents::Init()
 \r
   fnEvents = 0;\r
 \r
-  for(Int_t i=0; i<540; i++) {\r
+  // histograms for chambers\r
+  for(Int_t i=0; i<kDET; i++) {\r
     fNPoint[i]  = new TH2D(Form("entries_%d", i), "",  16, -0.5, 15.5, 144, -0.5, 143.5);\r
-    fData[i]    = new TH3D(Form("data_%d", i), "", 16, -0.5, 15.5, 144, -0.5, 143.5, 50, -0.5, 49.5);\r
+    fData[i]    = new TH3F(Form("data_%d", i), "", 16, -0.5, 15.5, 144, -0.5, 143.5, 50, -0.5, 49.5);\r
     fChPed[i]   = new TH2D(Form("ped_%d", i), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
     fChNoise[i] = new TH2D(Form("noise_%d", i), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
     fPed[i]     = new TH1D(Form("pedDist_%d", i), ";pedestals (ADC counts)", 100, 5, 15);\r
@@ -99,7 +110,14 @@ void AliTRDqaBlackEvents::Init()
     fnEntriesRM[i] = new TH2D(Form("entriesRM_%d", i), ";ROB,MCM", 8, -0.5, 7.5, 16, -0.5, 15.5);\r
   }\r
 \r
+  // histogram for each MCM\r
+  for(Int_t i=0; i < kDET * kROB * kMCM; i++)\r
+    fFullCounter[i] = 0;\r
+\r
+  // histograms from the whole detector\r
   fOccupancy = new TH1D("occupancy", "", 20, -0.5, 19.5);\r
+  fDetRob    = new TH2D("DetRob", ";detector;ROB", kDET, -0.5, 539.5, 8, -0.5, 7.5);\r
+  fTBEvent   = new TH2D("tbEvent", ";event ID;time bin", 100, -0.5, 99.5, 30, -0.5, 29.5);\r
 \r
   //Info("Init", "Done");\r
 }\r
@@ -113,7 +131,7 @@ void AliTRDqaBlackEvents::Reset()
   // Resets the histograms\r
   //\r
 \r
-  for(Int_t i=0; i<540; i++) {\r
+  for(Int_t i=0; i<kDET; i++) {\r
     fData[i]->Reset();\r
     fChPed[i]->Reset();\r
     fChNoise[i]->Reset();\r
@@ -128,16 +146,17 @@ Int_t AliTRDqaBlackEvents::AddEvent(AliTRDrawStreamTB *data)
   // Add an event\r
   //\r
 \r
+  // structure to keep track if particular chanel is used\r
+  Char_t isUsed[kDET][kCOL][kPAD]; \r
+  for(Int_t i=0; i<kDET; i++)\r
+    for(Int_t j=0; j<kCOL; j++)\r
+      for(Int_t k=0; k<kPAD; k++)\r
+       isUsed[i][j][k] = 0;\r
   \r
-  Char_t isUsed[540][16][144]; \r
-  for(Int_t i=0; i<540; i++)\r
-    for(Int_t j=0; j<16; j++)\r
-      for(Int_t k=0; k<144; k++)\r
-       isUsed[i][j][k] = 0;\r
\r
   Int_t nb = 0;\r
   Int_t rob_last = -1;\r
   Int_t mcm_last = -1;\r
+  Int_t sm_01 = -1;\r
 \r
   while (data->Next()) {\r
 \r
@@ -148,43 +167,76 @@ Int_t AliTRDqaBlackEvents::AddEvent(AliTRDrawStreamTB *data)
 \r
     Int_t rob = data->GetROB();\r
     Int_t mcm = data->GetMCM();\r
+    Int_t adc = data->GetADC();\r
 \r
     Int_t *sig = data->GetSignals();\r
     nb++;\r
 \r
-    //printf("det = %d\n", det);\r
+    // ugly hook\r
+    if (det == 0 && row == 0 && col == 0) {\r
+      if (sm_01 > -1) printf("\t\t\t!!! !!! second data set !!! !!!\n");\r
+      sm_01++; \r
+    }\r
+\r
+    det += sm_01 * 30;   /// ugly\r
+\r
+    // memory coruption protection\r
+    if (det<0 || det>=kDET) continue;\r
     \r
-    if (det<0 || det>=540) continue;\r
+    // check the ROBs\r
+    fDetRob->Fill(det, rob, 1./(kMCM*18));\r
 \r
     isUsed[det][row][col]++;\r
 \r
+    // check if mcm signal is continuus\r
     if ((rob_last != rob) || (mcm_last != mcm)) {\r
       rob_last = rob;\r
       mcm_last = mcm;\r
       fnEntriesRM[det]->Fill(rob,mcm);\r
     }\r
-\r
-    // if (!isUsed[det][data->GetRow()][data->GetCol()]) {\r
-    //  isUsed[det][data->GetRow()][data->GetCol()] = 1;\r
-    //  continue;\r
-    // }\r
-\r
+    \r
+    // number of entries for each channels\r
     fNPoint[det]->Fill(row, col);\r
     \r
-    for(Int_t k=0; k<30; k++) { /// to be corrected\r
+\r
+    // create a structure for an MCM if needed\r
+    Int_t mcmIndex = det * (kMCM * kROB) + rob * kMCM + mcm;\r
+    if (fCreateFull && !fFullSignal[mcmIndex])\r
+      fFullSignal[mcmIndex] = new TH2S(Form("mcm_%d_%d_%d", det, rob, mcm), \r
+                                      Form("mcm-%d-%d-%d;ADC;time bin", det, rob,mcm),\r
+                                      21, -0.5, 20.5, 30, -0.5, 29.5);\r
+    \r
+\r
+    // loop over Time Bins and fill histograms\r
+    for(Int_t k=0; k<kTB; k++) { /// to be corrected\r
+\r
+      //if (sig[k] < 1) \r
+      //printf("det = %d rob = %d mcm = %d adc = %d k = %d S = %d\n", det, rob, mcm, adc, k, sig[k]);\r
+      \r
       fSignal[det]->Fill(sig[k]);\r
       fData[det]->Fill(row, col, sig[k]);\r
+      \r
+      // check if data strange enought\r
+      if (fCreateFull && fFullSignal[mcmIndex]) {\r
+       if (sig[k] > fThresh || sig[k] < 1) fFullCounter[mcmIndex]++;\r
+       fFullSignal[mcmIndex]->Fill(adc, k, sig[k]);\r
+      }\r
+      \r
+      // noisy chamber\r
+      if (det == 29) {\r
+       fTBEvent->Fill(fnEvents, k, sig[k]);\r
+      }\r
+\r
     }\r
   }\r
   \r
-  for(Int_t i=0; i<540; i++) {\r
-    if (i != 0 && i != 8) continue;\r
-    for(Int_t j=0; j<16; j++)\r
-      for(Int_t k=0; k<144; k++)\r
+  // is the dead-alive status changing during the run\r
+  for(Int_t i=0; i<kDET; i++) {\r
+    for(Int_t j=0; j<kCOL; j++)\r
+      for(Int_t k=0; k<kPAD; k++)\r
        fOccupancy->Fill(isUsed[i][j][k]);\r
   }\r
 \r
-  \r
   fnEvents++;\r
   return nb;\r
 }\r
@@ -197,13 +249,13 @@ void AliTRDqaBlackEvents::Process(const char *filename)
   // Process something\r
   //\r
 \r
-  Int_t map[540];\r
+  Int_t map[kDET];\r
   \r
   TH1D *hist = new TH1D("fitSignal", "", 50, -0.5, 49.5);\r
   TF1 *fit = new TF1("fit", "gaus(0)", 0, 20);\r
   fit->SetParameters(1e3, 10, 1);\r
     \r
-  for(Int_t i=0; i<540; i++) {\r
+  for(Int_t i=0; i<kDET; i++) {\r
     \r
     map[i] = 0;\r
     if (fData[i]->GetSum() < 10) continue;\r
@@ -261,7 +313,7 @@ void AliTRDqaBlackEvents::Process(const char *filename)
 \r
   // normalize number of entries histos\r
   Int_t max = 0;\r
-  for(Int_t i=0; i<540; i++) { \r
+  for(Int_t i=0; i<kDET; i++) { \r
     if (!map[i]) continue;\r
     for(Int_t j=0; j<fNPoint[i]->GetXaxis()->GetNbins(); j++) {\r
       for(Int_t k=0; k<fNPoint[i]->GetYaxis()->GetNbins(); k++) {\r
@@ -272,11 +324,14 @@ void AliTRDqaBlackEvents::Process(const char *filename)
     }\r
   }\r
   \r
-  for(Int_t i=0; i<540; i++) {\r
+  char entriesDistName[100];\r
+  \r
+  for(Int_t i=0; i<kDET; i++) {\r
     \r
     if (!map[i]) continue;\r
     \r
-    fNPointDist[i] = new TH1D(Form("entriesDist_%d", i), ";number of events", max+2, -0.5, max+1.5);\r
+    sprintf(entriesDistName, "entriesDist_%d", i);\r
+    fNPointDist[i] = new TH1D(entriesDistName, ";number of events", max+2, -0.5, max+1.5);\r
     \r
     for(Int_t j=0; j<fNPoint[i]->GetXaxis()->GetNbins(); j++) {\r
       for(Int_t k=0; k<fNPoint[i]->GetYaxis()->GetNbins(); k++) {\r
@@ -291,12 +346,14 @@ void AliTRDqaBlackEvents::Process(const char *filename)
   }\r
   \r
 \r
-  for(Int_t i=0; i<540; i++) {\r
+  for(Int_t i=0; i<kDET; i++) {\r
     fnEntriesRM[i]->SetMaximum(fnEvents * 1.5);\r
   }\r
 \r
-  TFile *file = new TFile(filename, "UPDATE");\r
-  for(Int_t i=0; i<540; i++) {\r
+  // save histograms\r
+\r
+  TFile *file = new TFile(filename, "recreate");\r
+  for(Int_t i=0; i<kDET; i++) {\r
     if (!map[i]) continue; \r
     fChPed[i]->Write();\r
     fChNoise[i]->Write();\r
@@ -307,7 +364,20 @@ void AliTRDqaBlackEvents::Process(const char *filename)
     fSignal[i]->Write();\r
     fnEntriesRM[i]->Write();\r
   }\r
+\r
+  Int_t nMcm = 0;\r
+  for(Int_t i=0; i < kDET * kROB * kMCM; i++) {\r
+    if (fFullSignal[i] && fFullCounter[i] > fCount) {\r
+      fFullSignal[i]->Write();\r
+      nMcm++;\r
+    }\r
+  }\r
+\r
+  printf("Number of saved MCMs = %d\n", nMcm);\r
+\r
   fOccupancy->Write();\r
+  fDetRob->Write();\r
+  fTBEvent->Write();\r
   file->Close();\r
   delete file;\r
 }\r
index baea706..f90d3f8 100644 (file)
@@ -18,7 +18,8 @@
 
 class TH1D;
 class TH2D;
-class TH3D;
+class TH2S;
+class TH3F;
 class AliTRDrawStreamTB;
 
 class AliTRDqaBlackEvents : public TObject {
@@ -48,22 +49,53 @@ class AliTRDqaBlackEvents : public TObject {
   //void ScanChamber(const char *filename, Int_t first, Int_t last);
   void DrawSm(const char *filename, Int_t sm, Int_t w=900, Int_t h=700);
 
+  void SetFullView(Int_t v, Int_t thresh, Int_t count) {
+    fCreateFull = v;
+    fThresh = thresh;
+    fCount = count;
+  }
+
  private:
   
   Int_t fnEvents;         // number of events processed  
+  Int_t fCreateFull;      // flag if to create a full view
+  Int_t fThresh;          // threshold to analyze MCM data
+  Int_t fCount;           // minimum number of entries above threshold
+  
+  // geometry constants 
+  enum {
+    kDET = 540,
+    kROB = 8,
+    kMCM = 16,
+    kADC = 21,
+    kTB  = 30,
+    kCOL = 16,
+    kPAD = 144
+  };
+
+  // histograms per detector
 
   TH1D *fOccupancy;       // how many times is a pad present in data
+  TH2D *fDetRob;          // detector -- read out board
+
+  // histograms per chamber
+
+  TH1D *fPed[kDET];        // reconstructed pedestals distribution (on hist per chamber)
+  TH1D *fNoise[kDET];      // reconstructed noise distribution (on hist per chamber)
+  TH1D *fNPointDist[kDET]; // distributin of the number of points
+  TH2D *fChPed[kDET];      // Some histograms
+  TH2D *fChNoise[kDET];    // Some histograms
+  TH2D *fNPoint[kDET];     // number of data points
+  TH3F *fData[kDET];       // Some histograms
+  TH1D *fSignal[kDET];     // Some histograms
+  TH2D *fnEntriesRM[kDET];     // number of entries for ROB - MCM
+  TH1D *fnEntriesRMDist[kDET]; // distribtion of number of entries per ROB-MCM
+
+  TH2S *fFullSignal[kDET*kROB*kMCM];     // one histogram per MCM  
+  Short_t fFullCounter[kDET*kROB*kMCM];  // counts a number of entries with high signal
+  
+  TH2D *fTBEvent;    // coherent noise
 
-  TH1D *fPed[540];        // reconstructed pedestals distribution (on hist per chamber)
-  TH1D *fNoise[540];      // reconstructed noise distribution (on hist per chamber)
-  TH1D *fNPointDist[540]; // distributin of the number of points
-  TH2D *fChPed[540];      // Some histograms
-  TH2D *fChNoise[540];    // Some histograms
-  TH2D *fNPoint[540];     // number of data points
-  TH3D *fData[540];       // Some histograms
-  TH1D *fSignal[540];     // Some histograms
-  TH2D *fnEntriesRM[540];     // number of entries for ROB - MCM
-  TH1D *fnEntriesRMDist[540]; // distribtion of number of entries per ROB-MCM
 
   Int_t fFitType;