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
00061
00062
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
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
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 }