00001 #include "emcTracedFEMMerger.h"
00002
00003 #include <cassert>
00004 #include <iostream>
00005
00006 #include "phool.h"
00007 #include "emcTracedFEM.h"
00008 #include "emcTracedValue.h"
00009
00010
00011 emcTracedFEM*
00012 emcTracedFEMMerger::merge(const emcTracedFEM& t1,
00013 const emcTracedFEM& t2)
00014 {
00015 if ( t1.AbsolutePosition() != t2.AbsolutePosition() ||
00016 t1.GetNumberOfChannels() != t2.GetNumberOfChannels() )
00017 {
00018 std::cerr << PHWHERE << " t1 and t2 absolute positions not compatible !"
00019 << std::endl;
00020 return 0;
00021 }
00022
00023 if ( t1.GetXmin() > t2.GetXmin() )
00024 {
00025 std::cerr << PHWHERE << " t1 and t2 not time ordered !"
00026 << std::endl;
00027 return 0;
00028 }
00029
00030 emcTracedFEM* rv = t1.clone();
00031 assert(rv!=0);
00032
00033 rv->SetXmax(t2.GetXmax());
00034
00035 for ( size_t i = 0; i < t2.GetNumberOfChannels(); ++i )
00036 {
00037 emcTracedValue* last = rv->LastItem(i);
00038 assert(last!=0);
00039
00040 int xrelmax = static_cast<int>(t1.GetXmax()-t1.GetXmin());
00041
00042
00043 rv->AddNewItem(i,new emcTracedValue(xrelmax,
00044 last->getValue(xrelmax),
00045 0,
00046 true));
00047
00048 time_t toffset = t2.GetXmin()-t1.GetXmin();
00049 t2.FirstItem(i);
00050 emcTracedValue* tv = 0;
00051 bool first = true;
00052
00053 while ( ( tv = t2.NextItem() ) )
00054 {
00055 if (first)
00056 {
00057
00058
00059 rv->AddNewItem(i,new emcTracedValue(toffset,
00060 tv->GetConstant(),
00061 0,
00062 true));
00063 first=false;
00064 }
00065
00066 rv->AddNewItem(i,new emcTracedValue(tv->GetX()+toffset,
00067 tv->GetConstant(),
00068 tv->GetSlope(),
00069 tv->isConstant()));
00070 }
00071 }
00072
00073 return rv;
00074 }