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
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
00050
00051 unsigned ScanResultWriter::getVersion() const throw(){
00052 return m_version;
00053 }
00054
00055
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
00067
00068
00069
00070
00071
00072 bool ScanResultWriter::publish(scan_result_ptrs& scanResult) {
00073
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, ¶ms);
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
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
00115 out << scanResult->header.npoints;
00116
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
00132 }
00133
00134 void ScanResultWriter::writeChipConfig(OStream& out, const ABCDChip& data) const{
00135 out << data.active << data.address << data.target;
00136
00137
00138
00139
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
00149 out << data.caldata.rc_function;
00150
00151 out.put(data.caldata.rc_params, 3);
00152 out << data.caldata.c_factor;
00153
00154 out.put(data.trim, N_SCT_CHANS);
00155
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
00166 void ScanResultWriter::writeClass(const string& name, OStream& out) {}
00167 }