00001 #include "Sct/VersionNotSupportedException.h"
00002 #include "Sct/IoExceptions.h"
00003
00004 #include "../TrimRangeTestResult.h"
00005 #include "TrimRangeTestResultStreamer_v1.h"
00006
00007 #include <TF1.h>
00008 #include <vector>
00009
00010 using namespace Sct;
00011
00012 namespace SctData {
00013 namespace IO {
00014
00015
00016 unsigned TrimRangeTestResultStreamer_v1::s_version=1;
00017
00018 TrimRangeTestResultStreamer_v1::TrimRangeTestResultStreamer_v1() throw() {
00019
00020 }
00021
00022 bool TrimRangeTestResultStreamer_v1::inMap = IOManager::addToMap("SctData::TrimRangeTestResult", auto_ptr<Streamer>(new TrimRangeTestResultStreamer_v1()));
00023
00024
00025 shared_ptr<Streamable> TrimRangeTestResultStreamer_v1::read(IStream& in, const IOManager& manager) const throw(LogicError, IoError) {
00026 shared_ptr<Streamable> ad (new TrimRangeTestResult());
00027 read(in, *ad, manager);
00028 return ad;
00029 }
00030
00031 void TrimRangeTestResultStreamer_v1::write(OStream& out, const Streamable& ob, const IOManager& manager) const throw(LogicError, IoError) {
00032
00033
00034 manager.writeImpl(out, ob, "SctData::TestResult");
00035
00036 const TrimRangeTestResult& mytest = dynamic_cast <const TrimRangeTestResult&>(ob);
00037
00038 out << (int) mytest.chipTrimData.size();
00039 for (unsigned int i = 0; i < mytest.chipTrimData.size(); ++i) {
00040 writeData(out, *mytest.chipTrimData[i], manager);
00041 }
00042
00043 out << (int) mytest.chipTrim.size();
00044 for (unsigned int i = 0; i < mytest.chipTrim.size(); ++i) {
00045 writeTrim(out, *mytest.chipTrim[i], manager);
00046 }
00047
00048 out << mytest.charge << mytest.type << mytest.algorithm;
00049 }
00050
00051 void TrimRangeTestResultStreamer_v1::read(IStream& in, Streamable& ob, const IOManager& manager) const throw(LogicError, IoError) {
00052 manager.readImpl(in, ob, "SctData::TestResult");
00053
00054 TrimRangeTestResult& mytest = dynamic_cast < TrimRangeTestResult & >(ob);
00055
00056 int n = 0;
00057 in >> n;
00058 mytest.chipTrimData.resize(n);
00059 for (unsigned int i = 0; i<n; ++i) {
00060 mytest.chipTrimData[i] = shared_ptr<TrimRangeTestResult::ChipTrimData>(new TrimRangeTestResult::ChipTrimData() );
00061 readData(in, mytest, const_cast<TrimRangeTestResult::ChipTrimData&>(*mytest.chipTrimData[i]), manager);
00062 }
00063
00064 in >> n;
00065 mytest.chipTrim.resize(n);
00066 for (unsigned int i = 0; i<n; ++i) {
00067 mytest.chipTrim[i] = shared_ptr<TrimRangeTestResult::ChipTrim>(new TrimRangeTestResult::ChipTrim() );
00068 readTrim(in, mytest, const_cast<TrimRangeTestResult::ChipTrim&>(*mytest.chipTrim[i]), manager);
00069 }
00070
00071 in >> mytest.charge >> mytest.type >> mytest.algorithm;
00072 }
00073
00074 void TrimRangeTestResultStreamer_v1::writeTrim(OStream& out, const TrimRangeTestResult::ChipTrim& trim, const IOManager& manager) const throw(Sct::LogicError, Sct::IoError){
00075 out << trim.target << (int) trim.range;
00076 if (trim.channelTrim.size()!=nChannelChip){
00077 ostringstream os;
00078 os << "TrimRangeTestResultStreamer_v1::writeTrim, bad size " << trim.channelTrim.size();
00079 throw StreamCorruptedException(os.str(), __FILE__, __LINE__ );
00080 }
00081 out << (int) trim.channelTrim.size();
00082 for (unsigned i=0; i<trim.channelTrim.size(); ++i){
00083 Stat<TrimRangeTestResult::Trim> t=trim.channelTrim.getAt(i);
00084 int trim_i = t.value.trim;
00085 out << t.valid << trim_i << t.value.vthr;
00086 }
00087 }
00088
00089 void TrimRangeTestResultStreamer_v1::readTrim(IStream& in, TrimRangeTestResult& mytest, TrimRangeTestResult::ChipTrim& trim, const IOManager& manager) const throw(Sct::LogicError, Sct::IoError){
00090 in >> trim.target;
00091 int range; in >> range ; trim.range=range;
00092 int size; in >> size; trim.channelTrim.resize(size);
00093 if (size!=nChannelChip){
00094 ostringstream os;
00095 os << "TrimRangeTestResultStreamer_v1::readTrim, bad size " << trim.channelTrim.size();
00096 throw StreamCorruptedException(os.str(), __FILE__, __LINE__ );
00097 }
00098 for (unsigned i=0; i<size; ++i){
00099 Stat<TrimRangeTestResult::Trim>& t=trim.channelTrim.modifyAt(i);
00100 int trim_i;
00101 in >> t.valid >> trim_i >> t.value.vthr;
00102 t.value.trim=trim_i;
00103 }
00104 }
00105
00106 void TrimRangeTestResultStreamer_v1::writeData(OStream& out, const TrimRangeTestResult::ChipTrimData& chiptrim, const IOManager& manager) const throw(LogicError, IoError) {
00107 out << (int) chiptrim.channelData.size();
00108 for (unsigned i=0; i<chiptrim.channelData.size(); ++i){
00109 Stat<TrimRangeTestResult::TrimData> d=chiptrim.channelData.getAt(i);
00110
00111 out << d.valid << d.value.p0 << d.value.p1;
00112 out << (int) d.value.graph.size();
00113 for (unsigned ipt=0; ipt<d.value.graph.size(); ++ipt){
00114 out << d.value.graph[ipt].first << d.value.graph[ipt].second;
00115 }
00116 }
00117 }
00118
00119 void TrimRangeTestResultStreamer_v1::readData(IStream& in, TrimRangeTestResult& mytest, TrimRangeTestResult::ChipTrimData& chipTrim, const IOManager& manager) const throw(LogicError, IoError) {
00120 int size; in >> size;
00121 chipTrim.channelData.resize(nChannelChip);
00122 for (unsigned i=0; i<nChannelChip; ++i){
00123 Stat<TrimRangeTestResult::TrimData>& d=chipTrim.channelData.modifyAt(i);
00124 in >> d.valid >> d.value.p0 >> d.value.p1;
00125
00126 in >> size; d.value.graph.resize(size);
00127 for (int ipt=0; ipt<size; ++ipt){
00128 float first, second;
00129 in >> first; in >> second;
00130 d.value.graph[ipt]=pair<float,float>(first,second);
00131 }
00132 }
00133 }
00134 }
00135
00136
00137 }
00138