9 #include "CalibratedSSHk.h" 22 {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 float calIntercept[40]=
25 {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};
28 {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};
36 int ssXInds[4][2]={{20,0},{3,22},{7,26},{29,9}};
37 int ssYInds[4][2]={{21,1},{4,23},{8,27},{30,10}};
38 int ssTemp[4]={2,24,28,11};
43 float ssOffset[4][2]={{0.08,-0.1572},{-0.32940,-0.17477},
44 {0.05541,-0.08458},{-0.23773,-0.50356}};
45 float ssGain[4][2]={{5.0288,5.0},{4.8515,5.0},{5.0599,5.0},{5.0288,5.0}};
46 float ssSep[4]={3.704391,3.618574,3.512025,3.554451};
47 float ssAzRel[4]={0,-90,+180,90};
48 float ssGammaFactor[4]={0.4,0.2,0.3,0.5};
49 const float globalGamma=67;
72 for(
int chan=0;chan<40;chan++) {
79 float slope=4.9/(cal-avz);
80 float intercept=-1*slope*avz;
81 voltage[chan]=slope*float((hkPtr->
acromagData[chan])>>4)+intercept;
88 for(
int chan=0;chan<40;chan++) {
89 switch(calScheme[chan]) {
92 useful[chan]=voltage[chan];
96 useful[chan]=(calSlope[chan]*voltage[chan])+calIntercept[chan];
99 useful[chan]=voltage[chan];
107 const char *CalibratedSSHk::getName(
int ssInd)
110 case 0:
return "SS-2";
111 case 1:
return "SS-4";
112 case 2:
return "SS-6";
113 case 3:
return "SS-8";
121 if(ssInd<0 || ssInd>4)
return;
124 TMath::Abs(this->useful[ssXInds[ssInd][0]])+
125 TMath::Abs(this->useful[ssXInds[ssInd][1]])+
126 TMath::Abs(this->useful[ssYInds[ssInd][0]])+
127 TMath::Abs(this->useful[ssYInds[ssInd][1]]);
129 *magX=TMath::Abs(this->useful[ssXInds[ssInd][0]]+this->useful[ssXInds[ssInd][1]]);
130 *magY=TMath::Abs(this->useful[ssYInds[ssInd][0]]+this->useful[ssYInds[ssInd][1]]);
136 if(ssInd<0 || ssInd>4)
return -1;
137 return this->useful[ssTemp[ssInd]];
143 *xRatio=(this->useful[ssXInds[ssInd][1]]-this->useful[ssXInds[ssInd][0]]);
144 Float_t xDenom=(this->useful[ssXInds[ssInd][1]]+this->useful[ssXInds[ssInd][0]]);
145 if(TMath::Abs(xDenom)>0.1*TMath::Abs(*xRatio)) {
158 *yRatio=(this->useful[ssYInds[ssInd][1]]-this->useful[ssYInds[ssInd][0]]);
159 Float_t yDenom=(this->useful[ssYInds[ssInd][1]]+this->useful[ssYInds[ssInd][0]]);
160 if(TMath::Abs(yDenom)>0.1*TMath::Abs(*yRatio)) {
171 Float_t CalibratedSSHk::getSSAzimuth(
int ssInd)
173 Float_t azimuth,elevation,relAzimuth;
175 getFancySS(ssInd,pos,&azimuth,&elevation,&relAzimuth);
180 Float_t CalibratedSSHk::getSSAzimuthAdu5(
int ssInd)
182 Float_t azimuth,elevation,relAzimuth;
184 getFancySS(ssInd,pos,&azimuth,&elevation,&relAzimuth);
188 Float_t CalibratedSSHk::getSSElevation(
int ssInd)
191 Float_t azimuth,elevation,relAzimuth;
193 getFancySS(ssInd,pos,&azimuth,&elevation,&relAzimuth);
202 Float_t *elevation, Float_t *relAzimuth) {
205 if(ssInd<=1 || ssInd>=4)
return 0;
208 Float_t magnitude=0,magX=0,magY=0;
209 this->getSSMagnitude(ssInd,&magnitude,&magX,&magY);
213 if(this->getSSXRatio(ssInd,&xRatio)) {
215 x0*=ssGain[ssInd][0];
216 x0-=ssOffset[ssInd][0];
221 if(this->getSSYRatio(ssInd,&yRatio)) {
223 y0*=ssGain[ssInd][1];
224 y0-=ssOffset[ssInd][1];
232 x0=-1*ssOffset[ssInd][0];
238 y0=-1*ssOffset[ssInd][1];
241 Float_t gamma=(globalGamma-ssGammaFactor[ssInd])*TMath::DegToRad();
242 pos[0]=(-1*x0*TMath::Cos(gamma))-(TMath::Sin(gamma)*ssSep[ssInd]);
244 pos[2]=ssSep[ssInd]*TMath::Cos(gamma)-x0*TMath::Sin(gamma);
246 *azimuth=TMath::ATan2(pos[1],-1*pos[0])*TMath::RadToDeg();
247 Float_t posXY2=TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
248 *elevation=TMath::ATan2(pos[2],posXY2)*TMath::RadToDeg();
249 *relAzimuth=(*azimuth)+ssAzRel[ssInd];
250 if((*relAzimuth)<0) (*relAzimuth)+=360;
259 if((ssInd>=0 && ssInd<4) && (type>=0 && type<5)) {
262 return useful[ssXInds[ssInd][0]%40];
264 return useful[ssXInds[ssInd][1]%40];
266 return useful[ssYInds[ssInd][0]%40];
268 return useful[ssYInds[ssInd][1]%40];
270 return useful[ssTemp[ssInd]%40];
UShort_t acromagData[40]
The array of ADC values.
Int_t getSSYRatio(int ssInd, Float_t *yRatio)
Get sunsensor y-ratio.
Float_t getSSTemp(int ssInd)
Get sunsensor temperature.
RawSSHk – The Raw ANITA Housekeeping.
CalibratedSSHk – The calibrated housekeeping data.
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.
UInt_t payloadTime
Time in unixTime.
Int_t getSSXRatio(int ssInd, Float_t *xRatio)
Get sunsensor x-ratio.
UInt_t realTime
Time in unixTime.
void getSSMagnitude(int ssInd, Float_t *magnitude, Float_t *magX, Float_t *magY)
Get sunsensor magnitude.
Int_t run
Run number, assigned offline.
CalibratedSSHk()
Default constructor.
Float_t getRawSunsensor(int ssInd, int type)
Returns raw sunsensor stuff, here type goes x1,x2,y1,y2,T.
~CalibratedSSHk()
Default destructor.
UInt_t payloadTimeUs
Subsecond timing.