AraEvent/AraGeomTool.cxx
00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 #include "AraGeomTool.h" 00011 #include <iostream> 00012 #include <fstream> 00013 #include <cstring> 00014 #include <zlib.h> 00015 #include <cstdlib> 00016 00017 00018 //sqlite includes 00019 #include <sqlite3.h> 00020 00021 #include "TString.h" 00022 #include "TObjArray.h" 00023 #include "TObjString.h" 00024 #include "TVector3.h" 00025 00026 AraGeomTool * AraGeomTool::fgInstance=0; 00027 Double_t AraGeomTool::nTopOfIce=1.48; 00028 const Double_t fFtInm=0.3048; 00029 00030 //Some locations in ARA global coordinates 00031 Double_t fSouthPole2010_11[3]={27344.05*fFtInm,-3395.14*fFtInm,-35.63*fFtInm}; 00032 Double_t fSouthPole2011_12[3]={27322.88*fFtInm,-3369.89*fFtInm,-36.02*fFtInm}; 00033 Double_t fSouthPoleTelescope[3]={24774.18*fFtInm,-871.35*fFtInm,-30*fFtInm}; 00034 Double_t fICL2011_12[4][3]={{24011.58*fFtInm,-1702.53*fFtInm,0}, 00035 {24060.51*fFtInm,-1723.09*fFtInm,0}, 00036 {24049.7*fFtInm,-1749.02*fFtInm,0}, 00037 {24000.78*fFtInm,-1728.47*fFtInm,0}}; 00038 00039 Double_t fWindTurbine2011_12[3][3]={{46166.49*fFtInm,52159.43*fFtInm,0}, 00040 {22546.95*fFtInm,-2594.03*fFtInm,0}, 00041 {18662.31*fFtInm,-3552.64*fFtInm,0}}; 00042 00043 00044 00045 Double_t *AraGeomTool::getSouthPole2010_11() 00046 { 00047 return fSouthPole2010_11; 00048 } 00049 00050 Double_t *AraGeomTool::getSouthPole2011_12() 00051 { 00052 return fSouthPole2011_12; 00053 } 00054 00055 Double_t *AraGeomTool::getSouthPoleTelescope() 00056 { 00057 return fSouthPoleTelescope; 00058 } 00059 00060 Double_t *AraGeomTool::getICLCorner(int corner) 00061 { 00062 return fICL2011_12[corner]; 00063 } 00064 00065 Double_t *AraGeomTool::getWindTurbine(int tbNumber) 00066 { 00067 return fWindTurbine2011_12[tbNumber-1]; 00068 } 00069 00070 AraGeomTool::AraGeomTool() 00071 { 00072 //Default Constructor 00073 00074 //Read in the channel maps for the TestBed and Station1 00075 // readChannelMapDbIcrr(ARA_TESTBED); 00076 // readChannelMapDbIcrr(ARA_STATION1); 00077 // readChannelMapDbAtri(ARA_STATION1B); 00078 for(int i=0;i<ICRR_NO_STATIONS;i++) { 00079 fStationInfoICRR[i]=NULL; 00080 fArrayToStationRotationICRR[i]=NULL; 00081 fStationToArrayRotationICRR[i]=NULL; 00082 } 00083 for(int i=0;i<ATRI_NO_STATIONS;i++) { 00084 fStationInfoATRI[i]=0; 00085 fArrayToStationRotationATRI[i]=NULL; 00086 fStationToArrayRotationATRI[i]=NULL; 00087 } 00088 00089 readAraArrayCoords(); 00090 } 00091 00092 AraGeomTool::~AraGeomTool() { 00093 //Default Destructor 00094 for(int i=0;i<ICRR_NO_STATIONS;i++) { 00095 if(fStationInfoICRR[i]) delete fStationInfoICRR[i]; 00096 } 00097 for(int i=0;i<ATRI_NO_STATIONS;i++) { 00098 if(fStationInfoATRI[i]) delete fStationInfoATRI[i]; 00099 } 00100 } 00101 00102 //______________________________________________________________________________ 00103 AraGeomTool* AraGeomTool::Instance() 00104 { 00105 //static function 00106 if(fgInstance) 00107 return fgInstance; 00108 00109 fgInstance = new AraGeomTool(); 00110 return fgInstance; 00111 } 00112 00113 int AraGeomTool::getRFChanByPolAndAnt(AraAntPol::AraAntPol_t antPol, int antNum, AraStationId_t stationId) 00114 { 00115 00116 // fprintf(stderr, "antPol %i antNum %i stationId %i\n", (int)antPol, antNum, (int)stationId); 00117 return getStationInfo(stationId)->getRFChanByPolAndAnt(antNum,antPol); 00118 } 00119 00120 00121 AraAntPol::AraAntPol_t AraGeomTool::getPolByRFChan(int rfChan, AraStationId_t stationId) 00122 { 00123 //RJN Should add a check here for safety 00124 if(getStationInfo(stationId)) { 00125 return getStationInfo(stationId)->getAntennaInfo(rfChan)->polType; 00126 } 00127 return AraAntPol::kNotAPol; 00128 } 00129 00130 Int_t AraGeomTool::getAntNumByRFChan(int rfChan, AraStationId_t stationId) 00131 { 00132 //RJN Should add a check here for safety 00133 if(getStationInfo(stationId)) 00134 return getStationInfo(stationId)->getAntennaInfo(rfChan)->antPolNum; 00135 return -1; 00136 } 00137 00138 00139 // //FIXME //jpd this is most definitely a hack to make AraCanvasMaker work -> this will only 00140 // //return the testbed lookup stuff not station1 00141 // int AraGeomTool::getRFChanByPolAndAnt(AraAntPol::AraAntPol_t antPol, int antNum) 00142 // { 00143 // return getRFChanByPolAndAnt(antPol,antNum,ARA_STATION1); 00144 // }//FIXME -- this just loads the stuff for station1 00145 00146 Double_t AraGeomTool::calcDeltaTSimple(Double_t ant1[3], Double_t ant2[3], Double_t source[3]) { 00147 Double_t d1=TMath::Sqrt(TMath::Power(ant1[0]-source[0],2)+TMath::Power(ant1[1]-source[1],2)+TMath::Power(ant1[2]-source[2],2)); 00148 Double_t d2=TMath::Sqrt(TMath::Power(ant2[0]-source[0],2)+TMath::Power(ant2[1]-source[1],2)+TMath::Power(ant2[2]-source[2],2)); 00149 Double_t t1t2=(d2-d1)*nTopOfIce/TMath::C(); 00150 t1t2*=1e9; 00151 return t1t2; 00152 } 00153 00154 00155 Double_t AraGeomTool::calcDeltaTInfinity(Double_t ant1[3], Double_t ant2[3],Double_t phiWave, Double_t thetaWave) 00156 { 00157 //Calc some cylindrical coordinates 00158 Double_t rho1=TMath::Sqrt(ant1[0]*ant1[0]+ant1[1]*ant1[1]); 00159 Double_t phi1=TMath::ATan2(ant1[1],ant1[0]); 00160 Double_t rho2=TMath::Sqrt(ant2[0]*ant2[0]+ant2[1]*ant2[1]); 00161 Double_t phi2=TMath::ATan2(ant2[1],ant2[0]); 00162 Double_t d1=TMath::Cos(thetaWave)*(ant1[2]*TMath::Tan(thetaWave)+rho1*TMath::Cos(phi1-phiWave)); 00163 Double_t d2=TMath::Cos(thetaWave)*(ant2[2]*TMath::Tan(thetaWave)+rho2*TMath::Cos(phi2-phiWave)); 00164 Double_t t1t2=(d2-d1)*nTopOfIce/TMath::C(); 00165 t1t2*=1e9; 00166 return t1t2; 00167 00168 } 00169 00170 //jd 00171 Double_t AraGeomTool::calcDeltaTInfinity(Int_t chan1, Int_t chan2,Double_t phiWave, Double_t thetaWave, AraStationId_t stationId) 00172 { 00173 if(chan1<0 || chan1>=TOTAL_ANTS_PER_ICRR) 00174 return 0; 00175 if(chan2<0 || chan2>=TOTAL_ANTS_PER_ICRR) 00176 return 0; 00177 return calcDeltaTInfinity(getStationInfo(stationId)->fAntInfo[chan1].antLocation,getStationInfo(stationId)->fAntInfo[chan2].antLocation,phiWave,thetaWave); 00178 } 00179 00180 Double_t AraGeomTool::calcDeltaTR(Double_t ant1[3], Double_t ant2[3], Double_t phiWave, Double_t thetaWave,Double_t R) 00181 { 00182 00183 Double_t xs=R*TMath::Cos(thetaWave)*TMath::Cos(phiWave); 00184 Double_t ys=R*TMath::Cos(thetaWave)*TMath::Sin(phiWave); 00185 Double_t zs=R*TMath::Sin(thetaWave); 00186 00187 00188 Double_t d1=TMath::Sqrt((xs-ant1[0])*(xs-ant1[0])+(ys-ant1[1])*(ys-ant1[1])+(zs-ant1[2])*(zs-ant1[2])); 00189 Double_t d2=TMath::Sqrt((xs-ant2[0])*(xs-ant2[0])+(ys-ant2[1])*(ys-ant2[1])+(zs-ant2[2])*(zs-ant2[2])); 00190 00191 Double_t t1t2=(d1-d2)*nTopOfIce/TMath::C(); 00192 t1t2*=1e9; 00193 return t1t2; 00194 00195 } 00196 00197 //jd 00198 Double_t AraGeomTool::calcDeltaTR(Int_t chan1, Int_t chan2, Double_t phiWave, Double_t thetaWave,Double_t R, AraStationId_t stationId) 00199 { 00200 if(chan1<0 || chan1>=TOTAL_ANTS_PER_ICRR) 00201 return 0; 00202 if(chan2<0 || chan2>=TOTAL_ANTS_PER_ICRR) 00203 return 0; 00204 return calcDeltaTR(getStationInfo(stationId)->fAntInfo[chan1].antLocation,getStationInfo(stationId)->fAntInfo[chan2].antLocation,phiWave,thetaWave,R); 00205 00206 } 00207 00208 00209 00210 bool AraGeomTool::isIcrrStation(AraStationId_t stationId){ 00211 //RJN changed 00212 if(stationId==ARA_TESTBED||stationId==ARA_STATION1) return true; 00213 else return false; 00214 00215 } 00216 00217 bool AraGeomTool::isAtriStation(AraStationId_t stationId){ 00218 00219 if(isIcrrStation(stationId)) return false; 00220 else return true; 00221 00222 } 00223 00224 Int_t AraGeomTool::getStationNumber(AraStationId_t stationId){ 00225 if(ARA_TESTBED) 00226 return 0; 00227 if(ARA_STATION1B || ARA_STATION1) 00228 return 1; 00229 return (int)stationId; 00230 } 00231 00232 00233 Int_t AraGeomTool::getStationCalibIndex(AraStationId_t stationId){ 00234 00235 switch(stationId){ 00236 00237 case ARA_TESTBED: 00238 return 0; 00239 break; 00240 case ARA_STATION1: 00241 return 1; 00242 break; 00243 case ARA_STATION1B: 00244 return 0; 00245 break; 00246 case ARA_STATION2: 00247 return 1; 00248 break; 00249 case ARA_STATION3: 00250 return 2; 00251 break; 00252 case ARA_STATION4: 00253 return 3; 00254 break; 00255 case ARA_STATION5: 00256 return 4; 00257 break; 00258 case ARA_STATION6: 00259 return 5; 00260 break; 00261 case ARA_STATION7: 00262 return 6; 00263 break; 00264 case ARA_STATION8: 00265 return 7; 00266 break; 00267 case ARA_STATION9: 00268 return 8; 00269 break; 00270 case ARA_STATION10: 00271 return 9; 00272 break; 00273 case ARA_STATION11: 00274 return 10; 00275 break; 00276 case ARA_STATION12: 00277 return 11; 00278 break; 00279 case ARA_STATION13: 00280 return 12; 00281 break; 00282 case ARA_STATION14: 00283 return 13; 00284 break; 00285 case ARA_STATION15: 00286 return 14; 00287 break; 00288 case ARA_STATION16: 00289 return 15; 00290 break; 00291 case ARA_STATION17: 00292 return 16; 00293 break; 00294 case ARA_STATION18: 00295 return 17; 00296 break; 00297 case ARA_STATION19: 00298 return 18; 00299 break; 00300 case ARA_STATION20: 00301 return 19; 00302 break; 00303 case ARA_STATION21: 00304 return 20; 00305 break; 00306 case ARA_STATION22: 00307 return 21; 00308 break; 00309 case ARA_STATION23: 00310 return 22; 00311 break; 00312 case ARA_STATION24: 00313 return 23; 00314 break; 00315 case ARA_STATION25: 00316 return 24; 00317 break; 00318 case ARA_STATION26: 00319 return 25; 00320 break; 00321 case ARA_STATION27: 00322 return 26; 00323 break; 00324 case ARA_STATION28: 00325 return 27; 00326 break; 00327 case ARA_STATION29: 00328 return 28; 00329 break; 00330 case ARA_STATION30: 00331 return 29; 00332 break; 00333 case ARA_STATION31: 00334 return 30; 00335 break; 00336 case ARA_STATION32: 00337 return 31; 00338 break; 00339 case ARA_STATION33: 00340 return 32; 00341 break; 00342 case ARA_STATION34: 00343 return 33; 00344 break; 00345 case ARA_STATION35: 00346 return 34; 00347 break; 00348 case ARA_STATION36: 00349 return 35; 00350 break; 00351 case ARA_STATION37: 00352 return 36; 00353 break; 00354 default: 00355 fprintf(stderr, "AraGeomTool::getStationCalibIndex -- Error - Unknown stationId %i\n", stationId); 00356 return -1; 00357 } 00358 } 00359 00360 00361 00362 00363 void AraGeomTool::printStationName(AraStationId_t stationId){ 00364 00365 std::cout << getStationName(stationId) << "\n"; 00366 } 00367 00368 const char* AraGeomTool::getStationName(AraStationId_t stationId){ 00369 00370 switch(stationId){ 00371 00372 case ARA_TESTBED: 00373 return "TESTBED"; 00374 break; 00375 case ARA_STATION1: 00376 return "STATION1"; 00377 break; 00378 case ARA_STATION1B: 00379 return "STATION1B"; 00380 break; 00381 case ARA_STATION2: 00382 return "STATION2"; 00383 break; 00384 case ARA_STATION3: 00385 return "STATION3"; 00386 break; 00387 case ARA_STATION4: 00388 return "STATION4"; 00389 break; 00390 case ARA_STATION5: 00391 return "STATION5"; 00392 break; 00393 case ARA_STATION6: 00394 return "STATION6"; 00395 break; 00396 case ARA_STATION7: 00397 return "STATION7"; 00398 break; 00399 case ARA_STATION8: 00400 return "STATION8"; 00401 break; 00402 case ARA_STATION9: 00403 return "STATION9"; 00404 break; 00405 case ARA_STATION10: 00406 return "STATION10"; 00407 break; 00408 case ARA_STATION11: 00409 return "STATION11"; 00410 break; 00411 case ARA_STATION12: 00412 return "STATION12"; 00413 break; 00414 case ARA_STATION13: 00415 return "STATION13"; 00416 break; 00417 case ARA_STATION14: 00418 return "STATION14"; 00419 break; 00420 case ARA_STATION15: 00421 return "STATION15"; 00422 break; 00423 case ARA_STATION16: 00424 return "STATION16"; 00425 break; 00426 case ARA_STATION17: 00427 return "STATION17"; 00428 break; 00429 case ARA_STATION18: 00430 return "STATION18"; 00431 break; 00432 case ARA_STATION19: 00433 return "STATION19"; 00434 break; 00435 case ARA_STATION20: 00436 return "STATION20"; 00437 break; 00438 case ARA_STATION21: 00439 return "STATION21"; 00440 break; 00441 case ARA_STATION22: 00442 return "STATION22"; 00443 break; 00444 case ARA_STATION23: 00445 return "STATION23"; 00446 break; 00447 case ARA_STATION24: 00448 return "STATION24"; 00449 break; 00450 case ARA_STATION25: 00451 return "STATION25"; 00452 break; 00453 case ARA_STATION26: 00454 return "STATION26"; 00455 break; 00456 case ARA_STATION27: 00457 return "STATION27"; 00458 break; 00459 case ARA_STATION28: 00460 return "STATION28"; 00461 break; 00462 case ARA_STATION29: 00463 return "STATION29"; 00464 break; 00465 case ARA_STATION30: 00466 return "STATION30"; 00467 break; 00468 case ARA_STATION31: 00469 return "STATION31"; 00470 break; 00471 case ARA_STATION32: 00472 return "STATION32"; 00473 break; 00474 case ARA_STATION33: 00475 return "STATION33"; 00476 break; 00477 case ARA_STATION34: 00478 return "STATION34"; 00479 break; 00480 case ARA_STATION35: 00481 return "STATION35"; 00482 break; 00483 case ARA_STATION36: 00484 return "STATION36"; 00485 break; 00486 case ARA_STATION37: 00487 return "STATION37"; 00488 break; 00489 default: 00490 return "Unkown StationId"; 00491 break; 00492 } 00493 00494 } 00495 00496 00497 AraStationInfo *AraGeomTool::getStationInfo(AraStationId_t stationId) 00498 { 00499 int calibIndex=getStationCalibIndex(stationId); 00500 if(isIcrrStation(stationId)) { 00501 if(!fStationInfoICRR[calibIndex]) { 00502 fStationInfoICRR[calibIndex] = new AraStationInfo(stationId); 00503 } 00504 if(calibIndex>=0 && calibIndex<ICRR_NO_STATIONS) 00505 return fStationInfoICRR[calibIndex]; 00506 } 00507 if(isAtriStation(stationId)) { 00508 if(!fStationInfoATRI[calibIndex]) { 00509 fStationInfoATRI[calibIndex] = new AraStationInfo(stationId); 00510 } 00511 if(calibIndex>=0 && calibIndex<ATRI_NO_STATIONS) 00512 return fStationInfoATRI[calibIndex]; 00513 } 00514 return NULL; 00515 } 00516 00517 00518 00519 00520 00521 AraStationId_t AraGeomTool::getAtriStationId(int stationNumber) { 00523 if(stationNumber==1) return ARA_STATION1B; 00524 return (AraStationId_t)stationNumber; 00525 } 00526 00527 00528 void AraGeomTool::readAraArrayCoords() { 00529 sqlite3 *db; 00530 char *zErrMsg = 0; 00531 sqlite3_stmt *stmt; 00532 00533 char calibDir[FILENAME_MAX]; 00534 char fileName[FILENAME_MAX]; 00535 char *calibEnv=getenv("ARA_CALIB_DIR"); 00536 if(!calibEnv) { 00537 char *utilEnv=getenv("ARA_UTIL_INSTALL_DIR"); 00538 if(!utilEnv) 00539 sprintf(calibDir,"calib"); 00540 else 00541 sprintf(calibDir,"%s/share/araCalib",utilEnv); 00542 } 00543 else { 00544 strncpy(calibDir,calibEnv,FILENAME_MAX); 00545 } 00546 sprintf(fileName, "%s/AraArrayCoords.sqlite", calibDir); 00547 00548 //open the database 00549 // int rc = sqlite3_open_v2(fileName, &db, SQLITE_OPEN_READONLY, NULL); 00550 int rc = sqlite3_open(fileName, &db);; 00551 if(rc!=SQLITE_OK){ 00552 printf("AraGeomTool::readAraArrayCoords() - Can't open database: %s\n", sqlite3_errmsg(db)); 00553 sqlite3_close(db); 00554 return; 00555 } 00556 00557 //All the station coordinate information is stored in the ARA table (one row per station) 00558 const char *query = "select * from ARA"; 00559 00560 //prepare an sql statment which will be used to obtain information from the data base 00561 // rc=sqlite3_prepare_v2(db, query, strlen(query)+1, &stmt, NULL); 00562 rc=sqlite3_prepare(db, query, strlen(query)+1, &stmt, NULL); 00563 00564 if(rc!=SQLITE_OK){ 00565 printf("statement not prepared OK\n"); 00566 //should close the data base and exit the function 00567 sqlite3_close(db); 00568 return; 00569 } 00570 00571 AraStationId_t thisStationId; 00572 int calibIndex=0; 00573 int row=0; 00574 00575 while(1){ //This loop is over station 00576 //printf("row number %i\n", row); 00577 rc=sqlite3_step(stmt); 00578 if(rc==SQLITE_DONE) break; 00579 int nColumns=sqlite3_column_count(stmt); 00580 00581 row=sqlite3_column_int(stmt, 2)-1;//forcing the row to be correct 00582 //printf("row number %i\n", row); 00583 00584 int column=0; 00585 00586 const char* temp; 00587 double tempVal; 00588 00589 //primary key - stationId 00590 thisStationId=sqlite3_column_int(stmt,column); 00591 calibIndex=getStationCalibIndex(thisStationId); 00592 00593 column++; //station name 00594 temp = (const char*)sqlite3_column_text(stmt, column); 00595 //Ignore for now 00596 00597 column++; //2: //electronics tupe 00598 temp = (const char*)sqlite3_column_text(stmt, column); 00599 //Ignore for now 00600 00601 //Station Coords 00602 for(int i=0;i<3;i++) { 00603 column++; 00604 tempVal=sqlite3_column_double(stmt, column); 00605 if(isIcrrStation(thisStationId)) { 00606 fStationCoordsICRR[calibIndex][i]=tempVal; 00607 } 00608 else { 00609 fStationCoordsAtri[calibIndex][i]=tempVal; 00610 } 00611 } 00612 if(isIcrrStation(thisStationId)) { 00613 fStationVectorICRR[calibIndex].SetXYZ(fStationCoordsICRR[calibIndex][0],fStationCoordsICRR[calibIndex][1],fStationCoordsICRR[calibIndex][2]); 00614 } 00615 else { 00616 fStationVectorATRI[calibIndex].SetXYZ(fStationCoordsAtri[calibIndex][0],fStationCoordsAtri[calibIndex][1],fStationCoordsAtri[calibIndex][2]); 00617 } 00618 00619 //Station Local Coordinates 00620 for(int i=0;i<3;i++) { 00621 for(int j=0;j<3;j++) { 00622 column++; 00623 tempVal=sqlite3_column_double(stmt, column); 00624 if(isIcrrStation(thisStationId)) { 00625 fStationLocalCoordsICRR[calibIndex][i][j]=tempVal; 00626 } 00627 else { 00628 fStationLocalCoordsATRI[calibIndex][i][j]=tempVal; 00629 } 00630 } 00631 } 00632 00633 if(isIcrrStation(thisStationId)) { 00634 fStationToArrayRotationICRR[calibIndex] = new TRotation(); 00635 TVector3 localx(fStationLocalCoordsICRR[calibIndex][0]); 00636 TVector3 globale(1,0,0); 00637 Double_t angleRotate=globale.Angle(localx); 00638 TVector3 axisRotate=globale.Cross(localx); 00639 fStationToArrayRotationICRR[calibIndex]->Rotate(angleRotate,axisRotate); 00640 fArrayToStationRotationICRR[calibIndex]=new TRotation(fStationToArrayRotationICRR[calibIndex]->Inverse()); 00641 00642 } 00643 else { 00644 fStationToArrayRotationATRI[calibIndex] = new TRotation(); 00645 //In the end this remarkably simple bit of code is all we need to define the matrix rotations necessary to switch 00646 // between array centric and station centric coordinates 00647 // The basic idea is simply: 00648 // a) Find the angle between the array centric easting(x) and the station centric x 00649 // b) Find the vector that is perpendiculat to both of them using a cross product 00650 // c) Create a rotation matrix by rotating the identity matrix by this angle about this axis 00651 // d) Create the invere rotation to go the other way 00652 // e) Remember we also need to translate to actually convert between station and array and vice-versa 00653 TVector3 localx(fStationLocalCoordsATRI[calibIndex][0]); 00654 TVector3 globale(1,0,0); 00655 Double_t angleRotate=globale.Angle(localx); 00656 TVector3 axisRotate=globale.Cross(localx); 00657 fStationToArrayRotationATRI[calibIndex]->Rotate(angleRotate,axisRotate); 00658 fArrayToStationRotationATRI[calibIndex]=new TRotation(fStationToArrayRotationATRI[calibIndex]->Inverse()); 00659 } 00660 00661 00662 }//while(1) 00663 00664 //now need to destroy the sqls statement prepared earlier 00665 rc = sqlite3_finalize(stmt); 00666 if(rc!=SQLITE_OK) printf("error finlizing sql statement\n"); 00667 // printf("sqlite3_finalize(stmt) = %i\n", rc); 00668 00669 //now close the connection to the database 00670 rc = sqlite3_close(db); 00671 if(rc!=SQLITE_OK) printf("error closing db\n"); 00672 00673 } 00674 00675 00676 TVector3 AraGeomTool::convertStationToArrayCoords(AraStationId_t stationId, TVector3 inputCoords) { 00677 TVector3 output=inputCoords; 00678 TRotation *mPtr = getStationToArrayRotation(stationId); 00679 output.Transform(*mPtr); 00680 output+=getStationVector(stationId); 00681 return TVector3(output); 00682 } 00683 00684 TVector3 AraGeomTool::convertArrayToStationCoords(AraStationId_t stationId, TVector3 inputCoords) { 00685 TVector3 output=inputCoords; 00686 // std::cout << "Station Vector: " << getStationVector(stationId).x() << "\t" << getStationVector(stationId).y() << "\t" << getStationVector(stationId).z() << "\n"; 00687 output-=getStationVector(stationId); 00688 // output.Print(); 00689 TRotation *mPtr = getArrayToStationRotation(stationId); 00690 output.Transform(*mPtr); 00691 return TVector3(output); 00692 } 00693 00694 00695 TRotation *AraGeomTool::getStationToArrayRotation(AraStationId_t stationId) 00696 { 00697 int calibIndex=getStationCalibIndex(stationId); 00698 if(isIcrrStation(stationId)) { 00699 return fStationToArrayRotationICRR[calibIndex]; 00700 } 00701 return fStationToArrayRotationATRI[calibIndex]; 00702 } 00703 00704 TRotation *AraGeomTool::getArrayToStationRotation(AraStationId_t stationId) 00705 { 00706 int calibIndex=getStationCalibIndex(stationId); 00707 if(isIcrrStation(stationId)) { 00708 return fArrayToStationRotationICRR[calibIndex]; 00709 } 00710 return fArrayToStationRotationATRI[calibIndex]; 00711 } 00712 00713 00714 TVector3 &AraGeomTool::getStationVector(AraStationId_t stationId) 00715 { 00716 int calibIndex=getStationCalibIndex(stationId); 00717 if(isIcrrStation(stationId)) { 00718 return fStationVectorICRR[calibIndex]; 00719 } 00720 00721 return fStationVectorATRI[calibIndex]; 00722 00723 } 00724 00725 00726 00727 void AraGeomTool::convertStationToArrayCoords(AraStationId_t stationId, Double_t inputCoords[3], Double_t outputCoords[3] ) 00728 { 00729 TVector3 input(inputCoords); 00730 TVector3 output=convertStationToArrayCoords(stationId,input); 00731 outputCoords[0]=output.x(); 00732 outputCoords[1]=output.y(); 00733 outputCoords[2]=output.z(); 00734 00735 } 00736 void AraGeomTool::convertArrayToStationCoords(AraStationId_t stationId, Double_t inputCoords[3], Double_t outputCoords[3] ) 00737 { 00738 00739 TVector3 input(inputCoords); 00740 TVector3 output=convertArrayToStationCoords(stationId,input); 00741 outputCoords[0]=output.x(); 00742 outputCoords[1]=output.y(); 00743 outputCoords[2]=output.z(); 00744 00745 00746 }
Generated on Tue Jul 16 16:58:01 2013 for ARA ROOT v3.10 Software by
