Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Related Pages

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

Generated on Thu Jul 15 09:50:50 2004 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5