emcTracedFEMMerger.C

Go to the documentation of this file.
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       // Add 1 constant line to connect end of t1 to start of t2
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               // Add 1 constant line to connect "virtual" start of t2 
00058               // to actual start of t2
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 }