mEmcCalibratorModulev2.C

Go to the documentation of this file.
00001 #include "mEmcCalibratorModulev2.h"
00002 
00003 #include "emcCalibrationDataHelper.h"
00004 #include "emcCalibrationData.h"
00005 #include "emcDataProcessorRun4.h"
00006 #include "EmcIndexer.h"
00007 #include "emcTowerContainer.h"
00008 #include "emcTowerContent.h"
00009 #include "emcNodeHelper.h"
00010 #include "emcBadModulesv1.h"
00011 #include "emcDataError.h"
00012 
00013 #include "PHNodeIterator.h"
00014 #include "PHDataNode.h"
00015 #include "PHCompositeNode.h"
00016 #include "PHTimeStamp.h"
00017 #include "Event.h"
00018 
00019 #include <memory>
00020 #include <cassert>
00021 
00022 using namespace std;
00023 
00024 //_____________________________________________________________________________
00025 namespace
00026 {
00027   Event* getEvent(PHCompositeNode* topNode)
00028   {
00029     PHNodeIterator it(topNode);
00030     PHDataNode<Event>* eventNode =  
00031       static_cast<PHDataNode<Event>*>(it.findFirst("PHDataNode","PRDF"));
00032     if (eventNode)
00033       {
00034         return eventNode->getData();
00035       }
00036     return 0;
00037   }
00038 }
00039 
00040 //_____________________________________________________________________________
00041 mEmcCalibratorModulev2::mEmcCalibratorModulev2(int runnumber,
00042                                                const PHTimeStamp& ts,
00043                                                bool constantGains,
00044                                                const emcDataStorageMap& store,
00045                                                const char* sectors)
00046 
00047 {
00048   name = "mEmcCalibratorModulev2";
00049   fSectors = sectors;
00050   emcDataProcessorRun4* dp = new emcDataProcessorRun4(runnumber,
00051                                                       ts,
00052                                                       true,
00053                                                       store.storage(),
00054                                                       fSectors.c_str());
00055   emcCalibrationDataHelper* cdh = dp->getCalibrationDataHelper();
00056   fDataProcessor = dp;
00057 
00058   if ( !store.empty() )
00059     {
00060       // We're instructed to change some data sources
00061       // WARNING: this is really an expert mode of operation !
00062       // Do not complain if things do not work then...
00063       std::vector<std::string> ks = store.knownStorages();
00064       for ( size_t i = 0; i < ks.size(); ++i )
00065         {
00066           cdh->setSource(ks[i],store.storage(ks[i]));
00067         }
00068     }
00069 
00070   fTofSectorOffsets.resize(8);
00071 
00072   for ( size_t is = 0; is < fTofSectorOffsets.size(); ++is )
00073     {
00074       const emcCalibrationData* so = 
00075         cdh->getCalibrationData("TofSectorOffset",is);
00076       fTofSectorOffsets[is] = - so->GetValue(0,2) + so->GetValue(0,3);
00077       std::cout << "Tof Sector Offset for " << EmcIndexer::EmcSectorId(is)
00078                 << "=" << fTofSectorOffsets[is] << " ns"
00079                 << std::endl;
00080     }
00081 
00082   fTimeStamp = new PHTimeStamp(ts);
00083   fBadModules = new emcBadModulesv1(*fTimeStamp,
00084                                     emcBadModules::kAll,
00085                                     store.storage(),
00086                                     true,
00087                                     fSectors.c_str());
00088   fConstantGains = constantGains;
00089   fRunNumber = runnumber;
00090 }
00091 
00092 //_____________________________________________________________________________
00093 
00094 mEmcCalibratorModulev2::~mEmcCalibratorModulev2()
00095 {
00096   delete fDataProcessor;
00097   delete fTimeStamp;
00098   delete fBadModules;
00099 }
00100 
00101 //_____________________________________________________________________________
00102 void
00103 mEmcCalibratorModulev2::changeToF(emcTowerContainer& towers)
00104 {
00105   for ( size_t i = 0; i < towers.size(); ++i )
00106     {
00107       emcTowerContent* t = towers.getTower(i);
00108       int is, dummy;
00109       EmcIndexer::decodeTowerId(t->towerid(),is,dummy,dummy);
00110       dummy=-1;
00111       t->SetCalibrated(t->Energy(),t->ToF() + fTofSectorOffsets[is]);
00112     }
00113 }
00114 
00115 //_____________________________________________________________________________
00116 PHBoolean
00117 mEmcCalibratorModulev2::event(PHCompositeNode* topNode)
00118 {
00119   Event* event = getEvent(topNode);
00120 
00121   if ( !event ) 
00122     {
00123       cerr << name << "::event : cannot get Event node/object" << endl;
00124       return false;
00125     }
00126 
00127   emcTowerContainer* tc = emcNodeHelper::getObject<emcTowerContainer>
00128     ("emcTowerContainer",topNode);
00129   
00130   tc->Reset();
00131 
00132   auto_ptr<emcTowerContainer> pbsc(tc->create());
00133   auto_ptr<emcTowerContainer> pbgl(tc->create());
00134 
00135   bool ok = fDataProcessor->decode(*event,pbsc.get(),pbgl.get());
00136 
00137   assert(fBadModules!=0);
00138 
00139   if (ok)
00140     {
00141       ok = fDataProcessor->toADCandTDC(pbsc.get(),pbgl.get(),*fBadModules);
00142     }
00143 
00144   if (ok)
00145     {
00146       time_t thetime;
00147       if ( fConstantGains ) 
00148         {
00149           thetime = fTimeStamp->getTics();
00150         }
00151       else
00152         {
00153           thetime = event->getTime();
00154         }
00155       ok = fDataProcessor->calibrate(pbsc.get(),pbgl.get(),thetime);
00156     }
00157 
00158   if (ok)
00159     {
00160       // use a filter here if you wish
00161       int out=0;
00162       for ( size_t i = 0; i < pbsc->size(); ++i ) 
00163         {
00164           emcTowerContent* tin = pbsc->getTower(i);
00165           if ( tin->ADC() > 10 && 
00166                !(tin->DataError() & emcDataError::CHANNEL_DISABLED()) )
00167             {
00168               emcTowerContent* tout = tc->addTower(out,*tin);
00169               assert(tout!=0);
00170               ++out;
00171             }
00172         }
00173       pbsc->Reset();
00174       // filter might be different for both subsystem... or not.
00175       for ( size_t i = 0; i < pbgl->size(); ++i ) 
00176         {
00177           emcTowerContent* tin = pbgl->getTower(i);
00178           if ( tin->ADC() > 10 && 
00179                !(tin->DataError() & emcDataError::CHANNEL_DISABLED()) )
00180             {
00181               emcTowerContent* tout = tc->addTower(out,*tin);
00182               assert(tout!=0);
00183               ++out;
00184             }
00185         }
00186       pbgl->Reset();
00187     }
00188   else
00189     {
00190       tc->Reset();
00191       return false;
00192     }
00193 
00194   changeToF(*tc);
00195   return true;
00196 }