00001 #include "DoubleTriggerNoiseAlgorithm.h"
00002 #include "AnalysisAlgorithmMap.h"
00003 #include "AnalysisService.h"
00004 #include "SctData/DoubleTriggerNoiseTestResult.h"
00005 #include "SctData/StandardDefects.h"
00006 #include "SctData/RawScanResult.h"
00007 #include "SctData/ConfigurationVariable.h"
00008 #include "Sct/UnsupportedOperationError.h"
00009 #include "SctData/OccupancyProjector.h"
00010 #include <CommonWithDsp/ABCD/ABCDscans.h>
00011 #include <TH1.h>
00012
00013 using namespace std;
00014 using namespace boost;
00015 using namespace SctData;
00016 using namespace Sct;
00017
00018 namespace SctAnalysis {
00019
00020 DoubleTriggerNoiseAlgorithm::~DoubleTriggerNoiseAlgorithm() throw() {}
00021
00022 shared_ptr<AnalysisAlgorithm> DoubleTriggerNoiseAlgorithm::clone(const TestData& testData, const string& moduleName) const throw() {
00023 return shared_ptr<AnalysisAlgorithm>(new DoubleTriggerNoiseAlgorithm(testData, moduleName, *this));
00024 }
00025
00026 bool DoubleTriggerNoiseAlgorithm::inMap = AnalysisAlgorithmMap::instance().setAlgorithm("DoubleTriggerNoiseTest", auto_ptr<AnalysisAlgorithm>(new DoubleTriggerNoiseAlgorithm()));
00027
00028
00029
00030 void DoubleTriggerNoiseAlgorithm::loadData() {
00031 loadAllRaws();
00032 }
00033
00034 bool DoubleTriggerNoiseAlgorithm::canAnalyze() const {
00035 return hasAllRaws();
00036 }
00037
00038 shared_ptr<SctData::TestResult> DoubleTriggerNoiseAlgorithm::createTestResult() const {
00039 return shared_ptr<TestResult>(new DoubleTriggerNoiseTestResult());
00040 }
00041
00042 void DoubleTriggerNoiseAlgorithm::analyze() {
00043 shared_ptr<DoubleTriggerNoiseTestResult> result = dynamic_pointer_cast<DoubleTriggerNoiseTestResult>(getTestResult());
00044 const SctData::ConfigurationVariable& scanVariable = getRaw(0)->getHeader().getVariable();
00045 result->setScanVariable(scanVariable);
00046 const ModuleConfiguration config=getRaw(0)->getConfiguration();
00047
00048 m_scanVariable = SctData::ConfigurationVariableIOHelper::getTypeRep(scanVariable);
00049
00050 result->setPassed(true);
00051
00052 OccupancyProjector opr(*getRaw(0) );
00053 for (unsigned int ichip=0; ichip<nChipModule; ++ichip) {
00054
00055
00056 auto_ptr<TH1> occ = opr.getOccupancy("temp", ModuleElement::Chip(ichip)) ;
00057 float peak=0;
00058 float av=0;
00059 for (unsigned ibin=1; ibin<=occ->GetNbinsX(); ++ibin){
00060 const float value=occ->GetBinContent(ibin);
00061 if (value>peak) peak=value;
00062 av+=value;
00063 }
00064 if (occ->GetNbinsX()>0) av/=static_cast<float>(occ->GetNbinsX());
00065 result->setPeakOccupancy(ichip, peak);
00066 result->setPedestalOccupancy(ichip, av);
00067 if (peak > 5E-4 || peak > av*5.) result->setPassed(false);
00068 }
00069 }
00070 }