1 /**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //////////////////////////////////////////////////////////////////////////
20 // Implementation of the class for bad channel treatment in the tracker //
21 // Stores 1 status bit for each SPD pixel and SDD anode: //
23 // 1 = good channel //
24 // Dead and noisy channels are read from AliITSCalibration objects //
25 // Origin: F.Prino, Torino, prino@to.infn.it //
27 //////////////////////////////////////////////////////////////////////////
29 #include "AliITSChannelStatus.h"
30 #include "AliITSCalibrationSPD.h"
31 #include "AliITSCalibrationSDD.h"
32 #include "AliITSCalibrationSSD.h"
33 #include "AliITSsegmentationSPD.h"
34 #include "AliITSsegmentationSDD.h"
35 #include "AliITSsegmentationSSD.h"
36 #include "AliCDBEntry.h"
40 ClassImp(AliITSChannelStatus)
43 //______________________________________________________________________
44 AliITSChannelStatus::AliITSChannelStatus():
50 // default constructor
51 UInt_t nSPDchan=kSPDModules*kSPDNpxPerModule*kSPDNpzPerModule;
52 fSPDChannelStatus=new TBits(nSPDchan);
53 UInt_t nSDDchan=kSDDModules*kSDDAnodesPerModule;
54 fSDDChannelStatus=new TBits(nSDDchan);
55 UInt_t nSSDchan=kSSDModules*kSSDStripsPerModule;
56 fSSDChannelStatus=new TBits(nSSDchan);
59 //______________________________________________________________________
60 AliITSChannelStatus::AliITSChannelStatus(AliCDBManager *cdb):
66 // contruct starting from CDB
67 AliCDBEntry* spdEntryD = cdb->Get("ITS/Calib/SPDDead");
68 if (!spdEntryD) AliFatal("Cannot get CDB entry for SPDDead");
69 TObjArray* deadArrSPD = (TObjArray*)spdEntryD->GetObject();
70 if (!deadArrSPD) AliFatal("No object found in SPDDead file");
72 AliCDBEntry* spdEntrySparseD = cdb->Get("ITS/Calib/SPDSparseDead");
73 if (!spdEntrySparseD) AliFatal("Cannot get CDB entry for SPDSparseDead");
74 TObjArray* deadSparseArrSPD = (TObjArray*)spdEntrySparseD->GetObject();
75 if (!deadSparseArrSPD) AliFatal("No object found in SPDSparseDead file");
77 AliCDBEntry* spdEntryN = cdb->Get("ITS/Calib/SPDNoisy");
78 if (!spdEntryN) AliFatal("Cannot get CDB entry for SPDNoisy");
79 TObjArray* noisArrSPD = (TObjArray*)spdEntryN->GetObject();
80 if (!noisArrSPD) AliFatal("No object found in SPDNoisy file");
82 AliCDBEntry* sddEntry = cdb->Get("ITS/Calib/CalibSDD");
83 if (!sddEntry) AliFatal("Cannot get CDB entry for CalibSDD");
84 TObjArray* calArrSDD = (TObjArray*)sddEntry->GetObject();
85 if (!calArrSDD) AliFatal("No object found in CalibSDD file");
87 AliCDBEntry* ssdEntry = cdb->Get("ITS/Calib/CalibSSD");
88 if (!ssdEntry) AliFatal("Cannot get CDB entry for CalibSSD");
89 TObjArray* calArrSSD = (TObjArray*)ssdEntry->GetObject();
90 if (!calArrSSD) AliFatal("No object found in CalibSSD file");
92 UInt_t nSPDchan=kSPDModules*kSPDNpxPerModule*kSPDNpzPerModule;
93 fSPDChannelStatus=new TBits(nSPDchan);
94 UInt_t nSDDchan=kSDDModules*kSDDAnodesPerModule;
95 fSDDChannelStatus=new TBits(nSDDchan);
96 UInt_t nSSDchan=kSSDModules*kSSDStripsPerModule;
97 fSSDChannelStatus=new TBits(nSSDchan);
98 InitFromOCDB(deadArrSPD,deadSparseArrSPD,noisArrSPD,calArrSDD,calArrSSD);
100 //______________________________________________________________________
101 AliITSChannelStatus::AliITSChannelStatus(const AliITSDetTypeRec *dtrec):
103 fSPDChannelStatus(0),
104 fSDDChannelStatus(0),
107 // contruct starting from det type rec
108 UInt_t nSPDchan=kSPDModules*kSPDNpxPerModule*kSPDNpzPerModule;
109 fSPDChannelStatus=new TBits(nSPDchan);
111 UInt_t nSDDchan=kSDDModules*kSDDAnodesPerModule;
112 fSDDChannelStatus=new TBits(nSDDchan);
114 UInt_t nSSDchan=kSSDModules*kSSDStripsPerModule;
115 fSSDChannelStatus=new TBits(nSSDchan);
118 for(Int_t imod=0; imod<kSPDModules; imod++){
119 for(Int_t ix=0; ix<kSPDNpxPerModule; ix++){
120 for(Int_t iz=0; iz<kSPDNpzPerModule; iz++){
121 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
122 fSPDChannelStatus->SetBitNumber(index,kTRUE);
127 // Mask SPD dead pixels
128 AliITSCalibrationSPD* deadspd=(AliITSCalibrationSPD*)dtrec->GetSPDDeadModel(imod);
129 for(Int_t ipix=0; ipix<deadspd->GetNrBad();ipix++){
130 deadspd->GetBadPixel(ipix,ix,iz);
131 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
132 fSPDChannelStatus->SetBitNumber(index,kFALSE);
135 // Mask SPD sparse dead pixels
136 AliITSCalibrationSPD* deadSparseSpd=(AliITSCalibrationSPD*)dtrec->GetSPDSparseDeadModel(imod);
137 for(Int_t ipix=0; ipix<deadSparseSpd->GetNrBad();ipix++){
138 deadSparseSpd->GetBadPixel(ipix,ix,iz);
139 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
140 fSPDChannelStatus->SetBitNumber(index,kFALSE);
143 // Mask SPD noisy pixels
144 AliITSCalibrationSPD* noisspd=(AliITSCalibrationSPD*)dtrec->GetCalibrationModel(imod);
145 for(Int_t ipix=0; ipix<noisspd->GetNrBad();ipix++){
146 noisspd->GetBadPixel(ipix,ix,iz);
147 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
148 fSPDChannelStatus->SetBitNumber(index,kFALSE);
153 for(Int_t imod=0; imod<kSDDModules; imod++){
154 AliITSCalibrationSDD* calsdd=(AliITSCalibrationSDD*)dtrec->GetCalibrationModel(imod+kSPDModules);
155 for(Int_t ian=0; ian<kSDDAnodesPerModule; ian++){
156 Bool_t cstatus=kTRUE;
157 if(calsdd->IsBadChannel(ian)) cstatus=kFALSE;
158 Int_t index=imod*kSDDAnodesPerModule+ian;
159 fSDDChannelStatus->SetBitNumber(index,cstatus);
164 for (Int_t imod = 0; imod < kSSDModules; imod++) {
165 AliITSCalibrationSSD* calssd=(AliITSCalibrationSSD*)dtrec->GetCalibrationModel(kSSDFirstModule+imod);
166 for(Int_t ip=0; ip<kSSDStripsPerModule; ip++) {
167 Int_t index=imod*kSSDStripsPerModule+ip;
168 Bool_t cstatus = kTRUE;
169 if (ip < 768 && calssd->IsPChannelBad(ip))
171 if (ip >= 768 && calssd->IsNChannelBad(ip-768))
174 fSSDChannelStatus->SetBitNumber(index,cstatus);
178 //______________________________________________________________________
179 void AliITSChannelStatus::InitDefaults(){
180 // fill bitmaps setting all channels as good
181 for(Int_t imod=0; imod<kSPDModules; imod++){
182 for(Int_t ix=0; ix<kSPDNpxPerModule; ix++){
183 for(Int_t iz=0; iz<kSPDNpzPerModule; iz++){
184 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
185 fSPDChannelStatus->SetBitNumber(index,kTRUE);
189 for(Int_t imod=0; imod<kSDDModules; imod++){
190 for(Int_t ian=0; ian<kSDDAnodesPerModule; ian++){
191 Int_t index=imod*kSDDAnodesPerModule+ian;
192 fSDDChannelStatus->SetBitNumber(index,kTRUE);
195 for(Int_t imod=0; imod<kSSDModules; imod++){
196 for(Int_t is=0; is<kSSDStripsPerModule; is++){
197 Int_t index=imod*kSSDStripsPerModule+is;
198 fSSDChannelStatus->SetBitNumber(index,kTRUE);
202 //______________________________________________________________________
203 void AliITSChannelStatus::InitFromOCDB(TObjArray* deadArrSPD, TObjArray* /* deadSparseArrSPD */, TObjArray* noisArrSPD, TObjArray* calArrSDD, TObjArray *calArrSSD){
204 // fills bitmaps from arrays of AliITSCalibrationSXD objects
207 for(Int_t imod=0; imod<kSPDModules; imod++){
208 for(Int_t ix=0; ix<kSPDNpxPerModule; ix++){
209 for(Int_t iz=0; iz<kSPDNpzPerModule; iz++){
210 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
211 fSPDChannelStatus->SetBitNumber(index,kTRUE);
216 // Mask SPD dead pixels
217 AliITSCalibrationSPD* deadspd=(AliITSCalibrationSPD*)deadArrSPD->At(imod);
218 for(Int_t ipix=0; ipix<deadspd->GetNrBad();ipix++){
219 deadspd->GetBadPixel(ipix,ix,iz);
220 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
221 fSPDChannelStatus->SetBitNumber(index,kFALSE);
224 // Mask SPD sparse dead pixels
225 AliITSCalibrationSPD* deadSparseSpd=(AliITSCalibrationSPD*)deadArrSPD->At(imod);
226 for(Int_t ipix=0; ipix<deadSparseSpd->GetNrBad();ipix++){
227 deadSparseSpd->GetBadPixel(ipix,ix,iz);
228 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
229 fSPDChannelStatus->SetBitNumber(index,kFALSE);
232 // Mask SPD noisy pixels
233 AliITSCalibrationSPD* noisspd=(AliITSCalibrationSPD*)noisArrSPD->At(imod);
234 for(Int_t ipix=0; ipix<noisspd->GetNrBad();ipix++){
235 noisspd->GetBadPixel(ipix,ix,iz);
236 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
237 fSPDChannelStatus->SetBitNumber(index,kFALSE);
242 for(Int_t imod=0; imod<kSDDModules; imod++){
243 AliITSCalibrationSDD* calsdd=(AliITSCalibrationSDD*)calArrSDD->At(imod);
244 for(Int_t ian=0; ian<kSDDAnodesPerModule; ian++){
245 Bool_t cstatus=kTRUE;
246 if(calsdd->IsBadChannel(ian)) cstatus=kFALSE;
247 Int_t index=imod*kSDDAnodesPerModule+ian;
248 fSDDChannelStatus->SetBitNumber(index,cstatus);
253 for (Int_t imod = 0; imod < kSSDModules; imod++) {
254 AliITSCalibrationSSD* calssd=(AliITSCalibrationSSD*)calArrSSD->At(imod);
255 for(Int_t ip=0; ip<kSSDStripsPerModule; ip++) {
256 Int_t index=imod*kSSDStripsPerModule+ip;
257 Bool_t cstatus = kTRUE;
258 if (ip < 768 && calssd->IsPChannelBad(ip))
260 if (ip >= 768 && calssd->IsNChannelBad(ip-768))
263 fSSDChannelStatus->SetBitNumber(index,cstatus);
267 //______________________________________________________________________
268 AliITSChannelStatus::AliITSChannelStatus(const AliITSChannelStatus& cstatus):
270 fSPDChannelStatus(cstatus.fSPDChannelStatus),
271 fSDDChannelStatus(cstatus.fSDDChannelStatus),
272 fSSDChannelStatus(cstatus.fSSDChannelStatus)
276 //______________________________________________________________________
277 AliITSChannelStatus& AliITSChannelStatus::operator=(const AliITSChannelStatus& cstatus)
279 // assignment operator
280 this->~AliITSChannelStatus();
281 new(this) AliITSChannelStatus(cstatus);
285 //______________________________________________________________________
286 AliITSChannelStatus::~AliITSChannelStatus(){
288 if(fSPDChannelStatus) delete fSPDChannelStatus;
289 if(fSDDChannelStatus) delete fSDDChannelStatus;
290 if(fSSDChannelStatus) delete fSSDChannelStatus;
293 //______________________________________________________________________
294 Bool_t AliITSChannelStatus::CheckBounds(Int_t imod, Int_t iz, Int_t ix) const {
295 // check for out of bounds
296 if(imod<0 || imod>=kSPDModules+kSDDModules+kSSDModules){
297 AliError(Form("Module number out of range 0-%d",kSPDModules+kSDDModules));
300 if(imod<kSPDModules){
301 if(ix<0 || ix>=kSPDNpxPerModule || iz<0 || iz>=kSPDNpzPerModule){
302 AliError("SPD: Pixel number out of range");
305 }else if (imod<kSSDFirstModule){
306 if(iz<0 || iz>=kSDDAnodesPerModule){
307 AliError("SDD: anode number out of range");
312 if(iz<0 || iz>=kSSDStripsPerModule){
313 AliError("SSD: strip number out of range");
319 //______________________________________________________________________
320 Bool_t AliITSChannelStatus::GetChannelStatus(Int_t imod, Int_t iz, Int_t ix) const {
321 // return status of inquired channel
322 if(CheckBounds(imod,iz,ix)==kFALSE) return kFALSE;
323 if(imod<kSPDModules){
324 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
325 return fSPDChannelStatus->TestBitNumber(index);
326 } else if (imod < kSSDFirstModule) {
328 Int_t index=imod*kSDDAnodesPerModule+iz;
329 return fSDDChannelStatus->TestBitNumber(index);
331 else { // SSD: iz is strip number 0-767 P-side, 768 - 1535 N-side
332 imod-=kSSDFirstModule;
333 Int_t index=imod*kSSDStripsPerModule+iz;
334 return fSSDChannelStatus->TestBitNumber(index);
337 //______________________________________________________________________
338 void AliITSChannelStatus::SetChannelStatus(Bool_t cstatus, Int_t imod, Int_t iz, Int_t ix){
339 // set status for given channel
340 if(CheckBounds(imod,iz,ix)==kFALSE) return;
341 if(imod<kSPDModules){
342 Int_t index=imod*kSPDNpxPerModule*kSPDNpzPerModule+ix*kSPDNpzPerModule+iz;
343 fSPDChannelStatus->SetBitNumber(index,cstatus);
344 }else if (imod < kSSDFirstModule) {
346 Int_t index=imod*kSDDAnodesPerModule+iz;
347 fSDDChannelStatus->SetBitNumber(index,cstatus);
349 else { // SSD: iz is strip number 0-767 P-side, 768 - 1535 N-side
350 imod-=kSSDFirstModule;
351 Int_t index=imod*kSSDStripsPerModule+iz;
352 return fSSDChannelStatus->SetBitNumber(index,cstatus);
355 //______________________________________________________________________
356 Bool_t AliITSChannelStatus::GetSDDLimits(Float_t zlocmin, Float_t zlocmax, Float_t xlocmin, Float_t xlocmax, Int_t& izmin, Int_t& izmax, Int_t& izmin2, Int_t& izmax2) const {
357 // Returns min. and max. anode numbers from local coordindate
358 AliITSsegmentationSDD *seg=new AliITSsegmentationSDD();
359 Float_t dummySpeed=6.5; // to avoid warnings in SDD segmentation
360 Float_t tolerance=0.9999;
361 seg->SetDriftSpeed(dummySpeed);
362 Float_t zHalfSize=0.5*seg->Dz()/10000.;
363 zHalfSize*=tolerance;
364 if(zlocmin<-zHalfSize) zlocmin=-zHalfSize;
365 if(zlocmax>zHalfSize) zlocmax=zHalfSize;
366 if(zlocmax<-zHalfSize || zlocmin>zHalfSize){
367 AliWarning("Search region completely outside module");
370 Float_t xHalfSize=seg->Dx()/10000.;
371 xHalfSize*=tolerance;
372 if(xlocmin<-xHalfSize) xlocmin=-xHalfSize;
373 if(xlocmax>xHalfSize) xlocmax=xHalfSize;
374 if(xlocmax<-xHalfSize || xlocmin>xHalfSize){
375 AliWarning("Search region completely outside module");
379 Int_t iSid1=seg->GetSideFromLocalX(xlocmin);
380 Int_t iSid2=seg->GetSideFromLocalX(xlocmax);
381 Int_t iz1,iz2,ixdummy;
382 seg->LocalToDet(xlocmin,zlocmin,ixdummy,iz1);
383 seg->LocalToDet(xlocmin,zlocmax,ixdummy,iz2);
384 izmin=TMath::Min(iz1,iz2);
385 izmax=TMath::Max(iz1,iz2);
389 seg->LocalToDet(xlocmax,zlocmin,ixdummy,iz1);
390 seg->LocalToDet(xlocmax,zlocmax,ixdummy,iz2);
391 izmin2=TMath::Min(iz1,iz2);
392 izmax2=TMath::Max(iz1,iz2);
397 //______________________________________________________________________
398 Bool_t AliITSChannelStatus::GetSPDLimits(Float_t zlocmin, Float_t zlocmax, Float_t xlocmin, Float_t xlocmax, Int_t& izmin, Int_t& izmax, Int_t& ixmin, Int_t& ixmax) const {
399 // Returns min. and max. pixel numbers from local coordindate
400 Float_t tolerance=0.9999;
401 AliITSsegmentationSPD *seg=new AliITSsegmentationSPD();
402 Float_t zHalfSize=0.5*seg->Dz()/10000.;
403 zHalfSize*=tolerance;
404 if(zlocmin<-zHalfSize) zlocmin=-zHalfSize;
405 if(zlocmax>zHalfSize) zlocmax=zHalfSize;
406 if(zlocmax<-zHalfSize || zlocmin>zHalfSize){
407 AliWarning("Search region completely outside module");
410 Float_t xHalfSize=0.5*seg->Dx()/10000.;
411 xHalfSize*=tolerance;
412 if(xlocmin<-xHalfSize) xlocmin=-xHalfSize;
413 if(xlocmax>xHalfSize) xlocmax=xHalfSize;
414 if(xlocmax<-xHalfSize || xlocmin>xHalfSize){
415 AliWarning("Search region completely outside module");
419 Int_t iz1,ix1,iz2,ix2;
420 seg->LocalToDet(xlocmin,zlocmin,ix1,iz1);
421 seg->LocalToDet(xlocmax,zlocmax,ix2,iz2);
422 izmin=TMath::Min(iz1,iz2);
423 izmax=TMath::Max(iz1,iz2);
424 ixmin=TMath::Min(ix1,ix2);
425 ixmax=TMath::Max(ix1,ix2);
429 //______________________________________________________________________
430 Bool_t AliITSChannelStatus::GetSSDLimits(Int_t layer, Float_t zlocmin, Float_t zlocmax, Float_t xlocmin, Float_t xlocmax, Int_t& iPmin, Int_t& iPmax, Int_t& iNmin, Int_t& iNmax) const {
431 // Returns min, max strip for SSD, given a search window
432 static AliITSsegmentationSSD seg;
434 AliDebug(2,Form("xmin %f zmin %f xmax %f zmax %f\n",xlocmin,zlocmin,xlocmax,zlocmax));
438 seg.GetPadIxz(xlocmin,zlocmin,p,n);
441 AliDebug(5,Form("lay %d xmin, zmin p %d n %d\n",layer,p,n));
442 seg.GetPadIxz(xlocmax,zlocmin,p,n);
443 iPmin = TMath::Min(iPmin,p);
444 iPmax = TMath::Max(iPmax,p);
445 iNmin = TMath::Min(iNmin,n);
446 iNmax = TMath::Max(iNmax,n);
447 AliDebug(5,Form("lay %d xmax, zmin p %d n %d\n",layer,p,n));
448 seg.GetPadIxz(xlocmax,zlocmax,p,n);
449 iPmin = TMath::Min(iPmin,p);
450 iPmax = TMath::Max(iPmax,p);
451 iNmin = TMath::Min(iNmin,n);
452 iNmax = TMath::Max(iNmax,n);
453 AliDebug(5,Form("lay %d xmax, zmax p %d n %d\n",layer,p,n));
454 seg.GetPadIxz(xlocmin,zlocmax,p,n);
455 iPmin = TMath::Min(iPmin,p);
456 iPmax = TMath::Max(iPmax,p);
457 iNmin = TMath::Min(iNmin,n);
458 iNmax = TMath::Max(iNmax,n);
459 AliDebug(5,Form("lay %d xmin, zmax p %d n %d\n",layer,p,n));
465 if (iPmax >= kSSDStripsPerSide)
466 iPmax = kSSDStripsPerSide-1;
467 if (iNmax >= kSSDStripsPerSide)
468 iNmax = kSSDStripsPerSide-1;
469 AliDebug(2,Form("lay %d p %d %d n %d %d\n",layer,iPmin,iPmax,iNmin,iNmax));
472 //______________________________________________________________________
473 Bool_t AliITSChannelStatus::AnyBadInRoad(Int_t imod, Float_t zlocmin, Float_t zlocmax, Float_t xlocmin, Float_t xlocmax) const{
474 // Checks if there is at least one bad channel in the search road
475 // For SSD: return kTRUE if there is at least one bad strip on both sides
476 // if only bad strips on one side 1D clusters can be used
477 AliDebug(2,Form("checking for module %d",imod));
478 if(imod<kSPDModules){
479 Int_t izmin,izmax,ixmin,ixmax;
480 Bool_t retcode=GetSPDLimits(zlocmin,zlocmax,xlocmin,xlocmax,izmin,izmax,ixmin,ixmax);
481 if(!retcode) return kFALSE;
482 for(Int_t iz=izmin; iz<=izmax;iz++){
483 for(Int_t ix=ixmin; ix<=ixmax;ix++){
484 if(GetChannelStatus(imod,iz,ix)==kFALSE) return kTRUE;
487 }else if (imod < kSSDFirstModule) {
488 Int_t izmin,izmax,izmin2,izmax2;
489 Bool_t retcode=GetSDDLimits(zlocmin,zlocmax,xlocmin,xlocmax,izmin,izmax,izmin2,izmax2);
490 if(!retcode) return kFALSE;
491 for(Int_t iz=izmin; iz<=izmax;iz++){
492 if(GetChannelStatus(imod,iz,0)==kFALSE) { return kTRUE;}
494 if(izmin2!=-1 && izmax2!=-1){
495 for(Int_t iz=izmin2; iz<=izmax2;iz++){
496 if(GetChannelStatus(imod,iz,0)==kFALSE) { return kTRUE;}
502 if (imod > kSSDMaxModLay5)
504 Int_t iPmin,iPmax,iNmin,iNmax;
505 Bool_t retcode=GetSSDLimits(layer,zlocmin,zlocmax,xlocmin,xlocmax,iPmin,iPmax,iNmin,iNmax);
506 if(!retcode) return kFALSE;
508 for(Int_t iP=iPmin; iP<=iPmax;iP++){
509 if(GetChannelStatus(imod,iP,0)==kFALSE) nPbad++;
513 for(Int_t iN=iNmin; iN<=iNmax;iN++){
514 if(GetChannelStatus(imod,iN+768,0)==kFALSE) { return kTRUE; }
519 //______________________________________________________________________
520 Float_t AliITSChannelStatus::FractionOfBadInRoad(Int_t imod, Float_t zlocmin, Float_t zlocmax, Float_t xlocmin, Float_t xlocmax) const{
521 // Calculate the fraction of bad channels in the road
522 // Note: SSD returns fraction of dead strips on 'best' side. This
523 // is not proportional to dead surface area.
526 if(imod<kSPDModules){
527 Int_t izmin,izmax,ixmin,ixmax;
528 Bool_t retcode=GetSPDLimits(zlocmin,zlocmax,xlocmin,xlocmax,izmin,izmax,ixmin,ixmax);
529 if(!retcode) return 0.;
530 for(Int_t iz=izmin; iz<=izmax;iz++){
531 for(Int_t ix=ixmin; ix<=ixmax;ix++){
533 if(GetChannelStatus(imod,iz,ix)==kFALSE) badChan+=1.;
536 }else if (imod < kSSDFirstModule) {
537 Int_t izmin,izmax,izmin2,izmax2;
538 Bool_t retcode=GetSDDLimits(zlocmin,zlocmax,xlocmin,xlocmax,izmin,izmax,izmin2,izmax2);
539 if(!retcode) return 0.;
540 for(Int_t iz=izmin; iz<=izmax;iz++){
542 if(GetChannelStatus(imod,iz,0)==kFALSE) badChan+=1.;
544 if(izmin2!=-1 && izmax2!=-1){
545 for(Int_t iz=izmin2; iz<=izmax2;iz++){
547 if(GetChannelStatus(imod,iz,0)==kFALSE) badChan+=1.;
553 if (imod > kSSDMaxModLay5)
555 Int_t iPmin,iPmax,iNmin,iNmax;
556 Bool_t retcode=GetSSDLimits(layer,zlocmin,zlocmax,xlocmin,xlocmax,iPmin,iPmax,iNmin,iNmax);
557 if(!retcode) return kFALSE;
559 for(Int_t iP=iPmin; iP<=iPmax;iP++){
560 if(GetChannelStatus(imod,iP,0)==kFALSE) nPbad++;
562 Float_t fracP = (Float_t) nPbad / (iPmax-iPmin+1);
566 for(Int_t iN=iNmin; iN<=iNmax;iN++){
567 if(GetChannelStatus(imod,iN+768,0)==kFALSE) nNbad++;
569 Float_t fracN = (Float_t) nNbad / (iPmax-iPmin+1);
570 return TMath::Min(fracP,fracN);
572 if(totChan==0.) return 0.;
573 else return badChan/totChan;