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