]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/patchSSDBadChannelsMap.C
new macro dealing with the static list of SSD bad channels to be masked (Panos)
[u/mrichter/AliRoot.git] / ITS / patchSSDBadChannelsMap.C
diff --git a/ITS/patchSSDBadChannelsMap.C b/ITS/patchSSDBadChannelsMap.C
new file mode 100644 (file)
index 0000000..dc8c1ab
--- /dev/null
@@ -0,0 +1,386 @@
+//\r
+// Macro adds ether ladder, module or channel to the SSD bad channels map.\r
+// Input parameter: file name with original SSD bad channels map (optional),  \r
+//                  equipment identifier (DDL),\r
+//                  Slot number, ADC number (optional) and channel number (optional)\r
+// Author: Oleksandr.Borysov@cern.ch\r
+//\r
+\r
+\r
+#if !defined(__CINT__) || defined(__MAKECINT__)\r
+#include <time.h>\r
+#include <Riostream.h>\r
+#include "TStyle.h"\r
+#include "TFile.h"\r
+#include "TCanvas.h"\r
+#include "TH2F.h"\r
+#include "TString.h"\r
+#include "AliLog.h"\r
+#include "AliRawReaderRoot.h"\r
+#include "AliITSRawStreamSSDv1.h"\r
+#include "AliITSBadChannelsSSDv2.h"\r
+#include "AliITSModuleDaSSD.h"\r
+#include "AliITSHandleDaSSD.h"\r
+#endif\r
+\r
+\r
+#define EQUIPMENTTODDLMASK        0xFF\r
+#define NUMBEROFSSDMODULESPERSLOT 12\r
+#define MAXSSDDDLID               15\r
+#define MINSSDMODULEID            500\r
+\r
+Bool_t readBCMap(const Char_t *filename, AliITSBadChannelsSSDv2*& bcl);\r
+Int_t addModuleBCMap(AliITSBadChannelsSSDv2 *bcl, const Int_t EqId, const Int_t SlotId, const Int_t adc);\r
+Int_t addLadderBCMap(AliITSBadChannelsSSDv2 *bcl, const Int_t EqId, const Int_t SlotId);\r
+Int_t  addChannelBCMap(AliITSBadChannelsSSDv2 *bcl, const Int_t EqId, const Int_t SlotId, const Int_t adc, const Int_t strp);\r
+void  Usage (void);\r
+void drawBadChannelMapDAQDB(const char* filename);\r
\r
+//class gives an access to the protected array with SSD_DDL_Map in case the geometry is not initialized\r
+class AliITSRawStreamSSDtmp : public AliITSRawStreamSSDv1 {\r
+public:\r
+  AliITSRawStreamSSDtmp(AliRawReader* rawReader): AliITSRawStreamSSDv1(rawReader) {\r
+    Setv11HybridDDLMapping();\r
+    AliInfo("Using SSD DDL Map initialized by AliITSRawStreamSSDv1::Setv11HybridDDLMapping()");\r
+  }\r
+  virtual ~AliITSRawStreamSSDtmp() {};\r
+  Int_t GetModId(Int_t iDDL, Int_t iModule) {return fgkDDLModuleMap[iDDL][iModule];}\r
+  ClassDef(AliITSRawStreamSSDtmp, 0)\r
+};\r
+\r
+//_________________________________________________________//\r
+Int_t patchSSDBadChannelsMap(const Char_t *fname = 0, \r
+                            const Int_t EqId = -1, \r
+                            const Int_t SlotId = -1, \r
+                            const Int_t adc = -1, \r
+                            const Int_t strp = -1) {\r
+  //Macro to patch the bad channel list\r
+  TString    bcfname, pathstr;\r
+  AliITSBadChannelsSSDv2  *bc = 0;\r
+  if (EqId < 0) { Usage(); cerr << "Equipment number (that is DDL) must be specified! Exit.\n"; return 0; } \r
+  else if ((EqId & EQUIPMENTTODDLMASK) > MAXSSDDDLID) { \r
+    cerr << "Icorrect equipment number (that is DDL)! Exit.\n"; \r
+    return -1;\r
+  }  \r
+  if (SlotId < 1 || SlotId > 9) { \r
+    cerr << "Slot number must be specified (in the range 1 - 9)! Exit.\n"; \r
+       Usage();   \r
+    return -2; \r
+  }\r
+  if (!fname || fname[0]==0) {\r
+    cout << "File name with bad channels map is not specified, an empty map is used!\n";\r
+    bc = new AliITSBadChannelsSSDv2();\r
+    if (!bc) { cerr << "Error creating the AliITSBadChannelsSSDv2 object! Exit.\n"; return -1; }\r
+    pathstr = "";\r
+  }\r
+  else {\r
+       pathstr.Form(fname);\r
+    if (!readBCMap(fname, bc)) {\r
+      cerr << "Error reading file " << fname << " with Static Bad Channels Map! Exit.\n";\r
+      return -3;\r
+    }\r
+  }  \r
+  if (adc < 0) addLadderBCMap(bc, EqId, SlotId);\r
+  else if ((adc < 6) || (adc > 7 && (adc - 2) < NUMBEROFSSDMODULESPERSLOT) ) {\r
+    if (strp < 0) addModuleBCMap(bc, EqId, SlotId, adc);\r
+    else if (strp < AliITSModuleDaSSD::GetStripsPerModuleConst()) addChannelBCMap(bc, EqId, SlotId, adc, strp);\r
+         else {\r
+               cerr << "Incorrect number for Strip. Exit\n";\r
+               Usage(); \r
+            if (bc) delete bc;\r
+            return -5;\r
+        }\r
+  }\r
+  else {\r
+    cerr << "Incorrect number for ADC. Exit\n";\r
+    if (bc) delete bc;\r
+    return -4;\r
+  }\r
+  bcfname = pathstr(0, pathstr.Last('/')+1);\r
+  bcfname.Append(Form("ssdbcmap_%i.root", time(NULL)));\r
+  TFile *bcfile = new TFile (bcfname.Data(),"RECREATE");\r
+  if (bcfile->IsZombie()) {\r
+    cerr << "Error open file " << bcfname.Data() << " for writing new bad channels map!\n";\r
+    if (bc) delete bc;\r
+    return -1;\r
+  }\r
+  bcfile->WriteTObject(bc);\r
+  bcfile->Close();\r
+  delete bcfile;\r
+  cout << "New SSD bad channels map was saved in file " << bcfname.Data() << endl;\r
+  if (bc) delete bc;\r
+  return 0;\r
+}\r
+\r
+//_________________________________________________________//\r
+Bool_t readBCMap(const Char_t *filename, AliITSBadChannelsSSDv2*& bcl) {\r
+  // Reads Static Bad Channels Map from the file\r
+  TFile *bcfile;\r
+  if (!filename) {\r
+    cout << "No file name is specified for Static Bad Channels Map!\n";\r
+    return kFALSE;\r
+  } \r
+  cout << "Reading SSD Bad Channels Map from the file " << filename << endl;\r
+  bcfile = new TFile(filename, "READ");\r
+  if (bcfile->IsZombie()) {\r
+    cerr << "Error reading file " << filename << " with Static Bad Channels Map!\n";\r
+    return kFALSE;\r
+  }\r
+  bcfile->GetObject("AliITSBadChannelsSSDv2;1", bcl);\r
+  if (!bcl) {\r
+    cout << "Error bcl == NULL!\n";\r
+    bcfile->Close();\r
+    delete bcfile;\r
+    return kFALSE;\r
+  }\r
+  bcfile->Close();\r
+  delete bcfile;\r
+  return kTRUE;\r
+}\r
+\r
+//_________________________________________________________//\r
+Int_t addModuleBCMap(AliITSBadChannelsSSDv2 *bcl, \r
+                    const Int_t EqId, const Int_t SlotId, const Int_t adc) {\r
+  // Add module to bad channels map.\r
+  const Char_t     isbad = 3;\r
+  Int_t            ddl, mn, modid;\r
+  AliRawReaderRoot       *rwr = 0;\r
+  AliITSRawStreamSSDtmp  *rst = 0;\r
+  rwr = new AliRawReaderRoot();\r
+  rst = new AliITSRawStreamSSDtmp(rwr);\r
+  ddl = EqId & EQUIPMENTTODDLMASK;\r
+  mn = (SlotId - 1) * NUMBEROFSSDMODULESPERSLOT + (adc<8 ? adc : adc-2);\r
+  modid = rst->GetModId(ddl, mn);\r
+  modid -= MINSSDMODULEID;\r
+  if (modid < 0) return 0;\r
+  for (Int_t strind = 0; strind < AliITSModuleDaSSD::GetPNStripsPerModule(); strind++) {\r
+      bcl->AddBadChannelP(modid, strind, isbad);\r
+      bcl->AddBadChannelN(modid, strind, isbad);\r
+  }\r
+  delete rst;\r
+  delete rwr;\r
+  cout << "Module added:  ModId = " << modid + MINSSDMODULEID << "; Ddl/Ad/Adc: " << ddl \r
+       << " / " << SlotId << " / " << adc << endl;\r
+  return 0;\r
+}\r
+\r
+//_________________________________________________________//\r
+Int_t addLadderBCMap(AliITSBadChannelsSSDv2 *bcl, \r
+                    const Int_t EqId, const Int_t SlotId) {\r
+  // Add ladder to bad channels map.\r
+  for (Int_t adc = 0; adc < NUMBEROFSSDMODULESPERSLOT; adc++)\r
+    addModuleBCMap(bcl, EqId, SlotId, (adc<6 ? adc : adc+2));\r
+  return 0;\r
+}\r
+\r
+//_________________________________________________________//\r
+Int_t  addChannelBCMap(AliITSBadChannelsSSDv2 *bcl, \r
+                      const Int_t EqId, const Int_t SlotId, \r
+                       const Int_t adc, const Int_t strp) {\r
+  // Add strip to bad channels map.\r
+  const Char_t     isbad = 3;\r
+  Int_t            ddl, mn, modid;         \r
+  AliRawReaderRoot       *rwr = 0;\r
+  AliITSRawStreamSSDtmp  *rst = 0;\r
+  rwr = new AliRawReaderRoot();\r
+  rst = new AliITSRawStreamSSDtmp(rwr);\r
+  ddl = EqId & EQUIPMENTTODDLMASK;\r
+  mn = (SlotId - 1) * NUMBEROFSSDMODULESPERSLOT + (adc<8 ? adc : adc-2);\r
+  modid = rst->GetModId(ddl, mn);  \r
+  modid -= MINSSDMODULEID;\r
+  if (modid < 0) { cout << "There is no module with given Equipment, Slot, adc.\n" ; return 0; }\r
+  if (strp < AliITSModuleDaSSD::GetPNStripsPerModule() ) {\r
+    bcl->AddBadChannelP(modid, strp, isbad);\r
+  } else {\r
+    bcl->AddBadChannelN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strp), isbad);\r
+  }\r
+  delete rst;\r
+  delete rwr;\r
+  cout << "Channel added (ModId/Ddl/Ad/Adc/Strip): " << modid + MINSSDMODULEID << " / " << ddl << " / " << SlotId \r
+       << " / " << adc << " / " << strp << endl;\r
+  return 0;\r
+}\r
+\r
+//_________________________________________________________//\r
+void  Usage (void) { \r
+  //Usage function\r
+  cout << "Usage: PatchSSDBadChannelsMap(bc_fname /* can be \"\" */, EqipmentId, SlotId, adc /*optional*/, strip /*optional*/)\n"; \r
+}\r
+\r
+//_______________________________________//\r
+void drawBadChannelMapDAQDB(const char* filename) {\r
+  //Draws the 2D plots of the bad channels maps\r
+  const Int_t fgkSSDMODULES = 1698;\r
+  static const Int_t fgkDefaultNStripsSSD = 768;\r
+  gStyle->SetPalette(1,0);\r
+\r
+  TH2F *fHistDAQDBPSideBadChannelMapLayer5 = new TH2F("fHistDAQDBPSideBadChannelMapLayer5",\r
+                                                     "Layer 5;N_{module};N_{ladder}",\r
+                                                     22,1,23,\r
+                                                     34,500,534);\r
+  fHistDAQDBPSideBadChannelMapLayer5->GetXaxis()->SetTitleColor(1);\r
+  fHistDAQDBPSideBadChannelMapLayer5->SetStats(kFALSE);\r
+  fHistDAQDBPSideBadChannelMapLayer5->GetYaxis()->SetTitleOffset(1.8);\r
+  fHistDAQDBPSideBadChannelMapLayer5->GetXaxis()->SetNdivisions(22);\r
+  fHistDAQDBPSideBadChannelMapLayer5->GetYaxis()->SetNdivisions(34);\r
+  fHistDAQDBPSideBadChannelMapLayer5->GetXaxis()->SetLabelSize(0.03);\r
+  fHistDAQDBPSideBadChannelMapLayer5->GetYaxis()->SetLabelSize(0.03);\r
+  fHistDAQDBPSideBadChannelMapLayer5->GetZaxis()->SetTitleOffset(1.6);\r
+  fHistDAQDBPSideBadChannelMapLayer5->GetZaxis()->SetTitle("Bad channels (p-side)[%]");\r
+\r
+  TH2F *fHistDAQDBNSideBadChannelMapLayer5 = new TH2F("fHistDAQDBNSideBadChannelMapLayer5",\r
+                                                     "Layer 5;N_{module};N_{ladder}",\r
+                                                     22,1,23,\r
+                                                     34,500,534);\r
+  fHistDAQDBNSideBadChannelMapLayer5->GetXaxis()->SetTitleColor(1);\r
+  fHistDAQDBNSideBadChannelMapLayer5->SetStats(kFALSE);\r
+  fHistDAQDBNSideBadChannelMapLayer5->GetYaxis()->SetTitleOffset(1.8);\r
+  fHistDAQDBNSideBadChannelMapLayer5->GetXaxis()->SetNdivisions(22);\r
+  fHistDAQDBNSideBadChannelMapLayer5->GetYaxis()->SetNdivisions(34);\r
+  fHistDAQDBNSideBadChannelMapLayer5->GetXaxis()->SetLabelSize(0.03);\r
+  fHistDAQDBNSideBadChannelMapLayer5->GetYaxis()->SetLabelSize(0.03);\r
+  fHistDAQDBNSideBadChannelMapLayer5->GetZaxis()->SetTitleOffset(1.6);\r
+  fHistDAQDBNSideBadChannelMapLayer5->GetZaxis()->SetTitle("Bad channels (n-side)[%]");\r
+  \r
+  TH2F *fHistDAQDBPSideBadChannelMapLayer6 = new TH2F("fHistDAQDBPSideBadChannelMapLayer6",\r
+                                                     "Layer 6;N_{module};N_{ladder}",\r
+                                                     25,1,26,\r
+                                                     38,600,638);\r
+  fHistDAQDBPSideBadChannelMapLayer6->GetXaxis()->SetTitleColor(1);\r
+  fHistDAQDBPSideBadChannelMapLayer6->SetStats(kFALSE);\r
+  fHistDAQDBPSideBadChannelMapLayer6->GetYaxis()->SetTitleOffset(1.8);\r
+  fHistDAQDBPSideBadChannelMapLayer6->GetXaxis()->SetNdivisions(25);\r
+  fHistDAQDBPSideBadChannelMapLayer6->GetYaxis()->SetNdivisions(38);\r
+  fHistDAQDBPSideBadChannelMapLayer6->GetXaxis()->SetLabelSize(0.03);\r
+  fHistDAQDBPSideBadChannelMapLayer6->GetYaxis()->SetLabelSize(0.03);\r
+  fHistDAQDBPSideBadChannelMapLayer6->GetZaxis()->SetTitleOffset(1.6);\r
+  fHistDAQDBPSideBadChannelMapLayer6->GetZaxis()->SetTitle("Bad channels (p-side)[%]");\r
+\r
+  TH2F *fHistDAQDBNSideBadChannelMapLayer6 = new TH2F("fHistDAQDBNSideBadChannelMapLayer6",\r
+                                                     "Layer 6;N_{module};N_{ladder}",\r
+                                                     25,1,26,\r
+                                                     38,600,638);\r
+  fHistDAQDBNSideBadChannelMapLayer6->GetXaxis()->SetTitleColor(1);\r
+  fHistDAQDBNSideBadChannelMapLayer6->SetStats(kFALSE);\r
+  fHistDAQDBNSideBadChannelMapLayer6->GetYaxis()->SetTitleOffset(1.8);\r
+  fHistDAQDBNSideBadChannelMapLayer6->GetXaxis()->SetNdivisions(25);\r
+  fHistDAQDBNSideBadChannelMapLayer6->GetYaxis()->SetNdivisions(38);\r
+  fHistDAQDBNSideBadChannelMapLayer6->GetXaxis()->SetLabelSize(0.03);\r
+  fHistDAQDBNSideBadChannelMapLayer6->GetYaxis()->SetLabelSize(0.03);\r
+  fHistDAQDBNSideBadChannelMapLayer6->GetZaxis()->SetTitleOffset(1.6);\r
+  fHistDAQDBNSideBadChannelMapLayer6->GetZaxis()->SetTitle("Bad channels (n-side)[%]");\r
+\r
+  //===============================//\r
+  TFile *f = TFile::Open(filename);\r
+  if(!f) {\r
+    Printf("File poiter not valid");\r
+    return;\r
+  }\r
+\r
+  if(!f->IsOpen()) {\r
+    Printf("The file was not found");\r
+    return;\r
+  }\r
+  //===============================//\r
+\r
+  AliITSBadChannelsSSDv2 *badChannelsSSD = new AliITSBadChannelsSSDv2();\r
+  badChannelsSSD = dynamic_cast<AliITSBadChannelsSSDv2 *>(f->Get("AliITSBadChannelsSSDv2"));\r
+\r
+  //_____________________________________________________________________________//\r
+  Int_t nPSideChannelsTotal = 0, nNSideChannelsTotal = 0;\r
+  Int_t nBadPSideChannelsTotal = 0, nBadNSideChannelsTotal = 0;\r
+  Int_t nBadPSideChannels = 0, nBadNSideChannels = 0;\r
+  Int_t layer = 0, ladder = 0, module = 0;\r
+  Int_t nPSideChannelsLayer5 = 0, nNSideChannelsLayer5 = 0;\r
+  Int_t nPSideChannelsLayer6 = 0, nNSideChannelsLayer6 = 0;\r
+  //_____________________________________________________________________________//\r
+\r
+  for(Int_t i = 0; i < fgkSSDMODULES; i++) {\r
+    //for(Int_t i = 0; i < 1; i++) {\r
+    AliITSgeomTGeo::GetModuleId(i+500,layer,ladder,module);\r
+    nBadPSideChannels = 0, nBadNSideChannels = 0;\r
+    nPSideChannelsLayer5 = 0, nNSideChannelsLayer5 = 0;\r
+    nPSideChannelsLayer6 = 0, nNSideChannelsLayer6 = 0;\r
+\r
+    Int_t badChannel = 0;\r
+    for(Int_t j = 0; j < fgkDefaultNStripsSSD; j++) {\r
+      badChannel = (Int_t)(badChannelsSSD->GetBadChannelP(i,j));\r
+      //cout<<"Module: "<<i+500<< " Strip: "<<j<<" - "<<badChannel<<endl;\r
+      if(badChannel != 0) {\r
+       if(layer == 5)\r
+         nPSideChannelsLayer5 += 1;\r
+       if(layer == 6)\r
+         nPSideChannelsLayer6 += 1;\r
+       nBadPSideChannels += 1;\r
+      }\r
+      badChannel = (Int_t)(badChannelsSSD->GetBadChannelN(i,j));\r
+      //cout<<"Module: "<<i+500<< " Strip: "<<fgkDefaultNStripsSSD+j+1<<" - "<<badChannel<<endl;\r
+      if(badChannel != 0) {\r
+       if(layer == 5)                                                    \r
+         nNSideChannelsLayer5 += 1;\r
+       if(layer == 6)\r
+         nNSideChannelsLayer6 += 1;\r
+       nBadNSideChannels += 1;\r
+      }\r
+    }\r
+    if(layer == 5) {\r
+      if(nPSideChannelsLayer5 > 0)\r
+       fHistDAQDBPSideBadChannelMapLayer5->Fill(module,499+ladder,\r
+                                                100.*nPSideChannelsLayer5/fgkDefaultNStripsSSD);\r
+      else fHistDAQDBPSideBadChannelMapLayer5->Fill(module,499+ladder,0.0001);\r
+      if(nNSideChannelsLayer5 > 0)\r
+       fHistDAQDBNSideBadChannelMapLayer5->Fill(module,499+ladder,\r
+                                                100.*nNSideChannelsLayer5/fgkDefaultNStripsSSD);\r
+      else fHistDAQDBNSideBadChannelMapLayer5->Fill(module,499+ladder,0.0001);\r
+    }//layer 5\r
+    if(layer == 6) {\r
+      if(nPSideChannelsLayer6 > 0) \r
+       fHistDAQDBPSideBadChannelMapLayer6->Fill(module,599+ladder,\r
+                                                100.*nPSideChannelsLayer6/fgkDefaultNStripsSSD);\r
+      else fHistDAQDBPSideBadChannelMapLayer6->Fill(module,599+ladder,0.0001);\r
+      if(nNSideChannelsLayer6 > 0) \r
+       fHistDAQDBNSideBadChannelMapLayer6->Fill(module,599+ladder,\r
+                                                100.*nNSideChannelsLayer6/fgkDefaultNStripsSSD);\r
+      else fHistDAQDBNSideBadChannelMapLayer6->Fill(module,599+ladder,0.0001);\r
+    }//layer 6\r
+      \r
+    nBadPSideChannelsTotal += nBadPSideChannels;\r
+    nBadNSideChannelsTotal += nBadNSideChannels;\r
+    nPSideChannelsTotal += fgkDefaultNStripsSSD;\r
+    nNSideChannelsTotal += fgkDefaultNStripsSSD;\r
+  }\r
+\r
+  cout<<"================================="<<endl;\r
+  cout<<"Bad p-Side channels: "<<100.*nBadPSideChannelsTotal/nPSideChannelsTotal<<endl;\r
+  cout<<"Bad n-Side channels: "<<100.*nBadNSideChannelsTotal/nNSideChannelsTotal<<endl;\r
+  cout<<"================================="<<endl;\r
+\r
+  TCanvas *cBadChannelDAQDB = new TCanvas("cBadChannelDAQDB",\r
+                                         "Bad channel list - DAQ DB",\r
+                                         0,0,900,900);\r
+  cBadChannelDAQDB->SetHighLightColor(10); cBadChannelDAQDB->SetFillColor(10); \r
+  cBadChannelDAQDB->Divide(2,2);\r
+\r
+  cBadChannelDAQDB->cd(1)->SetBottomMargin(.2); \r
+  cBadChannelDAQDB->cd(1)->SetLeftMargin(.15);\r
+  cBadChannelDAQDB->cd(1)->SetRightMargin(.2);\r
+  cBadChannelDAQDB->cd(1)->SetGridx(); cBadChannelDAQDB->cd(1)->SetGridy();\r
+  cBadChannelDAQDB->cd(1); fHistDAQDBPSideBadChannelMapLayer5->Draw("colz"); \r
+  cBadChannelDAQDB->cd(2)->SetBottomMargin(.2); \r
+  cBadChannelDAQDB->cd(2)->SetLeftMargin(.15);\r
+  cBadChannelDAQDB->cd(2)->SetRightMargin(.2);\r
+  cBadChannelDAQDB->cd(2)->SetGridx(); cBadChannelDAQDB->cd(2)->SetGridy();\r
+  cBadChannelDAQDB->cd(2); fHistDAQDBPSideBadChannelMapLayer6->Draw("colz");\r
+  cBadChannelDAQDB->cd(3)->SetBottomMargin(.2); \r
+  cBadChannelDAQDB->cd(3)->SetLeftMargin(.15);\r
+  cBadChannelDAQDB->cd(3)->SetRightMargin(.2);\r
+  cBadChannelDAQDB->cd(3)->SetGridx(); cBadChannelDAQDB->cd(3)->SetGridy();\r
+  cBadChannelDAQDB->cd(3); fHistDAQDBNSideBadChannelMapLayer5->Draw("colz"); \r
+  cBadChannelDAQDB->cd(4)->SetBottomMargin(.2); \r
+  cBadChannelDAQDB->cd(4)->SetLeftMargin(.15);\r
+  cBadChannelDAQDB->cd(4)->SetRightMargin(.2);\r
+  cBadChannelDAQDB->cd(4)->SetGridx(); cBadChannelDAQDB->cd(4)->SetGridy();\r
+  cBadChannelDAQDB->cd(4); fHistDAQDBNSideBadChannelMapLayer6->Draw("colz");\r
+\r
+  return;\r
+}\r