emcOMPedestalFEMT.h

Go to the documentation of this file.
00001 #ifndef __EMCOMPEDESTALFEM_H__
00002 #define __EMCOMPEDESTALFEM_H__
00003 
00004 #ifndef __EMCOMCALFEMT_H__
00005 #include "emcOMCalFEMT.h"
00006 #endif
00007 
00013 template <class T>
00014 class emcOMPedestalFEMT : public emcOMCalFEMT<T>
00015 {
00016 public:
00017   emcOMPedestalFEMT(const char* name, const char* title)
00018     : emcOMCalFEMT<T>(name, title)
00019   { }
00020   virtual ~emcOMPedestalFEMT()
00021   { }
00022 
00024   virtual bool CanRead(const emcManageable& object) const;
00025 
00027   virtual bool CanWrite(const emcManageable& object) const;
00028 
00030   virtual void FromPdbCalBank(emcCalFEM& calfem, PdbCalBank& bank);
00031 
00032 
00033   // Get the name of the low-level Objy persistent class we are dealing with.
00034   virtual std::string GetPersistentClassName(void) const
00035   {
00036     return "PdbEmcPedestalBank";
00037   }
00038 
00040   virtual void ToPdbCalBank(const emcCalFEM& calfem, PdbCalBank& bank);
00041 };
00042 
00043 //_____________________________________________________________________________
00044 //_____________________________________________________________________________
00045 //_____________________________________________________________________________
00046 
00047 #ifndef __EMCPEDESTALFEM_H__
00048 #include "emcPedestalFEM.h"
00049 #endif
00050 #ifndef __EMCINDEXER_H__
00051 #include "EmcIndexer.h"
00052 #endif
00053 
00054 #include "PdbCalBank.hh"
00055 #include "PdbEmcPedestal.hh"
00056 
00057 #include <iostream>
00058 #include <fstream>
00059 #include <cassert>
00060 #include <cstdio>
00061 
00062 //_____________________________________________________________________________
00063 template <class T>
00064 bool
00065 emcOMPedestalFEMT<T>::CanRead(const emcManageable& object) const
00066 {
00067   // we advertize here that we can only handle a given
00068   // number of object types, e.g. emcPedestalFEM only.
00069 
00070   if ( object.GetSource() != storage() )
00071     {
00072       return false;
00073     }
00074 
00075   const emcManageable* object_ptr = &object;
00076   const emcPedestalFEM* test = dynamic_cast<const emcPedestalFEM*>(object_ptr);
00077 
00078   if (test && test->Version() == 0)
00079     {
00080       return true;
00081     }
00082   return false;
00083 }
00084 
00085 
00086 //_____________________________________________________________________________
00087 template <class T>
00088 bool
00089 emcOMPedestalFEMT<T>::CanWrite(const emcManageable& object) const
00090 {
00091   // we advertize here that we can only handle a given
00092   // number of object types, e.g. emcPedestalFEM only.
00093 
00094   if ( object.GetDestination() != storage() )
00095     {
00096       return false;
00097     }
00098 
00099   const emcManageable* object_ptr = &object;
00100   const emcPedestalFEM* test = dynamic_cast<const emcPedestalFEM*>(object_ptr);
00101 
00102   if (test && test->Version() == 0)
00103     {
00104       return true;
00105     }
00106   return false;
00107 }
00108 
00109 //_____________________________________________________________________________
00110 template<class T>
00111 void
00112 emcOMPedestalFEMT<T>::FromPdbCalBank(emcCalFEM& calfem, PdbCalBank& emcbank)
00113 {
00114   assert(calfem.Version() == 0);
00115 
00116   int thesize = emcbank.getLength();
00117 
00118   assert (thesize == 144);
00119 
00120   int i, amu;
00121   int low, high, tac;
00122   PdbEmcPedestal* pdbped;
00123   emcPedestalFEM* pedFEM = dynamic_cast<emcPedestalFEM*>(&calfem);
00124   assert(pedFEM != 0);
00125 
00126   emcPedestalFEM::AmuVector vlow(64), vhigh(64), vtac(64);
00127 
00128   for ( i = 0; i < thesize; i ++ )
00129     {
00130 
00131       // Get the PdbEmcPedestal object for channel i from the bank
00132       pdbped = dynamic_cast<PdbEmcPedestal*>(&(emcbank.getEntry(i)));
00133       for ( amu = 0; amu < 64; amu ++)
00134         {
00135           pdbped->GetValues(amu, low, high, tac);
00136           vlow[amu] = low;
00137           vhigh[amu] = high;
00138           vtac[amu] = tac;
00139         }
00140       // it's important to group the following lines (as it's an
00141       // append for the same channel).
00142       // FIXME: there's plenty of improvement to do with this
00143       // nasty set interface !
00144       // (ideas are welcome)
00145       pedFEM->AppendOneChannel("LG_Pre-Post", vlow);
00146       pedFEM->AppendOneChannel("HG_Pre-Post", vhigh);
00147       pedFEM->AppendOneChannel("TAC", vtac);
00148     }
00149 }
00150 
00151 //_____________________________________________________________________________
00152 template<class T>
00153 void
00154 emcOMPedestalFEMT<T>::ToPdbCalBank(const emcCalFEM& calfem, 
00155                                    PdbCalBank& emcBank)
00156 {
00157   assert(calfem.Version() == 0);
00158 
00159   size_t thesize = calfem.GetNumberOfChannels();
00160   assert(thesize == 144);
00161 
00162   emcBank.setLength(thesize);
00163 
00164   PdbEmcPedestal* pdbped;
00165   const emcPedestalFEM* pedFEM = dynamic_cast<const emcPedestalFEM*>(&calfem);
00166   assert(pedFEM != 0);
00167 
00168   int i, amu;
00169   int low, high, tac;
00170 
00171   for ( i = 0; i < 144; i++ )
00172     {
00173       pdbped = (PdbEmcPedestal*) & (emcBank.getEntry(i));
00174       assert(pdbped != 0);
00175       for ( amu = 0; amu < 64; amu++ )
00176         {
00177           low = static_cast<int>(pedFEM->getValue(i, amu, "LG_Pre-Post"));
00178           high = static_cast<int>(pedFEM->getValue(i, amu, "HG_Pre-Post"));
00179           tac = static_cast<int>(pedFEM->getValue(i, amu, "TAC"));
00180           pdbped->Set(amu, low, high, tac);
00181         }
00182     }
00183 }
00184 
00185 #endif