/search.css" rel="stylesheet" type="text/css"/> /search.js">
00001 #include "Ge68Data.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 Ge68Data::Ge68Data(const std::string& name, ISvcLocator* pSvcLocator) 00017 : DybAlgorithm<DayaBay::UserDataHeader>(name,pSvcLocator) { 00018 m_location = "/Event/Data/Calib/Ge68"; 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("Ge68Location", m_Ge68Location="/Event/Tag/Calib/Ge68", 00025 "Location of the Ge68 Tag"); 00026 } 00027 00028 Ge68Data::~Ge68Data() { 00029 } 00030 00031 StatusCode Ge68Data::initialize() { 00032 return this->GaudiAlgorithm::initialize(); 00033 } 00034 00035 StatusCode Ge68Data::finalize() { 00036 return this->GaudiAlgorithm::finalize(); 00037 } 00038 00039 StatusCode Ge68Data::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 Ge68, if not, skip. 00048 bool isGe68 = exist<DayaBay::HeaderObject>(evtSvc(), m_Ge68Location); 00049 if (!isGe68){ 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_ge68 = rectrigger.energy()/Gaudi::Units::MeV; 00094 float x_ge68 = rectrigger.position().x() / Gaudi::Units::mm; 00095 float y_ge68 = rectrigger.position().y() / Gaudi::Units::mm; 00096 float z_ge68 = 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* ge68Data = MakeHeaderObject(); 00103 Context context = readoutHdr->context(); 00104 context.SetDetId(DetectorId::kAll); 00105 ge68Data->setContext(context); 00106 ge68Data->setEarliest(readoutHdr->earliest()); 00107 ge68Data->setLatest(readoutHdr->latest()); 00108 00109 // -- 3. Finally, put data into the user data header 00110 ge68Data->set("e_ge68",e_ge68); 00111 ge68Data->set("x_ge68",x_ge68); 00112 ge68Data->set("y_ge68",y_ge68); 00113 ge68Data->set("z_ge68",z_ge68); 00114 ge68Data->set("nPESUM_ge68",nPESUM); 00115 ge68Data->set("nPERMS_ge68",nPERMS); 00116 00117 //============================== 00118 return StatusCode::SUCCESS; 00119 }