CalibratedHk.cxx
1 
9 #include "CalibratedHk.h"
10 #include "RawHk.h"
11 #include <iostream>
12 #include <fstream>
13 #include <cstring>
14 
15 #include <TMath.h>
16 
17 ClassImp(CalibratedHk);
18 
19 
20 //Calibration constants, may need to be updated
21 float calSlopeAnita3[3][40]=
22 {
23  {1,1,100,1,1,1,1,1,1,1,1,100,1,1,1,100,100,100,100,100,1,1,1,1,100,1,1,1,100,1,1,1,1,1,1,100,100,100,100,100},
24  {2,1,2,-3.0075,4.02,2,2,1,1,1, //40-49
25  1,1,1,8,8,30,30,20,1,1, //50-59
26  0.8,8,-2,0.8,60,20,0.8,1,1,1, //60-69
27  1,1,1,4.02,2,2,10.1,19.25,100,400}, //70-79
28  {100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100}
29 };
30 
31 float calInterceptAnita3[3][40]=
32 {
33  {0,0,-273.15,0,0,0,0,0,0,0,0,-273.15,0,0,0,-273.15,-273.15,-273.15,-273.15,-273.15,0,0,0,0,-273.15,0,0,0,-273.15,0,0,0,0,0,0,-273.15,-273.15,-273.15,-273.15,-273.15},
34  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-273.15,0},
35  {-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15}
36 };
37 
38 int calSchemeAnita3[3][40]=
39 {
40  {0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1},
41  {1,1,1,1,1,1,1,2,3,2,4,5,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,6,7,8,9,10,0,1,1,0,1,1,1,1},
42  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
43 };
44 
45 
46 float calSlope[3][40]=
47 {
48  {1,1,100,1,1,1,1,1,1,1,1,100,1,1,1,100,100,100,100,100,1,1,1,1,100,1,1,1,100,1,1,1,1,1,1,100,100,100,100,100},
49  {2,1,2,-3.0075,4.02,2,2,1,1,1, //40-49
50  1,1,1,8,8,30,30,20,1,1, //50-59
51  0.8,8,-2,0.8,60,20,0.8,1,1,1, //60-69
52  1,1,1,2,3,2,10.1,19.25,100,400}, //70-79
53  {100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100}
54 };
55 
56 float calIntercept[3][40]=
57 {
58  {0,0,-273.15,0,0,0,0,0,0,0,0,-273.15,0,0,0,-273.15,-273.15,-273.15,-273.15,-273.15,0,0,0,0,-273.15,0,0,0,-273.15,0,0,0,0,0,0,-273.15,-273.15,-273.15,-273.15,-273.15},
59  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-273.15,0},
60  {-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15,-273.15}
61 };
62 
63 int calScheme[3][40]=
64 {
65  {0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1},
66  {1,1,1,1,1,1,1,2,3,2,4,5,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,6,7,8,9,10,0,1,1,0,1,1,1,1},
67  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
68 };
69 
70 //static int calScheme[3][40]={{0}};
71 //static float calIntercept[3][40]={{0}};
72 //static float calSlope[3][40]={{0}};
73 
74 
75 //Sunsensor Stuff
76 //int ssYVals[4][2]={{0,20},{22,3},{26,7},{9,29}};
77 //int ssXVals[4][2]={{1,21},{23,4},{27,8},{10,30}};
78 
79 //int sunsensorChans[20]={0,1,20,21,2,22,23,3,4,24,26,27,7,8,28,9,10,29,30,11};
80 int ssXInds[4][2]={{20,0},{3,22},{7,26},{29,9}};
81 int ssYInds[4][2]={{21,1},{4,23},{8,27},{30,10}};
82 int ssTemp[4]={2,24,28,11};
83 
84 
85 
86 //Sunsensor Stuff
87 float ssOffset[4][2]={{0.08,-0.1572},{-0.32940,-0.17477},
88  {0.05541,-0.08458},{-0.23773,-0.50356}};
89 float ssGain[4][2]={{5.0288,5.0},{4.8515,5.0},{5.0599,5.0},{5.0288,5.0}};
90 float ssSep[4]={3.704391,3.618574,3.512025,3.554451};
91 float ssAzRel[4]={45,-45,-135,+135};
92 float ssGammaFactor[4]={0.4,0.2,0.3,0.5};
93 const float globalGamma=67;
94 
95 
96 
98 {
99  //Default Constructor
100  // memcpy(calScheme,calSchemeAnita4,3*40*sizeof(int));
101  // memcpy(calIntercept,calInterceptAnita4,3*40*sizeof(float));
102  // memcpy(calScheme,calInterceptAnita4,3*40*sizeof(float));
103 
104 }
105 
107  //Default Destructor
108 }
109 
110 
111 CalibratedHk::CalibratedHk(RawHk *hkPtr, RawHk *avzPtr, RawHk *calPtr)
112 {
113  //Assignment consturctor
114  this->gHdr_verId=hkPtr->gHdr_verId;
115 
116  // if(gHdr_verId>=40) {
117  // memcpy(calScheme,calSchemeAnita4,3*40*sizeof(int));
118  // memcpy(calIntercept,calInterceptAnita4,3*40*sizeof(float));
119  // memcpy(calScheme,calInterceptAnita4,3*40*sizeof(float));
120  // }
121  // else {
122  // memcpy(calScheme,calSchemeAnita3,3*40*sizeof(int));
123  // memcpy(calIntercept,calInterceptAnita3,3*40*sizeof(float));
124  // memcpy(calScheme,calInterceptAnita3,3*40*sizeof(float));
125  // }
126 
127 
128  run=hkPtr->run;
129  realTime=hkPtr->realTime;
130  payloadTime=hkPtr->payloadTime;
132  magX=hkPtr->magX;
133  magY=hkPtr->magY;
134  magZ=hkPtr->magZ;
135  memcpy(sbsTemp,hkPtr->sbsTemp,sizeof(Short_t)*3);
136  memcpy(ntuTemp,hkPtr->ntuTemp,sizeof(Short_t)*3);
137 
138  //Now calibrate voltage
139  for(int board=0;board<3;board++) {
140  for(int chan=0;chan<40;chan++) {
141  float avz= 2048;
142  float cal = 4055;
143  // if(avzPtr)
144  // avz = float((avzPtr->acromagData[board][chan])>>4);
145  // if(calPtr)
146  // cal = float((calPtr->acromagData[board][chan])>>4);
147  float slope=4.9/(cal-avz);
148  float intercept=-1*slope*avz;
149  voltage[board][chan]=slope*float((hkPtr->acromagData[board][chan])>>4)+intercept;
150 
151  // std::cout << board << "\t" << chan << "\t" << slope << "\t" << intercept << "\t" << hkPtr->acromagData[board][chan] << "\t" << voltage[board][chan] << std::endl;
152  }
153  }
154 
155  //Now convert voltage to 'useful' quantity
156  float vs=2.*(voltage[1][6]); //Heck knows what this is
157  for(int board=0;board<3;board++) {
158  for(int chan=0;chan<40;chan++) {
159  switch(calScheme[board][chan]) {
160  case 0:
161  //Do nothing
162  useful[board][chan]=voltage[board][chan];
163  break;
164  case 1:
165  //y = mx +c
166  useful[board][chan]=(calSlope[board][chan]*voltage[board][chan])+
167  calIntercept[board][chan];
168  break;
169  case 2:
170  //Accel T
171  useful[board][chan]=44.4*((voltage[board][chan]*(5./vs)-1.375));
172  break;
173  case 3:
174  //Accel 2-Y
175  useful[board][chan]=(1./0.844)*((voltage[board][chan]*(5./vs)-2.523));
176  break;
177  case 4:
178  //Accel 1-Y
179  useful[board][chan]=(1./0.839)*((voltage[board][chan]*(5./vs)-2.512));
180  break;
181  case 5:
182  //Low pressure
183  useful[board][chan]=0.00215181+(voltage[board][chan]*4.0062)-(voltage[board][chan]*voltage[board][chan]*0.0027642); //PSI
184  // useful[board][chan]*=6894.76; //Pascals
185  useful[board][chan]*=68.046e-3; //Atmospheres
186  break;
187  case 6:
188  //Accel 2-Z
189  useful[board][chan]=(1./0.843)*((voltage[board][chan]*(5./vs)-2.523));
190  break;
191  case 7:
192  //Accel 2-X
193  useful[board][chan]=(1./0.827)*((voltage[board][chan]*(5./vs)-2.523));
194  break;
195  case 8:
196  //Accel 1-Z
197  useful[board][chan]=(1./0.842)*((voltage[board][chan]*(5./vs)-2.506));
198  break;
199  case 9:
200  //Accel 1-X
201  useful[board][chan]=(1./0.830)*((voltage[board][chan]*(5./vs)-2.493));
202  break;
203  case 10:
204  //High Pressure
205  useful[board][chan]=3.75*(voltage[board][chan]-0.25); //Torr
206  useful[board][chan]*=1.3158e-3; //Atmospheres
207  // useful[board][chan]*=133.322; //Pascals
208  break;
209  default:
210  useful[board][chan]=voltage[board][chan];
211  break;
212  }
213  }
214  }
215 }
216 
217 
219 {
220  // int internalTempChans[NUM_INT_TEMPS]={0,20,1,21,2,22,3,23,4,24,5,25,6,26,7};
221  int internalTempChans[NUM_INT_TEMPS]={80,100,81,101,82,102,83,103,84,104,85,105,86,106,87};
222 
223 
224  if(index>=0 && index<NUM_INT_TEMPS)
225  return useful[internalTempChans[index]/40][internalTempChans[index]%40];
226  return -1;
227 }
228 
230 {
231  int externalTempChans[NUM_EXT_TEMPS]={112,93,113,94,114,95,115,96,116,97,117,98,118,99,119};//,39,19,38,18,37,17,36,16,35,15};
232  // int externalTempChans[NUM_EXT_TEMPS]={32,13,33,14,34,15,35,16,36,17,37,18,38,19,39};
233  if(index>=0 && index<NUM_EXT_TEMPS)
234  return useful[externalTempChans[index]/40][externalTempChans[index]%40];
235  return -273;
236 }
237 
238 Float_t CalibratedHk::getSBSTemp(int index)
239 {
240  Int_t sbsMagicAdd[NUM_SBS_TEMPS]={0,0,0};
241  if(index>=0 && index<NUM_SBS_TEMPS)
242  return (0.1*sbsTemp[index]) + sbsMagicAdd[index];
243  return -273;
244 }
245 
246 
247 Float_t CalibratedHk::getNTUTemp(int index)
248 {
249  if(index==0) return (0.01*ntuTemp[index]);
250  if(index==1) return ntuTemp[1];
251  if(index==2) return ntuTemp[2];
252  return -273;
253 }
254 
255 
256 
257 const char *CalibratedHk::getVoltageName(int index)
258 {
259  const char *voltageNames[NUM_VOLTAGES]={"12V GPS","5.3V IP","+12_PCI","+24","PV","+5_PCI","+5M","+3.3_PCI","+1.5","-12_PCI","-5"};
260  if(index>=0 && index<NUM_VOLTAGES)
261  return voltageNames[index];
262  return "None";
263 
264 }
265 
266 Float_t CalibratedHk::getVoltage(int index) {
267  int powerVoltChans[NUM_VOLTAGES]={74,73,44,76,77,46,42,45,41,43,62};
268  if(index>=0 && index<NUM_VOLTAGES) {
269  return useful[powerVoltChans[index]/40][powerVoltChans[index]%40];
270  }
271  return -1;
272 }
273 
274 Float_t CalibratedHk::getCurrent(int index) {
275  int powerAmpChans[NUM_CURRENTS]={56,57,61,64,63,65,55};
276  if(index>=0 && index<NUM_CURRENTS) {
277  return useful[powerAmpChans[index]/40][powerAmpChans[index]%40];
278  }
279  return -1;
280 }
281 
282  const char *CalibratedHk::getCurrentName(int index)
283 {
284 //const char *currentNames[NUM_CURRENTS]={"RF1","RF2","Batt","+24","PV","+1.5","+5S","-12","+12","+3.3","+5","-5"};
285 const char *currentNames[NUM_CURRENTS]={"+24","PV","+5_M","+3.3_PCI","+12_PCI","+5_PCI","Batt"};
286  if(index>=0 && index<NUM_CURRENTS)
287  return currentNames[index];
288  return "None";
289 
290 
291 }
292 
293 
294 const char *CalibratedHk::getSSName(int ssInd)
295 {
296  switch(ssInd) {
297  case 0: return "SS-1";
298  case 1: return "SS-3";
299  case 2: return "SS-5";
300  case 3: return "SS-7";
301  default:
302  return "n/c";
303  }
304 }
305 
306 
307 
308  const char *CalibratedHk::getPowerName(int index) {
309  const char *powerNames[NUM_POWERS]={"+24","PV","+5M","Batt","Crate"};
310  if(index>=0 && index<NUM_POWERS)
311  return powerNames[index];
312  return "None";
313 }
314 
315 Float_t CalibratedHk::getPower(int index) {
316  int powerWattChans[NUM_POWERS-1][2]={{76,56},{77,57},{42,61},{76,55}};
317  if(index>=0 && index<NUM_POWERS-1) {
318  float volts=useful[powerWattChans[index][0]/40][powerWattChans[index][0]%40];
319  float amps=useful[powerWattChans[index][1]/40][powerWattChans[index][1]%40];
320  return volts*amps;
321  }
322  else if(index==NUM_POWERS-1){
323  int crateWattChans[3][2]={{45,64},{46,63},{44,65}};
324  float watts=0;
325  for(int i=0;i<3;i++) {
326  float volts=useful[crateWattChans[i][0]/40][crateWattChans[i][0]%40];
327  float amps=useful[crateWattChans[i][1]/40][crateWattChans[i][1]%40];
328  watts+=volts*amps;
329  }
330  return watts;
331  }
332  return 0;
333 }
334 
335 Float_t CalibratedHk::getAttitude(int index) {
336  int attitudeChans[10]={70,50,69,49,68,48,67,47,51,71};
337  if(index>=0 && index<10) {
338  return useful[attitudeChans[index]/40][attitudeChans[index]%40];
339  }
340  else if(index==10)
341  return magX;
342  else if(index==11)
343  return magY;
344  else if(index==12)
345  return magZ;
346  return -1;
347 }
348 
349 
350  const char *CalibratedHk::getAttitudeName(int index) {
351  const char *attChanNames[NUM_ATTITUDE]={"Ac1-X","Ac1-Y","Ac1-Z","Ac1-T","Ac2-X","Ac2-Y","Ac2-Z","Ac2-T","Pres","Pres","Mag-X","Mag-Y","Mag-Z"};
352  if(index>=0 && index<NUM_ATTITUDE)
353  return attChanNames[index];
354  return "None";
355 }
356 
357 
358 
359 
360  const char *CalibratedHk::getExternalTempName(int index)
361 {
362  // ANITA3
363  // const char *extTempNames[NUM_EXT_TEMPS]={"Radiator Plate, top right","Radiator Plate, bottom left","AMPA 16TH","Battery Box","AMPA 02TV","AMPA 02TV","ANITA box near He Drives","ANITA box near IRFMCs","PV17","Radiator Plate, middle","PV02","PV14","PV05","PV23","PV11"};//,"A27V (RFCM11)","A29V (RFCM04)","A31V (RFCM01)","A??V (RFCM 17)","A??V (RFCM18)","A??V (RFCM19)","A??V (RFCM20)","Radiator Plate","PV 5 (phi 12)","PV 7 (phi 16)"};
364  // ANITA4
365  const char *extTempNames[NUM_EXT_TEMPS]={"Radiator Plate","Lid Center","Battery Box (Aft Starboard)","AMPA 01TH","AMPA 05TH","AMPA 09TH","AMPA 13TH","AMPA 01MH","AMPA 05MH","AMPA 09MH","AMPA 13MH","PV1","PV3","PV5","PV7"};
366  if(index>=0 && index<NUM_EXT_TEMPS)
367  return extTempNames[index];
368  return "None";
369 }
370 
371  const char *CalibratedHk::getInternalTempName(int index)
372 {
373  //ANITA2
374  //const char *intTempNames[NUM_INT_TEMPS]={"SURF 10","SURF 8","SURF 3","Top of CPU fcaeplate","Bottom of CPU faceplate","MTRON Box","125MHz Clock","Radiator Plate (near SURF 7)","Radiator Plate (near SURF 2)","SHORT 02","SHORT 24","SHORT 28","SHORT 31","IP Box","DC-DC Box"};
375  //ANITA3
376  // const char *intTempNames[NUM_INT_TEMPS]={"SHORT - Phi 16","Radiator above DC-DC box","IRFCM A","Bottom of CPCI crate","NTU SSD box","DC-DC box","IP Box","SHORT - Phi 9","Top of CPCI, CPU side","SURF 8","IRFCM D","TURFIO faceplate","Housekeeping Box","He Drive 1 Enclosure","Bottom of Radiator Plate, beneath DC-DC Box"};
377  //ANITA4
378  const char *intTempNames[NUM_INT_TEMPS]={"Lid near SHORT 20 PHI 09", "Radiator plate above DC-DC Box", "IRFCM 0", "Bottom side of CPU crate", "NTU SSD array Box top", "DC-DC Box middle", "Top of IP Box", "Lid near SHORT 01 PHI 16", "Top of CPCI crate CPU side", "Top Front edge of CPCI crate near SURF8", "IRFCM 3", "Cover plate near TURFIO", "Back of He Drive mounting plate (Drive 2)", "Back of He Drive mounting plate (Drive 1)", "Radiator plate below DC-DC Box"};
379 
380  if(index>=0 && index<NUM_INT_TEMPS)
381  return intTempNames[index];
382  return "None";
383 }
384 
385 const char *CalibratedHk::getSBSTempName(int index)
386 {
387  const char *sbsTempNames[NUM_SBS_TEMPS]={"CPU","Core1","Core2"};
388  if(index>=0 && index<NUM_SBS_TEMPS)
389  return sbsTempNames[index];
390  return "None";
391 }
392 
393 
394 const char *CalibratedHk::getNTUTempName(int index)
395 {
396  const char *ntuTempNames[NUM_NTU_TEMPS]={"CPU","Disk0","Disk1"};
397  if(index>=0 && index<NUM_NTU_TEMPS)
398  return ntuTempNames[index];
399  return "None";
400 }
401 
402 
403 
404 
405 void CalibratedHk::getSSMagnitude(int ssInd, Float_t *magnitude, Float_t *magX, Float_t *magY) {
406  if(ssInd<0 || ssInd>4) return;
407 
408  *magnitude=
409  TMath::Abs(this->useful[0][ssXInds[ssInd][0]])+
410  TMath::Abs(this->useful[0][ssXInds[ssInd][1]])+
411  TMath::Abs(this->useful[0][ssYInds[ssInd][0]])+
412  TMath::Abs(this->useful[0][ssYInds[ssInd][1]]);
413 
414  *magX=TMath::Abs(this->useful[0][ssXInds[ssInd][0]]+this->useful[0][ssXInds[ssInd][1]]);
415  *magY=TMath::Abs(this->useful[0][ssYInds[ssInd][0]]+this->useful[0][ssYInds[ssInd][1]]);
416 }
417 
418 
419 Float_t CalibratedHk::getSSTemp(int ssInd)
420 {
421  if(ssInd<0 || ssInd>4) return -1;
422  return this->useful[0][ssTemp[ssInd]];
423 }
424 
425 
426 Int_t CalibratedHk::getSSXRatio(int ssInd, Float_t *xRatio)
427 {
428  *xRatio=(this->useful[0][ssXInds[ssInd][1]]-this->useful[0][ssXInds[ssInd][0]]);
429  Float_t xDenom=(this->useful[0][ssXInds[ssInd][1]]+this->useful[0][ssXInds[ssInd][0]]);
430  if(TMath::Abs(xDenom)>0.1*TMath::Abs(*xRatio)) {
431  (*xRatio)/=xDenom;
432  return 1;
433  }
434  else {
435  *xRatio=0;
436  }
437  return 0;
438 }
439 
440 Int_t CalibratedHk::getSSYRatio(int ssInd, Float_t *yRatio)
441 {
442 
443  *yRatio=(this->useful[0][ssYInds[ssInd][1]]-this->useful[0][ssYInds[ssInd][0]]);
444  Float_t yDenom=(this->useful[0][ssYInds[ssInd][1]]+this->useful[0][ssYInds[ssInd][0]]);
445  if(TMath::Abs(yDenom)>0.1*TMath::Abs(*yRatio)) {
446  (*yRatio)/=yDenom;
447  return 1;
448  }
449  else {
450  *yRatio=0;
451  }
452  return 0;
453 }
454 
455 
456 
457 Int_t CalibratedHk::getFancySS(int ssInd, Float_t pos[3], Float_t *azimuth,
458  Float_t *elevation, Float_t *relAzimuth) {
459 
460  Float_t magnitude=0,magX=0,magY=0;
461  this->getSSMagnitude(ssInd,&magnitude,&magX,&magY);
462 
463  Float_t xRatio=0;
464  Float_t x0=0;
465  if(this->getSSXRatio(ssInd,&xRatio)) {
466  x0=xRatio;
467  x0*=ssGain[ssInd][0];
468  x0-=ssOffset[ssInd][0];
469  }
470 
471  Float_t y0=0;
472  Float_t yRatio=0;
473  if(this->getSSYRatio(ssInd,&yRatio)) {
474  y0=-1*yRatio;
475  y0*=ssGain[ssInd][1];
476  y0-=ssOffset[ssInd][1];
477  }
478 
479 
480  int goodVals=1;
481  if(magX<0.5) {
482  goodVals=0;
483  xRatio=0;
484  x0=-1*ssOffset[ssInd][0];
485  }
486 
487  if(magY<0.5) {
488  goodVals=0;
489  yRatio=0;
490  y0=-1*ssOffset[ssInd][1];
491  }
492 
493  Float_t gamma=(globalGamma-ssGammaFactor[ssInd])*TMath::DegToRad();
494  pos[0]=(-1*x0*TMath::Cos(gamma))-(TMath::Sin(gamma)*ssSep[ssInd]);
495  pos[1]=-1*y0;
496  pos[2]=ssSep[ssInd]*TMath::Cos(gamma)-x0*TMath::Sin(gamma);
497 
498  *azimuth=TMath::ATan2(pos[1],-1*pos[0])*TMath::RadToDeg();
499  Float_t posXY2=TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
500  *elevation=TMath::ATan2(pos[2],posXY2)*TMath::RadToDeg();
501  *relAzimuth=(*azimuth)+ssAzRel[ssInd];
502  if((*relAzimuth)<0) (*relAzimuth)+=360;
503 
504  return goodVals;
505 }
506 
507 
508 Float_t CalibratedHk::getPressure(int index)
509 {
510  int presChans[2]={51,71};
511  if(index>=0 && index<2) {
512  return useful[presChans[index]/40][presChans[index]%40];
513  }
514  return -1;
515 }
516 
517 Float_t CalibratedHk::getAccelerometer(int acInd, int type)
518 {
519  int accelChans[2][4]={{70,50,69,49},{68,58,67,57}};
520  if((acInd>=0 && acInd<2) && (type>=0 && type<4)) {
521  return useful[accelChans[acInd][type]/40][accelChans[acInd][type]%40];
522  }
523  return -1;
524 
525 }
526 
527 Float_t CalibratedHk::getRawSunsensor(int ssInd, int type)
528 {
529  if((ssInd>=0 && ssInd<4) && (type>=0 && type<5)) {
530  switch(type) {
531  case 0:
532  return useful[ssXInds[ssInd][0]/40][ssXInds[ssInd][0]%40];
533  case 1:
534  return useful[ssXInds[ssInd][1]/40][ssXInds[ssInd][1]%40];
535  case 2:
536  return useful[ssYInds[ssInd][0]/40][ssYInds[ssInd][0]%40];
537  case 3:
538  return useful[ssYInds[ssInd][1]/40][ssYInds[ssInd][1]%40];
539  case 4:
540  return useful[ssTemp[ssInd]/40][ssTemp[ssInd]%40];
541  default:
542  return -1;
543 
544  }
545  }
546  return -1;
547 
548 }
549 
550 Float_t CalibratedHk::getSSAzimuth(int ssInd)
551 {
552  Float_t azimuth,elevation,relAzimuth;
553  Float_t pos[3];
554  getFancySS(ssInd,pos,&azimuth,&elevation,&relAzimuth);
555  return azimuth;
556 }
557 
558 
559 Float_t CalibratedHk::getSSAzimuthAdu5(int ssInd)
560 {
561  Float_t azimuth,elevation,relAzimuth;
562  Float_t pos[3];
563  getFancySS(ssInd,pos,&azimuth,&elevation,&relAzimuth);
564  return relAzimuth;
565 }
566 
567 Float_t CalibratedHk::getSSElevation(int ssInd)
568 {
569 
570  Float_t azimuth,elevation,relAzimuth;
571  Float_t pos[3];
572  getFancySS(ssInd,pos,&azimuth,&elevation,&relAzimuth);
573  return elevation;
574 
575 }
576 
577 
static const char * getAttitudeName(int index)
Return char string name of attitude sensor.
Float_t getVoltage(int index)
Returns voltage (0:10)
UInt_t realTime
Time in unixTime.
Definition: RawHk.h:36
Short_t ntuTemp[3]
NTU temperatures in some crazy scheme.
Definition: RawHk.h:46
UInt_t payloadTimeUs
Subsecond timing.
Definition: RawHk.h:38
Int_t getFancySS(int ssInd, Float_t pos[3], Float_t *azimuth, Float_t *elevation, Float_t *relAzimuth)
Convert sunsensor data to elevation and azimuth.
void getSSMagnitude(int ssInd, Float_t *magnitude, Float_t *magX, Float_t *magY)
Get sunsensor magnitude.
Float_t getExternalTemp(int index)
Returns external temperature in degrees (0:24)
UInt_t payloadTime
Time in unixTime.
Definition: CalibratedHk.h:74
Float_t voltage[3][40]
Array of voltages.
Definition: CalibratedHk.h:77
UShort_t acromagData[3][40]
The array of ADC values.
Definition: RawHk.h:41
Float_t getNTUTemp(int index)
Returns NTU temperature in degrees (0:3)
static const char * getSBSTempName(int index)
Return char string name of SBS temperature sensor.
static const char * getSSName(int index)
Return string name of sun-sensor.
Float_t getAccelerometer(int acInd, int type)
Returns accelerometer stuff.
Float_t getSSTemp(int ssInd)
Get sunsensor temperature.
Float_t magZ
Magnetometer z value.
Definition: RawHk.h:44
UInt_t payloadTimeUs
Sub second time in us.
Definition: CalibratedHk.h:75
static const char * getExternalTempName(int index)
Return char string name of external temperature sensor.
Float_t getPower(int index)
Returns power (0:5)
Short_t ntuTemp[3]
The 7 (packed) NTU temperature sensors.
Definition: CalibratedHk.h:83
Float_t magY
Magnetometer y direction.
Definition: CalibratedHk.h:80
Float_t getRawSunsensor(int ssInd, int type)
Returns raw sunsensor stuff, here type goes x1,x2,y1,y2,T.
Float_t getPressure(int index)
Returns pressure (0:1)
Float_t getInternalTemp(int index)
Returns internal temperature in degrees (0:14)
RawHk – The Raw ANITA Housekeeping.
Definition: RawHk.h:24
static const char * getVoltageName(int index)
Return char string name of voltage.
Float_t magY
Magnetometer y value.
Definition: RawHk.h:43
Int_t getSSXRatio(int ssInd, Float_t *xRatio)
Get sunsensor x-ratio.
~CalibratedHk()
Default destructor.
UInt_t payloadTime
Time in unixTime.
Definition: RawHk.h:37
CalibratedHk – The calibrated housekeeping data.
Definition: CalibratedHk.h:61
Int_t run
Run number, assigned offline.
Definition: RawHk.h:35
Float_t useful[3][40]
Array of calibrated temperatures, currents, etc.
Definition: CalibratedHk.h:78
Float_t magZ
Magnetometer z direction.
Definition: CalibratedHk.h:81
static const char * getNTUTempName(int index)
Return char string name of SBS temperature sensor.
Float_t magX
Magnetometer x value.
Definition: RawHk.h:42
Float_t magX
Magnetometer x direction.
Definition: CalibratedHk.h:79
Float_t getCurrent(int index)
Returns current (0:11)
Float_t getSBSTemp(int index)
Returns SBS temperature in degrees (0:3)
Short_t sbsTemp[3]
The three onboard temperature sensors.
Definition: CalibratedHk.h:82
Int_t run
Assigned offline.
Definition: CalibratedHk.h:72
Short_t sbsTemp[3]
SBS temperatures multiplied by 10.
Definition: RawHk.h:45
Float_t getAttitude(int index)
Returns attitude (0:12)
static const char * getPowerName(int index)
Return char string name of power.
Int_t getSSYRatio(int ssInd, Float_t *yRatio)
Get sunsensor y-ratio.
static const char * getInternalTempName(int index)
Return char string name of internal temperature sensor.
CalibratedHk()
Default constructor.
static const char * getCurrentName(int index)
Return char string name of current.
UInt_t realTime
Time in unixTime.
Definition: CalibratedHk.h:73