00001 #include "SctData/FitScanResult.h"
00002 #include "SctData/FitObject.h"
00003
00004 #include "../../AnalysisTests/AnalysisTestFramework.h"
00005 #include "../../AnalysisTests/CutUtils.h"
00006
00007 using namespace Sct;
00008 using namespace Sct::IS;
00009 using namespace boost;
00010 using namespace SctData;
00011 using namespace SctTest;
00012 using namespace std;
00013
00014 struct Info {
00015 unsigned int runNumber;
00016 unsigned int scanNumber;
00017 unsigned int channel;
00018 char serial[15];
00019 };
00020 string InfoStr = "Run/i:Scan:Channel:Serial/C";
00021
00022 struct ThresholdData {
00023 double Mean;
00024 double Sigma;
00025 double ChiSq;
00026 };
00027 string ThresholdDataStr = "Mean/D:Sigma:ChiSq";
00028
00029 ThresholdData root;
00030 ThresholdData nag;
00031 Info info;
00032
00033 class NagRootCompare : public AnalysisTestFramework<FitScanResult> {
00034 public:
00035 NagRootCompare();
00036 virtual void doModule(string serialNumber);
00037 virtual void publishData(SctTestApiStatus* status);
00038 virtual void setup();
00039 virtual void summaryOutput();
00040
00041 private:
00042 void setFitStrategy(string strategy);
00043 void compareFits(FitScanResult& nagFit, FitScanResult& rootFit);
00044 void fillData(FitObject& fitOb, ThresholdData& data);
00045 void removeAll();
00046 };
00047
00048 NagRootCompare::NagRootCompare() : AnalysisTestFramework<FitScanResult>(".*FitScanResult", "FittedData") {
00049 nData = 10;
00050 }
00051
00052 void NagRootCompare::removeAll() {
00053 ISInfoIterator it( SctNames::getPartition(), "FittedData", ".*" );
00054 ISInfoDictionary dict(SctNames::getPartition());
00055 while (it()) {
00056 dict.remove(it.name());
00057 }
00058 ISInfoIterator it2( SctNames::getPartition(), "EventData", ".*" );
00059 while (it2()) {
00060 dict.remove(it2.name());
00061 }
00062 system("is_ls -p SCT");
00063 }
00064
00065 void NagRootCompare::doModule(string serialNumber) {
00066 SctTestApiStatus status;
00067 status.returnCode = 0;
00068
00069 highLevelApi->setModuleSerial(&status, copyStringToILU(serialNumber));
00070
00071 try {
00072 setFitStrategy("NagFitStrategy");
00073 publishData(&status);
00074 if (status.returnCode != 0) {
00075 cerr << "Error publishing data: " << status.returnCode << endl;
00076 return;
00077 }
00078 vector<shared_ptr<FitScanResult> > nagFits = readData(serialNumber);
00079
00080 removeAll();
00081 setFitStrategy("RootFitStrategy");
00082
00083 publishData(&status);
00084 if (status.returnCode != 0) {
00085 cerr << "Error publishing data: " << status.returnCode << endl;
00086 return;
00087 }
00088 vector<shared_ptr<FitScanResult> > rootFits = readData(serialNumber);
00089
00090 if (nagFits.size() != rootFits.size()) {
00091 cout << "Numbers of fits different!! Nag: " << nagFits.size() << " Root: " << rootFits.size() << endl;
00092 ++exitCode;
00093 return;
00094 }
00095
00096 for (unsigned int i=0; i<nagFits.size(); ++i) {
00097 compareFits(*nagFits[i], *rootFits[i]);
00098 }
00099 } catch(Throwable& e) {
00100 e.sendToMrs(MRS_ERROR);
00101 }
00102 }
00103
00104
00105
00106 void NagRootCompare::fillData(FitObject& fitOb, ThresholdData& data) {
00107 data.Mean = fitOb.getParameter("Mean");
00108 data.Sigma = fitOb.getParameter("Sigma");
00109 data.ChiSq = fitOb.getChiSquared() / (fitOb.getNDF() + fitOb.getNPar());
00110 }
00111
00112
00113 void NagRootCompare::compareFits(FitScanResult& nagFit, FitScanResult& rootFit) {
00114 info.runNumber = nagFit.getHeader().getRunNumber();
00115 info.scanNumber = nagFit.getHeader().getScanNumber();
00116 strncpy(info.serial, nagFit.getHeader().getModuleName().c_str(), 14);
00117
00118
00119 for (unsigned int channel = 0; channel<nChannelModule; ++channel) {
00120 info.channel = channel;
00121 fillData(nagFit.getChannelFit(channel), nag);
00122 fillData(rootFit.getChannelFit(channel), root);
00123
00124 tree->Fill();
00125 }
00126 }
00127
00128
00132 void NagRootCompare::setup() {
00133 string name = Env::substituteVariables("${SCT_DAQ_ROOT}/SystemTests/logs/NagRootComp.root");
00134 file = new TFile(name.c_str(), "RECREATE");
00135 tree = new TTree("Data", "Threshold Scan Comparison Data");
00136 tree->Branch("Info", &info, InfoStr.c_str());
00137 tree->Branch("Nag", &nag, ThresholdDataStr.c_str());
00138 tree->Branch("Root", &root, ThresholdDataStr.c_str());
00139 info.serial[14] = '\0';
00140 }
00141
00142 void NagRootCompare::publishData(SctTestApiStatus* status) {
00143 highLevelApi->responseCurve(status);
00144 }
00145
00149 void NagRootCompare::summaryOutput() {
00150 if (cut(*tree, "mean", "(Nag.Mean-Root.Mean)/Nag.Mean*100", 0.1, 0.5, 5) > 0) {
00151 ++exitCode;
00152 cout << "Failed mean tail check" << endl;
00153 }
00154 if (cut(*tree, "sigma", "(Nag.Sigma-Root.Sigma)/Nag.Sigma*100", 1, 2, 10) > 0) {
00155 ++exitCode;
00156 cout << "Failed sigma tail check" << endl;
00157 }
00158 if (cut(*tree, "chi", "(Nag.ChiSq-Root.ChiSq)", 0.3, 0.5, 2, false) > 0) {
00159 ++exitCode;
00160 cout << "Failed ChiSq tail check" << endl;
00161 }
00162 }
00163
00164 void NagRootCompare::setFitStrategy(string strategy) {
00165 string command = "java -Dipc.ref.file=$IPC_REF_FILE bsh.Interpreter $SCT_DAQ_ROOT/SystemTests/scripts/SetFitStrategy.bsh " + strategy;
00166 system(command.c_str());
00167 }
00168
00169 int main(int argc, char** argv) {
00170 TH1::AddDirectory(true);
00171 NagRootCompare sdc;
00172 sdc.analyzeAll(argc, argv);
00173 return sdc.getExitCode();
00174 }