/[PAMELA software]/yoda/techmodel/physics/S4Reader.cpp
ViewVC logotype

Contents of /yoda/techmodel/physics/S4Reader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.1 - (show annotations) (download)
Wed Aug 16 08:20:30 2006 UTC (18 years, 3 months ago) by kusanagi
Branch: MAIN
CVS Tags: YODA6_3/19, YODA6_3/18, YODA6_3/13, YODA6_3/12, YODA6_3/11, YODA6_3/10, YODA6_3/17, YODA6_3/16, YODA6_3/15, YODA6_3/14, YODA6_3/06, YODA6_3/20, YODA6_3/07, YODA6_3/08, YODA6_3/09, HEAD
Changes since 6.0: +3 -4 lines
Hardware bug in the Neutron Detector.
Volodia wrote:
"There is a bug in ND hardwer. Because of this
the patter of ND sometimes could be changed from '00 00 00 0F'
to '00 00 01 0F'. You can see this in files 915, 917 for 99% events.
I saw also '00 00 16 0F' in several cases.
At the same time S4 QL was also crushed for this files. Why?

I am afraid that it is neseccary to make some correction in
YODA to take into account this problem.
May be , it would be better to check '?? ?? ?? 0F ?? ?? ?? 0F ?? ?? ?? OF'"

1 /** @file
2 * $Source: /home/cvsmanager/yoda/techmodel/physics/S4Reader.cpp,v $
3 * $Id: S4Reader.cpp,v 6.0 2006/02/07 17:11:11 kusanagi Exp $
4 * $Author: kusanagi $
5 *
6 * Implementation of the S4Reader class.
7 */
8
9 #include <string>
10 #include <log4cxx/logger.h>
11 #include "S4Reader.h"
12
13 using namespace pamela;
14 using namespace pamela::S4;
15
16 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.S4.S4Reader"));
17
18 /**
19 * Constructor.
20 */
21 S4Reader::S4Reader(void):
22 TechmodelAlgorithm(PacketType::Physics, "TechmodelS4Reader") {
23 logger->debug(_T("Constructor"));
24 s4 = new S4Event();
25 }
26
27 /**
28 * Get a string with the version info of the algorithm.
29 */
30 std::string S4Reader::GetVersionInfo(void) const {
31 return
32 "$Header: /home/cvsmanager/yoda/techmodel/physics/S4Reader.cpp,v 6.0 2006/02/07 17:11:11 kusanagi Exp $";
33 }
34
35 /**
36 * Initialize the algorithm with a special run. This will initialize the
37 * event reader routines for all packet types.
38 */
39 void S4Reader::Init(PamelaRun *run) {
40 logger->debug(_T("Initialize"));
41 SetInputStream(run);
42 run->WriteSubPacket(this, &s4, s4->Class());
43 }
44
45 /**
46 * Unpack the S4 event from an input file.
47 */
48 void S4Reader::RunEvent(int EventNumber) {
49
50 }
51
52 /**
53 * Unpack the S4 data event from the physical packet.
54 * Unfortunately the only definition available for S4 is "Rigth before the Neutron detector data"
55 * consequently supposing the Neutron data (12 Bytes) always present S4 start 18 Bytes before the end of the packet
56 */
57 void S4Reader::RunEvent(int EventNumber, const char subData[], long int length) {
58 int offset;
59 int index = haveData(&*subData, length);
60
61 if (index > 0){
62 int offset = length - index;
63 s4->S4_REG_STATUS = (((UINT8)subData[offset])&0xF0);
64 s4->S4_DATA = ((((UINT16)subData[offset]<<8)&0x0FFF) + (((UINT16)subData[offset+1])&0x00FF));
65 s4->S4_CMD_NUM = (((UINT8)subData[offset+2])&0xFF);
66 s4->S4_RESP_LENGHT = ((((UINT16)subData[offset+3]<<8)&0xFF00) + (((UINT16)subData[offset+4])&0x00FF));
67 s4->S4_OVERALL_CHKCODE = (((UINT8)subData[offset+5])&0xFF);
68 s4->unpackError = 0;
69 } else {
70 s4->unpackError = 1;
71 }
72 }
73
74 /*
75 *
76 * @return int
77 * It return the index, starting from the end of data[] parameter, which
78 * is the starting byte of the S4 data.
79 *
80 */
81 /**
82 * Check if S4Data are present.
83 * @param const char data[] - Physics data
84 * @param long int lenght - Lenght of data[]
85 * @return int represent the index from the end of data[]
86 * from which S4 data starts
87 */
88 int S4Reader::haveData(const char data[], long int length){
89 int ret = 0;
90 /* I start 20 bytes from the end because we have three cases:
91 *
92 * 1) S4 (4bytes) + NeutronDetector (12bytes) //END PACKET
93 * 2) S4 (4bytes) //END PACKET
94 * 3) //END PACKET
95 *
96 * so in anycase I expect to find the data into the last 20 bytes
97 * Anyway, it will be a MUST to implements also the check of the CRC
98 * on the S4 data to have a better confidence on the data; the crc algorithm
99 * sholud be the same of the Tracker
100 *
101 */
102
103 //Check the existence of NeutronDetector data
104 if (((UINT8)data[length - 1] == 0x0F)&&((UINT8)data[length - 5] == 0x0F)&&((UINT8)data[length - 9] == 0x0F)) {
105 //Chech the existance of S4 data before NeutronDetector
106 if (((UINT8)data[length - 14] == 0x03) &&
107 ((UINT8)data[length - 15] == 0x00) &&
108 ((UINT8)data[length - 16] == 0xD8)) ret = 18;
109 //NeutronDetector data does not exists
110 } else {
111 //Chech the existance of S4 data at the end of the Physics packet
112 if ( ((UINT8)data[length - 2] == 0x03) &&
113 ((UINT8)data[length - 3] == 0x00) &&
114 ((UINT8)data[length - 4] == 0xD8)) ret = 6;
115 }
116 return ret;
117 }

  ViewVC Help
Powered by ViewVC 1.1.23