emcPacketProcessorv1.C

Go to the documentation of this file.
00001 #include "emcPacketProcessorv1.h"
00002 #include "packet.h"
00003 #include "packet_emc.h"
00004 #include "emcTowerContent.h"
00005 #include "emcTowerContainer.h"
00006 #include "emcDataError.h"
00007 
00008 ClassImp(emcPacketProcessorv1)
00009 
00010 namespace {
00011 
00012   void checkData(emcTowerContainer& towers, int imin, int imax)
00013   {
00014     for ( int i = imin; i  <= imax; ++i ) 
00015       {
00016         emcTowerContent* tower = towers.getTower(i);
00017         
00018         int dataerror = 0;
00019         
00020         // Checks the adc/tdc values.
00021         
00022         int hgpost,lgpost,hgpre,lgpre,tac;
00023         
00024         hgpost = tower->HGPost();
00025         hgpre  = tower->HGPre();
00026         lgpost = tower->LGPost();
00027         lgpre  = tower->LGPre();
00028         tac    = tower->TAC();
00029         
00030         if ( hgpre <= emcDataError::HG_MIN() || 
00031              hgpre>=emcDataError::HG_MAX() )
00032           {
00033             dataerror |= emcDataError::HG_PRE_OUT();
00034           }
00035         if ( hgpost <= emcDataError::HG_MIN() || 
00036              hgpost>=emcDataError::HG_MAX() )
00037           {
00038             dataerror |= emcDataError::HG_POST_OUT();
00039           }
00040         if ( lgpre <= emcDataError::LG_MIN() || 
00041              lgpre>=emcDataError::LG_MAX() )
00042           {
00043             dataerror |= emcDataError::LG_PRE_OUT();
00044           }
00045         if ( lgpost <= emcDataError::LG_MIN() || 
00046              lgpost>=emcDataError::LG_MAX() )
00047           {
00048             dataerror |= emcDataError::LG_POST_OUT();
00049           }
00050         if ( tac <= emcDataError::TAC_MIN() || 
00051              tac>=emcDataError::TAC_MAX() ) 
00052           {
00053             dataerror |= emcDataError::TAC_OUT();
00054           }
00055         
00056         tower->SetDataError(dataerror);
00057       }
00058   }
00059 }
00060 
00061 using std::cout;
00062 using std::cerr;
00063 using std::endl;
00064 
00065 //_____________________________________________________________________________
00066 emcPacketProcessorv1::emcPacketProcessorv1()
00067 {
00068   fDataArray = new int*[6];
00069   for ( size_t i = 0 ; i < 6 ; i++) 
00070     {
00071       fDataArray[i] = new int[144];
00072     }
00073 }
00074 
00075 //_____________________________________________________________________________
00076 emcPacketProcessorv1::~emcPacketProcessorv1()
00077 {
00078   for ( size_t i = 0 ; i < 6 ; i++) 
00079     {
00080       delete[] fDataArray[i];
00081     }
00082   delete[] fDataArray;
00083 }
00084 
00085 //_____________________________________________________________________________
00086 void
00087 emcPacketProcessorv1::identify(std::ostream& os) const
00088 {
00089   os << "emcPacketProcessorv1::identify" << std::endl;
00090 }
00091 
00092 //_____________________________________________________________________________
00093 int
00094 emcPacketProcessorv1::isValid() const
00095 {
00096   return 1;
00097 }
00098 
00099 //_____________________________________________________________________________
00100 bool
00101 emcPacketProcessorv1::process(const Packet& packet, emcTowerContainer& towers)
00102 { 
00103   // The Packet get methods are not const... so we use a hugly
00104   // const_cast here to allow our process method signature to be correct 
00105   // (i.e. we really want to advertise that the packet will not
00106   // be changed by us).
00107 
00108   Packet& ncpacket = const_cast<Packet&>(packet);
00109 
00110   Packet_emc* p = dynamic_cast<Packet_emc*>(&ncpacket);
00111   if (!p) 
00112     {  
00113       cerr << "<E> " << __FILE__ << "  " << __LINE__
00114            << " Cannot convert Packet to Packet_emc : ";
00115       ncpacket.identify(cerr);       
00116       return false;
00117     }
00118 
00119   int n = p->filliList6x144(fDataArray,0, 0, -4096);
00120 
00121   int ntowers = towers.size();
00122 
00123   int imin = ntowers;
00124 
00125   for ( int i = 0 ; i < n ; i++ ) 
00126     {
00127       emcTowerContent* t = towers.addTower(ntowers);
00128       
00129       t->SetID(p->getIdentifier()-8001,fDataArray[5][i]);
00130 
00131       t->SetRaw(4095 - fDataArray[1][i],
00132                 4095 - fDataArray[3][i],
00133                 4095 - fDataArray[2][i],
00134                 4095 - fDataArray[4][i],
00135                 4095 - fDataArray[0][i],
00136                 p->iValue(1,"AMU"), // pre
00137                 p->iValue(2,"AMU"), // post
00138                 p->iValue(0,"AMU"), // tac
00139                 p->iValue(0,"BCLK") // beamclock
00140                 );
00141 
00142       ++ntowers;
00143   }
00144 
00145   int imax = ntowers-1;
00146 
00147   checkData(towers,imin,imax);
00148 
00149   return true;
00150 }
00151 
00152 //_____________________________________________________________________________
00153 void
00154 emcPacketProcessorv1::Reset()
00155 {
00156   
00157 }