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