00001 #include "DQM/SiStripMonitorSummary/interface/SiStripQualityDQM.h"
00002 #include "DQMServices/Core/interface/MonitorElement.h"
00003 #include "TCanvas.h"
00004
00005
00006 SiStripQualityDQM::SiStripQualityDQM(const edm::EventSetup & eSetup,
00007 edm::ParameterSet const& hPSet,
00008 edm::ParameterSet const& fPSet):SiStripBaseCondObjDQM(eSetup, hPSet, fPSet){
00009 qualityLabel_ = fPSet.getParameter<std::string>("StripQualityLabel");
00010
00011
00012 if(HistoMaps_On_ ) Tk_HM_ = new TkHistoMap("SiStrip/Histo_Map","Quality_TkMap",0.);
00013
00014 }
00015
00016
00017
00018
00019
00020 SiStripQualityDQM::~SiStripQualityDQM(){}
00021
00022
00023
00024
00025 void SiStripQualityDQM::getActiveDetIds(const edm::EventSetup & eSetup){
00026 getConditionObject(eSetup);
00027 qualityHandle_->getDetIds(activeDetIds);
00028
00029 }
00030
00031
00032
00033
00034 void SiStripQualityDQM::fillModMEs(const std::vector<uint32_t> & selectedDetIds){
00035
00036 ModMEs CondObj_ME;
00037
00038 for(std::vector<uint32_t>::const_iterator detIter_ = selectedDetIds.begin();
00039 detIter_!= selectedDetIds.end();detIter_++){
00040 fillMEsForDet(CondObj_ME,*detIter_);
00041
00042 }
00043 }
00044
00045
00046
00047
00048
00049
00050 void SiStripQualityDQM::fillMEsForDet(ModMEs selModME_, uint32_t selDetId_){
00051
00052 getModMEs(selModME_,selDetId_);
00053
00054 SiStripQuality::Range qualityRange = qualityHandle_->getRange(selDetId_);
00055 int nStrip = reader->getNumberOfApvsAndStripLength(selDetId_).first*128;
00056
00057 for( int istrip=0;istrip<nStrip;++istrip){
00058 try{
00059 selModME_.ProfileDistr->Fill(istrip+1,qualityHandle_->IsStripBad(qualityRange,istrip)?0.:1.);
00060
00061 }
00062 catch(cms::Exception& e){
00063 edm::LogError("SiStripQualityDQM")
00064 << "[SiStripQualityDQM::fillMEsForDet] cms::Exception accessing qualityHandle_->IsStripBad(qualityRange,istrip)?1.:0.) for strip "
00065 << istrip
00066 << " and detid "
00067 << selDetId_
00068 << " : "
00069 << e.what() ;
00070 }
00071
00072
00073
00074 }
00075
00076 }
00077
00078
00079
00080
00081 void SiStripQualityDQM::fillSummaryMEs(const std::vector<uint32_t> & selectedDetIds){
00082
00083 for(std::vector<uint32_t>::const_iterator detIter_ = selectedDetIds.begin();
00084 detIter_!= selectedDetIds.end();detIter_++){
00085 fillMEsForLayer(SummaryMEsMap_, *detIter_);
00086
00087 }
00088
00089 for (std::map<uint32_t, ModMEs>::iterator iter=SummaryMEsMap_.begin(); iter!=SummaryMEsMap_.end(); iter++){
00090
00091 ModMEs selME;
00092 selME = iter->second;
00093
00094 if(hPSet_.getParameter<bool>("FillSummaryAtLayerLevel") && fPSet_.getParameter<bool>("OutputSummaryAtLayerLevelAsImage")){
00095
00096 TCanvas c1("c1");
00097 selME.SummaryDistr->getTH1()->Draw();
00098 std::string name (selME.SummaryDistr->getTH1()->GetTitle());
00099 name+=".png";
00100 c1.Print(name.c_str());
00101 }
00102 }
00103
00104 }
00105
00106
00107
00108
00109
00110 void SiStripQualityDQM::fillMEsForLayer( std::map<uint32_t, ModMEs> selMEsMap_, uint32_t selDetId_){
00111
00112 float numberOfBadStrips=0;
00113
00114 SiStripHistoId hidmanager;
00115
00116 if(hPSet_.getParameter<bool>("FillSummaryAtLayerLevel")){
00117
00118 std::string hSummary_description;
00119 hSummary_description = hPSet_.getParameter<std::string>("Summary_description");
00120
00121 std::string hSummary_name;
00122
00123
00124 int subDetId_ = ((selDetId_>>25)&0x7);
00125
00126 if( subDetId_<3 || subDetId_>6 ){
00127 edm::LogError("SiStripQualityDQM")
00128 << "[SiStripQualityDQM::fillMEsForLayer] WRONG INPUT : no such subdetector type : "
00129 << subDetId_ << " no folder set!"
00130 << std::endl;
00131 return;
00132 }
00133
00134
00135 hSummary_name = hidmanager.createHistoLayer(hSummary_description,
00136 "layer",
00137 getLayerNameAndId(selDetId_).first,
00138 "") ;
00139
00140 std::map<uint32_t, ModMEs>::iterator selMEsMapIter_ = selMEsMap_.find(getLayerNameAndId(selDetId_).second);
00141
00142 ModMEs selME_;
00143 selME_ =selMEsMapIter_->second;
00144
00145 getSummaryMEs(selME_,selDetId_ );
00146
00147
00148 std::vector<uint32_t> sameLayerDetIds_;
00149 sameLayerDetIds_.clear();
00150 sameLayerDetIds_=GetSameLayerDetId(activeDetIds,selDetId_);
00151
00152
00153
00154
00155
00156
00157 if(std::binary_search(alreadyFilledLayers.begin(),alreadyFilledLayers.end(),sameLayerDetIds_[0]))
00158 return;
00159 alreadyFilledLayers.push_back(sameLayerDetIds_[0]);
00160 sort(alreadyFilledLayers.begin(),alreadyFilledLayers.end());
00161
00162
00163 for(unsigned int i=0;i< sameLayerDetIds_.size(); i++){
00164
00165 SiStripQuality::Range qualityRange = qualityHandle_->getRange(sameLayerDetIds_[i]);
00166 int nStrip = reader->getNumberOfApvsAndStripLength(sameLayerDetIds_[i]).first*128;
00167
00168 numberOfBadStrips=0;
00169
00170 for( int istrip=0;istrip<nStrip;++istrip){
00171 if(qualityHandle_->IsStripBad(qualityRange,istrip)) { numberOfBadStrips++;}
00172 }
00173
00174 try{
00175 float fr=100*float(numberOfBadStrips)/nStrip;
00176 selME_.SummaryDistr->Fill(i+1,fr);
00177 if(fr>20){
00178 char c[9];
00179 sprintf(c,"%d",sameLayerDetIds_[i]);
00180 selME_.SummaryDistr->getTH1()->GetXaxis()->SetBinLabel(i+1,c);
00181 }
00182
00183
00184 if(HistoMaps_On_ ) Tk_HM_->setBinContent(sameLayerDetIds_[i], fr);
00185
00186
00187 if(fPSet_.getParameter<bool>("TkMap_On") || hPSet_.getParameter<bool>("TkMap_On")){
00188 fillTkMap(sameLayerDetIds_[i], fr);
00189 }
00190
00191 }
00192 catch(cms::Exception& e){
00193 edm::LogError("SiStripQualityDQM")
00194 << "[SiStripQualityDQM::fillMEsForLayer] cms::Exception filling fraction of bad strips for detId "
00195 << sameLayerDetIds_[i]
00196 << " : "
00197 << e.what() ;
00198 }
00199 }
00200 }
00201 }
00202
00203
00204
00205
00206 void SiStripQualityDQM::fillGrandSummaryMEs(){
00207
00208
00209
00210 std::string hSummary_BadObjects_xTitle = hPSet_.getParameter<std::string>("Summary_BadObjects_histo_xTitle");
00211
00212 std::string hSummary_BadModules_name = hPSet_.getParameter<std::string>("Summary_BadModules_histo_name");
00213 std::string hSummary_BadModules_yTitle = hPSet_.getParameter<std::string>("Summary_BadModules_histo_yTitle");
00214
00215 std::string hSummary_BadFibers_name = hPSet_.getParameter<std::string>("Summary_BadFibers_histo_name");
00216 std::string hSummary_BadFibers_yTitle = hPSet_.getParameter<std::string>("Summary_BadFibers_histo_yTitle");
00217
00218 std::string hSummary_BadApvs_name = hPSet_.getParameter<std::string>("Summary_BadApvs_histo_name");
00219 std::string hSummary_BadApvs_yTitle = hPSet_.getParameter<std::string>("Summary_BadApvs_histo_yTitle");
00220
00221 std::string hSummary_BadStrips_name = hPSet_.getParameter<std::string>("Summary_BadStrips_histo_name");
00222 std::string hSummary_BadStrips_yTitle = hPSet_.getParameter<std::string>("Summary_BadStrips_histo_yTitle");
00223
00224 int NchX = 34;
00225 double LowX = 0.5;
00226 double HighX = 34.5;
00227
00228
00229
00230
00231 MonitorElement *ME[4];
00232
00233 DQMStore* dqmStore_=edm::Service<DQMStore>().operator->();
00234
00235 std::string FolderName=fPSet_.getParameter<std::string>("FolderName_For_QualityAndCabling_SummaryHistos");
00236
00237 dqmStore_->setCurrentFolder(FolderName);
00238
00239 ME[0] = dqmStore_->book1D(hSummary_BadModules_name,hSummary_BadModules_name,NchX,LowX,HighX);
00240 ME[0]->setAxisTitle(hSummary_BadObjects_xTitle,1);
00241 ME[0]->setAxisTitle(hSummary_BadModules_yTitle,2);
00242
00243 ME[1] = dqmStore_->book1D(hSummary_BadFibers_name,hSummary_BadFibers_name,NchX,LowX,HighX);
00244 ME[1]->setAxisTitle(hSummary_BadObjects_xTitle,1);
00245 ME[1]->setAxisTitle(hSummary_BadFibers_yTitle,2);
00246
00247 ME[2] = dqmStore_->book1D(hSummary_BadApvs_name,hSummary_BadApvs_name,NchX,LowX,HighX);
00248 ME[2]->setAxisTitle(hSummary_BadObjects_xTitle,1);
00249 ME[2]->setAxisTitle(hSummary_BadApvs_yTitle,2);
00250
00251 ME[3] = dqmStore_->book1D(hSummary_BadStrips_name,hSummary_BadStrips_name,NchX,LowX,HighX);
00252 ME[3]->setAxisTitle(hSummary_BadObjects_xTitle,1);
00253 ME[3]->setAxisTitle(hSummary_BadStrips_yTitle,2);
00254
00255
00256
00257
00258 for(int i=0;i<4;++i){
00259 NTkBadComponent[i]=0;
00260 for(int j=0;j<19;++j){
00261 ssV[i][j].str("");
00262 for(int k=0;k<4;++k)
00263 NBadComponent[i][j][k]=0;
00264 }
00265 }
00266
00267 std::stringstream ss;
00268 ss.str("");
00269 std::vector<uint32_t> detids=reader->getAllDetIds();
00270 std::vector<uint32_t>::const_iterator idet=detids.begin();
00271 for(;idet!=detids.end();++idet){
00272 ss << "detid " << (*idet) << " IsModuleUsable " << qualityHandle_->IsModuleUsable((*idet)) << "\n";
00273 }
00274 LogDebug("SiStripQualityStatistics") << ss.str() << std::endl;
00275
00276
00277 std::vector<SiStripQuality::BadComponent> BC = qualityHandle_->getBadComponentList();
00278
00279 for (size_t i=0;i<BC.size();++i){
00280
00281
00282
00283
00284
00285 if (BC[i].BadModule)
00286 NTkBadComponent[0]++;
00287 if (BC[i].BadFibers)
00288 NTkBadComponent[1]+= ( (BC[i].BadFibers>>2)&0x1 )+ ( (BC[i].BadFibers>>1)&0x1 ) + ( (BC[i].BadFibers)&0x1 );
00289 if (BC[i].BadApvs)
00290 NTkBadComponent[2]+= ( (BC[i].BadApvs>>5)&0x1 )+ ( (BC[i].BadApvs>>4)&0x1 ) + ( (BC[i].BadApvs>>3)&0x1 ) +
00291 ( (BC[i].BadApvs>>2)&0x1 )+ ( (BC[i].BadApvs>>1)&0x1 ) + ( (BC[i].BadApvs)&0x1 );
00292
00293
00294
00295
00296
00297 int component;
00298 SiStripDetId a(BC[i].detid);
00299 if ( a.subdetId() == SiStripDetId::TIB ){
00300
00301
00302
00303
00304 component=TIBDetId(BC[i].detid).layer();
00305 SetBadComponents(0, component, BC[i]);
00306
00307 } else if ( a.subdetId() == SiStripDetId::TID ) {
00308
00309
00310
00311
00312 component=TIDDetId(BC[i].detid).side()==2?TIDDetId(BC[i].detid).wheel():TIDDetId(BC[i].detid).wheel()+3;
00313 SetBadComponents(1, component, BC[i]);
00314
00315 } else if ( a.subdetId() == SiStripDetId::TOB ) {
00316
00317
00318
00319
00320 component=TOBDetId(BC[i].detid).layer();
00321 SetBadComponents(2, component, BC[i]);
00322
00323 } else if ( a.subdetId() == SiStripDetId::TEC ) {
00324
00325
00326
00327
00328 component=TECDetId(BC[i].detid).side()==2?TECDetId(BC[i].detid).wheel():TECDetId(BC[i].detid).wheel()+9;
00329 SetBadComponents(3, component, BC[i]);
00330
00331 }
00332 }
00333
00334
00335
00336
00337
00338 SiStripQuality::RegistryIterator rbegin = qualityHandle_->getRegistryVectorBegin();
00339 SiStripQuality::RegistryIterator rend = qualityHandle_->getRegistryVectorEnd();
00340
00341 for (SiStripBadStrip::RegistryIterator rp=rbegin; rp != rend; ++rp) {
00342 uint32_t detid=rp->detid;
00343
00344 int subdet=0;
00345 int component=0;
00346 SiStripDetId a(detid);
00347 if ( a.subdetId() == 3 ){
00348 subdet=0;
00349 component=TIBDetId(detid).layer();
00350 } else if ( a.subdetId() == 4 ) {
00351 subdet=1;
00352 component=TIDDetId(detid).side()==2?TIDDetId(detid).wheel():TIDDetId(detid).wheel()+3;
00353 } else if ( a.subdetId() == 5 ) {
00354 subdet=2;
00355 component=TOBDetId(detid).layer();
00356 } else if ( a.subdetId() == 6 ) {
00357 subdet=3;
00358 component=TECDetId(detid).side()==2?TECDetId(detid).wheel():TECDetId(detid).wheel()+9;
00359 }
00360
00361 SiStripQuality::Range sqrange = SiStripQuality::Range( qualityHandle_->getDataVectorBegin()+rp->ibegin , qualityHandle_->getDataVectorBegin()+rp->iend );
00362
00363 for(int it=0;it<sqrange.second-sqrange.first;it++){
00364 unsigned int range=qualityHandle_->decode( *(sqrange.first+it) ).range;
00365 NTkBadComponent[3]+=range;
00366 NBadComponent[subdet][0][3]+=range;
00367 NBadComponent[subdet][component][3]+=range;
00368 }
00369 }
00370
00371
00372
00373
00374
00375
00376 ss.str("");
00377 ss << "\n-----------------\nGlobal Info\n-----------------";
00378 ss << "\nBadComponent \t Modules \tFibers \tApvs\tStrips\n----------------------------------------------------------------";
00379 ss << "\nTracker:\t\t"<<NTkBadComponent[0]<<"\t"<<NTkBadComponent[1]<<"\t"<<NTkBadComponent[2]<<"\t"<<NTkBadComponent[3];
00380 ss<< "\n";
00381 ss << "\nTIB:\t\t\t"<<NBadComponent[0][0][0]<<"\t"<<NBadComponent[0][0][1]<<"\t"<<NBadComponent[0][0][2]<<"\t"<<NBadComponent[0][0][3];
00382 ss << "\nTID:\t\t\t"<<NBadComponent[1][0][0]<<"\t"<<NBadComponent[1][0][1]<<"\t"<<NBadComponent[1][0][2]<<"\t"<<NBadComponent[1][0][3];
00383 ss << "\nTOB:\t\t\t"<<NBadComponent[2][0][0]<<"\t"<<NBadComponent[2][0][1]<<"\t"<<NBadComponent[2][0][2]<<"\t"<<NBadComponent[2][0][3];
00384 ss << "\nTEC:\t\t\t"<<NBadComponent[3][0][0]<<"\t"<<NBadComponent[3][0][1]<<"\t"<<NBadComponent[3][0][2]<<"\t"<<NBadComponent[3][0][3];
00385 ss << "\n";
00386
00387 for (int i=1;i<5;++i){
00388 ss << "\nTIB Layer " << i << " :\t\t"<<NBadComponent[0][i][0]<<"\t"<<NBadComponent[0][i][1]<<"\t"<<NBadComponent[0][i][2]<<"\t"<<NBadComponent[0][i][3];
00389 std::stringstream binlabel;
00390 binlabel<<"TIB L "<<i;
00391
00392 for(int j=0;j<4;j++){
00393 ME[j]->Fill(i,NBadComponent[0][i][j]);
00394 ME[j]->getTH1()->GetXaxis()->SetBinLabel(i,binlabel.str().c_str());
00395 }
00396 }
00397 ss << "\n";
00398 for (int i=1;i<4;++i){
00399 ss << "\nTID+ Disk " << i << " :\t\t"<<NBadComponent[1][i][0]<<"\t"<<NBadComponent[1][i][1]<<"\t"<<NBadComponent[1][i][2]<<"\t"<<NBadComponent[1][i][3];
00400 std::stringstream binlabel;
00401 binlabel<<"TID+ D "<<i;
00402
00403 for(int j=0;j<4;j++){
00404 ME[j]->Fill(i+4,NBadComponent[1][i][j]);
00405 ME[j]->getTH1()->GetXaxis()->SetBinLabel(i+4,binlabel.str().c_str());
00406 }
00407 }
00408 for (int i=4;i<7;++i){
00409 ss << "\nTID- Disk " << i-3 << " :\t\t"<<NBadComponent[1][i][0]<<"\t"<<NBadComponent[1][i][1]<<"\t"<<NBadComponent[1][i][2]<<"\t"<<NBadComponent[1][i][3];
00410 std::stringstream binlabel;
00411 binlabel<<"TID- D "<<i-3;
00412
00413 for(int j=0;j<4;j++){
00414 ME[j]->Fill(i+4,NBadComponent[1][i][j]);
00415 ME[j]->getTH1()->GetXaxis()->SetBinLabel(i+4,binlabel.str().c_str());
00416 }
00417 }
00418 ss << "\n";
00419 for (int i=1;i<7;++i){
00420 ss << "\nTOB Layer " << i << " :\t\t"<<NBadComponent[2][i][0]<<"\t"<<NBadComponent[2][i][1]<<"\t"<<NBadComponent[2][i][2]<<"\t"<<NBadComponent[2][i][3];
00421 std::stringstream binlabel;
00422 binlabel<<"TOB L "<<i;
00423
00424 for(int j=0;j<4;j++){
00425 ME[j]->Fill(i+10,NBadComponent[2][i][j]);
00426 ME[j]->getTH1()->GetXaxis()->SetBinLabel(i+10,binlabel.str().c_str());
00427 }
00428 }
00429 ss << "\n";
00430 for (int i=1;i<10;++i){
00431 ss << "\nTEC+ Disk " << i << " :\t\t"<<NBadComponent[3][i][0]<<"\t"<<NBadComponent[3][i][1]<<"\t"<<NBadComponent[3][i][2]<<"\t"<<NBadComponent[3][i][3];
00432 std::stringstream binlabel;
00433 binlabel<<"TEC+ D "<<i;
00434
00435 for(int j=0;j<4;j++){
00436 ME[j]->Fill(i+16,NBadComponent[3][i][j]);
00437 ME[j]->getTH1()->GetXaxis()->SetBinLabel(i+16,binlabel.str().c_str());
00438 }
00439 }
00440 for (int i=10;i<19;++i){
00441 ss << "\nTEC- Disk " << i-9 << " :\t\t"<<NBadComponent[3][i][0]<<"\t"<<NBadComponent[3][i][1]<<"\t"<<NBadComponent[3][i][2]<<"\t"<<NBadComponent[3][i][3];
00442 std::stringstream binlabel;
00443 binlabel<<"TEC- D "<<i-9;
00444
00445 for(int j=0;j<4;j++){
00446 ME[j]->Fill(i+16,NBadComponent[3][i][j]);
00447 ME[j]->getTH1()->GetXaxis()->SetBinLabel(i+16,binlabel.str().c_str());
00448 }
00449 }
00450 ss<< "\n";
00451
00452 ss << "\n----------------------------------------------------------------\n\t\t Detid \tModules Fibers Apvs\n----------------------------------------------------------------";
00453 for (int i=1;i<5;++i)
00454 ss << "\nTIB Layer " << i << " :" << ssV[0][i].str();
00455 ss << "\n";
00456 for (int i=1;i<4;++i)
00457 ss << "\nTID+ Disk " << i << " :" << ssV[1][i].str();
00458 for (int i=4;i<7;++i)
00459 ss << "\nTID- Disk " << i-3 << " :" << ssV[1][i].str();
00460 ss << "\n";
00461 for (int i=1;i<7;++i)
00462 ss << "\nTOB Layer " << i << " :" << ssV[2][i].str();
00463 ss << "\n";
00464 for (int i=1;i<10;++i)
00465 ss << "\nTEC+ Disk " << i << " :" << ssV[3][i].str();
00466 for (int i=10;i<19;++i)
00467 ss << "\nTEC- Disk " << i-9 << " :" << ssV[3][i].str();
00468
00469
00470 edm::LogInfo("SiStripQualityStatistics") << ss.str() << std::endl;
00471
00472 for (int i=0; i<4; i++){
00473 TCanvas c1("c1");
00474 ME[i]->getTH1()->Draw();
00475 std::string name (ME[i]->getTH1()->GetTitle());
00476 name+=".png";
00477 c1.Print(name.c_str());
00478 }
00479
00480
00481 }
00482
00483
00484 void SiStripQualityDQM::SetBadComponents(int i, int component,SiStripQuality::BadComponent& BC){
00485
00486 int napv=reader->getNumberOfApvsAndStripLength(BC.detid).first;
00487
00488 ssV[i][component] << "\n\t\t "
00489 << BC.detid
00490 << " \t " << BC.BadModule << " \t "
00491 << ( (BC.BadFibers)&0x1 ) << " ";
00492 if (napv==4)
00493 ssV[i][component] << "x " <<( (BC.BadFibers>>1)&0x1 );
00494
00495 if (napv==6)
00496 ssV[i][component] << ( (BC.BadFibers>>1)&0x1 ) << " "
00497 << ( (BC.BadFibers>>2)&0x1 );
00498 ssV[i][component] << " \t "
00499 << ( (BC.BadApvs)&0x1 ) << " "
00500 << ( (BC.BadApvs>>1)&0x1 ) << " ";
00501 if (napv==4)
00502 ssV[i][component] << "x x " << ( (BC.BadApvs>>2)&0x1 ) << " "
00503 << ( (BC.BadApvs>>3)&0x1 );
00504 if (napv==6)
00505 ssV[i][component] << ( (BC.BadApvs>>2)&0x1 ) << " "
00506 << ( (BC.BadApvs>>3)&0x1 ) << " "
00507 << ( (BC.BadApvs>>4)&0x1 ) << " "
00508 << ( (BC.BadApvs>>5)&0x1 ) << " ";
00509
00510 if (BC.BadApvs){
00511 NBadComponent[i][0][2]+= ( (BC.BadApvs>>5)&0x1 )+ ( (BC.BadApvs>>4)&0x1 ) + ( (BC.BadApvs>>3)&0x1 ) +
00512 ( (BC.BadApvs>>2)&0x1 )+ ( (BC.BadApvs>>1)&0x1 ) + ( (BC.BadApvs)&0x1 );
00513 NBadComponent[i][component][2]+= ( (BC.BadApvs>>5)&0x1 )+ ( (BC.BadApvs>>4)&0x1 ) + ( (BC.BadApvs>>3)&0x1 ) +
00514 ( (BC.BadApvs>>2)&0x1 )+ ( (BC.BadApvs>>1)&0x1 ) + ( (BC.BadApvs)&0x1 );
00515
00516 }
00517 if (BC.BadFibers){
00518 NBadComponent[i][0][1]+= ( (BC.BadFibers>>2)&0x1 )+ ( (BC.BadFibers>>1)&0x1 ) + ( (BC.BadFibers)&0x1 );
00519 NBadComponent[i][component][1]+= ( (BC.BadFibers>>2)&0x1 )+ ( (BC.BadFibers>>1)&0x1 ) + ( (BC.BadFibers)&0x1 );
00520
00521 }
00522 if (BC.BadModule){
00523 NBadComponent[i][0][0]++;
00524 NBadComponent[i][component][0]++;
00525
00526 }
00527 }
00528