2 // Macro adds ether ladder, module or channel to the SSD bad channels map.
\r
3 // Input parameter: file name with original SSD bad channels map (optional),
\r
4 // equipment identifier (DDL),
\r
5 // Slot number, ADC number (optional) and channel number (optional)
\r
6 // Author: Oleksandr.Borysov@cern.ch
\r
10 #if !defined(__CINT__) || defined(__MAKECINT__)
\r
12 #include <Riostream.h>
\r
15 #include "TCanvas.h"
\r
17 #include "TString.h"
\r
19 #include "AliRawReaderRoot.h"
\r
20 #include "AliITSRawStreamSSDv1.h"
\r
21 #include "AliITSBadChannelsSSDv2.h"
\r
22 #include "AliITSModuleDaSSD.h"
\r
23 #include "AliITSHandleDaSSD.h"
\r
27 #define EQUIPMENTTODDLMASK 0xFF
\r
28 #define NUMBEROFSSDMODULESPERSLOT 12
\r
29 #define MAXSSDDDLID 15
\r
30 #define MINSSDMODULEID 500
\r
32 Bool_t readBCMap(const Char_t *filename, AliITSBadChannelsSSDv2*& bcl);
\r
33 Int_t addModuleBCMap(AliITSBadChannelsSSDv2 *bcl, const Int_t EqId, const Int_t SlotId, const Int_t adc);
\r
34 Int_t addLadderBCMap(AliITSBadChannelsSSDv2 *bcl, const Int_t EqId, const Int_t SlotId);
\r
35 Int_t addChannelBCMap(AliITSBadChannelsSSDv2 *bcl, const Int_t EqId, const Int_t SlotId, const Int_t adc, const Int_t strp);
\r
37 void drawBadChannelMapDAQDB(const char* filename);
\r
39 //class gives an access to the protected array with SSD_DDL_Map in case the geometry is not initialized
\r
40 class AliITSRawStreamSSDtmp : public AliITSRawStreamSSDv1 {
\r
42 AliITSRawStreamSSDtmp(AliRawReader* rawReader): AliITSRawStreamSSDv1(rawReader) {
\r
43 Setv11HybridDDLMapping();
\r
44 AliInfo("Using SSD DDL Map initialized by AliITSRawStreamSSDv1::Setv11HybridDDLMapping()");
\r
46 virtual ~AliITSRawStreamSSDtmp() {};
\r
47 Int_t GetModId(Int_t iDDL, Int_t iModule) {return fgkDDLModuleMap[iDDL][iModule];}
\r
48 ClassDef(AliITSRawStreamSSDtmp, 0)
\r
51 //_________________________________________________________//
\r
52 Int_t patchSSDBadChannelsMap(const Char_t *fname = 0,
\r
53 const Int_t EqId = -1,
\r
54 const Int_t SlotId = -1,
\r
55 const Int_t adc = -1,
\r
56 const Int_t strp = -1) {
\r
57 //Macro to patch the bad channel list
\r
58 TString bcfname, pathstr;
\r
59 AliITSBadChannelsSSDv2 *bc = 0;
\r
60 if (EqId < 0) { Usage(); cerr << "Equipment number (that is DDL) must be specified! Exit.\n"; return 0; }
\r
61 else if ((EqId & EQUIPMENTTODDLMASK) > MAXSSDDDLID) {
\r
62 cerr << "Icorrect equipment number (that is DDL)! Exit.\n";
\r
65 if (SlotId < 1 || SlotId > 9) {
\r
66 cerr << "Slot number must be specified (in the range 1 - 9)! Exit.\n";
\r
70 if (!fname || fname[0]==0) {
\r
71 cout << "File name with bad channels map is not specified, an empty map is used!\n";
\r
72 bc = new AliITSBadChannelsSSDv2();
\r
73 if (!bc) { cerr << "Error creating the AliITSBadChannelsSSDv2 object! Exit.\n"; return -1; }
\r
77 pathstr.Form(fname);
\r
78 if (!readBCMap(fname, bc)) {
\r
79 cerr << "Error reading file " << fname << " with Static Bad Channels Map! Exit.\n";
\r
83 if (adc < 0) addLadderBCMap(bc, EqId, SlotId);
\r
84 else if ((adc < 6) || (adc > 7 && (adc - 2) < NUMBEROFSSDMODULESPERSLOT) ) {
\r
85 if (strp < 0) addModuleBCMap(bc, EqId, SlotId, adc);
\r
86 else if (strp < AliITSModuleDaSSD::GetStripsPerModuleConst()) addChannelBCMap(bc, EqId, SlotId, adc, strp);
\r
88 cerr << "Incorrect number for Strip. Exit\n";
\r
95 cerr << "Incorrect number for ADC. Exit\n";
\r
99 bcfname = pathstr(0, pathstr.Last('/')+1);
\r
100 bcfname.Append(Form("ssdbcmap_%i.root", time(NULL)));
\r
101 TFile *bcfile = new TFile (bcfname.Data(),"RECREATE");
\r
102 if (bcfile->IsZombie()) {
\r
103 cerr << "Error open file " << bcfname.Data() << " for writing new bad channels map!\n";
\r
107 bcfile->WriteTObject(bc);
\r
110 cout << "New SSD bad channels map was saved in file " << bcfname.Data() << endl;
\r
115 //_________________________________________________________//
\r
116 Bool_t readBCMap(const Char_t *filename, AliITSBadChannelsSSDv2*& bcl) {
\r
117 // Reads Static Bad Channels Map from the file
\r
120 cout << "No file name is specified for Static Bad Channels Map!\n";
\r
123 cout << "Reading SSD Bad Channels Map from the file " << filename << endl;
\r
124 bcfile = new TFile(filename, "READ");
\r
125 if (bcfile->IsZombie()) {
\r
126 cerr << "Error reading file " << filename << " with Static Bad Channels Map!\n";
\r
129 bcfile->GetObject("AliITSBadChannelsSSDv2;1", bcl);
\r
131 cout << "Error bcl == NULL!\n";
\r
141 //_________________________________________________________//
\r
142 Int_t addModuleBCMap(AliITSBadChannelsSSDv2 *bcl,
\r
143 const Int_t EqId, const Int_t SlotId, const Int_t adc) {
\r
144 // Add module to bad channels map.
\r
145 const Char_t isbad = 3;
\r
146 Int_t ddl, mn, modid;
\r
147 AliRawReaderRoot *rwr = 0;
\r
148 AliITSRawStreamSSDtmp *rst = 0;
\r
149 rwr = new AliRawReaderRoot();
\r
150 rst = new AliITSRawStreamSSDtmp(rwr);
\r
151 ddl = EqId & EQUIPMENTTODDLMASK;
\r
152 mn = (SlotId - 1) * NUMBEROFSSDMODULESPERSLOT + (adc<8 ? adc : adc-2);
\r
153 modid = rst->GetModId(ddl, mn);
\r
154 modid -= MINSSDMODULEID;
\r
155 if (modid < 0) return 0;
\r
156 for (Int_t strind = 0; strind < AliITSModuleDaSSD::GetPNStripsPerModule(); strind++) {
\r
157 bcl->AddBadChannelP(modid, strind, isbad);
\r
158 bcl->AddBadChannelN(modid, strind, isbad);
\r
162 cout << "Module added: ModId = " << modid + MINSSDMODULEID << "; Ddl/Ad/Adc: " << ddl
\r
163 << " / " << SlotId << " / " << adc << endl;
\r
167 //_________________________________________________________//
\r
168 Int_t addLadderBCMap(AliITSBadChannelsSSDv2 *bcl,
\r
169 const Int_t EqId, const Int_t SlotId) {
\r
170 // Add ladder to bad channels map.
\r
171 for (Int_t adc = 0; adc < NUMBEROFSSDMODULESPERSLOT; adc++)
\r
172 addModuleBCMap(bcl, EqId, SlotId, (adc<6 ? adc : adc+2));
\r
176 //_________________________________________________________//
\r
177 Int_t addChannelBCMap(AliITSBadChannelsSSDv2 *bcl,
\r
178 const Int_t EqId, const Int_t SlotId,
\r
179 const Int_t adc, const Int_t strp) {
\r
180 // Add strip to bad channels map.
\r
181 const Char_t isbad = 3;
\r
182 Int_t ddl, mn, modid;
\r
183 AliRawReaderRoot *rwr = 0;
\r
184 AliITSRawStreamSSDtmp *rst = 0;
\r
185 rwr = new AliRawReaderRoot();
\r
186 rst = new AliITSRawStreamSSDtmp(rwr);
\r
187 ddl = EqId & EQUIPMENTTODDLMASK;
\r
188 mn = (SlotId - 1) * NUMBEROFSSDMODULESPERSLOT + (adc<8 ? adc : adc-2);
\r
189 modid = rst->GetModId(ddl, mn);
\r
190 modid -= MINSSDMODULEID;
\r
191 if (modid < 0) { cout << "There is no module with given Equipment, Slot, adc.\n" ; return 0; }
\r
192 if (strp < AliITSModuleDaSSD::GetPNStripsPerModule() ) {
\r
193 bcl->AddBadChannelP(modid, strp, isbad);
\r
195 bcl->AddBadChannelN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strp), isbad);
\r
199 cout << "Channel added (ModId/Ddl/Ad/Adc/Strip): " << modid + MINSSDMODULEID << " / " << ddl << " / " << SlotId
\r
200 << " / " << adc << " / " << strp << endl;
\r
204 //_________________________________________________________//
\r
205 void Usage (void) {
\r
207 cout << "Usage: PatchSSDBadChannelsMap(bc_fname /* can be \"\" */, EqipmentId, SlotId, adc /*optional*/, strip /*optional*/)\n";
\r
210 //_______________________________________//
\r
211 void drawBadChannelMapDAQDB(const char* filename) {
\r
212 //Draws the 2D plots of the bad channels maps
\r
213 const Int_t fgkSSDMODULES = 1698;
\r
214 static const Int_t fgkDefaultNStripsSSD = 768;
\r
215 gStyle->SetPalette(1,0);
\r
217 TH2F *fHistDAQDBPSideBadChannelMapLayer5 = new TH2F("fHistDAQDBPSideBadChannelMapLayer5",
\r
218 "Layer 5;N_{module};N_{ladder}",
\r
221 fHistDAQDBPSideBadChannelMapLayer5->GetXaxis()->SetTitleColor(1);
\r
222 fHistDAQDBPSideBadChannelMapLayer5->SetStats(kFALSE);
\r
223 fHistDAQDBPSideBadChannelMapLayer5->GetYaxis()->SetTitleOffset(1.8);
\r
224 fHistDAQDBPSideBadChannelMapLayer5->GetXaxis()->SetNdivisions(22);
\r
225 fHistDAQDBPSideBadChannelMapLayer5->GetYaxis()->SetNdivisions(34);
\r
226 fHistDAQDBPSideBadChannelMapLayer5->GetXaxis()->SetLabelSize(0.03);
\r
227 fHistDAQDBPSideBadChannelMapLayer5->GetYaxis()->SetLabelSize(0.03);
\r
228 fHistDAQDBPSideBadChannelMapLayer5->GetZaxis()->SetTitleOffset(1.6);
\r
229 fHistDAQDBPSideBadChannelMapLayer5->GetZaxis()->SetTitle("Bad channels (p-side)[%]");
\r
231 TH2F *fHistDAQDBNSideBadChannelMapLayer5 = new TH2F("fHistDAQDBNSideBadChannelMapLayer5",
\r
232 "Layer 5;N_{module};N_{ladder}",
\r
235 fHistDAQDBNSideBadChannelMapLayer5->GetXaxis()->SetTitleColor(1);
\r
236 fHistDAQDBNSideBadChannelMapLayer5->SetStats(kFALSE);
\r
237 fHistDAQDBNSideBadChannelMapLayer5->GetYaxis()->SetTitleOffset(1.8);
\r
238 fHistDAQDBNSideBadChannelMapLayer5->GetXaxis()->SetNdivisions(22);
\r
239 fHistDAQDBNSideBadChannelMapLayer5->GetYaxis()->SetNdivisions(34);
\r
240 fHistDAQDBNSideBadChannelMapLayer5->GetXaxis()->SetLabelSize(0.03);
\r
241 fHistDAQDBNSideBadChannelMapLayer5->GetYaxis()->SetLabelSize(0.03);
\r
242 fHistDAQDBNSideBadChannelMapLayer5->GetZaxis()->SetTitleOffset(1.6);
\r
243 fHistDAQDBNSideBadChannelMapLayer5->GetZaxis()->SetTitle("Bad channels (n-side)[%]");
\r
245 TH2F *fHistDAQDBPSideBadChannelMapLayer6 = new TH2F("fHistDAQDBPSideBadChannelMapLayer6",
\r
246 "Layer 6;N_{module};N_{ladder}",
\r
249 fHistDAQDBPSideBadChannelMapLayer6->GetXaxis()->SetTitleColor(1);
\r
250 fHistDAQDBPSideBadChannelMapLayer6->SetStats(kFALSE);
\r
251 fHistDAQDBPSideBadChannelMapLayer6->GetYaxis()->SetTitleOffset(1.8);
\r
252 fHistDAQDBPSideBadChannelMapLayer6->GetXaxis()->SetNdivisions(25);
\r
253 fHistDAQDBPSideBadChannelMapLayer6->GetYaxis()->SetNdivisions(38);
\r
254 fHistDAQDBPSideBadChannelMapLayer6->GetXaxis()->SetLabelSize(0.03);
\r
255 fHistDAQDBPSideBadChannelMapLayer6->GetYaxis()->SetLabelSize(0.03);
\r
256 fHistDAQDBPSideBadChannelMapLayer6->GetZaxis()->SetTitleOffset(1.6);
\r
257 fHistDAQDBPSideBadChannelMapLayer6->GetZaxis()->SetTitle("Bad channels (p-side)[%]");
\r
259 TH2F *fHistDAQDBNSideBadChannelMapLayer6 = new TH2F("fHistDAQDBNSideBadChannelMapLayer6",
\r
260 "Layer 6;N_{module};N_{ladder}",
\r
263 fHistDAQDBNSideBadChannelMapLayer6->GetXaxis()->SetTitleColor(1);
\r
264 fHistDAQDBNSideBadChannelMapLayer6->SetStats(kFALSE);
\r
265 fHistDAQDBNSideBadChannelMapLayer6->GetYaxis()->SetTitleOffset(1.8);
\r
266 fHistDAQDBNSideBadChannelMapLayer6->GetXaxis()->SetNdivisions(25);
\r
267 fHistDAQDBNSideBadChannelMapLayer6->GetYaxis()->SetNdivisions(38);
\r
268 fHistDAQDBNSideBadChannelMapLayer6->GetXaxis()->SetLabelSize(0.03);
\r
269 fHistDAQDBNSideBadChannelMapLayer6->GetYaxis()->SetLabelSize(0.03);
\r
270 fHistDAQDBNSideBadChannelMapLayer6->GetZaxis()->SetTitleOffset(1.6);
\r
271 fHistDAQDBNSideBadChannelMapLayer6->GetZaxis()->SetTitle("Bad channels (n-side)[%]");
\r
273 //===============================//
\r
274 TFile *f = TFile::Open(filename);
\r
276 Printf("File poiter not valid");
\r
281 Printf("The file was not found");
\r
284 //===============================//
\r
286 AliITSBadChannelsSSDv2 *badChannelsSSD = new AliITSBadChannelsSSDv2();
\r
287 badChannelsSSD = dynamic_cast<AliITSBadChannelsSSDv2 *>(f->Get("AliITSBadChannelsSSDv2"));
\r
289 //_____________________________________________________________________________//
\r
290 Int_t nPSideChannelsTotal = 0, nNSideChannelsTotal = 0;
\r
291 Int_t nBadPSideChannelsTotal = 0, nBadNSideChannelsTotal = 0;
\r
292 Int_t nBadPSideChannels = 0, nBadNSideChannels = 0;
\r
293 Int_t layer = 0, ladder = 0, module = 0;
\r
294 Int_t nPSideChannelsLayer5 = 0, nNSideChannelsLayer5 = 0;
\r
295 Int_t nPSideChannelsLayer6 = 0, nNSideChannelsLayer6 = 0;
\r
296 //_____________________________________________________________________________//
\r
298 for(Int_t i = 0; i < fgkSSDMODULES; i++) {
\r
299 //for(Int_t i = 0; i < 1; i++) {
\r
300 AliITSgeomTGeo::GetModuleId(i+500,layer,ladder,module);
\r
301 nBadPSideChannels = 0, nBadNSideChannels = 0;
\r
302 nPSideChannelsLayer5 = 0, nNSideChannelsLayer5 = 0;
\r
303 nPSideChannelsLayer6 = 0, nNSideChannelsLayer6 = 0;
\r
305 Int_t badChannel = 0;
\r
306 for(Int_t j = 0; j < fgkDefaultNStripsSSD; j++) {
\r
307 badChannel = (Int_t)(badChannelsSSD->GetBadChannelP(i,j));
\r
308 //cout<<"Module: "<<i+500<< " Strip: "<<j<<" - "<<badChannel<<endl;
\r
309 if(badChannel != 0) {
\r
311 nPSideChannelsLayer5 += 1;
\r
313 nPSideChannelsLayer6 += 1;
\r
314 nBadPSideChannels += 1;
\r
316 badChannel = (Int_t)(badChannelsSSD->GetBadChannelN(i,j));
\r
317 //cout<<"Module: "<<i+500<< " Strip: "<<fgkDefaultNStripsSSD+j+1<<" - "<<badChannel<<endl;
\r
318 if(badChannel != 0) {
\r
320 nNSideChannelsLayer5 += 1;
\r
322 nNSideChannelsLayer6 += 1;
\r
323 nBadNSideChannels += 1;
\r
327 if(nPSideChannelsLayer5 > 0)
\r
328 fHistDAQDBPSideBadChannelMapLayer5->Fill(module,499+ladder,
\r
329 100.*nPSideChannelsLayer5/fgkDefaultNStripsSSD);
\r
330 else fHistDAQDBPSideBadChannelMapLayer5->Fill(module,499+ladder,0.0001);
\r
331 if(nNSideChannelsLayer5 > 0)
\r
332 fHistDAQDBNSideBadChannelMapLayer5->Fill(module,499+ladder,
\r
333 100.*nNSideChannelsLayer5/fgkDefaultNStripsSSD);
\r
334 else fHistDAQDBNSideBadChannelMapLayer5->Fill(module,499+ladder,0.0001);
\r
337 if(nPSideChannelsLayer6 > 0)
\r
338 fHistDAQDBPSideBadChannelMapLayer6->Fill(module,599+ladder,
\r
339 100.*nPSideChannelsLayer6/fgkDefaultNStripsSSD);
\r
340 else fHistDAQDBPSideBadChannelMapLayer6->Fill(module,599+ladder,0.0001);
\r
341 if(nNSideChannelsLayer6 > 0)
\r
342 fHistDAQDBNSideBadChannelMapLayer6->Fill(module,599+ladder,
\r
343 100.*nNSideChannelsLayer6/fgkDefaultNStripsSSD);
\r
344 else fHistDAQDBNSideBadChannelMapLayer6->Fill(module,599+ladder,0.0001);
\r
347 nBadPSideChannelsTotal += nBadPSideChannels;
\r
348 nBadNSideChannelsTotal += nBadNSideChannels;
\r
349 nPSideChannelsTotal += fgkDefaultNStripsSSD;
\r
350 nNSideChannelsTotal += fgkDefaultNStripsSSD;
\r
353 cout<<"================================="<<endl;
\r
354 cout<<"Bad p-Side channels: "<<100.*nBadPSideChannelsTotal/nPSideChannelsTotal<<endl;
\r
355 cout<<"Bad n-Side channels: "<<100.*nBadNSideChannelsTotal/nNSideChannelsTotal<<endl;
\r
356 cout<<"================================="<<endl;
\r
358 TCanvas *cBadChannelDAQDB = new TCanvas("cBadChannelDAQDB",
\r
359 "Bad channel list - DAQ DB",
\r
361 cBadChannelDAQDB->SetHighLightColor(10); cBadChannelDAQDB->SetFillColor(10);
\r
362 cBadChannelDAQDB->Divide(2,2);
\r
364 cBadChannelDAQDB->cd(1)->SetBottomMargin(.2);
\r
365 cBadChannelDAQDB->cd(1)->SetLeftMargin(.15);
\r
366 cBadChannelDAQDB->cd(1)->SetRightMargin(.2);
\r
367 cBadChannelDAQDB->cd(1)->SetGridx(); cBadChannelDAQDB->cd(1)->SetGridy();
\r
368 cBadChannelDAQDB->cd(1); fHistDAQDBPSideBadChannelMapLayer5->Draw("colz");
\r
369 cBadChannelDAQDB->cd(2)->SetBottomMargin(.2);
\r
370 cBadChannelDAQDB->cd(2)->SetLeftMargin(.15);
\r
371 cBadChannelDAQDB->cd(2)->SetRightMargin(.2);
\r
372 cBadChannelDAQDB->cd(2)->SetGridx(); cBadChannelDAQDB->cd(2)->SetGridy();
\r
373 cBadChannelDAQDB->cd(2); fHistDAQDBPSideBadChannelMapLayer6->Draw("colz");
\r
374 cBadChannelDAQDB->cd(3)->SetBottomMargin(.2);
\r
375 cBadChannelDAQDB->cd(3)->SetLeftMargin(.15);
\r
376 cBadChannelDAQDB->cd(3)->SetRightMargin(.2);
\r
377 cBadChannelDAQDB->cd(3)->SetGridx(); cBadChannelDAQDB->cd(3)->SetGridy();
\r
378 cBadChannelDAQDB->cd(3); fHistDAQDBNSideBadChannelMapLayer5->Draw("colz");
\r
379 cBadChannelDAQDB->cd(4)->SetBottomMargin(.2);
\r
380 cBadChannelDAQDB->cd(4)->SetLeftMargin(.15);
\r
381 cBadChannelDAQDB->cd(4)->SetRightMargin(.2);
\r
382 cBadChannelDAQDB->cd(4)->SetGridx(); cBadChannelDAQDB->cd(4)->SetGridy();
\r
383 cBadChannelDAQDB->cd(4); fHistDAQDBNSideBadChannelMapLayer6->Draw("colz");
\r