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

ScanResultWriter.cpp

00001 #include "ScanResultWriter.h"
00002 #include "ScanWriterFactory.h"
00003 #include "ScanDataWriter.h"
00004 #include "scan.h"
00005 #include "Sct/SctNames.h"
00006 #include "Sct/Serializable.h"
00007 #include "Sct/ISProxy/IOManagerISProxy.h"
00008 #include <CommonWithDsp/processor.h>
00009 
00010 #include <sstream>
00011 
00012 using namespace std;
00013 using namespace Sct;
00014 using namespace Sct::IS;
00015 using namespace Sct::ISProxy;
00016 
00017 /* READ NOTES ON STREAMERS AND VERSIONS BEFORE EDITING THIS FILE! */
00018 
00019 namespace SctData {
00020 
00025 class SerializableWrapper : public virtual Serializable {    
00026 public:
00027     SerializableWrapper(const string& className, const scan_result_ptrs& data) 
00028     : className(className) {
00029     ostringstream oss;
00030     oss << data.header.runNumber << "." << data.header.scanNumber << "." << data.header.moduleName;
00031     uniqueID = oss.str();
00032     }
00033 
00034     ~SerializableWrapper() throw() {}
00035     
00036     virtual string getClassName() const throw() {
00037     return className;
00038     }
00039     
00040     virtual string getUniqueID() const throw() {
00041     return uniqueID;
00042     }
00043     
00044 private:
00045     string className;
00046     string uniqueID;
00047 };
00048 
00049 /* READ NOTES ON STREAMERS AND VERSIONS BEFORE EDITING THIS FILE! */
00050 
00051 unsigned ScanResultWriter::getVersion() const throw(){
00052   return m_version;
00053 }
00054 
00055 //No need to do anything
00056 ScanResultWriter::ScanResultWriter(const string& className, unsigned version) 
00057     : scanResult(0), className(className), m_version(version) {}
00058 
00059 ScanResultWriter& ScanResultWriter::getRawWriter() {
00060   static ScanResultWriter* rawWriter = new ScanResultWriter("SctData::RawScanResult", 2);
00061   return *rawWriter;
00062 }
00063 
00064 bool ScanResultWriter::rawInMap = IOManager::addToMap("SctData::RawScanResult", auto_ptr<Streamer>(&getRawWriter()));
00065 
00066 /*ScanResultWriter& ScanResultWriter::getFitWriter() {
00067     static ScanResultWriter* fitWriter = new ScanResultWriter("FitScanResult");
00068     return *fitWriter;
00069 }*/
00070 
00071 
00072 bool ScanResultWriter::publish(scan_result_ptrs& scanResult) {
00073     //Now we can get hold of the ScanResultWriter we need
00074     ScanResultWriter& writer = ScanWriterFactory::getResultWriter(scanResult.header.dataType);
00075     writer.setData(scanResult);
00076 
00077     SerializableWrapper w(writer.className, scanResult);
00078     IOParamsIS params(SctNames::getEventDataName());
00079     IOManagerISProxy::instance().write(w, &params);
00080 
00081     return true;
00082 }
00083 
00084 void ScanResultWriter::write(OStream& out, const Streamable& ob, const IOManager& manager) const throw(LogicError, IoError) {
00085     writeHeader(out);
00086     writeScanPoints(out);
00087     writeConfiguration(out);
00088     writeData(out);
00089 }
00090     
00091 shared_ptr<Streamable> ScanResultWriter::read(IStream& in, const IOManager& manager) const throw(LogicError, IoError) {
00092     return shared_ptr<Streamable>();
00093 }
00094 
00095 void ScanResultWriter::read(IStream& in, Streamable& ob, const IOManager& manager) const throw(LogicError, IoError) {
00096 }
00097 
00098 
00099 
00100 void ScanResultWriter::setData(scan_result_ptrs& scanResult) {
00101     this->scanResult = &scanResult;
00102 }
00103 
00104 void ScanResultWriter::writeHeader(OStream& out) const {
00105     writeClass("SctData::ResultHeader", out);
00107     //out << scanResult->header.version
00108     out << scanResult->header.runNumber << scanResult->header.scanNumber << scanResult->header.moduleName 
00109     << scanResult->header.startTime << scanResult->header.endTime << scanResult->header.scanType;
00110 }
00111 
00112 void ScanResultWriter::writeScanPoints(OStream& out) const {
00113     writeClass("SctData::ScanPoints", out);
00114     //First the points header
00115     out << scanResult->header.npoints;
00116     //Now the points data
00117     out.put(scanResult->points, scanResult->header.npoints);
00118     out.put(scanResult->nEvents, scanResult->header.npoints);
00119     out.put(scanResult->nErrorEvents, scanResult->header.npoints);
00120 }
00121 
00122 void ScanResultWriter::writeConfiguration(OStream& out) const {
00123     writeClass("SctData::ModuleConfiguration", out);
00124     const ABCDModule& data = scanResult->header.config;
00125 
00126     for (unsigned int i=0; i<N_SCT_CHIPS; ++i) {
00127         writeChipConfig(out, data.chip[i]);
00128     }
00129     out << data.present << data.active << data.select << data.groupId << data.pTTC << data.rTTC;
00130     out.put(data.rx, 2);
00131     //cout << "data.groupId: " << (int)data.groupId  << endl;
00132 }
00133 
00134 void ScanResultWriter::writeChipConfig(OStream& out, const ABCDChip& data) const{
00135     out << data.active << data.address << data.target;
00136       
00137     //ABCDBasic stuff:
00138     
00139     //Config values
00140     out << data.basic.config.readoutMode << data.basic.config.calibMode << data.basic.config.trimRange;
00141     out << data.basic.config.edgeDetect << data.basic.config.mask << data.basic.config.accumulate;
00142     out << data.basic.config.inputBypass << data.basic.config.outputBypass << data.basic.config.master;
00143     out << data.basic.config.end << data.basic.config.feedThrough;
00144     
00145     out << data.basic.vthr << data.basic.vcal << data.basic.delay << data.basic.preamp << data.basic.shaper;
00146     out.put(data.basic.mask, 4);
00147     
00148     //ABCDCalData
00149     out << data.caldata.rc_function;
00150     //cout << "rc_function: " << (int)data.caldata.rc_function << endl;
00151     out.put(data.caldata.rc_params, 3);
00152     out << data.caldata.c_factor;
00153     
00154     out.put(data.trim, N_SCT_CHANS);
00155     //cout << "data.trim[35]" << (int)data.trim[35] << endl;
00156 }
00157 
00158 
00159 void ScanResultWriter::writeData(OStream& out) const {
00160     ScanDataWriter& writer = ScanWriterFactory::getDataWriter(scanResult->header.dataType);
00161     writer.writeData(*scanResult, out);
00162 }
00163 
00164 
00165 //Writes any stuff necessary for a class - ie nothing atm
00166 void ScanResultWriter::writeClass(const string& name, OStream& out) {}
00167 }

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