00001 #include "DefectList.h"
00002 #include "DefectPrototype.h"
00003 #include "Defect.h"
00004 #include <vector>
00005
00006 namespace SctData {
00007
00008 DefectList::DefectList() {}
00009
00010 string DefectList::getClassName() const throw() {
00011 return "SctData::DefectList";
00012 }
00013
00014 void DefectList::addDefect(Defect defect) {
00015 DefectCollection::iterator i=defectList.begin();
00016 while(i!=defectList.end()){
00017
00018 const ModuleElement& ei = (*i).getModuleElement();
00019 const ModuleElement& ej = defect.getModuleElement();
00020 const DefectPrototype& pi = (*i).getPrototype();
00021 const DefectPrototype& pj = defect.getPrototype();
00022
00023
00024 if ( pi==pj ){
00025
00026 if ( ei.contains(ej) ) return;
00027
00028 if ( ej.contains(ei) ) {
00029 *i=defect;
00030 return;
00031 }
00032
00033
00034 if ( ei.overlaps(ej) || ei.adjacentTo(ej) ){
00035 unsigned first = ei.getFirst() < ej.getFirst() ? ei.getFirst() : ej.getFirst();
00036 unsigned last = ei.getLast() > ej.getLast() ? ei.getLast() : ej.getLast();
00037 i=defectList.erase(i);
00038 defectList.push_back(Defect(pi,ModuleElement(first,last)));
00039 return;
00040 }
00041 }
00042 ++i;
00043 }
00044 defectList.push_back(defect);
00045 }
00046
00047 const DefectList::DefectCollection& DefectList::getAllDefects() const {
00048 return defectList;
00049 }
00050
00051 auto_ptr<DefectList> DefectList::getDefectsAffectingElement(ModuleElement element) const {
00052 auto_ptr<DefectList> newDefects(new DefectList());
00053 for (DefectCollection::const_iterator i=defectList.begin();
00054 i!=defectList.end();
00055 ++i) {
00056 if ( (*i).getModuleElement().overlaps(element))
00057 newDefects->addDefect(*i);
00058 }
00059 return newDefects;
00060 }
00061
00062 DefectSeverity DefectList::defectSeverityAffectingElement(ModuleElement element) const {
00063 DefectSeverity s = NONE;
00064 for (DefectCollection::const_iterator i=defectList.begin();
00065 i!=defectList.end();
00066 ++i) {
00067 if ( (*i).getModuleElement().overlaps(element) && (*i).getPrototype().getSeverity() > s)
00068 s = (*i).getPrototype().getSeverity();
00069 };
00070 return s;
00071 }
00072
00073 auto_ptr<DefectList> DefectList::getDefectsEncompassingElement(ModuleElement element) const {
00074 auto_ptr<DefectList> newDefects(new DefectList());
00075 for (DefectCollection::const_iterator i=defectList.begin();
00076 i!=defectList.end();
00077 ++i) {
00078 if ( (*i).getModuleElement().contains(element))
00079 newDefects->addDefect(*i);
00080 }
00081 return newDefects;
00082 }
00083
00084 DefectSeverity DefectList::defectSeverityEncompassingElement(ModuleElement element) const {
00085 DefectSeverity s = NONE;
00086 for (DefectCollection::const_iterator i=defectList.begin();
00087 i!=defectList.end();
00088 ++i) {
00089 if ((*i).getModuleElement().contains(element) && (*i).getPrototype().getSeverity() > s)
00090 s = (*i).getPrototype().getSeverity();
00091 };
00092 return s;
00093 }
00094
00095 DefectList& DefectList::operator +=(const DefectList& toadd) {
00096 for (DefectCollection::const_iterator i=toadd.defectList.begin();
00097 i!=toadd.defectList.end();
00098 ++i) {
00099 if (!this->containsDefect(*i))
00100 this->addDefect(*i);
00101 }
00102 return *this;
00103 }
00104
00105 bool DefectList::containsDefect(Defect defect) const {
00106 for (DefectCollection::const_iterator i=defectList.begin();
00107 i!=defectList.end();
00108 ++i) {
00109 if (*i == defect) return true;
00110 }
00111 return false;
00112 }
00113
00114 unsigned DefectList::nChannelsAffected(DefectSeverity s, ModuleElement e) const{
00115 std::vector<bool> good(nChannelModule, true);
00116 for (DefectCollection::const_iterator i=defectList.begin();
00117 i!=defectList.end();
00118 ++i) {
00119 if ((*i).getPrototype().getSeverity() >= s){
00120 for (unsigned channel=(*i).getModuleElement().getFirst();
00121 channel<=(*i).getModuleElement().getLast(); ++channel){
00122 good[channel]=false;
00123 }
00124 }
00125 }
00126 unsigned nbad=0;
00127 for (unsigned channel=e.getFirst(); channel<=e.getLast(); ++channel){
00128 if (!good[channel]) ++nbad;
00129 }
00130
00131 return nbad;
00132 }
00133 }