1 #include "AnitaDataset.h" 2 #include "UsefulAnitaEvent.h" 3 #include "RawAnitaHeader.h" 5 #include "PrettyAnitaHk.h" 6 #include "CalibratedAnitaEvent.h" 7 #include "TTreeIndex.h" 8 #include "AnitaVersion.h" 18 #include "TEventList.h" 21 #include "TruthAnitaEvent.h" 28 #include "AnitaConventions.h" 32 static std::vector<UInt_t> firstEvents[NUM_ANITAS+1];
33 static std::vector<UInt_t> lastEvents[NUM_ANITAS+1];
34 static std::vector<Int_t> runs[NUM_ANITAS+1];
37 static std::vector<UInt_t> hiCalEventNumbers[NUM_ANITAS+1];
39 static TFile* fHiCalGpsFile;
40 static TTree* fHiCalGpsTree;
41 static Double_t fHiCalLon;
42 static Double_t fHiCalLat;
43 static Double_t fHiCalAlt;
44 static Int_t fHiCalUnixTime;
51 std::cerr <<
"Error in " << __PRETTY_FUNCTION__ <<
", only implemented for ANITA-3, not ANITA-" << anita <<
", returning false!" << std::endl;
55 if(hiCalEventNumbers[anita].size()==0){
59 const char* installDir = getenv(
"ANITA_UTIL_INSTALL_DIR");
63 TString fileName = TString::Format(
"%s/share/anitaCalib/hiCal1EventNumbers13Jan2018.txt", installDir, anita);
64 std::ifstream hiCalEventListFile(fileName.Data());
65 if (!hiCalEventListFile.is_open()) {
66 std::cerr <<
"Error in " << __PRETTY_FUNCTION__ <<
" couldn't find " << fileName << std::endl;
69 Int_t hcRun, isDirect, isPaired;
72 while(!hiCalEventListFile.eof()){
74 hiCalEventListFile >> hcRun >> hcEventNumber >> isDirect;
75 hiCalEventNumbers[anita].push_back(hcEventNumber);
81 return (std::find(hiCalEventNumbers[anita].begin(), hiCalEventNumbers[anita].end(), eventNumber)!=hiCalEventNumbers[anita].end());
88 void AnitaDataset::loadRunToEv(
int anita){
92 const char* installDir = getenv(
"ANITA_UTIL_INSTALL_DIR");
94 TString fileName = TString::Format(
"%s/share/anitaCalib/runToEvA%d.txt", installDir, anita);
95 std::ifstream runToEv(fileName.Data());
96 if (!runToEv.is_open()) {
97 std::cerr <<
"Error in " << __PRETTY_FUNCTION__ <<
" couldn't find " << fileName << std::endl;
100 const int hopefullyMoreThanEnoughRuns = 500;
101 runs[anita].reserve(hopefullyMoreThanEnoughRuns);
102 firstEvents[anita].reserve(hopefullyMoreThanEnoughRuns);
103 lastEvents[anita].reserve(hopefullyMoreThanEnoughRuns);
105 int run, evLow,evHigh;
107 while (runToEv >> run >> evLow >> evHigh){
108 runs[anita].push_back(run);
109 firstEvents[anita].push_back(evLow);
110 lastEvents[anita].push_back(evHigh);
123 static bool checkIfFileExists(
const char * file)
125 return access(file, R_OK) !=-1;
128 static const char * checkIfFilesExist(
int num, ...)
134 for (
int i = 0; i < num; i++)
136 const char * f = va_arg(args,
const char *);
138 if (checkIfFileExists(f))
150 static const char anita_root_data_dir_env[] =
"ANITA_ROOT_DATA";
151 static const char anita_versioned_root_data_dir_env[] =
"ANITA%d_ROOT_DATA";
152 static const char mc_root_data_dir[] =
"ANITA_MC_DATA";
156 int version = (int) dir;
162 char env_string[
sizeof(anita_versioned_root_data_dir_env)+20];
163 sprintf(env_string,anita_versioned_root_data_dir_env, version);
164 const char * tryme = getenv(env_string);
167 fprintf(stderr,
"%s, not defined, will try %s\n",env_string, anita_root_data_dir_env);
175 const char * tryme = getenv(mc_root_data_dir);
178 fprintf(stderr,
"%s, not defined, will try %s\n",mc_root_data_dir, anita_root_data_dir_env);
185 if (
const char * tryme = getenv(anita_root_data_dir_env))
191 char env_string[
sizeof(anita_versioned_root_data_dir_env)+20];
192 sprintf(env_string,anita_versioned_root_data_dir_env, AnitaVersion::get());
193 if (
const char *tryme = getenv(env_string)) {
197 fprintf(stderr,
"%s, not defined, please define it!", anita_root_data_dir_env);
208 fHeadTree(0), fHeader(0),
209 fEventTree(0), fCalEvent(0), fRawEvent(0), fUseful(0),
210 fGpsTree(0), fGps(0),
212 fTurfTree(0), fTurf(0),
213 fSurfTree(0), fSurf(0),
214 fTruthTree(0), fTruth(0),
215 fCutList(0), fRandy()
220 fClockProblemInfo = 0;
223 fHaveCalibInfo =
false;
227 loadRun(run, decimated, version);
233 void AnitaDataset::unloadRun()
236 for (
unsigned i = 0; i < filesToClose.size(); i++)
238 filesToClose[i]->Close();
239 delete filesToClose[i];
243 fDecimatedHeadTree = 0;
251 filesToClose.clear();
267 if (fGpsTree->GetReadEntry() != fWantedEntry || force_load)
269 fGpsTree->GetEntry(fWantedEntry);
274 if (fGpsDirty || force_load)
277 int gpsEntry = fGpsTree->GetEntryNumberWithBestIndex(round(
header()->triggerTime +
header()->triggerTimeNs / 1e9));
279 fGpsTree->GetEntry(gpsEntry);
280 while (fGps->
attFlag == 1 && abs(offset) < 30)
282 offset = offset >= 0 ? -(offset+1) : -offset;
283 if (gpsEntry + offset < 0)
continue;
284 if (gpsEntry + offset >= fGpsTree->GetEntries())
continue;
285 fGpsTree->GetEntry(gpsEntry+offset);
289 fprintf(stderr,
"WARNING: Could not find good GPS within 30 entries... reverting to closest bad one\n");
290 fGpsTree->GetEntry(gpsEntry);
304 if (fEventTree->GetReadEntry() != fWantedEntry || force_load)
306 fEventTree->GetEntry(fWantedEntry);
310 if (!fHaveCalibFile && fCalDirty)
327 if (fHkTree->GetReadEntry() != fWantedEntry || force_load)
329 fHkTree->GetEntry(fWantedEntry);
341 fDecimatedHeadTree->GetEntry(fDecimatedEntry);
344 else if ((fHeadTree->GetReadEntry() != fWantedEntry || force_load))
346 fHeadTree->GetEntry(fWantedEntry);
351 if(theStrat & kInsertedVPolEvents){
353 if(fakeTreeEntry > -1){
359 if(theStrat & kInsertedHPolEvents){
361 if(fakeTreeEntry > -1){
372 if (fEventTree->GetReadEntry() != fWantedEntry || force_load)
374 fEventTree->GetEntry(fWantedEntry);
376 return fHaveCalibFile ? fCalEvent :
377 fRawEvent ? fRawEvent : fUseful;
384 if (fEventTree->GetReadEntry() != fWantedEntry || force_load)
387 fEventTree->GetEntry(fWantedEntry);
388 fUsefulDirty = fCalEvent || fRawEvent;
409 fUsefulDirty =
false;
414 if(theStrat & kInsertedVPolEvents){
416 if(fakeTreeEntry > -1){
422 if(theStrat & kInsertedHPolEvents){
424 if(fakeTreeEntry > -1){
430 if ((theStrat & kRandomizePolarity) && maybeInvertPolarity(fUseful->
eventNumber))
434 for(
int chan=0; chan < RFCHAN_PER_SURF; chan++){
435 int chanIndex =
surf*NUM_CHAN + chan;
436 for(
int samp=0; samp < NUM_SAMP; samp++){
437 fUseful->
fVolts[chanIndex][samp] *= -1;
438 fUseful->
data[chanIndex][samp] *= -1;
448 Bool_t AnitaDataset::maybeInvertPolarity(UInt_t eventNumber){
450 if((theStrat & kRandomizePolarity) > 0){
451 fRandy.SetSeed(eventNumber);
452 Double_t aboveZeroFiftyPercentOfTheTime =
fRandy.Uniform(-1, 1);
453 return (aboveZeroFiftyPercentOfTheTime < 0);
466 if (entryNumber < 0 || entryNumber >= (fDecimated ? fDecimatedHeadTree : fHeadTree)->GetEntries())
468 fprintf(stderr,
"Requested entry %d too big or small!\n", entryNumber);
472 (fDecimated ? fDecimatedEntry : fWantedEntry) = entryNumber;
475 fDecimatedHeadTree->GetEntry(fDecimatedEntry);
476 fWantedEntry = fHeadTree->GetEntryNumberWithIndex(fHeader->
eventNumber);
488 AnitaVersion::setVersionFromUnixTime(
header()->realTime);
490 return fDecimated ? fDecimatedEntry : fWantedEntry;
497 int entry = (fDecimated ? fDecimatedHeadTree : fHeadTree)->GetEntryNumberWithIndex(eventNumber);
499 if (entry < 0 && (eventNumber < fHeadTree->GetMinimum(
"eventNumber") || eventNumber > fHeadTree->GetMaximum(
"eventNumber")))
504 loadRun(run, fDecimated,datadir);
505 if (!quiet) fprintf(stderr,
"changed run to %d\n", run);
511 if (!quiet) fprintf(stderr,
"WARNING: event %lld not found in header tree\n", fWantedEntry);
514 if (!quiet) fprintf(stderr,
"\tWe are using decimated tree, so maybe that's why?\n");
520 return fDecimated ? fDecimatedEntry : fWantedEntry;
537 delete fClockPhiInfo;
540 delete fTempFactorInfo;
608 const TString theRootPwd = gDirectory->GetPath();
622 int version = (int) dir;
623 if (version>0) AnitaVersion::set(version);
631 TString fname = TString::Format(
"%s/run%d/decimatedHeadFile%d.root", data_dir, run, run);
632 if (checkIfFileExists(fname.Data()))
634 TFile * f =
new TFile(fname.Data());
635 filesToClose.push_back(f);
636 fDecimatedHeadTree = (TTree*) f->Get(
"headTree");
637 fDecimatedHeadTree->BuildIndex(
"eventNumber");
638 fDecimatedHeadTree->SetBranchAddress(
"header",&fHeader);
639 fIndices = ((TTreeIndex*) fDecimatedHeadTree->GetTreeIndex())->GetIndex();
643 fprintf(stderr,
" Could not find decimated head file for run %d, giving up!\n", run);
650 fDecimatedHeadTree = 0;
655 TString fname0 = TString::Format(
"%s/run%d/eventHeadFile%d.root", data_dir, run, run);
656 TString fname1 = TString::Format(
"%s/run%d/timedHeadFile%dOfflineMask.root", data_dir, run, run);
657 TString fname2 = TString::Format(
"%s/run%d/timedHeadFile%d.root", data_dir, run, run);
658 TString fname3 = TString::Format(
"%s/run%d/headFile%d.root", data_dir, run, run);
659 TString fname4 = TString::Format(
"%s/run%d/SimulatedAnitaHeadFile%d.root", data_dir, run, run);
661 bool simulated =
false;
663 if (
const char * the_right_file = checkIfFilesExist(5, fname0.Data(), fname1.Data(), fname2.Data(), fname3.Data(), fname4.Data()))
666 if (strcasestr(the_right_file,
"SimulatedAnitaHeadFile")) simulated =
true;
668 fprintf(stderr,
"Using head file: %s\n",the_right_file);
669 TFile * f =
new TFile(the_right_file);
670 filesToClose.push_back(f);
671 fHeadTree = (TTree*) f->Get(
"headTree");
675 fprintf(stderr,
"Could not find head file for run %d, giving up!\n", run);
680 if (!fDecimated) fHeadTree->SetBranchAddress(
"header",&fHeader);
682 fHeadTree->BuildIndex(
"eventNumber");
684 if (!fDecimated) fIndices = ((TTreeIndex*) fHeadTree->GetTreeIndex())->GetIndex();
687 TString fname = TString::Format(
"%s/run%d/gpsEvent%d.root", data_dir, run, run);
688 fname2 = TString::Format(
"%s/run%d/SimulatedAnitaGpsFile%d.root", data_dir, run, run);
689 if (
const char * the_right_file = checkIfFilesExist(2,fname.Data(),fname2.Data()))
691 TFile * f =
new TFile(the_right_file);
692 filesToClose.push_back(f);
693 fGpsTree = (TTree*) f->Get(
"adu5PatTree");
694 fHaveGpsEvent =
true;
700 fname = TString::Format(
"%s/run%d/gpsFile%d.root", data_dir, run, run);
701 if (
const char * the_right_file = checkIfFilesExist(1, fname.Data()))
703 TFile * f =
new TFile(the_right_file);
704 filesToClose.push_back(f);
705 fGpsTree = (TTree*) f->Get(
"adu5PatTree");
706 fGpsTree->BuildIndex(
"realTime");
707 fHaveGpsEvent =
false;
711 fprintf(stderr,
"Could not find gps file for run %d, giving up!\n",run);
717 fGpsTree->SetBranchAddress(
"pat",&fGps);
722 fname = TString::Format(
"%s/run%d/calibratedEventFile%d.root", data_dir, run, run);
723 fname2 = TString::Format(
"%s/run%d/calEventFile%d.root", data_dir, run, run);
724 fname3 = TString::Format(
"%s/run%d/SimulatedAnitaEventFile%d.root", data_dir, run, run);
725 if (
const char * the_right_file = checkIfFilesExist(2, fname.Data(), fname2.Data()))
727 TFile * f =
new TFile(the_right_file);
728 filesToClose.push_back(f);
729 fEventTree = (TTree*) f->Get(
"eventTree");
730 fHaveCalibFile =
true;
731 fHaveCalibInfo =
false;
732 fEventTree->SetBranchAddress(
"event",&fCalEvent);
736 fname = TString::Format(
"%s/run%d/eventFile%d.root", data_dir, run, run);
737 fname2 = TString::Format(
"%s/run%d/calibratedEventInfo%d.root", data_dir, run, run);
738 if (checkIfFileExists(fname.Data()))
740 TFile * f =
new TFile(fname.Data());
741 filesToClose.push_back(f);
742 fEventTree = (TTree*) f->Get(
"eventTree");
743 fHaveCalibFile =
false;
744 fHaveCalibInfo =
false;
745 fEventTree->SetBranchAddress(
"event",&fRawEvent);
746 if(checkIfFileExists(fname2.Data()))
748 TFile * f2 =
new TFile(fname2.Data());
749 filesToClose.push_back(f2);
750 fCalibInfoTree = (TTree*) f2->Get(
"calInfoTree");
751 fHaveCalibInfo =
true;
752 fCalibInfoTree->SetBranchAddress(
"rcoArray", &fRcoInfo);
753 fCalibInfoTree->SetBranchAddress(
"clockPhiArray", &fClockPhiInfo);
754 fCalibInfoTree->SetBranchAddress(
"tempFactorGuesses", &fTempFactorInfo);
755 fCalibInfoTree->SetBranchAddress(
"clockProblem", &fClockProblemInfo);
756 fCalibInfoTree->SetBranchAddress(
"clockSpike", &fClockSpikeInfo);
757 fCalibInfoTree->SetBranchAddress(
"rfSpike", &fRFSpikeInfo);
762 if (checkIfFileExists(fname3.Data()))
764 TFile * f =
new TFile(fname3.Data());
765 filesToClose.push_back(f);
766 fEventTree = (TTree*) f->Get(
"eventTree");
767 fHaveCalibFile =
false;
768 fHaveCalibInfo =
false;
769 fEventTree->SetBranchAddress(
"event",&fUseful);
771 fprintf(stderr,
"Could not find event file for run %d, giving up!\n",run);
779 fname = TString::Format(
"%s/run%d/prettyHkFile%d.root", data_dir, run, run);
780 if (checkIfFileExists(fname.Data()))
782 TFile * f =
new TFile(fname.Data());
783 filesToClose.push_back(f);
784 fHkTree = (TTree*) f->Get(
"prettyHkTree");
785 fHkTree->SetBranchAddress(
"hk",&fHk);
790 fprintf(stderr,
"Could not find hk file for run %d, no HK will be available!\n",run);
796 fname = TString::TString::Format(
"%s/run%d/turfRateFile%d.root",data_dir,run,run);
797 if (checkIfFileExists(fname.Data()))
800 TFile * f =
new TFile(fname.Data());
801 filesToClose.push_back(f);
802 fTurfTree = (TTree*) f->Get(
"turfRateTree");
803 fTurfTree->BuildIndex(
"realTime");
804 fTurfTree->SetBranchAddress(
"turf",&fTurf);
809 fprintf(stderr,
"Could not find TurfRate file for run %d, no Turf will be available!\n",run);
813 fname = TString::TString::Format(
"%s/run%d/surfHkFile%d.root",data_dir,run,run);
814 if (checkIfFileExists(fname.Data()))
817 TFile * f =
new TFile(fname.Data());
818 filesToClose.push_back(f);
819 fSurfTree = (TTree*) f->Get(
"surfHkTree");
820 fSurfTree->BuildIndex(
"payloadTime",
"payloadTimeUs");
821 fSurfTree->SetBranchAddress(
"surf",&fSurf);
826 fprintf(stderr,
"Could not find SurfHK file for run %d, no SURF will be available!\n",run);
832 fname = TString::TString::Format(
"%s/run%d/SimulatedAnitaTruthFile%d.root",data_dir,run,run);
833 if (checkIfFileExists(fname.Data()))
835 TFile * f =
new TFile(fname.Data());
836 filesToClose.push_back(f);
837 fTruthTree = (TTree*) f->Get(
"truthAnitaTree");
838 fTruthTree->SetBranchAddress(
"truth",&fTruth);
850 gDirectory->cd(theRootPwd);
860 fIndex = TMath::BinarySearch(
N(), fIndices, fDecimated ? fDecimatedEntry : fWantedEntry);
893 fIndex = TMath::BinarySearch(
N(), fIndices, fDecimated ? fDecimatedEntry : fWantedEntry);
904 TTree* t = fDecimated? fDecimatedHeadTree : fHeadTree;
905 return t ? t->GetEntries() : 0;
912 fIndex = TMath::BinarySearch(
N(), fIndices, fDecimated ? fDecimatedEntry : fWantedEntry);
923 fHeadTree->GetEntry(fIndex);
924 if((fHeader->
trigType&1) == 0)
break;
934 fIndex = TMath::BinarySearch(
N(), fIndices, fDecimated ? fDecimatedEntry : fWantedEntry);
937 while(fIndex <=
N()-1)
945 fHeadTree->GetEntry(fIndex);
946 if((fHeader->
trigType&1) == 0)
break;
960 int n = (fDecimated? fDecimatedHeadTree : fHeadTree)->Draw(
">>evlist1",cut,
"goff");
961 fCutList = (TEventList*) gDirectory->Get(
"evlist1");
972 return fCutList->GetN();
993 int ret =
getEntry(fCutList->GetEntry(i));
1001 if (!fCutList)
return -1;
1004 fCutIndex = TMath::BinarySearch(
NInCut(), fCutList->GetList(), (Long64_t) (fDecimated ? fDecimatedEntry : fWantedEntry));
1007 if (fCutIndex <
NInCut() - 1)
1017 if (!fCutList)
return -1;
1020 fCutIndex = TMath::BinarySearch(
NInCut(), fCutList->GetList(),(Long64_t) (fDecimated ? fDecimatedEntry : fWantedEntry));
1033 if (!fPlaylist.empty())
1045 if (!fPlaylist.empty())
1047 return fPlaylist.size();
1066 if (fPlaylist.empty())
return -1;
1069 int ret =
getEvent(getPlaylistEvent());
1076 if (fPlaylist.empty())
return -1;
1077 if(fPlaylistIndex < 0) fPlaylistIndex = 0;
1088 if (fPlaylist.empty())
return -1;
1089 if(fPlaylistIndex < 0) fPlaylistIndex = 0;
1090 if (fPlaylistIndex > 0)
1103 int anita = AnitaVersion::get();
1106 if(runs[anita].size()==0){
1110 if(runs[anita].size()==0){
1116 std::vector<UInt_t>::iterator it = std::upper_bound(firstEvents[anita].begin(), firstEvents[anita].end(), ev);
1120 int elem = (it - firstEvents[anita].begin()) - 1;
1127 std::cerr <<
"Error in " << __PRETTY_FUNCTION__ <<
", for ANITA " << AnitaVersion::get()
1128 <<
" eventNumber " << ev <<
" is smaller than then first event in the lowest run! " 1129 <<
"(eventNumber " << firstEvents[anita][0] <<
" in run " << runs[anita][0] <<
")" 1132 else if(ev > lastEvents[anita].back()){
1133 std::cerr <<
"Error in " << __PRETTY_FUNCTION__ <<
", for ANITA " << AnitaVersion::get()
1134 <<
" eventNumber " << ev <<
" is larger than then last event I know about in the highest run! " 1135 <<
"(eventNumber " << lastEvents[anita].back() <<
" in run " << runs[anita].back() <<
")" 1138 else if(ev > lastEvents[anita][elem]){
1139 std::cerr <<
"Error in " << __PRETTY_FUNCTION__ <<
", for ANITA " << AnitaVersion::get()
1140 <<
" eventNumber " << ev <<
" is larger than then last event in run " << runs[anita][elem]
1141 <<
" (" << lastEvents[anita][elem] <<
"), but smaller than the first event in run " 1142 << runs[anita][elem+1] <<
" (" << firstEvents[anita][elem+1] <<
")" << std::endl;
1146 run = runs[anita][elem];
1154 std::vector<std::vector<long> > runEv;
1157 std::ifstream pl(playlist);
1162 Bool_t simulatedData =
false;
1163 if(simulatedData ==
true)
1165 std::cout <<
"Using simulated data! Turn off the simulatedData variable if you are working with real data." << std::endl;
1168 std::vector<long> Row;
1171 runEv.push_back(Row);
1172 while(pl >> rN >> evN)
1174 std::vector<long> newRow;
1175 newRow.push_back(rN);
1176 newRow.push_back(evN);
1177 runEv.push_back(newRow);
1187 std::vector<long> Row;
1190 runEv.push_back(Row);
1191 while(pl >> rN >> evN)
1193 std::vector<long> newRow;
1194 newRow.push_back(rN);
1195 newRow.push_back(evN);
1196 runEv.push_back(newRow);
1204 fprintf(stderr,
"Something is wrong with your playlist\n");
1207 std::vector<long> Row;
1210 runEv.push_back(Row);
1216 fprintf(stderr,
"Something is wrong with your playlist\n");
1219 std::vector<long> newRow;
1220 newRow.push_back(rN);
1221 newRow.push_back(evN);
1222 runEv.push_back(newRow);
1227 return runEv.size();
1233 if (!fTurfTree)
return 0;
1235 if (fTurfDirty || force_reload)
1237 int entry = fTurfTree->GetEntryNumberWithBestIndex(round(
header()->triggerTime +
header()->triggerTimeNs /1e9 ) );
1238 fTurfTree->GetEntry(entry);
1248 if (!fSurfTree)
return 0;
1250 if (fSurfDirty || force_reload)
1252 int entry = fSurfTree->GetEntryNumberWithBestIndex(
header()->payloadTime,
header()->payloadTimeUs);
1253 fSurfTree->GetEntry(entry);
1264 if (!fTruthTree)
return 0;
1265 if (fTruthTree->GetReadEntry() != fWantedEntry || force_reload)
1267 fTruthTree->GetEntry(fWantedEntry);
1275 if (!fCalibInfoTree)
return 0;
1276 if (fCalibInfoTree->GetReadEntry() != fWantedEntry || force_reload)
1278 fCalibInfoTree->GetEntry(fWantedEntry);
1286 if (!fCalibInfoTree)
return 0;
1287 if (fCalibInfoTree->GetReadEntry() != fWantedEntry || force_reload)
1289 fCalibInfoTree->GetEntry(fWantedEntry);
1292 return fClockPhiInfo;
1297 if (!fCalibInfoTree)
return 0;
1298 if (fCalibInfoTree->GetReadEntry() != fWantedEntry || force_reload)
1300 fCalibInfoTree->GetEntry(fWantedEntry);
1303 return fTempFactorInfo;
1308 if (!fCalibInfoTree)
return 0;
1309 if (fCalibInfoTree->GetReadEntry() != fWantedEntry || force_reload)
1311 fCalibInfoTree->GetEntry(fWantedEntry);
1314 return fClockProblemInfo;
1319 if (!fCalibInfoTree)
return 0;
1320 if (fCalibInfoTree->GetReadEntry() != fWantedEntry || force_reload)
1322 fCalibInfoTree->GetEntry(fWantedEntry);
1325 return fClockSpikeInfo;
1330 if (!fCalibInfoTree)
return 0;
1331 if (fCalibInfoTree->GetReadEntry() != fWantedEntry || force_reload)
1333 fCalibInfoTree->GetEntry(fWantedEntry);
1336 return fRFSpikeInfo;
1346 bool operator< (
const run_info & other)
const 1348 return stop_time < other.stop_time;
1354 static std::vector<run_info> run_times[NUM_ANITAS+1];
1356 static TMutex run_at_time_mutex;
1360 int version= AnitaVersion::getVersionFromUnixTime(t);
1362 if (!run_times[version].size())
1364 TLockGuard lock(&run_at_time_mutex);
1365 if (!run_times[version].size())
1369 bool found_cache =
false;
1372 TString cache_file1= TString::Format(
"%s/timerunmap_%d.txt", getenv(
"ANITA_CALIB_DIR"),version) ;
1373 TString cache_file2= TString::Format(
"%s/share/anitaCalib/timerunmap_%d.txt", getenv(
"ANITA_UTIL_INSTALL_DIR"),version) ;
1374 TString cache_file3= TString::Format(
"./calib/timerunmap_%d.txt",version);
1376 const char * cache_file_name = checkIfFilesExist(3, cache_file1.Data(), cache_file2.Data(), cache_file3.Data());
1378 if (checkIfFileExists(cache_file_name))
1382 FILE * cf = fopen(cache_file_name,
"r");
1386 fscanf(cf,
"%d %lf %lf\n", &r.run, &r.start_time, &r.stop_time);
1387 run_times[version].push_back(r);
1396 int old_level = gErrorIgnoreLevel;
1397 int recover = gEnv->GetValue(
"TFile.Recover",1);
1398 gEnv->SetValue(
"TFile.Recover",1);
1399 gErrorIgnoreLevel = kFatal;
1401 const char * data_dir =
getDataDir((DataDirectory)version);
1402 fprintf(stderr,
"Couldn't find run file map. Regenerating %s from header files in %s\n", cache_file_name,data_dir);
1403 DIR * dir = opendir(data_dir);
1405 while(
struct dirent * ent = readdir(dir))
1408 if (sscanf(ent->d_name,
"run%d",&run))
1411 TString fname1 = TString::Format(
"%s/run%d/timedHeadFile%d.root", data_dir, run, run);
1412 TString fname2 = TString::Format(
"%s/run%d/headFile%d.root", data_dir, run, run);
1414 if (
const char * the_right_file = checkIfFilesExist(2, fname1.Data(), fname2.Data()))
1416 TFile f(the_right_file);
1417 TTree * t = (TTree*) f.Get(
"headTree");
1423 ri.start_time= t->GetMinimum(
"triggerTime");
1424 ri.stop_time = t->GetMaximum(
"triggerTime") + 1;
1425 run_times[version].push_back(ri);
1431 gErrorIgnoreLevel = old_level;
1432 gEnv->SetValue(
"TFile.Recover",recover);
1433 std::sort(run_times[version].begin(), run_times[version].end());
1436 try2write.Form(
"./calib/timerunmap_%d.txt",version);
1437 FILE * cf = fopen(try2write.Data(),
"w");
1441 const std::vector<run_info> & v = run_times[version];
1442 for (
unsigned i = 0; i < v.size(); i++)
1444 printf(
"%d %0.9f %0.9f\n", v[i].run, v[i].start_time, v[i].stop_time);
1445 fprintf(cf,
"%d %0.9f %0.9f\n", v[i].run, v[i].start_time, v[i].stop_time);
1458 const std::vector<run_info> & v = run_times[version];
1459 std::vector<run_info>::const_iterator it = std::upper_bound(v.begin(), v.end(), test);
1461 if (it == v.end())
return -1;
1462 if (it == v.begin() && (*it).start_time >t)
return -1;
1466 void AnitaDataset::zeroBlindPointers(){
1481 TString description =
"Current strategy: ";
1483 if(strat == kNoBlinding){
1484 description =
"No blinding. ";
1487 if(strat & kInsertedVPolEvents){
1488 description +=
"VPol events inserted. ";
1491 if(strat & kInsertedHPolEvents){
1492 description +=
"HPol events inserted. ";
1495 if(strat & kRandomizePolarity){
1496 description +=
"Polarity randomized. ";
1504 theStrat = newStrat;
1513 void AnitaDataset::loadBlindTrees() {
1522 char calibDir[FILENAME_MAX];
1523 char fileName[FILENAME_MAX];
1524 char *calibEnv=getenv(
"ANITA_CALIB_DIR");
1526 char *utilEnv=getenv(
"ANITA_UTIL_INSTALL_DIR");
1528 sprintf(calibDir,
"calib");
1531 sprintf(calibDir,
"%s/share/anitaCalib",utilEnv);
1535 strncpy(calibDir,calibEnv,FILENAME_MAX);
1542 sprintf(fileName,
"%s/insertedDataFile.root", calibDir);
1544 TString theRootPwd = gDirectory->GetPath();
1546 fBlindFile = TFile::Open(fileName);
1557 TString headTreeName = polPrefix[pol] +
"HeadTree";
1560 TString eventTreeName = polPrefix[pol] +
"EventTree";
1571 std::cerr <<
"Error in " << __PRETTY_FUNCTION__ <<
": " 1572 <<
"fBlindHeadTree[" << pol <<
"] = " <<
fBlindHeadTree[pol] <<
", " 1573 <<
"fBlindEventTree[" << pol <<
"] = " <<
fBlindEventTree[pol] << std::endl;
1578 std::cerr <<
"Error in " << __PRETTY_FUNCTION__ <<
": " 1579 <<
"Unable to find " << fileName <<
" for inserted event blinding." << std::endl;
1586 sprintf(fileName,
"%s/anita%dOverwrittenEventInfo.txt",calibDir, AnitaVersion::get());
1587 std::ifstream overwrittenEventInfoFile(fileName);
1588 char firstLine[180];
1589 overwrittenEventInfoFile.getline(firstLine,179);
1590 UInt_t overwrittenEventNumber;
1591 Int_t fakeTreeEntry, pol;
1592 Int_t numEvents = 0;
1593 while(overwrittenEventInfoFile >> overwrittenEventNumber >> fakeTreeEntry >> pol){
1595 fakeTreeEntries.push_back(fakeTreeEntry);
1597 polarityOfEventToInsert.push_back(thePol);
1602 std::cerr <<
"Warning in " << __FILE__ << std::endl;
1603 std::cerr <<
"Unable to find overwrittenEventInfo" << std::endl;
1606 gDirectory->cd(theRootPwd);
1623 void AnitaDataset::loadHiCalGps() {
1626 const TString theRootPwd = gDirectory->GetPath();
1628 TString fName = TString::Format(
"%s/share/anitaCalib/H1b_GPS_time_interp.root", getenv(
"ANITA_UTIL_INSTALL_DIR"));
1629 fHiCalGpsFile = TFile::Open(fName);
1630 fHiCalGpsTree = (TTree*) fHiCalGpsFile->Get(
"Tpos");
1632 fHiCalGpsTree->BuildIndex(
"unixTime");
1634 fHiCalGpsTree->SetBranchAddress(
"longitude", &fHiCalLon);
1635 fHiCalGpsTree->SetBranchAddress(
"latitude", &fHiCalLat);
1636 fHiCalGpsTree->SetBranchAddress(
"altitude", &fHiCalAlt);
1637 fHiCalGpsTree->SetBranchAddress(
"unixTime", &fHiCalUnixTime);
1639 gDirectory->cd(theRootPwd);
1653 UInt_t realTime = fHeader ? fHeader->
realTime : 0;
1654 hiCal(realTime, longitude, latitude, altitude);
1669 Long64_t entry = fHiCalGpsTree->GetEntryNumberWithIndex(realTime);
1672 fHiCalGpsTree->GetEntry(entry);
1673 longitude = fHiCalLon;
1674 latitude = fHiCalLat;
1675 const double feetToMeters = 0.3048;
1676 altitude = fHiCalAlt*feetToMeters;
1700 Int_t fakeTreeEntry = -1;
1701 for(UInt_t i=0; i < polarityOfEventToInsert.size(); i++){
1702 if(polarityOfEventToInsert.at(i)==pol && eventNumber ==
eventsToOverwrite.at(i)){
1703 fakeTreeEntry = fakeTreeEntries.at(i);
1707 return fakeTreeEntry;
1715 std::cerr <<
"Warning in " << __PRETTY_FUNCTION__ <<
", I read " << numBytes <<
" from the blinding tree " <<
fBlindHeadTree[pol]->GetName()
1716 <<
". This probably means the salting blinding is broken" << std::endl;
1742 std::cerr <<
"Warning in " << __PRETTY_FUNCTION__ <<
", I read " << numBytes <<
" from the blinding tree " <<
fBlindEventTree[pol]->GetName()
1743 <<
". This probably means the salting blinding is broken" << std::endl;
1748 UInt_t surfEventIds[NUM_SURF] = {0};
1749 UChar_t wrongLabs[NUM_SURF*NUM_CHAN] = {0};
1750 UChar_t rightLabs[NUM_SURF*NUM_CHAN] = {0};
1754 for(
int chan=0; chan < NUM_CHAN; chan++){
1755 const int chanIndex =
surf*NUM_CHAN + chan;
1756 wrongLabs[chanIndex] = UChar_t(
fBlindEvent[pol]->getLabChip(chanIndex));
1770 for(
int chan=0; chan < NUM_CHAN; chan++){
1772 const int chanIndex =
surf*NUM_CHAN + chan;
bool loadedBlindTrees
!< for deciding whether to do polarity flipping (eventNumber is used as seed)
UInt_t eventNumber
Event number from software.
static int getRunAtTime(double t)
std::vector< Double_t > * RcoInfo(bool force_reload=false)
int setCut(const TCut &cut)
TTree * fBlindEventTree[AnitaPol::kNotAPol]
!< Pointer to file containing tree of UsefulAnitaEvents to insert
Int_t ClockSpikeInfo(bool force_reload=false)
AnitaDataset(int run, bool decimated=false, WaveCalType::WaveCalType_t cal=WaveCalType::kDefault, DataDirectory dir=ANITA_ROOT_DATA, BlindingStrategy strat=AnitaDataset::kDefault)
CalibratedAnitaEvent * calibrated(bool force_reload=false)
static void hiCal(UInt_t unixTime, Double_t &longitude, Double_t &latitude, Double_t &altitude)
std::vector< UInt_t > eventsToOverwrite
!< Pointer to fake header
Adu5Pat – The ADU5 Position and Attitude Data.
enum WaveCalType::EWaveCalType WaveCalType_t
The calibration enumeration type.
PrettyAnitaHk – The prettified ANITA Hk.
void setCalType(WaveCalType::WaveCalType_t cal)
double fVolts[12 *9][260]
Array of unwrapped (unless kNoCalib) voltages for each channel.
int getEntry(int entryNumber)
int previousMinBiasEvent()
TruthAnitaEvent * truth(bool force_reload=true)
Int_t needToOverwriteEvent(AnitaPol::AnitaPol_t pol, UInt_t eventNumber)
!< Have we loaded the tree of events to insert?
bool loadRun(int run, bool decimated=false, DataDirectory dir=ANITA_ROOT_DATA)
static bool isKnownHiCalEvent(UInt_t eventNumber, Int_t anita=AnitaVersion::get())
int getEvent(int eventNumber, bool quiet=false)
Int_t RFSpikeInfo(bool force_reload=false)
UChar_t chipIdFlag[12 *9]
chipIdFlag
SurfHk – The raw SURF scaler+threshold data.
virtual UsefulAnitaEvent * useful(bool force_reload=false)
virtual ~UsefulAnitaEvent()
Destructor.
Short_t data[12 *9][260]
The pedestal subtracted waveform data. Note that these arrays must be unwrapped and calibrated to bec...
SurfHk * surf(bool force_reload=false)
UsefulAnitaEvent – The Calibrated Useful Anita Event object.
UInt_t attFlag
0 is good attitude, 1 is bad attitude
std::vector< Double_t > * TempFactorInfo(bool force_reload=false)
RawAnitaEvent * raw(bool force_reload=false)
CalibratedAnitaEvent – The Calibrated Calibrated Anita Event object.
Int_t getLabChip(Int_t chanIndex) const
Returns the LABRADOR number.
TTree * fBlindHeadTree[AnitaPol::kNotAPol]
!< Tree of UsefulAnitaEvents to insert
TruthAnitaEvent – The Truth ANITA Event.
UsefulAnitaEvent * fBlindEvent[AnitaPol::kNotAPol]
!< Tree of headers to insert
static TString getDescription(BlindingStrategy strat)
BlindingStrategy getStrategy()
virtual ~CalibratedAnitaEvent()
Destructor.
Int_t ClockProblemInfo(bool force_reload=false)
static const char * getDataDir(DataDirectory dir=ANITA_ROOT_DATA)
TurfRate – The Turf Rate data.
Adu5Pat * gps(bool force_reload=false)
RawAnitaHeader * fBlindHeader[AnitaPol::kNotAPol]
!< Pointer to fake UsefulAnitaEvent
TRandom3 fRandy
!< Currently selected blinding strategy
PrettyAnitaHk * hk(bool force_reload=false)
virtual RawAnitaHeader * header(bool force_reload=false)
int loadPlaylist(const char *playlist)
Where was HiCal?
std::vector< Double_t > * ClockPhiInfo(bool force_reload=false)
BlindingStrategy setStrategy(BlindingStrategy strat)
UInt_t surfEventId[12]
SURF Event Id's.
enum AnitaPol::EAnitaPol AnitaPol_t
Polarisation enumeration.
static int getRunContainingEventNumber(UInt_t eventNumber)
Get the run that contains the eventNumber.
int setPlaylist(const char *playlist)
RawAnitaEvent – The Raw ANITA Event Data.
TurfRate * turf(bool force_reload=false)