00001 #include "ScanResultWriter.h"
00002 #include "ScanWriterFactory.h"
00003 #include "ScanDataWriter.h"
00004 #include "SctApi/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 namespace SctData {
00018
00019 class SerializableWrapper : public virtual Serializable {
00020 public:
00021 SerializableWrapper(const string& className, const scan_result_ptrs& data)
00022 : className(className) {
00023 ostringstream oss;
00024 oss << data.header.runNumber << "." << data.header.scanNumber << "." << data.header.moduleName;
00025 uniqueID = oss.str();
00026 }
00027
00028 ~SerializableWrapper() throw() {}
00029
00030 virtual string getClassName() const throw() {
00031 return className;
00032 }
00033
00034 virtual string getUniqueID() const throw() {
00035 return uniqueID;
00036 }
00037
00038 private:
00039 string className;
00040 string uniqueID;
00041 };
00042
00043
00044
00045 ScanResultWriter::ScanResultWriter(const string& className)
00046 : scanResult(0), className(className) {}
00047
00048 ScanResultWriter& ScanResultWriter::getRawWriter() {
00049 static ScanResultWriter* rawWriter = new ScanResultWriter("SctData::RawScanResult");
00050 return *rawWriter;
00051 }
00052
00053 bool ScanResultWriter::rawInMap = IOManager::addToMap("SctData::RawScanResult", auto_ptr<Streamer>(&getRawWriter()));
00054
00055
00056
00057
00058
00059
00060
00061 bool ScanResultWriter::publish(scan_result_ptrs& scanResult) {
00062
00063 ScanResultWriter& writer = ScanWriterFactory::getResultWriter(scanResult.header.dataType);
00064 writer.setData(scanResult);
00065
00066 SerializableWrapper w(writer.className, scanResult);
00067 IOParamsIS params(SctNames::getEventDataName());
00068 IOManagerISProxy::instance().write(w, ¶ms);
00069
00070 return true;
00071 }
00072
00073 void ScanResultWriter::write(OStream& out, const Streamable& ob, const IOManager& manager) const throw(LogicError, IoError) {
00074 writeHeader(out);
00075 writeScanPoints(out);
00076 writeConfiguration(out);
00077 writeData(out);
00078 }
00079
00080 shared_ptr<Streamable> ScanResultWriter::read(IStream& in, const IOManager& manager) const throw(LogicError, IoError) {
00081 return shared_ptr<Streamable>();
00082 }
00083
00084 void ScanResultWriter::read(IStream& in, Streamable& ob, const IOManager& manager) const throw(LogicError, IoError) {
00085 }
00086
00087
00088
00089 void ScanResultWriter::setData(scan_result_ptrs& scanResult) {
00090 this->scanResult = &scanResult;
00091 }
00092
00093 void ScanResultWriter::writeHeader(OStream& out) const {
00094 writeClass("SctData::ScanHeader", out);
00095 out << scanResult->header.version << scanResult->header.runNumber << scanResult->header.scanNumber << scanResult->header.moduleName << scanResult->header.scanType;
00096 }
00097
00098 void ScanResultWriter::writeScanPoints(OStream& out) const {
00099 writeClass("SctData::ScanPoints", out);
00100
00101 out << scanResult->header.npoints;
00102
00103 out.put(scanResult->points, scanResult->header.npoints);
00104 out.put(scanResult->nEvents, scanResult->header.npoints);
00105 out.put(scanResult->nErrorEvents, scanResult->header.npoints);
00106 }
00107
00108 void ScanResultWriter::writeConfiguration(OStream& out) const {
00109 writeClass("SctData::ModuleConfiguration", out);
00110 const ABCDModule& data = scanResult->header.config;
00111
00112 for (unsigned int i=0; i<N_SCT_CHIPS; ++i) {
00113 writeChipConfig(out, data.chip[i]);
00114 }
00115 out << data.present << data.active << data.select << data.groupId << data.pTTC << data.rTTC;
00116 out.put(data.rx, 4);
00117
00118 }
00119
00120 void ScanResultWriter::writeChipConfig(OStream& out, const ABCDChip& data) const{
00121 out << data.active << data.address << data.target;
00122
00123
00124
00125
00126 out << data.basic.config.readoutMode << data.basic.config.calibMode << data.basic.config.trimRange;
00127 out << data.basic.config.edgeDetect << data.basic.config.mask << data.basic.config.accumulate;
00128 out << data.basic.config.inputBypass << data.basic.config.outputBypass << data.basic.config.master;
00129 out << data.basic.config.end << data.basic.config.feedThrough;
00130
00131 out << data.basic.vthr << data.basic.vcal << data.basic.delay << data.basic.preamp << data.basic.shaper;
00132 out.put(data.basic.mask, 4);
00133
00134
00135 out << data.caldata.rc_function;
00136
00137 out.put(data.caldata.rc_params, 3);
00138 out << data.caldata.c_factor;
00139
00140 out.put(data.trim, N_SCT_CHANS);
00141
00142 }
00143
00144
00145 void ScanResultWriter::writeData(OStream& out) const {
00146 ScanDataWriter& writer = ScanWriterFactory::getDataWriter(scanResult->header.dataType);
00147 writer.writeData(*scanResult, out);
00148 }
00149
00150
00151
00152 void ScanResultWriter::writeClass(const string& name, OStream& out) {}
00153 }