--- /dev/null
+//\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