00001 #include "NMaskAlgorithm.h"
00002 #include "AnalysisAlgorithmMap.h"
00003 #include "SctData/NMaskTestResult.h"
00004 #include "SctData/RawScanResult.h"
00005 #include "SctData/StandardDefects.h"
00006 #include "SctData/ModuleElement.h"
00007 #include <TH1.h>
00008 #include <TH2.h>
00009
00010 using namespace std;
00011 using namespace boost;
00012 using namespace SctData;
00013 using namespace Sct;
00014
00015 namespace SctAnalysis {
00016
00017 bool NMaskAlgorithm::inMap = AnalysisAlgorithmMap::instance().setAlgorithm("NMaskTest", auto_ptr<AnalysisAlgorithm>(new NMaskAlgorithm()));
00018
00019 shared_ptr<AnalysisAlgorithm> NMaskAlgorithm::clone(const TestData& testData, const string& moduleName) const throw() {
00020 return shared_ptr<AnalysisAlgorithm>(new NMaskAlgorithm(testData, moduleName, *this));
00021 }
00022
00023 void NMaskAlgorithm::loadData() {
00024 loadAllRaws();
00025 }
00026
00027 bool NMaskAlgorithm::canAnalyze() const {
00028 return hasAllRaws();
00029 }
00030
00031 shared_ptr<SctData::TestResult> NMaskAlgorithm::createTestResult() const {
00032 return shared_ptr<NMaskTestResult> (new NMaskTestResult());
00033 }
00034
00035 void NMaskAlgorithm::analyze() {
00036 shared_ptr<NMaskTestResult> result = dynamic_pointer_cast<NMaskTestResult> ( getTestResult() );
00037
00038 shared_ptr<const RawScanResult> raw = getRaw(0);
00039 result->setScanVariable(raw->getHeader().getVariable());
00040
00041 TH2D& link0 = raw->getScanData(0);
00042 TH2D& link1 = raw->getScanData(1);
00043 int nTriggers = (int)result->getTestPointAt(0);
00044
00045 for (unsigned int channel = 0; channel<Sct::nChannelModule; ++channel) {
00046 for (unsigned int bin = 0; bin<link0.GetNbinsY(); ++bin) {
00047 int content = (int) channel < Sct::nChannelLink ? link0.GetBinContent(channel+1, bin+1) : link1.GetBinContent(channel+1-nChannelLink, bin+1);
00048 if (channel%nChannelChip < bin) {
00049 if (content != 0) {
00050 result->getDefects().addDefect(Defect(StandardDefects::OVER, ModuleElement::Channel(channel)));
00051 break;
00052 }
00053 } else {
00054 if (content != nTriggers) {
00055 result->getDefects().addDefect(Defect(StandardDefects::UNDER, ModuleElement::Channel(channel)));
00056 break;
00057 }
00058 }
00059 }
00060 }
00061 if (result->getDefects().getAllDefects().size() != 0)
00062 result->setPassed(false);
00063 else
00064 result->setPassed(true);
00065 }
00066 }