--- yoda/techmodel/physics/NeutronDetectorReader.cpp 2004/08/19 15:24:58 1.1 +++ yoda/techmodel/physics/NeutronDetectorReader.cpp 2006/02/07 17:11:11 6.0 @@ -1,19 +1,19 @@ #include -#include +#include #include "NeutronDetectorReader.h" using namespace pamela; using namespace pamela::neutron; -static log4cpp::Category& cat = log4cpp::Category::getInstance("pamela.techmodel.neutron.NeutronDetectorReader"); +static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.neutron.NeutronDetectorReader")); /** * Constructor. */ NeutronDetectorReader::NeutronDetectorReader(void): TechmodelAlgorithm(PacketType::Physics, "TechmodelNeutronDetectorReader") { - cat.debug("Constructor"); + logger->debug(_T("Constructor")); neutronEvent = new NeutronEvent(); } @@ -22,14 +22,23 @@ */ std::string NeutronDetectorReader::GetVersionInfo(void) const { return - "$Header: /home/cvsmanager/yoda/techmodel/physics/NeutronDetectorReader.cpp,v 1.1 2004/07/20 13:27:07 kusanagi Exp $"; + "$Header: /home/cvsmanager/yoda/techmodel/physics/NeutronDetectorReader.cpp,v 5.1 2006/02/04 12:37:46 kusanagi Exp $"; } /** * Initialize the algorithm with a special run. This will initialize the * event reader routines for all packet types. + * For definition the definition for Neutron detector data is located in the + * end of the physics packet. + * More explicitely the neutronData is composed by 4 bytes; + * a pattern 00 0F TR BK + * where: + * 00 0f is a fixed pattern + * TR is the NeutronCounter for a trigger event + * BK is the NeutronCounter beetween two trigger events */ void NeutronDetectorReader::Init(PamelaRun *run) { + logger->debug(_T("Initialize")); SetInputStream(run); run->WriteSubPacket(this, &neutronEvent, neutronEvent->Class()); } @@ -44,30 +53,32 @@ /** * Unpack the NeutronDetector data event from the physical packet. */ -void NeutronDetectorReader::RunEvent(int EventNumber, const char subData[], long int lenght) { - NeutronRecord *rec; - int offset = 0; - char data[lenght]; - //the 2 bytes subtracted belong to the final event CRC bytes - memcpy(data, subData, lenght); +void NeutronDetectorReader::RunEvent(int EventNumber, const char subData[], long int length) { + NeutronRecord *rec; + const int lenNeutronData = 12; + //char *data = new char[lenght]; + //memcpy(data, subData, lenght); neutronEvent->Records->Clear(); TClonesArray &recs = *(neutronEvent->Records); - offset = 12; - if (haveData(data, lenght)){ + int offset; + if (haveData(&*subData, length)){ for (int i = 0; i < 3; i++){ + offset = lenNeutronData - 4*i; rec = new(recs[i]) NeutronRecord(); //aggiungo un nuovo NeutronRecord all'evento - rec->upperTrig = (((BYTE)data[lenght-offset])>>4); - rec->bottomTrig = (((BYTE)data[lenght-offset])&0x0F); - rec->upperBack = (((BYTE)data[lenght-offset+1])>>4); - rec->bottomBack = (((BYTE)data[lenght-offset+1])&0x0F); - offset = offset - 4*(i+1); + rec->trigPhysics = (UINT8)subData[length-offset]; + rec->upperBack = (((UINT8)subData[length-offset+1])>>4); + rec->bottomBack = (((UINT8)subData[length-offset+1])&0x0F); } + neutronEvent->unpackError = 0; + } else { + neutronEvent->unpackError = 1; } } -bool NeutronDetectorReader::haveData(const char data[], long int lenght){ + +bool NeutronDetectorReader::haveData(const char data[], long int length){ bool ret = false; - if (((data[lenght-1] && data[lenght - 5] && data[lenght - 9]) && 0x0F) && - ((data[lenght-2] | data[lenght - 6] | data[lenght - 10]) == 0x00)) ret = true; + if (((UINT8)data[length - 1] == 0x0F)&&((UINT8)data[length - 5] == 0x0F)&&((UINT8)data[length - 9] == 0x0F) && + ((UINT8)data[length - 2] == 0x00)&&((UINT8)data[length - 6] == 0x00)&&((UINT8)data[length - 10] == 0x00)) ret = true; return ret; }