emcDataProcessorv2.C

Go to the documentation of this file.
00001 #include "emcDataProcessorv2.h"
00002 
00003 #include "emcFEMList.h"
00004 #include "emcPacketProcessorv1.h"
00005 #include "emcRawDataProcessorv2.h"
00006 #include "emcCalibrationDataHelper.h"
00007 #include "emcDCProcessorv2.h"
00008 
00009 #include "packet.h"
00010 #include "Event.h"
00011 #include "EmcIndexer.h"
00012 #include <cassert>
00013 #include "emcTowerContainer.h"
00014 
00015 ClassImp(emcDataProcessorv2)
00016 
00017 //_____________________________________________________________________________
00018 emcDataProcessorv2::emcDataProcessorv2()
00019 {
00020   fPacketProcessor = getPacketProcessor();
00021   fRawDataProcessor = 0;
00022   fDCProcessor = 0;
00023   fCalibrationDataHelper = 0;
00024   fRunNumber = 0;
00025   fTimeStamp = 0;
00026 }
00027 
00028 //_____________________________________________________________________________
00029 emcDataProcessorv2::emcDataProcessorv2(int runnumber, 
00030                                        const PHTimeStamp& ts, 
00031                                        bool initall,
00032                                        emcManageable::EStorage dataSource,
00033                                        const char* sectors)
00034 {
00035   fPacketProcessor = getPacketProcessor();
00036   fRawDataProcessor = 0;
00037   fDCProcessor = 0;
00038   fRunNumber = runnumber;
00039   fTimeStamp = new PHTimeStamp(ts);
00040   fCalibrationDataHelper = new emcCalibrationDataHelper
00041     (fRunNumber,*fTimeStamp,initall, dataSource,sectors);
00042   emcFEMList f(sectors);
00043 
00044   for ( int i = 0; i < 172; ++i ) 
00045     {
00046       if ( f.hasFEM(i) )
00047         {
00048           fFemList.insert(i);
00049         }
00050     }
00051 }
00052 
00053 //_____________________________________________________________________________
00054 emcDataProcessorv2::~emcDataProcessorv2()
00055 {
00056   delete fPacketProcessor;
00057   delete fRawDataProcessor;
00058   delete fDCProcessor;
00059   delete fCalibrationDataHelper;
00060   delete fTimeStamp;
00061 }
00062 
00063 //_____________________________________________________________________________
00064 bool
00065 emcDataProcessorv2::calibrate(emcTowerContainer* pbsc, 
00066                               emcTowerContainer* pbgl, 
00067                               time_t incrementalTime)
00068 {
00069   if ( !fDCProcessor ) 
00070     {
00071       if ( fRunNumber > 0 ) 
00072         {
00073           if ( !fCalibrationDataHelper ) 
00074             {
00075               if ( fTimeStamp ) 
00076                 {  
00077                   // preferred method. Specify the timestamp
00078                   fCalibrationDataHelper = 
00079                     new emcCalibrationDataHelper(fRunNumber,*fTimeStamp,true);
00080                 }
00081               else
00082                 {
00083                   // Otherwise, this guy will try to figure
00084                   // out by himself what's the timestamp, from
00085                   // the runnumber. This might fail... and then
00086                   // timestamp will be = "now".
00087                   fCalibrationDataHelper = 
00088                     new emcCalibrationDataHelper(fRunNumber,true);
00089                 }
00090             }
00091 
00092           fDCProcessor = getDCProcessor(fCalibrationDataHelper);
00093         }
00094       else
00095         {
00096           std::cerr << "<E> emcDataProcessorv2::calibrate : runnumber ("
00097                     << fRunNumber << " is invalid !" << std::endl;
00098           return false;
00099         }
00100     }
00101 
00102   return fDCProcessor->calibrate(pbsc,pbgl,incrementalTime);
00103 }
00104 
00105 
00106 
00107 //_____________________________________________________________________________
00108 bool
00109 emcDataProcessorv2::decode(const Event& event, 
00110                            emcTowerContainer* pbsc, 
00111                            emcTowerContainer* pbgl)
00112 {
00113   // This ugly const_cast is there just because some methods
00114   // in Event are not const, but still we'd like our decode method
00115   // to advertise that it will not change the event, so Event is const.
00116   Event& ncevent = const_cast<Event&>(event);
00117 
00118   if ( fRunNumber <= 0 ) 
00119     {
00120       setRunNumber(ncevent.getRunNumber());
00121       assert(fRunNumber>0);
00122     }
00123 
00124   if (pbsc)
00125     {
00126       pbsc->Reset();
00127     }
00128 
00129   if (pbgl)
00130     {
00131       pbgl->Reset();
00132     }
00133 
00134   // FIXME: what about reference FEMs (for online only).
00135   std::set<int>::const_iterator it;
00136 
00137   for ( it = fFemList.begin(); it != fFemList.end(); ++it ) 
00138     {    
00139       int ifem = *it;
00140 
00141       int packetID = 8001+ifem;
00142 
00143       Packet* packet = ncevent.getPacket(packetID);
00144       
00145       if ( packet ) 
00146         {
00147           if ( pbsc && EmcIndexer::isPbScFEM(ifem) )
00148             {
00149               bool ok = fPacketProcessor->process(*packet,*pbsc);
00150               if (!ok)
00151                 {
00152                   std::cerr << "Could not process packet " << packetID 
00153                             << " in event " 
00154                             << std::endl;
00155                   ncevent.identify(std::cerr);
00156                 }
00157             }
00158           else if ( pbgl && EmcIndexer::isPbGlFEM(ifem ) )
00159             {
00160               bool ok = fPacketProcessor->process(*packet,*pbgl);
00161               if (!ok)
00162                 {
00163                   std::cerr << "Could not process packet " << packetID 
00164                             << " in event " 
00165                             << std::endl;
00166                   ncevent.identify(std::cerr);
00167                 }
00168             }
00169         }      
00170       delete packet;
00171     }
00172 
00173   return true;
00174 }
00175 
00176 //_____________________________________________________________________________
00177 emcDCProcessor*
00178 emcDataProcessorv2::getDCProcessor(emcCalibrationDataHelper* cdh) const
00179 {
00180   return new emcDCProcessorv2(cdh);
00181 }
00182 
00183 //_____________________________________________________________________________
00184 emcCalibrationDataHelper*
00185 emcDataProcessorv2::getCalibrationDataHelper() const
00186 {
00187   return fCalibrationDataHelper;
00188 }
00189 
00190 //_____________________________________________________________________________
00191 emcPacketProcessor*
00192 emcDataProcessorv2::getPacketProcessor() const
00193 {
00194   return new emcPacketProcessorv1;
00195 }
00196 
00197 //_____________________________________________________________________________
00198 emcRawDataProcessor*
00199 emcDataProcessorv2::getRawDataProcessor(emcCalibrationDataHelper* cdh) const
00200 {
00201   return new emcRawDataProcessorv2(cdh);
00202 }
00203 
00204 //_____________________________________________________________________________
00205 void
00206 emcDataProcessorv2::identify(std::ostream& os) const
00207 {
00208   os << "emcDataProcessorv2::identify" << std::endl;
00209 }
00210 
00211 //_____________________________________________________________________________
00212 int
00213 emcDataProcessorv2::isValid() const
00214 {
00215   return 1;
00216 }
00217 
00218 //_____________________________________________________________________________
00219 void
00220 emcDataProcessorv2::Reset()
00221 {  
00222 }
00223 
00224 //_____________________________________________________________________________
00225 bool
00226 emcDataProcessorv2::toADCandTDC(emcTowerContainer* pbsc, 
00227                                 emcTowerContainer* pbgl, 
00228                                 const emcBadModules& bad)
00229 {
00230   if ( !fRawDataProcessor ) 
00231     {
00232       if ( fRunNumber > 0 ) 
00233         {
00234           if ( !fCalibrationDataHelper ) 
00235             {
00236               if ( fTimeStamp )
00237                 {
00238                   fCalibrationDataHelper = 
00239                     new emcCalibrationDataHelper(fRunNumber,*fTimeStamp,true);
00240                 }
00241               else
00242                 {
00243                   fCalibrationDataHelper = 
00244                     new emcCalibrationDataHelper(fRunNumber,true);
00245                 }
00246             }
00247 
00248           fRawDataProcessor = getRawDataProcessor(fCalibrationDataHelper);
00249         }
00250       else
00251         {
00252           std::cerr << "<E> emcDataProcessorv2::toADCandTDC : runnumber ("
00253                     << fRunNumber << " is invalid !" << std::endl;
00254           return false;
00255         }
00256     }
00257 
00258   return fRawDataProcessor->toADCandTDC(pbsc,pbgl,bad);
00259 }
00260