| 1 |  | 
| 2 | #include <string> | 
| 3 | #include <log4cxx/logger.h> | 
| 4 | #include "NeutronDetectorReader.h" | 
| 5 |  | 
| 6 | using namespace pamela; | 
| 7 | using namespace pamela::neutron; | 
| 8 |  | 
| 9 | static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.neutron.NeutronDetectorReader")); | 
| 10 |  | 
| 11 | /** | 
| 12 | * Constructor. | 
| 13 | */ | 
| 14 | NeutronDetectorReader::NeutronDetectorReader(void): | 
| 15 | TechmodelAlgorithm(PacketType::Physics, "TechmodelNeutronDetectorReader") { | 
| 16 | logger->debug(_T("Constructor")); | 
| 17 | neutronEvent = new NeutronEvent(); | 
| 18 | } | 
| 19 |  | 
| 20 | /** | 
| 21 | * Get a string with the version info of the algorithm. | 
| 22 | */ | 
| 23 | std::string NeutronDetectorReader::GetVersionInfo(void) const { | 
| 24 | return | 
| 25 | "$Header: /home/cvsmanager/yoda/techmodel/physics/NeutronDetectorReader.cpp,v 2.1 2004/09/22 13:14:31 kusanagi Exp $"; | 
| 26 | } | 
| 27 |  | 
| 28 | /** | 
| 29 | * Initialize the algorithm with a special run. This will initialize the | 
| 30 | * event reader routines for all packet types. | 
| 31 | */ | 
| 32 | void NeutronDetectorReader::Init(PamelaRun *run) { | 
| 33 | logger->debug(_T("Initialize")); | 
| 34 | SetInputStream(run); | 
| 35 | run->WriteSubPacket(this, &neutronEvent, neutronEvent->Class()); | 
| 36 | } | 
| 37 |  | 
| 38 | /** | 
| 39 | * Unpack the anticounter event from an input file. | 
| 40 | */ | 
| 41 | void NeutronDetectorReader::RunEvent(int EventNumber) { | 
| 42 |  | 
| 43 | } | 
| 44 |  | 
| 45 | /** | 
| 46 | * Unpack the NeutronDetector data event from the physical packet. | 
| 47 | */ | 
| 48 | void NeutronDetectorReader::RunEvent(int EventNumber, const char subData[], long int lenght) { | 
| 49 | NeutronRecord *rec; | 
| 50 | const int lenNeutronData = 12; | 
| 51 | char *data = new char[lenght]; | 
| 52 | memcpy(data, subData, lenght); | 
| 53 | neutronEvent->Records->Clear(); | 
| 54 | TClonesArray &recs = *(neutronEvent->Records); | 
| 55 | int offset; | 
| 56 | if (haveData(data, lenght)){ | 
| 57 | for (int i = 0; i < 3; i++){ | 
| 58 | offset = lenNeutronData - 4*i; | 
| 59 | rec = new(recs[i]) NeutronRecord(); //aggiungo un nuovo NeutronRecord all'evento | 
| 60 | rec->upperTrig   = (((BYTE)data[lenght-offset])>>4); | 
| 61 | rec->bottomTrig  = (((BYTE)data[lenght-offset])&0x0F); | 
| 62 | rec->upperBack   = (((BYTE)data[lenght-offset+1])>>4); | 
| 63 | rec->bottomBack  = (((BYTE)data[lenght-offset+1])&0x0F); | 
| 64 | } | 
| 65 | } | 
| 66 | delete[] data; | 
| 67 | } | 
| 68 |  | 
| 69 | /* For definition the definition for Neutron detector data is | 
| 70 | * "The last data bunch in the phyics packet" */ | 
| 71 | bool NeutronDetectorReader::haveData(const char data[], long int lenght){ | 
| 72 | bool ret = false; | 
| 73 | if (((data[lenght-1] && data[lenght - 5] && data[lenght - 9]) && 0x0F) && | 
| 74 | ((data[lenght-2] | data[lenght - 6] | data[lenght - 10]) == 0x00)) ret = true; | 
| 75 | return ret; | 
| 76 | } |