/search.css" rel="stylesheet" type="text/css"/> /search.js">
00001 #include "Co60Data.h" 00002 00003 #include "Event/ReadoutHeader.h" 00004 #include "Event/CalibReadoutHeader.h" 00005 #include "Event/CalibReadout.h" 00006 #include "Event/UserDataHeader.h" 00007 #include "Event/RecHeader.h" 00008 #include "Event/RecTrigger.h" 00009 #include "Event/HeaderObject.h" 00010 00011 #include "GaudiKernel/SystemOfUnits.h" 00012 00013 #include "TMath.h" 00014 #include "TString.h" 00015 00016 Co60Data::Co60Data(const std::string& name, ISvcLocator* pSvcLocator) 00017 : DybAlgorithm<DayaBay::UserDataHeader>(name,pSvcLocator) { 00018 m_location = "/Event/Data/Calib/Co60"; 00019 00020 declareProperty("ReadoutHeaderLocation", m_readoutHeaderLocation="/Event/Readout/ReadoutHeader", 00021 "Location of the ReadoutHeader"); 00022 declareProperty("CalibStatsLocation", m_calibStatsLocation="/Event/Data/CalibStats", 00023 "Location of the CalibStats User data"); 00024 declareProperty("Co60Location", m_Co60Location="/Event/Tag/Calib/Co60", 00025 "Location of the Co60 Tag"); 00026 } 00027 00028 Co60Data::~Co60Data() { 00029 } 00030 00031 StatusCode Co60Data::initialize() { 00032 return this->GaudiAlgorithm::initialize(); 00033 } 00034 00035 StatusCode Co60Data::finalize() { 00036 return this->GaudiAlgorithm::finalize(); 00037 } 00038 00039 StatusCode Co60Data::execute() { 00040 00041 StatusCode sc = StatusCode::SUCCESS; 00042 00043 const DayaBay::ReadoutHeader *readoutHdr = 0; 00044 const DayaBay::RecHeader *recHdr = 0; 00045 DayaBay::UserDataHeader *calibStatsHdr = 0; 00046 00047 // Check if it is tagged as Co60, if not, skip. 00048 bool isCo60 = exist<DayaBay::HeaderObject>(evtSvc(), m_Co60Location); 00049 if (!isCo60){ 00050 return StatusCode::SUCCESS; 00051 } 00052 00053 // Get Calibstats 00054 if ( !exist<DayaBay::UserDataHeader>(evtSvc(), m_calibStatsLocation) ) { 00055 warning() << "Cannot find header at " << m_calibStatsLocation << endreq; 00056 return StatusCode::FAILURE; 00057 } else { 00058 calibStatsHdr = get<DayaBay::UserDataHeader>(m_calibStatsLocation); 00059 } 00060 00061 // Get readout 00062 if (!exist<DayaBay::ReadoutHeader>(evtSvc(), "/Event/Readout/ReadoutHeader")) { 00063 warning() << "Failed to get readout" << endreq; 00064 } else { 00065 readoutHdr = get<DayaBay::ReadoutHeader>("/Event/Readout/ReadoutHeader"); 00066 } 00067 00068 // Get recon header 00069 if (!exist<DayaBay::RecHeader>(evtSvc(), "/Event/Rec/AdSimple")) { 00070 warning() << "Failed to get recheader" << endreq; 00071 return StatusCode::FAILURE; 00072 } else { 00073 recHdr = get<DayaBay::RecHeader>("/Event/Rec/AdSimple"); 00074 } 00075 const DayaBay::RecTrigger& rectrigger = recHdr->recTrigger(); 00076 00077 // Skip SAB Data 00078 Site::Site_t siteId = readoutHdr->context().GetSite(); 00079 if (siteId == Site::kSAB) { 00080 return StatusCode::SUCCESS; 00081 } 00082 00083 // Skip if recon has failed 00084 float recES = rectrigger.energyStatus(); 00085 float recPS = rectrigger.positionStatus(); 00086 if (recES != 1 || recPS != 1){ 00087 debug() << "Recon failed. skipping" << endreq; 00088 return StatusCode::SUCCESS; 00089 } 00090 00091 // Record data 00092 // -- 1a. Get data from recheader 00093 float e_co60 = rectrigger.energy()/Gaudi::Units::MeV; 00094 float x_co60 = rectrigger.position().x() / Gaudi::Units::mm; 00095 float y_co60 = rectrigger.position().y() / Gaudi::Units::mm; 00096 float z_co60 = rectrigger.position().z() / Gaudi::Units::mm; 00097 // -- 1b. Get data from calib stats 00098 float nPESUM = calibStatsHdr->getFloat("nPESUM"); 00099 float nPERMS = calibStatsHdr->getFloat("nPERMS"); 00100 00101 // -- 2. Create and prepare user data header 00102 DayaBay::UserDataHeader* co60Data = MakeHeaderObject(); 00103 Context context = readoutHdr->context(); 00104 context.SetDetId(DetectorId::kAll); 00105 co60Data->setContext(context); 00106 co60Data->setEarliest(readoutHdr->earliest()); 00107 co60Data->setLatest(readoutHdr->latest()); 00108 00109 // -- 3. Finally, put data into the user data header 00110 co60Data->set("e_co60",e_co60); 00111 co60Data->set("x_co60",x_co60); 00112 co60Data->set("y_co60",y_co60); 00113 co60Data->set("z_co60",z_co60); 00114 co60Data->set("nPESUM_co60",nPESUM); 00115 co60Data->set("nPERMS_co60",nPERMS); 00116 00117 //============================== 00118 return StatusCode::SUCCESS; 00119 }