RetrieveAndCompare.cpp

00001 #include "SctData/NoiseOccupancyTestResult.h"
00002 #include "SctData/RawScanResult.h"
00003 #include "Sct/IS/IONameIS.h"
00004 #include "../../AnalysisTestFramework.h"
00005 #include "../../CutUtils.h"
00006 #include "../../TestFileUtil.h"
00007 
00008 using namespace SctData;
00009 using namespace Sct::IS;
00010 //#include <TTree.h>
00011 //#include <TFile.h>
00012 //#include "ipc/core.h"
00013 
00014 struct Info {
00015     unsigned int runNumber;
00016     unsigned int scanNumber;
00017     unsigned int chip;
00018     unsigned int nScans;
00019     float SCTDAQVersion;
00020     char serial[15];    
00021 };
00022 string InfoStr = "Run/i:Scan:Chip:NScans:SCTDAQVersion/F:Serial/C";
00023 
00024 struct NOData {
00025     double mean;
00026     double rms;
00027     double offset;
00028     double noise;
00029     int pass;
00030 };
00031 string DataStr = "Mean/D:Rms:Offset:Noise:Pass/I";
00032 
00033 //Globals variables:
00034 NOData RodDaq;                    //Our data
00035 NOData SctDaq;                    //SCTDAQ data
00036 struct Info info;                          //Some info
00037 
00038 //Noise Occupancy stuff
00039 string Ext = "_Noise.dat";
00040 string Output = "${SCT_DAQ_ROOT}/SystemTests/logs/NoiseOccupancy.root";
00041 string Arg = "-8";
00042 
00043 class NoiseOccupancyCompare : public AnalysisTestFramework<NoiseOccupancyTestResult> {
00044 public:
00045     virtual void publishData();
00046     virtual void downloadData(string serialNumber);
00047     virtual void compare(const NoiseOccupancyTestResult& t);   
00048     virtual void summaryOutput();
00049     virtual void setup();
00050 };
00051 
00052 
00053 string getFileName(string serial) {
00054     ostringstream oss;
00055     oss << serial << Ext;
00056     
00057     return oss.str();
00058 }
00059 
00060 void NoiseOccupancyCompare::summaryOutput() {
00061     if (cut(*tree, "mean", "(RodDaq.Mean-SctDaq.Mean)", 5e-5, 5e-5, 2e-4, true) > 0) {
00062         ++exitCode;
00063         cout << "Failed mean tail check" << endl;
00064     }
00065     //Allow 0.1% to fail this cut - due to SCTDAQ not excluding defective channels from calc
00066     if (cut(*tree, "rms", "(RodDaq.Rms-SctDaq.Rms)", 5e-5, 5e-5, 2e-4, true) > 0.001) {
00067         ++exitCode;
00068         cout << "Failed rms tail check" << endl;
00069     }
00070     if (cut(*tree, "Offset", "(RodDaq.Offset-SctDaq.Offset)/SctDaq.Offset", 0.01, 0.01, 0.03, true, "Info.SCTDAQVersion>3.401") > 0) {
00071         ++exitCode;
00072         cout << "Failed offset tail check" << endl;
00073     }
00074     if (cut(*tree, "Offset", "(RodDaq.Offset-SctDaq.Offset-9.5)", 1, 3, 10, true, "Info.SCTDAQVersion<3.401") > 0) {
00075         ++exitCode;
00076         cout << "Failed old version offset tail check" << endl;
00077     }
00078     if (cut(*tree, "noise", "(RodDaq.Noise-SctDaq.Noise)/SctDaq.Noise", 0.01, 0.02, 0.1, true) > 0) {
00079         ++exitCode;
00080         cout << "Failed noise tail check" << endl;
00081     }
00082     if (cut(*tree, "pass", "(RodDaq.Pass-SctDaq.Pass)", 0.01, 0.01, 0.01, true) > 0) {
00083         ++exitCode;
00084         cout << "Failed pass tail check" << endl;
00085     }
00086     exitCode += errorCode;
00087 }
00088 
00089 void NoiseOccupancyCompare::compare(const NoiseOccupancyTestResult& sd) {
00090     strncpy(info.serial, sd.getModuleName().c_str(), 14);
00091     info.runNumber = sd.getRunNumber();
00092     info.scanNumber = sd.getScanNumberAt(0);
00093     info.nScans = sd.getNScans();
00094     
00095     string fileName = getFileName(sd.getModuleName());
00096     ifstream file (fileName.c_str());
00097     if (!file.good())
00098         throw IllegalStateError("Failed to open comparison file: " + fileName, __FILE__, __LINE__);
00099     
00100     SctDaq.pass = TestFileUtil::getPass(file);
00101     info.SCTDAQVersion = TestFileUtil::skipHeader(file);
00102     //Holds the RawScanResult if needed
00103     shared_ptr<RawScanResult> result;
00104     
00105     for (unsigned int chip = 0; chip<nChipModule; ++chip) {
00106     string chipStr;
00107     info.chip = chip;
00108     file >> chipStr >> SctDaq.offset >> SctDaq.mean >> SctDaq.rms >> SctDaq.noise;
00109     //Ignore rest of line
00110     file.ignore(256, '\n');
00111     
00112     //Correct offset if it is negative (SCTDAQ bug)
00113     if (SctDaq.offset < 0) {
00114         if (!result) {
00115         try {
00116             IONameIS name(RawScanResult::getUniqueID(sd.getHeader()), "SctData::RawScanResult", SctNames::getEventDataName());
00117             shared_ptr<Serializable> ob = IOManagerIS::instance().read(name.getIOName());
00118             result = boost::dynamic_pointer_cast<RawScanResult>(ob);
00119         } catch (IoException& e) {}
00120         }
00121         if (result) {
00122         double target = 2.5*result->getConfiguration().getChipConfiguration(chip).getTrimTarget();
00123         SctDaq.offset+=target;
00124         }
00125     }
00126     
00127     const ChipNOResult& data = sd.getChipResult(chip);
00128 
00129     RodDaq.mean = data.mean;
00130     RodDaq.offset = data.offset;
00131     RodDaq.rms = data.rms;
00132     RodDaq.noise = data.getNoise();
00133     RodDaq.pass = sd.getPassed();
00134 
00135 
00136         tree->Fill();
00137     }
00138 }
00139 
00140 
00144 void NoiseOccupancyCompare::setup() {
00145     string name = Env::substituteVariables(Output);
00146     file = new TFile(name.c_str(), "RECREATE");
00147     tree = new TTree("NOData", "NoiseOccupancy Comparison Data");
00148     tree->Branch("RodDaq", &RodDaq, DataStr.c_str());
00149     tree->Branch("SctDaq", &SctDaq, DataStr.c_str());
00150     tree->Branch("Info", &info, InfoStr.c_str());
00151     info.serial[14] = '\0';
00152 }
00153 
00157 void NoiseOccupancyCompare::downloadData(string serialNumber) {
00158     ostringstream oss;
00159     SctTest::TestInfo info = moduleData.getNoiseOccupancyInfo(serialNumber);
00160     oss << "java -Dtdaq.ipc.init.ref=$TDAQ_IPC_INIT_REF ProdDatabase/getDBfiles " << Arg << " -d -r " << info.runNumber << " -s " << info.scanNumber << "  " << serialNumber;
00161     system(oss.str().c_str());
00162 }
00163 
00168 void NoiseOccupancyCompare::publishData() {
00169     highLevelApi->noiseOccupancy();
00170 }
00171 
00172 
00173 int main(int argc, char** argv) {
00174         IPCCore::init(argc,argv);
00175     NoiseOccupancyCompare sdc;
00176     sdc.analyzeAll(argc, argv);
00177     return sdc.getExitCode();
00178 }
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 

Generated on Mon Feb 6 14:01:26 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6