From b28fbbf91e0d195f0845ef85d71605c79cc37346 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Fri, 26 May 2023 16:12:49 +0900 Subject: [PATCH 01/55] Save waveform from custom adc --- app/utilities/WCRootData/include/WCRootData.h | 4 + app/utilities/WCRootData/src/WCRootData.cc | 17 + cpp/Makefile | 4 +- cpp/include/HitDigitizer.h | 26 +- cpp/include/HitTube.h | 15 + cpp/src/HitDigitizer.cc | 155 + cpp/src/HitTube.cc | 4 + cpp/src/MDTManager.cc | 3 +- parameter/LC-gauss.txt | 12341 ++++++++++++++++ parameter/MDTParamenter_WCTE.txt | 1 + 10 files changed, 12562 insertions(+), 8 deletions(-) create mode 100644 parameter/LC-gauss.txt diff --git a/app/utilities/WCRootData/include/WCRootData.h b/app/utilities/WCRootData/include/WCRootData.h index 6db8271..2b09afa 100644 --- a/app/utilities/WCRootData/include/WCRootData.h +++ b/app/utilities/WCRootData/include/WCRootData.h @@ -68,6 +68,10 @@ class WCRootData float fHitTimeOffset; bool fMultDigiHits; + TTree *fWCSimDigiWFT; + //std::vector fDigiWF; + TClonesArray* fDigiWF; + private: void SetTubes(HitTubeCollection*, const int); TString fOutFileName; diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index 6683431..4c084a5 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -176,6 +176,10 @@ void WCRootData::CreateTree(const char *filename, const vector &list) TBranch *branch = fWCSimT->Branch(list[i].c_str(), bAddress, &fSpEvt[i], bufferSize, 2); } } + + fWCSimDigiWFT = new TTree("wcsimDigiWFTree","Digitized waveform for each PMT"); + fDigiWF = new TClonesArray("TH1F"); + fWCSimDigiWFT->Branch("wcsimDigiWF",&fDigiWF); } void WCRootData::AddDigiHits(MDTManager *mdt, int eventID, int iPMT) @@ -265,6 +269,16 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID WCSimRootEventHeader *eh = anEvent->GetHeader(); eh->SetDate( int(triggerTime) ); } + + TClonesArray &fDigiWFarray = *fDigiWF; + for(hc->Begin(); !hc->IsEnd(); hc->Next()) + { + HitTube *aPH = &(*hc)(); + if (aPH->GetDigiWF()) + new(fDigiWFarray[aPH->GetTubeID()-1]) TH1F(*(aPH->GetDigiWF())); + else new(fDigiWFarray[aPH->GetTubeID()-1]) TH1F(); + aPH = NULL; + } // PMT loop } void WCRootData::FillTree() @@ -278,6 +292,8 @@ void WCRootData::FillTree() { fSpEvt[i]->ReInitialize(); } + fWCSimDigiWFT->Fill(); + fDigiWF->Clear(); } @@ -384,6 +400,7 @@ void WCRootData::WriteTree() TFile *f = fWCSimT->GetCurrentFile(); f->cd(); fWCSimT->Write(); + fWCSimDigiWFT->Write(); f->Close(); } diff --git a/cpp/Makefile b/cpp/Makefile index 66a4904..4977fda 100644 --- a/cpp/Makefile +++ b/cpp/Makefile @@ -1,8 +1,8 @@ CXX=g++ LD=g++ -CXXFLAGS += -Wall -O2 -std=c++11 -g -fPIC -I./include -LDFLAGS += -shared +CXXFLAGS += -Wall -O2 -std=c++11 -g -fPIC -I./include $(shell root-config --cflags) +LDFLAGS += -shared $(shell root-config --ldflags) $(shell root-config --libs) TARGET=libMDT.so SRCDIR = ./src diff --git a/cpp/include/HitDigitizer.h b/cpp/include/HitDigitizer.h index 70d56b1..9e0ffd8 100644 --- a/cpp/include/HitDigitizer.h +++ b/cpp/include/HitDigitizer.h @@ -6,6 +6,8 @@ #include "PMTResponse.h" #include "MTRandom.h" +#include "TH1F.h" + using std::cout; using std::endl; using std::vector; @@ -15,13 +17,13 @@ class HitDigitizer public: HitDigitizer(int s=67823); virtual ~HitDigitizer(); - void Digitize(HitTubeCollection*, PMTResponse*); - void DigitizeTube(HitTube*, PMTResponse*); + virtual void Digitize(HitTubeCollection*, PMTResponse*); + virtual void DigitizeTube(HitTube*, PMTResponse*); - void ApplyThreshold(double&, bool&); - double DoTruncate(const double, const double); + virtual void ApplyThreshold(double&, bool&); + virtual double DoTruncate(const double, const double); - private: + protected: float fPrecisionCharge; float fPrecisionTiming; float fEfficiency; @@ -30,3 +32,17 @@ class HitDigitizer MTRandom *fRand; }; + +// mPMT specific digitizer +class HitDigitizer_mPMT : public HitDigitizer +{ + public: + HitDigitizer_mPMT(int s=67823); + virtual ~HitDigitizer_mPMT(); + void LoadWaveform(const string &filename); + void DigitizeTube(HitTube*, PMTResponse*); + TH1F BuildWavetrain(const vector PEs, double waveform_window); + + private: + TH1F* hWF; +}; \ No newline at end of file diff --git a/cpp/include/HitTube.h b/cpp/include/HitTube.h index 5822ee2..f5077cc 100644 --- a/cpp/include/HitTube.h +++ b/cpp/include/HitTube.h @@ -22,6 +22,8 @@ #include "TrueHit.h" using std::vector; +#include "TH1F.h" + class HitTube { public: @@ -70,6 +72,17 @@ class HitTube float GetChargeDigi(const int i) const { return fChargeDigi[i]; } const vector& GetParentCompositionDigi(const int i) const { return fParentCompDigi[i]; } + void SetDigiWF(const TH1F& hist) + { + if(hDigiWF != nullptr) delete hDigiWF; + hDigiWF = new TH1F(hist); + hDigiWF->SetDirectory(0); + } + TH1F* GetDigiWF() + { + return hDigiWF; + } + private: int fNRawPE; @@ -82,4 +95,6 @@ class HitTube vector fTimeDigi; vector fChargeDigi; vector> fParentCompDigi; + + TH1F* hDigiWF; }; diff --git a/cpp/src/HitDigitizer.cc b/cpp/src/HitDigitizer.cc index 4d00858..33391a5 100644 --- a/cpp/src/HitDigitizer.cc +++ b/cpp/src/HitDigitizer.cc @@ -143,3 +143,158 @@ double HitDigitizer::DoTruncate(const double x, const double precision) if(precision < 1E-10){ return x; } return precision * (int)(x/precision); } + +// mPMT specific digitizer +HitDigitizer_mPMT::HitDigitizer_mPMT(int seed) : HitDigitizer(seed) +{ + hWF = nullptr; + string fTxtFileWF; + Configuration *Conf = Configuration::GetInstance(); + this->LoadWaveform(Conf->GetValue("WaveformFile")); +} + +HitDigitizer_mPMT::~HitDigitizer_mPMT() +{ + if( fRand ){ delete fRand; fRand = NULL; } + if(hWF != nullptr) delete hWF; +} + +void HitDigitizer_mPMT::LoadWaveform(const string &filename) +{ + if(hWF != nullptr) delete hWF; + + ifstream ifs(filename.c_str()); + if (!ifs.is_open()) + { + cout<<" [ERROR] HitDigitizer_mPMT::LoadWaveform" < EXIT" < t_val; + float time_val[20000]; // just a large number to avoid overflow + vector volt_val; + int nEntries = 0; + while( std::getline(ifs, aLine) ) + { + if( aLine[0] == '#' ){ continue; } + stringstream ssline(aLine); + float t, v; + ssline >> t >> v; + //t_val.push_back(t); + time_val[nEntries++] = t*1.e9; // ns + volt_val.push_back(v*1000); // mV + } + ifs.close(); + + hWF = new TH1F("hWF","hWF",nEntries-1,time_val); + hWF->SetDirectory(0); + for (int i=0;iSetBinContent(i+1,volt_val.at(i)); + } +} + +void HitDigitizer_mPMT::DigitizeTube(HitTube *aHT, PMTResponse *pr) +{ + aHT->SortTrueHits(); + const int NPE = aHT->GetNRawPE(); + const vector PEs = aHT->GetPhotoElectrons(); + + // Taken from WCSimWCDigitizerSKI::DigitizeHits + double sumSPE = 0.; + double tSmeared = -9999.; + bool isAlive = false; + double digiT = 0.; + double digiQ = 0.; + + double intgr_srt = (double)PEs[0]->GetTime(); + double intgr_end = intgr_srt+fIntegWindow; + vector parent_composition; + parent_composition.clear(); + vector digiPEs; + digiPEs.clear(); + + for(int iPE=0; iPEGetTime()>=intgr_srt && PEs[iPE]->GetTime()GetRawSPE(PEs[iPE], aHT); + parent_composition.push_back( PEs[iPE]->GetParentId() ); + digiPEs.push_back(PEs[iPE]); + intgr_end = PEs[iPE]->GetTime()+fIntegWindow; + } + else + { + digiT = intgr_srt; + digiQ = sumSPE; + + isAlive = true; + if (fApplyEff ){ this->ApplyThreshold(digiQ, isAlive); } + if( isAlive ) + { + tSmeared = pr->HitTimeSmearing(digiQ); + digiQ *= fEfficiency; + digiT += tSmeared; + digiQ = this->DoTruncate(digiQ, fPrecisionCharge); + digiT = this->DoTruncate(digiT, fPrecisionTiming); + aHT->AddDigiHit(digiT, digiQ, parent_composition); + } + TH1F hWT = BuildWavetrain(digiPEs, fIntegWindow); + if (!aHT->GetDigiWF()) aHT->SetDigiWF(hWT); + sumSPE = 0.; + parent_composition.clear(); + digiPEs.clear(); + + intgr_srt = PEs[iPE]->GetTime(); + intgr_end = intgr_srt+fIntegWindow; + sumSPE += pr->GetRawSPE(PEs[iPE], aHT); + parent_composition.push_back( PEs[iPE]->GetParentId() ); + digiPEs.push_back(PEs[iPE]); + } + } + + digiT = intgr_srt; + digiQ = sumSPE; + tSmeared = pr->HitTimeSmearing(digiQ); + isAlive = true; + if (fApplyEff ){ this->ApplyThreshold(digiQ, isAlive); } + if( isAlive ) + { + digiQ *= fEfficiency; + digiT += tSmeared ; + digiQ = this->DoTruncate(digiQ, fPrecisionCharge); + digiT = this->DoTruncate(digiT, fPrecisionTiming); + aHT->AddDigiHit(digiT, digiQ, parent_composition); + } + TH1F hWT = BuildWavetrain(digiPEs, fIntegWindow); + if (!aHT->GetDigiWF()) aHT->SetDigiWF(hWT); +} + +TH1F HitDigitizer_mPMT::BuildWavetrain(const vector PEs, double waveform_window) +{ + double dt = 8; // start, end, interval of sampling + double tmin = floor((PEs.front()->GetTime()-waveform_window)/dt)*dt; + double tmax = ceil((PEs.back()->GetTime()+waveform_window)/dt)*dt; + TH1F hWT("","",(int)(tmax-tmin)/dt,tmin,tmax); + + double waveform_offset = 95; + + for(long unsigned int iPE=0; iPEGetTime(); + + int bin_start = hWT.FindBin(trueT); + int bin_end = hWT.FindBin(trueT+waveform_window); + + for (int iBin = bin_start; iBin<=bin_end; iBin++) + { + double adcT = hWT.GetBinLowEdge(iBin); + double adcV = hWF->GetBinContent(hWF->FindBin(adcT-trueT+waveform_offset)); + hWT.Fill(adcT+dt/2,adcV); + } + } + + return hWT; +} \ No newline at end of file diff --git a/cpp/src/HitTube.cc b/cpp/src/HitTube.cc index a7fd84d..e72ad41 100644 --- a/cpp/src/HitTube.cc +++ b/cpp/src/HitTube.cc @@ -11,6 +11,8 @@ HitTube::HitTube(int id) fParentCompDigi.clear(); fTubeID = id; + + hDigiWF = nullptr; } @@ -23,4 +25,6 @@ HitTube::~HitTube() vector().swap( fTimeDigi ); vector().swap( fChargeDigi ); vector>().swap( fParentCompDigi ); + + if(hDigiWF != nullptr) delete hDigiWF; } diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index 708f04f..b21248d 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -4,7 +4,8 @@ MDTManager::MDTManager(int seed) { fRndm = new MTRandom( seed ); fTrigAlgo = new TriggerAlgo(); - fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); + //fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); + fDgtzr = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); fPMTResp.clear(); fDark.clear(); diff --git a/parameter/LC-gauss.txt b/parameter/LC-gauss.txt new file mode 100644 index 0000000..fec0858 --- /dev/null +++ b/parameter/LC-gauss.txt @@ -0,0 +1,12341 @@ +# 1PE pulse empirical shape +0.0000E+00 -5.48947E-09 +1.0000E-16 5.41105E-08 +2.0000E-16 5.41105E-08 +4.0000E-16 5.41105E-08 +8.0000E-16 5.41105E-08 +9.0000E-16 -5.48947E-09 +1.1000E-15 5.41105E-08 +1.5000E-15 5.41105E-08 +2.3000E-15 -5.48947E-09 +3.9000E-15 -5.48947E-09 +7.1000E-15 -5.48947E-09 +1.3500E-14 5.41105E-08 +2.6300E-14 -5.48947E-09 +1.0310E-13 -5.48947E-09 +2.0550E-13 -5.48947E-09 +4.1030E-13 -5.48947E-09 +8.1990E-13 -5.48947E-09 +1.6391E-12 -5.48947E-09 +3.2775E-12 -5.48947E-09 +6.5543E-12 -5.48947E-09 +1.3108E-11 -5.48947E-09 +2.2687E-11 -5.48947E-09 +3.2687E-11 -5.48947E-09 +4.2687E-11 -5.48947E-09 +5.2687E-11 -5.48947E-09 +6.2687E-11 -5.48947E-09 +7.2687E-11 -5.48947E-09 +8.2687E-11 -5.48947E-09 +8.8731E-11 -5.48947E-09 +9.4776E-11 -5.48947E-09 +1.0082E-10 -5.48947E-09 +1.0687E-10 -5.48947E-09 +1.1291E-10 -5.48947E-09 +1.1896E-10 -5.48947E-09 +1.2500E-10 -5.48947E-09 +1.3500E-10 -5.48947E-09 +1.4500E-10 -5.48947E-09 +1.5500E-10 -5.48947E-09 +1.6500E-10 -5.48947E-09 +1.7500E-10 -5.48947E-09 +1.8500E-10 -5.48947E-09 +2.0100E-10 -5.48947E-09 +2.1500E-10 -5.48947E-09 +2.3500E-10 -5.48947E-09 +2.5500E-10 -5.48947E-09 +2.7500E-10 -5.48947E-09 +2.7900E-10 -5.48947E-09 +2.8300E-10 -5.48947E-09 +2.8700E-10 -5.48947E-09 +2.9100E-10 -5.48947E-09 +2.9500E-10 -5.48947E-09 +2.9900E-10 -5.48947E-09 +3.0300E-10 -5.48947E-09 +3.1614E-10 -5.48947E-09 +3.2929E-10 -5.48947E-09 +3.4243E-10 -5.48947E-09 +3.5557E-10 -5.48947E-09 +3.6871E-10 -5.48947E-09 +3.8186E-10 -5.48947E-09 +3.9500E-10 -5.48947E-09 +4.1643E-10 -5.48947E-09 +4.3786E-10 -5.48947E-09 +4.5929E-10 -5.48947E-09 +4.8071E-10 -5.48947E-09 +5.0214E-10 -5.48947E-09 +5.2357E-10 -5.48947E-09 +5.4500E-10 -5.48947E-09 +5.6357E-10 -5.48947E-09 +5.8214E-10 -5.48947E-09 +6.0071E-10 -5.48947E-09 +6.1929E-10 -5.48947E-09 +6.3786E-10 -5.48947E-09 +6.5643E-10 -5.48947E-09 +6.7500E-10 -5.48947E-09 +6.8357E-10 -5.48947E-09 +6.9214E-10 -5.48947E-09 +7.0071E-10 -5.48947E-09 +7.0929E-10 -5.48947E-09 +7.1786E-10 -5.48947E-09 +7.2643E-10 -5.48947E-09 +7.3500E-10 -5.48947E-09 +7.5643E-10 -5.48947E-09 +7.7786E-10 -5.48947E-09 +7.9929E-10 -5.48947E-09 +8.2071E-10 -5.48947E-09 +8.4214E-10 -5.48947E-09 +8.6357E-10 -5.48947E-09 +8.8500E-10 -5.48947E-09 +9.0500E-10 -5.48947E-09 +9.2500E-10 -5.48947E-09 +9.4500E-10 -5.48947E-09 +9.6500E-10 -5.48947E-09 +9.8500E-10 -5.48947E-09 +1.0050E-09 -5.48947E-09 +1.0250E-09 -5.48947E-09 +1.0504E-09 -5.48947E-09 +1.0759E-09 -5.48947E-09 +1.1013E-09 -5.48947E-09 +1.1267E-09 -5.48947E-09 +1.1521E-09 -5.48947E-09 +1.1776E-09 -5.48947E-09 +1.2030E-09 -5.48947E-09 +1.2311E-09 -5.48947E-09 +1.2593E-09 -5.48947E-09 +1.2874E-09 -5.48947E-09 +1.3156E-09 -5.48947E-09 +1.3437E-09 -5.48947E-09 +1.3719E-09 -5.48947E-09 +1.4000E-09 -5.48947E-09 +1.5000E-09 -5.48947E-09 +1.6010E-09 -5.48947E-09 +1.7000E-09 -5.48947E-09 +1.8000E-09 -5.48947E-09 +1.9000E-09 -5.48947E-09 +2.0000E-09 -5.48947E-09 +2.1000E-09 -5.48947E-09 +2.1236E-09 -5.48947E-09 +2.1471E-09 -5.48947E-09 +2.1707E-09 -5.48947E-09 +2.1943E-09 -5.48947E-09 +2.2179E-09 -5.48947E-09 +2.2414E-09 -5.48947E-09 +2.2650E-09 -5.48947E-09 +2.3000E-09 -5.48947E-09 +2.4010E-09 -5.48947E-09 +2.5010E-09 -5.48947E-09 +2.6000E-09 -5.48947E-09 +2.7030E-09 -5.48947E-09 +2.8000E-09 -5.48947E-09 +2.8429E-09 -5.48947E-09 +2.8857E-09 -5.48947E-09 +2.9286E-09 -5.48947E-09 +2.9714E-09 -5.48947E-09 +3.0143E-09 -5.48947E-09 +3.0571E-09 -5.48947E-09 +3.1000E-09 -5.48947E-09 +3.2000E-09 -5.48947E-09 +3.2147E-09 -5.48947E-09 +3.2294E-09 -5.48947E-09 +3.2441E-09 -5.48947E-09 +3.2589E-09 -5.48947E-09 +3.2736E-09 -5.48947E-09 +3.2883E-09 -5.48947E-09 +3.3030E-09 -5.48947E-09 +3.4000E-09 -5.48947E-09 +3.5010E-09 -5.48947E-09 +3.6000E-09 -5.48947E-09 +3.7000E-09 -5.48947E-09 +3.8000E-09 -5.48947E-09 +3.9000E-09 -5.48947E-09 +4.0000E-09 -5.48947E-09 +4.1000E-09 -5.48947E-09 +4.1107E-09 -5.48947E-09 +4.1214E-09 -5.48947E-09 +4.1321E-09 -5.48947E-09 +4.1429E-09 -5.48947E-09 +4.1536E-09 -5.48947E-09 +4.1643E-09 -5.48947E-09 +4.1750E-09 -5.48947E-09 +4.1907E-09 -5.48947E-09 +4.2064E-09 -5.48947E-09 +4.2221E-09 -5.48947E-09 +4.2379E-09 -5.48947E-09 +4.2536E-09 -5.48947E-09 +4.2693E-09 -5.48947E-09 +4.2850E-09 -5.48947E-09 +4.3000E-09 -5.48947E-09 +4.4000E-09 -5.48947E-09 +4.5000E-09 -5.48947E-09 +4.6010E-09 -5.48947E-09 +4.6294E-09 -5.48947E-09 +4.6579E-09 -5.48947E-09 +4.6863E-09 -5.48947E-09 +4.7147E-09 -5.48947E-09 +4.7431E-09 -5.48947E-09 +4.7716E-09 -5.48947E-09 +4.8000E-09 -5.48947E-09 +4.9000E-09 -5.48947E-09 +5.0010E-09 -5.48947E-09 +5.1000E-09 -5.48947E-09 +5.2000E-09 -5.48947E-09 +5.3010E-09 -5.48947E-09 +5.4000E-09 -5.48947E-09 +5.5000E-09 -5.48947E-09 +5.5286E-09 -5.48947E-09 +5.5571E-09 -5.48947E-09 +5.5857E-09 -5.48947E-09 +5.6143E-09 -5.48947E-09 +5.6429E-09 -5.48947E-09 +5.6714E-09 -5.48947E-09 +5.7000E-09 -5.48947E-09 +5.8010E-09 -5.48947E-09 +5.9010E-09 -5.48947E-09 +6.0000E-09 -5.48947E-09 +6.1000E-09 -5.48947E-09 +6.2010E-09 -5.48947E-09 +6.3010E-09 -5.48947E-09 +6.4000E-09 -5.48947E-09 +6.4147E-09 -5.48947E-09 +6.4294E-09 -5.48947E-09 +6.4441E-09 -5.48947E-09 +6.4589E-09 -5.48947E-09 +6.4736E-09 -5.48947E-09 +6.4883E-09 -5.48947E-09 +6.5030E-09 -5.48947E-09 +6.6000E-09 -5.48947E-09 +6.7010E-09 -5.48947E-09 +6.8000E-09 -5.48947E-09 +6.9000E-09 -5.48947E-09 +7.0010E-09 -5.48947E-09 +7.1030E-09 -5.48947E-09 +7.1190E-09 -5.48947E-09 +7.1350E-09 -5.48947E-09 +7.1510E-09 -5.48947E-09 +7.1670E-09 -5.48947E-09 +7.1830E-09 -5.48947E-09 +7.1990E-09 -5.48947E-09 +7.2150E-09 -5.48947E-09 +7.3010E-09 -5.48947E-09 +7.4000E-09 -5.48947E-09 +7.4153E-09 -5.48947E-09 +7.4306E-09 -5.48947E-09 +7.4459E-09 -5.48947E-09 +7.4611E-09 -5.48947E-09 +7.4764E-09 -5.48947E-09 +7.4917E-09 -5.48947E-09 +7.5070E-09 -5.48947E-09 +7.6000E-09 -5.48947E-09 +7.7010E-09 -5.48947E-09 +7.7250E-09 -5.48947E-09 +7.8000E-09 -5.48947E-09 +7.9000E-09 -5.48947E-09 +8.0030E-09 -5.48947E-09 +8.1000E-09 -5.48947E-09 +8.1144E-09 -5.48947E-09 +8.1289E-09 -5.48947E-09 +8.1433E-09 -5.48947E-09 +8.1577E-09 -5.48947E-09 +8.1721E-09 -5.48947E-09 +8.1866E-09 -5.48947E-09 +8.2010E-09 -5.48947E-09 +8.3030E-09 -5.48947E-09 +8.3173E-09 -5.48947E-09 +8.3316E-09 -5.48947E-09 +8.3459E-09 -5.48947E-09 +8.3601E-09 -5.48947E-09 +8.3744E-09 -5.48947E-09 +8.3887E-09 -5.48947E-09 +8.4030E-09 -5.48947E-09 +8.4173E-09 -5.48947E-09 +8.4316E-09 -5.48947E-09 +8.4459E-09 -5.48947E-09 +8.4601E-09 -5.48947E-09 +8.4744E-09 -5.48947E-09 +8.4887E-09 -5.48947E-09 +8.5030E-09 -5.48947E-09 +8.6000E-09 -5.48947E-09 +8.7000E-09 -5.48947E-09 +8.8010E-09 -5.48947E-09 +8.9010E-09 -5.48947E-09 +9.0000E-09 -5.48947E-09 +9.1070E-09 -5.48947E-09 +9.2000E-09 -5.48947E-09 +9.3010E-09 -5.48947E-09 +9.4000E-09 -5.48947E-09 +9.4287E-09 -5.48947E-09 +9.4574E-09 -5.48947E-09 +9.4861E-09 -5.48947E-09 +9.5149E-09 -5.48947E-09 +9.5436E-09 -5.48947E-09 +9.5723E-09 -5.48947E-09 +9.6010E-09 -5.48947E-09 +9.7010E-09 -5.48947E-09 +9.8030E-09 -5.48947E-09 +9.8190E-09 -5.48947E-09 +9.8350E-09 -5.48947E-09 +9.8510E-09 -5.48947E-09 +9.8670E-09 -5.48947E-09 +9.8830E-09 -5.48947E-09 +9.8990E-09 -5.48947E-09 +9.9150E-09 -5.48947E-09 +9.9419E-09 -5.48947E-09 +9.9687E-09 -5.48947E-09 +9.9956E-09 -5.48947E-09 +1.0022E-08 -5.48947E-09 +1.0049E-08 -5.48947E-09 +1.0076E-08 -5.48947E-09 +1.0103E-08 -5.48947E-09 +1.0200E-08 -5.48947E-09 +1.0301E-08 -5.48947E-09 +1.0400E-08 -5.48947E-09 +1.0500E-08 -5.48947E-09 +1.0600E-08 -5.48947E-09 +1.0701E-08 -5.48947E-09 +1.0800E-08 -5.48947E-09 +1.0901E-08 -5.48947E-09 +1.1000E-08 -5.48947E-09 +1.1101E-08 -5.48947E-09 +1.1200E-08 -5.48947E-09 +1.1301E-08 -5.48947E-09 +1.1400E-08 -5.48947E-09 +1.1501E-08 -5.48947E-09 +1.1600E-08 -5.48947E-09 +1.1700E-08 -5.48947E-09 +1.1803E-08 -5.48947E-09 +1.1901E-08 -5.48947E-09 +1.2001E-08 -5.48947E-09 +1.2103E-08 -5.48947E-09 +1.2201E-08 -5.48947E-09 +1.2223E-08 -5.48947E-09 +1.2245E-08 -5.48947E-09 +1.2267E-08 -5.48947E-09 +1.2289E-08 -5.48947E-09 +1.2311E-08 -5.48947E-09 +1.2333E-08 -5.48947E-09 +1.2355E-08 -5.48947E-09 +1.2401E-08 -5.48947E-09 +1.2416E-08 -5.48947E-09 +1.2430E-08 -5.48947E-09 +1.2445E-08 -5.48947E-09 +1.2459E-08 -5.48947E-09 +1.2474E-08 -5.48947E-09 +1.2488E-08 -5.48947E-09 +1.2503E-08 -5.48947E-09 +1.2600E-08 -5.48947E-09 +1.2700E-08 -5.48947E-09 +1.2801E-08 -5.48947E-09 +1.2900E-08 -5.48947E-09 +1.3001E-08 -5.48947E-09 +1.3030E-08 -5.48947E-09 +1.3058E-08 -5.48947E-09 +1.3087E-08 -5.48947E-09 +1.3115E-08 -5.48947E-09 +1.3144E-08 -5.48947E-09 +1.3172E-08 -5.48947E-09 +1.3201E-08 -5.48947E-09 +1.3301E-08 -5.48947E-09 +1.3401E-08 -5.48947E-09 +1.3501E-08 -5.48947E-09 +1.3601E-08 -5.48947E-09 +1.3701E-08 -5.48947E-09 +1.3730E-08 -5.48947E-09 +1.3758E-08 -5.48947E-09 +1.3787E-08 -5.48947E-09 +1.3815E-08 -5.48947E-09 +1.3844E-08 -5.48947E-09 +1.3872E-08 -5.48947E-09 +1.3901E-08 -5.48947E-09 +1.4003E-08 -5.48947E-09 +1.4101E-08 -5.48947E-09 +1.4116E-08 -5.48947E-09 +1.4131E-08 -5.48947E-09 +1.4146E-08 -5.48947E-09 +1.4162E-08 -5.48947E-09 +1.4177E-08 -5.48947E-09 +1.4192E-08 -5.48947E-09 +1.4207E-08 -5.48947E-09 +1.4301E-08 -5.48947E-09 +1.4407E-08 -5.48947E-09 +1.4500E-08 -5.48947E-09 +1.4600E-08 -5.48947E-09 +1.4701E-08 -5.48947E-09 +1.4800E-08 -5.48947E-09 +1.4901E-08 -5.48947E-09 +1.5000E-08 -5.48947E-09 +1.5100E-08 -5.48947E-09 +1.5200E-08 -5.48947E-09 +1.5229E-08 -5.48947E-09 +1.5257E-08 -5.48947E-09 +1.5286E-08 -5.48947E-09 +1.5315E-08 -5.48947E-09 +1.5344E-08 -5.48947E-09 +1.5372E-08 -5.48947E-09 +1.5401E-08 -5.48947E-09 +1.5500E-08 -5.48947E-09 +1.5603E-08 -5.48947E-09 +1.5701E-08 -5.48947E-09 +1.5800E-08 -5.48947E-09 +1.5901E-08 -5.48947E-09 +1.6000E-08 -5.48947E-09 +1.6029E-08 -5.48947E-09 +1.6057E-08 -5.48947E-09 +1.6086E-08 -5.48947E-09 +1.6114E-08 -5.48947E-09 +1.6143E-08 -5.48947E-09 +1.6171E-08 -5.48947E-09 +1.6200E-08 -5.48947E-09 +1.6300E-08 -5.48947E-09 +1.6400E-08 -5.48947E-09 +1.6500E-08 -5.48947E-09 +1.6600E-08 -5.48947E-09 +1.6614E-08 -5.48947E-09 +1.6629E-08 -5.48947E-09 +1.6643E-08 -5.48947E-09 +1.6657E-08 -5.48947E-09 +1.6671E-08 -5.48947E-09 +1.6686E-08 -5.48947E-09 +1.6700E-08 -5.48947E-09 +1.6801E-08 -5.48947E-09 +1.6816E-08 -5.48947E-09 +1.6830E-08 -5.48947E-09 +1.6845E-08 -5.48947E-09 +1.6859E-08 -5.48947E-09 +1.6874E-08 -5.48947E-09 +1.6888E-08 -5.48947E-09 +1.6903E-08 -5.48947E-09 +1.7000E-08 -5.48947E-09 +1.7103E-08 -5.48947E-09 +1.7200E-08 -5.48947E-09 +1.7300E-08 -5.48947E-09 +1.7400E-08 -5.48947E-09 +1.7500E-08 -5.48947E-09 +1.7600E-08 -5.48947E-09 +1.7700E-08 -5.48947E-09 +1.7800E-08 -5.48947E-09 +1.7901E-08 -5.48947E-09 +1.8000E-08 -5.48947E-09 +1.8103E-08 -5.48947E-09 +1.8200E-08 -5.48947E-09 +1.8301E-08 -5.48947E-09 +1.8400E-08 -5.48947E-09 +1.8501E-08 -5.48947E-09 +1.8601E-08 -5.48947E-09 +1.8703E-08 -5.48947E-09 +1.8801E-08 -5.48947E-09 +1.8907E-08 -5.48947E-09 +1.8921E-08 -5.48947E-09 +1.8936E-08 -5.48947E-09 +1.8950E-08 -5.48947E-09 +1.8964E-08 -5.48947E-09 +1.8978E-08 -5.48947E-09 +1.8993E-08 -5.48947E-09 +1.9007E-08 -5.48947E-09 +1.9100E-08 -5.48947E-09 +1.9200E-08 -5.48947E-09 +1.9300E-08 -5.48947E-09 +1.9400E-08 -5.48947E-09 +1.9500E-08 -5.48947E-09 +1.9601E-08 -5.48947E-09 +1.9700E-08 -5.48947E-09 +1.9800E-08 -5.48947E-09 +1.9900E-08 -5.48947E-09 +2.0007E-08 -5.48947E-09 +2.0100E-08 -5.48947E-09 +2.0200E-08 -5.48947E-09 +2.0301E-08 -5.48947E-09 +2.0400E-08 -5.48947E-09 +2.0429E-08 -5.48947E-09 +2.0457E-08 -5.48947E-09 +2.0486E-08 -5.48947E-09 +2.0514E-08 -5.48947E-09 +2.0543E-08 -5.48947E-09 +2.0571E-08 -5.48947E-09 +2.0600E-08 -5.48947E-09 +2.0685E-08 -5.48947E-09 +2.0700E-08 -5.48947E-09 +2.0719E-08 -5.48947E-09 +2.0739E-08 -5.48947E-09 +2.0758E-08 -5.48947E-09 +2.0777E-08 -5.48947E-09 +2.0796E-08 -5.48947E-09 +2.0816E-08 -5.48947E-09 +2.0835E-08 -5.48947E-09 +2.0901E-08 -5.48947E-09 +2.1001E-08 -5.48947E-09 +2.1103E-08 -5.48947E-09 +2.1119E-08 -5.48947E-09 +2.1135E-08 -5.48947E-09 +2.1151E-08 -5.48947E-09 +2.1167E-08 -5.48947E-09 +2.1183E-08 -5.48947E-09 +2.1199E-08 -5.48947E-09 +2.1215E-08 -5.48947E-09 +2.1300E-08 5.41105E-08 +2.1400E-08 5.41105E-08 +2.1415E-08 5.41105E-08 +2.1431E-08 5.41105E-08 +2.1446E-08 5.41105E-08 +2.1461E-08 5.41105E-08 +2.1476E-08 5.41105E-08 +2.1492E-08 5.41105E-08 +2.1507E-08 5.41105E-08 +2.1600E-08 5.41105E-08 +2.1701E-08 5.41105E-08 +2.1800E-08 5.41105E-08 +2.1900E-08 5.41105E-08 +2.2000E-08 5.41105E-08 +2.2100E-08 5.41105E-08 +2.2200E-08 5.41105E-08 +2.2300E-08 5.41105E-08 +2.2403E-08 5.41105E-08 +2.2501E-08 5.41105E-08 +2.2600E-08 5.41105E-08 +2.2700E-08 5.41105E-08 +2.2715E-08 5.41105E-08 +2.2731E-08 5.41105E-08 +2.2746E-08 5.41105E-08 +2.2761E-08 5.41105E-08 +2.2776E-08 5.41105E-08 +2.2792E-08 5.41105E-08 +2.2807E-08 5.41105E-08 +2.2900E-08 5.41105E-08 +2.3007E-08 5.41105E-08 +2.3021E-08 5.41105E-08 +2.3036E-08 5.41105E-08 +2.3050E-08 5.41105E-08 +2.3064E-08 5.41105E-08 +2.3078E-08 5.41105E-08 +2.3093E-08 5.41105E-08 +2.3107E-08 5.41105E-08 +2.3200E-08 5.41105E-08 +2.3300E-08 5.41105E-08 +2.3400E-08 5.41105E-08 +2.3495E-08 5.41105E-08 +2.3501E-08 5.41105E-08 +2.3600E-08 5.41105E-08 +2.3703E-08 5.41105E-08 +2.3800E-08 5.41105E-08 +2.3900E-08 5.41105E-08 +2.4000E-08 5.41105E-08 +2.4100E-08 5.41105E-08 +2.4200E-08 5.41105E-08 +2.4300E-08 1.13711E-07 +2.4329E-08 1.13711E-07 +2.4357E-08 1.13711E-07 +2.4386E-08 1.13711E-07 +2.4415E-08 1.13711E-07 +2.4444E-08 1.13711E-07 +2.4472E-08 1.13711E-07 +2.4501E-08 1.13711E-07 +2.4600E-08 1.13711E-07 +2.4701E-08 1.13711E-07 +2.4800E-08 1.13711E-07 +2.4901E-08 1.13711E-07 +2.5000E-08 1.13711E-07 +2.5100E-08 1.13711E-07 +2.5203E-08 1.13711E-07 +2.5217E-08 1.13711E-07 +2.5232E-08 1.13711E-07 +2.5246E-08 1.13711E-07 +2.5260E-08 1.13711E-07 +2.5274E-08 1.13711E-07 +2.5289E-08 1.13711E-07 +2.5303E-08 1.13711E-07 +2.5400E-08 1.13711E-07 +2.5500E-08 1.13711E-07 +2.5600E-08 1.13711E-07 +2.5700E-08 1.13711E-07 +2.5714E-08 1.13711E-07 +2.5729E-08 1.13711E-07 +2.5743E-08 1.13711E-07 +2.5758E-08 1.13711E-07 +2.5772E-08 1.13711E-07 +2.5787E-08 1.13711E-07 +2.5801E-08 1.13711E-07 +2.5900E-08 1.13711E-07 +2.6007E-08 1.13711E-07 +2.6101E-08 1.13711E-07 +2.6200E-08 1.13711E-07 +2.6301E-08 1.13711E-07 +2.6400E-08 1.13711E-07 +2.6500E-08 1.13711E-07 +2.6601E-08 1.13711E-07 +2.6701E-08 1.13711E-07 +2.6801E-08 1.73311E-07 +2.6901E-08 1.73311E-07 +2.7000E-08 1.73311E-07 +2.7100E-08 1.73311E-07 +2.7201E-08 1.73311E-07 +2.7222E-08 1.73311E-07 +2.7242E-08 1.73311E-07 +2.7263E-08 1.73311E-07 +2.7283E-08 1.73311E-07 +2.7304E-08 1.73311E-07 +2.7324E-08 1.73311E-07 +2.7345E-08 1.73311E-07 +2.7400E-08 1.73311E-07 +2.7429E-08 1.67211E-07 +2.7457E-08 1.66011E-07 +2.7486E-08 1.69611E-07 +2.7514E-08 1.78211E-07 +2.7543E-08 1.91511E-07 +2.7571E-08 2.09811E-07 +2.7600E-08 2.32911E-07 +2.7701E-08 2.32911E-07 +2.7801E-08 2.32911E-07 +2.7901E-08 2.32911E-07 +2.8001E-08 2.32911E-07 +2.8101E-08 2.32911E-07 +2.8200E-08 2.32911E-07 +2.8303E-08 2.32911E-07 +2.8400E-08 2.32911E-07 +2.8429E-08 2.32911E-07 +2.8458E-08 2.32911E-07 +2.8487E-08 2.32911E-07 +2.8516E-08 2.32911E-07 +2.8545E-08 2.32911E-07 +2.8574E-08 2.32911E-07 +2.8603E-08 2.32911E-07 +2.8700E-08 2.32911E-07 +2.8803E-08 2.92511E-07 +2.8900E-08 2.92511E-07 +2.9000E-08 2.92511E-07 +2.9101E-08 2.92511E-07 +2.9112E-08 2.92511E-07 +2.9122E-08 2.92511E-07 +2.9133E-08 2.92511E-07 +2.9143E-08 2.92511E-07 +2.9154E-08 2.92511E-07 +2.9164E-08 2.92511E-07 +2.9175E-08 2.92511E-07 +2.9200E-08 2.92511E-07 +2.9307E-08 3.52111E-07 +2.9400E-08 3.52111E-07 +2.9500E-08 3.52111E-07 +2.9601E-08 3.52111E-07 +2.9629E-08 3.52111E-07 +2.9658E-08 3.52111E-07 +2.9686E-08 3.52111E-07 +2.9715E-08 3.52111E-07 +2.9743E-08 3.52111E-07 +2.9772E-08 3.52111E-07 +2.9800E-08 3.52111E-07 +2.9901E-08 3.52111E-07 +3.0000E-08 3.52111E-07 +3.0015E-08 3.52111E-07 +3.0031E-08 3.52111E-07 +3.0046E-08 3.52111E-07 +3.0061E-08 3.52111E-07 +3.0076E-08 3.52111E-07 +3.0092E-08 3.52111E-07 +3.0107E-08 3.52111E-07 +3.0200E-08 4.11711E-07 +3.0229E-08 4.11711E-07 +3.0257E-08 4.11711E-07 +3.0286E-08 4.11711E-07 +3.0314E-08 4.11711E-07 +3.0343E-08 4.11711E-07 +3.0371E-08 4.11711E-07 +3.0400E-08 4.11711E-07 +3.0501E-08 4.11711E-07 +3.0600E-08 4.71311E-07 +3.0700E-08 4.71311E-07 +3.0803E-08 4.71311E-07 +3.0817E-08 4.71311E-07 +3.0832E-08 4.71311E-07 +3.0846E-08 4.71311E-07 +3.0860E-08 4.71311E-07 +3.0874E-08 4.71311E-07 +3.0889E-08 4.71311E-07 +3.0903E-08 4.71311E-07 +3.1001E-08 4.71311E-07 +3.1100E-08 4.71311E-07 +3.1200E-08 5.30911E-07 +3.1300E-08 5.30911E-07 +3.1365E-08 5.30911E-07 +3.1375E-08 5.30911E-07 +3.1385E-08 5.30911E-07 +3.1395E-08 5.30911E-07 +3.1405E-08 5.30911E-07 +3.1415E-08 5.30911E-07 +3.1425E-08 5.30911E-07 +3.1435E-08 5.30911E-07 +3.1501E-08 5.30911E-07 +3.1601E-08 5.90511E-07 +3.1701E-08 5.90511E-07 +3.1800E-08 5.90511E-07 +3.1903E-08 5.90511E-07 +3.2000E-08 5.90511E-07 +3.2101E-08 6.50111E-07 +3.2203E-08 6.50111E-07 +3.2300E-08 6.50111E-07 +3.2401E-08 7.09711E-07 +3.2500E-08 7.09711E-07 +3.2600E-08 7.09711E-07 +3.2700E-08 7.09711E-07 +3.2800E-08 7.09711E-07 +3.2900E-08 7.69311E-07 +3.3000E-08 7.69311E-07 +3.3101E-08 8.28911E-07 +3.3115E-08 8.28911E-07 +3.3129E-08 8.28911E-07 +3.3143E-08 8.28911E-07 +3.3158E-08 8.28911E-07 +3.3172E-08 8.28911E-07 +3.3186E-08 8.28911E-07 +3.3200E-08 8.28911E-07 +3.3214E-08 8.28911E-07 +3.3229E-08 8.28911E-07 +3.3243E-08 8.28911E-07 +3.3258E-08 8.28911E-07 +3.3272E-08 8.28911E-07 +3.3287E-08 8.28911E-07 +3.3301E-08 8.28911E-07 +3.3315E-08 8.28911E-07 +3.3329E-08 8.28911E-07 +3.3343E-08 8.28911E-07 +3.3358E-08 8.28911E-07 +3.3372E-08 8.28911E-07 +3.3386E-08 8.28911E-07 +3.3400E-08 8.28911E-07 +3.3501E-08 8.28911E-07 +3.3601E-08 8.88511E-07 +3.3701E-08 8.88511E-07 +3.3801E-08 9.48111E-07 +3.3901E-08 9.48111E-07 +3.4001E-08 9.48111E-07 +3.4016E-08 9.48111E-07 +3.4030E-08 9.48111E-07 +3.4045E-08 9.48111E-07 +3.4059E-08 9.48111E-07 +3.4074E-08 9.48111E-07 +3.4088E-08 9.48111E-07 +3.4103E-08 9.48111E-07 +3.4201E-08 1.00781E-06 +3.4301E-08 1.00781E-06 +3.4401E-08 1.06741E-06 +3.4503E-08 1.06741E-06 +3.4600E-08 1.06741E-06 +3.4703E-08 1.06741E-06 +3.4717E-08 1.09051E-06 +3.4731E-08 1.10871E-06 +3.4745E-08 1.12211E-06 +3.4759E-08 1.13061E-06 +3.4773E-08 1.13431E-06 +3.4787E-08 1.13301E-06 +3.4801E-08 1.12701E-06 +3.4901E-08 1.12701E-06 +3.4916E-08 1.15011E-06 +3.4931E-08 1.16831E-06 +3.4946E-08 1.18171E-06 +3.4962E-08 1.19021E-06 +3.4977E-08 1.19391E-06 +3.4992E-08 1.19261E-06 +3.5007E-08 1.18661E-06 +3.5103E-08 1.18661E-06 +3.5201E-08 1.18661E-06 +3.5303E-08 1.24621E-06 +3.5401E-08 1.24621E-06 +3.5501E-08 1.30581E-06 +3.5600E-08 1.30581E-06 +3.5701E-08 1.30581E-06 +3.5800E-08 1.36541E-06 +3.5901E-08 1.36541E-06 +3.6000E-08 1.42501E-06 +3.6100E-08 1.42501E-06 +3.6200E-08 1.42501E-06 +3.6300E-08 1.48461E-06 +3.6400E-08 1.48461E-06 +3.6501E-08 1.54421E-06 +3.6600E-08 1.54421E-06 +3.6701E-08 1.54421E-06 +3.6800E-08 1.60381E-06 +3.6901E-08 1.60381E-06 +3.7000E-08 1.66341E-06 +3.7100E-08 1.66341E-06 +3.7129E-08 1.65731E-06 +3.7158E-08 1.65611E-06 +3.7187E-08 1.65981E-06 +3.7216E-08 1.66831E-06 +3.7245E-08 1.68161E-06 +3.7274E-08 1.69991E-06 +3.7303E-08 1.72301E-06 +3.7401E-08 1.72301E-06 +3.7416E-08 1.74611E-06 +3.7430E-08 1.76441E-06 +3.7445E-08 1.77771E-06 +3.7459E-08 1.78631E-06 +3.7474E-08 1.78991E-06 +3.7488E-08 1.78871E-06 +3.7503E-08 1.78261E-06 +3.7601E-08 1.78261E-06 +3.7630E-08 1.77651E-06 +3.7658E-08 1.77531E-06 +3.7687E-08 1.77901E-06 +3.7715E-08 1.78751E-06 +3.7744E-08 1.80091E-06 +3.7772E-08 1.81911E-06 +3.7801E-08 1.84221E-06 +3.7829E-08 1.83611E-06 +3.7858E-08 1.83491E-06 +3.7886E-08 1.83861E-06 +3.7915E-08 1.84711E-06 +3.7943E-08 1.86051E-06 +3.7972E-08 1.87871E-06 +3.8000E-08 1.90181E-06 +3.8101E-08 1.90181E-06 +3.8200E-08 1.90181E-06 +3.8301E-08 1.96141E-06 +3.8401E-08 1.96141E-06 +3.8416E-08 1.98451E-06 +3.8431E-08 2.00281E-06 +3.8446E-08 2.01621E-06 +3.8462E-08 2.02471E-06 +3.8477E-08 2.02831E-06 +3.8492E-08 2.02711E-06 +3.8507E-08 2.02101E-06 +3.8603E-08 2.02101E-06 +3.8701E-08 2.02101E-06 +3.8801E-08 2.08061E-06 +3.8900E-08 2.08061E-06 +3.9000E-08 2.14021E-06 +3.9101E-08 2.14021E-06 +3.9200E-08 2.14021E-06 +3.9235E-08 2.14021E-06 +3.9301E-08 2.19981E-06 +3.9315E-08 2.19981E-06 +3.9330E-08 2.19981E-06 +3.9344E-08 2.19981E-06 +3.9358E-08 2.19981E-06 +3.9372E-08 2.19981E-06 +3.9387E-08 2.19981E-06 +3.9401E-08 2.19981E-06 +3.9500E-08 2.25941E-06 +3.9600E-08 2.25941E-06 +3.9700E-08 2.25941E-06 +3.9800E-08 2.25941E-06 +3.9901E-08 2.31911E-06 +4.0000E-08 2.31911E-06 +4.0101E-08 2.37871E-06 +4.0200E-08 2.37871E-06 +4.0300E-08 2.37871E-06 +4.0314E-08 2.37871E-06 +4.0329E-08 2.37871E-06 +4.0343E-08 2.37871E-06 +4.0358E-08 2.37871E-06 +4.0372E-08 2.37871E-06 +4.0387E-08 2.37871E-06 +4.0401E-08 2.37871E-06 +4.0501E-08 2.43831E-06 +4.0601E-08 2.43831E-06 +4.0630E-08 2.46141E-06 +4.0658E-08 2.47961E-06 +4.0687E-08 2.49301E-06 +4.0715E-08 2.50151E-06 +4.0744E-08 2.50521E-06 +4.0772E-08 2.50401E-06 +4.0801E-08 2.49791E-06 +4.0815E-08 2.49791E-06 +4.0830E-08 2.49791E-06 +4.0844E-08 2.49791E-06 +4.0858E-08 2.49791E-06 +4.0872E-08 2.49791E-06 +4.0887E-08 2.49791E-06 +4.0901E-08 2.49791E-06 +4.1001E-08 2.49791E-06 +4.1101E-08 2.55751E-06 +4.1200E-08 2.55751E-06 +4.1301E-08 2.55751E-06 +4.1315E-08 2.58061E-06 +4.1330E-08 2.59881E-06 +4.1344E-08 2.61221E-06 +4.1358E-08 2.62071E-06 +4.1372E-08 2.62441E-06 +4.1387E-08 2.62321E-06 +4.1401E-08 2.61711E-06 +4.1416E-08 2.61711E-06 +4.1431E-08 2.61711E-06 +4.1446E-08 2.61711E-06 +4.1462E-08 2.61711E-06 +4.1477E-08 2.61711E-06 +4.1492E-08 2.61711E-06 +4.1507E-08 2.61711E-06 +4.1600E-08 2.61711E-06 +4.1614E-08 2.61711E-06 +4.1629E-08 2.61711E-06 +4.1643E-08 2.61711E-06 +4.1658E-08 2.61711E-06 +4.1672E-08 2.61711E-06 +4.1687E-08 2.61711E-06 +4.1701E-08 2.61711E-06 +4.1801E-08 2.61711E-06 +4.1901E-08 2.61711E-06 +4.2003E-08 2.67671E-06 +4.2101E-08 2.67671E-06 +4.2201E-08 2.67671E-06 +4.2301E-08 2.73631E-06 +4.2401E-08 2.73631E-06 +4.2501E-08 2.73631E-06 +4.2600E-08 2.73631E-06 +4.2615E-08 2.73631E-06 +4.2629E-08 2.73631E-06 +4.2644E-08 2.73631E-06 +4.2659E-08 2.73631E-06 +4.2674E-08 2.73631E-06 +4.2688E-08 2.73631E-06 +4.2703E-08 2.73631E-06 +4.2801E-08 2.73631E-06 +4.2901E-08 2.73631E-06 +4.3000E-08 2.73631E-06 +4.3101E-08 2.73631E-06 +4.3200E-08 2.73631E-06 +4.3301E-08 2.73631E-06 +4.3401E-08 2.73631E-06 +4.3501E-08 2.73631E-06 +4.3601E-08 2.73631E-06 +4.3701E-08 2.73631E-06 +4.3801E-08 2.73631E-06 +4.3901E-08 2.73631E-06 +4.3915E-08 2.73631E-06 +4.3929E-08 2.73631E-06 +4.3943E-08 2.73631E-06 +4.3958E-08 2.73631E-06 +4.3972E-08 2.73631E-06 +4.3986E-08 2.73631E-06 +4.4000E-08 2.73631E-06 +4.4101E-08 2.73631E-06 +4.4200E-08 2.73631E-06 +4.4300E-08 2.73631E-06 +4.4403E-08 2.73631E-06 +4.4501E-08 2.73631E-06 +4.4600E-08 2.67671E-06 +4.4701E-08 2.67671E-06 +4.4800E-08 2.67671E-06 +4.4901E-08 2.61711E-06 +4.4920E-08 2.61711E-06 +4.4939E-08 2.61711E-06 +4.4958E-08 2.61711E-06 +4.4978E-08 2.61711E-06 +4.4997E-08 2.61711E-06 +4.5016E-08 2.61711E-06 +4.5035E-08 2.61711E-06 +4.5058E-08 2.61711E-06 +4.5081E-08 2.61711E-06 +4.5104E-08 2.61711E-06 +4.5126E-08 2.61711E-06 +4.5149E-08 2.61711E-06 +4.5172E-08 2.61711E-06 +4.5195E-08 2.61711E-06 +4.5200E-08 2.61711E-06 +4.5301E-08 2.61711E-06 +4.5400E-08 2.55751E-06 +4.5429E-08 2.56361E-06 +4.5457E-08 2.56481E-06 +4.5486E-08 2.56111E-06 +4.5514E-08 2.55261E-06 +4.5543E-08 2.53921E-06 +4.5571E-08 2.52101E-06 +4.5600E-08 2.49791E-06 +4.5614E-08 2.49791E-06 +4.5627E-08 2.49791E-06 +4.5641E-08 2.49791E-06 +4.5654E-08 2.49791E-06 +4.5668E-08 2.49791E-06 +4.5681E-08 2.49791E-06 +4.5695E-08 2.49791E-06 +4.5700E-08 2.49791E-06 +4.5800E-08 2.49791E-06 +4.5814E-08 2.50401E-06 +4.5829E-08 2.50521E-06 +4.5843E-08 2.50151E-06 +4.5857E-08 2.49301E-06 +4.5871E-08 2.47961E-06 +4.5886E-08 2.46141E-06 +4.5900E-08 2.43831E-06 +4.6000E-08 2.43831E-06 +4.6103E-08 2.37871E-06 +4.6200E-08 2.37871E-06 +4.6300E-08 2.31911E-06 +4.6400E-08 2.31911E-06 +4.6500E-08 2.25941E-06 +4.6514E-08 2.25941E-06 +4.6529E-08 2.25941E-06 +4.6543E-08 2.25941E-06 +4.6557E-08 2.25941E-06 +4.6571E-08 2.25941E-06 +4.6586E-08 2.25941E-06 +4.6600E-08 2.25941E-06 +4.6701E-08 2.19981E-06 +4.6800E-08 2.14021E-06 +4.6903E-08 2.14021E-06 +4.7000E-08 2.08061E-06 +4.7103E-08 2.02101E-06 +4.7107E-08 2.02101E-06 +4.7201E-08 2.02101E-06 +4.7301E-08 1.96141E-06 +4.7400E-08 1.90181E-06 +4.7501E-08 1.90181E-06 +4.7600E-08 1.84221E-06 +4.7703E-08 1.78261E-06 +4.7717E-08 1.78871E-06 +4.7731E-08 1.78991E-06 +4.7745E-08 1.78631E-06 +4.7759E-08 1.77771E-06 +4.7773E-08 1.76441E-06 +4.7787E-08 1.74611E-06 +4.7801E-08 1.72301E-06 +4.7901E-08 1.66341E-06 +4.8001E-08 1.66341E-06 +4.8015E-08 1.64641E-06 +4.8030E-08 1.62931E-06 +4.8044E-08 1.61231E-06 +4.8058E-08 1.59531E-06 +4.8072E-08 1.57831E-06 +4.8087E-08 1.56121E-06 +4.8101E-08 1.54421E-06 +4.8201E-08 1.54421E-06 +4.8300E-08 1.48461E-06 +4.8401E-08 1.42501E-06 +4.8415E-08 1.40191E-06 +4.8430E-08 1.38361E-06 +4.8444E-08 1.37021E-06 +4.8458E-08 1.36171E-06 +4.8472E-08 1.35811E-06 +4.8487E-08 1.35931E-06 +4.8501E-08 1.36541E-06 +4.8530E-08 1.34841E-06 +4.8559E-08 1.33131E-06 +4.8588E-08 1.31431E-06 +4.8616E-08 1.29731E-06 +4.8645E-08 1.28021E-06 +4.8674E-08 1.26321E-06 +4.8703E-08 1.24621E-06 +4.8801E-08 1.18661E-06 +4.8903E-08 1.12701E-06 +4.9000E-08 1.06741E-06 +4.9100E-08 1.00781E-06 +4.9201E-08 9.48111E-07 +4.9303E-08 8.28911E-07 +4.9401E-08 7.69311E-07 +4.9500E-08 7.09711E-07 +4.9607E-08 6.50111E-07 +4.9621E-08 6.27011E-07 +4.9636E-08 6.08811E-07 +4.9650E-08 5.95411E-07 +4.9664E-08 5.86911E-07 +4.9678E-08 5.83211E-07 +4.9693E-08 5.84411E-07 +4.9707E-08 5.90511E-07 +4.9800E-08 4.71311E-07 +4.9901E-08 4.11711E-07 +5.0000E-08 3.52111E-07 +5.0029E-08 3.35111E-07 +5.0058E-08 3.18011E-07 +5.0087E-08 3.01011E-07 +5.0116E-08 2.84011E-07 +5.0145E-08 2.67011E-07 +5.0174E-08 2.49911E-07 +5.0203E-08 2.32911E-07 +5.0301E-08 1.13711E-07 +5.0401E-08 5.41105E-08 +5.0501E-08 -5.48947E-09 +5.0601E-08 -1.24689E-07 +5.0701E-08 -1.84289E-07 +5.0800E-08 -2.43889E-07 +5.0901E-08 -3.63189E-07 +5.1000E-08 -4.82389E-07 +5.1101E-08 -5.41989E-07 +5.1200E-08 -6.01589E-07 +5.1300E-08 -7.20789E-07 +5.1400E-08 -8.39989E-07 +5.1429E-08 -8.56989E-07 +5.1457E-08 -8.74089E-07 +5.1486E-08 -8.91089E-07 +5.1514E-08 -9.08089E-07 +5.1543E-08 -9.25089E-07 +5.1571E-08 -9.42189E-07 +5.1600E-08 -9.59189E-07 +5.1707E-08 -1.07839E-06 +5.1800E-08 -1.19759E-06 +5.1900E-08 -1.25719E-06 +5.2000E-08 -1.37639E-06 +5.2101E-08 -1.43599E-06 +5.2124E-08 -1.47619E-06 +5.2148E-08 -1.51149E-06 +5.2171E-08 -1.54189E-06 +5.2195E-08 -1.56739E-06 +5.2218E-08 -1.58809E-06 +5.2242E-08 -1.60389E-06 +5.2265E-08 -1.61489E-06 +5.2284E-08 -1.62579E-06 +5.2304E-08 -1.64159E-06 +5.2323E-08 -1.66229E-06 +5.2343E-08 -1.68779E-06 +5.2362E-08 -1.71819E-06 +5.2382E-08 -1.75349E-06 +5.2401E-08 -1.79369E-06 +5.2507E-08 -1.85329E-06 +5.2603E-08 -1.97249E-06 +5.2701E-08 -2.03209E-06 +5.2801E-08 -2.15129E-06 +5.2829E-08 -2.18539E-06 +5.2858E-08 -2.21939E-06 +5.2886E-08 -2.25349E-06 +5.2915E-08 -2.28749E-06 +5.2943E-08 -2.32159E-06 +5.2972E-08 -2.35569E-06 +5.3000E-08 -2.38969E-06 +5.3015E-08 -2.38359E-06 +5.3029E-08 -2.38239E-06 +5.3044E-08 -2.38609E-06 +5.3059E-08 -2.39459E-06 +5.3074E-08 -2.40799E-06 +5.3088E-08 -2.42619E-06 +5.3103E-08 -2.44929E-06 +5.3200E-08 -2.56849E-06 +5.3301E-08 -2.68769E-06 +5.3401E-08 -2.74729E-06 +5.3416E-08 -2.79359E-06 +5.3431E-08 -2.83009E-06 +5.3446E-08 -2.85679E-06 +5.3462E-08 -2.87379E-06 +5.3477E-08 -2.88109E-06 +5.3492E-08 -2.87869E-06 +5.3507E-08 -2.86649E-06 +5.3601E-08 -2.98579E-06 +5.3707E-08 -3.10499E-06 +5.3801E-08 -3.22419E-06 +5.3813E-08 -3.21809E-06 +5.3825E-08 -3.21689E-06 +5.3837E-08 -3.22049E-06 +5.3849E-08 -3.22899E-06 +5.3861E-08 -3.24239E-06 +5.3873E-08 -3.26069E-06 +5.3885E-08 -3.28379E-06 +5.3902E-08 -3.30079E-06 +5.3918E-08 -3.31779E-06 +5.3935E-08 -3.33489E-06 +5.3951E-08 -3.35189E-06 +5.3968E-08 -3.36889E-06 +5.3984E-08 -3.38599E-06 +5.4001E-08 -3.40299E-06 +5.4015E-08 -3.41999E-06 +5.4030E-08 -3.43709E-06 +5.4044E-08 -3.45409E-06 +5.4058E-08 -3.47109E-06 +5.4072E-08 -3.48809E-06 +5.4087E-08 -3.50519E-06 +5.4101E-08 -3.52219E-06 +5.4112E-08 -3.54529E-06 +5.4122E-08 -3.56359E-06 +5.4133E-08 -3.57689E-06 +5.4143E-08 -3.58549E-06 +5.4154E-08 -3.58909E-06 +5.4164E-08 -3.58789E-06 +5.4175E-08 -3.58179E-06 +5.4200E-08 -3.58179E-06 +5.4301E-08 -3.70099E-06 +5.4400E-08 -3.82019E-06 +5.4500E-08 -3.93939E-06 +5.4600E-08 -4.05859E-06 +5.4700E-08 -4.11819E-06 +5.4800E-08 -4.23749E-06 +5.4900E-08 -4.35669E-06 +5.5000E-08 -4.41629E-06 +5.5101E-08 -4.53549E-06 +5.5200E-08 -4.65469E-06 +5.5215E-08 -4.67169E-06 +5.5229E-08 -4.68869E-06 +5.5244E-08 -4.70579E-06 +5.5259E-08 -4.72279E-06 +5.5274E-08 -4.73979E-06 +5.5288E-08 -4.75689E-06 +5.5303E-08 -4.77389E-06 +5.5400E-08 -4.89309E-06 +5.5501E-08 -5.01229E-06 +5.5600E-08 -5.07189E-06 +5.5701E-08 -5.19109E-06 +5.5801E-08 -5.31029E-06 +5.5816E-08 -5.32739E-06 +5.5831E-08 -5.34439E-06 +5.5846E-08 -5.36139E-06 +5.5862E-08 -5.37849E-06 +5.5877E-08 -5.39549E-06 +5.5892E-08 -5.41249E-06 +5.5907E-08 -5.42949E-06 +5.5920E-08 -5.45269E-06 +5.5934E-08 -5.47089E-06 +5.5947E-08 -5.48429E-06 +5.5961E-08 -5.49279E-06 +5.5974E-08 -5.49649E-06 +5.5988E-08 -5.49519E-06 +5.6001E-08 -5.48919E-06 +5.6101E-08 -5.60839E-06 +5.6201E-08 -5.72759E-06 +5.6300E-08 -5.84679E-06 +5.6400E-08 -5.96599E-06 +5.6414E-08 -5.95989E-06 +5.6429E-08 -5.95869E-06 +5.6443E-08 -5.96229E-06 +5.6457E-08 -5.97089E-06 +5.6471E-08 -5.98419E-06 +5.6486E-08 -6.00249E-06 +5.6500E-08 -6.02559E-06 +5.6601E-08 -6.14479E-06 +5.6707E-08 -6.26399E-06 +5.6800E-08 -6.32359E-06 +5.6907E-08 -6.44279E-06 +5.7001E-08 -6.56199E-06 +5.7017E-08 -6.57909E-06 +5.7034E-08 -6.59609E-06 +5.7050E-08 -6.61309E-06 +5.7066E-08 -6.63019E-06 +5.7082E-08 -6.64719E-06 +5.7099E-08 -6.66419E-06 +5.7115E-08 -6.68119E-06 +5.7203E-08 -6.80049E-06 +5.7231E-08 -6.81139E-06 +5.7259E-08 -6.82719E-06 +5.7287E-08 -6.84789E-06 +5.7316E-08 -6.87339E-06 +5.7344E-08 -6.90389E-06 +5.7372E-08 -6.93909E-06 +5.7400E-08 -6.97929E-06 +5.7415E-08 -6.99629E-06 +5.7431E-08 -7.01329E-06 +5.7446E-08 -7.03039E-06 +5.7461E-08 -7.04739E-06 +5.7476E-08 -7.06439E-06 +5.7492E-08 -7.08139E-06 +5.7507E-08 -7.09849E-06 +5.7600E-08 -7.15809E-06 +5.7615E-08 -7.20429E-06 +5.7631E-08 -7.24079E-06 +5.7646E-08 -7.26759E-06 +5.7661E-08 -7.28459E-06 +5.7676E-08 -7.29189E-06 +5.7692E-08 -7.28949E-06 +5.7707E-08 -7.27729E-06 +5.7800E-08 -7.39649E-06 +5.7901E-08 -7.51569E-06 +5.8000E-08 -7.57529E-06 +5.8101E-08 -7.69449E-06 +5.8115E-08 -7.71759E-06 +5.8129E-08 -7.73589E-06 +5.8143E-08 -7.74929E-06 +5.8158E-08 -7.75779E-06 +5.8172E-08 -7.76139E-06 +5.8186E-08 -7.76019E-06 +5.8200E-08 -7.75409E-06 +5.8219E-08 -7.80039E-06 +5.8239E-08 -7.83679E-06 +5.8258E-08 -7.86359E-06 +5.8277E-08 -7.88059E-06 +5.8296E-08 -7.88789E-06 +5.8316E-08 -7.88549E-06 +5.8335E-08 -7.87329E-06 +5.8400E-08 -7.99249E-06 +5.8501E-08 -8.05219E-06 +5.8600E-08 -8.17139E-06 +5.8701E-08 -8.23099E-06 +5.8800E-08 -8.35019E-06 +5.8901E-08 -8.46939E-06 +5.9000E-08 -8.52899E-06 +5.9100E-08 -8.58859E-06 +5.9203E-08 -8.70779E-06 +5.9231E-08 -8.74789E-06 +5.9260E-08 -8.78319E-06 +5.9288E-08 -8.81359E-06 +5.9316E-08 -8.83919E-06 +5.9344E-08 -8.85989E-06 +5.9373E-08 -8.87569E-06 +5.9401E-08 -8.88659E-06 +5.9429E-08 -8.89759E-06 +5.9458E-08 -8.91339E-06 +5.9486E-08 -8.93409E-06 +5.9515E-08 -8.95959E-06 +5.9543E-08 -8.98999E-06 +5.9572E-08 -9.02529E-06 +5.9600E-08 -9.06539E-06 +5.9701E-08 -9.12499E-06 +5.9800E-08 -9.24419E-06 +5.9901E-08 -9.30389E-06 +6.0001E-08 -9.42309E-06 +6.0029E-08 -9.44009E-06 +6.0058E-08 -9.45709E-06 +6.0086E-08 -9.47419E-06 +6.0115E-08 -9.49119E-06 +6.0143E-08 -9.50819E-06 +6.0172E-08 -9.52519E-06 +6.0200E-08 -9.54229E-06 +6.0300E-08 -9.66149E-06 +6.0400E-08 -9.72109E-06 +6.0501E-08 -9.78069E-06 +6.0516E-08 -9.79769E-06 +6.0530E-08 -9.81469E-06 +6.0545E-08 -9.83179E-06 +6.0559E-08 -9.84879E-06 +6.0574E-08 -9.86579E-06 +6.0588E-08 -9.88289E-06 +6.0603E-08 -9.89989E-06 +6.0700E-08 -9.89989E-06 +6.0800E-08 -1.00191E-05 +6.0829E-08 -1.00361E-05 +6.0857E-08 -1.00532E-05 +6.0886E-08 -1.00702E-05 +6.0914E-08 -1.00872E-05 +6.0943E-08 -1.01043E-05 +6.0971E-08 -1.01213E-05 +6.1000E-08 -1.01383E-05 +6.1100E-08 -1.01979E-05 +6.1201E-08 -1.02575E-05 +6.1303E-08 -1.03767E-05 +6.1400E-08 -1.03767E-05 +6.1429E-08 -1.04169E-05 +6.1457E-08 -1.04522E-05 +6.1486E-08 -1.04826E-05 +6.1514E-08 -1.05081E-05 +6.1543E-08 -1.05288E-05 +6.1571E-08 -1.05446E-05 +6.1600E-08 -1.05555E-05 +6.1701E-08 -1.06152E-05 +6.1803E-08 -1.06748E-05 +6.1903E-08 -1.07344E-05 +6.2000E-08 -1.0794E-05 +6.2103E-08 -1.08536E-05 +6.2200E-08 -1.08536E-05 +6.2212E-08 -1.08767E-05 +6.2224E-08 -1.08949E-05 +6.2236E-08 -1.09083E-05 +6.2249E-08 -1.09168E-05 +6.2261E-08 -1.09205E-05 +6.2273E-08 -1.09193E-05 +6.2285E-08 -1.09132E-05 +6.2301E-08 -1.09728E-05 +6.2315E-08 -1.09728E-05 +6.2329E-08 -1.09728E-05 +6.2343E-08 -1.09728E-05 +6.2358E-08 -1.09728E-05 +6.2372E-08 -1.09728E-05 +6.2386E-08 -1.09728E-05 +6.2400E-08 -1.09728E-05 +6.2501E-08 -1.10324E-05 +6.2600E-08 -1.1092E-05 +6.2703E-08 -1.1092E-05 +6.2800E-08 -1.11516E-05 +6.2875E-08 -1.12112E-05 +6.2901E-08 -1.12112E-05 +6.3000E-08 -1.12112E-05 +6.3029E-08 -1.12282E-05 +6.3057E-08 -1.12453E-05 +6.3086E-08 -1.12623E-05 +6.3114E-08 -1.12793E-05 +6.3143E-08 -1.12963E-05 +6.3171E-08 -1.13134E-05 +6.3200E-08 -1.13304E-05 +6.3303E-08 -1.13304E-05 +6.3400E-08 -1.139E-05 +6.3500E-08 -1.14496E-05 +6.3600E-08 -1.14496E-05 +6.3701E-08 -1.14496E-05 +6.3800E-08 -1.15092E-05 +6.3900E-08 -1.15688E-05 +6.4000E-08 -1.15688E-05 +6.4100E-08 -1.15688E-05 +6.4203E-08 -1.16284E-05 +6.4301E-08 -1.16284E-05 +6.4403E-08 -1.1688E-05 +6.4431E-08 -1.1688E-05 +6.4459E-08 -1.1688E-05 +6.4487E-08 -1.1688E-05 +6.4516E-08 -1.1688E-05 +6.4544E-08 -1.1688E-05 +6.4572E-08 -1.1688E-05 +6.4600E-08 -1.1688E-05 +6.4700E-08 -1.1688E-05 +6.4800E-08 -1.1688E-05 +6.4901E-08 -1.17476E-05 +6.5001E-08 -1.17476E-05 +6.5101E-08 -1.17476E-05 +6.5201E-08 -1.18072E-05 +6.5300E-08 -1.18072E-05 +6.5400E-08 -1.18072E-05 +6.5500E-08 -1.18072E-05 +6.5515E-08 -1.18072E-05 +6.5531E-08 -1.18072E-05 +6.5546E-08 -1.18072E-05 +6.5561E-08 -1.18072E-05 +6.5576E-08 -1.18072E-05 +6.5592E-08 -1.18072E-05 +6.5607E-08 -1.18072E-05 +6.5700E-08 -1.18072E-05 +6.5800E-08 -1.18072E-05 +6.5901E-08 -1.18072E-05 +6.6001E-08 -1.18072E-05 +6.6100E-08 -1.18072E-05 +6.6115E-08 -1.18072E-05 +6.6129E-08 -1.18072E-05 +6.6144E-08 -1.18072E-05 +6.6159E-08 -1.18072E-05 +6.6174E-08 -1.18072E-05 +6.6188E-08 -1.18072E-05 +6.6203E-08 -1.18072E-05 +6.6301E-08 -1.18072E-05 +6.6316E-08 -1.18072E-05 +6.6330E-08 -1.18072E-05 +6.6345E-08 -1.18072E-05 +6.6359E-08 -1.18072E-05 +6.6374E-08 -1.18072E-05 +6.6388E-08 -1.18072E-05 +6.6403E-08 -1.18072E-05 +6.6417E-08 -1.18133E-05 +6.6431E-08 -1.18145E-05 +6.6445E-08 -1.18109E-05 +6.6459E-08 -1.18024E-05 +6.6473E-08 -1.1789E-05 +6.6487E-08 -1.17708E-05 +6.6501E-08 -1.17476E-05 +6.6601E-08 -1.17476E-05 +6.6615E-08 -1.17476E-05 +6.6630E-08 -1.17476E-05 +6.6644E-08 -1.17476E-05 +6.6658E-08 -1.17476E-05 +6.6672E-08 -1.17476E-05 +6.6687E-08 -1.17476E-05 +6.6701E-08 -1.17476E-05 +6.6800E-08 -1.17476E-05 +6.6829E-08 -1.17245E-05 +6.6857E-08 -1.17063E-05 +6.6886E-08 -1.16929E-05 +6.6914E-08 -1.16844E-05 +6.6943E-08 -1.16807E-05 +6.6971E-08 -1.1682E-05 +6.7000E-08 -1.1688E-05 +6.7101E-08 -1.1688E-05 +6.7200E-08 -1.1688E-05 +6.7301E-08 -1.16284E-05 +6.7401E-08 -1.16284E-05 +6.7500E-08 -1.15688E-05 +6.7603E-08 -1.15688E-05 +6.7703E-08 -1.15688E-05 +6.7801E-08 -1.15092E-05 +6.7816E-08 -1.15153E-05 +6.7831E-08 -1.15165E-05 +6.7846E-08 -1.15129E-05 +6.7862E-08 -1.15044E-05 +6.7877E-08 -1.1491E-05 +6.7892E-08 -1.14727E-05 +6.7907E-08 -1.14496E-05 +6.8000E-08 -1.14496E-05 +6.8029E-08 -1.14557E-05 +6.8057E-08 -1.14569E-05 +6.8086E-08 -1.14533E-05 +6.8115E-08 -1.14448E-05 +6.8144E-08 -1.14314E-05 +6.8172E-08 -1.14131E-05 +6.8201E-08 -1.139E-05 +6.8216E-08 -1.13669E-05 +6.8230E-08 -1.13487E-05 +6.8245E-08 -1.13353E-05 +6.8259E-08 -1.13268E-05 +6.8274E-08 -1.13231E-05 +6.8288E-08 -1.13243E-05 +6.8303E-08 -1.13304E-05 +6.8317E-08 -1.13304E-05 +6.8331E-08 -1.13304E-05 +6.8345E-08 -1.13304E-05 +6.8359E-08 -1.13304E-05 +6.8373E-08 -1.13304E-05 +6.8387E-08 -1.13304E-05 +6.8401E-08 -1.13304E-05 +6.8416E-08 -1.13365E-05 +6.8430E-08 -1.13377E-05 +6.8445E-08 -1.13341E-05 +6.8459E-08 -1.13255E-05 +6.8474E-08 -1.13122E-05 +6.8488E-08 -1.12939E-05 +6.8503E-08 -1.12708E-05 +6.8603E-08 -1.12112E-05 +6.8701E-08 -1.12112E-05 +6.8730E-08 -1.11942E-05 +6.8759E-08 -1.11771E-05 +6.8788E-08 -1.11601E-05 +6.8816E-08 -1.11431E-05 +6.8845E-08 -1.11261E-05 +6.8874E-08 -1.1109E-05 +6.8903E-08 -1.1092E-05 +6.8917E-08 -1.1092E-05 +6.8932E-08 -1.1092E-05 +6.8946E-08 -1.1092E-05 +6.8960E-08 -1.1092E-05 +6.8974E-08 -1.1092E-05 +6.8989E-08 -1.1092E-05 +6.9003E-08 -1.1092E-05 +6.9043E-08 -1.10518E-05 +6.9084E-08 -1.10166E-05 +6.9124E-08 -1.09862E-05 +6.9164E-08 -1.09606E-05 +6.9204E-08 -1.09399E-05 +6.9245E-08 -1.09241E-05 +6.9285E-08 -1.09132E-05 +6.9301E-08 -1.09132E-05 +6.9400E-08 -1.08536E-05 +6.9501E-08 -1.08536E-05 +6.9515E-08 -1.08365E-05 +6.9530E-08 -1.08195E-05 +6.9544E-08 -1.08025E-05 +6.9558E-08 -1.07855E-05 +6.9572E-08 -1.07684E-05 +6.9587E-08 -1.07514E-05 +6.9601E-08 -1.07344E-05 +6.9616E-08 -1.07344E-05 +6.9631E-08 -1.07344E-05 +6.9646E-08 -1.07344E-05 +6.9662E-08 -1.07344E-05 +6.9677E-08 -1.07344E-05 +6.9692E-08 -1.07344E-05 +6.9707E-08 -1.07344E-05 +6.9800E-08 -1.06748E-05 +6.9901E-08 -1.06152E-05 +7.0001E-08 -1.05555E-05 +7.0103E-08 -1.04959E-05 +7.0201E-08 -1.04363E-05 +7.0303E-08 -1.03767E-05 +7.0400E-08 -1.03171E-05 +7.0415E-08 -1.0294E-05 +7.0431E-08 -1.02758E-05 +7.0446E-08 -1.02624E-05 +7.0461E-08 -1.02539E-05 +7.0476E-08 -1.02502E-05 +7.0492E-08 -1.02514E-05 +7.0507E-08 -1.02575E-05 +7.0520E-08 -1.02344E-05 +7.0534E-08 -1.02162E-05 +7.0547E-08 -1.02028E-05 +7.0561E-08 -1.01943E-05 +7.0574E-08 -1.01906E-05 +7.0588E-08 -1.01918E-05 +7.0601E-08 -1.01979E-05 +7.0614E-08 -1.01748E-05 +7.0628E-08 -1.01566E-05 +7.0641E-08 -1.01432E-05 +7.0655E-08 -1.01347E-05 +7.0668E-08 -1.0131E-05 +7.0682E-08 -1.01322E-05 +7.0695E-08 -1.01383E-05 +7.0745E-08 -1.00787E-05 +7.0803E-08 -1.00191E-05 +7.0817E-08 -1.00191E-05 +7.0832E-08 -1.00191E-05 +7.0846E-08 -1.00191E-05 +7.0860E-08 -1.00191E-05 +7.0874E-08 -1.00191E-05 +7.0889E-08 -1.00191E-05 +7.0903E-08 -1.00191E-05 +7.1001E-08 -9.89989E-06 +7.1030E-08 -9.88289E-06 +7.1060E-08 -9.86579E-06 +7.1089E-08 -9.84879E-06 +7.1119E-08 -9.83179E-06 +7.1148E-08 -9.81469E-06 +7.1178E-08 -9.79769E-06 +7.1207E-08 -9.78069E-06 +7.1301E-08 -9.72109E-06 +7.1316E-08 -9.69799E-06 +7.1330E-08 -9.67969E-06 +7.1345E-08 -9.66629E-06 +7.1359E-08 -9.65779E-06 +7.1374E-08 -9.65419E-06 +7.1388E-08 -9.65539E-06 +7.1403E-08 -9.66149E-06 +7.1503E-08 -9.54229E-06 +7.1600E-08 -9.48269E-06 +7.1701E-08 -9.42309E-06 +7.1800E-08 -9.30389E-06 +7.1903E-08 -9.24419E-06 +7.2000E-08 -9.18459E-06 +7.2029E-08 -9.14449E-06 +7.2057E-08 -9.10919E-06 +7.2086E-08 -9.07879E-06 +7.2114E-08 -9.05329E-06 +7.2143E-08 -9.03259E-06 +7.2171E-08 -9.01679E-06 +7.2200E-08 -9.00579E-06 +7.2301E-08 -8.94619E-06 +7.2400E-08 -8.82699E-06 +7.2415E-08 -8.83309E-06 +7.2429E-08 -8.83429E-06 +7.2444E-08 -8.83069E-06 +7.2459E-08 -8.82209E-06 +7.2474E-08 -8.80879E-06 +7.2488E-08 -8.79049E-06 +7.2503E-08 -8.76739E-06 +7.2601E-08 -8.70779E-06 +7.2701E-08 -8.58859E-06 +7.2800E-08 -8.52899E-06 +7.2901E-08 -8.46939E-06 +7.2915E-08 -8.42319E-06 +7.2929E-08 -8.38669E-06 +7.2943E-08 -8.35989E-06 +7.2958E-08 -8.34289E-06 +7.2972E-08 -8.33559E-06 +7.2986E-08 -8.33799E-06 +7.3000E-08 -8.35019E-06 +7.3014E-08 -8.33309E-06 +7.3029E-08 -8.31609E-06 +7.3043E-08 -8.29909E-06 +7.3058E-08 -8.28209E-06 +7.3072E-08 -8.26499E-06 +7.3087E-08 -8.24799E-06 +7.3101E-08 -8.23099E-06 +7.3200E-08 -8.17139E-06 +7.3301E-08 -8.05219E-06 +7.3400E-08 -7.99249E-06 +7.3415E-08 -7.97549E-06 +7.3431E-08 -7.95849E-06 +7.3446E-08 -7.94149E-06 +7.3461E-08 -7.92439E-06 +7.3476E-08 -7.90739E-06 +7.3492E-08 -7.89039E-06 +7.3507E-08 -7.87329E-06 +7.3601E-08 -7.75409E-06 +7.3630E-08 -7.73709E-06 +7.3658E-08 -7.72009E-06 +7.3687E-08 -7.70299E-06 +7.3715E-08 -7.68599E-06 +7.3744E-08 -7.66899E-06 +7.3772E-08 -7.65199E-06 +7.3801E-08 -7.63489E-06 +7.3830E-08 -7.60089E-06 +7.3858E-08 -7.56679E-06 +7.3887E-08 -7.53269E-06 +7.3915E-08 -7.49869E-06 +7.3944E-08 -7.46459E-06 +7.3972E-08 -7.43059E-06 +7.4001E-08 -7.39649E-06 +7.4016E-08 -7.37949E-06 +7.4031E-08 -7.36239E-06 +7.4046E-08 -7.34539E-06 +7.4062E-08 -7.32839E-06 +7.4077E-08 -7.31139E-06 +7.4092E-08 -7.29429E-06 +7.4107E-08 -7.27729E-06 +7.4201E-08 -7.21769E-06 +7.4303E-08 -7.09849E-06 +7.4318E-08 -7.07539E-06 +7.4333E-08 -7.05709E-06 +7.4348E-08 -7.04369E-06 +7.4362E-08 -7.03519E-06 +7.4377E-08 -7.03159E-06 +7.4392E-08 -7.03279E-06 +7.4407E-08 -7.03889E-06 +7.4501E-08 -6.91969E-06 +7.4515E-08 -6.90259E-06 +7.4530E-08 -6.88559E-06 +7.4544E-08 -6.86859E-06 +7.4558E-08 -6.85149E-06 +7.4572E-08 -6.83449E-06 +7.4587E-08 -6.81749E-06 +7.4601E-08 -6.80049E-06 +7.4616E-08 -6.78339E-06 +7.4631E-08 -6.76639E-06 +7.4646E-08 -6.74939E-06 +7.4662E-08 -6.73229E-06 +7.4677E-08 -6.71529E-06 +7.4692E-08 -6.69829E-06 +7.4707E-08 -6.68119E-06 +7.4800E-08 -6.56199E-06 +7.4915E-08 -6.44279E-06 +7.5000E-08 -6.38319E-06 +7.5029E-08 -6.37229E-06 +7.5057E-08 -6.35649E-06 +7.5086E-08 -6.33579E-06 +7.5114E-08 -6.31019E-06 +7.5143E-08 -6.27979E-06 +7.5171E-08 -6.24459E-06 +7.5200E-08 -6.20439E-06 +7.5303E-08 -6.08519E-06 +7.5401E-08 -5.96599E-06 +7.5503E-08 -5.84679E-06 +7.5600E-08 -5.72759E-06 +7.5700E-08 -5.60839E-06 +7.5803E-08 -5.48919E-06 +7.5900E-08 -5.42949E-06 +7.6000E-08 -5.31029E-06 +7.6101E-08 -5.19109E-06 +7.6201E-08 -5.07189E-06 +7.6303E-08 -4.95269E-06 +7.6401E-08 -4.83349E-06 +7.6503E-08 -4.71429E-06 +7.6518E-08 -4.69729E-06 +7.6533E-08 -4.68019E-06 +7.6548E-08 -4.66319E-06 +7.6562E-08 -4.64619E-06 +7.6577E-08 -4.62909E-06 +7.6592E-08 -4.61209E-06 +7.6607E-08 -4.59509E-06 +7.6635E-08 -4.58409E-06 +7.6662E-08 -4.56829E-06 +7.6690E-08 -4.54759E-06 +7.6717E-08 -4.52209E-06 +7.6745E-08 -4.49169E-06 +7.6772E-08 -4.45639E-06 +7.6800E-08 -4.41629E-06 +7.6829E-08 -4.38219E-06 +7.6858E-08 -4.34819E-06 +7.6887E-08 -4.31409E-06 +7.6916E-08 -4.27999E-06 +7.6945E-08 -4.24599E-06 +7.6974E-08 -4.21189E-06 +7.7003E-08 -4.17789E-06 +7.7032E-08 -4.14379E-06 +7.7060E-08 -4.10969E-06 +7.7089E-08 -4.07569E-06 +7.7117E-08 -4.04159E-06 +7.7146E-08 -4.00759E-06 +7.7174E-08 -3.97349E-06 +7.7203E-08 -3.93939E-06 +7.7223E-08 -3.90539E-06 +7.7244E-08 -3.87129E-06 +7.7264E-08 -3.83729E-06 +7.7284E-08 -3.80319E-06 +7.7304E-08 -3.76909E-06 +7.7325E-08 -3.73509E-06 +7.7345E-08 -3.70099E-06 +7.7368E-08 -3.68399E-06 +7.7391E-08 -3.66699E-06 +7.7414E-08 -3.64989E-06 +7.7438E-08 -3.63289E-06 +7.7461E-08 -3.61589E-06 +7.7484E-08 -3.59879E-06 +7.7507E-08 -3.58179E-06 +7.7522E-08 -3.54169E-06 +7.7538E-08 -3.50639E-06 +7.7553E-08 -3.47599E-06 +7.7569E-08 -3.45039E-06 +7.7584E-08 -3.42979E-06 +7.7600E-08 -3.41389E-06 +7.7615E-08 -3.40299E-06 +7.7645E-08 -3.39809E-06 +7.7675E-08 -3.38349E-06 +7.7705E-08 -3.35919E-06 +7.7735E-08 -3.32509E-06 +7.7765E-08 -3.28129E-06 +7.7795E-08 -3.22779E-06 +7.7825E-08 -3.16459E-06 +7.7851E-08 -3.13049E-06 +7.7877E-08 -3.09649E-06 +7.7903E-08 -3.06239E-06 +7.7929E-08 -3.02829E-06 +7.7955E-08 -2.99429E-06 +7.7981E-08 -2.96019E-06 +7.8007E-08 -2.92619E-06 +7.8044E-08 -2.86899E-06 +7.8081E-08 -2.81669E-06 +7.8118E-08 -2.76919E-06 +7.8154E-08 -2.72669E-06 +7.8191E-08 -2.68899E-06 +7.8228E-08 -2.65609E-06 +7.8265E-08 -2.62809E-06 +7.8314E-08 -2.55389E-06 +7.8363E-08 -2.48459E-06 +7.8412E-08 -2.42009E-06 +7.8460E-08 -2.36049E-06 +7.8509E-08 -2.30579E-06 +7.8558E-08 -2.25589E-06 +7.8607E-08 -2.21089E-06 +7.8615E-08 -2.15129E-06 +7.8644E-08 -2.14639E-06 +7.8672E-08 -2.13179E-06 +7.8701E-08 -2.10749E-06 +7.8729E-08 -2.07339E-06 +7.8758E-08 -2.02969E-06 +7.8786E-08 -1.97609E-06 +7.8815E-08 -1.91289E-06 +7.8825E-08 -1.91899E-06 +7.8835E-08 -1.92019E-06 +7.8845E-08 -1.91649E-06 +7.8855E-08 -1.90799E-06 +7.8865E-08 -1.89459E-06 +7.8875E-08 -1.87639E-06 +7.8885E-08 -1.85329E-06 +7.8905E-08 -1.84229E-06 +7.8925E-08 -1.82649E-06 +7.8945E-08 -1.80579E-06 +7.8965E-08 -1.78029E-06 +7.8985E-08 -1.74989E-06 +7.9005E-08 -1.71459E-06 +7.9025E-08 -1.67449E-06 +7.9045E-08 -1.63429E-06 +7.9065E-08 -1.59899E-06 +7.9085E-08 -1.56859E-06 +7.9105E-08 -1.54309E-06 +7.9125E-08 -1.52239E-06 +7.9145E-08 -1.50659E-06 +7.9165E-08 -1.49559E-06 +7.9181E-08 -1.47859E-06 +7.9196E-08 -1.46159E-06 +7.9212E-08 -1.44459E-06 +7.9228E-08 -1.42749E-06 +7.9244E-08 -1.41049E-06 +7.9259E-08 -1.39349E-06 +7.9275E-08 -1.37639E-06 +7.9289E-08 -1.35939E-06 +7.9304E-08 -1.34239E-06 +7.9318E-08 -1.32529E-06 +7.9332E-08 -1.30829E-06 +7.9346E-08 -1.29129E-06 +7.9361E-08 -1.27429E-06 +7.9375E-08 -1.25719E-06 +7.9395E-08 -1.24629E-06 +7.9415E-08 -1.23049E-06 +7.9435E-08 -1.20979E-06 +7.9455E-08 -1.18419E-06 +7.9475E-08 -1.15379E-06 +7.9495E-08 -1.11859E-06 +7.9515E-08 -1.07839E-06 +7.9529E-08 -1.06139E-06 +7.9544E-08 -1.04439E-06 +7.9558E-08 -1.02729E-06 +7.9572E-08 -1.01029E-06 +7.9586E-08 -9.93289E-07 +7.9601E-08 -9.76189E-07 +7.9615E-08 -9.59189E-07 +7.9675E-08 -8.91089E-07 +7.9735E-08 -8.22989E-07 +7.9795E-08 -7.54789E-07 +7.9855E-08 -6.86689E-07 +7.9915E-08 -6.18589E-07 +7.9975E-08 -5.50489E-07 +8.0035E-08 -4.82389E-07 +8.0106E-08 -3.74089E-07 +8.0178E-08 -2.70689E-07 +8.0249E-08 -1.72189E-07 +8.0321E-08 -7.84895E-08 +8.0392E-08 1.03105E-08 +8.0464E-08 9.42105E-08 +8.0535E-08 1.73311E-07 +8.0601E-08 2.64511E-07 +8.0666E-08 3.50911E-07 +8.0732E-08 4.32411E-07 +8.0798E-08 5.09011E-07 +8.0864E-08 5.80811E-07 +8.0929E-08 6.47711E-07 +8.0995E-08 7.09711E-07 +8.1051E-08 8.07011E-07 +8.1106E-08 8.94611E-07 +8.1162E-08 9.72511E-07 +8.1218E-08 1.04061E-06 +8.1274E-08 1.09901E-06 +8.1329E-08 1.14761E-06 +8.1385E-08 1.18661E-06 +8.1402E-08 1.22671E-06 +8.1419E-08 1.26201E-06 +8.1436E-08 1.29241E-06 +8.1452E-08 1.31791E-06 +8.1469E-08 1.33861E-06 +8.1486E-08 1.35441E-06 +8.1503E-08 1.36541E-06 +8.1565E-08 1.45661E-06 +8.1626E-08 1.54301E-06 +8.1688E-08 1.62451E-06 +8.1750E-08 1.70111E-06 +8.1812E-08 1.77291E-06 +8.1873E-08 1.83981E-06 +8.1935E-08 1.90181E-06 +8.1971E-08 1.95291E-06 +8.2006E-08 2.00401E-06 +8.2042E-08 2.05511E-06 +8.2078E-08 2.10621E-06 +8.2114E-08 2.15731E-06 +8.2149E-08 2.20841E-06 +8.2185E-08 2.25941E-06 +8.2212E-08 2.29351E-06 +8.2239E-08 2.32761E-06 +8.2266E-08 2.36161E-06 +8.2294E-08 2.39571E-06 +8.2321E-08 2.42971E-06 +8.2348E-08 2.46381E-06 +8.2375E-08 2.49791E-06 +8.2385E-08 2.49181E-06 +8.2395E-08 2.49061E-06 +8.2405E-08 2.49421E-06 +8.2415E-08 2.50271E-06 +8.2425E-08 2.51611E-06 +8.2435E-08 2.53441E-06 +8.2445E-08 2.55751E-06 +8.2503E-08 2.61711E-06 +8.2517E-08 2.63411E-06 +8.2531E-08 2.65111E-06 +8.2545E-08 2.66821E-06 +8.2559E-08 2.68521E-06 +8.2573E-08 2.70221E-06 +8.2587E-08 2.71931E-06 +8.2601E-08 2.73631E-06 +8.2619E-08 2.77641E-06 +8.2636E-08 2.81171E-06 +8.2654E-08 2.84211E-06 +8.2672E-08 2.86771E-06 +8.2690E-08 2.88831E-06 +8.2707E-08 2.90421E-06 +8.2725E-08 2.91511E-06 +8.2765E-08 2.97231E-06 +8.2806E-08 3.02461E-06 +8.2846E-08 3.07201E-06 +8.2886E-08 3.11461E-06 +8.2926E-08 3.15231E-06 +8.2967E-08 3.18511E-06 +8.3007E-08 3.21311E-06 +8.3021E-08 3.25331E-06 +8.3036E-08 3.28851E-06 +8.3050E-08 3.31901E-06 +8.3064E-08 3.34451E-06 +8.3078E-08 3.36521E-06 +8.3093E-08 3.38101E-06 +8.3107E-08 3.39191E-06 +8.3120E-08 3.41501E-06 +8.3134E-08 3.43331E-06 +8.3147E-08 3.44671E-06 +8.3160E-08 3.45521E-06 +8.3173E-08 3.45881E-06 +8.3187E-08 3.45761E-06 +8.3200E-08 3.45151E-06 +8.3215E-08 3.49171E-06 +8.3229E-08 3.52701E-06 +8.3244E-08 3.55741E-06 +8.3259E-08 3.58291E-06 +8.3274E-08 3.60361E-06 +8.3288E-08 3.61941E-06 +8.3303E-08 3.63041E-06 +8.3317E-08 3.64741E-06 +8.3332E-08 3.66441E-06 +8.3346E-08 3.68141E-06 +8.3360E-08 3.69851E-06 +8.3374E-08 3.71551E-06 +8.3389E-08 3.73251E-06 +8.3403E-08 3.74961E-06 +8.3418E-08 3.76661E-06 +8.3433E-08 3.78361E-06 +8.3448E-08 3.80071E-06 +8.3462E-08 3.81771E-06 +8.3477E-08 3.83471E-06 +8.3492E-08 3.85171E-06 +8.3507E-08 3.86881E-06 +8.3522E-08 3.88581E-06 +8.3538E-08 3.90281E-06 +8.3553E-08 3.91991E-06 +8.3569E-08 3.93691E-06 +8.3584E-08 3.95391E-06 +8.3600E-08 3.97101E-06 +8.3615E-08 3.98801E-06 +8.3628E-08 4.00501E-06 +8.3641E-08 4.02201E-06 +8.3654E-08 4.03911E-06 +8.3668E-08 4.05611E-06 +8.3681E-08 4.07311E-06 +8.3694E-08 4.09021E-06 +8.3707E-08 4.10721E-06 +8.3721E-08 4.12421E-06 +8.3734E-08 4.14131E-06 +8.3748E-08 4.15831E-06 +8.3762E-08 4.17531E-06 +8.3776E-08 4.19231E-06 +8.3789E-08 4.20941E-06 +8.3803E-08 4.22641E-06 +8.3817E-08 4.24341E-06 +8.3832E-08 4.26051E-06 +8.3846E-08 4.27751E-06 +8.3860E-08 4.29451E-06 +8.3874E-08 4.31161E-06 +8.3889E-08 4.32861E-06 +8.3903E-08 4.34561E-06 +8.3917E-08 4.36261E-06 +8.3931E-08 4.37971E-06 +8.3945E-08 4.39671E-06 +8.3959E-08 4.41371E-06 +8.3973E-08 4.43081E-06 +8.3987E-08 4.44781E-06 +8.4001E-08 4.46481E-06 +8.4015E-08 4.48191E-06 +8.4030E-08 4.49891E-06 +8.4044E-08 4.51591E-06 +8.4058E-08 4.53291E-06 +8.4072E-08 4.55001E-06 +8.4087E-08 4.56701E-06 +8.4101E-08 4.58401E-06 +8.4115E-08 4.60111E-06 +8.4129E-08 4.61811E-06 +8.4143E-08 4.63511E-06 +8.4158E-08 4.65221E-06 +8.4172E-08 4.66921E-06 +8.4186E-08 4.68621E-06 +8.4200E-08 4.70321E-06 +8.4214E-08 4.72031E-06 +8.4229E-08 4.73731E-06 +8.4243E-08 4.75431E-06 +8.4257E-08 4.77141E-06 +8.4271E-08 4.78841E-06 +8.4286E-08 4.80541E-06 +8.4300E-08 4.82241E-06 +8.4314E-08 4.83951E-06 +8.4329E-08 4.85651E-06 +8.4343E-08 4.87351E-06 +8.4357E-08 4.89061E-06 +8.4371E-08 4.90761E-06 +8.4386E-08 4.92461E-06 +8.4400E-08 4.94171E-06 +8.4414E-08 4.95871E-06 +8.4429E-08 4.97571E-06 +8.4443E-08 4.99271E-06 +8.4457E-08 5.00981E-06 +8.4471E-08 5.02681E-06 +8.4486E-08 5.04381E-06 +8.4500E-08 5.06091E-06 +8.4514E-08 5.07181E-06 +8.4529E-08 5.08761E-06 +8.4543E-08 5.10831E-06 +8.4558E-08 5.13391E-06 +8.4572E-08 5.16431E-06 +8.4587E-08 5.19951E-06 +8.4601E-08 5.23971E-06 +8.4615E-08 5.22751E-06 +8.4630E-08 5.22511E-06 +8.4644E-08 5.23241E-06 +8.4658E-08 5.24941E-06 +8.4672E-08 5.27621E-06 +8.4687E-08 5.31271E-06 +8.4701E-08 5.35891E-06 +8.4716E-08 5.34671E-06 +8.4730E-08 5.34431E-06 +8.4745E-08 5.35161E-06 +8.4759E-08 5.36861E-06 +8.4774E-08 5.39541E-06 +8.4788E-08 5.43191E-06 +8.4803E-08 5.47811E-06 +8.4818E-08 5.46591E-06 +8.4833E-08 5.46351E-06 +8.4848E-08 5.47081E-06 +8.4862E-08 5.48781E-06 +8.4877E-08 5.51461E-06 +8.4892E-08 5.55111E-06 +8.4907E-08 5.59731E-06 +8.4948E-08 5.62531E-06 +8.4989E-08 5.65811E-06 +8.5030E-08 5.69581E-06 +8.5072E-08 5.73841E-06 +8.5113E-08 5.78591E-06 +8.5154E-08 5.83821E-06 +8.5195E-08 5.89531E-06 +8.5210E-08 5.90631E-06 +8.5225E-08 5.92211E-06 +8.5240E-08 5.94281E-06 +8.5256E-08 5.96831E-06 +8.5271E-08 5.99871E-06 +8.5286E-08 6.03401E-06 +8.5301E-08 6.07411E-06 +8.5315E-08 6.07411E-06 +8.5325E-08 6.07411E-06 +8.5345E-08 6.07411E-06 +8.5375E-08 6.13381E-06 +8.5386E-08 6.15691E-06 +8.5398E-08 6.17511E-06 +8.5409E-08 6.18851E-06 +8.5421E-08 6.19701E-06 +8.5432E-08 6.20071E-06 +8.5444E-08 6.19941E-06 +8.5455E-08 6.19341E-06 +8.5472E-08 6.23351E-06 +8.5489E-08 6.26881E-06 +8.5506E-08 6.29921E-06 +8.5524E-08 6.32471E-06 +8.5541E-08 6.34541E-06 +8.5558E-08 6.36121E-06 +8.5575E-08 6.37221E-06 +8.5585E-08 6.39531E-06 +8.5595E-08 6.41351E-06 +8.5605E-08 6.42691E-06 +8.5615E-08 6.43541E-06 +8.5625E-08 6.43911E-06 +8.5635E-08 6.43791E-06 +8.5645E-08 6.43181E-06 +8.5703E-08 6.55101E-06 +8.5717E-08 6.54491E-06 +8.5731E-08 6.54371E-06 +8.5745E-08 6.54731E-06 +8.5759E-08 6.55581E-06 +8.5773E-08 6.56921E-06 +8.5787E-08 6.58751E-06 +8.5801E-08 6.61061E-06 +8.5815E-08 6.62761E-06 +8.5830E-08 6.64461E-06 +8.5844E-08 6.66171E-06 +8.5858E-08 6.67871E-06 +8.5872E-08 6.69571E-06 +8.5887E-08 6.71281E-06 +8.5901E-08 6.72981E-06 +8.5915E-08 6.74681E-06 +8.5930E-08 6.76391E-06 +8.5944E-08 6.78091E-06 +8.5958E-08 6.79791E-06 +8.5972E-08 6.81491E-06 +8.5987E-08 6.83201E-06 +8.6001E-08 6.84901E-06 +8.6015E-08 6.86601E-06 +8.6030E-08 6.88311E-06 +8.6044E-08 6.90011E-06 +8.6058E-08 6.91711E-06 +8.6072E-08 6.93421E-06 +8.6087E-08 6.95121E-06 +8.6101E-08 6.96821E-06 +8.6116E-08 6.98521E-06 +8.6130E-08 7.00231E-06 +8.6145E-08 7.01931E-06 +8.6159E-08 7.03631E-06 +8.6174E-08 7.05341E-06 +8.6188E-08 7.07041E-06 +8.6203E-08 7.08741E-06 +8.6217E-08 7.10451E-06 +8.6232E-08 7.12151E-06 +8.6246E-08 7.13851E-06 +8.6260E-08 7.15551E-06 +8.6274E-08 7.17261E-06 +8.6289E-08 7.18961E-06 +8.6303E-08 7.20661E-06 +8.6318E-08 7.22371E-06 +8.6333E-08 7.24071E-06 +8.6348E-08 7.25771E-06 +8.6362E-08 7.27481E-06 +8.6377E-08 7.29181E-06 +8.6392E-08 7.30881E-06 +8.6407E-08 7.32581E-06 +8.6420E-08 7.34291E-06 +8.6434E-08 7.35991E-06 +8.6447E-08 7.37691E-06 +8.6460E-08 7.39401E-06 +8.6473E-08 7.41101E-06 +8.6487E-08 7.42801E-06 +8.6500E-08 7.44511E-06 +8.6501E-08 7.44511E-06 +8.6540E-08 7.50221E-06 +8.6579E-08 7.55451E-06 +8.6618E-08 7.60201E-06 +8.6658E-08 7.64451E-06 +8.6697E-08 7.68231E-06 +8.6736E-08 7.71511E-06 +8.6775E-08 7.74311E-06 +8.6804E-08 7.77711E-06 +8.6832E-08 7.81121E-06 +8.6861E-08 7.84531E-06 +8.6889E-08 7.87931E-06 +8.6918E-08 7.91341E-06 +8.6946E-08 7.94741E-06 +8.6975E-08 7.98151E-06 +8.6995E-08 7.98151E-06 +8.7003E-08 7.98151E-06 +8.7017E-08 8.02771E-06 +8.7032E-08 8.06421E-06 +8.7046E-08 8.09101E-06 +8.7060E-08 8.10801E-06 +8.7074E-08 8.11531E-06 +8.7089E-08 8.11291E-06 +8.7103E-08 8.10071E-06 +8.7117E-08 8.11771E-06 +8.7131E-08 8.13481E-06 +8.7145E-08 8.15181E-06 +8.7159E-08 8.16881E-06 +8.7173E-08 8.18591E-06 +8.7187E-08 8.20291E-06 +8.7201E-08 8.21991E-06 +8.7210E-08 8.24301E-06 +8.7219E-08 8.26131E-06 +8.7228E-08 8.27471E-06 +8.7238E-08 8.28321E-06 +8.7247E-08 8.28681E-06 +8.7256E-08 8.28561E-06 +8.7265E-08 8.27951E-06 +8.7301E-08 8.33911E-06 +8.7315E-08 8.35621E-06 +8.7330E-08 8.37321E-06 +8.7344E-08 8.39021E-06 +8.7358E-08 8.40721E-06 +8.7372E-08 8.42431E-06 +8.7387E-08 8.44131E-06 +8.7401E-08 8.45831E-06 +8.7416E-08 8.47541E-06 +8.7430E-08 8.49241E-06 +8.7445E-08 8.50941E-06 +8.7459E-08 8.52651E-06 +8.7474E-08 8.54351E-06 +8.7488E-08 8.56051E-06 +8.7503E-08 8.57751E-06 +8.7517E-08 8.57151E-06 +8.7532E-08 8.57021E-06 +8.7546E-08 8.57391E-06 +8.7560E-08 8.58241E-06 +8.7574E-08 8.59581E-06 +8.7589E-08 8.61401E-06 +8.7603E-08 8.63711E-06 +8.7618E-08 8.65421E-06 +8.7633E-08 8.67121E-06 +8.7648E-08 8.68821E-06 +8.7662E-08 8.70531E-06 +8.7677E-08 8.72231E-06 +8.7692E-08 8.73931E-06 +8.7707E-08 8.75641E-06 +8.7721E-08 8.77341E-06 +8.7736E-08 8.79041E-06 +8.7750E-08 8.80741E-06 +8.7764E-08 8.82451E-06 +8.7778E-08 8.84151E-06 +8.7793E-08 8.85851E-06 +8.7807E-08 8.87561E-06 +8.7822E-08 8.89261E-06 +8.7838E-08 8.90961E-06 +8.7853E-08 8.92671E-06 +8.7869E-08 8.94371E-06 +8.7884E-08 8.96071E-06 +8.7900E-08 8.97771E-06 +8.7915E-08 8.99481E-06 +8.7957E-08 9.05191E-06 +8.7998E-08 9.10431E-06 +8.8040E-08 9.15171E-06 +8.8082E-08 9.19431E-06 +8.8124E-08 9.23201E-06 +8.8165E-08 9.26481E-06 +8.8207E-08 9.29281E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.41201E-06 +8.8262E-08 9.41201E-06 +8.8262E-08 9.35241E-06 +8.8262E-08 9.35241E-06 +8.8281E-08 9.36941E-06 +8.8300E-08 9.38651E-06 +8.8319E-08 9.40351E-06 +8.8338E-08 9.42051E-06 +8.8357E-08 9.43761E-06 +8.8376E-08 9.45461E-06 +8.8395E-08 9.47161E-06 +8.8426E-08 9.50571E-06 +8.8458E-08 9.53971E-06 +8.8489E-08 9.57381E-06 +8.8521E-08 9.60791E-06 +8.8552E-08 9.64191E-06 +8.8584E-08 9.67601E-06 +8.8615E-08 9.71001E-06 +8.8641E-08 9.75021E-06 +8.8668E-08 9.78541E-06 +8.8694E-08 9.81591E-06 +8.8721E-08 9.84141E-06 +8.8747E-08 9.86211E-06 +8.8774E-08 9.87791E-06 +8.8800E-08 9.88881E-06 +8.8816E-08 9.93511E-06 +8.8833E-08 9.97161E-06 +8.8849E-08 9.99831E-06 +8.8866E-08 1.00154E-05 +8.8882E-08 1.00227E-05 +8.8899E-08 1.00202E-05 +8.8915E-08 1.00081E-05 +8.8935E-08 1.00677E-05 +8.8955E-08 1.00677E-05 +8.8975E-08 1.01273E-05 +8.8985E-08 1.01273E-05 +8.9001E-08 1.01273E-05 +8.9015E-08 1.01273E-05 +8.9025E-08 1.01273E-05 +8.9035E-08 1.01869E-05 +8.9045E-08 1.01869E-05 +8.9055E-08 1.01869E-05 +8.9065E-08 1.01869E-05 +8.9075E-08 1.02465E-05 +8.9085E-08 1.02465E-05 +8.9095E-08 1.02465E-05 +8.9103E-08 1.02465E-05 +8.9115E-08 1.02465E-05 +8.9125E-08 1.02465E-05 +8.9135E-08 1.02465E-05 +8.9145E-08 1.02465E-05 +8.9155E-08 1.03061E-05 +8.9165E-08 1.03061E-05 +8.9175E-08 1.03061E-05 +8.9185E-08 1.03657E-05 +8.9201E-08 1.03657E-05 +8.9215E-08 1.03657E-05 +8.9225E-08 1.03657E-05 +8.9235E-08 1.03657E-05 +8.9245E-08 1.03657E-05 +8.9255E-08 1.03657E-05 +8.9265E-08 1.04253E-05 +8.9275E-08 1.04253E-05 +8.9285E-08 1.04253E-05 +8.9299E-08 1.04423E-05 +8.9314E-08 1.04593E-05 +8.9328E-08 1.04764E-05 +8.9342E-08 1.04934E-05 +8.9356E-08 1.05104E-05 +8.9371E-08 1.05275E-05 +8.9385E-08 1.05445E-05 +8.9395E-08 1.05445E-05 +8.9403E-08 1.05445E-05 +8.9407E-08 1.06041E-05 +8.9415E-08 1.06041E-05 +8.9425E-08 1.06041E-05 +8.9435E-08 1.06041E-05 +8.9445E-08 1.06041E-05 +8.9455E-08 1.06041E-05 +8.9465E-08 1.06041E-05 +8.9475E-08 1.06041E-05 +8.9485E-08 1.06637E-05 +8.9500E-08 1.06637E-05 +8.9514E-08 1.06807E-05 +8.9529E-08 1.06978E-05 +8.9543E-08 1.07148E-05 +8.9558E-08 1.07318E-05 +8.9572E-08 1.07489E-05 +8.9587E-08 1.07659E-05 +8.9601E-08 1.07829E-05 +8.9615E-08 1.07999E-05 +8.9630E-08 1.0817E-05 +8.9644E-08 1.0834E-05 +8.9658E-08 1.0851E-05 +8.9672E-08 1.08681E-05 +8.9687E-08 1.08851E-05 +8.9701E-08 1.09021E-05 +8.9715E-08 1.09021E-05 +8.9725E-08 1.09021E-05 +8.9735E-08 1.09021E-05 +8.9745E-08 1.09617E-05 +8.9755E-08 1.09617E-05 +8.9765E-08 1.09617E-05 +8.9775E-08 1.09617E-05 +8.9785E-08 1.09617E-05 +8.9795E-08 1.09617E-05 +8.9801E-08 1.09617E-05 +8.9815E-08 1.10213E-05 +8.9825E-08 1.10213E-05 +8.9845E-08 1.10213E-05 +8.9865E-08 1.10809E-05 +8.9885E-08 1.10809E-05 +8.9901E-08 1.10809E-05 +8.9915E-08 1.10809E-05 +8.9925E-08 1.11405E-05 +8.9935E-08 1.11405E-05 +8.9945E-08 1.11405E-05 +8.9955E-08 1.12001E-05 +8.9965E-08 1.12001E-05 +8.9975E-08 1.12001E-05 +8.9995E-08 1.12001E-05 +9.0001E-08 1.12001E-05 +9.0015E-08 1.12172E-05 +9.0029E-08 1.12342E-05 +9.0043E-08 1.12512E-05 +9.0058E-08 1.12683E-05 +9.0072E-08 1.12853E-05 +9.0086E-08 1.13023E-05 +9.0100E-08 1.13194E-05 +9.0114E-08 1.13364E-05 +9.0129E-08 1.13534E-05 +9.0143E-08 1.13704E-05 +9.0157E-08 1.13875E-05 +9.0171E-08 1.14045E-05 +9.0186E-08 1.14215E-05 +9.0200E-08 1.14386E-05 +9.0214E-08 1.14556E-05 +9.0229E-08 1.14726E-05 +9.0243E-08 1.14897E-05 +9.0258E-08 1.15067E-05 +9.0272E-08 1.15237E-05 +9.0287E-08 1.15407E-05 +9.0301E-08 1.15578E-05 +9.0315E-08 1.15748E-05 +9.0330E-08 1.15918E-05 +9.0344E-08 1.16089E-05 +9.0358E-08 1.16259E-05 +9.0372E-08 1.16429E-05 +9.0387E-08 1.166E-05 +9.0401E-08 1.1677E-05 +9.0415E-08 1.1677E-05 +9.0435E-08 1.1677E-05 +9.0455E-08 1.17366E-05 +9.0475E-08 1.17366E-05 +9.0485E-08 1.17597E-05 +9.0495E-08 1.17779E-05 +9.0505E-08 1.17913E-05 +9.0515E-08 1.17998E-05 +9.0525E-08 1.18035E-05 +9.0535E-08 1.18023E-05 +9.0545E-08 1.17962E-05 +9.0575E-08 1.18558E-05 +9.0581E-08 1.18789E-05 +9.0586E-08 1.18972E-05 +9.0592E-08 1.19105E-05 +9.0598E-08 1.19191E-05 +9.0604E-08 1.19227E-05 +9.0609E-08 1.19215E-05 +9.0615E-08 1.19154E-05 +9.0638E-08 1.19555E-05 +9.0661E-08 1.19908E-05 +9.0684E-08 1.20212E-05 +9.0706E-08 1.20468E-05 +9.0729E-08 1.20675E-05 +9.0752E-08 1.20833E-05 +9.0775E-08 1.20942E-05 +9.0789E-08 1.21112E-05 +9.0804E-08 1.21283E-05 +9.0818E-08 1.21453E-05 +9.0832E-08 1.21623E-05 +9.0846E-08 1.21794E-05 +9.0861E-08 1.21964E-05 +9.0875E-08 1.22134E-05 +9.0889E-08 1.22305E-05 +9.0904E-08 1.22475E-05 +9.0918E-08 1.22645E-05 +9.0932E-08 1.22815E-05 +9.0946E-08 1.22986E-05 +9.0961E-08 1.23156E-05 +9.0975E-08 1.23326E-05 +9.0984E-08 1.23557E-05 +9.0992E-08 1.2374E-05 +9.1001E-08 1.23874E-05 +9.1009E-08 1.23959E-05 +9.1018E-08 1.23995E-05 +9.1026E-08 1.23983E-05 +9.1035E-08 1.23922E-05 +9.1101E-08 1.25114E-05 +9.1115E-08 1.25285E-05 +9.1129E-08 1.25455E-05 +9.1143E-08 1.25625E-05 +9.1158E-08 1.25796E-05 +9.1172E-08 1.25966E-05 +9.1186E-08 1.26136E-05 +9.1200E-08 1.26307E-05 +9.1214E-08 1.26185E-05 +9.1229E-08 1.26161E-05 +9.1243E-08 1.26234E-05 +9.1257E-08 1.26404E-05 +9.1271E-08 1.26672E-05 +9.1286E-08 1.27036E-05 +9.1300E-08 1.27499E-05 +9.1314E-08 1.27669E-05 +9.1329E-08 1.27839E-05 +9.1343E-08 1.2801E-05 +9.1357E-08 1.2818E-05 +9.1371E-08 1.2835E-05 +9.1386E-08 1.2852E-05 +9.1400E-08 1.28691E-05 +9.1414E-08 1.28861E-05 +9.1429E-08 1.29031E-05 +9.1443E-08 1.29202E-05 +9.1457E-08 1.29372E-05 +9.1471E-08 1.29542E-05 +9.1486E-08 1.29713E-05 +9.1500E-08 1.29883E-05 +9.1509E-08 1.30053E-05 +9.1519E-08 1.30223E-05 +9.1528E-08 1.30394E-05 +9.1537E-08 1.30564E-05 +9.1546E-08 1.30734E-05 +9.1556E-08 1.30905E-05 +9.1565E-08 1.31075E-05 +9.1600E-08 1.31075E-05 +9.1635E-08 1.31671E-05 +9.1665E-08 1.32267E-05 +9.1700E-08 1.32863E-05 +9.1725E-08 1.33459E-05 +9.1735E-08 1.33459E-05 +9.1745E-08 1.33459E-05 +9.1755E-08 1.33459E-05 +9.1765E-08 1.33459E-05 +9.1775E-08 1.33459E-05 +9.1801E-08 1.34055E-05 +9.1807E-08 1.34055E-05 +9.1835E-08 1.34651E-05 +9.1855E-08 1.34651E-05 +9.1875E-08 1.35247E-05 +9.1884E-08 1.35478E-05 +9.1892E-08 1.35661E-05 +9.1901E-08 1.35795E-05 +9.1909E-08 1.3588E-05 +9.1918E-08 1.35916E-05 +9.1926E-08 1.35904E-05 +9.1935E-08 1.35843E-05 +9.1965E-08 1.36439E-05 +9.1995E-08 1.37035E-05 +9.2006E-08 1.37206E-05 +9.2018E-08 1.37376E-05 +9.2029E-08 1.37546E-05 +9.2041E-08 1.37717E-05 +9.2052E-08 1.37887E-05 +9.2064E-08 1.38057E-05 +9.2075E-08 1.38228E-05 +9.2093E-08 1.38568E-05 +9.2111E-08 1.38909E-05 +9.2129E-08 1.39249E-05 +9.2147E-08 1.3959E-05 +9.2165E-08 1.3993E-05 +9.2183E-08 1.40271E-05 +9.2201E-08 1.40612E-05 +9.2230E-08 1.40891E-05 +9.2260E-08 1.4122E-05 +9.2289E-08 1.41597E-05 +9.2319E-08 1.42023E-05 +9.2348E-08 1.42497E-05 +9.2378E-08 1.4302E-05 +9.2407E-08 1.43592E-05 +9.2435E-08 1.44103E-05 +9.2462E-08 1.44614E-05 +9.2490E-08 1.45125E-05 +9.2517E-08 1.45636E-05 +9.2545E-08 1.46146E-05 +9.2572E-08 1.46657E-05 +9.2600E-08 1.47168E-05 +9.2614E-08 1.4757E-05 +9.2629E-08 1.47922E-05 +9.2643E-08 1.48226E-05 +9.2658E-08 1.48482E-05 +9.2672E-08 1.48689E-05 +9.2687E-08 1.48847E-05 +9.2701E-08 1.48956E-05 +9.2715E-08 1.49297E-05 +9.2730E-08 1.49638E-05 +9.2744E-08 1.49978E-05 +9.2758E-08 1.50319E-05 +9.2772E-08 1.50659E-05 +9.2787E-08 1.51E-05 +9.2801E-08 1.51341E-05 +9.2815E-08 1.51742E-05 +9.2829E-08 1.52095E-05 +9.2843E-08 1.52399E-05 +9.2858E-08 1.52654E-05 +9.2872E-08 1.52861E-05 +9.2886E-08 1.53019E-05 +9.2900E-08 1.53129E-05 +9.2914E-08 1.53469E-05 +9.2929E-08 1.5381E-05 +9.2943E-08 1.5415E-05 +9.2958E-08 1.54491E-05 +9.2972E-08 1.54832E-05 +9.2987E-08 1.55172E-05 +9.3001E-08 1.55513E-05 +9.3015E-08 1.55853E-05 +9.3029E-08 1.56194E-05 +9.3043E-08 1.56535E-05 +9.3058E-08 1.56875E-05 +9.3072E-08 1.57216E-05 +9.3086E-08 1.57556E-05 +9.3100E-08 1.57897E-05 +9.3115E-08 1.58238E-05 +9.3129E-08 1.58578E-05 +9.3144E-08 1.58919E-05 +9.3159E-08 1.59259E-05 +9.3174E-08 1.596E-05 +9.3188E-08 1.59941E-05 +9.3203E-08 1.60281E-05 +9.3218E-08 1.60561E-05 +9.3233E-08 1.60889E-05 +9.3248E-08 1.61267E-05 +9.3262E-08 1.61692E-05 +9.3277E-08 1.62167E-05 +9.3292E-08 1.6269E-05 +9.3307E-08 1.63261E-05 +9.3321E-08 1.63602E-05 +9.3336E-08 1.63943E-05 +9.3350E-08 1.64283E-05 +9.3364E-08 1.64624E-05 +9.3378E-08 1.64964E-05 +9.3393E-08 1.65305E-05 +9.3407E-08 1.65646E-05 +9.3435E-08 1.66838E-05 +9.3445E-08 1.67239E-05 +9.3456E-08 1.67592E-05 +9.3466E-08 1.67896E-05 +9.3476E-08 1.68151E-05 +9.3486E-08 1.68358E-05 +9.3497E-08 1.68516E-05 +9.3507E-08 1.68626E-05 +9.3535E-08 1.69222E-05 +9.3565E-08 1.70414E-05 +9.3585E-08 1.7101E-05 +9.3595E-08 1.71606E-05 +9.3603E-08 1.71606E-05 +9.3607E-08 1.71606E-05 +9.3635E-08 1.72798E-05 +9.3655E-08 1.72798E-05 +9.3685E-08 1.7399E-05 +9.3692E-08 1.741E-05 +9.3699E-08 1.74258E-05 +9.3706E-08 1.74465E-05 +9.3714E-08 1.7472E-05 +9.3721E-08 1.75024E-05 +9.3728E-08 1.75377E-05 +9.3735E-08 1.75778E-05 +9.3755E-08 1.76374E-05 +9.3775E-08 1.76971E-05 +9.3795E-08 1.77567E-05 +9.3803E-08 1.78163E-05 +9.3815E-08 1.78759E-05 +9.3835E-08 1.78759E-05 +9.3845E-08 1.79355E-05 +9.3865E-08 1.79951E-05 +9.3876E-08 1.80231E-05 +9.3888E-08 1.80559E-05 +9.3899E-08 1.80936E-05 +9.3911E-08 1.81362E-05 +9.3922E-08 1.81836E-05 +9.3934E-08 1.82359E-05 +9.3945E-08 1.82931E-05 +9.3975E-08 1.84123E-05 +9.3984E-08 1.84464E-05 +9.3992E-08 1.84804E-05 +9.4001E-08 1.85145E-05 +9.4009E-08 1.85485E-05 +9.4018E-08 1.85826E-05 +9.4026E-08 1.86167E-05 +9.4035E-08 1.86507E-05 +9.4055E-08 1.87103E-05 +9.4075E-08 1.88295E-05 +9.4082E-08 1.88697E-05 +9.4089E-08 1.8905E-05 +9.4096E-08 1.89354E-05 +9.4104E-08 1.89609E-05 +9.4111E-08 1.89816E-05 +9.4118E-08 1.89974E-05 +9.4125E-08 1.90084E-05 +9.4155E-08 1.91276E-05 +9.4175E-08 1.92468E-05 +9.4201E-08 1.93064E-05 +9.4217E-08 1.93684E-05 +9.4234E-08 1.94353E-05 +9.4250E-08 1.95071E-05 +9.4266E-08 1.95837E-05 +9.4282E-08 1.96652E-05 +9.4299E-08 1.97516E-05 +9.4315E-08 1.98428E-05 +9.4335E-08 1.9962E-05 +9.4355E-08 2.00216E-05 +9.4375E-08 2.01408E-05 +9.4400E-08 2.02601E-05 +9.4415E-08 2.03221E-05 +9.4431E-08 2.0389E-05 +9.4446E-08 2.04608E-05 +9.4461E-08 2.05374E-05 +9.4476E-08 2.06189E-05 +9.4492E-08 2.07053E-05 +9.4507E-08 2.07965E-05 +9.4535E-08 2.09753E-05 +9.4565E-08 2.10945E-05 +9.4585E-08 2.11906E-05 +9.4604E-08 2.12916E-05 +9.4624E-08 2.13974E-05 +9.4644E-08 2.15081E-05 +9.4664E-08 2.16237E-05 +9.4683E-08 2.17441E-05 +9.4703E-08 2.18694E-05 +9.4715E-08 2.19606E-05 +9.4726E-08 2.2047E-05 +9.4738E-08 2.21285E-05 +9.4750E-08 2.22051E-05 +9.4762E-08 2.22769E-05 +9.4773E-08 2.23438E-05 +9.4785E-08 2.24058E-05 +9.4800E-08 2.24654E-05 +9.4814E-08 2.25445E-05 +9.4829E-08 2.26284E-05 +9.4843E-08 2.27172E-05 +9.4857E-08 2.28109E-05 +9.4871E-08 2.29094E-05 +9.4886E-08 2.30128E-05 +9.4900E-08 2.31211E-05 +9.4914E-08 2.32293E-05 +9.4929E-08 2.33327E-05 +9.4943E-08 2.34313E-05 +9.4957E-08 2.35249E-05 +9.4971E-08 2.36137E-05 +9.4986E-08 2.36977E-05 +9.5000E-08 2.37767E-05 +9.5100E-08 2.45516E-05 +9.5114E-08 2.46538E-05 +9.5129E-08 2.47559E-05 +9.5143E-08 2.48581E-05 +9.5158E-08 2.49603E-05 +9.5172E-08 2.50625E-05 +9.5187E-08 2.51647E-05 +9.5201E-08 2.52668E-05 +9.5206E-08 2.53532E-05 +9.5211E-08 2.5425E-05 +9.5216E-08 2.54821E-05 +9.5220E-08 2.55247E-05 +9.5225E-08 2.55527E-05 +9.5230E-08 2.55661E-05 +9.5235E-08 2.55649E-05 +9.5255E-08 2.57437E-05 +9.5301E-08 2.61013E-05 +9.5315E-08 2.62436E-05 +9.5330E-08 2.63811E-05 +9.5344E-08 2.65137E-05 +9.5358E-08 2.66414E-05 +9.5372E-08 2.67643E-05 +9.5387E-08 2.68823E-05 +9.5401E-08 2.69954E-05 +9.5415E-08 2.71377E-05 +9.5430E-08 2.72752E-05 +9.5444E-08 2.74077E-05 +9.5458E-08 2.75355E-05 +9.5472E-08 2.76583E-05 +9.5487E-08 2.77763E-05 +9.5501E-08 2.78894E-05 +9.5507E-08 2.79576E-05 +9.5514E-08 2.80257E-05 +9.5520E-08 2.80938E-05 +9.5526E-08 2.81619E-05 +9.5532E-08 2.823E-05 +9.5539E-08 2.82982E-05 +9.5545E-08 2.83663E-05 +9.5565E-08 2.85451E-05 +9.5595E-08 2.88431E-05 +9.5600E-08 2.89027E-05 +9.5614E-08 2.90329E-05 +9.5627E-08 2.91679E-05 +9.5641E-08 2.93078E-05 +9.5654E-08 2.94525E-05 +9.5668E-08 2.96022E-05 +9.5681E-08 2.97567E-05 +9.5695E-08 2.9916E-05 +9.5701E-08 2.9916E-05 +9.5715E-08 3.00924E-05 +9.5730E-08 3.02639E-05 +9.5744E-08 3.04306E-05 +9.5758E-08 3.05923E-05 +9.5772E-08 3.07493E-05 +9.5787E-08 3.09013E-05 +9.5801E-08 3.10485E-05 +9.5815E-08 3.12249E-05 +9.5829E-08 3.13964E-05 +9.5843E-08 3.1563E-05 +9.5858E-08 3.17248E-05 +9.5872E-08 3.18817E-05 +9.5886E-08 3.20338E-05 +9.5900E-08 3.2181E-05 +9.5915E-08 3.23975E-05 +9.5931E-08 3.26043E-05 +9.5946E-08 3.28014E-05 +9.5961E-08 3.29887E-05 +9.5976E-08 3.31663E-05 +9.5992E-08 3.33341E-05 +9.6007E-08 3.34923E-05 +9.6025E-08 3.37538E-05 +9.6044E-08 3.40105E-05 +9.6062E-08 3.42626E-05 +9.6080E-08 3.45096E-05 +9.6098E-08 3.47516E-05 +9.6117E-08 3.49886E-05 +9.6135E-08 3.52206E-05 +9.6159E-08 3.55846E-05 +9.6183E-08 3.59436E-05 +9.6207E-08 3.62976E-05 +9.6231E-08 3.66466E-05 +9.6255E-08 3.69906E-05 +9.6279E-08 3.73296E-05 +9.6303E-08 3.76646E-05 +9.6317E-08 3.78856E-05 +9.6331E-08 3.81076E-05 +9.6345E-08 3.83286E-05 +9.6358E-08 3.85506E-05 +9.6372E-08 3.87716E-05 +9.6386E-08 3.89926E-05 +9.6400E-08 3.92146E-05 +9.6465E-08 4.02876E-05 +9.6500E-08 4.08836E-05 +9.6512E-08 4.10816E-05 +9.6524E-08 4.12846E-05 +9.6536E-08 4.14926E-05 +9.6549E-08 4.17056E-05 +9.6561E-08 4.19236E-05 +9.6573E-08 4.21456E-05 +9.6585E-08 4.23736E-05 +9.6601E-08 4.26716E-05 +9.6603E-08 4.26716E-05 +9.6607E-08 4.27906E-05 +9.6615E-08 4.29096E-05 +9.6625E-08 4.31486E-05 +9.6635E-08 4.32676E-05 +9.6645E-08 4.35056E-05 +9.6655E-08 4.36846E-05 +9.6675E-08 4.40426E-05 +9.6679E-08 4.41336E-05 +9.6683E-08 4.42196E-05 +9.6687E-08 4.43016E-05 +9.6691E-08 4.43776E-05 +9.6695E-08 4.44496E-05 +9.6699E-08 4.45166E-05 +9.6703E-08 4.45786E-05 +9.6707E-08 4.46976E-05 +9.6725E-08 4.50556E-05 +9.6735E-08 4.51746E-05 +9.6755E-08 4.55916E-05 +9.6775E-08 4.60096E-05 +9.6779E-08 4.60946E-05 +9.6783E-08 4.61796E-05 +9.6787E-08 4.62646E-05 +9.6791E-08 4.63496E-05 +9.6795E-08 4.64346E-05 +9.6799E-08 4.65206E-05 +9.6803E-08 4.66056E-05 +9.6813E-08 4.68036E-05 +9.6824E-08 4.70066E-05 +9.6834E-08 4.72146E-05 +9.6844E-08 4.74276E-05 +9.6854E-08 4.76456E-05 +9.6865E-08 4.78676E-05 +9.6875E-08 4.80956E-05 +9.6879E-08 4.81806E-05 +9.6883E-08 4.82656E-05 +9.6887E-08 4.83506E-05 +9.6891E-08 4.84356E-05 +9.6895E-08 4.85216E-05 +9.6899E-08 4.86066E-05 +9.6903E-08 4.86916E-05 +9.6917E-08 4.90216E-05 +9.6932E-08 4.93456E-05 +9.6946E-08 4.96656E-05 +9.6960E-08 4.99806E-05 +9.6974E-08 5.02906E-05 +9.6989E-08 5.05966E-05 +9.7003E-08 5.08966E-05 +9.7017E-08 5.12146E-05 +9.7031E-08 5.15366E-05 +9.7045E-08 5.18636E-05 +9.7059E-08 5.21956E-05 +9.7073E-08 5.25326E-05 +9.7087E-08 5.28746E-05 +9.7101E-08 5.32216E-05 +9.7115E-08 5.35786E-05 +9.7135E-08 5.40556E-05 +9.7165E-08 5.48306E-05 +9.7201E-08 5.57246E-05 +9.7215E-08 5.60936E-05 +9.7230E-08 5.64666E-05 +9.7244E-08 5.68456E-05 +9.7258E-08 5.72286E-05 +9.7272E-08 5.76166E-05 +9.7287E-08 5.80096E-05 +9.7301E-08 5.84066E-05 +9.7315E-08 5.87646E-05 +9.7345E-08 5.95996E-05 +9.7365E-08 6.01356E-05 +9.7385E-08 6.06716E-05 +9.7391E-08 6.08426E-05 +9.7396E-08 6.10126E-05 +9.7402E-08 6.11826E-05 +9.7408E-08 6.13536E-05 +9.7414E-08 6.15236E-05 +9.7419E-08 6.16936E-05 +9.7425E-08 6.18636E-05 +9.7436E-08 6.21876E-05 +9.7447E-08 6.25116E-05 +9.7458E-08 6.28346E-05 +9.7470E-08 6.31586E-05 +9.7481E-08 6.34816E-05 +9.7492E-08 6.38056E-05 +9.7503E-08 6.41286E-05 +9.7518E-08 6.46116E-05 +9.7533E-08 6.50896E-05 +9.7548E-08 6.55636E-05 +9.7562E-08 6.60316E-05 +9.7577E-08 6.64946E-05 +9.7592E-08 6.69536E-05 +9.7607E-08 6.74076E-05 +9.7621E-08 6.78606E-05 +9.7636E-08 6.83196E-05 +9.7650E-08 6.87826E-05 +9.7664E-08 6.92516E-05 +9.7678E-08 6.97246E-05 +9.7693E-08 7.02026E-05 +9.7707E-08 7.06856E-05 +9.7721E-08 7.11626E-05 +9.7734E-08 7.16396E-05 +9.7748E-08 7.21156E-05 +9.7762E-08 7.25926E-05 +9.7776E-08 7.30696E-05 +9.7789E-08 7.35466E-05 +9.7803E-08 7.40236E-05 +9.7817E-08 7.45286E-05 +9.7832E-08 7.50376E-05 +9.7846E-08 7.55526E-05 +9.7860E-08 7.60716E-05 +9.7874E-08 7.65966E-05 +9.7889E-08 7.71256E-05 +9.7903E-08 7.76596E-05 +9.7915E-08 7.80956E-05 +9.7926E-08 7.85376E-05 +9.7938E-08 7.89836E-05 +9.7950E-08 7.94356E-05 +9.7962E-08 7.98916E-05 +9.7973E-08 8.03526E-05 +9.7985E-08 8.08186E-05 +9.7992E-08 8.10846E-05 +9.7999E-08 8.13556E-05 +9.8006E-08 8.16326E-05 +9.8014E-08 8.19136E-05 +9.8021E-08 8.21986E-05 +9.8028E-08 8.24896E-05 +9.8035E-08 8.27856E-05 +9.8044E-08 8.31536E-05 +9.8054E-08 8.35276E-05 +9.8063E-08 8.39056E-05 +9.8073E-08 8.42886E-05 +9.8082E-08 8.46766E-05 +9.8092E-08 8.50696E-05 +9.8101E-08 8.54676E-05 +9.8110E-08 8.58656E-05 +9.8119E-08 8.62586E-05 +9.8128E-08 8.66466E-05 +9.8138E-08 8.70296E-05 +9.8147E-08 8.74076E-05 +9.8156E-08 8.77816E-05 +9.8165E-08 8.81496E-05 +9.8185E-08 8.90436E-05 +9.8201E-08 8.97586E-05 +9.8214E-08 9.03256E-05 +9.8228E-08 9.09026E-05 +9.8241E-08 9.14886E-05 +9.8255E-08 9.20846E-05 +9.8268E-08 9.26906E-05 +9.8282E-08 9.33066E-05 +9.8295E-08 9.39316E-05 +9.8302E-08 9.42486E-05 +9.8309E-08 9.45716E-05 +9.8316E-08 9.48986E-05 +9.8324E-08 9.52306E-05 +9.8331E-08 9.55676E-05 +9.8338E-08 9.59096E-05 +9.8345E-08 9.62556E-05 +9.8375E-08 9.76266E-05 +9.8385E-08 9.81206E-05 +9.8395E-08 9.86146E-05 +9.8405E-08 9.91086E-05 +9.8415E-08 9.96026E-05 +9.8425E-08 0.000100097 +9.8435E-08 0.00010059 +9.8445E-08 0.000101084 +9.8453E-08 0.000101476 +9.8461E-08 0.000101868 +9.8469E-08 0.000102259 +9.8477E-08 0.000102651 +9.8485E-08 0.000103043 +9.8493E-08 0.000103434 +9.8501E-08 0.000103826 +9.8512E-08 0.000104365 +9.8522E-08 0.000104909 +9.8533E-08 0.000105457 +9.8543E-08 0.000106011 +9.8554E-08 0.000106569 +9.8564E-08 0.000107132 +9.8575E-08 0.0001077 +9.8601E-08 0.000109071 +9.8612E-08 0.000109656 +9.8622E-08 0.000110237 +9.8633E-08 0.000110812 +9.8643E-08 0.000111383 +9.8654E-08 0.000111948 +9.8664E-08 0.000112509 +9.8675E-08 0.000113065 +9.8698E-08 0.000114312 +9.8721E-08 0.000115583 +9.8744E-08 0.000116878 +9.8766E-08 0.000118198 +9.8789E-08 0.000119542 +9.8812E-08 0.000120911 +9.8835E-08 0.000122304 +9.8845E-08 0.000122883 +9.8854E-08 0.000123462 +9.8864E-08 0.000124041 +9.8874E-08 0.00012462 +9.8884E-08 0.000125199 +9.8893E-08 0.000125778 +9.8903E-08 0.000126357 +9.8917E-08 0.000127248 +9.8931E-08 0.000128135 +9.8945E-08 0.000129017 +9.8958E-08 0.000129894 +9.8972E-08 0.000130766 +9.8986E-08 0.000131634 +9.9000E-08 0.000132496 +9.9014E-08 0.000133427 +9.9029E-08 0.000134362 +9.9043E-08 0.000135302 +9.9057E-08 0.000136247 +9.9071E-08 0.000137197 +9.9086E-08 0.000138152 +9.9100E-08 0.000139112 +9.9114E-08 0.000140088 +9.9129E-08 0.000141073 +9.9143E-08 0.000142068 +9.9158E-08 0.000143073 +9.9172E-08 0.000144087 +9.9187E-08 0.000145112 +9.9201E-08 0.000146145 +9.9215E-08 0.000147161 +9.9230E-08 0.000148182 +9.9244E-08 0.000149207 +9.9258E-08 0.000150238 +9.9272E-08 0.000151273 +9.9287E-08 0.000152313 +9.9301E-08 0.000153358 +9.9315E-08 0.000154424 +9.9330E-08 0.000155496 +9.9344E-08 0.000156573 +9.9358E-08 0.000157654 +9.9372E-08 0.00015874 +9.9387E-08 0.000159831 +9.9401E-08 0.000160927 +9.9415E-08 0.000162039 +9.9430E-08 0.000163161 +9.9444E-08 0.000164292 +9.9458E-08 0.000165433 +9.9472E-08 0.000166584 +9.9487E-08 0.000167744 +9.9501E-08 0.000168914 +9.9515E-08 0.00017006 +9.9529E-08 0.000171216 +9.9543E-08 0.000172381 +9.9558E-08 0.000173556 +9.9572E-08 0.000174741 +9.9586E-08 0.000175936 +9.9600E-08 0.00017714 +9.9614E-08 0.000178354 +9.9629E-08 0.000179578 +9.9643E-08 0.000180811 +9.9657E-08 0.000182054 +9.9671E-08 0.000183307 +9.9686E-08 0.00018457 +9.9700E-08 0.000185842 +9.9715E-08 0.000187141 +9.9729E-08 0.00018845 +9.9744E-08 0.000189769 +9.9759E-08 0.000191097 +9.9774E-08 0.000192435 +9.9788E-08 0.000193783 +9.9803E-08 0.00019514 +9.9817E-08 0.000196444 +9.9832E-08 0.000197768 +9.9846E-08 0.000199111 +9.9860E-08 0.000200473 +9.9874E-08 0.000201855 +9.9889E-08 0.000203256 +9.9903E-08 0.000204677 +9.9913E-08 0.000205653 +9.9924E-08 0.000206638 +9.9934E-08 0.000207633 +9.9944E-08 0.000208638 +9.9954E-08 0.000209652 +9.9965E-08 0.000210677 +9.9975E-08 0.000211711 +9.9982E-08 0.000212443 +9.9989E-08 0.000213175 +9.9996E-08 0.000213907 +1.0000E-07 0.00021464 +1.0001E-07 0.000215372 +1.0002E-07 0.000216104 +1.0003E-07 0.000216837 +1.0004E-07 0.000217931 +1.0005E-07 0.000219036 +1.0006E-07 0.00022015 +1.0007E-07 0.000221274 +1.0008E-07 0.000222408 +1.0009E-07 0.000223551 +1.0010E-07 0.000224704 +1.0012E-07 0.000226202 +1.0013E-07 0.000227714 +1.0014E-07 0.00022924 +1.0016E-07 0.000230782 +1.0017E-07 0.000232337 +1.0019E-07 0.000233908 +1.0020E-07 0.000235493 +1.0022E-07 0.000237099 +1.0023E-07 0.000238714 +1.0024E-07 0.000240339 +1.0026E-07 0.000241974 +1.0027E-07 0.000243619 +1.0029E-07 0.000245273 +1.0030E-07 0.000246937 +1.0032E-07 0.000248434 +1.0033E-07 0.000249946 +1.0034E-07 0.000251473 +1.0036E-07 0.000253014 +1.0037E-07 0.00025457 +1.0038E-07 0.00025614 +1.0040E-07 0.000257725 +1.0040E-07 0.000258679 +1.0041E-07 0.00026008 +1.0043E-07 0.000261491 +1.0044E-07 0.000262912 +1.0045E-07 0.000264343 +1.0046E-07 0.000265783 +1.0047E-07 0.000267233 +1.0049E-07 0.000268693 +1.0050E-07 0.00027066 +1.0052E-07 0.000272453 +1.0053E-07 0.000274255 +1.0054E-07 0.000276068 +1.0056E-07 0.00027789 +1.0057E-07 0.000279722 +1.0059E-07 0.000281564 +1.0060E-07 0.000283415 +1.0062E-07 0.000285253 +1.0063E-07 0.000287106 +1.0064E-07 0.000288973 +1.0066E-07 0.000290855 +1.0067E-07 0.000292751 +1.0069E-07 0.000294662 +1.0070E-07 0.000296588 +1.0071E-07 0.000298534 +1.0073E-07 0.00030049 +1.0074E-07 0.000302456 +1.0076E-07 0.000304431 +1.0077E-07 0.000306416 +1.0079E-07 0.000308411 +1.0080E-07 0.000310416 +1.0081E-07 0.000312424 +1.0083E-07 0.000314447 +1.0084E-07 0.000316485 +1.0086E-07 0.000318537 +1.0087E-07 0.000320603 +1.0089E-07 0.000322685 +1.0090E-07 0.000324781 +1.0091E-07 0.000326914 +1.0093E-07 0.000329058 +1.0094E-07 0.000331211 +1.0096E-07 0.000333373 +1.0097E-07 0.000335546 +1.0099E-07 0.000337728 +1.0100E-07 0.00033992 +1.0102E-07 0.00034215 +1.0103E-07 0.000344394 +1.0104E-07 0.000346653 +1.0106E-07 0.000348927 +1.0107E-07 0.000351215 +1.0109E-07 0.000353517 +1.0110E-07 0.000355835 +1.0112E-07 0.000358121 +1.0113E-07 0.000360418 +1.0115E-07 0.000362724 +1.0116E-07 0.00036504 +1.0117E-07 0.000367366 +1.0119E-07 0.000369702 +1.0120E-07 0.000372047 +1.0122E-07 0.000374391 +1.0123E-07 0.00037674 +1.0125E-07 0.000379094 +1.0126E-07 0.000381452 +1.0127E-07 0.000383816 +1.0129E-07 0.000386184 +1.0130E-07 0.000388558 +1.0132E-07 0.000391191 +1.0133E-07 0.00039383 +1.0135E-07 0.000396473 +1.0136E-07 0.000399121 +1.0138E-07 0.000401774 +1.0139E-07 0.000404432 +1.0141E-07 0.000407095 +1.0142E-07 0.000409524 +1.0143E-07 0.000411958 +1.0145E-07 0.000414397 +1.0146E-07 0.000416841 +1.0147E-07 0.000419289 +1.0149E-07 0.000421743 +1.0150E-07 0.000424201 +1.0152E-07 0.000426857 +1.0153E-07 0.000429527 +1.0154E-07 0.000432211 +1.0156E-07 0.000434911 +1.0157E-07 0.000437624 +1.0159E-07 0.000440353 +1.0160E-07 0.000443096 +1.0162E-07 0.000445881 +1.0163E-07 0.000448686 +1.0164E-07 0.000451511 +1.0166E-07 0.000454355 +1.0167E-07 0.000457218 +1.0169E-07 0.000460101 +1.0170E-07 0.000463004 +1.0172E-07 0.000465825 +1.0173E-07 0.00046865 +1.0175E-07 0.000471481 +1.0176E-07 0.000474316 +1.0177E-07 0.000477157 +1.0179E-07 0.000480002 +1.0180E-07 0.000482852 +1.0182E-07 0.00048578 +1.0183E-07 0.000488723 +1.0184E-07 0.00049168 +1.0186E-07 0.000494651 +1.0187E-07 0.000497638 +1.0189E-07 0.000500639 +1.0190E-07 0.000503654 +1.0193E-07 0.000509019 +1.0194E-07 0.000511316 +1.0195E-07 0.000513629 +1.0196E-07 0.000515956 +1.0197E-07 0.000518297 +1.0198E-07 0.000520654 +1.0199E-07 0.000523024 +1.0200E-07 0.00052541 +1.0201E-07 0.00052857 +1.0203E-07 0.00053175 +1.0204E-07 0.000534949 +1.0206E-07 0.000538168 +1.0207E-07 0.000541406 +1.0209E-07 0.000544663 +1.0210E-07 0.00054794 +1.0211E-07 0.000551197 +1.0213E-07 0.000554477 +1.0214E-07 0.000557782 +1.0216E-07 0.000561112 +1.0217E-07 0.000564465 +1.0219E-07 0.000567843 +1.0220E-07 0.000571246 +1.0221E-07 0.000574657 +1.0223E-07 0.000578077 +1.0224E-07 0.000581508 +1.0226E-07 0.000584948 +1.0227E-07 0.000588397 +1.0229E-07 0.000591857 +1.0230E-07 0.000595326 +1.0231E-07 0.000598878 +1.0233E-07 0.000602449 +1.0234E-07 0.00060604 +1.0236E-07 0.000609651 +1.0237E-07 0.00061328 +1.0239E-07 0.00061693 +1.0240E-07 0.000620598 +1.0242E-07 0.000624281 +1.0243E-07 0.000627987 +1.0244E-07 0.000631718 +1.0246E-07 0.000635473 +1.0247E-07 0.000639252 +1.0249E-07 0.000643056 +1.0250E-07 0.000646884 +1.0252E-07 0.000650363 +1.0253E-07 0.000653852 +1.0254E-07 0.00065735 +1.0256E-07 0.000660858 +1.0257E-07 0.000664376 +1.0258E-07 0.000667904 +1.0260E-07 0.000671441 +1.0260E-07 0.000672812 +1.0261E-07 0.000674719 +1.0262E-07 0.000676865 +1.0264E-07 0.000682349 +1.0266E-07 0.000687832 +1.0267E-07 0.000690574 +1.0268E-07 0.000693376 +1.0270E-07 0.000698919 +1.0272E-07 0.000705329 +1.0274E-07 0.000711789 +1.0276E-07 0.000718297 +1.0279E-07 0.000724853 +1.0281E-07 0.000731458 +1.0283E-07 0.000738112 +1.0286E-07 0.000744815 +1.0288E-07 0.000751231 +1.0290E-07 0.000757692 +1.0292E-07 0.000764196 +1.0294E-07 0.000770744 +1.0296E-07 0.000777336 +1.0299E-07 0.000783971 +1.0301E-07 0.00079065 +1.0304E-07 0.000799879 +1.0307E-07 0.000809191 +1.0310E-07 0.000818586 +1.0313E-07 0.000828063 +1.0316E-07 0.000837623 +1.0319E-07 0.000847265 +1.0322E-07 0.00085699 +1.0323E-07 0.000861326 +1.0324E-07 0.000865681 +1.0325E-07 0.000870055 +1.0327E-07 0.000874449 +1.0328E-07 0.000878862 +1.0329E-07 0.000883294 +1.0331E-07 0.000887746 +1.0332E-07 0.000892382 +1.0333E-07 0.000897042 +1.0335E-07 0.000901727 +1.0336E-07 0.000906436 +1.0338E-07 0.000911169 +1.0339E-07 0.000915926 +1.0340E-07 0.000920708 +1.0342E-07 0.000925889 +1.0343E-07 0.000931094 +1.0345E-07 0.000936323 +1.0346E-07 0.000941577 +1.0348E-07 0.000946855 +1.0349E-07 0.000952157 +1.0351E-07 0.000957484 +1.0354E-07 0.000967797 +1.0356E-07 0.000978197 +1.0359E-07 0.000988685 +1.0362E-07 0.000999261 +1.0365E-07 0.001009924 +1.0368E-07 0.001020675 +1.0371E-07 0.001031513 +1.0372E-07 0.001036966 +1.0374E-07 0.001042444 +1.0375E-07 0.001047945 +1.0376E-07 0.001053472 +1.0378E-07 0.001059022 +1.0379E-07 0.001064597 +1.0381E-07 0.001070196 +1.0381E-07 0.001072904 +1.0382E-07 0.001075612 +1.0383E-07 0.00107832 +1.0383E-07 0.001081027 +1.0384E-07 0.001083735 +1.0385E-07 0.001086443 +1.0386E-07 0.001089151 +1.0387E-07 0.001093144 +1.0388E-07 0.001097138 +1.0389E-07 0.001101131 +1.0390E-07 0.001105125 +1.0390E-07 0.001108343 +1.0391E-07 0.001109953 +1.0392E-07 0.001113171 +1.0393E-07 0.001117165 +1.0394E-07 0.001121158 +1.0395E-07 0.001125211 +1.0396E-07 0.001129205 +1.0397E-07 0.001133258 +1.0398E-07 0.001137251 +1.0399E-07 0.001141305 +1.0400E-07 0.001145358 +1.0400E-07 0.001148576 +1.0402E-07 0.001153464 +1.0403E-07 0.001157517 +1.0404E-07 0.00116163 +1.0405E-07 0.001165743 +1.0406E-07 0.001169796 +1.0407E-07 0.001173908 +1.0409E-07 0.001182134 +1.0409E-07 0.001183899 +1.0409E-07 0.001185669 +1.0410E-07 0.001187443 +1.0410E-07 0.001189223 +1.0411E-07 0.001191008 +1.0411E-07 0.001192797 +1.0412E-07 0.001194591 +1.0413E-07 0.001198763 +1.0414E-07 0.001202936 +1.0415E-07 0.001207108 +1.0416E-07 0.00121134 +1.0417E-07 0.001215572 +1.0418E-07 0.001219744 +1.0419E-07 0.001224036 +1.0420E-07 0.001230831 +1.0422E-07 0.001236791 +1.0423E-07 0.001241083 +1.0424E-07 0.001245434 +1.0425E-07 0.001249725 +1.0427E-07 0.001258428 +1.0429E-07 0.00126719 +1.0429E-07 0.001269687 +1.0430E-07 0.001272189 +1.0430E-07 0.001274696 +1.0431E-07 0.001277208 +1.0431E-07 0.001279725 +1.0432E-07 0.001282246 +1.0433E-07 0.001284773 +1.0435E-07 0.001293654 +1.0437E-07 0.001302595 +1.0439E-07 0.001311535 +1.0440E-07 0.001316076 +1.0441E-07 0.001320622 +1.0442E-07 0.001325173 +1.0443E-07 0.001329728 +1.0444E-07 0.001334289 +1.0445E-07 0.001338854 +1.0446E-07 0.001343424 +1.0449E-07 0.001357252 +1.0450E-07 0.001364703 +1.0452E-07 0.001371751 +1.0453E-07 0.001378828 +1.0455E-07 0.001385934 +1.0456E-07 0.00139307 +1.0458E-07 0.001400234 +1.0459E-07 0.001407428 +1.0461E-07 0.001414652 +1.0462E-07 0.00142103 +1.0463E-07 0.001427429 +1.0465E-07 0.001433847 +1.0466E-07 0.001440284 +1.0467E-07 0.001446741 +1.0469E-07 0.001453217 +1.0470E-07 0.001459713 +1.0471E-07 0.001466795 +1.0473E-07 0.001473906 +1.0474E-07 0.001481046 +1.0476E-07 0.001488216 +1.0477E-07 0.001495415 +1.0479E-07 0.001502643 +1.0480E-07 0.0015099 +1.0482E-07 0.001517101 +1.0483E-07 0.001524331 +1.0484E-07 0.001531591 +1.0486E-07 0.00153888 +1.0487E-07 0.001546198 +1.0489E-07 0.001553545 +1.0490E-07 0.001560921 +1.0492E-07 0.001568469 +1.0493E-07 0.001576041 +1.0494E-07 0.001583638 +1.0496E-07 0.001591259 +1.0497E-07 0.001598904 +1.0499E-07 0.001606574 +1.0500E-07 0.001614267 +1.0502E-07 0.001621866 +1.0503E-07 0.00162949 +1.0505E-07 0.001637137 +1.0506E-07 0.001644809 +1.0507E-07 0.001652506 +1.0509E-07 0.001660226 +1.0510E-07 0.001667971 +1.0512E-07 0.001675781 +1.0513E-07 0.00168361 +1.0515E-07 0.001691458 +1.0516E-07 0.001699326 +1.0517E-07 0.001707213 +1.0519E-07 0.00171512 +1.0520E-07 0.001723046 +1.0523E-07 0.001735384 +1.0525E-07 0.001746649 +1.0526E-07 0.001752252 +1.0528E-07 0.001763577 +1.0529E-07 0.001770887 +1.0530E-07 0.00177822 +1.0531E-07 0.001785579 +1.0533E-07 0.001792961 +1.0534E-07 0.001800368 +1.0535E-07 0.001807799 +1.0537E-07 0.001815254 +1.0538E-07 0.001826734 +1.0540E-07 0.001838267 +1.0542E-07 0.001849853 +1.0544E-07 0.001861493 +1.0546E-07 0.001873186 +1.0548E-07 0.001884933 +1.0550E-07 0.001896734 +1.0552E-07 0.001905315 +1.0553E-07 0.001913924 +1.0555E-07 0.001922563 +1.0556E-07 0.001931232 +1.0557E-07 0.001939929 +1.0559E-07 0.001948656 +1.0560E-07 0.001957411 +1.0563E-07 0.001975373 +1.0566E-07 0.001993461 +1.0569E-07 0.002011676 +1.0572E-07 0.002030017 +1.0575E-07 0.002048485 +1.0578E-07 0.002067079 +1.0581E-07 0.0020858 +1.0582E-07 0.002094659 +1.0583E-07 0.002103543 +1.0585E-07 0.00211245 +1.0586E-07 0.002121383 +1.0588E-07 0.002130339 +1.0589E-07 0.00213932 +1.0590E-07 0.002148325 +1.0592E-07 0.002157576 +1.0593E-07 0.002166851 +1.0595E-07 0.002176151 +1.0596E-07 0.002185475 +1.0597E-07 0.002194823 +1.0599E-07 0.002204195 +1.0600E-07 0.002213592 +1.0602E-07 0.002223199 +1.0603E-07 0.002232846 +1.0604E-07 0.002242531 +1.0606E-07 0.002252255 +1.0607E-07 0.002262018 +1.0609E-07 0.00227182 +1.0610E-07 0.002281661 +1.0612E-07 0.002291706 +1.0613E-07 0.00230178 +1.0614E-07 0.002311884 +1.0616E-07 0.002322017 +1.0617E-07 0.002332179 +1.0619E-07 0.00234237 +1.0620E-07 0.00235259 +1.0623E-07 0.002372749 +1.0626E-07 0.002393034 +1.0629E-07 0.002413445 +1.0632E-07 0.002433983 +1.0635E-07 0.002454648 +1.0637E-07 0.002475439 +1.0640E-07 0.002496357 +1.0642E-07 0.00250664 +1.0643E-07 0.002516953 +1.0645E-07 0.002527295 +1.0646E-07 0.002537666 +1.0647E-07 0.002548067 +1.0649E-07 0.002558496 +1.0650E-07 0.002568955 +1.0652E-07 0.002579681 +1.0653E-07 0.002590437 +1.0654E-07 0.002601222 +1.0656E-07 0.002612036 +1.0657E-07 0.002622879 +1.0659E-07 0.002633751 +1.0660E-07 0.002644653 +1.0662E-07 0.002655822 +1.0663E-07 0.002667021 +1.0664E-07 0.002678248 +1.0666E-07 0.002689505 +1.0667E-07 0.002700791 +1.0669E-07 0.002712106 +1.0670E-07 0.00272345 +1.0672E-07 0.00273505 +1.0673E-07 0.002746689 +1.0675E-07 0.002758366 +1.0676E-07 0.002770083 +1.0678E-07 0.002781839 +1.0679E-07 0.002793633 +1.0681E-07 0.002805466 +1.0682E-07 0.002816397 +1.0683E-07 0.002827357 +1.0685E-07 0.002838346 +1.0686E-07 0.002849365 +1.0688E-07 0.002860412 +1.0689E-07 0.002871489 +1.0690E-07 0.002882595 +1.0692E-07 0.002894201 +1.0693E-07 0.002905841 +1.0695E-07 0.002917515 +1.0696E-07 0.002929223 +1.0697E-07 0.002940965 +1.0699E-07 0.002952741 +1.0700E-07 0.002964551 +1.0702E-07 0.002976855 +1.0703E-07 0.002989193 +1.0705E-07 0.003001566 +1.0706E-07 0.003013972 +1.0708E-07 0.003026412 +1.0709E-07 0.003038887 +1.0711E-07 0.003051395 +1.0714E-07 0.003075118 +1.0716E-07 0.003092105 +1.0718E-07 0.003109152 +1.0719E-07 0.003123828 +1.0721E-07 0.003138548 +1.0723E-07 0.003153312 +1.0724E-07 0.003168119 +1.0726E-07 0.00318297 +1.0728E-07 0.003197866 +1.0730E-07 0.003212804 +1.0731E-07 0.003226039 +1.0733E-07 0.003239313 +1.0734E-07 0.003252625 +1.0736E-07 0.003265977 +1.0737E-07 0.003279367 +1.0739E-07 0.003292796 +1.0740E-07 0.003306265 +1.0742E-07 0.003327176 +1.0745E-07 0.00334817 +1.0747E-07 0.003369247 +1.0749E-07 0.003390407 +1.0752E-07 0.003411649 +1.0754E-07 0.003432974 +1.0757E-07 0.003454382 +1.0759E-07 0.00347274 +1.0760E-07 0.003483257 +1.0761E-07 0.003493794 +1.0762E-07 0.00350435 +1.0763E-07 0.003514926 +1.0764E-07 0.003525521 +1.0765E-07 0.003536135 +1.0767E-07 0.003546769 +1.0770E-07 0.003580446 +1.0772E-07 0.003593863 +1.0773E-07 0.003607309 +1.0774E-07 0.003620785 +1.0776E-07 0.00363429 +1.0777E-07 0.003647823 +1.0779E-07 0.003661387 +1.0780E-07 0.003674979 +1.0782E-07 0.003688907 +1.0783E-07 0.003702864 +1.0784E-07 0.003716851 +1.0786E-07 0.003730866 +1.0787E-07 0.003744911 +1.0789E-07 0.003758985 +1.0790E-07 0.003773088 +1.0792E-07 0.003786965 +1.0793E-07 0.003800871 +1.0795E-07 0.003814806 +1.0796E-07 0.003828771 +1.0797E-07 0.003842765 +1.0799E-07 0.003856788 +1.0800E-07 0.00387084 +1.0802E-07 0.003884938 +1.0803E-07 0.003899066 +1.0805E-07 0.003913222 +1.0806E-07 0.003927408 +1.0807E-07 0.003941623 +1.0809E-07 0.003955868 +1.0810E-07 0.003970141 +1.0812E-07 0.003984478 +1.0813E-07 0.003998844 +1.0815E-07 0.004013239 +1.0816E-07 0.004027663 +1.0817E-07 0.004042117 +1.0819E-07 0.004056599 +1.0820E-07 0.004071111 +1.0822E-07 0.004085669 +1.0823E-07 0.004100257 +1.0825E-07 0.004114873 +1.0826E-07 0.004129519 +1.0827E-07 0.004144194 +1.0829E-07 0.004158898 +1.0830E-07 0.004173631 +1.0832E-07 0.004187951 +1.0833E-07 0.0042023 +1.0834E-07 0.004216678 +1.0836E-07 0.004231085 +1.0837E-07 0.004245522 +1.0839E-07 0.004259987 +1.0840E-07 0.004274482 +1.0841E-07 0.004289483 +1.0843E-07 0.004304513 +1.0844E-07 0.004319573 +1.0846E-07 0.004334661 +1.0847E-07 0.004349779 +1.0849E-07 0.004364926 +1.0850E-07 0.004380102 +1.0851E-07 0.004395324 +1.0853E-07 0.004410576 +1.0854E-07 0.004425856 +1.0856E-07 0.004441166 +1.0857E-07 0.004456505 +1.0859E-07 0.004471873 +1.0860E-07 0.004487271 +1.0861E-07 0.004502692 +1.0863E-07 0.004518146 +1.0864E-07 0.004533635 +1.0866E-07 0.004549158 +1.0867E-07 0.004564714 +1.0869E-07 0.004580305 +1.0870E-07 0.00459593 +1.0871E-07 0.00460768 +1.0872E-07 0.004619444 +1.0873E-07 0.004631222 +1.0874E-07 0.004643015 +1.0875E-07 0.004654823 +1.0876E-07 0.004666646 +1.0878E-07 0.004678483 +1.0880E-07 0.004706199 +1.0881E-07 0.004722267 +1.0883E-07 0.004738368 +1.0884E-07 0.004754504 +1.0886E-07 0.004770674 +1.0887E-07 0.004786878 +1.0889E-07 0.004803116 +1.0890E-07 0.004819388 +1.0892E-07 0.004835864 +1.0893E-07 0.004852375 +1.0894E-07 0.004868919 +1.0896E-07 0.004885498 +1.0897E-07 0.004902111 +1.0899E-07 0.004918757 +1.0900E-07 0.004935438 +1.0902E-07 0.004955433 +1.0904E-07 0.00497548 +1.0906E-07 0.004995582 +1.0907E-07 0.005015737 +1.0909E-07 0.005035945 +1.0911E-07 0.005056207 +1.0913E-07 0.005076522 +1.0916E-07 0.00511157 +1.0917E-07 0.005126622 +1.0918E-07 0.005141703 +1.0919E-07 0.005156814 +1.0921E-07 0.005171953 +1.0922E-07 0.005187122 +1.0923E-07 0.00520232 +1.0925E-07 0.005217547 +1.0926E-07 0.005234506 +1.0927E-07 0.005251495 +1.0929E-07 0.005268513 +1.0930E-07 0.00528556 +1.0932E-07 0.005302636 +1.0933E-07 0.005319741 +1.0935E-07 0.005336876 +1.0940E-07 0.005404408 +1.0942E-07 0.005422065 +1.0943E-07 0.005439752 +1.0944E-07 0.005457468 +1.0946E-07 0.005475213 +1.0947E-07 0.005492987 +1.0949E-07 0.005510791 +1.0950E-07 0.005528624 +1.0952E-07 0.005550004 +1.0954E-07 0.005571432 +1.0956E-07 0.005592909 +1.0957E-07 0.005614435 +1.0959E-07 0.005636009 +1.0961E-07 0.005657632 +1.0963E-07 0.005679304 +1.0970E-07 0.005774254 +1.0972E-07 0.005792254 +1.0973E-07 0.005810268 +1.0974E-07 0.005828296 +1.0976E-07 0.00584634 +1.0977E-07 0.005864397 +1.0979E-07 0.00588247 +1.0980E-07 0.005900557 +1.0980E-07 0.00590312 +1.0982E-07 0.005921288 +1.0983E-07 0.005939486 +1.0985E-07 0.005957713 +1.0986E-07 0.005975969 +1.0987E-07 0.005994254 +1.0989E-07 0.006012568 +1.0990E-07 0.006030912 +1.0992E-07 0.006050017 +1.0993E-07 0.006069151 +1.0995E-07 0.006088315 +1.0996E-07 0.006107508 +1.0998E-07 0.00612673 +1.0999E-07 0.006145981 +1.1001E-07 0.006165261 +1.1002E-07 0.006183089 +1.1003E-07 0.006200946 +1.1005E-07 0.006218832 +1.1006E-07 0.006236748 +1.1008E-07 0.006254692 +1.1009E-07 0.006272666 +1.1010E-07 0.006290669 +1.1012E-07 0.006309065 +1.1013E-07 0.006327485 +1.1015E-07 0.00634593 +1.1016E-07 0.006364399 +1.1017E-07 0.006382892 +1.1019E-07 0.00640141 +1.1020E-07 0.006419952 +1.1022E-07 0.006439272 +1.1023E-07 0.006458626 +1.1024E-07 0.006478015 +1.1026E-07 0.006497438 +1.1027E-07 0.006516894 +1.1029E-07 0.006536385 +1.1030E-07 0.00655591 +1.1033E-07 0.006594242 +1.1036E-07 0.006632671 +1.1039E-07 0.006671197 +1.1042E-07 0.006709821 +1.1045E-07 0.006748542 +1.1047E-07 0.006787361 +1.1050E-07 0.006826276 +1.1052E-07 0.006845411 +1.1053E-07 0.006864564 +1.1055E-07 0.006883738 +1.1056E-07 0.00690293 +1.1057E-07 0.006922143 +1.1059E-07 0.006941374 +1.1060E-07 0.006960625 +1.1062E-07 0.006981484 +1.1063E-07 0.007002373 +1.1065E-07 0.00702329 +1.1066E-07 0.007044237 +1.1068E-07 0.007065213 +1.1069E-07 0.007086218 +1.1071E-07 0.007107253 +1.1072E-07 0.007125904 +1.1073E-07 0.00714458 +1.1075E-07 0.00716328 +1.1076E-07 0.007182004 +1.1077E-07 0.007200753 +1.1079E-07 0.007219526 +1.1080E-07 0.007238323 +1.1082E-07 0.007261141 +1.1083E-07 0.007283988 +1.1085E-07 0.007306864 +1.1087E-07 0.007329769 +1.1088E-07 0.007352703 +1.1090E-07 0.007375667 +1.1092E-07 0.00739866 +1.1093E-07 0.007416029 +1.1094E-07 0.007433413 +1.1095E-07 0.007450811 +1.1096E-07 0.007468225 +1.1098E-07 0.007485652 +1.1099E-07 0.007503094 +1.1100E-07 0.007520551 +1.1102E-07 0.007540878 +1.1103E-07 0.007561224 +1.1104E-07 0.007581589 +1.1106E-07 0.007601974 +1.1107E-07 0.007622378 +1.1109E-07 0.007642802 +1.1110E-07 0.007663245 +1.1112E-07 0.00768352 +1.1113E-07 0.007703815 +1.1114E-07 0.007724129 +1.1116E-07 0.007744463 +1.1117E-07 0.007764816 +1.1119E-07 0.007785189 +1.1120E-07 0.007805581 +1.1121E-07 0.007826197 +1.1123E-07 0.007846832 +1.1124E-07 0.007867487 +1.1126E-07 0.007888161 +1.1127E-07 0.007908855 +1.1129E-07 0.007929568 +1.1130E-07 0.007950301 +1.1131E-07 0.007971683 +1.1133E-07 0.007993085 +1.1134E-07 0.008014506 +1.1136E-07 0.008035947 +1.1137E-07 0.008057407 +1.1139E-07 0.008078886 +1.1140E-07 0.008100385 +1.1142E-07 0.008120644 +1.1143E-07 0.008140921 +1.1144E-07 0.008161219 +1.1146E-07 0.008181535 +1.1147E-07 0.008201871 +1.1149E-07 0.008222227 +1.1150E-07 0.008242602 +1.1151E-07 0.008263814 +1.1153E-07 0.008285045 +1.1154E-07 0.008306296 +1.1156E-07 0.008327567 +1.1157E-07 0.008348856 +1.1159E-07 0.008370166 +1.1160E-07 0.008391494 +1.1162E-07 0.008413898 +1.1163E-07 0.008436322 +1.1165E-07 0.008458765 +1.1166E-07 0.008481227 +1.1168E-07 0.008503709 +1.1169E-07 0.008526211 +1.1171E-07 0.008548731 +1.1172E-07 0.008569132 +1.1173E-07 0.008589547 +1.1175E-07 0.008609977 +1.1176E-07 0.008630421 +1.1178E-07 0.00865088 +1.1179E-07 0.008671354 +1.1180E-07 0.008691842 +1.1182E-07 0.00871319 +1.1183E-07 0.008734558 +1.1185E-07 0.008755945 +1.1186E-07 0.008777352 +1.1187E-07 0.008798778 +1.1189E-07 0.008820223 +1.1190E-07 0.008841688 +1.1192E-07 0.008863139 +1.1193E-07 0.008884608 +1.1195E-07 0.008906098 +1.1196E-07 0.008927607 +1.1197E-07 0.008949135 +1.1199E-07 0.008970682 +1.1200E-07 0.00899225 +1.1202E-07 0.009013365 +1.1203E-07 0.009034492 +1.1205E-07 0.009055642 +1.1206E-07 0.009076802 +1.1207E-07 0.009097972 +1.1209E-07 0.009119162 +1.1210E-07 0.009140372 +1.1218E-07 0.009252662 +1.1219E-07 0.009267862 +1.1220E-07 0.009283062 +1.1220E-07 0.009290692 +1.1220E-07 0.009292182 +1.1220E-07 0.009295222 +1.1221E-07 0.009301302 +1.1222E-07 0.009313462 +1.1223E-07 0.009328602 +1.1224E-07 0.009343742 +1.1225E-07 0.009358822 +1.1226E-07 0.009373842 +1.1227E-07 0.009388802 +1.1228E-07 0.009403762 +1.1229E-07 0.009418662 +1.1230E-07 0.009433562 +1.1230E-07 0.009442442 +1.1231E-07 0.009451322 +1.1232E-07 0.009463182 +1.1233E-07 0.009477972 +1.1234E-07 0.009492692 +1.1235E-07 0.009507412 +1.1236E-07 0.009522072 +1.1237E-07 0.009536802 +1.1238E-07 0.009551462 +1.1239E-07 0.009566122 +1.1240E-07 0.009589552 +1.1241E-07 0.009598742 +1.1241E-07 0.009607932 +1.1242E-07 0.009617132 +1.1243E-07 0.009626342 +1.1243E-07 0.009635542 +1.1244E-07 0.009644762 +1.1245E-07 0.009653982 +1.1246E-07 0.009668582 +1.1247E-07 0.009683242 +1.1248E-07 0.009697912 +1.1249E-07 0.009712572 +1.1250E-07 0.009727292 +1.1250E-07 0.009736112 +1.1251E-07 0.009744882 +1.1252E-07 0.009756682 +1.1253E-07 0.009771342 +1.1254E-07 0.009786122 +1.1255E-07 0.009800842 +1.1256E-07 0.009815572 +1.1257E-07 0.009830352 +1.1258E-07 0.009845072 +1.1259E-07 0.009859852 +1.1260E-07 0.009883522 +1.1262E-07 0.009904262 +1.1264E-07 0.009933882 +1.1266E-07 0.009963562 +1.1268E-07 0.009993252 +1.1270E-07 0.010022992 +1.1270E-07 0.010031512 +1.1271E-07 0.010040022 +1.1271E-07 0.010048542 +1.1272E-07 0.010057052 +1.1272E-07 0.010065572 +1.1273E-07 0.010074082 +1.1274E-07 0.010082602 +1.1276E-07 0.010112402 +1.1279E-07 0.010157102 +1.1279E-07 0.010167792 +1.1280E-07 0.010178462 +1.1281E-07 0.010189142 +1.1281E-07 0.010199812 +1.1282E-07 0.010210472 +1.1283E-07 0.010221132 +1.1284E-07 0.010231792 +1.1284E-07 0.010245862 +1.1285E-07 0.010259952 +1.1286E-07 0.010274032 +1.1287E-07 0.010288132 +1.1288E-07 0.010302222 +1.1289E-07 0.010316322 +1.1290E-07 0.010330432 +1.1292E-07 0.010351812 +1.1293E-07 0.010373202 +1.1294E-07 0.010394602 +1.1296E-07 0.010415992 +1.1297E-07 0.010437402 +1.1299E-07 0.010458812 +1.1300E-07 0.010480222 +1.1302E-07 0.010502062 +1.1303E-07 0.010523912 +1.1304E-07 0.010545762 +1.1306E-07 0.010567622 +1.1307E-07 0.010589482 +1.1309E-07 0.010611352 +1.1310E-07 0.010633222 +1.1312E-07 0.010654242 +1.1313E-07 0.010675272 +1.1315E-07 0.010696312 +1.1316E-07 0.010717362 +1.1317E-07 0.010738422 +1.1319E-07 0.010759492 +1.1320E-07 0.010780572 +1.1322E-07 0.010802472 +1.1323E-07 0.010824392 +1.1324E-07 0.010846312 +1.1326E-07 0.010868252 +1.1327E-07 0.010890192 +1.1329E-07 0.010912142 +1.1330E-07 0.010934112 +1.1332E-07 0.010956502 +1.1333E-07 0.010978892 +1.1335E-07 0.011001292 +1.1336E-07 0.011023692 +1.1338E-07 0.011046102 +1.1339E-07 0.011068512 +1.1341E-07 0.011090932 +1.1342E-07 0.011111162 +1.1343E-07 0.011131412 +1.1345E-07 0.011151672 +1.1346E-07 0.011171932 +1.1347E-07 0.011192212 +1.1349E-07 0.011212492 +1.1350E-07 0.011232792 +1.1352E-07 0.011254372 +1.1353E-07 0.011275952 +1.1354E-07 0.011297522 +1.1356E-07 0.011319092 +1.1357E-07 0.011340652 +1.1359E-07 0.011362212 +1.1360E-07 0.011383762 +1.1362E-07 0.011405792 +1.1363E-07 0.011427812 +1.1364E-07 0.011449832 +1.1366E-07 0.011471842 +1.1367E-07 0.011493842 +1.1369E-07 0.011515852 +1.1370E-07 0.011537842 +1.1372E-07 0.011559422 +1.1373E-07 0.011581002 +1.1375E-07 0.011602572 +1.1376E-07 0.011624152 +1.1377E-07 0.011645732 +1.1379E-07 0.011667302 +1.1380E-07 0.011688882 +1.1382E-07 0.011710462 +1.1383E-07 0.011732042 +1.1385E-07 0.011753622 +1.1386E-07 0.011775182 +1.1387E-07 0.011796752 +1.1389E-07 0.011818312 +1.1390E-07 0.011839862 +1.1392E-07 0.011860982 +1.1393E-07 0.011882102 +1.1395E-07 0.011903212 +1.1396E-07 0.011924322 +1.1397E-07 0.011945432 +1.1399E-07 0.011966532 +1.1400E-07 0.011987622 +1.1402E-07 0.012009132 +1.1403E-07 0.012030642 +1.1404E-07 0.012052152 +1.1406E-07 0.012073652 +1.1407E-07 0.012095162 +1.1409E-07 0.012116672 +1.1410E-07 0.012138182 +1.1412E-07 0.012159692 +1.1413E-07 0.012181192 +1.1414E-07 0.012202672 +1.1416E-07 0.012224132 +1.1417E-07 0.012245582 +1.1419E-07 0.012267022 +1.1420E-07 0.012288442 +1.1422E-07 0.012309902 +1.1423E-07 0.012331342 +1.1424E-07 0.012352772 +1.1426E-07 0.012374202 +1.1427E-07 0.012395612 +1.1429E-07 0.012417012 +1.1430E-07 0.012438412 +1.1432E-07 0.012459602 +1.1433E-07 0.012480772 +1.1434E-07 0.012501922 +1.1436E-07 0.012523072 +1.1437E-07 0.012544202 +1.1439E-07 0.012565312 +1.1440E-07 0.012586412 +1.1441E-07 0.012607752 +1.1443E-07 0.012629082 +1.1444E-07 0.012650392 +1.1446E-07 0.012671672 +1.1447E-07 0.012692942 +1.1449E-07 0.012714192 +1.1450E-07 0.012735422 +1.1451E-07 0.012756882 +1.1453E-07 0.012778322 +1.1454E-07 0.012799752 +1.1456E-07 0.012821172 +1.1457E-07 0.012842572 +1.1459E-07 0.012863952 +1.1460E-07 0.012885322 +1.1462E-07 0.012915782 +1.1464E-07 0.012946202 +1.1466E-07 0.012976592 +1.1468E-07 0.013006962 +1.1470E-07 0.013037292 +1.1472E-07 0.013067602 +1.1475E-07 0.013097882 +1.1477E-07 0.013127262 +1.1479E-07 0.013157052 +1.1481E-07 0.013186812 +1.1483E-07 0.013216542 +1.1485E-07 0.013246232 +1.1487E-07 0.013275892 +1.1489E-07 0.013305512 +1.1491E-07 0.013335102 +1.1492E-07 0.013355902 +1.1494E-07 0.013376682 +1.1495E-07 0.013397442 +1.1496E-07 0.013418192 +1.1498E-07 0.013438932 +1.1499E-07 0.013459652 +1.1501E-07 0.013480362 +1.1502E-07 0.013501022 +1.1504E-07 0.013521662 +1.1505E-07 0.013542292 +1.1506E-07 0.013562902 +1.1508E-07 0.013583502 +1.1509E-07 0.013604092 +1.1511E-07 0.013624662 +1.1512E-07 0.013644372 +1.1513E-07 0.013664062 +1.1515E-07 0.013683742 +1.1516E-07 0.013703392 +1.1518E-07 0.013723022 +1.1519E-07 0.013742632 +1.1520E-07 0.013762232 +1.1522E-07 0.013782202 +1.1523E-07 0.013802152 +1.1525E-07 0.013822072 +1.1526E-07 0.013841972 +1.1527E-07 0.013861852 +1.1529E-07 0.013881702 +1.1530E-07 0.013901522 +1.1532E-07 0.013921762 +1.1533E-07 0.013941962 +1.1534E-07 0.013962142 +1.1536E-07 0.013982292 +1.1537E-07 0.014002402 +1.1539E-07 0.014022492 +1.1540E-07 0.014042552 +1.1542E-07 0.014062602 +1.1543E-07 0.014082612 +1.1544E-07 0.014102602 +1.1546E-07 0.014122562 +1.1547E-07 0.014142492 +1.1549E-07 0.014162392 +1.1550E-07 0.014182262 +1.1552E-07 0.014202132 +1.1553E-07 0.014221962 +1.1554E-07 0.014241762 +1.1556E-07 0.014261522 +1.1557E-07 0.014281252 +1.1559E-07 0.014300942 +1.1560E-07 0.014320602 +1.1570E-07 0.014460322 +1.1572E-07 0.014479752 +1.1573E-07 0.014499162 +1.1575E-07 0.014518532 +1.1576E-07 0.014537882 +1.1577E-07 0.014557192 +1.1579E-07 0.014576482 +1.1580E-07 0.014595742 +1.1582E-07 0.014615732 +1.1583E-07 0.014635682 +1.1585E-07 0.014655602 +1.1586E-07 0.014675472 +1.1588E-07 0.014695302 +1.1589E-07 0.014715102 +1.1591E-07 0.014734862 +1.1594E-07 0.014781862 +1.1598E-07 0.014828652 +1.1601E-07 0.014875212 +1.1605E-07 0.014921562 +1.1608E-07 0.014967692 +1.1612E-07 0.015013602 +1.1616E-07 0.015059292 +1.1619E-07 0.015097792 +1.1619E-07 0.015106932 +1.1620E-07 0.015116062 +1.1621E-07 0.015125182 +1.1621E-07 0.015134292 +1.1622E-07 0.015143392 +1.1623E-07 0.015152482 +1.1624E-07 0.015161572 +1.1626E-07 0.015188782 +1.1628E-07 0.015215892 +1.1630E-07 0.015242922 +1.1632E-07 0.015269852 +1.1634E-07 0.015296692 +1.1636E-07 0.015323442 +1.1639E-07 0.015350102 +1.1640E-07 0.015368692 +1.1641E-07 0.015386542 +1.1643E-07 0.015404352 +1.1644E-07 0.015422112 +1.1646E-07 0.015439832 +1.1647E-07 0.015457512 +1.1649E-07 0.015475142 +1.1650E-07 0.015492732 +1.1652E-07 0.015509932 +1.1653E-07 0.015527092 +1.1654E-07 0.015544212 +1.1656E-07 0.015561292 +1.1657E-07 0.015578332 +1.1659E-07 0.015595332 +1.1660E-07 0.015612302 +1.1661E-07 0.015629532 +1.1663E-07 0.015646732 +1.1664E-07 0.015663882 +1.1666E-07 0.015680992 +1.1667E-07 0.015698052 +1.1669E-07 0.015715072 +1.1670E-07 0.015732042 +1.1671E-07 0.015742782 +1.1672E-07 0.015753502 +1.1673E-07 0.015764192 +1.1674E-07 0.015774872 +1.1675E-07 0.015785532 +1.1676E-07 0.015796172 +1.1677E-07 0.015806792 +1.1679E-07 0.015829912 +1.1680E-07 0.015848392 +1.1682E-07 0.015864692 +1.1683E-07 0.015880932 +1.1684E-07 0.015897122 +1.1686E-07 0.015913262 +1.1687E-07 0.015929342 +1.1689E-07 0.015945372 +1.1690E-07 0.015961342 +1.1691E-07 0.015977952 +1.1693E-07 0.015994502 +1.1694E-07 0.016010992 +1.1696E-07 0.016027432 +1.1697E-07 0.016043802 +1.1699E-07 0.016060122 +1.1700E-07 0.016076382 +1.1701E-07 0.016084592 +1.1702E-07 0.016092792 +1.1703E-07 0.016100972 +1.1703E-07 0.016109122 +1.1704E-07 0.016117262 +1.1705E-07 0.016125382 +1.1706E-07 0.016133482 +1.1707E-07 0.016144392 +1.1709E-07 0.016166082 +1.1709E-07 0.016173862 +1.1710E-07 0.016181612 +1.1711E-07 0.016189342 +1.1711E-07 0.016197062 +1.1712E-07 0.016204752 +1.1713E-07 0.016212432 +1.1714E-07 0.016220092 +1.1717E-07 0.016252152 +1.1720E-07 0.016284042 +1.1721E-07 0.016294632 +1.1722E-07 0.016305192 +1.1723E-07 0.016315742 +1.1724E-07 0.016326252 +1.1725E-07 0.016336742 +1.1726E-07 0.016347212 +1.1727E-07 0.016357652 +1.1728E-07 0.016371072 +1.1729E-07 0.016384432 +1.1730E-07 0.016397742 +1.1732E-07 0.016411012 +1.1733E-07 0.016424232 +1.1734E-07 0.016437402 +1.1736E-07 0.016450522 +1.1737E-07 0.016469432 +1.1739E-07 0.016488252 +1.1741E-07 0.016506992 +1.1743E-07 0.016525632 +1.1745E-07 0.016544192 +1.1747E-07 0.016562672 +1.1749E-07 0.016581052 +1.1749E-07 0.016586682 +1.1750E-07 0.016592312 +1.1750E-07 0.016597922 +1.1751E-07 0.016603522 +1.1751E-07 0.016609112 +1.1752E-07 0.016614702 +1.1753E-07 0.016620272 +1.1754E-07 0.016631702 +1.1755E-07 0.016643082 +1.1756E-07 0.016654432 +1.1757E-07 0.016665742 +1.1758E-07 0.016677012 +1.1760E-07 0.016688242 +1.1761E-07 0.016699432 +1.1762E-07 0.016710042 +1.1763E-07 0.016720632 +1.1764E-07 0.016731182 +1.1765E-07 0.016741692 +1.1766E-07 0.016752182 +1.1767E-07 0.016762622 +1.1769E-07 0.016773042 +1.1770E-07 0.016782342 +1.1771E-07 0.016796642 +1.1773E-07 0.016810872 +1.1774E-07 0.016825042 +1.1776E-07 0.016839152 +1.1777E-07 0.016853202 +1.1779E-07 0.016867182 +1.1780E-07 0.016881102 +1.1782E-07 0.016893672 +1.1783E-07 0.016906192 +1.1785E-07 0.016918642 +1.1786E-07 0.016931042 +1.1787E-07 0.016943382 +1.1789E-07 0.016955662 +1.1790E-07 0.016967892 +1.1793E-07 0.016992632 +1.1796E-07 0.017017132 +1.1799E-07 0.017041382 +1.1802E-07 0.017065392 +1.1804E-07 0.017089162 +1.1807E-07 0.017112692 +1.1810E-07 0.017135972 +1.1812E-07 0.017147532 +1.1813E-07 0.017159032 +1.1814E-07 0.017170462 +1.1816E-07 0.017181822 +1.1817E-07 0.017193112 +1.1819E-07 0.017204332 +1.1820E-07 0.017215482 +1.1822E-07 0.017227272 +1.1823E-07 0.017238972 +1.1825E-07 0.017250592 +1.1826E-07 0.017262132 +1.1828E-07 0.017273592 +1.1829E-07 0.017284962 +1.1831E-07 0.017296252 +1.1832E-07 0.017304542 +1.1833E-07 0.017312802 +1.1834E-07 0.017321012 +1.1835E-07 0.017329172 +1.1836E-07 0.017337302 +1.1837E-07 0.017345372 +1.1839E-07 0.017353412 +1.1839E-07 0.017358542 +1.1840E-07 0.017363662 +1.1841E-07 0.017368752 +1.1841E-07 0.017373822 +1.1842E-07 0.017378882 +1.1843E-07 0.017383922 +1.1844E-07 0.017388932 +1.1844E-07 0.017395562 +1.1845E-07 0.017402162 +1.1846E-07 0.017408732 +1.1847E-07 0.017415272 +1.1848E-07 0.017421782 +1.1849E-07 0.017428262 +1.1850E-07 0.017434712 +1.1852E-07 0.017444402 +1.1853E-07 0.017454022 +1.1854E-07 0.017463572 +1.1856E-07 0.017473062 +1.1857E-07 0.017482482 +1.1859E-07 0.017491832 +1.1860E-07 0.017501112 +1.1862E-07 0.017510492 +1.1863E-07 0.017519812 +1.1864E-07 0.017529052 +1.1866E-07 0.017538232 +1.1867E-07 0.017547342 +1.1869E-07 0.017556392 +1.1870E-07 0.017565362 +1.1872E-07 0.017574422 +1.1873E-07 0.017583392 +1.1875E-07 0.017592292 +1.1876E-07 0.017601122 +1.1878E-07 0.017609862 +1.1879E-07 0.017618522 +1.1881E-07 0.017627112 +1.1884E-07 0.017643092 +1.1887E-07 0.017659902 +1.1888E-07 0.017665442 +1.1889E-07 0.017670962 +1.1890E-07 0.017676432 +1.1891E-07 0.017681862 +1.1892E-07 0.017687252 +1.1893E-07 0.017692612 +1.1894E-07 0.017697922 +1.1894E-07 0.017702842 +1.1895E-07 0.017707722 +1.1896E-07 0.017712562 +1.1897E-07 0.017717372 +1.1898E-07 0.017722132 +1.1899E-07 0.017726852 +1.1900E-07 0.017731542 +1.1902E-07 0.017739252 +1.1903E-07 0.017746862 +1.1905E-07 0.017754392 +1.1906E-07 0.017761832 +1.1908E-07 0.017769192 +1.1909E-07 0.017776462 +1.1911E-07 0.017783632 +1.1912E-07 0.017789872 +1.1913E-07 0.017796032 +1.1915E-07 0.017802132 +1.1916E-07 0.017808162 +1.1917E-07 0.017814122 +1.1919E-07 0.017820012 +1.1920E-07 0.017825832 +1.1922E-07 0.017832082 +1.1923E-07 0.017838252 +1.1924E-07 0.017844342 +1.1926E-07 0.017850352 +1.1927E-07 0.017856282 +1.1929E-07 0.017862142 +1.1930E-07 0.017867922 +1.1932E-07 0.017873372 +1.1933E-07 0.017878752 +1.1935E-07 0.017884062 +1.1936E-07 0.017889312 +1.1937E-07 0.017894482 +1.1939E-07 0.017899592 +1.1940E-07 0.017904632 +1.1943E-07 0.017914612 +1.1946E-07 0.017924272 +1.1949E-07 0.017933632 +1.1952E-07 0.017942672 +1.1954E-07 0.017951402 +1.1957E-07 0.017959822 +1.1960E-07 0.017967932 +1.1962E-07 0.017971842 +1.1963E-07 0.017975682 +1.1964E-07 0.017979432 +1.1966E-07 0.017983112 +1.1967E-07 0.017986712 +1.1969E-07 0.017990242 +1.1970E-07 0.017993682 +1.1972E-07 0.017997042 +1.1973E-07 0.018000322 +1.1974E-07 0.018003512 +1.1976E-07 0.018006602 +1.1977E-07 0.018009622 +1.1979E-07 0.018012542 +1.1980E-07 0.018015382 +1.1982E-07 0.018019622 +1.1985E-07 0.018023672 +1.1987E-07 0.018027532 +1.1989E-07 0.018031192 +1.1991E-07 0.018034662 +1.1993E-07 0.018037932 +1.1996E-07 0.018041012 +1.2000E-07 0.018046672 +1.2002E-07 0.018048392 +1.2003E-07 0.018050012 +1.2005E-07 0.018051542 +1.2006E-07 0.018052982 +1.2008E-07 0.018054332 +1.2009E-07 0.018055582 +1.2011E-07 0.018056742 +1.2012E-07 0.018057742 +1.2014E-07 0.018058652 +1.2015E-07 0.018059472 +1.2016E-07 0.018060202 +1.2018E-07 0.018060842 +1.2019E-07 0.018061402 +1.2021E-07 0.018061872 +1.2022E-07 0.018062232 +1.2023E-07 0.018062522 +1.2025E-07 0.018062742 +1.2026E-07 0.018062892 +1.2027E-07 0.018062962 +1.2029E-07 0.018062962 +1.2030E-07 0.018062882 +1.2032E-07 0.018062702 +1.2033E-07 0.018062432 +1.2034E-07 0.018062082 +1.2036E-07 0.018061642 +1.2037E-07 0.018061122 +1.2039E-07 0.018060532 +1.2040E-07 0.018059842 +1.2042E-07 0.018059102 +1.2043E-07 0.018058252 +1.2044E-07 0.018057312 +1.2046E-07 0.018056272 +1.2047E-07 0.018055142 +1.2049E-07 0.018053902 +1.2050E-07 0.018052572 +1.2051E-07 0.018052032 +1.2052E-07 0.018051262 +1.2053E-07 0.018050192 +1.2054E-07 0.018049112 +1.2055E-07 0.018048042 +1.2056E-07 0.018046852 +1.2057E-07 0.018045662 +1.2058E-07 0.018044352 +1.2059E-07 0.018042912 +1.2060E-07 0.018041482 +1.2060E-07 0.018040592 +1.2061E-07 0.018039702 +1.2062E-07 0.018038382 +1.2063E-07 0.018036722 +1.2064E-07 0.018035052 +1.2065E-07 0.018033322 +1.2066E-07 0.018031472 +1.2067E-07 0.018029562 +1.2068E-07 0.018027662 +1.2069E-07 0.018025632 +1.2070E-07 0.018022532 +1.2071E-07 0.018020862 +1.2072E-07 0.018019172 +1.2072E-07 0.018017442 +1.2073E-07 0.018015692 +1.2074E-07 0.018013912 +1.2075E-07 0.018012092 +1.2076E-07 0.018010252 +1.2078E-07 0.018005422 +1.2080E-07 0.018000482 +1.2080E-07 0.017998642 +1.2081E-07 0.017996792 +1.2082E-07 0.017994922 +1.2082E-07 0.017993032 +1.2083E-07 0.017991122 +1.2084E-07 0.017989192 +1.2085E-07 0.017987242 +1.2086E-07 0.017984502 +1.2087E-07 0.017981702 +1.2088E-07 0.017978902 +1.2089E-07 0.017976042 +1.2090E-07 0.017973062 +1.2090E-07 0.017971332 +1.2091E-07 0.017969542 +1.2092E-07 0.017967162 +1.2093E-07 0.017964122 +1.2094E-07 0.017961022 +1.2095E-07 0.017957922 +1.2096E-07 0.017954822 +1.2097E-07 0.017951602 +1.2098E-07 0.017948382 +1.2099E-07 0.017945102 +1.2100E-07 0.017939802 +1.2102E-07 0.017935032 +1.2103E-07 0.017931572 +1.2104E-07 0.017928122 +1.2105E-07 0.017924662 +1.2106E-07 0.017921082 +1.2108E-07 0.017913812 +1.2109E-07 0.017909612 +1.2110E-07 0.017905352 +1.2111E-07 0.017901032 +1.2112E-07 0.017896652 +1.2113E-07 0.017892222 +1.2114E-07 0.017887732 +1.2116E-07 0.017883172 +1.2118E-07 0.017875132 +1.2119E-07 0.017868042 +1.2121E-07 0.017860832 +1.2123E-07 0.017853512 +1.2124E-07 0.017846062 +1.2126E-07 0.017838482 +1.2128E-07 0.017830792 +1.2130E-07 0.017822972 +1.2131E-07 0.017817682 +1.2132E-07 0.017812332 +1.2133E-07 0.017806922 +1.2134E-07 0.017801462 +1.2135E-07 0.017795952 +1.2136E-07 0.017790392 +1.2138E-07 0.017784772 +1.2139E-07 0.017779082 +1.2140E-07 0.017773342 +1.2141E-07 0.017767542 +1.2142E-07 0.017761692 +1.2143E-07 0.017755792 +1.2144E-07 0.017749832 +1.2146E-07 0.017743822 +1.2150E-07 0.017717892 +1.2152E-07 0.017710172 +1.2153E-07 0.017702352 +1.2155E-07 0.017694462 +1.2156E-07 0.017686472 +1.2157E-07 0.017678392 +1.2159E-07 0.017670232 +1.2160E-07 0.017661982 +1.2162E-07 0.017653332 +1.2163E-07 0.017644592 +1.2164E-07 0.017635742 +1.2166E-07 0.017626802 +1.2167E-07 0.017617762 +1.2169E-07 0.017608632 +1.2170E-07 0.017599402 +1.2172E-07 0.017590462 +1.2173E-07 0.017581442 +1.2175E-07 0.017572332 +1.2176E-07 0.017563142 +1.2177E-07 0.017553872 +1.2179E-07 0.017544522 +1.2180E-07 0.017535082 +1.2182E-07 0.017525372 +1.2183E-07 0.017515572 +1.2184E-07 0.017505672 +1.2186E-07 0.017495692 +1.2187E-07 0.017485612 +1.2189E-07 0.017475432 +1.2190E-07 0.017465172 +1.2192E-07 0.017454622 +1.2193E-07 0.017443982 +1.2194E-07 0.017433252 +1.2196E-07 0.017422432 +1.2197E-07 0.017411522 +1.2199E-07 0.017400512 +1.2200E-07 0.017389412 +1.2202E-07 0.017378462 +1.2203E-07 0.017367412 +1.2205E-07 0.017356272 +1.2206E-07 0.017345042 +1.2207E-07 0.017333722 +1.2209E-07 0.017322302 +1.2210E-07 0.017310792 +1.2212E-07 0.017299192 +1.2213E-07 0.017287522 +1.2215E-07 0.017275752 +1.2216E-07 0.017263912 +1.2217E-07 0.017251982 +1.2219E-07 0.017239972 +1.2220E-07 0.017227882 +1.2222E-07 0.017214182 +1.2224E-07 0.017200382 +1.2225E-07 0.017186472 +1.2227E-07 0.017172472 +1.2228E-07 0.017158362 +1.2230E-07 0.017144142 +1.2232E-07 0.017129832 +1.2233E-07 0.017118902 +1.2234E-07 0.017107902 +1.2235E-07 0.017096832 +1.2236E-07 0.017085682 +1.2238E-07 0.017074472 +1.2239E-07 0.017063172 +1.2240E-07 0.017051812 +1.2241E-07 0.017038272 +1.2243E-07 0.017024642 +1.2244E-07 0.017010912 +1.2246E-07 0.016997082 +1.2247E-07 0.016983152 +1.2249E-07 0.016969132 +1.2250E-07 0.016955012 +1.2252E-07 0.016941002 +1.2253E-07 0.016926892 +1.2254E-07 0.016912682 +1.2256E-07 0.016898372 +1.2257E-07 0.016883972 +1.2259E-07 0.016869472 +1.2260E-07 0.016854882 +1.2262E-07 0.016839892 +1.2263E-07 0.016824822 +1.2264E-07 0.016809672 +1.2266E-07 0.016794442 +1.2267E-07 0.016779122 +1.2269E-07 0.016763722 +1.2270E-07 0.016748242 +1.2273E-07 0.016724642 +1.2275E-07 0.016703002 +1.2277E-07 0.016681192 +1.2279E-07 0.016659252 +1.2279E-07 0.016651362 +1.2280E-07 0.016643442 +1.2281E-07 0.016635512 +1.2281E-07 0.016627562 +1.2282E-07 0.016619592 +1.2283E-07 0.016611592 +1.2284E-07 0.016603582 +1.2286E-07 0.016580932 +1.2288E-07 0.016558222 +1.2289E-07 0.016543522 +1.2290E-07 0.016528742 +1.2291E-07 0.016513882 +1.2293E-07 0.016498952 +1.2294E-07 0.016483942 +1.2295E-07 0.016468852 +1.2297E-07 0.016453682 +1.2299E-07 0.016430012 +1.2299E-07 0.016419802 +1.2300E-07 0.016409562 +1.2301E-07 0.016399282 +1.2302E-07 0.016388972 +1.2303E-07 0.016378632 +1.2304E-07 0.016368252 +1.2305E-07 0.016357832 +1.2308E-07 0.016321182 +1.2308E-07 0.016315542 +1.2308E-07 0.016309902 +1.2309E-07 0.016304262 +1.2309E-07 0.016298632 +1.2310E-07 0.016292992 +1.2310E-07 0.016287352 +1.2311E-07 0.016281722 +1.2312E-07 0.016265182 +1.2313E-07 0.016248562 +1.2315E-07 0.016231862 +1.2316E-07 0.016215092 +1.2317E-07 0.016198232 +1.2319E-07 0.016181302 +1.2320E-07 0.016164302 +1.2321E-07 0.016145762 +1.2323E-07 0.016127132 +1.2324E-07 0.016108422 +1.2326E-07 0.016089622 +1.2327E-07 0.016070732 +1.2329E-07 0.016051752 +1.2330E-07 0.016032692 +1.2332E-07 0.016013682 +1.2333E-07 0.015994592 +1.2334E-07 0.015975422 +1.2336E-07 0.015956182 +1.2337E-07 0.015936862 +1.2339E-07 0.015917462 +1.2340E-07 0.015897982 +1.2342E-07 0.015878412 +1.2343E-07 0.015858742 +1.2344E-07 0.015838992 +1.2346E-07 0.015819152 +1.2347E-07 0.015799222 +1.2349E-07 0.015779212 +1.2350E-07 0.015759102 +1.2352E-07 0.015738512 +1.2353E-07 0.015717832 +1.2354E-07 0.015697052 +1.2356E-07 0.015676182 +1.2357E-07 0.015655212 +1.2359E-07 0.015634162 +1.2360E-07 0.015613012 +1.2362E-07 0.015592212 +1.2363E-07 0.015571322 +1.2365E-07 0.015550342 +1.2366E-07 0.015529272 +1.2367E-07 0.015508122 +1.2369E-07 0.015486882 +1.2370E-07 0.015465552 +1.2372E-07 0.015443272 +1.2373E-07 0.015420892 +1.2375E-07 0.015398432 +1.2376E-07 0.015375892 +1.2378E-07 0.015353252 +1.2379E-07 0.015330532 +1.2381E-07 0.015307722 +1.2383E-07 0.015270682 +1.2386E-07 0.015233402 +1.2388E-07 0.015195862 +1.2390E-07 0.015158082 +1.2393E-07 0.015120052 +1.2395E-07 0.015081782 +1.2398E-07 0.015043252 +1.2399E-07 0.015027142 +1.2400E-07 0.015010992 +1.2401E-07 0.014994802 +1.2402E-07 0.014978572 +1.2403E-07 0.014962302 +1.2404E-07 0.014945992 +1.2405E-07 0.014929652 +1.2405E-07 0.014916062 +1.2406E-07 0.014902442 +1.2407E-07 0.014888802 +1.2408E-07 0.014875122 +1.2409E-07 0.014861422 +1.2409E-07 0.014847682 +1.2410E-07 0.014833922 +1.2412E-07 0.014810892 +1.2413E-07 0.014787762 +1.2414E-07 0.014764552 +1.2416E-07 0.014741262 +1.2417E-07 0.014717872 +1.2419E-07 0.014694402 +1.2420E-07 0.014670842 +1.2421E-07 0.014646482 +1.2423E-07 0.014622052 +1.2424E-07 0.014597542 +1.2426E-07 0.014572942 +1.2427E-07 0.014548282 +1.2429E-07 0.014523532 +1.2430E-07 0.014498702 +1.2431E-07 0.014473052 +1.2433E-07 0.014447312 +1.2434E-07 0.014421472 +1.2436E-07 0.014395552 +1.2437E-07 0.014369532 +1.2439E-07 0.014343412 +1.2440E-07 0.014317212 +1.2442E-07 0.014292232 +1.2443E-07 0.014267162 +1.2445E-07 0.014242012 +1.2446E-07 0.014216782 +1.2447E-07 0.014191472 +1.2449E-07 0.014166082 +1.2450E-07 0.014140602 +1.2452E-07 0.014114542 +1.2453E-07 0.014088402 +1.2454E-07 0.014062182 +1.2456E-07 0.014035892 +1.2457E-07 0.014009522 +1.2459E-07 0.013983072 +1.2460E-07 0.013956542 +1.2462E-07 0.013929342 +1.2463E-07 0.013902082 +1.2464E-07 0.013874752 +1.2466E-07 0.013847342 +1.2467E-07 0.013819872 +1.2469E-07 0.013792342 +1.2470E-07 0.013764732 +1.2472E-07 0.013737522 +1.2473E-07 0.013710242 +1.2475E-07 0.013682892 +1.2476E-07 0.013655472 +1.2477E-07 0.013627982 +1.2479E-07 0.013600432 +1.2480E-07 0.013572802 +1.2482E-07 0.013545082 +1.2483E-07 0.013517272 +1.2485E-07 0.013489382 +1.2486E-07 0.013461422 +1.2487E-07 0.013433382 +1.2489E-07 0.013405262 +1.2490E-07 0.013377062 +1.2492E-07 0.013349632 +1.2493E-07 0.013322122 +1.2494E-07 0.013294552 +1.2496E-07 0.013266912 +1.2497E-07 0.013239212 +1.2499E-07 0.013211432 +1.2500E-07 0.013183592 +1.2502E-07 0.013152762 +1.2503E-07 0.013121852 +1.2505E-07 0.013090872 +1.2506E-07 0.013059802 +1.2508E-07 0.013028662 +1.2509E-07 0.012997442 +1.2511E-07 0.012966152 +1.2513E-07 0.012909132 +1.2516E-07 0.012851842 +1.2519E-07 0.012794282 +1.2522E-07 0.012736452 +1.2525E-07 0.012678342 +1.2527E-07 0.012619972 +1.2530E-07 0.012561312 +1.2531E-07 0.012538842 +1.2532E-07 0.012516342 +1.2533E-07 0.012493802 +1.2534E-07 0.012471232 +1.2535E-07 0.012448622 +1.2536E-07 0.012425982 +1.2538E-07 0.012403302 +1.2540E-07 0.012360332 +1.2540E-07 0.012349482 +1.2541E-07 0.012329442 +1.2542E-07 0.012309372 +1.2543E-07 0.012289272 +1.2544E-07 0.012269132 +1.2545E-07 0.012248962 +1.2546E-07 0.012228752 +1.2547E-07 0.012208512 +1.2547E-07 0.012197322 +1.2548E-07 0.012186102 +1.2548E-07 0.012174862 +1.2549E-07 0.012163602 +1.2549E-07 0.012152332 +1.2550E-07 0.012141032 +1.2550E-07 0.012129722 +1.2551E-07 0.012112772 +1.2552E-07 0.012095802 +1.2552E-07 0.012078802 +1.2553E-07 0.012061782 +1.2554E-07 0.012044732 +1.2555E-07 0.012027662 +1.2556E-07 0.012010572 +1.2557E-07 0.011988392 +1.2560E-07 0.011921582 +1.2560E-07 0.011908172 +1.2562E-07 0.011876212 +1.2563E-07 0.011844182 +1.2564E-07 0.011812072 +1.2566E-07 0.011779892 +1.2567E-07 0.011747642 +1.2569E-07 0.011715322 +1.2570E-07 0.011682922 +1.2572E-07 0.011650472 +1.2573E-07 0.011617952 +1.2574E-07 0.011585352 +1.2576E-07 0.011552672 +1.2577E-07 0.011519912 +1.2579E-07 0.011487072 +1.2580E-07 0.011454162 +1.2582E-07 0.011421532 +1.2583E-07 0.011388842 +1.2584E-07 0.011356072 +1.2586E-07 0.011323232 +1.2587E-07 0.011290312 +1.2589E-07 0.011257322 +1.2590E-07 0.011224262 +1.2591E-07 0.011190792 +1.2593E-07 0.011157262 +1.2594E-07 0.011123662 +1.2596E-07 0.011090002 +1.2597E-07 0.011056282 +1.2599E-07 0.011022492 +1.2600E-07 0.010988652 +1.2601E-07 0.010953692 +1.2603E-07 0.010918662 +1.2604E-07 0.010883562 +1.2606E-07 0.010848382 +1.2607E-07 0.010813132 +1.2609E-07 0.010777812 +1.2610E-07 0.010742422 +1.2612E-07 0.010708722 +1.2613E-07 0.010674952 +1.2615E-07 0.010641112 +1.2616E-07 0.010607202 +1.2617E-07 0.010573232 +1.2619E-07 0.010539182 +1.2620E-07 0.010505072 +1.2622E-07 0.010470212 +1.2623E-07 0.010435282 +1.2624E-07 0.010400282 +1.2626E-07 0.010365232 +1.2627E-07 0.010330112 +1.2629E-07 0.010294932 +1.2630E-07 0.010259682 +1.2632E-07 0.010225052 +1.2634E-07 0.010175582 +1.2636E-07 0.010125872 +1.2638E-07 0.010076162 +1.2640E-07 0.010013752 +1.2642E-07 0.009975492 +1.2643E-07 0.009937172 +1.2645E-07 0.009898792 +1.2646E-07 0.009860362 +1.2648E-07 0.009821862 +1.2649E-07 0.009783312 +1.2651E-07 0.009744702 +1.2654E-07 0.009673732 +1.2656E-07 0.009602552 +1.2659E-07 0.009531152 +1.2662E-07 0.009459532 +1.2665E-07 0.009387702 +1.2668E-07 0.009315642 +1.2670E-07 0.009243362 +1.2672E-07 0.009204932 +1.2673E-07 0.009166442 +1.2675E-07 0.009127892 +1.2676E-07 0.009089292 +1.2678E-07 0.009050622 +1.2679E-07 0.009011898 +1.2681E-07 0.008973117 +1.2683E-07 0.008900994 +1.2686E-07 0.008828681 +1.2689E-07 0.008756179 +1.2692E-07 0.008683487 +1.2694E-07 0.008610605 +1.2697E-07 0.008537533 +1.2700E-07 0.008464272 +1.2701E-07 0.008425868 +1.2703E-07 0.008387411 +1.2704E-07 0.0083489 +1.2706E-07 0.008310336 +1.2707E-07 0.008271718 +1.2709E-07 0.008233047 +1.2710E-07 0.008194322 +1.2712E-07 0.008155209 +1.2713E-07 0.008116038 +1.2714E-07 0.008076809 +1.2716E-07 0.008037521 +1.2717E-07 0.007998174 +1.2719E-07 0.00795877 +1.2720E-07 0.007919306 +1.2722E-07 0.007881384 +1.2723E-07 0.007843419 +1.2725E-07 0.007805409 +1.2726E-07 0.007767356 +1.2727E-07 0.007729259 +1.2729E-07 0.007691118 +1.2730E-07 0.007652933 +1.2732E-07 0.007613945 +1.2733E-07 0.007574907 +1.2734E-07 0.007535821 +1.2736E-07 0.007496686 +1.2737E-07 0.007457503 +1.2739E-07 0.007418271 +1.2740E-07 0.00737899 +1.2742E-07 0.007339689 +1.2743E-07 0.007300344 +1.2744E-07 0.007260955 +1.2746E-07 0.007221522 +1.2747E-07 0.007182046 +1.2749E-07 0.007142525 +1.2750E-07 0.007102961 +1.2752E-07 0.007062581 +1.2753E-07 0.007022162 +1.2754E-07 0.006981703 +1.2756E-07 0.006941206 +1.2757E-07 0.00690067 +1.2759E-07 0.006860095 +1.2760E-07 0.006819481 +1.2762E-07 0.006779606 +1.2763E-07 0.006739696 +1.2765E-07 0.006699753 +1.2766E-07 0.006659775 +1.2767E-07 0.006619763 +1.2769E-07 0.006579718 +1.2770E-07 0.006539638 +1.2772E-07 0.00650033 +1.2773E-07 0.006460984 +1.2775E-07 0.006421599 +1.2776E-07 0.006382174 +1.2777E-07 0.006342711 +1.2779E-07 0.006303209 +1.2780E-07 0.006263668 +1.2782E-07 0.006222528 +1.2783E-07 0.006181343 +1.2784E-07 0.006140115 +1.2786E-07 0.006098843 +1.2787E-07 0.006057527 +1.2789E-07 0.006016168 +1.2790E-07 0.005974764 +1.2792E-07 0.005932533 +1.2793E-07 0.005890272 +1.2795E-07 0.005847982 +1.2796E-07 0.005805662 +1.2798E-07 0.005763314 +1.2799E-07 0.005720936 +1.2801E-07 0.005678529 +1.2802E-07 0.005639317 +1.2803E-07 0.005600085 +1.2805E-07 0.005560833 +1.2806E-07 0.005521562 +1.2808E-07 0.005482272 +1.2809E-07 0.005442962 +1.2810E-07 0.005403633 +1.2812E-07 0.00536261 +1.2813E-07 0.005321558 +1.2815E-07 0.005280477 +1.2816E-07 0.005239367 +1.2817E-07 0.005198228 +1.2819E-07 0.005157059 +1.2820E-07 0.005115862 +1.2822E-07 0.005075918 +1.2823E-07 0.00503594 +1.2824E-07 0.004995928 +1.2826E-07 0.004955883 +1.2827E-07 0.004915803 +1.2829E-07 0.004875689 +1.2830E-07 0.004835541 +1.2831E-07 0.004793746 +1.2833E-07 0.004751927 +1.2834E-07 0.004710083 +1.2836E-07 0.004668215 +1.2837E-07 0.004626323 +1.2839E-07 0.004584406 +1.2840E-07 0.004542465 +1.2843E-07 0.00445932 +1.2846E-07 0.004376097 +1.2849E-07 0.004292797 +1.2852E-07 0.004209418 +1.2854E-07 0.004125962 +1.2857E-07 0.004042428 +1.2860E-07 0.003958816 +1.2862E-07 0.003916952 +1.2863E-07 0.003875078 +1.2864E-07 0.003833194 +1.2866E-07 0.0037913 +1.2867E-07 0.003749397 +1.2869E-07 0.003707484 +1.2870E-07 0.003665561 +1.2872E-07 0.003623584 +1.2873E-07 0.003581592 +1.2874E-07 0.003539585 +1.2876E-07 0.003497564 +1.2877E-07 0.003455528 +1.2879E-07 0.003413477 +1.2880E-07 0.003371412 +1.2885E-07 0.003241772 +1.2886E-07 0.003212268 +1.2887E-07 0.003182764 +1.2888E-07 0.003153319 +1.2889E-07 0.003123874 +1.2890E-07 0.003094549 +1.2890E-07 0.003076906 +1.2890E-07 0.003071065 +1.2891E-07 0.003059382 +1.2892E-07 0.003036017 +1.2893E-07 0.00300693 +1.2894E-07 0.002977962 +1.2895E-07 0.002949113 +1.2896E-07 0.002920265 +1.2897E-07 0.002891476 +1.2898E-07 0.002862806 +1.2899E-07 0.002834196 +1.2900E-07 0.002805645 +1.2900E-07 0.002782876 +1.2902E-07 0.002748723 +1.2903E-07 0.002720351 +1.2904E-07 0.002691979 +1.2905E-07 0.002663607 +1.2906E-07 0.002635295 +1.2907E-07 0.002606983 +1.2909E-07 0.002550418 +1.2910E-07 0.002505178 +1.2912E-07 0.002465601 +1.2913E-07 0.002437348 +1.2914E-07 0.002409036 +1.2915E-07 0.002380724 +1.2916E-07 0.002352411 +1.2917E-07 0.002324099 +1.2918E-07 0.002295727 +1.2919E-07 0.002267415 +1.2920E-07 0.002239043 +1.2920E-07 0.002216334 +1.2922E-07 0.00218224 +1.2923E-07 0.002153809 +1.2924E-07 0.002125377 +1.2925E-07 0.002096886 +1.2926E-07 0.002068395 +1.2927E-07 0.002039904 +1.2928E-07 0.002011413 +1.2930E-07 0.001954372 +1.2931E-07 0.001917639 +1.2932E-07 0.001880892 +1.2933E-07 0.001844131 +1.2935E-07 0.001807355 +1.2936E-07 0.001770564 +1.2937E-07 0.001733759 +1.2939E-07 0.001696939 +1.2939E-07 0.001680556 +1.2940E-07 0.001664174 +1.2940E-07 0.001647791 +1.2941E-07 0.001631408 +1.2941E-07 0.001615025 +1.2942E-07 0.001598643 +1.2943E-07 0.00158226 +1.2944E-07 0.001550295 +1.2945E-07 0.00151833 +1.2946E-07 0.001486364 +1.2947E-07 0.001454399 +1.2948E-07 0.001422434 +1.2949E-07 0.001390469 +1.2950E-07 0.001358504 +1.2952E-07 0.001317479 +1.2953E-07 0.001276454 +1.2955E-07 0.001235429 +1.2956E-07 0.001194404 +1.2957E-07 0.001153379 +1.2959E-07 0.001112354 +1.2960E-07 0.001071329 +1.2962E-07 0.001028664 +1.2963E-07 0.00098599 +1.2965E-07 0.000943305 +1.2966E-07 0.000900611 +1.2968E-07 0.000857908 +1.2969E-07 0.000815194 +1.2971E-07 0.000772471 +1.2974E-07 0.000692005 +1.2976E-07 0.000634546 +1.2978E-07 0.000577027 +1.2978E-07 0.000565509 +1.2978E-07 0.000553996 +1.2979E-07 0.000542487 +1.2979E-07 0.000530983 +1.2980E-07 0.000519485 +1.2980E-07 0.000507991 +1.2980E-07 0.000496502 +1.2982E-07 0.000456226 +1.2983E-07 0.00041595 +1.2985E-07 0.000375674 +1.2986E-07 0.000335399 +1.2987E-07 0.000295123 +1.2989E-07 0.000254847 +1.2990E-07 0.000214572 +1.2992E-07 0.000172627 +1.2993E-07 0.000130682 +1.2994E-07 8.87376E-05 +1.2996E-07 4.67926E-05 +1.2997E-07 4.84801E-06 +1.2999E-07 -3.70966E-05 +1.3000E-07 -7.90413E-05 +1.3002E-07 -0.000120192 +1.3003E-07 -0.000161337 +1.3005E-07 -0.000202478 +1.3006E-07 -0.000243613 +1.3007E-07 -0.000284744 +1.3009E-07 -0.00032587 +1.3010E-07 -0.000366991 +1.3012E-07 -0.000407301 +1.3013E-07 -0.000447611 +1.3015E-07 -0.000487921 +1.3016E-07 -0.00052823 +1.3017E-07 -0.00056854 +1.3019E-07 -0.00060885 +1.3020E-07 -0.00064916 +1.3022E-07 -0.000690293 +1.3023E-07 -0.000731421 +1.3024E-07 -0.000772545 +1.3026E-07 -0.000813664 +1.3027E-07 -0.000854777 +1.3029E-07 -0.000895886 +1.3030E-07 -0.000936991 +1.3032E-07 -0.000978901 +1.3033E-07 -0.001020812 +1.3034E-07 -0.001062722 +1.3036E-07 -0.001104633 +1.3037E-07 -0.001146543 +1.3039E-07 -0.001188454 +1.3040E-07 -0.001230365 +1.3042E-07 -0.00127021 +1.3043E-07 -0.001310045 +1.3044E-07 -0.001349871 +1.3046E-07 -0.001389687 +1.3047E-07 -0.001429493 +1.3049E-07 -0.001469289 +1.3050E-07 -0.001509076 +1.3051E-07 -0.00155009 +1.3053E-07 -0.001591099 +1.3054E-07 -0.001632104 +1.3056E-07 -0.001673103 +1.3057E-07 -0.001714098 +1.3059E-07 -0.001755087 +1.3060E-07 -0.001796072 +1.3061E-07 -0.001837433 +1.3063E-07 -0.001878784 +1.3064E-07 -0.001920125 +1.3066E-07 -0.001961457 +1.3067E-07 -0.002002778 +1.3069E-07 -0.00204409 +1.3070E-07 -0.002085393 +1.3072E-07 -0.0021271 +1.3073E-07 -0.002168793 +1.3074E-07 -0.002210471 +1.3076E-07 -0.002252135 +1.3077E-07 -0.002293784 +1.3079E-07 -0.002335419 +1.3080E-07 -0.002377038 +1.3082E-07 -0.002417009 +1.3083E-07 -0.002456965 +1.3085E-07 -0.002496906 +1.3086E-07 -0.002536832 +1.3087E-07 -0.002576744 +1.3089E-07 -0.002616642 +1.3090E-07 -0.002656525 +1.3092E-07 -0.002696801 +1.3093E-07 -0.002737064 +1.3094E-07 -0.002777312 +1.3096E-07 -0.002817545 +1.3097E-07 -0.002857763 +1.3099E-07 -0.002897967 +1.3100E-07 -0.002938156 +1.3101E-07 -0.002979121 +1.3103E-07 -0.003020065 +1.3104E-07 -0.003060991 +1.3106E-07 -0.003101897 +1.3107E-07 -0.003142783 +1.3109E-07 -0.00318365 +1.3110E-07 -0.003224497 +1.3120E-07 -0.003507023 +1.3130E-07 -0.003788417 +1.3132E-07 -0.003828519 +1.3133E-07 -0.003868596 +1.3134E-07 -0.003908649 +1.3136E-07 -0.003948678 +1.3137E-07 -0.003988682 +1.3139E-07 -0.004028662 +1.3140E-07 -0.004068618 +1.3142E-07 -0.004108147 +1.3143E-07 -0.004147647 +1.3144E-07 -0.004187117 +1.3146E-07 -0.004226558 +1.3147E-07 -0.00426597 +1.3149E-07 -0.004305353 +1.3150E-07 -0.004344707 +1.3151E-07 -0.004384832 +1.3153E-07 -0.004424927 +1.3154E-07 -0.004464994 +1.3156E-07 -0.004505031 +1.3157E-07 -0.004545039 +1.3159E-07 -0.004585018 +1.3160E-07 -0.004624968 +1.3162E-07 -0.004664463 +1.3163E-07 -0.004703928 +1.3164E-07 -0.004743365 +1.3166E-07 -0.004782772 +1.3167E-07 -0.00482215 +1.3169E-07 -0.004861499 +1.3170E-07 -0.004900818 +1.3172E-07 -0.004940881 +1.3173E-07 -0.00498091 +1.3174E-07 -0.005020905 +1.3176E-07 -0.005060865 +1.3177E-07 -0.005100792 +1.3179E-07 -0.005140684 +1.3180E-07 -0.005180543 +1.3183E-07 -0.005257832 +1.3186E-07 -0.005334965 +1.3189E-07 -0.005411943 +1.3192E-07 -0.005488765 +1.3194E-07 -0.005565431 +1.3197E-07 -0.005641941 +1.3200E-07 -0.005718296 +1.3202E-07 -0.005762198 +1.3203E-07 -0.005806046 +1.3205E-07 -0.005849841 +1.3207E-07 -0.005893582 +1.3208E-07 -0.00593727 +1.3210E-07 -0.005980904 +1.3212E-07 -0.006024485 +1.3214E-07 -0.006095507 +1.3217E-07 -0.006166373 +1.3219E-07 -0.006237084 +1.3222E-07 -0.006307639 +1.3225E-07 -0.006378038 +1.3227E-07 -0.006448281 +1.3230E-07 -0.006518369 +1.3232E-07 -0.006555998 +1.3233E-07 -0.006593578 +1.3234E-07 -0.006631109 +1.3236E-07 -0.006668592 +1.3237E-07 -0.006706026 +1.3239E-07 -0.006743412 +1.3240E-07 -0.006780749 +1.3243E-07 -0.006854936 +1.3246E-07 -0.006928928 +1.3249E-07 -0.007002726 +1.3251E-07 -0.007076329 +1.3254E-07 -0.007149738 +1.3257E-07 -0.007222952 +1.3260E-07 -0.007295971 +1.3261E-07 -0.007332578 +1.3263E-07 -0.007369137 +1.3264E-07 -0.007405646 +1.3266E-07 -0.007442107 +1.3267E-07 -0.00747852 +1.3269E-07 -0.007514883 +1.3270E-07 -0.007551198 +1.3271E-07 -0.007587477 +1.3273E-07 -0.007623697 +1.3274E-07 -0.007659859 +1.3276E-07 -0.007695962 +1.3277E-07 -0.007732007 +1.3279E-07 -0.007767994 +1.3280E-07 -0.007803922 +1.3283E-07 -0.007876721 +1.3286E-07 -0.007949292 +1.3289E-07 -0.008021633 +1.3292E-07 -0.008093747 +1.3295E-07 -0.008165631 +1.3297E-07 -0.008237287 +1.3300E-07 -0.008308714 +1.3303E-07 -0.008372564 +1.3306E-07 -0.008436219 +1.3308E-07 -0.00849968 +1.3311E-07 -0.008562946 +1.3313E-07 -0.008626017 +1.3316E-07 -0.008688894 +1.3319E-07 -0.008751576 +1.3320E-07 -0.008782518 +1.3321E-07 -0.008813407 +1.3322E-07 -0.008844242 +1.3324E-07 -0.008875024 +1.3325E-07 -0.008905752 +1.3326E-07 -0.008936426 +1.3328E-07 -0.008967047 +1.3329E-07 -0.00900444 +1.3331E-07 -0.009041755 +1.3332E-07 -0.009078992 +1.3334E-07 -0.009116151 +1.3335E-07 -0.009153233 +1.3337E-07 -0.009190236 +1.3339E-07 -0.009227162 +1.3340E-07 -0.009264713 +1.3344E-07 -0.009344166 +1.3350E-07 -0.009502058 +1.3352E-07 -0.00953638 +1.3353E-07 -0.009570628 +1.3355E-07 -0.009604803 +1.3356E-07 -0.009638906 +1.3358E-07 -0.009672935 +1.3359E-07 -0.009706892 +1.3361E-07 -0.009740775 +1.3370E-07 -0.009953623 +1.3372E-07 -0.009985035 +1.3373E-07 -0.010007506 +1.3374E-07 -0.010029858 +1.3375E-07 -0.010052209 +1.3377E-07 -0.010096913 +1.3379E-07 -0.010141437 +1.3380E-07 -0.010176962 +1.3382E-07 -0.010209266 +1.3383E-07 -0.010241517 +1.3384E-07 -0.010273715 +1.3386E-07 -0.010305859 +1.3387E-07 -0.010337949 +1.3389E-07 -0.010369986 +1.3390E-07 -0.010401969 +1.3392E-07 -0.01043264 +1.3393E-07 -0.010463243 +1.3395E-07 -0.010493777 +1.3396E-07 -0.010524244 +1.3397E-07 -0.010554642 +1.3399E-07 -0.010584973 +1.3400E-07 -0.010615235 +1.3402E-07 -0.010646093 +1.3403E-07 -0.010676883 +1.3404E-07 -0.010707605 +1.3406E-07 -0.010738259 +1.3407E-07 -0.010768844 +1.3409E-07 -0.010799362 +1.3410E-07 -0.010829811 +1.3412E-07 -0.01086021 +1.3413E-07 -0.01089054 +1.3414E-07 -0.010920802 +1.3416E-07 -0.010950996 +1.3417E-07 -0.010981118 +1.3419E-07 -0.011011178 +1.3420E-07 -0.011041168 +1.3422E-07 -0.011072888 +1.3423E-07 -0.011104528 +1.3425E-07 -0.011136098 +1.3426E-07 -0.011167598 +1.3428E-07 -0.011199018 +1.3429E-07 -0.011230368 +1.3431E-07 -0.011261648 +1.3432E-07 -0.011289908 +1.3433E-07 -0.011318108 +1.3435E-07 -0.011346248 +1.3436E-07 -0.011374318 +1.3438E-07 -0.011402328 +1.3439E-07 -0.011430278 +1.3440E-07 -0.011458168 +1.3442E-07 -0.011487098 +1.3443E-07 -0.011515978 +1.3445E-07 -0.011544808 +1.3446E-07 -0.011573568 +1.3447E-07 -0.011602278 +1.3449E-07 -0.011630918 +1.3450E-07 -0.011659508 +1.3452E-07 -0.011687978 +1.3453E-07 -0.011716388 +1.3455E-07 -0.011744728 +1.3456E-07 -0.011772998 +1.3457E-07 -0.011801198 +1.3459E-07 -0.011829328 +1.3460E-07 -0.011857398 +1.3462E-07 -0.011884508 +1.3463E-07 -0.011911568 +1.3464E-07 -0.011938568 +1.3466E-07 -0.011965508 +1.3467E-07 -0.011992398 +1.3469E-07 -0.012019218 +1.3470E-07 -0.012045988 +1.3471E-07 -0.012073748 +1.3473E-07 -0.012101438 +1.3474E-07 -0.012129058 +1.3476E-07 -0.012156608 +1.3477E-07 -0.012184078 +1.3479E-07 -0.012211478 +1.3480E-07 -0.012238808 +1.3482E-07 -0.012266318 +1.3483E-07 -0.012293758 +1.3484E-07 -0.012321118 +1.3486E-07 -0.012348398 +1.3487E-07 -0.012375608 +1.3489E-07 -0.012402728 +1.3490E-07 -0.012429778 +1.3493E-07 -0.012482598 +1.3496E-07 -0.012535108 +1.3499E-07 -0.012587318 +1.3502E-07 -0.012639208 +1.3505E-07 -0.012690808 +1.3507E-07 -0.012742088 +1.3510E-07 -0.012793068 +1.3512E-07 -0.012818458 +1.3513E-07 -0.012843768 +1.3515E-07 -0.012868998 +1.3516E-07 -0.012894148 +1.3517E-07 -0.012919228 +1.3519E-07 -0.012944218 +1.3520E-07 -0.012969138 +1.3522E-07 -0.012994958 +1.3523E-07 -0.013020698 +1.3525E-07 -0.013046348 +1.3526E-07 -0.013071918 +1.3528E-07 -0.013097408 +1.3529E-07 -0.013122808 +1.3531E-07 -0.013148138 +1.3532E-07 -0.013172398 +1.3534E-07 -0.013196588 +1.3535E-07 -0.013220688 +1.3536E-07 -0.013244718 +1.3538E-07 -0.013268648 +1.3539E-07 -0.013292508 +1.3541E-07 -0.013316278 +1.3542E-07 -0.013340028 +1.3544E-07 -0.013363688 +1.3545E-07 -0.013387258 +1.3546E-07 -0.013410738 +1.3548E-07 -0.013434118 +1.3549E-07 -0.013457408 +1.3551E-07 -0.013480608 +1.3552E-07 -0.013502818 +1.3553E-07 -0.013524958 +1.3555E-07 -0.013547028 +1.3556E-07 -0.013569028 +1.3558E-07 -0.013590958 +1.3559E-07 -0.013612828 +1.3560E-07 -0.013634628 +1.3562E-07 -0.013658138 +1.3563E-07 -0.013681558 +1.3565E-07 -0.013704888 +1.3566E-07 -0.013728138 +1.3568E-07 -0.013751298 +1.3569E-07 -0.013774368 +1.3571E-07 -0.013797348 +1.3574E-07 -0.013840438 +1.3576E-07 -0.013883208 +1.3579E-07 -0.013925668 +1.3582E-07 -0.013967808 +1.3585E-07 -0.014009628 +1.3588E-07 -0.014051138 +1.3590E-07 -0.014092328 +1.3592E-07 -0.014114048 +1.3593E-07 -0.014135688 +1.3595E-07 -0.014157228 +1.3596E-07 -0.014178688 +1.3598E-07 -0.014200058 +1.3599E-07 -0.014221338 +1.3601E-07 -0.014242538 +1.3602E-07 -0.014262838 +1.3604E-07 -0.014283058 +1.3605E-07 -0.014303198 +1.3606E-07 -0.014323238 +1.3608E-07 -0.014343198 +1.3609E-07 -0.014363058 +1.3611E-07 -0.014382848 +1.3612E-07 -0.014401168 +1.3613E-07 -0.014419428 +1.3615E-07 -0.014437608 +1.3616E-07 -0.014455728 +1.3617E-07 -0.014473788 +1.3619E-07 -0.014491768 +1.3620E-07 -0.014509688 +1.3623E-07 -0.014548108 +1.3626E-07 -0.014586198 +1.3629E-07 -0.014623968 +1.3631E-07 -0.014661398 +1.3634E-07 -0.014698498 +1.3637E-07 -0.014735268 +1.3640E-07 -0.014771708 +1.3642E-07 -0.014789688 +1.3643E-07 -0.014807588 +1.3644E-07 -0.014825408 +1.3646E-07 -0.014843148 +1.3647E-07 -0.014860798 +1.3649E-07 -0.014878378 +1.3650E-07 -0.014895858 +1.3652E-07 -0.014913068 +1.3653E-07 -0.014930198 +1.3654E-07 -0.014947258 +1.3656E-07 -0.014964248 +1.3657E-07 -0.014981168 +1.3659E-07 -0.014998008 +1.3660E-07 -0.015014768 +1.3661E-07 -0.015031728 +1.3663E-07 -0.015048598 +1.3664E-07 -0.015065408 +1.3666E-07 -0.015082138 +1.3667E-07 -0.015098798 +1.3669E-07 -0.015115378 +1.3670E-07 -0.015131898 +1.3672E-07 -0.015148128 +1.3673E-07 -0.015164278 +1.3674E-07 -0.015180348 +1.3676E-07 -0.015196318 +1.3677E-07 -0.015212208 +1.3679E-07 -0.015227998 +1.3680E-07 -0.015243718 +1.3682E-07 -0.015259378 +1.3683E-07 -0.015274948 +1.3684E-07 -0.015290428 +1.3686E-07 -0.015305818 +1.3687E-07 -0.015321108 +1.3689E-07 -0.015336308 +1.3690E-07 -0.015351418 +1.3692E-07 -0.015366318 +1.3693E-07 -0.015381138 +1.3694E-07 -0.015395878 +1.3696E-07 -0.015410538 +1.3697E-07 -0.015425108 +1.3699E-07 -0.015439598 +1.3700E-07 -0.015453998 +1.3701E-07 -0.015468618 +1.3703E-07 -0.015483148 +1.3704E-07 -0.015497598 +1.3706E-07 -0.015511948 +1.3707E-07 -0.015526218 +1.3709E-07 -0.015540398 +1.3710E-07 -0.015554488 +1.3718E-07 -0.015625478 +1.3719E-07 -0.015634898 +1.3720E-07 -0.015644318 +1.3720E-07 -0.015648968 +1.3720E-07 -0.015649918 +1.3720E-07 -0.015651768 +1.3721E-07 -0.015655468 +1.3722E-07 -0.015662918 +1.3723E-07 -0.015672088 +1.3724E-07 -0.015681148 +1.3725E-07 -0.015690098 +1.3726E-07 -0.015698978 +1.3727E-07 -0.015707678 +1.3728E-07 -0.015716378 +1.3729E-07 -0.015724958 +1.3730E-07 -0.015733428 +1.3730E-07 -0.015738428 +1.3731E-07 -0.015743438 +1.3732E-07 -0.015750058 +1.3733E-07 -0.015758218 +1.3734E-07 -0.015766328 +1.3735E-07 -0.015774378 +1.3736E-07 -0.015782358 +1.3737E-07 -0.015790228 +1.3738E-07 -0.015798038 +1.3739E-07 -0.015805848 +1.3739E-07 -0.015810238 +1.3740E-07 -0.015814618 +1.3740E-07 -0.015818978 +1.3741E-07 -0.015823338 +1.3741E-07 -0.015827688 +1.3742E-07 -0.015832028 +1.3743E-07 -0.015836368 +1.3745E-07 -0.015851388 +1.3746E-07 -0.015858778 +1.3747E-07 -0.015866168 +1.3748E-07 -0.015873558 +1.3749E-07 -0.015880888 +1.3750E-07 -0.015888218 +1.3750E-07 -0.015891798 +1.3750E-07 -0.015893998 +1.3751E-07 -0.015896918 +1.3752E-07 -0.015902648 +1.3753E-07 -0.015909918 +1.3754E-07 -0.015917068 +1.3755E-07 -0.015924218 +1.3756E-07 -0.015931318 +1.3757E-07 -0.015938408 +1.3758E-07 -0.015945438 +1.3759E-07 -0.015952478 +1.3760E-07 -0.015963618 +1.3762E-07 -0.015973338 +1.3763E-07 -0.015980248 +1.3764E-07 -0.015987108 +1.3765E-07 -0.015993958 +1.3767E-07 -0.016007548 +1.3769E-07 -0.016020958 +1.3770E-07 -0.016028578 +1.3771E-07 -0.016036148 +1.3772E-07 -0.016043678 +1.3773E-07 -0.016051158 +1.3774E-07 -0.016058598 +1.3775E-07 -0.016065998 +1.3777E-07 -0.016073348 +1.3780E-07 -0.016096118 +1.3782E-07 -0.016105058 +1.3783E-07 -0.016113918 +1.3784E-07 -0.016122698 +1.3786E-07 -0.016131388 +1.3787E-07 -0.016139998 +1.3789E-07 -0.016148528 +1.3790E-07 -0.016156978 +1.3792E-07 -0.016165258 +1.3793E-07 -0.016173468 +1.3794E-07 -0.016181608 +1.3796E-07 -0.016189668 +1.3797E-07 -0.016197658 +1.3799E-07 -0.016205578 +1.3800E-07 -0.016213418 +1.3802E-07 -0.016222438 +1.3803E-07 -0.016231348 +1.3805E-07 -0.016240168 +1.3807E-07 -0.016248888 +1.3808E-07 -0.016257508 +1.3810E-07 -0.016266028 +1.3812E-07 -0.016274458 +1.3813E-07 -0.016280708 +1.3814E-07 -0.016286908 +1.3815E-07 -0.016293048 +1.3816E-07 -0.016299128 +1.3818E-07 -0.016305148 +1.3819E-07 -0.016311108 +1.3820E-07 -0.016317018 +1.3822E-07 -0.016323838 +1.3823E-07 -0.016330578 +1.3824E-07 -0.016337248 +1.3826E-07 -0.016343848 +1.3827E-07 -0.016350378 +1.3829E-07 -0.016356828 +1.3830E-07 -0.016363208 +1.3832E-07 -0.016369508 +1.3833E-07 -0.016375738 +1.3834E-07 -0.016381908 +1.3836E-07 -0.016388008 +1.3837E-07 -0.016394028 +1.3839E-07 -0.016399998 +1.3840E-07 -0.016405888 +1.3842E-07 -0.016411828 +1.3843E-07 -0.016417688 +1.3844E-07 -0.016423468 +1.3846E-07 -0.016429168 +1.3847E-07 -0.016434798 +1.3849E-07 -0.016440348 +1.3850E-07 -0.016445818 +1.3853E-07 -0.016456378 +1.3856E-07 -0.016466658 +1.3859E-07 -0.016476638 +1.3862E-07 -0.016486338 +1.3865E-07 -0.016495748 +1.3867E-07 -0.016504878 +1.3870E-07 -0.016513708 +1.3872E-07 -0.016518208 +1.3873E-07 -0.016522638 +1.3875E-07 -0.016526998 +1.3876E-07 -0.016531278 +1.3878E-07 -0.016535488 +1.3879E-07 -0.016539628 +1.3881E-07 -0.016543688 +1.3882E-07 -0.016547368 +1.3883E-07 -0.016550978 +1.3885E-07 -0.016554518 +1.3886E-07 -0.016557998 +1.3888E-07 -0.016561418 +1.3889E-07 -0.016564778 +1.3890E-07 -0.016568068 +1.3892E-07 -0.016571378 +1.3893E-07 -0.016574608 +1.3895E-07 -0.016577778 +1.3896E-07 -0.016580878 +1.3897E-07 -0.016583908 +1.3899E-07 -0.016586868 +1.3900E-07 -0.016589768 +1.3902E-07 -0.016592738 +1.3903E-07 -0.016595638 +1.3904E-07 -0.016598458 +1.3906E-07 -0.016601198 +1.3907E-07 -0.016603868 +1.3909E-07 -0.016606448 +1.3910E-07 -0.016608958 +1.3913E-07 -0.016613718 +1.3916E-07 -0.016618208 +1.3919E-07 -0.016622438 +1.3922E-07 -0.016626408 +1.3925E-07 -0.016630108 +1.3927E-07 -0.016633558 +1.3930E-07 -0.016636738 +1.3932E-07 -0.016638148 +1.3933E-07 -0.016639508 +1.3935E-07 -0.016640808 +1.3936E-07 -0.016642058 +1.3937E-07 -0.016643258 +1.3939E-07 -0.016644408 +1.3940E-07 -0.016645498 +1.3942E-07 -0.016646558 +1.3943E-07 -0.016647548 +1.3944E-07 -0.016648468 +1.3946E-07 -0.016649308 +1.3947E-07 -0.016650078 +1.3949E-07 -0.016650778 +1.3950E-07 -0.016651398 +1.3952E-07 -0.016651938 +1.3953E-07 -0.016652408 +1.3955E-07 -0.016652828 +1.3956E-07 -0.016653178 +1.3957E-07 -0.016653458 +1.3959E-07 -0.016653678 +1.3960E-07 -0.016653838 +1.3962E-07 -0.016653938 +1.3963E-07 -0.016653968 +1.3965E-07 -0.016653938 +1.3966E-07 -0.016653848 +1.3967E-07 -0.016653688 +1.3969E-07 -0.016653468 +1.3970E-07 -0.016653188 +1.3972E-07 -0.016652818 +1.3973E-07 -0.016652398 +1.3975E-07 -0.016651908 +1.3976E-07 -0.016651348 +1.3977E-07 -0.016650738 +1.3979E-07 -0.016650058 +1.3980E-07 -0.016649308 +1.3982E-07 -0.016648518 +1.3983E-07 -0.016647668 +1.3985E-07 -0.016646748 +1.3986E-07 -0.016645778 +1.3987E-07 -0.016644728 +1.3989E-07 -0.016643628 +1.3990E-07 -0.016642458 +1.3992E-07 -0.016641128 +1.3993E-07 -0.016639728 +1.3995E-07 -0.016638268 +1.3996E-07 -0.016636738 +1.3998E-07 -0.016635138 +1.3999E-07 -0.016633468 +1.4001E-07 -0.016631728 +1.4002E-07 -0.016630048 +1.4003E-07 -0.016628328 +1.4005E-07 -0.016626548 +1.4006E-07 -0.016624728 +1.4008E-07 -0.016622858 +1.4009E-07 -0.016620938 +1.4010E-07 -0.016618968 +1.4012E-07 -0.016616858 +1.4013E-07 -0.016614688 +1.4015E-07 -0.016612468 +1.4016E-07 -0.016610198 +1.4017E-07 -0.016607868 +1.4019E-07 -0.016605488 +1.4020E-07 -0.016603058 +1.4022E-07 -0.016600498 +1.4023E-07 -0.016597878 +1.4024E-07 -0.016595188 +1.4026E-07 -0.016592438 +1.4027E-07 -0.016589618 +1.4029E-07 -0.016586748 +1.4030E-07 -0.016583808 +1.4032E-07 -0.016580848 +1.4033E-07 -0.016577828 +1.4034E-07 -0.016574758 +1.4036E-07 -0.016571618 +1.4037E-07 -0.016568428 +1.4039E-07 -0.016565178 +1.4040E-07 -0.016561868 +1.4041E-07 -0.016558398 +1.4043E-07 -0.016554868 +1.4044E-07 -0.016551288 +1.4046E-07 -0.016547648 +1.4047E-07 -0.016543958 +1.4049E-07 -0.016540218 +1.4050E-07 -0.016536418 +1.4052E-07 -0.016532598 +1.4053E-07 -0.016528718 +1.4054E-07 -0.016524768 +1.4056E-07 -0.016520758 +1.4057E-07 -0.016516688 +1.4059E-07 -0.016512548 +1.4060E-07 -0.016508348 +1.4062E-07 -0.016504008 +1.4063E-07 -0.016499608 +1.4064E-07 -0.016495158 +1.4066E-07 -0.016490648 +1.4067E-07 -0.016486078 +1.4069E-07 -0.016481448 +1.4070E-07 -0.016476758 +1.4072E-07 -0.016472148 +1.4073E-07 -0.016467488 +1.4075E-07 -0.016462788 +1.4076E-07 -0.016458048 +1.4077E-07 -0.016453258 +1.4079E-07 -0.016448428 +1.4080E-07 -0.016443558 +1.4082E-07 -0.016438408 +1.4083E-07 -0.016433198 +1.4084E-07 -0.016427918 +1.4086E-07 -0.016422578 +1.4087E-07 -0.016417178 +1.4089E-07 -0.016411708 +1.4090E-07 -0.016406188 +1.4093E-07 -0.016394978 +1.4096E-07 -0.016383538 +1.4099E-07 -0.016371868 +1.4102E-07 -0.016359978 +1.4105E-07 -0.016347848 +1.4108E-07 -0.016335498 +1.4111E-07 -0.016322918 +1.4112E-07 -0.016316888 +1.4113E-07 -0.016310818 +1.4115E-07 -0.016304708 +1.4116E-07 -0.016298558 +1.4118E-07 -0.016292368 +1.4119E-07 -0.016286148 +1.4120E-07 -0.016279878 +1.4122E-07 -0.016273378 +1.4123E-07 -0.016266838 +1.4125E-07 -0.016260248 +1.4126E-07 -0.016253608 +1.4127E-07 -0.016246938 +1.4129E-07 -0.016240218 +1.4130E-07 -0.016233448 +1.4131E-07 -0.016230528 +1.4132E-07 -0.016223808 +1.4133E-07 -0.016217048 +1.4135E-07 -0.016210228 +1.4136E-07 -0.016203368 +1.4138E-07 -0.016196458 +1.4139E-07 -0.016189498 +1.4140E-07 -0.016182488 +1.4142E-07 -0.016175298 +1.4143E-07 -0.016168048 +1.4145E-07 -0.016160758 +1.4146E-07 -0.016153418 +1.4147E-07 -0.016146028 +1.4149E-07 -0.016138598 +1.4150E-07 -0.016131108 +1.4152E-07 -0.016123428 +1.4153E-07 -0.016115688 +1.4154E-07 -0.016107898 +1.4156E-07 -0.016100058 +1.4157E-07 -0.016092168 +1.4159E-07 -0.016084218 +1.4160E-07 -0.016076208 +1.4162E-07 -0.016068158 +1.4163E-07 -0.016060068 +1.4164E-07 -0.016051928 +1.4166E-07 -0.016043748 +1.4167E-07 -0.016035518 +1.4169E-07 -0.016027248 +1.4170E-07 -0.016018928 +1.4180E-07 -0.015959268 +1.4182E-07 -0.015950418 +1.4183E-07 -0.015941508 +1.4184E-07 -0.015932538 +1.4186E-07 -0.015923518 +1.4187E-07 -0.015914428 +1.4189E-07 -0.015905288 +1.4190E-07 -0.015896088 +1.4192E-07 -0.015887208 +1.4193E-07 -0.015878288 +1.4195E-07 -0.015869338 +1.4196E-07 -0.015860358 +1.4197E-07 -0.015851338 +1.4199E-07 -0.015842288 +1.4200E-07 -0.015833208 +1.4201E-07 -0.015828138 +1.4202E-07 -0.015823058 +1.4202E-07 -0.015817988 +1.4203E-07 -0.015812898 +1.4204E-07 -0.015807808 +1.4205E-07 -0.015802718 +1.4206E-07 -0.015797618 +1.4207E-07 -0.015790948 +1.4209E-07 -0.015777598 +1.4210E-07 -0.015767458 +1.4211E-07 -0.015759258 +1.4212E-07 -0.015751028 +1.4214E-07 -0.015742758 +1.4215E-07 -0.015734458 +1.4216E-07 -0.015726118 +1.4217E-07 -0.015717748 +1.4219E-07 -0.015709348 +1.4220E-07 -0.015698918 +1.4222E-07 -0.015687458 +1.4223E-07 -0.015675928 +1.4225E-07 -0.015664328 +1.4227E-07 -0.015652658 +1.4228E-07 -0.015640928 +1.4230E-07 -0.015629128 +1.4232E-07 -0.015617258 +1.4233E-07 -0.015608368 +1.4234E-07 -0.015599448 +1.4235E-07 -0.015590508 +1.4236E-07 -0.015581528 +1.4238E-07 -0.015572528 +1.4239E-07 -0.015563498 +1.4240E-07 -0.015554438 +1.4242E-07 -0.015543838 +1.4243E-07 -0.015533208 +1.4244E-07 -0.015522528 +1.4246E-07 -0.015511818 +1.4247E-07 -0.015501068 +1.4249E-07 -0.015490278 +1.4250E-07 -0.015479448 +1.4252E-07 -0.015468588 +1.4253E-07 -0.015457678 +1.4254E-07 -0.015446728 +1.4256E-07 -0.015435748 +1.4257E-07 -0.015424728 +1.4259E-07 -0.015413658 +1.4260E-07 -0.015402558 +1.4262E-07 -0.015390718 +1.4263E-07 -0.015378848 +1.4265E-07 -0.015366928 +1.4266E-07 -0.015354978 +1.4268E-07 -0.015342978 +1.4269E-07 -0.015330948 +1.4271E-07 -0.015318878 +1.4272E-07 -0.015308168 +1.4273E-07 -0.015297418 +1.4275E-07 -0.015286618 +1.4276E-07 -0.015275778 +1.4277E-07 -0.015264898 +1.4279E-07 -0.015253968 +1.4280E-07 -0.015242998 +1.4283E-07 -0.015219718 +1.4286E-07 -0.015196298 +1.4289E-07 -0.015172748 +1.4291E-07 -0.015149068 +1.4294E-07 -0.015125258 +1.4297E-07 -0.015101308 +1.4300E-07 -0.015077238 +1.4302E-07 -0.015064228 +1.4303E-07 -0.015051168 +1.4305E-07 -0.015038078 +1.4306E-07 -0.015024948 +1.4308E-07 -0.015011778 +1.4309E-07 -0.014998578 +1.4311E-07 -0.014985328 +1.4312E-07 -0.014973678 +1.4313E-07 -0.014962008 +1.4315E-07 -0.014950298 +1.4316E-07 -0.014938568 +1.4317E-07 -0.014926808 +1.4319E-07 -0.014915018 +1.4320E-07 -0.014903188 +1.4322E-07 -0.014889808 +1.4323E-07 -0.014876398 +1.4325E-07 -0.014862958 +1.4326E-07 -0.014849488 +1.4328E-07 -0.014835988 +1.4329E-07 -0.014822458 +1.4331E-07 -0.014808898 +1.4332E-07 -0.014796588 +1.4333E-07 -0.014784248 +1.4335E-07 -0.014771878 +1.4336E-07 -0.014759478 +1.4338E-07 -0.014747058 +1.4339E-07 -0.014734598 +1.4340E-07 -0.014722118 +1.4343E-07 -0.014696288 +1.4346E-07 -0.014670358 +1.4349E-07 -0.014644328 +1.4352E-07 -0.014618198 +1.4354E-07 -0.014591958 +1.4357E-07 -0.014565628 +1.4360E-07 -0.014539188 +1.4371E-07 -0.014439228 +1.4372E-07 -0.014425678 +1.4374E-07 -0.014412098 +1.4375E-07 -0.014398478 +1.4376E-07 -0.014384838 +1.4378E-07 -0.014371168 +1.4379E-07 -0.014357468 +1.4381E-07 -0.014343748 +1.4382E-07 -0.014330548 +1.4383E-07 -0.014317338 +1.4385E-07 -0.014304108 +1.4386E-07 -0.014290868 +1.4388E-07 -0.014277598 +1.4389E-07 -0.014264308 +1.4390E-07 -0.014250998 +1.4392E-07 -0.014237108 +1.4393E-07 -0.014223198 +1.4395E-07 -0.014209278 +1.4396E-07 -0.014195328 +1.4397E-07 -0.014181358 +1.4399E-07 -0.014167368 +1.4400E-07 -0.014153368 +1.4402E-07 -0.014139618 +1.4403E-07 -0.014125838 +1.4405E-07 -0.014112048 +1.4406E-07 -0.014098238 +1.4407E-07 -0.014084408 +1.4409E-07 -0.014070558 +1.4410E-07 -0.014056688 +1.4412E-07 -0.014042658 +1.4413E-07 -0.014028608 +1.4414E-07 -0.014014548 +1.4416E-07 -0.014000478 +1.4417E-07 -0.013986388 +1.4419E-07 -0.013972278 +1.4420E-07 -0.013958158 +1.4423E-07 -0.013929548 +1.4426E-07 -0.013900868 +1.4429E-07 -0.013872118 +1.4431E-07 -0.013843318 +1.4434E-07 -0.013814448 +1.4437E-07 -0.013785518 +1.4440E-07 -0.013756518 +1.4441E-07 -0.013741868 +1.4443E-07 -0.013727188 +1.4444E-07 -0.013712498 +1.4446E-07 -0.013697778 +1.4447E-07 -0.013683048 +1.4449E-07 -0.013668298 +1.4450E-07 -0.013653518 +1.4452E-07 -0.013639048 +1.4453E-07 -0.013624558 +1.4454E-07 -0.013610058 +1.4456E-07 -0.013595538 +1.4457E-07 -0.013581008 +1.4459E-07 -0.013566458 +1.4460E-07 -0.013551898 +1.4461E-07 -0.013537028 +1.4463E-07 -0.013522148 +1.4464E-07 -0.013507258 +1.4466E-07 -0.013492348 +1.4467E-07 -0.013477418 +1.4469E-07 -0.013462478 +1.4470E-07 -0.013447528 +1.4472E-07 -0.013432888 +1.4473E-07 -0.013418228 +1.4474E-07 -0.013403548 +1.4476E-07 -0.013388858 +1.4477E-07 -0.013374158 +1.4479E-07 -0.013359438 +1.4480E-07 -0.013344708 +1.4482E-07 -0.013328788 +1.4483E-07 -0.013312848 +1.4485E-07 -0.013296898 +1.4486E-07 -0.013280938 +1.4488E-07 -0.013264958 +1.4489E-07 -0.013248958 +1.4491E-07 -0.013232948 +1.4492E-07 -0.013218898 +1.4493E-07 -0.013204828 +1.4495E-07 -0.013190758 +1.4496E-07 -0.013176678 +1.4497E-07 -0.013162578 +1.4499E-07 -0.013148478 +1.4500E-07 -0.013134368 +1.4503E-07 -0.013104018 +1.4506E-07 -0.013073648 +1.4509E-07 -0.013043248 +1.4512E-07 -0.013012808 +1.4515E-07 -0.012982348 +1.4517E-07 -0.012951858 +1.4520E-07 -0.012921338 +1.4522E-07 -0.012905608 +1.4523E-07 -0.012889878 +1.4525E-07 -0.012874138 +1.4526E-07 -0.012858388 +1.4528E-07 -0.012842638 +1.4529E-07 -0.012826888 +1.4531E-07 -0.012811128 +1.4532E-07 -0.012795958 +1.4534E-07 -0.012780788 +1.4535E-07 -0.012765608 +1.4536E-07 -0.012750428 +1.4538E-07 -0.012735248 +1.4539E-07 -0.012720048 +1.4541E-07 -0.012704858 +1.4542E-07 -0.012690288 +1.4543E-07 -0.012675718 +1.4545E-07 -0.012661128 +1.4546E-07 -0.012646538 +1.4548E-07 -0.012631928 +1.4549E-07 -0.012617318 +1.4550E-07 -0.012602688 +1.4552E-07 -0.012589938 +1.4553E-07 -0.012579268 +1.4554E-07 -0.012568598 +1.4555E-07 -0.012557988 +1.4556E-07 -0.012547378 +1.4557E-07 -0.012536768 +1.4558E-07 -0.012526158 +1.4559E-07 -0.012515668 +1.4560E-07 -0.012505178 +1.4560E-07 -0.012498858 +1.4561E-07 -0.012492598 +1.4562E-07 -0.012484258 +1.4563E-07 -0.012473888 +1.4564E-07 -0.012463518 +1.4565E-07 -0.012453208 +1.4566E-07 -0.012442828 +1.4567E-07 -0.012432578 +1.4568E-07 -0.012422268 +1.4569E-07 -0.012412018 +1.4570E-07 -0.012396698 +1.4571E-07 -0.012390118 +1.4571E-07 -0.012383548 +1.4572E-07 -0.012376978 +1.4573E-07 -0.012370408 +1.4573E-07 -0.012363848 +1.4574E-07 -0.012357298 +1.4575E-07 -0.012350748 +1.4577E-07 -0.012330358 +1.4579E-07 -0.012309978 +1.4580E-07 -0.012299778 +1.4580E-07 -0.012293698 +1.4580E-07 -0.012291618 +1.4581E-07 -0.012287558 +1.4582E-07 -0.012279398 +1.4583E-07 -0.012269208 +1.4584E-07 -0.012259008 +1.4585E-07 -0.012248818 +1.4586E-07 -0.012238628 +1.4587E-07 -0.012228378 +1.4588E-07 -0.012218178 +1.4589E-07 -0.012207928 +1.4590E-07 -0.012191538 +1.4592E-07 -0.012177238 +1.4593E-07 -0.012166978 +1.4594E-07 -0.012156728 +1.4595E-07 -0.012146478 +1.4597E-07 -0.012125978 +1.4599E-07 -0.012105468 +1.4599E-07 -0.012098128 +1.4600E-07 -0.012090788 +1.4601E-07 -0.012083448 +1.4601E-07 -0.012076108 +1.4602E-07 -0.012068768 +1.4603E-07 -0.012061428 +1.4604E-07 -0.012054088 +1.4607E-07 -0.012023278 +1.4608E-07 -0.012007108 +1.4610E-07 -0.011990948 +1.4611E-07 -0.011974788 +1.4613E-07 -0.011958638 +1.4614E-07 -0.011942488 +1.4616E-07 -0.011926348 +1.4618E-07 -0.011910208 +1.4618E-07 -0.011902898 +1.4619E-07 -0.011895578 +1.4620E-07 -0.011888248 +1.4620E-07 -0.011880908 +1.4621E-07 -0.011873558 +1.4622E-07 -0.011866198 +1.4623E-07 -0.011858828 +1.4624E-07 -0.011847408 +1.4625E-07 -0.011835978 +1.4626E-07 -0.011824548 +1.4627E-07 -0.011813108 +1.4628E-07 -0.011801668 +1.4629E-07 -0.011790228 +1.4630E-07 -0.011778778 +1.4632E-07 -0.011764418 +1.4633E-07 -0.011750058 +1.4635E-07 -0.011735708 +1.4636E-07 -0.011721358 +1.4637E-07 -0.011707018 +1.4639E-07 -0.011692678 +1.4640E-07 -0.011678348 +1.4650E-07 -0.011576958 +1.4652E-07 -0.011560138 +1.4653E-07 -0.011543328 +1.4655E-07 -0.011526528 +1.4657E-07 -0.011509728 +1.4658E-07 -0.011492928 +1.4660E-07 -0.011476138 +1.4662E-07 -0.011459358 +1.4670E-07 -0.011371618 +1.4672E-07 -0.011357208 +1.4673E-07 -0.011342808 +1.4674E-07 -0.011328398 +1.4676E-07 -0.011313988 +1.4677E-07 -0.011299578 +1.4679E-07 -0.011285178 +1.4680E-07 -0.011270768 +1.4681E-07 -0.011256258 +1.4683E-07 -0.011241748 +1.4684E-07 -0.011227238 +1.4686E-07 -0.011212728 +1.4687E-07 -0.011198218 +1.4689E-07 -0.011183708 +1.4690E-07 -0.011169198 +1.4691E-07 -0.011154538 +1.4693E-07 -0.011139888 +1.4694E-07 -0.011125248 +1.4696E-07 -0.011110628 +1.4697E-07 -0.011096028 +1.4699E-07 -0.011081438 +1.4700E-07 -0.011066858 +1.4702E-07 -0.011052408 +1.4703E-07 -0.011037968 +1.4704E-07 -0.011023528 +1.4706E-07 -0.011009098 +1.4707E-07 -0.010994668 +1.4709E-07 -0.010980248 +1.4710E-07 -0.010965829 +1.4712E-07 -0.010951456 +1.4713E-07 -0.010937083 +1.4714E-07 -0.01092271 +1.4716E-07 -0.010908336 +1.4717E-07 -0.010893963 +1.4719E-07 -0.01087959 +1.4720E-07 -0.010865217 +1.4723E-07 -0.010835678 +1.4726E-07 -0.010806174 +1.4729E-07 -0.010776704 +1.4732E-07 -0.010747268 +1.4735E-07 -0.010717865 +1.4738E-07 -0.010688497 +1.4741E-07 -0.010659163 +1.4742E-07 -0.010645806 +1.4743E-07 -0.010632453 +1.4745E-07 -0.010619105 +1.4746E-07 -0.010605762 +1.4747E-07 -0.010592424 +1.4749E-07 -0.010579091 +1.4750E-07 -0.010565763 +1.4753E-07 -0.010537206 +1.4756E-07 -0.010508688 +1.4759E-07 -0.01048021 +1.4762E-07 -0.01045177 +1.4765E-07 -0.010423369 +1.4767E-07 -0.010395007 +1.4770E-07 -0.010366683 +1.4772E-07 -0.010352122 +1.4773E-07 -0.010337574 +1.4775E-07 -0.010323042 +1.4776E-07 -0.010308524 +1.4778E-07 -0.01029402 +1.4779E-07 -0.010279532 +1.4781E-07 -0.010265057 +1.4790E-07 -0.010173803 +1.4800E-07 -0.010075395 +1.4802E-07 -0.010061697 +1.4803E-07 -0.010048004 +1.4805E-07 -0.010034316 +1.4806E-07 -0.010020632 +1.4807E-07 -0.010006954 +1.4809E-07 -0.00999328 +1.4810E-07 -0.009979611 +1.4820E-07 -0.009887402 +1.4821E-07 -0.009873494 +1.4823E-07 -0.009859595 +1.4824E-07 -0.009845706 +1.4826E-07 -0.009831827 +1.4827E-07 -0.009817957 +1.4829E-07 -0.009804097 +1.4830E-07 -0.009790247 +1.4840E-07 -0.009696727 +1.4850E-07 -0.009603982 +1.4852E-07 -0.009591215 +1.4853E-07 -0.009578457 +1.4854E-07 -0.009565709 +1.4856E-07 -0.00955297 +1.4857E-07 -0.009540242 +1.4859E-07 -0.009527523 +1.4860E-07 -0.009514814 +1.4863E-07 -0.009488326 +1.4866E-07 -0.009461912 +1.4869E-07 -0.00943557 +1.4872E-07 -0.009409301 +1.4875E-07 -0.009383106 +1.4877E-07 -0.009356983 +1.4880E-07 -0.009330933 +1.4882E-07 -0.009318488 +1.4883E-07 -0.009306067 +1.4884E-07 -0.009293671 +1.4886E-07 -0.009281299 +1.4887E-07 -0.009268951 +1.4889E-07 -0.009256627 +1.4890E-07 -0.009244328 +1.4891E-07 -0.00923168 +1.4893E-07 -0.009219041 +1.4894E-07 -0.009206412 +1.4896E-07 -0.009193793 +1.4897E-07 -0.009181183 +1.4899E-07 -0.009168584 +1.4900E-07 -0.009155994 +1.4903E-07 -0.009131596 +1.4906E-07 -0.009107262 +1.4908E-07 -0.00908299 +1.4911E-07 -0.009058782 +1.4914E-07 -0.009034638 +1.4917E-07 -0.009010556 +1.4920E-07 -0.008986538 +1.4920E-07 -0.008982246 +1.4923E-07 -0.008956905 +1.4926E-07 -0.008931646 +1.4929E-07 -0.008906469 +1.4932E-07 -0.008881376 +1.4935E-07 -0.008856365 +1.4938E-07 -0.008831437 +1.4941E-07 -0.008806591 +1.4951E-07 -0.008723264 +1.4960E-07 -0.008646732 +1.4970E-07 -0.008563047 +1.4972E-07 -0.008551544 +1.4973E-07 -0.008540061 +1.4975E-07 -0.008528598 +1.4976E-07 -0.008517154 +1.4977E-07 -0.008505729 +1.4979E-07 -0.008494324 +1.4980E-07 -0.008482938 +1.4990E-07 -0.008405393 +1.5000E-07 -0.008328085 +1.5010E-07 -0.008248871 +1.5013E-07 -0.008227327 +1.5016E-07 -0.008205865 +1.5019E-07 -0.008184487 +1.5022E-07 -0.008163191 +1.5024E-07 -0.008141978 +1.5027E-07 -0.008120847 +1.5030E-07 -0.0080998 +1.5038E-07 -0.008045202 +1.5040E-07 -0.008030599 +1.5040E-07 -0.008024757 +1.5043E-07 -0.008008724 +1.5046E-07 -0.007986908 +1.5049E-07 -0.007965153 +1.5049E-07 -0.00796001 +1.5050E-07 -0.007954867 +1.5051E-07 -0.007949724 +1.5051E-07 -0.007944581 +1.5052E-07 -0.007939437 +1.5053E-07 -0.007934294 +1.5054E-07 -0.007929151 +1.5057E-07 -0.007907634 +1.5058E-07 -0.007899452 +1.5059E-07 -0.00789129 +1.5060E-07 -0.007883148 +1.5061E-07 -0.007875024 +1.5062E-07 -0.007866921 +1.5063E-07 -0.007858836 +1.5065E-07 -0.007850771 +1.5070E-07 -0.007809883 +1.5072E-07 -0.007799873 +1.5073E-07 -0.007789887 +1.5075E-07 -0.007779926 +1.5076E-07 -0.007769989 +1.5077E-07 -0.007760076 +1.5079E-07 -0.007750188 +1.5080E-07 -0.007740324 +1.5082E-07 -0.007730655 +1.5083E-07 -0.00772101 +1.5085E-07 -0.007711389 +1.5086E-07 -0.007701793 +1.5087E-07 -0.007692221 +1.5089E-07 -0.007682673 +1.5090E-07 -0.007673149 +1.5092E-07 -0.007663429 +1.5093E-07 -0.007653733 +1.5094E-07 -0.007644061 +1.5096E-07 -0.007634414 +1.5097E-07 -0.007624791 +1.5099E-07 -0.007615192 +1.5100E-07 -0.007605617 +1.5103E-07 -0.007585179 +1.5106E-07 -0.007564838 +1.5109E-07 -0.007544594 +1.5112E-07 -0.007524448 +1.5115E-07 -0.007504399 +1.5118E-07 -0.007484447 +1.5122E-07 -0.007464593 +1.5123E-07 -0.007456439 +1.5124E-07 -0.00744831 +1.5125E-07 -0.007440205 +1.5127E-07 -0.007432124 +1.5128E-07 -0.007424068 +1.5129E-07 -0.007416036 +1.5130E-07 -0.007408028 +1.5132E-07 -0.007398569 +1.5133E-07 -0.00738913 +1.5135E-07 -0.00737971 +1.5136E-07 -0.007370309 +1.5138E-07 -0.007360928 +1.5139E-07 -0.007351567 +1.5141E-07 -0.007342224 +1.5144E-07 -0.007323631 +1.5147E-07 -0.007305131 +1.5150E-07 -0.007286723 +1.5153E-07 -0.007268407 +1.5156E-07 -0.007250184 +1.5159E-07 -0.007232053 +1.5162E-07 -0.007214015 +1.5163E-07 -0.007206418 +1.5164E-07 -0.007198836 +1.5165E-07 -0.007191269 +1.5167E-07 -0.007183716 +1.5168E-07 -0.007176178 +1.5169E-07 -0.007168655 +1.5170E-07 -0.007161146 +1.5172E-07 -0.007152634 +1.5173E-07 -0.007144147 +1.5175E-07 -0.007135685 +1.5176E-07 -0.007127246 +1.5177E-07 -0.007118832 +1.5179E-07 -0.007110443 +1.5180E-07 -0.007102077 +1.5183E-07 -0.007085557 +1.5186E-07 -0.00706912 +1.5189E-07 -0.007052765 +1.5192E-07 -0.007036493 +1.5194E-07 -0.007020303 +1.5197E-07 -0.007004197 +1.5200E-07 -0.006988173 +1.5202E-07 -0.006980134 +1.5203E-07 -0.006972109 +1.5204E-07 -0.006964099 +1.5206E-07 -0.006956103 +1.5207E-07 -0.006948122 +1.5209E-07 -0.006940156 +1.5210E-07 -0.006932204 +1.5212E-07 -0.006924295 +1.5213E-07 -0.006916405 +1.5214E-07 -0.006908535 +1.5216E-07 -0.006900684 +1.5217E-07 -0.006892853 +1.5219E-07 -0.006885041 +1.5220E-07 -0.006877249 +1.5222E-07 -0.00686947 +1.5223E-07 -0.006861715 +1.5224E-07 -0.006853985 +1.5226E-07 -0.006846279 +1.5227E-07 -0.006838597 +1.5229E-07 -0.006830939 +1.5230E-07 -0.006823306 +1.5232E-07 -0.006815557 +1.5233E-07 -0.006807821 +1.5234E-07 -0.006800101 +1.5236E-07 -0.006792395 +1.5237E-07 -0.006784703 +1.5239E-07 -0.006777026 +1.5240E-07 -0.006769364 +1.5242E-07 -0.006761898 +1.5243E-07 -0.006754451 +1.5245E-07 -0.006747023 +1.5246E-07 -0.006739615 +1.5247E-07 -0.006732227 +1.5249E-07 -0.006724858 +1.5250E-07 -0.006717508 +1.5252E-07 -0.006710376 +1.5253E-07 -0.006703269 +1.5254E-07 -0.006696186 +1.5256E-07 -0.006689127 +1.5257E-07 -0.006682092 +1.5259E-07 -0.006675082 +1.5260E-07 -0.006668096 +1.5261E-07 -0.006660931 +1.5263E-07 -0.006653776 +1.5264E-07 -0.006646631 +1.5266E-07 -0.006639495 +1.5267E-07 -0.00663237 +1.5269E-07 -0.006625254 +1.5270E-07 -0.006618147 +1.5271E-07 -0.006611113 +1.5273E-07 -0.006604093 +1.5274E-07 -0.006597087 +1.5276E-07 -0.006590097 +1.5277E-07 -0.00658312 +1.5279E-07 -0.006576159 +1.5280E-07 -0.006569212 +1.5281E-07 -0.00656208 +1.5283E-07 -0.006554972 +1.5284E-07 -0.006547889 +1.5286E-07 -0.00654083 +1.5287E-07 -0.006533796 +1.5289E-07 -0.006526785 +1.5290E-07 -0.0065198 +1.5292E-07 -0.006512736 +1.5293E-07 -0.006505696 +1.5295E-07 -0.006498681 +1.5296E-07 -0.006491691 +1.5298E-07 -0.006484724 +1.5299E-07 -0.006477782 +1.5301E-07 -0.006470864 +1.5302E-07 -0.00646463 +1.5303E-07 -0.00645841 +1.5305E-07 -0.006452205 +1.5306E-07 -0.006446015 +1.5307E-07 -0.006439839 +1.5309E-07 -0.006433678 +1.5310E-07 -0.006427532 +1.5312E-07 -0.006420996 +1.5313E-07 -0.006414484 +1.5314E-07 -0.006407997 +1.5316E-07 -0.006401534 +1.5317E-07 -0.006395096 +1.5319E-07 -0.006388682 +1.5320E-07 -0.006382292 +1.5322E-07 -0.006375898 +1.5323E-07 -0.006369524 +1.5324E-07 -0.00636317 +1.5326E-07 -0.006356834 +1.5327E-07 -0.006350519 +1.5329E-07 -0.006344223 +1.5330E-07 -0.006337946 +1.5332E-07 -0.006331552 +1.5333E-07 -0.006325178 +1.5334E-07 -0.006318824 +1.5336E-07 -0.006312489 +1.5337E-07 -0.006306173 +1.5339E-07 -0.006299877 +1.5340E-07 -0.0062936 +1.5350E-07 -0.006251877 +1.5360E-07 -0.006210094 +1.5370E-07 -0.006169205 +1.5380E-07 -0.006129032 +1.5385E-07 -0.006111627 +1.5386E-07 -0.006107693 +1.5387E-07 -0.006103759 +1.5388E-07 -0.006099885 +1.5389E-07 -0.006096011 +1.5390E-07 -0.006092077 +1.5390E-07 -0.006089812 +1.5391E-07 -0.006087487 +1.5392E-07 -0.006084447 +1.5393E-07 -0.006080692 +1.5394E-07 -0.006076937 +1.5395E-07 -0.006073182 +1.5396E-07 -0.006069486 +1.5397E-07 -0.006065851 +1.5398E-07 -0.006062155 +1.5399E-07 -0.006058579 +1.5400E-07 -0.006054943 +1.5400E-07 -0.006052082 +1.5402E-07 -0.00604779 +1.5403E-07 -0.006044274 +1.5404E-07 -0.006040697 +1.5405E-07 -0.00603724 +1.5406E-07 -0.006033664 +1.5408E-07 -0.00602675 +1.5408E-07 -0.006024251 +1.5409E-07 -0.006021763 +1.5410E-07 -0.006019284 +1.5410E-07 -0.006016814 +1.5411E-07 -0.006014355 +1.5412E-07 -0.006011905 +1.5413E-07 -0.006009465 +1.5414E-07 -0.006006008 +1.5415E-07 -0.00600261 +1.5416E-07 -0.005999213 +1.5417E-07 -0.005995756 +1.5418E-07 -0.005992358 +1.5419E-07 -0.005988961 +1.5420E-07 -0.005985563 +1.5420E-07 -0.005982821 +1.5422E-07 -0.005978709 +1.5423E-07 -0.005975371 +1.5424E-07 -0.005971973 +1.5425E-07 -0.005968576 +1.5426E-07 -0.005965178 +1.5427E-07 -0.005961781 +1.5428E-07 -0.005958443 +1.5429E-07 -0.005955105 +1.5430E-07 -0.005951721 +1.5431E-07 -0.005948347 +1.5432E-07 -0.005944982 +1.5433E-07 -0.005941627 +1.5434E-07 -0.005938282 +1.5435E-07 -0.005934947 +1.5436E-07 -0.005931621 +1.5439E-07 -0.005921607 +1.5440E-07 -0.005916855 +1.5441E-07 -0.005912117 +1.5443E-07 -0.005907393 +1.5444E-07 -0.005902685 +1.5446E-07 -0.005897991 +1.5447E-07 -0.005893311 +1.5449E-07 -0.005888646 +1.5450E-07 -0.005883401 +1.5453E-07 -0.00587532 +1.5455E-07 -0.005867273 +1.5458E-07 -0.005859261 +1.5460E-07 -0.005851282 +1.5463E-07 -0.005843338 +1.5465E-07 -0.005835428 +1.5468E-07 -0.005827551 +1.5469E-07 -0.0058226 +1.5471E-07 -0.005817659 +1.5472E-07 -0.005812728 +1.5474E-07 -0.005807806 +1.5475E-07 -0.005802894 +1.5477E-07 -0.005797992 +1.5479E-07 -0.0057931 +1.5479E-07 -0.005791323 +1.5480E-07 -0.00578955 +1.5480E-07 -0.005787783 +1.5481E-07 -0.00578602 +1.5481E-07 -0.005784262 +1.5482E-07 -0.00578251 +1.5483E-07 -0.005780762 +1.5490E-07 -0.005757456 +1.5492E-07 -0.005753101 +1.5493E-07 -0.005748756 +1.5494E-07 -0.005744421 +1.5496E-07 -0.005740095 +1.5497E-07 -0.00573578 +1.5499E-07 -0.005731473 +1.5500E-07 -0.005727177 +1.5502E-07 -0.005722873 +1.5503E-07 -0.005718579 +1.5504E-07 -0.005714295 +1.5506E-07 -0.005710021 +1.5507E-07 -0.005705756 +1.5509E-07 -0.005701501 +1.5510E-07 -0.005697255 +1.5512E-07 -0.005692964 +1.5513E-07 -0.005688672 +1.5514E-07 -0.005684381 +1.5516E-07 -0.005680089 +1.5517E-07 -0.005675798 +1.5519E-07 -0.005671506 +1.5520E-07 -0.005667215 +1.5523E-07 -0.005658885 +1.5526E-07 -0.005650584 +1.5529E-07 -0.005642312 +1.5532E-07 -0.00563407 +1.5535E-07 -0.005625856 +1.5537E-07 -0.005617672 +1.5540E-07 -0.005609517 +1.5543E-07 -0.005601437 +1.5546E-07 -0.00559339 +1.5549E-07 -0.005585378 +1.5552E-07 -0.005577399 +1.5554E-07 -0.005569455 +1.5557E-07 -0.005561544 +1.5560E-07 -0.005553668 +1.5563E-07 -0.005545719 +1.5566E-07 -0.005537794 +1.5569E-07 -0.005529893 +1.5572E-07 -0.005522017 +1.5574E-07 -0.005514165 +1.5577E-07 -0.005506337 +1.5580E-07 -0.005498534 +1.5590E-07 -0.005470877 +1.5600E-07 -0.005444532 +1.5602E-07 -0.005440643 +1.5603E-07 -0.005436759 +1.5604E-07 -0.00543288 +1.5606E-07 -0.005429005 +1.5607E-07 -0.005425136 +1.5609E-07 -0.005421271 +1.5610E-07 -0.005417412 +1.5612E-07 -0.00541371 +1.5613E-07 -0.005410013 +1.5615E-07 -0.005406322 +1.5616E-07 -0.005402635 +1.5617E-07 -0.005398952 +1.5619E-07 -0.005395275 +1.5620E-07 -0.005391603 +1.5622E-07 -0.005387759 +1.5623E-07 -0.005383925 +1.5624E-07 -0.0053801 +1.5626E-07 -0.005376286 +1.5627E-07 -0.005372481 +1.5629E-07 -0.005368685 +1.5630E-07 -0.0053649 +1.5640E-07 -0.005339508 +1.5642E-07 -0.005335733 +1.5643E-07 -0.005331967 +1.5644E-07 -0.00532821 +1.5646E-07 -0.005324464 +1.5647E-07 -0.005320727 +1.5649E-07 -0.005317 +1.5650E-07 -0.005313282 +1.5652E-07 -0.005309677 +1.5653E-07 -0.005306081 +1.5655E-07 -0.005302495 +1.5656E-07 -0.005298919 +1.5657E-07 -0.005295352 +1.5659E-07 -0.005291796 +1.5660E-07 -0.005288248 +1.5662E-07 -0.005284626 +1.5663E-07 -0.005281013 +1.5664E-07 -0.00527741 +1.5666E-07 -0.005273817 +1.5667E-07 -0.005270233 +1.5669E-07 -0.005266659 +1.5670E-07 -0.005263095 +1.5671E-07 -0.005259502 +1.5673E-07 -0.005255909 +1.5674E-07 -0.005252315 +1.5676E-07 -0.005248722 +1.5677E-07 -0.005245129 +1.5679E-07 -0.005241535 +1.5680E-07 -0.005237942 +1.5681E-07 -0.005234217 +1.5683E-07 -0.005230502 +1.5684E-07 -0.005226797 +1.5686E-07 -0.005223102 +1.5687E-07 -0.005219416 +1.5689E-07 -0.00521574 +1.5690E-07 -0.005212074 +1.5692E-07 -0.005208576 +1.5693E-07 -0.005205084 +1.5695E-07 -0.005201597 +1.5696E-07 -0.005198114 +1.5697E-07 -0.005194636 +1.5699E-07 -0.005191163 +1.5700E-07 -0.005187695 +1.5708E-07 -0.005169337 +1.5708E-07 -0.005168356 +1.5708E-07 -0.005167369 +1.5709E-07 -0.005166378 +1.5709E-07 -0.005165381 +1.5710E-07 -0.00516438 +1.5710E-07 -0.005163374 +1.5710E-07 -0.005162363 +1.5713E-07 -0.005155301 +1.5716E-07 -0.005148248 +1.5719E-07 -0.005141205 +1.5722E-07 -0.005134172 +1.5725E-07 -0.005127148 +1.5727E-07 -0.005120134 +1.5730E-07 -0.00511313 +1.5732E-07 -0.005109616 +1.5733E-07 -0.005106106 +1.5735E-07 -0.005102602 +1.5736E-07 -0.005099102 +1.5737E-07 -0.005095607 +1.5739E-07 -0.005092118 +1.5740E-07 -0.005088632 +1.5742E-07 -0.005085005 +1.5743E-07 -0.005081378 +1.5745E-07 -0.00507775 +1.5746E-07 -0.005074123 +1.5748E-07 -0.005070496 +1.5749E-07 -0.005066868 +1.5751E-07 -0.005063241 +1.5752E-07 -0.005059477 +1.5754E-07 -0.005055714 +1.5755E-07 -0.00505195 +1.5757E-07 -0.005048186 +1.5758E-07 -0.005044423 +1.5760E-07 -0.005040659 +1.5762E-07 -0.005036896 +1.5763E-07 -0.005033415 +1.5764E-07 -0.00502994 +1.5766E-07 -0.00502647 +1.5767E-07 -0.005023004 +1.5769E-07 -0.005019543 +1.5770E-07 -0.005016088 +1.5772E-07 -0.005012637 +1.5773E-07 -0.005009435 +1.5774E-07 -0.005006233 +1.5775E-07 -0.005003032 +1.5777E-07 -0.00499983 +1.5778E-07 -0.004996628 +1.5779E-07 -0.004993427 +1.5781E-07 -0.004990225 +1.5784E-07 -0.004981642 +1.5788E-07 -0.004973059 +1.5791E-07 -0.004964476 +1.5795E-07 -0.004955893 +1.5798E-07 -0.00494731 +1.5802E-07 -0.004938727 +1.5806E-07 -0.004930144 +1.5807E-07 -0.004926998 +1.5808E-07 -0.004923862 +1.5809E-07 -0.004920736 +1.5811E-07 -0.004917619 +1.5812E-07 -0.004914513 +1.5813E-07 -0.004911416 +1.5815E-07 -0.004908328 +1.5820E-07 -0.004894202 +1.5822E-07 -0.004890615 +1.5823E-07 -0.004887023 +1.5825E-07 -0.004883426 +1.5826E-07 -0.004879824 +1.5828E-07 -0.004876217 +1.5829E-07 -0.004872606 +1.5831E-07 -0.004868989 +1.5832E-07 -0.004865622 +1.5833E-07 -0.004862265 +1.5835E-07 -0.004858917 +1.5836E-07 -0.00485558 +1.5838E-07 -0.004852251 +1.5839E-07 -0.004848933 +1.5840E-07 -0.004845624 +1.5843E-07 -0.004838665 +1.5846E-07 -0.004831701 +1.5849E-07 -0.004824732 +1.5852E-07 -0.004817759 +1.5855E-07 -0.00481078 +1.5857E-07 -0.004803796 +1.5860E-07 -0.004796808 +1.5862E-07 -0.004792868 +1.5864E-07 -0.004788933 +1.5865E-07 -0.004785003 +1.5867E-07 -0.004781077 +1.5868E-07 -0.004777157 +1.5870E-07 -0.004773241 +1.5872E-07 -0.00476933 +1.5874E-07 -0.004764443 +1.5876E-07 -0.004759496 +1.5879E-07 -0.004752164 +1.5880E-07 -0.004748171 +1.5882E-07 -0.004744686 +1.5883E-07 -0.004741196 +1.5884E-07 -0.004737701 +1.5886E-07 -0.004734201 +1.5887E-07 -0.004730697 +1.5889E-07 -0.004727187 +1.5890E-07 -0.004723673 +1.5891E-07 -0.004720041 +1.5893E-07 -0.004716399 +1.5894E-07 -0.004712747 +1.5896E-07 -0.004709086 +1.5897E-07 -0.004705415 +1.5899E-07 -0.004701734 +1.5900E-07 -0.004698043 +1.5902E-07 -0.004694529 +1.5903E-07 -0.00469102 +1.5905E-07 -0.004687515 +1.5906E-07 -0.004684015 +1.5907E-07 -0.004680521 +1.5909E-07 -0.004677031 +1.5910E-07 -0.004673546 +1.5912E-07 -0.004669952 +1.5913E-07 -0.004666359 +1.5914E-07 -0.004662766 +1.5916E-07 -0.004659172 +1.5917E-07 -0.004655579 +1.5919E-07 -0.004651986 +1.5920E-07 -0.004648393 +1.5922E-07 -0.004644691 +1.5923E-07 -0.004640994 +1.5924E-07 -0.004637302 +1.5926E-07 -0.004633615 +1.5927E-07 -0.004629933 +1.5929E-07 -0.004626256 +1.5930E-07 -0.004622584 +1.5934E-07 -0.004613054 +1.5938E-07 -0.004603505 +1.5942E-07 -0.004593937 +1.5945E-07 -0.004584349 +1.5949E-07 -0.004574742 +1.5953E-07 -0.004565115 +1.5957E-07 -0.004555469 +1.5960E-07 -0.004546111 +1.5962E-07 -0.004542183 +1.5963E-07 -0.00453825 +1.5965E-07 -0.004534313 +1.5966E-07 -0.00453037 +1.5968E-07 -0.004526423 +1.5969E-07 -0.004522471 +1.5971E-07 -0.004518514 +1.5980E-07 -0.004493897 +1.5991E-07 -0.004465943 +1.6000E-07 -0.004440909 +1.6002E-07 -0.004437106 +1.6003E-07 -0.004433294 +1.6004E-07 -0.004429472 +1.6006E-07 -0.00442564 +1.6007E-07 -0.004421799 +1.6009E-07 -0.004417948 +1.6010E-07 -0.004414087 +1.6020E-07 -0.004387384 +1.6030E-07 -0.004359906 +1.6040E-07 -0.004332488 +1.6042E-07 -0.004328594 +1.6043E-07 -0.004324696 +1.6044E-07 -0.004320792 +1.6046E-07 -0.004316884 +1.6047E-07 -0.00431297 +1.6049E-07 -0.004309052 +1.6050E-07 -0.004305129 +1.6051E-07 -0.004301116 +1.6053E-07 -0.004297099 +1.6054E-07 -0.004293076 +1.6056E-07 -0.004289048 +1.6057E-07 -0.004285016 +1.6059E-07 -0.004280979 +1.6060E-07 -0.004276936 +1.6062E-07 -0.004272885 +1.6063E-07 -0.004268818 +1.6064E-07 -0.004264737 +1.6066E-07 -0.004260641 +1.6067E-07 -0.004256531 +1.6069E-07 -0.004252406 +1.6070E-07 -0.004248267 +1.6072E-07 -0.004244322 +1.6073E-07 -0.004240372 +1.6075E-07 -0.004236417 +1.6076E-07 -0.004232458 +1.6077E-07 -0.004228494 +1.6079E-07 -0.004224524 +1.6080E-07 -0.00422055 +1.6082E-07 -0.004216486 +1.6083E-07 -0.004212417 +1.6084E-07 -0.004208344 +1.6086E-07 -0.004204265 +1.6087E-07 -0.004200181 +1.6089E-07 -0.004196093 +1.6090E-07 -0.004192 +1.6092E-07 -0.004187959 +1.6093E-07 -0.004183908 +1.6094E-07 -0.004179848 +1.6096E-07 -0.004175778 +1.6097E-07 -0.004171698 +1.6099E-07 -0.004167608 +1.6100E-07 -0.004163509 +1.6103E-07 -0.004155263 +1.6106E-07 -0.004146992 +1.6109E-07 -0.004138697 +1.6111E-07 -0.004130378 +1.6114E-07 -0.004122035 +1.6117E-07 -0.004113667 +1.6120E-07 -0.004105275 +1.6121E-07 -0.004100956 +1.6123E-07 -0.004096631 +1.6124E-07 -0.004092302 +1.6126E-07 -0.004087968 +1.6127E-07 -0.004083629 +1.6129E-07 -0.004079285 +1.6130E-07 -0.004074936 +1.6132E-07 -0.004070838 +1.6133E-07 -0.004066735 +1.6134E-07 -0.004062627 +1.6136E-07 -0.004058515 +1.6137E-07 -0.004054397 +1.6139E-07 -0.004050275 +1.6140E-07 -0.004046147 +1.6141E-07 -0.004041845 +1.6143E-07 -0.004037537 +1.6144E-07 -0.004033225 +1.6146E-07 -0.004028908 +1.6147E-07 -0.004024586 +1.6149E-07 -0.004020259 +1.6150E-07 -0.004015928 +1.6152E-07 -0.004011619 +1.6153E-07 -0.004007311 +1.6154E-07 -0.004003002 +1.6156E-07 -0.003998693 +1.6157E-07 -0.003994385 +1.6159E-07 -0.003990076 +1.6160E-07 -0.003985768 +1.6162E-07 -0.003981454 +1.6163E-07 -0.003977131 +1.6164E-07 -0.003972798 +1.6166E-07 -0.003968456 +1.6167E-07 -0.003964103 +1.6169E-07 -0.003959741 +1.6170E-07 -0.003955369 +1.6180E-07 -0.003924792 +1.6190E-07 -0.003893977 +1.6200E-07 -0.003862982 +1.6210E-07 -0.00383169 +1.6211E-07 -0.003827932 +1.6213E-07 -0.00382417 +1.6214E-07 -0.003820403 +1.6215E-07 -0.00381663 +1.6216E-07 -0.003812853 +1.6217E-07 -0.003809072 +1.6219E-07 -0.003805285 +1.6220E-07 -0.003802126 +1.6220E-07 -0.003800516 +1.6220E-07 -0.003799622 +1.6221E-07 -0.003798371 +1.6222E-07 -0.003795808 +1.6223E-07 -0.003792649 +1.6224E-07 -0.003789549 +1.6225E-07 -0.00378639 +1.6226E-07 -0.003783231 +1.6227E-07 -0.003780132 +1.6228E-07 -0.003777032 +1.6229E-07 -0.003773933 +1.6230E-07 -0.003770833 +1.6230E-07 -0.003768986 +1.6231E-07 -0.003767138 +1.6232E-07 -0.003764634 +1.6233E-07 -0.003761535 +1.6234E-07 -0.003758495 +1.6235E-07 -0.003755455 +1.6236E-07 -0.003752356 +1.6237E-07 -0.003749256 +1.6238E-07 -0.003746217 +1.6239E-07 -0.003743177 +1.6239E-07 -0.003741394 +1.6240E-07 -0.00373962 +1.6240E-07 -0.003737856 +1.6241E-07 -0.003736102 +1.6241E-07 -0.003734358 +1.6242E-07 -0.003732623 +1.6243E-07 -0.003730898 +1.6245E-07 -0.003724759 +1.6246E-07 -0.003721719 +1.6247E-07 -0.00371862 +1.6248E-07 -0.00371552 +1.6249E-07 -0.00371248 +1.6250E-07 -0.003709381 +1.6250E-07 -0.003706937 +1.6252E-07 -0.003703242 +1.6253E-07 -0.003700142 +1.6254E-07 -0.003697043 +1.6255E-07 -0.003693943 +1.6256E-07 -0.003690844 +1.6257E-07 -0.003687744 +1.6258E-07 -0.003684645 +1.6259E-07 -0.003681546 +1.6260E-07 -0.003676539 +1.6262E-07 -0.003672128 +1.6264E-07 -0.003665929 +1.6266E-07 -0.003659611 +1.6268E-07 -0.003653412 +1.6270E-07 -0.003645187 +1.6272E-07 -0.003640703 +1.6273E-07 -0.00363621 +1.6274E-07 -0.003631706 +1.6276E-07 -0.003627193 +1.6277E-07 -0.003622671 +1.6279E-07 -0.003618138 +1.6280E-07 -0.003613596 +1.6282E-07 -0.003608993 +1.6283E-07 -0.003604381 +1.6284E-07 -0.003599758 +1.6286E-07 -0.003595126 +1.6287E-07 -0.003590484 +1.6289E-07 -0.003585833 +1.6290E-07 -0.003581171 +1.6292E-07 -0.003576716 +1.6293E-07 -0.003572255 +1.6295E-07 -0.00356779 +1.6296E-07 -0.003563319 +1.6297E-07 -0.003558844 +1.6299E-07 -0.003554364 +1.6300E-07 -0.003549879 +1.6303E-07 -0.003540429 +1.6306E-07 -0.003530964 +1.6309E-07 -0.003521484 +1.6312E-07 -0.00351199 +1.6315E-07 -0.003502481 +1.6318E-07 -0.003492958 +1.6321E-07 -0.00348342 +1.6323E-07 -0.003474412 +1.6326E-07 -0.00346539 +1.6329E-07 -0.003456353 +1.6332E-07 -0.003447302 +1.6335E-07 -0.003438236 +1.6337E-07 -0.003429155 +1.6340E-07 -0.00342006 +1.6343E-07 -0.003410576 +1.6346E-07 -0.003401077 +1.6349E-07 -0.003391563 +1.6352E-07 -0.003382035 +1.6355E-07 -0.003372492 +1.6357E-07 -0.003362934 +1.6360E-07 -0.003353362 +1.6362E-07 -0.00334864 +1.6363E-07 -0.003343908 +1.6365E-07 -0.003339167 +1.6366E-07 -0.003334415 +1.6367E-07 -0.003329654 +1.6369E-07 -0.003324884 +1.6370E-07 -0.003320103 +1.6380E-07 -0.003286605 +1.6390E-07 -0.003253048 +1.6392E-07 -0.003248228 +1.6393E-07 -0.003243409 +1.6395E-07 -0.003238589 +1.6396E-07 -0.00323377 +1.6397E-07 -0.003228951 +1.6399E-07 -0.003224131 +1.6400E-07 -0.003219312 +1.6402E-07 -0.003214294 +1.6403E-07 -0.003209271 +1.6405E-07 -0.003204244 +1.6406E-07 -0.003199211 +1.6408E-07 -0.003194174 +1.6409E-07 -0.003189132 +1.6411E-07 -0.003184085 +1.6412E-07 -0.003179521 +1.6413E-07 -0.003174957 +1.6415E-07 -0.003170393 +1.6416E-07 -0.003165829 +1.6417E-07 -0.003161265 +1.6419E-07 -0.003156701 +1.6420E-07 -0.003152137 +1.6422E-07 -0.003147267 +1.6423E-07 -0.003142396 +1.6424E-07 -0.003137526 +1.6426E-07 -0.003132655 +1.6427E-07 -0.003127784 +1.6429E-07 -0.003122914 +1.6430E-07 -0.003118043 +1.6432E-07 -0.003113207 +1.6433E-07 -0.00310837 +1.6434E-07 -0.003103534 +1.6436E-07 -0.003098697 +1.6437E-07 -0.003093861 +1.6439E-07 -0.003089024 +1.6440E-07 -0.003084188 +1.6450E-07 -0.003049558 +1.6460E-07 -0.003015523 +1.6470E-07 -0.002981072 +1.6480E-07 -0.002946263 +1.6490E-07 -0.002911692 +1.6495E-07 -0.002896493 +1.6500E-07 -0.002877479 +1.6510E-07 -0.002842908 +1.6520E-07 -0.002808278 +1.6530E-07 -0.00277329 +1.6540E-07 -0.002739077 +1.6550E-07 -0.002703493 +1.6560E-07 -0.002669995 +1.6570E-07 -0.00263453 +1.6580E-07 -0.002600794 +1.6582E-07 -0.002595571 +1.6583E-07 -0.002590357 +1.6585E-07 -0.002585153 +1.6586E-07 -0.002579959 +1.6588E-07 -0.002574775 +1.6589E-07 -0.0025696 +1.6591E-07 -0.002564435 +1.6592E-07 -0.002559865 +1.6593E-07 -0.0025553 +1.6595E-07 -0.00255074 +1.6596E-07 -0.002546184 +1.6597E-07 -0.002541634 +1.6599E-07 -0.002537088 +1.6600E-07 -0.002532547 +1.6601E-07 -0.002527653 +1.6603E-07 -0.002522764 +1.6604E-07 -0.00251788 +1.6606E-07 -0.002513001 +1.6607E-07 -0.002508127 +1.6609E-07 -0.002503258 +1.6610E-07 -0.002498393 +1.6620E-07 -0.002464359 +1.6630E-07 -0.002430444 +1.6631E-07 -0.002425608 +1.6633E-07 -0.002420771 +1.6634E-07 -0.002415935 +1.6636E-07 -0.002411098 +1.6637E-07 -0.002406262 +1.6639E-07 -0.002401425 +1.6640E-07 -0.002396589 +1.6641E-07 -0.002391735 +1.6643E-07 -0.002386882 +1.6644E-07 -0.002382028 +1.6646E-07 -0.002377175 +1.6647E-07 -0.002372321 +1.6649E-07 -0.002367468 +1.6650E-07 -0.002362614 +1.6652E-07 -0.002357886 +1.6653E-07 -0.002353153 +1.6654E-07 -0.002348415 +1.6656E-07 -0.002343672 +1.6657E-07 -0.002338924 +1.6659E-07 -0.002334172 +1.6660E-07 -0.002329414 +1.6662E-07 -0.002324299 +1.6663E-07 -0.002319189 +1.6665E-07 -0.002314084 +1.6666E-07 -0.002308983 +1.6668E-07 -0.002303888 +1.6669E-07 -0.002298797 +1.6671E-07 -0.002293711 +1.6680E-07 -0.002262538 +1.6683E-07 -0.002253 +1.6686E-07 -0.002243477 +1.6689E-07 -0.002233968 +1.6692E-07 -0.002224474 +1.6695E-07 -0.002214994 +1.6697E-07 -0.002205529 +1.6700E-07 -0.002196079 +1.6701E-07 -0.002193614 +1.6702E-07 -0.002191159 +1.6703E-07 -0.002188714 +1.6703E-07 -0.002186279 +1.6704E-07 -0.002183854 +1.6705E-07 -0.002181438 +1.6706E-07 -0.002179032 +1.6707E-07 -0.002175813 +1.6709E-07 -0.002169257 +1.6710E-07 -0.002166004 +1.6711E-07 -0.002162751 +1.6712E-07 -0.002159498 +1.6713E-07 -0.002156246 +1.6714E-07 -0.002152993 +1.6715E-07 -0.00214974 +1.6716E-07 -0.002146488 +1.6719E-07 -0.002136772 +1.6720E-07 -0.002131586 +1.6722E-07 -0.002126869 +1.6723E-07 -0.002122152 +1.6724E-07 -0.002117435 +1.6726E-07 -0.002112717 +1.6727E-07 -0.002108 +1.6729E-07 -0.002103283 +1.6730E-07 -0.002098565 +1.6732E-07 -0.002094098 +1.6733E-07 -0.002089634 +1.6734E-07 -0.002085176 +1.6736E-07 -0.002080723 +1.6737E-07 -0.002076275 +1.6739E-07 -0.002071831 +1.6740E-07 -0.002067392 +1.6741E-07 -0.002062777 +1.6743E-07 -0.002058162 +1.6744E-07 -0.002053547 +1.6746E-07 -0.002048932 +1.6747E-07 -0.002044317 +1.6749E-07 -0.002039702 +1.6750E-07 -0.002035087 +1.6760E-07 -0.002003675 +1.6761E-07 -0.001999105 +1.6763E-07 -0.00199454 +1.6764E-07 -0.001989979 +1.6766E-07 -0.001985424 +1.6767E-07 -0.001980873 +1.6769E-07 -0.001976327 +1.6770E-07 -0.001971786 +1.6772E-07 -0.001967301 +1.6773E-07 -0.001962822 +1.6774E-07 -0.001958346 +1.6776E-07 -0.001953876 +1.6777E-07 -0.001949411 +1.6779E-07 -0.00194495 +1.6780E-07 -0.001940494 +1.6790E-07 -0.001908785 +1.6800E-07 -0.001878505 +1.6802E-07 -0.001874038 +1.6803E-07 -0.001869574 +1.6804E-07 -0.001865116 +1.6806E-07 -0.001860663 +1.6807E-07 -0.001856215 +1.6809E-07 -0.001851771 +1.6810E-07 -0.001847332 +1.6812E-07 -0.001843092 +1.6813E-07 -0.001838851 +1.6815E-07 -0.001834611 +1.6816E-07 -0.00183037 +1.6817E-07 -0.00182613 +1.6819E-07 -0.00182189 +1.6820E-07 -0.001817649 +1.6822E-07 -0.001813328 +1.6823E-07 -0.001809017 +1.6824E-07 -0.001804716 +1.6826E-07 -0.001800425 +1.6827E-07 -0.001796143 +1.6829E-07 -0.001791871 +1.6830E-07 -0.001787608 +1.6832E-07 -0.001783289 +1.6833E-07 -0.001778964 +1.6834E-07 -0.001774635 +1.6836E-07 -0.001770301 +1.6837E-07 -0.001765962 +1.6839E-07 -0.001761618 +1.6840E-07 -0.00175727 +1.6843E-07 -0.001750773 +1.6846E-07 -0.001741892 +1.6850E-07 -0.001728659 +1.6851E-07 -0.001724453 +1.6853E-07 -0.001720247 +1.6854E-07 -0.00171604 +1.6856E-07 -0.001711834 +1.6857E-07 -0.001707627 +1.6859E-07 -0.001703421 +1.6860E-07 -0.001699215 +1.6862E-07 -0.001695031 +1.6863E-07 -0.001690843 +1.6864E-07 -0.00168665 +1.6866E-07 -0.001682452 +1.6867E-07 -0.00167825 +1.6869E-07 -0.001674042 +1.6870E-07 -0.00166983 +1.6872E-07 -0.001665879 +1.6873E-07 -0.001661928 +1.6874E-07 -0.001657977 +1.6876E-07 -0.001654026 +1.6877E-07 -0.001650075 +1.6879E-07 -0.001646124 +1.6880E-07 -0.001642173 +1.6881E-07 -0.001638012 +1.6883E-07 -0.001633855 +1.6884E-07 -0.001629704 +1.6886E-07 -0.001625557 +1.6887E-07 -0.001621415 +1.6889E-07 -0.001617278 +1.6890E-07 -0.001613146 +1.6892E-07 -0.00160928 +1.6893E-07 -0.001605414 +1.6894E-07 -0.001601548 +1.6896E-07 -0.001597682 +1.6897E-07 -0.001593817 +1.6899E-07 -0.001589951 +1.6900E-07 -0.001586085 +1.6903E-07 -0.001578147 +1.6906E-07 -0.001570238 +1.6909E-07 -0.001562358 +1.6911E-07 -0.001554507 +1.6914E-07 -0.001546685 +1.6917E-07 -0.001538893 +1.6920E-07 -0.00153113 +1.6922E-07 -0.001527053 +1.6923E-07 -0.001522982 +1.6925E-07 -0.001518916 +1.6926E-07 -0.001514854 +1.6928E-07 -0.001510797 +1.6929E-07 -0.001506745 +1.6931E-07 -0.001502698 +1.6940E-07 -0.001477843 +1.6950E-07 -0.001451736 +1.6953E-07 -0.001444343 +1.6956E-07 -0.001436979 +1.6959E-07 -0.001429644 +1.6962E-07 -0.001422338 +1.6964E-07 -0.001415061 +1.6967E-07 -0.001407814 +1.6970E-07 -0.001400595 +1.6973E-07 -0.0013934 +1.6976E-07 -0.001386239 +1.6979E-07 -0.001379112 +1.6982E-07 -0.001372019 +1.6984E-07 -0.00136496 +1.6987E-07 -0.001357936 +1.6990E-07 -0.001350945 +1.6993E-07 -0.001343971 +1.6996E-07 -0.001337031 +1.6999E-07 -0.001330126 +1.7002E-07 -0.001323254 +1.7004E-07 -0.001316417 +1.7007E-07 -0.001309613 +1.7010E-07 -0.001302844 +1.7012E-07 -0.00129946 +1.7013E-07 -0.001296085 +1.7014E-07 -0.001292721 +1.7016E-07 -0.001289366 +1.7017E-07 -0.001286021 +1.7019E-07 -0.001282685 +1.7020E-07 -0.00127936 +1.7022E-07 -0.001275958 +1.7023E-07 -0.001272567 +1.7024E-07 -0.001269185 +1.7026E-07 -0.001265814 +1.7027E-07 -0.001262451 +1.7029E-07 -0.001259099 +1.7030E-07 -0.001255756 +1.7032E-07 -0.001252497 +1.7033E-07 -0.001249243 +1.7035E-07 -0.001245994 +1.7036E-07 -0.00124275 +1.7037E-07 -0.001239511 +1.7039E-07 -0.001236276 +1.7040E-07 -0.001233047 +1.7042E-07 -0.001229878 +1.7043E-07 -0.001226724 +1.7045E-07 -0.001223584 +1.7046E-07 -0.001220459 +1.7047E-07 -0.001217349 +1.7049E-07 -0.001214253 +1.7050E-07 -0.001211172 +1.7052E-07 -0.001208072 +1.7053E-07 -0.001205867 +1.7054E-07 -0.001203662 +1.7055E-07 -0.001201456 +1.7056E-07 -0.001199251 +1.7057E-07 -0.001197105 +1.7058E-07 -0.001194959 +1.7059E-07 -0.001192814 +1.7060E-07 -0.001190668 +1.7060E-07 -0.001189357 +1.7061E-07 -0.001188164 +1.7062E-07 -0.001186436 +1.7063E-07 -0.00118435 +1.7064E-07 -0.001182323 +1.7065E-07 -0.001180237 +1.7066E-07 -0.001178151 +1.7067E-07 -0.001176124 +1.7068E-07 -0.001174098 +1.7069E-07 -0.001172071 +1.7070E-07 -0.001169091 +1.7071E-07 -0.001167518 +1.7072E-07 -0.00116595 +1.7072E-07 -0.001164387 +1.7073E-07 -0.001162829 +1.7074E-07 -0.001161275 +1.7075E-07 -0.001159727 +1.7076E-07 -0.001158183 +1.7078E-07 -0.001154249 +1.7079E-07 -0.001152282 +1.7080E-07 -0.001149362 +1.7081E-07 -0.001147991 +1.7082E-07 -0.001146441 +1.7083E-07 -0.001144534 +1.7084E-07 -0.001142567 +1.7085E-07 -0.0011406 +1.7086E-07 -0.001138693 +1.7087E-07 -0.001136726 +1.7088E-07 -0.001134818 +1.7089E-07 -0.001132851 +1.7090E-07 -0.00112999 +1.7091E-07 -0.001127657 +1.7092E-07 -0.001125324 +1.7094E-07 -0.001122991 +1.7095E-07 -0.001120658 +1.7096E-07 -0.001118325 +1.7097E-07 -0.001115992 +1.7099E-07 -0.001113659 +1.7100E-07 -0.001110798 +1.7101E-07 -0.001108078 +1.7103E-07 -0.001105368 +1.7104E-07 -0.001102667 +1.7106E-07 -0.001099976 +1.7107E-07 -0.001097295 +1.7109E-07 -0.001094624 +1.7110E-07 -0.001091963 +1.7111E-07 -0.001089306 +1.7113E-07 -0.001086649 +1.7114E-07 -0.001083993 +1.7116E-07 -0.001081336 +1.7117E-07 -0.001078679 +1.7119E-07 -0.001076023 +1.7120E-07 -0.001073366 +1.7121E-07 -0.001070754 +1.7123E-07 -0.001068147 +1.7124E-07 -0.001065546 +1.7126E-07 -0.001062949 +1.7127E-07 -0.001060356 +1.7129E-07 -0.001057769 +1.7130E-07 -0.001055187 +1.7132E-07 -0.001050962 +1.7135E-07 -0.001046752 +1.7137E-07 -0.001042556 +1.7139E-07 -0.001038376 +1.7142E-07 -0.001034209 +1.7144E-07 -0.001030058 +1.7147E-07 -0.001025921 +1.7148E-07 -0.001022928 +1.7150E-07 -0.001019946 +1.7152E-07 -0.001016973 +1.7153E-07 -0.001014009 +1.7155E-07 -0.001011056 +1.7157E-07 -0.001008112 +1.7159E-07 -0.001005178 +1.7160E-07 -0.001002675 +1.7163E-07 -0.000997756 +1.7166E-07 -0.000992875 +1.7169E-07 -0.000988034 +1.7171E-07 -0.000983232 +1.7174E-07 -0.000978468 +1.7177E-07 -0.000973743 +1.7180E-07 -0.000969058 +1.7190E-07 -0.000952786 +1.7200E-07 -0.000936871 +1.7202E-07 -0.000934282 +1.7203E-07 -0.000931706 +1.7205E-07 -0.000929146 +1.7207E-07 -0.0009266 +1.7208E-07 -0.000924068 +1.7210E-07 -0.000921552 +1.7212E-07 -0.00091905 +1.7220E-07 -0.000905996 +1.7221E-07 -0.000903804 +1.7223E-07 -0.000901622 +1.7224E-07 -0.000899449 +1.7226E-07 -0.000897287 +1.7227E-07 -0.000895133 +1.7229E-07 -0.00089299 +1.7230E-07 -0.000890857 +1.7232E-07 -0.000888745 +1.7233E-07 -0.000886633 +1.7234E-07 -0.000884521 +1.7236E-07 -0.00088241 +1.7237E-07 -0.000880298 +1.7239E-07 -0.000878186 +1.7240E-07 -0.000876075 +1.7242E-07 -0.000873985 +1.7243E-07 -0.000871905 +1.7244E-07 -0.000869834 +1.7246E-07 -0.000867774 +1.7247E-07 -0.000865723 +1.7249E-07 -0.000863682 +1.7250E-07 -0.00086165 +1.7253E-07 -0.000857561 +1.7256E-07 -0.0008535 +1.7259E-07 -0.000849469 +1.7262E-07 -0.000845467 +1.7264E-07 -0.000841494 +1.7267E-07 -0.00083755 +1.7270E-07 -0.000833636 +1.7272E-07 -0.00083154 +1.7273E-07 -0.000829459 +1.7275E-07 -0.000827392 +1.7276E-07 -0.00082534 +1.7278E-07 -0.000823303 +1.7279E-07 -0.00082128 +1.7281E-07 -0.000819271 +1.7282E-07 -0.000818198 +1.7290E-07 -0.000806933 +1.7300E-07 -0.000793939 +1.7301E-07 -0.000792088 +1.7303E-07 -0.000790246 +1.7304E-07 -0.000788414 +1.7306E-07 -0.000786592 +1.7307E-07 -0.00078478 +1.7309E-07 -0.000782977 +1.7310E-07 -0.000781184 +1.7320E-07 -0.000768607 +1.7330E-07 -0.000756448 +1.7340E-07 -0.000744587 +1.7350E-07 -0.000732725 +1.7353E-07 -0.000729476 +1.7356E-07 -0.000726252 +1.7359E-07 -0.000723051 +1.7362E-07 -0.000719875 +1.7364E-07 -0.000716723 +1.7367E-07 -0.000713596 +1.7370E-07 -0.000710493 +1.7380E-07 -0.000699645 +1.7390E-07 -0.000689035 +1.7400E-07 -0.000678783 +1.7410E-07 -0.00066865 +1.7420E-07 -0.000658756 +1.7430E-07 -0.000648921 +1.7440E-07 -0.000639802 +1.7450E-07 -0.000630503 +1.7460E-07 -0.000621682 +1.7470E-07 -0.000612801 +1.7480E-07 -0.000604277 +1.7490E-07 -0.000595814 +1.7500E-07 -0.000587707 +1.7510E-07 -0.000579601 +1.7521E-07 -0.000571256 +1.7523E-07 -0.000569309 +1.7526E-07 -0.000567366 +1.7528E-07 -0.000565429 +1.7531E-07 -0.000563496 +1.7533E-07 -0.000561568 +1.7536E-07 -0.000559644 +1.7539E-07 -0.000557726 +1.7540E-07 -0.000556534 +1.7541E-07 -0.000555625 +1.7543E-07 -0.000554722 +1.7544E-07 -0.000553823 +1.7545E-07 -0.000552929 +1.7546E-07 -0.000552039 +1.7547E-07 -0.000551155 +1.7549E-07 -0.000550276 +1.7550E-07 -0.000549049 +1.7552E-07 -0.000547823 +1.7554E-07 -0.000546597 +1.7555E-07 -0.000545371 +1.7557E-07 -0.000544145 +1.7559E-07 -0.000542919 +1.7560E-07 -0.000541692 +1.7570E-07 -0.00053454 +1.7572E-07 -0.000533552 +1.7573E-07 -0.000532564 +1.7575E-07 -0.000531577 +1.7576E-07 -0.000530589 +1.7577E-07 -0.000529601 +1.7579E-07 -0.000528614 +1.7580E-07 -0.000527626 +1.7582E-07 -0.000526621 +1.7583E-07 -0.000525616 +1.7584E-07 -0.000524612 +1.7586E-07 -0.000523607 +1.7587E-07 -0.000522602 +1.7589E-07 -0.000521597 +1.7590E-07 -0.000520592 +1.7592E-07 -0.000519599 +1.7593E-07 -0.00051861 +1.7595E-07 -0.000517626 +1.7596E-07 -0.000516646 +1.7597E-07 -0.000515672 +1.7599E-07 -0.000514703 +1.7600E-07 -0.000513738 +1.7611E-07 -0.000506705 +1.7612E-07 -0.000505825 +1.7613E-07 -0.000504941 +1.7615E-07 -0.000504052 +1.7616E-07 -0.000503157 +1.7617E-07 -0.000502259 +1.7619E-07 -0.000501355 +1.7620E-07 -0.000500446 +1.7622E-07 -0.000499492 +1.7623E-07 -0.000498539 +1.7624E-07 -0.000497585 +1.7626E-07 -0.000496631 +1.7627E-07 -0.000495678 +1.7629E-07 -0.000494724 +1.7630E-07 -0.00049377 +1.7632E-07 -0.000492851 +1.7633E-07 -0.000491931 +1.7635E-07 -0.000491012 +1.7636E-07 -0.000490092 +1.7637E-07 -0.000489172 +1.7639E-07 -0.000488253 +1.7640E-07 -0.000487333 +1.7642E-07 -0.000486413 +1.7643E-07 -0.000485494 +1.7644E-07 -0.000484574 +1.7646E-07 -0.000483655 +1.7647E-07 -0.000482735 +1.7649E-07 -0.000481815 +1.7650E-07 -0.000480896 +1.7652E-07 -0.000479976 +1.7653E-07 -0.000479057 +1.7654E-07 -0.000478137 +1.7656E-07 -0.000477217 +1.7657E-07 -0.000476298 +1.7659E-07 -0.000475378 +1.7660E-07 -0.000474458 +1.7662E-07 -0.000473556 +1.7663E-07 -0.000472653 +1.7664E-07 -0.000471751 +1.7666E-07 -0.000470848 +1.7667E-07 -0.000469946 +1.7669E-07 -0.000469043 +1.7670E-07 -0.00046814 +1.7671E-07 -0.000467238 +1.7673E-07 -0.000466335 +1.7674E-07 -0.000465433 +1.7676E-07 -0.00046453 +1.7677E-07 -0.000463627 +1.7679E-07 -0.000462725 +1.7680E-07 -0.000461822 +1.7690E-07 -0.000455504 +1.7700E-07 -0.000449186 +1.7710E-07 -0.000442928 +1.7720E-07 -0.000436669 +1.7730E-07 -0.000430351 +1.7740E-07 -0.000424093 +1.7750E-07 -0.000417834 +1.7760E-07 -0.000411397 +1.7762E-07 -0.000410443 +1.7763E-07 -0.000409489 +1.7765E-07 -0.000408536 +1.7766E-07 -0.000407582 +1.7768E-07 -0.000406628 +1.7769E-07 -0.000405675 +1.7771E-07 -0.000404721 +1.7780E-07 -0.000398641 +1.7790E-07 -0.000392204 +1.7800E-07 -0.000385767 +1.7803E-07 -0.000383923 +1.7806E-07 -0.000382069 +1.7809E-07 -0.000380205 +1.7811E-07 -0.000378332 +1.7814E-07 -0.000376449 +1.7817E-07 -0.000374556 +1.7820E-07 -0.000372654 +1.7830E-07 -0.00036574 +1.7840E-07 -0.000359183 +1.7850E-07 -0.00035215 +1.7860E-07 -0.000345176 +1.7862E-07 -0.000344205 +1.7863E-07 -0.000343235 +1.7864E-07 -0.000342264 +1.7866E-07 -0.000341293 +1.7867E-07 -0.000340322 +1.7869E-07 -0.000339352 +1.7870E-07 -0.000338381 +1.7871E-07 -0.000337359 +1.7873E-07 -0.000336337 +1.7874E-07 -0.000335316 +1.7876E-07 -0.000334294 +1.7877E-07 -0.000333272 +1.7879E-07 -0.00033225 +1.7880E-07 -0.000331228 +1.7881E-07 -0.000330673 +1.7882E-07 -0.000330112 +1.7882E-07 -0.000329546 +1.7883E-07 -0.000328976 +1.7884E-07 -0.0003284 +1.7885E-07 -0.00032782 +1.7886E-07 -0.000327235 +1.7887E-07 -0.00032652 +1.7888E-07 -0.000325804 +1.7889E-07 -0.000325089 +1.7890E-07 -0.000324374 +1.7890E-07 -0.000323897 +1.7891E-07 -0.00032348 +1.7892E-07 -0.000322943 +1.7893E-07 -0.000322228 +1.7894E-07 -0.000321453 +1.7895E-07 -0.000320738 +1.7896E-07 -0.000320023 +1.7897E-07 -0.000319308 +1.7898E-07 -0.000318592 +1.7899E-07 -0.000317877 +1.7900E-07 -0.000317162 +1.7900E-07 -0.000316804 +1.7901E-07 -0.000316268 +1.7902E-07 -0.000315731 +1.7903E-07 -0.000315016 +1.7904E-07 -0.000314301 +1.7905E-07 -0.000313586 +1.7907E-07 -0.000312155 +1.7907E-07 -0.000311774 +1.7908E-07 -0.000311398 +1.7908E-07 -0.000311027 +1.7909E-07 -0.000310661 +1.7909E-07 -0.0003103 +1.7910E-07 -0.000309944 +1.7910E-07 -0.000309592 +1.7911E-07 -0.000308899 +1.7912E-07 -0.000308215 +1.7913E-07 -0.000307541 +1.7914E-07 -0.000306877 +1.7915E-07 -0.000306223 +1.7916E-07 -0.000305578 +1.7917E-07 -0.000304943 +1.7918E-07 -0.000304168 +1.7919E-07 -0.000303453 +1.7920E-07 -0.000302261 +1.7922E-07 -0.000301247 +1.7924E-07 -0.000299757 +1.7926E-07 -0.000298267 +1.7928E-07 -0.000296777 +1.7929E-07 -0.00029571 +1.7930E-07 -0.000294639 +1.7932E-07 -0.000293562 +1.7933E-07 -0.000292481 +1.7935E-07 -0.000291394 +1.7936E-07 -0.000290303 +1.7938E-07 -0.000289207 +1.7940E-07 -0.0002873 +1.7942E-07 -0.000285728 +1.7944E-07 -0.000284147 +1.7946E-07 -0.000282556 +1.7948E-07 -0.000280955 +1.7950E-07 -0.000279344 +1.7952E-07 -0.000277724 +1.7955E-07 -0.000276094 +1.7960E-07 -0.000271624 +1.7963E-07 -0.000269331 +1.7966E-07 -0.000267033 +1.7969E-07 -0.00026473 +1.7972E-07 -0.000262423 +1.7974E-07 -0.00026011 +1.7977E-07 -0.000257793 +1.7980E-07 -0.000255471 +1.7982E-07 -0.000254239 +1.7983E-07 -0.000253011 +1.7984E-07 -0.000251789 +1.7986E-07 -0.000250571 +1.7987E-07 -0.000249358 +1.7989E-07 -0.000248151 +1.7990E-07 -0.000246948 +1.7992E-07 -0.000245779 +1.7993E-07 -0.000244605 +1.7995E-07 -0.000243426 +1.7996E-07 -0.000242242 +1.7997E-07 -0.000241054 +1.7999E-07 -0.000239861 +1.8000E-07 -0.000238662 +1.8002E-07 -0.000237419 +1.8003E-07 -0.000236176 +1.8004E-07 -0.000234933 +1.8006E-07 -0.00023369 +1.8007E-07 -0.000232447 +1.8009E-07 -0.000231203 +1.8010E-07 -0.00022996 +1.8020E-07 -0.000221258 +1.8030E-07 -0.00021196 +1.8040E-07 -0.000203138 +1.8043E-07 -0.00020046 +1.8046E-07 -0.000197771 +1.8049E-07 -0.000195073 +1.8051E-07 -0.000192365 +1.8054E-07 -0.000189648 +1.8057E-07 -0.000186921 +1.8060E-07 -0.000184184 +1.8070E-07 -0.000174528 +1.8080E-07 -0.000164753 +1.8083E-07 -0.00016191 +1.8086E-07 -0.000159053 +1.8089E-07 -0.000156181 +1.8091E-07 -0.000153294 +1.8094E-07 -0.000150393 +1.8097E-07 -0.000147477 +1.8100E-07 -0.000144547 +1.8110E-07 -0.000134056 +1.8120E-07 -0.000123626 +1.8121E-07 -0.000122076 +1.8123E-07 -0.000120526 +1.8124E-07 -0.000118976 +1.8126E-07 -0.000117427 +1.8127E-07 -0.000115877 +1.8129E-07 -0.000114327 +1.8130E-07 -0.000112777 +1.8140E-07 -0.000101989 +1.8141E-07 -0.000100417 +1.8143E-07 -9.88361E-05 +1.8144E-07 -9.7245E-05 +1.8146E-07 -9.56442E-05 +1.8147E-07 -9.40337E-05 +1.8149E-07 -9.24134E-05 +1.8150E-07 -9.07834E-05 +1.8160E-07 -7.95181E-05 +1.8162E-07 -7.78042E-05 +1.8163E-07 -7.60854E-05 +1.8165E-07 -7.43617E-05 +1.8166E-07 -7.26332E-05 +1.8168E-07 -7.08998E-05 +1.8169E-07 -6.91615E-05 +1.8171E-07 -6.74184E-05 +1.8180E-07 -5.65107E-05 +1.8183E-07 -5.31741E-05 +1.8186E-07 -4.98228E-05 +1.8189E-07 -4.6457E-05 +1.8192E-07 -4.30766E-05 +1.8194E-07 -3.96815E-05 +1.8197E-07 -3.62719E-05 +1.8200E-07 -3.28477E-05 +1.8202E-07 -3.10997E-05 +1.8203E-07 -2.93468E-05 +1.8204E-07 -2.75891E-05 +1.8206E-07 -2.58265E-05 +1.8207E-07 -2.4059E-05 +1.8209E-07 -2.22867E-05 +1.8210E-07 -2.05095E-05 +1.8212E-07 -1.87895E-05 +1.8213E-07 -1.70695E-05 +1.8215E-07 -1.53495E-05 +1.8216E-07 -1.36294E-05 +1.8217E-07 -1.19094E-05 +1.8219E-07 -1.01894E-05 +1.8220E-07 -8.46939E-06 +1.8222E-07 -6.59609E-06 +1.8223E-07 -4.72279E-06 +1.8225E-07 -2.84949E-06 +1.8226E-07 -9.76189E-07 +1.8228E-07 8.97111E-07 +1.8229E-07 2.77031E-06 +1.8231E-07 4.64361E-06 +1.8232E-07 6.38681E-06 +1.8233E-07 8.12501E-06 +1.8235E-07 9.85841E-06 +1.8236E-07 1.1587E-05 +1.8238E-07 1.33106E-05 +1.8239E-07 1.50294E-05 +1.8240E-07 1.67434E-05 +1.8242E-07 1.86337E-05 +1.8243E-07 2.0524E-05 +1.8245E-07 2.24143E-05 +1.8246E-07 2.43047E-05 +1.8248E-07 2.6195E-05 +1.8249E-07 2.80853E-05 +1.8251E-07 2.99756E-05 +1.8260E-07 4.20756E-05 +1.8270E-07 5.50696E-05 +1.8280E-07 6.82416E-05 +1.8290E-07 8.15336E-05 +1.8300E-07 9.48846E-05 +1.8310E-07 0.000108595 +1.8312E-07 0.00011053 +1.8313E-07 0.00011247 +1.8314E-07 0.000114415 +1.8316E-07 0.000116365 +1.8317E-07 0.00011832 +1.8319E-07 0.000120279 +1.8320E-07 0.000122244 +1.8330E-07 0.000136072 +1.8332E-07 0.000138019 +1.8333E-07 0.000139975 +1.8334E-07 0.00014194 +1.8336E-07 0.000143916 +1.8337E-07 0.000145901 +1.8339E-07 0.000147896 +1.8340E-07 0.000149901 +1.8350E-07 0.000164384 +1.8360E-07 0.000178094 +1.8370E-07 0.000192518 +1.8371E-07 0.000194063 +1.8372E-07 0.000195598 +1.8373E-07 0.000197123 +1.8374E-07 0.000198639 +1.8375E-07 0.000200145 +1.8376E-07 0.000201641 +1.8378E-07 0.000203128 +1.8380E-07 0.000206763 +1.8381E-07 0.000208858 +1.8383E-07 0.000210953 +1.8384E-07 0.000213047 +1.8386E-07 0.000215142 +1.8387E-07 0.000217237 +1.8389E-07 0.000219331 +1.8390E-07 0.000221426 +1.8392E-07 0.000223481 +1.8393E-07 0.00022554 +1.8394E-07 0.000227604 +1.8396E-07 0.000229673 +1.8397E-07 0.000231747 +1.8399E-07 0.000233826 +1.8400E-07 0.00023591 +1.8401E-07 0.000238039 +1.8403E-07 0.000240168 +1.8404E-07 0.000242296 +1.8406E-07 0.000244425 +1.8407E-07 0.000246554 +1.8409E-07 0.000248682 +1.8410E-07 0.000250811 +1.8412E-07 0.000252923 +1.8413E-07 0.000255035 +1.8414E-07 0.000257146 +1.8416E-07 0.000259258 +1.8417E-07 0.00026137 +1.8419E-07 0.000263481 +1.8420E-07 0.000265593 +1.8423E-07 0.000269975 +1.8426E-07 0.000274366 +1.8429E-07 0.000278767 +1.8432E-07 0.000283178 +1.8435E-07 0.000287598 +1.8438E-07 0.000292028 +1.8441E-07 0.000296468 +1.8450E-07 0.000310595 +1.8453E-07 0.000314943 +1.8456E-07 0.000319287 +1.8459E-07 0.000323626 +1.8462E-07 0.00032796 +1.8464E-07 0.00033229 +1.8467E-07 0.000336614 +1.8470E-07 0.000340933 +1.8480E-07 0.000356252 +1.8490E-07 0.00037157 +1.8500E-07 0.000386769 +1.8501E-07 0.000388977 +1.8503E-07 0.00039119 +1.8504E-07 0.000393407 +1.8506E-07 0.00039563 +1.8507E-07 0.000397857 +1.8509E-07 0.000400089 +1.8510E-07 0.000402326 +1.8520E-07 0.000417585 +1.8530E-07 0.000433142 +1.8540E-07 0.000448579 +1.8550E-07 0.000464017 +1.8552E-07 0.000466237 +1.8553E-07 0.000468452 +1.8554E-07 0.000470662 +1.8556E-07 0.000472868 +1.8557E-07 0.000475068 +1.8559E-07 0.000477264 +1.8560E-07 0.000479455 +1.8563E-07 0.000483923 +1.8566E-07 0.000488386 +1.8569E-07 0.000492844 +1.8572E-07 0.000497297 +1.8575E-07 0.000501746 +1.8577E-07 0.000506189 +1.8580E-07 0.000510628 +1.8582E-07 0.000512904 +1.8583E-07 0.000515185 +1.8585E-07 0.00051747 +1.8586E-07 0.000519761 +1.8588E-07 0.000522056 +1.8589E-07 0.000524356 +1.8591E-07 0.000526662 +1.8600E-07 0.000541086 +1.8603E-07 0.000545445 +1.8606E-07 0.000549805 +1.8609E-07 0.000554165 +1.8612E-07 0.000558524 +1.8614E-07 0.000562884 +1.8617E-07 0.000567244 +1.8620E-07 0.000571603 +1.8630E-07 0.000586862 +1.8641E-07 0.000602896 +1.8643E-07 0.000607074 +1.8646E-07 0.000611248 +1.8649E-07 0.000615416 +1.8652E-07 0.00061958 +1.8655E-07 0.000623739 +1.8657E-07 0.000627893 +1.8660E-07 0.000632043 +1.8670E-07 0.000646944 +1.8680E-07 0.000661666 +1.8690E-07 0.000676508 +1.8700E-07 0.000691409 +1.8710E-07 0.000705654 +1.8711E-07 0.000707397 +1.8713E-07 0.000709136 +1.8714E-07 0.000710869 +1.8715E-07 0.000712598 +1.8716E-07 0.000714321 +1.8717E-07 0.00071604 +1.8719E-07 0.000717754 +1.8720E-07 0.000719185 +1.8720E-07 0.0007199 +1.8720E-07 0.000720317 +1.8721E-07 0.000720913 +1.8722E-07 0.000722046 +1.8723E-07 0.000723476 +1.8724E-07 0.000724907 +1.8725E-07 0.000726337 +1.8726E-07 0.000727708 +1.8727E-07 0.000729079 +1.8728E-07 0.000730509 +1.8729E-07 0.00073188 +1.8730E-07 0.000733251 +1.8730E-07 0.000734086 +1.8731E-07 0.00073492 +1.8732E-07 0.000735993 +1.8733E-07 0.000737304 +1.8734E-07 0.000738675 +1.8735E-07 0.000740046 +1.8736E-07 0.000741357 +1.8737E-07 0.000742728 +1.8738E-07 0.000744099 +1.8739E-07 0.000745411 +1.8740E-07 0.000747556 +1.8741E-07 0.000748391 +1.8741E-07 0.000749225 +1.8742E-07 0.00075006 +1.8743E-07 0.000750894 +1.8743E-07 0.000751729 +1.8744E-07 0.000752563 +1.8745E-07 0.000753398 +1.8746E-07 0.000754709 +1.8747E-07 0.00075602 +1.8748E-07 0.000757331 +1.8749E-07 0.000758643 +1.8750E-07 0.000759954 +1.8750E-07 0.000761027 +1.8752E-07 0.000762577 +1.8753E-07 0.000763888 +1.8754E-07 0.000765199 +1.8755E-07 0.000766511 +1.8756E-07 0.000767822 +1.8757E-07 0.000769133 +1.8758E-07 0.000770445 +1.8759E-07 0.000771756 +1.8760E-07 0.000773842 +1.8762E-07 0.00077569 +1.8764E-07 0.000778312 +1.8766E-07 0.000780935 +1.8768E-07 0.000783558 +1.8769E-07 0.000785203 +1.8770E-07 0.000786854 +1.8771E-07 0.00078851 +1.8773E-07 0.00079017 +1.8774E-07 0.000791835 +1.8775E-07 0.000793505 +1.8777E-07 0.00079518 +1.8780E-07 0.00079983 +1.8782E-07 0.000801709 +1.8783E-07 0.000803583 +1.8784E-07 0.000805453 +1.8786E-07 0.000807318 +1.8787E-07 0.000809178 +1.8789E-07 0.000811033 +1.8790E-07 0.000812883 +1.8792E-07 0.000814688 +1.8793E-07 0.000816493 +1.8795E-07 0.000818299 +1.8796E-07 0.000820104 +1.8797E-07 0.000821909 +1.8799E-07 0.000823714 +1.8800E-07 0.000825519 +1.8802E-07 0.000827256 +1.8803E-07 0.000828993 +1.8805E-07 0.00083073 +1.8806E-07 0.000832467 +1.8807E-07 0.000834204 +1.8809E-07 0.000835942 +1.8810E-07 0.000837679 +1.8820E-07 0.000849898 +1.8830E-07 0.000862116 +1.8840E-07 0.000874037 +1.8850E-07 0.000885958 +1.8859E-07 0.000895733 +1.8860E-07 0.000897402 +1.8870E-07 0.000909204 +1.8872E-07 0.000910788 +1.8873E-07 0.000912372 +1.8875E-07 0.000913955 +1.8876E-07 0.000915539 +1.8877E-07 0.000917123 +1.8879E-07 0.000918707 +1.8880E-07 0.000920291 +1.8890E-07 0.000931317 +1.8892E-07 0.000932879 +1.8893E-07 0.000934431 +1.8894E-07 0.000935974 +1.8896E-07 0.000937507 +1.8897E-07 0.00093903 +1.8899E-07 0.000940543 +1.8900E-07 0.000942046 +1.8910E-07 0.000952835 +1.8912E-07 0.000954322 +1.8913E-07 0.000955805 +1.8914E-07 0.000957283 +1.8916E-07 0.000958756 +1.8917E-07 0.000960224 +1.8919E-07 0.000961688 +1.8920E-07 0.000963146 +1.8922E-07 0.000964748 +1.8923E-07 0.000966336 +1.8925E-07 0.000967909 +1.8926E-07 0.000969467 +1.8928E-07 0.00097101 +1.8929E-07 0.00097254 +1.8931E-07 0.000974054 +1.8940E-07 0.000983352 +1.8943E-07 0.000986199 +1.8946E-07 0.000989016 +1.8949E-07 0.000991804 +1.8951E-07 0.000994563 +1.8954E-07 0.000997292 +1.8957E-07 0.000999993 +1.8960E-07 0.001002664 +1.8970E-07 0.001012082 +1.8980E-07 0.001021142 +1.8990E-07 0.001029963 +1.9000E-07 0.001038487 +1.9010E-07 0.001046652 +1.9013E-07 0.001049022 +1.9016E-07 0.001051362 +1.9019E-07 0.001053674 +1.9022E-07 0.001055956 +1.9025E-07 0.001058208 +1.9027E-07 0.001060432 +1.9030E-07 0.001062626 +1.9040E-07 0.001070137 +1.9043E-07 0.001072194 +1.9046E-07 0.001074226 +1.9049E-07 0.001076235 +1.9052E-07 0.001078219 +1.9054E-07 0.001080178 +1.9057E-07 0.001082114 +1.9060E-07 0.001084025 +1.9070E-07 0.001090641 +1.9080E-07 0.001096959 +1.9090E-07 0.001103217 +1.9100E-07 0.00110882 +1.9103E-07 0.001110388 +1.9106E-07 0.001111941 +1.9109E-07 0.00111348 +1.9111E-07 0.001115004 +1.9114E-07 0.001116514 +1.9117E-07 0.001118009 +1.9120E-07 0.001119489 +1.9122E-07 0.001120211 +1.9123E-07 0.001120927 +1.9124E-07 0.001121639 +1.9126E-07 0.001122345 +1.9127E-07 0.001123047 +1.9129E-07 0.001123744 +1.9130E-07 0.001124436 +1.9140E-07 0.001128907 +1.9150E-07 0.001133139 +1.9160E-07 0.001137132 +1.9162E-07 0.001137843 +1.9164E-07 0.001138543 +1.9166E-07 0.001139234 +1.9168E-07 0.001139915 +1.9170E-07 0.001140587 +1.9172E-07 0.001141249 +1.9174E-07 0.001141901 +1.9180E-07 0.001144046 +1.9182E-07 0.001144548 +1.9183E-07 0.001145029 +1.9184E-07 0.001145492 +1.9186E-07 0.001145934 +1.9187E-07 0.001146358 +1.9189E-07 0.001146761 +1.9190E-07 0.001147146 +1.9192E-07 0.001147567 +1.9193E-07 0.001147978 +1.9195E-07 0.001148379 +1.9196E-07 0.001148771 +1.9197E-07 0.001149153 +1.9199E-07 0.001149525 +1.9200E-07 0.001149888 +1.9202E-07 0.001150275 +1.9203E-07 0.001150652 +1.9205E-07 0.001151019 +1.9206E-07 0.001151377 +1.9208E-07 0.001151724 +1.9209E-07 0.001152063 +1.9211E-07 0.001152391 +1.9212E-07 0.001152716 +1.9213E-07 0.001153026 +1.9215E-07 0.001153322 +1.9216E-07 0.001153603 +1.9217E-07 0.001153869 +1.9219E-07 0.001154121 +1.9220E-07 0.001154358 +1.9222E-07 0.001154768 +1.9224E-07 0.001155163 +1.9226E-07 0.001155544 +1.9228E-07 0.00115591 +1.9230E-07 0.001156262 +1.9232E-07 0.001156599 +1.9235E-07 0.001156921 +1.9240E-07 0.001157755 +1.9242E-07 0.001157955 +1.9243E-07 0.001158145 +1.9244E-07 0.001158325 +1.9246E-07 0.001158495 +1.9247E-07 0.001158656 +1.9249E-07 0.001158806 +1.9250E-07 0.001158948 +1.9260E-07 0.001159901 +1.9270E-07 0.001160497 +1.9272E-07 0.001160578 +1.9273E-07 0.001160648 +1.9275E-07 0.001160709 +1.9276E-07 0.00116076 +1.9277E-07 0.001160801 +1.9279E-07 0.001160833 +1.9280E-07 0.001160855 +1.9290E-07 0.001160855 +1.9300E-07 0.001160617 +1.9310E-07 0.00116002 +1.9320E-07 0.001159186 +1.9330E-07 0.001157994 +1.9340E-07 0.001156623 +1.9350E-07 0.001154894 +1.9360E-07 0.001152868 +1.9370E-07 0.001150603 +1.9380E-07 0.00114804 +1.9390E-07 0.001145179 +1.9392E-07 0.001144759 +1.9393E-07 0.001144335 +1.9394E-07 0.001143905 +1.9396E-07 0.001143471 +1.9397E-07 0.001143032 +1.9399E-07 0.001142588 +1.9400E-07 0.001142139 +1.9410E-07 0.001138801 +1.9420E-07 0.001135165 +1.9422E-07 0.001134656 +1.9423E-07 0.001134131 +1.9424E-07 0.001133593 +1.9426E-07 0.001133039 +1.9427E-07 0.001132471 +1.9429E-07 0.001131888 +1.9430E-07 0.001131291 +1.9440E-07 0.001127178 +1.9443E-07 0.001125966 +1.9446E-07 0.001124728 +1.9449E-07 0.001123467 +1.9452E-07 0.001122181 +1.9454E-07 0.001120871 +1.9457E-07 0.001119537 +1.9460E-07 0.001118178 +1.9470E-07 0.00111335 +1.9472E-07 0.00111259 +1.9473E-07 0.001111825 +1.9475E-07 0.001111055 +1.9476E-07 0.00111028 +1.9478E-07 0.0011095 +1.9479E-07 0.001108715 +1.9481E-07 0.001107926 +1.9490E-07 0.0011028 +1.9500E-07 0.001097436 +1.9502E-07 0.001096505 +1.9503E-07 0.00109557 +1.9505E-07 0.001094629 +1.9507E-07 0.001093684 +1.9508E-07 0.001092734 +1.9510E-07 0.001091779 +1.9512E-07 0.001090819 +1.9520E-07 0.001085753 +1.9530E-07 0.001079375 +1.9540E-07 0.001073177 +1.9550E-07 0.00106656 +1.9553E-07 0.001064951 +1.9554E-07 0.001064295 +1.9555E-07 0.00106358 +1.9556E-07 0.001062925 +1.9558E-07 0.001061554 +1.9559E-07 0.001060898 +1.9560E-07 0.001060183 +1.9560E-07 0.001059646 +1.9561E-07 0.001059408 +1.9562E-07 0.001058812 +1.9563E-07 0.001058156 +1.9564E-07 0.0010575 +1.9565E-07 0.001056785 +1.9566E-07 0.00105607 +1.9567E-07 0.001055414 +1.9568E-07 0.001054759 +1.9569E-07 0.001054043 +1.9570E-07 0.001052911 +1.9572E-07 0.001051957 +1.9574E-07 0.001050586 +1.9574E-07 0.001049882 +1.9575E-07 0.001049183 +1.9576E-07 0.001048488 +1.9577E-07 0.001047798 +1.9578E-07 0.001047113 +1.9579E-07 0.001046433 +1.9580E-07 0.001045758 +1.9582E-07 0.001044743 +1.9583E-07 0.001043722 +1.9585E-07 0.001042697 +1.9586E-07 0.001041666 +1.9587E-07 0.001040631 +1.9589E-07 0.001039591 +1.9590E-07 0.001038546 +1.9592E-07 0.001037548 +1.9593E-07 0.001036544 +1.9594E-07 0.001035536 +1.9596E-07 0.001034522 +1.9597E-07 0.001033504 +1.9599E-07 0.001032481 +1.9600E-07 0.001031453 +1.9601E-07 0.001030346 +1.9603E-07 0.001029239 +1.9604E-07 0.001028132 +1.9606E-07 0.001027025 +1.9607E-07 0.001025919 +1.9609E-07 0.001024812 +1.9610E-07 0.001023705 +1.9620E-07 0.001016194 +1.9630E-07 0.001008386 +1.9640E-07 0.00100028 +1.9646E-07 0.000996108 +1.9661E-07 0.00098365 +1.9670E-07 0.000975663 +1.9680E-07 0.000967378 +1.9690E-07 0.000958855 +1.9700E-07 0.000950331 +1.9710E-07 0.00094151 +1.9720E-07 0.000932808 +1.9730E-07 0.000923867 +1.9740E-07 0.000914926 +1.9750E-07 0.000905747 +1.9760E-07 0.000896687 +1.9770E-07 0.000887508 +1.9773E-07 0.000884881 +1.9776E-07 0.000882243 +1.9779E-07 0.000879596 +1.9782E-07 0.00087694 +1.9785E-07 0.000874273 +1.9787E-07 0.000871597 +1.9790E-07 0.000868911 +1.9792E-07 0.000867617 +1.9793E-07 0.000866323 +1.9795E-07 0.000865029 +1.9796E-07 0.000863734 +1.9797E-07 0.00086244 +1.9799E-07 0.000861146 +1.9800E-07 0.000859851 +1.9802E-07 0.000858529 +1.9803E-07 0.000857202 +1.9804E-07 0.00085587 +1.9806E-07 0.000854533 +1.9807E-07 0.000853192 +1.9809E-07 0.000851845 +1.9810E-07 0.000850494 +1.9820E-07 0.000841195 +1.9830E-07 0.000831837 +1.9840E-07 0.000822599 +1.9841E-07 0.000821253 +1.9843E-07 0.000819908 +1.9844E-07 0.000818562 +1.9846E-07 0.000817217 +1.9847E-07 0.000815872 +1.9849E-07 0.000814526 +1.9850E-07 0.000813181 +1.9860E-07 0.000803823 +1.9862E-07 0.000802307 +1.9863E-07 0.000800792 +1.9865E-07 0.000799276 +1.9867E-07 0.00079776 +1.9868E-07 0.000796245 +1.9870E-07 0.000794729 +1.9872E-07 0.000793213 +1.9874E-07 0.000790761 +1.9877E-07 0.000788309 +1.9879E-07 0.000785857 +1.9882E-07 0.000783404 +1.9885E-07 0.000780952 +1.9887E-07 0.0007785 +1.9890E-07 0.000776047 +1.9900E-07 0.000766749 +1.9903E-07 0.000764092 +1.9906E-07 0.000761436 +1.9909E-07 0.000758779 +1.9912E-07 0.000756122 +1.9915E-07 0.000753466 +1.9917E-07 0.000750809 +1.9920E-07 0.000748152 +1.9930E-07 0.000739212 +1.9940E-07 0.000730152 +1.9943E-07 0.000727597 +1.9946E-07 0.000725043 +1.9949E-07 0.000722488 +1.9951E-07 0.000719934 +1.9954E-07 0.000717379 +1.9957E-07 0.000714825 +1.9960E-07 0.00071227 +1.9970E-07 0.00070333 +1.9980E-07 0.000694568 +1.9982E-07 0.000693154 +1.9983E-07 0.000691741 +1.9985E-07 0.000690327 +1.9987E-07 0.000688914 +1.9988E-07 0.0006875 +1.9990E-07 0.000686087 +1.9992E-07 0.000684673 +2.0000E-07 0.000677342 +2.0010E-07 0.00066864 +2.0020E-07 0.000660414 +2.0022E-07 0.000659176 +2.0023E-07 0.000657947 +2.0024E-07 0.000656729 +2.0026E-07 0.000655519 +2.0027E-07 0.00065432 +2.0029E-07 0.00065313 +2.0030E-07 0.00065195 +2.0032E-07 0.000650854 +2.0033E-07 0.000649763 +2.0034E-07 0.000648677 +2.0036E-07 0.000647596 +2.0037E-07 0.000646519 +2.0038E-07 0.000645447 +2.0040E-07 0.000644381 +2.0040E-07 0.000643772 +2.0041E-07 0.000643174 +2.0042E-07 0.000642585 +2.0042E-07 0.000642006 +2.0043E-07 0.000641437 +2.0044E-07 0.000640877 +2.0045E-07 0.000640328 +2.0045E-07 0.000639704 +2.0046E-07 0.000639075 +2.0047E-07 0.000638441 +2.0048E-07 0.000637802 +2.0048E-07 0.000637159 +2.0049E-07 0.00063651 +2.0050E-07 0.000635857 +2.0051E-07 0.000634716 +2.0053E-07 0.000633575 +2.0054E-07 0.000632434 +2.0056E-07 0.000631293 +2.0057E-07 0.000630152 +2.0059E-07 0.000629011 +2.0060E-07 0.00062787 +2.0062E-07 0.000626717 +2.0063E-07 0.000625574 +2.0064E-07 0.00062444 +2.0066E-07 0.000623316 +2.0067E-07 0.000622202 +2.0069E-07 0.000621097 +2.0070E-07 0.000620002 +2.0072E-07 0.000618855 +2.0073E-07 0.000617713 +2.0074E-07 0.000616576 +2.0076E-07 0.000615443 +2.0077E-07 0.000614316 +2.0079E-07 0.000613193 +2.0080E-07 0.000612075 +2.0090E-07 0.000604624 +2.0100E-07 0.000596995 +2.0110E-07 0.000589723 +2.0120E-07 0.000582511 +2.0122E-07 0.000581495 +2.0123E-07 0.000580475 +2.0124E-07 0.000579449 +2.0126E-07 0.000578419 +2.0127E-07 0.000577384 +2.0129E-07 0.000576344 +2.0130E-07 0.000575299 +2.0140E-07 0.000568504 +2.0143E-07 0.000566591 +2.0146E-07 0.000564682 +2.0149E-07 0.000562778 +2.0151E-07 0.000560879 +2.0154E-07 0.000558985 +2.0157E-07 0.000557096 +2.0160E-07 0.000555212 +2.0170E-07 0.000548596 +2.0180E-07 0.000542516 +2.0190E-07 0.000536317 +2.0200E-07 0.000530417 +2.0210E-07 0.000524635 +2.0220E-07 0.000519032 +2.0230E-07 0.000513608 +2.0240E-07 0.000508422 +2.0250E-07 0.000503416 +2.0260E-07 0.000498528 +2.0270E-07 0.000493939 +2.0280E-07 0.000489468 +2.0290E-07 0.000485177 +2.0300E-07 0.000481124 +2.0310E-07 0.000477249 +2.0320E-07 0.000473613 +2.0330E-07 0.000470097 +2.0340E-07 0.000466878 +2.0351E-07 0.0004636 +2.0360E-07 0.000460918 +2.0370E-07 0.000458235 +2.0380E-07 0.000455792 +2.0385E-07 0.000454778 +2.0386E-07 0.00045454 +2.0387E-07 0.000454301 +2.0388E-07 0.000454063 +2.0389E-07 0.000453884 +2.0390E-07 0.000453646 +2.0390E-07 0.000453561 +2.0390E-07 0.000453476 +2.0391E-07 0.00045339 +2.0391E-07 0.000453305 +2.0392E-07 0.00045322 +2.0392E-07 0.000453135 +2.0393E-07 0.00045305 +2.0394E-07 0.000452871 +2.0395E-07 0.000452633 +2.0396E-07 0.000452454 +2.0397E-07 0.000452275 +2.0398E-07 0.000452096 +2.0399E-07 0.000451917 +2.0400E-07 0.000451679 +2.0401E-07 0.000451543 +2.0402E-07 0.000451406 +2.0402E-07 0.00045127 +2.0403E-07 0.000451134 +2.0404E-07 0.000450998 +2.0405E-07 0.000450861 +2.0406E-07 0.000450725 +2.0409E-07 0.000450308 +2.0410E-07 0.00045007 +2.0411E-07 0.000449927 +2.0412E-07 0.00044979 +2.0413E-07 0.000449657 +2.0414E-07 0.000449529 +2.0415E-07 0.000449407 +2.0416E-07 0.000449289 +2.0417E-07 0.000449175 +2.0418E-07 0.000449056 +2.0419E-07 0.000448937 +2.0420E-07 0.000448699 +2.0422E-07 0.00044852 +2.0423E-07 0.000448401 +2.0424E-07 0.000448281 +2.0425E-07 0.000448162 +2.0426E-07 0.000448043 +2.0428E-07 0.000447805 +2.0430E-07 0.000447566 +2.0430E-07 0.000447507 +2.0433E-07 0.000447268 +2.0436E-07 0.00044691 +2.0439E-07 0.000446672 +2.0440E-07 0.000446493 +2.0441E-07 0.00044638 +2.0443E-07 0.000446262 +2.0444E-07 0.000446139 +2.0446E-07 0.000446012 +2.0447E-07 0.000445879 +2.0449E-07 0.000445742 +2.0450E-07 0.000445599 +2.0452E-07 0.000445485 +2.0453E-07 0.00044538 +2.0454E-07 0.000445285 +2.0456E-07 0.0004452 +2.0457E-07 0.000445125 +2.0459E-07 0.000445059 +2.0460E-07 0.000445003 +2.0461E-07 0.000444906 +2.0463E-07 0.000444818 +2.0464E-07 0.00044474 +2.0466E-07 0.000444672 +2.0467E-07 0.000444614 +2.0469E-07 0.000444565 +2.0470E-07 0.000444526 +2.0474E-07 0.000444365 +2.0479E-07 0.000444237 +2.0483E-07 0.000444143 +2.0487E-07 0.000444084 +2.0491E-07 0.000444058 +2.0495E-07 0.000444067 +2.0500E-07 0.000444109 +2.0508E-07 0.000444293 +2.0516E-07 0.000444588 +2.0524E-07 0.000444996 +2.0533E-07 0.000445515 +2.0541E-07 0.000446147 +2.0549E-07 0.00044689 +2.0558E-07 0.000447745 +2.0566E-07 0.000448706 +2.0574E-07 0.000449784 +2.0583E-07 0.000450978 +2.0591E-07 0.00045229 +2.0600E-07 0.000453718 +2.0608E-07 0.000455262 +2.0617E-07 0.000456924 +2.0620E-07 0.00045766 +2.0624E-07 0.00045842 +2.0628E-07 0.000459205 +2.0631E-07 0.000460014 +2.0635E-07 0.000460847 +2.0639E-07 0.000461705 +2.0643E-07 0.000462587 +2.0646E-07 0.000463335 +2.0649E-07 0.000464097 +2.0652E-07 0.000464875 +2.0655E-07 0.000465667 +2.0658E-07 0.000466473 +2.0661E-07 0.000467294 +2.0665E-07 0.00046813 +2.0671E-07 0.000469998 +2.0678E-07 0.000471925 +2.0685E-07 0.00047391 +2.0692E-07 0.000475954 +2.0699E-07 0.000478056 +2.0706E-07 0.000480216 +2.0713E-07 0.000482435 +2.0718E-07 0.000484311 +2.0724E-07 0.000486225 +2.0730E-07 0.000488179 +2.0735E-07 0.000490171 +2.0741E-07 0.000492203 +2.0747E-07 0.000494273 +2.0753E-07 0.000496382 +2.0760E-07 0.000499114 +2.0767E-07 0.000501895 +2.0774E-07 0.000504725 +2.0782E-07 0.000507603 +2.0789E-07 0.000510529 +2.0796E-07 0.000513505 +2.0804E-07 0.000516529 +2.0806E-07 0.000517431 +2.0808E-07 0.000518334 +2.0810E-07 0.000519236 +2.0812E-07 0.000520139 +2.0814E-07 0.000521042 +2.0816E-07 0.000521944 +2.0819E-07 0.000522847 +2.0821E-07 0.000523783 +2.0823E-07 0.00052472 +2.0825E-07 0.000525657 +2.0827E-07 0.000526593 +2.0829E-07 0.00052753 +2.0831E-07 0.000528467 +2.0834E-07 0.000529403 +2.0837E-07 0.00053102 +2.0841E-07 0.000532651 +2.0845E-07 0.000534297 +2.0848E-07 0.000535957 +2.0852E-07 0.000537632 +2.0856E-07 0.000539322 +2.0860E-07 0.000541026 +2.0861E-07 0.000541872 +2.0863E-07 0.000542722 +2.0865E-07 0.000543577 +2.0867E-07 0.000544437 +2.0869E-07 0.000545302 +2.0871E-07 0.000546172 +2.0873E-07 0.000547046 +2.0876E-07 0.000548417 +2.0877E-07 0.000549149 +2.0879E-07 0.000549882 +2.0880E-07 0.000550614 +2.0882E-07 0.000551346 +2.0883E-07 0.000552079 +2.0885E-07 0.000552811 +2.0887E-07 0.000553543 +2.0889E-07 0.000554474 +2.0891E-07 0.000555409 +2.0893E-07 0.000556349 +2.0895E-07 0.000557295 +2.0897E-07 0.000558245 +2.0899E-07 0.0005592 +2.0901E-07 0.000560159 +2.0904E-07 0.000561743 +2.0907E-07 0.000563327 +2.0910E-07 0.000564911 +2.0914E-07 0.000566494 +2.0917E-07 0.000568078 +2.0920E-07 0.000569662 +2.0924E-07 0.000571246 +2.0929E-07 0.000573958 +2.0935E-07 0.000576681 +2.0940E-07 0.000579413 +2.0946E-07 0.000582155 +2.0951E-07 0.000584906 +2.0957E-07 0.000587667 +2.0963E-07 0.000590438 +2.0971E-07 0.000594747 +2.0980E-07 0.000599056 +2.0989E-07 0.000603364 +2.0997E-07 0.000607673 +2.1006E-07 0.000611981 +2.1015E-07 0.00061629 +2.1024E-07 0.000620598 +2.1028E-07 0.000622921 +2.1033E-07 0.000625238 +2.1038E-07 0.00062755 +2.1042E-07 0.000629858 +2.1047E-07 0.000632161 +2.1052E-07 0.000634458 +2.1057E-07 0.000636751 +2.1058E-07 0.000637426 +2.1059E-07 0.000638106 +2.1061E-07 0.000638791 +2.1062E-07 0.000639481 +2.1064E-07 0.000640176 +2.1065E-07 0.000640875 +2.1067E-07 0.000641579 +2.1073E-07 0.000644533 +2.1079E-07 0.000647467 +2.1085E-07 0.000650381 +2.1091E-07 0.000653276 +2.1097E-07 0.000656152 +2.1103E-07 0.000659008 +2.1110E-07 0.000661845 +2.1120E-07 0.000666694 +2.1131E-07 0.000671464 +2.1141E-07 0.000676157 +2.1152E-07 0.000680772 +2.1162E-07 0.00068531 +2.1173E-07 0.000689769 +2.1184E-07 0.000694151 +2.1189E-07 0.000696191 +2.1194E-07 0.000698206 +2.1199E-07 0.000700197 +2.1204E-07 0.000702164 +2.1209E-07 0.000704107 +2.1214E-07 0.000706025 +2.1219E-07 0.000707919 +2.1220E-07 0.000708336 +2.1221E-07 0.000708694 +2.1222E-07 0.000709052 +2.1223E-07 0.000709409 +2.1224E-07 0.000709827 +2.1225E-07 0.000710184 +2.1226E-07 0.000710542 +2.1227E-07 0.000710899 +2.1228E-07 0.000711257 +2.1229E-07 0.000711615 +2.1230E-07 0.000711972 +2.1231E-07 0.00071233 +2.1232E-07 0.000712688 +2.1233E-07 0.000712986 +2.1234E-07 0.000713343 +2.1235E-07 0.000713701 +2.1236E-07 0.000714059 +2.1237E-07 0.000714416 +2.1238E-07 0.000714714 +2.1240E-07 0.00071537 +2.1243E-07 0.000716383 +2.1246E-07 0.000717396 +2.1248E-07 0.000717992 +2.1249E-07 0.00071835 +2.1250E-07 0.000718708 +2.1251E-07 0.000719006 +2.1252E-07 0.000719304 +2.1253E-07 0.000719661 +2.1254E-07 0.000719959 +2.1255E-07 0.000720257 +2.1256E-07 0.000720615 +2.1258E-07 0.000721211 +2.1260E-07 0.000721867 +2.1262E-07 0.000722522 +2.1264E-07 0.000723118 +2.1267E-07 0.000724072 +2.1270E-07 0.000725026 +2.1271E-07 0.000725565 +2.1273E-07 0.000726108 +2.1275E-07 0.000726657 +2.1277E-07 0.00072721 +2.1279E-07 0.000727769 +2.1281E-07 0.000728332 +2.1283E-07 0.0007289 +2.1286E-07 0.000729809 +2.1289E-07 0.000730713 +2.1292E-07 0.000731611 +2.1295E-07 0.000732506 +2.1298E-07 0.000733395 +2.1301E-07 0.000734279 +2.1305E-07 0.000735159 +2.1312E-07 0.000737253 +2.1320E-07 0.00073928 +2.1328E-07 0.000741238 +2.1336E-07 0.000743129 +2.1344E-07 0.000744951 +2.1352E-07 0.000746705 +2.1360E-07 0.000748391 +2.1367E-07 0.00074986 +2.1374E-07 0.000751271 +2.1381E-07 0.000752624 +2.1388E-07 0.000753918 +2.1395E-07 0.000755154 +2.1402E-07 0.000756332 +2.1410E-07 0.000757451 +2.1414E-07 0.000758191 +2.1419E-07 0.000758898 +2.1424E-07 0.000759571 +2.1429E-07 0.00076021 +2.1434E-07 0.000760814 +2.1439E-07 0.000761385 +2.1444E-07 0.000761921 +2.1445E-07 0.00076204 +2.1449E-07 0.000762496 +2.1453E-07 0.000762928 +2.1457E-07 0.000763336 +2.1462E-07 0.000763719 +2.1466E-07 0.000764078 +2.1470E-07 0.000764412 +2.1475E-07 0.000764722 +2.1477E-07 0.000764871 +2.1479E-07 0.00076501 +2.1481E-07 0.000765138 +2.1483E-07 0.000765258 +2.1485E-07 0.000765367 +2.1487E-07 0.000765467 +2.1489E-07 0.000765557 +2.1496E-07 0.000765915 +2.1503E-07 0.000766204 +2.1510E-07 0.000766425 +2.1517E-07 0.000766579 +2.1524E-07 0.000766664 +2.1531E-07 0.000766681 +2.1538E-07 0.00076663 +2.1545E-07 0.000766506 +2.1553E-07 0.000766304 +2.1561E-07 0.000766024 +2.1569E-07 0.000765666 +2.1577E-07 0.000765231 +2.1585E-07 0.000764718 +2.1593E-07 0.000764126 +2.1599E-07 0.000763535 +2.1606E-07 0.000762886 +2.1613E-07 0.000762178 +2.1620E-07 0.000761411 +2.1627E-07 0.000760587 +2.1634E-07 0.000759704 +2.1641E-07 0.000758762 +2.1643E-07 0.000758479 +2.1645E-07 0.00075819 +2.1647E-07 0.000757897 +2.1649E-07 0.000757599 +2.1651E-07 0.000757296 +2.1653E-07 0.000756988 +2.1655E-07 0.000756676 +2.1667E-07 0.000754709 +2.1670E-07 0.000754136 +2.1673E-07 0.000753558 +2.1676E-07 0.000752975 +2.1679E-07 0.000752388 +2.1682E-07 0.000751796 +2.1685E-07 0.000751198 +2.1689E-07 0.000750596 +2.1691E-07 0.000750074 +2.1694E-07 0.000749548 +2.1696E-07 0.000749016 +2.1699E-07 0.00074848 +2.1701E-07 0.000747938 +2.1704E-07 0.000747392 +2.1707E-07 0.000746841 +2.1708E-07 0.000746472 +2.1710E-07 0.000746099 +2.1712E-07 0.000745721 +2.1713E-07 0.000745338 +2.1715E-07 0.00074495 +2.1717E-07 0.000744557 +2.1719E-07 0.000744159 +2.1721E-07 0.000743552 +2.1724E-07 0.00074294 +2.1726E-07 0.000742323 +2.1729E-07 0.000741702 +2.1731E-07 0.000741075 +2.1734E-07 0.000740444 +2.1737E-07 0.000739808 +2.1741E-07 0.00073873 +2.1745E-07 0.000737642 +2.1749E-07 0.000736545 +2.1753E-07 0.000735438 +2.1757E-07 0.000734322 +2.1761E-07 0.000733195 +2.1766E-07 0.000732059 +2.1776E-07 0.000728951 +2.1787E-07 0.000725741 +2.1798E-07 0.000722429 +2.1808E-07 0.000719014 +2.1819E-07 0.000715498 +2.1830E-07 0.000711879 +2.1841E-07 0.000708158 +2.1847E-07 0.000705923 +2.1853E-07 0.000703664 +2.1859E-07 0.000701381 +2.1866E-07 0.000699073 +2.1872E-07 0.000696742 +2.1878E-07 0.000694385 +2.1885E-07 0.000692005 +2.1886E-07 0.000691466 +2.1887E-07 0.000690922 +2.1889E-07 0.000690374 +2.1890E-07 0.00068982 +2.1892E-07 0.000689262 +2.1893E-07 0.000688699 +2.1895E-07 0.00068813 +2.1899E-07 0.000686292 +2.1904E-07 0.00068444 +2.1909E-07 0.000682573 +2.1913E-07 0.000680691 +2.1918E-07 0.000678794 +2.1923E-07 0.000676883 +2.1928E-07 0.000674958 +2.1936E-07 0.000671276 +2.1945E-07 0.000667569 +2.1954E-07 0.000663839 +2.1963E-07 0.000660083 +2.1972E-07 0.000656304 +2.1981E-07 0.0006525 +2.1990E-07 0.000648672 +2.1998E-07 0.000645097 +2.2006E-07 0.000641508 +2.2014E-07 0.000637903 +2.2022E-07 0.000634284 +2.2030E-07 0.000630651 +2.2038E-07 0.000627003 +2.2047E-07 0.00062334 +2.2052E-07 0.000621075 +2.2053E-07 0.000620658 +2.2054E-07 0.000620241 +2.2055E-07 0.000619764 +2.2056E-07 0.000619287 +2.2058E-07 0.000618393 +2.2059E-07 0.000617976 +2.2060E-07 0.000617499 +2.2061E-07 0.000617082 +2.2062E-07 0.000616665 +2.2063E-07 0.000616188 +2.2064E-07 0.000615711 +2.2065E-07 0.000615294 +2.2066E-07 0.000614876 +2.2067E-07 0.0006144 +2.2068E-07 0.000613982 +2.2069E-07 0.000613565 +2.2070E-07 0.000613088 +2.2071E-07 0.000612671 +2.2073E-07 0.000611777 +2.2076E-07 0.000610525 +2.2079E-07 0.000609214 +2.2081E-07 0.00060832 +2.2083E-07 0.000607485 +2.2085E-07 0.000606591 +2.2087E-07 0.000605697 +2.2089E-07 0.000604863 +2.2091E-07 0.000603969 +2.2093E-07 0.000603075 +2.2095E-07 0.00060224 +2.2098E-07 0.000600929 +2.2101E-07 0.000599618 +2.2102E-07 0.0005988 +2.2104E-07 0.000597983 +2.2106E-07 0.000597165 +2.2108E-07 0.000596348 +2.2110E-07 0.00059553 +2.2112E-07 0.000594713 +2.2114E-07 0.000593896 +2.2117E-07 0.000592278 +2.2121E-07 0.00059066 +2.2125E-07 0.000589042 +2.2128E-07 0.000587424 +2.2132E-07 0.000585806 +2.2136E-07 0.000584189 +2.2140E-07 0.000582571 +2.2148E-07 0.000578749 +2.2157E-07 0.000574946 +2.2166E-07 0.000571163 +2.2174E-07 0.000567399 +2.2183E-07 0.000563655 +2.2192E-07 0.000559931 +2.2201E-07 0.000556225 +2.2210E-07 0.000552028 +2.2220E-07 0.000547864 +2.2230E-07 0.000543734 +2.2240E-07 0.000539638 +2.2250E-07 0.000535577 +2.2260E-07 0.000531549 +2.2270E-07 0.000527556 +2.2275E-07 0.000525494 +2.2280E-07 0.000523447 +2.2285E-07 0.000521414 +2.2290E-07 0.000519396 +2.2295E-07 0.000517392 +2.2300E-07 0.000515404 +2.2306E-07 0.000513429 +2.2307E-07 0.000512804 +2.2309E-07 0.000512189 +2.2310E-07 0.000511583 +2.2312E-07 0.000510987 +2.2313E-07 0.0005104 +2.2315E-07 0.000509824 +2.2317E-07 0.000509257 +2.2323E-07 0.000506921 +2.2329E-07 0.000504615 +2.2335E-07 0.000502338 +2.2341E-07 0.00050009 +2.2347E-07 0.000497871 +2.2353E-07 0.000495682 +2.2360E-07 0.000493521 +2.2370E-07 0.000489767 +2.2381E-07 0.000486101 +2.2392E-07 0.000482522 +2.2402E-07 0.000479031 +2.2413E-07 0.000475628 +2.2424E-07 0.000472312 +2.2435E-07 0.000469083 +2.2439E-07 0.00046768 +2.2444E-07 0.000466295 +2.2449E-07 0.000464931 +2.2453E-07 0.000463585 +2.2458E-07 0.000462259 +2.2463E-07 0.000460953 +2.2468E-07 0.000459666 +2.2469E-07 0.000459427 +2.2471E-07 0.000458751 +2.2473E-07 0.000458085 +2.2476E-07 0.000457428 +2.2478E-07 0.000456781 +2.2481E-07 0.000456143 +2.2483E-07 0.000455515 +2.2486E-07 0.000454898 +2.2488E-07 0.00045434 +2.2490E-07 0.000453793 +2.2492E-07 0.000453255 +2.2494E-07 0.000452727 +2.2496E-07 0.000452209 +2.2498E-07 0.000451701 +2.2501E-07 0.000451202 +2.2505E-07 0.00045023 +2.2509E-07 0.000449273 +2.2513E-07 0.00044833 +2.2517E-07 0.000447402 +2.2521E-07 0.000446488 +2.2525E-07 0.000445589 +2.2529E-07 0.000444705 +2.2530E-07 0.000444324 +2.2532E-07 0.000443949 +2.2534E-07 0.000443578 +2.2535E-07 0.000443211 +2.2537E-07 0.00044285 +2.2539E-07 0.000442494 +2.2541E-07 0.000442142 +2.2542E-07 0.000441819 +2.2544E-07 0.000441495 +2.2545E-07 0.000441171 +2.2547E-07 0.000440848 +2.2548E-07 0.000440524 +2.2550E-07 0.000440201 +2.2552E-07 0.000439877 +2.2554E-07 0.000439434 +2.2556E-07 0.000438992 +2.2558E-07 0.000438549 +2.2561E-07 0.000438106 +2.2563E-07 0.000437663 +2.2565E-07 0.00043722 +2.2568E-07 0.000436778 +2.2571E-07 0.000436101 +2.2575E-07 0.000435435 +2.2579E-07 0.000434778 +2.2582E-07 0.000434131 +2.2586E-07 0.000433493 +2.2590E-07 0.000432866 +2.2594E-07 0.000432248 +2.2604E-07 0.00043053 +2.2615E-07 0.00042892 +2.2626E-07 0.000427416 +2.2637E-07 0.00042602 +2.2648E-07 0.00042473 +2.2659E-07 0.000423548 +2.2670E-07 0.000422473 +2.2676E-07 0.000421862 +2.2683E-07 0.00042129 +2.2689E-07 0.000420757 +2.2696E-07 0.000420264 +2.2702E-07 0.000419809 +2.2709E-07 0.000419393 +2.2716E-07 0.000419016 +2.2718E-07 0.000418913 +2.2720E-07 0.000418811 +2.2722E-07 0.000418709 +2.2724E-07 0.000418607 +2.2726E-07 0.000418505 +2.2728E-07 0.000418402 +2.2730E-07 0.0004183 +2.2735E-07 0.000418112 +2.2740E-07 0.000417938 +2.2745E-07 0.000417778 +2.2751E-07 0.000417634 +2.2756E-07 0.000417504 +2.2761E-07 0.000417388 +2.2767E-07 0.000417287 +2.2776E-07 0.000417213 +2.2786E-07 0.000417212 +2.2796E-07 0.000417283 +2.2806E-07 0.000417428 +2.2816E-07 0.000417646 +2.2826E-07 0.000417937 +2.2836E-07 0.0004183 +2.2843E-07 0.000418592 +2.2850E-07 0.000418923 +2.2857E-07 0.000419293 +2.2864E-07 0.000419702 +2.2871E-07 0.000420149 +2.2878E-07 0.000420636 +2.2886E-07 0.000421161 +2.2887E-07 0.000421221 +2.2888E-07 0.000421281 +2.2889E-07 0.0004214 +2.2892E-07 0.000421638 +2.2893E-07 0.000421698 +2.2894E-07 0.000421757 +2.2895E-07 0.000421877 +2.2896E-07 0.000421936 +2.2898E-07 0.000422115 +2.2900E-07 0.000422294 +2.2902E-07 0.000422473 +2.2905E-07 0.000422711 +2.2906E-07 0.000422847 +2.2907E-07 0.000422983 +2.2909E-07 0.00042312 +2.2910E-07 0.000423256 +2.2912E-07 0.000423392 +2.2913E-07 0.000423528 +2.2915E-07 0.000423665 +2.2918E-07 0.000423903 +2.2921E-07 0.000424261 +2.2924E-07 0.000424499 +2.2927E-07 0.000424857 +2.2929E-07 0.000425078 +2.2931E-07 0.0004253 +2.2933E-07 0.000425521 +2.2935E-07 0.000425742 +2.2937E-07 0.000425964 +2.2939E-07 0.000426185 +2.2942E-07 0.000426407 +2.2947E-07 0.000427001 +2.2952E-07 0.000427611 +2.2958E-07 0.000428235 +2.2963E-07 0.000428873 +2.2969E-07 0.000429527 +2.2974E-07 0.000430194 +2.2980E-07 0.000430877 +2.2991E-07 0.000432406 +2.3003E-07 0.000433979 +2.3015E-07 0.000435595 +2.3026E-07 0.000437256 +2.3038E-07 0.00043896 +2.3050E-07 0.000440708 +2.3062E-07 0.0004425 +2.3070E-07 0.000443776 +2.3078E-07 0.000445066 +2.3086E-07 0.000446372 +2.3095E-07 0.000447691 +2.3103E-07 0.000449026 +2.3111E-07 0.000450375 +2.3120E-07 0.000451738 +2.3123E-07 0.000452254 +2.3126E-07 0.00045278 +2.3129E-07 0.000453315 +2.3133E-07 0.00045386 +2.3136E-07 0.000454415 +2.3139E-07 0.000454979 +2.3143E-07 0.000455553 +2.3146E-07 0.000456087 +2.3149E-07 0.000456616 +2.3152E-07 0.000457141 +2.3155E-07 0.00045766 +2.3158E-07 0.000458175 +2.3161E-07 0.000458684 +2.3165E-07 0.000459189 +2.3173E-07 0.000460581 +2.3181E-07 0.000461962 +2.3189E-07 0.000463335 +2.3197E-07 0.000464697 +2.3205E-07 0.00046605 +2.3213E-07 0.000467393 +2.3222E-07 0.000468726 +2.3231E-07 0.000470237 +2.3240E-07 0.000471738 +2.3249E-07 0.000473229 +2.3258E-07 0.000474711 +2.3267E-07 0.000476182 +2.3276E-07 0.000477645 +2.3286E-07 0.000479097 +2.3290E-07 0.00047979 +2.3294E-07 0.000480474 +2.3299E-07 0.000481148 +2.3303E-07 0.000481812 +2.3308E-07 0.000482466 +2.3312E-07 0.000483111 +2.3317E-07 0.000483746 +2.3318E-07 0.000483974 +2.3319E-07 0.000484196 +2.3321E-07 0.000484414 +2.3322E-07 0.000484627 +2.3324E-07 0.000484835 +2.3325E-07 0.000485038 +2.3327E-07 0.000485236 +2.3329E-07 0.000485514 +2.3331E-07 0.000485801 +2.3333E-07 0.000486098 +2.3335E-07 0.000486404 +2.3337E-07 0.00048672 +2.3339E-07 0.000487046 +2.3342E-07 0.000487382 +2.3346E-07 0.000487978 +2.3350E-07 0.000488574 +2.3355E-07 0.00048917 +2.3359E-07 0.000489766 +2.3364E-07 0.000490362 +2.3368E-07 0.000490958 +2.3373E-07 0.000491554 +2.3374E-07 0.000491782 +2.3376E-07 0.000492004 +2.3378E-07 0.000492222 +2.3379E-07 0.000492435 +2.3381E-07 0.000492643 +2.3383E-07 0.000492846 +2.3385E-07 0.000493044 +2.3387E-07 0.000493374 +2.3390E-07 0.000493699 +2.3392E-07 0.000494019 +2.3395E-07 0.000494334 +2.3397E-07 0.000494644 +2.3400E-07 0.000494949 +2.3403E-07 0.00049525 +2.3407E-07 0.000495756 +2.3411E-07 0.000496252 +2.3415E-07 0.000496739 +2.3420E-07 0.000497216 +2.3424E-07 0.000497683 +2.3428E-07 0.00049814 +2.3433E-07 0.000498588 +2.3441E-07 0.000499477 +2.3449E-07 0.000500322 +2.3458E-07 0.000501124 +2.3466E-07 0.000501882 +2.3475E-07 0.000502596 +2.3483E-07 0.000503266 +2.3492E-07 0.000503893 +2.3493E-07 0.000504012 +2.3500E-07 0.000504519 +2.3507E-07 0.000505002 +2.3514E-07 0.000505461 +2.3522E-07 0.000505895 +2.3529E-07 0.000506305 +2.3536E-07 0.00050669 +2.3544E-07 0.000507052 +2.3546E-07 0.000507131 +2.3548E-07 0.000507215 +2.3550E-07 0.000507303 +2.3553E-07 0.000507397 +2.3555E-07 0.000507496 +2.3557E-07 0.000507599 +2.3560E-07 0.000507707 +2.3563E-07 0.000507809 +2.3567E-07 0.000507912 +2.3571E-07 0.000508014 +2.3574E-07 0.000508116 +2.3578E-07 0.000508218 +2.3582E-07 0.00050832 +2.3586E-07 0.000508422 +2.3594E-07 0.000508545 +2.3603E-07 0.000508624 +2.3611E-07 0.00050866 +2.3620E-07 0.000508651 +2.3628E-07 0.000508599 +2.3637E-07 0.000508503 +2.3646E-07 0.000508363 +2.3654E-07 0.000508151 +2.3663E-07 0.000507891 +2.3672E-07 0.000507582 +2.3680E-07 0.000507224 +2.3689E-07 0.000506818 +2.3698E-07 0.000506363 +2.3707E-07 0.000505859 +2.3708E-07 0.000505746 +2.3710E-07 0.000505628 +2.3712E-07 0.000505506 +2.3714E-07 0.000505378 +2.3716E-07 0.000505245 +2.3718E-07 0.000505108 +2.3720E-07 0.000504965 +2.3721E-07 0.000504965 +2.3722E-07 0.000504846 +2.3724E-07 0.000504727 +2.3726E-07 0.000504548 +2.3728E-07 0.000504429 +2.3730E-07 0.00050425 +2.3732E-07 0.000504131 +2.3734E-07 0.000503952 +2.3737E-07 0.000503654 +2.3738E-07 0.000503547 +2.3740E-07 0.00050343 +2.3741E-07 0.000503304 +2.3743E-07 0.000503168 +2.3744E-07 0.000503022 +2.3746E-07 0.000502866 +2.3748E-07 0.0005027 +2.3749E-07 0.00050253 +2.3751E-07 0.00050236 +2.3753E-07 0.00050219 +2.3755E-07 0.000502019 +2.3757E-07 0.000501849 +2.3759E-07 0.000501679 +2.3761E-07 0.000501508 +2.3763E-07 0.000501253 +2.3765E-07 0.000500997 +2.3768E-07 0.000500742 +2.3770E-07 0.000500487 +2.3773E-07 0.000500231 +2.3775E-07 0.000499976 +2.3778E-07 0.00049972 +2.3783E-07 0.000499097 +2.3789E-07 0.000498455 +2.3794E-07 0.000497793 +2.3800E-07 0.000497112 +2.3805E-07 0.000496412 +2.3811E-07 0.000495691 +2.3817E-07 0.000494952 +2.3829E-07 0.000493278 +2.3841E-07 0.000491526 +2.3853E-07 0.000489697 +2.3865E-07 0.00048779 +2.3877E-07 0.000485804 +2.3889E-07 0.000483741 +2.3901E-07 0.0004816 +2.3908E-07 0.000480161 +2.3916E-07 0.000478688 +2.3924E-07 0.000477181 +2.3932E-07 0.00047564 +2.3940E-07 0.000474065 +2.3948E-07 0.000472455 +2.3956E-07 0.000470812 +2.3958E-07 0.000470228 +2.3961E-07 0.000469634 +2.3964E-07 0.000469031 +2.3967E-07 0.000468418 +2.3970E-07 0.000467795 +2.3973E-07 0.000467163 +2.3976E-07 0.00046652 +2.3978E-07 0.000465999 +2.3980E-07 0.000465472 +2.3983E-07 0.00046494 +2.3985E-07 0.000464404 +2.3988E-07 0.000463863 +2.3990E-07 0.000463316 +2.3993E-07 0.000462765 +2.4000E-07 0.000461019 +2.4008E-07 0.000459252 +2.4015E-07 0.000457467 +2.4023E-07 0.000455661 +2.4030E-07 0.000453837 +2.4038E-07 0.000451993 +2.4046E-07 0.000450129 +2.4055E-07 0.000447713 +2.4065E-07 0.000445268 +2.4075E-07 0.000442794 +2.4084E-07 0.000440291 +2.4094E-07 0.000437758 +2.4104E-07 0.000435196 +2.4114E-07 0.000432605 +2.4119E-07 0.000431243 +2.4124E-07 0.000429881 +2.4129E-07 0.000428518 +2.4134E-07 0.000427156 +2.4139E-07 0.000425793 +2.4144E-07 0.000424431 +2.4149E-07 0.000423069 +2.4151E-07 0.000422507 +2.4153E-07 0.000421945 +2.4155E-07 0.000421383 +2.4157E-07 0.000420821 +2.4159E-07 0.000420259 +2.4161E-07 0.000419697 +2.4163E-07 0.000419135 +2.4164E-07 0.000418686 +2.4166E-07 0.000418242 +2.4167E-07 0.000417803 +2.4169E-07 0.000417368 +2.4170E-07 0.000416939 +2.4172E-07 0.000416515 +2.4174E-07 0.000416095 +2.4178E-07 0.000414801 +2.4183E-07 0.000413506 +2.4187E-07 0.000412212 +2.4192E-07 0.000410918 +2.4196E-07 0.000409624 +2.4201E-07 0.000408329 +2.4206E-07 0.000407035 +2.4209E-07 0.000406141 +2.4210E-07 0.00040567 +2.4212E-07 0.000405195 +2.4214E-07 0.000404714 +2.4215E-07 0.000404229 +2.4217E-07 0.000403738 +2.4219E-07 0.000403243 +2.4221E-07 0.000402743 +2.4223E-07 0.000402073 +2.4225E-07 0.000401408 +2.4227E-07 0.000400747 +2.4230E-07 0.000400092 +2.4232E-07 0.000399441 +2.4234E-07 0.000398795 +2.4237E-07 0.000398154 +2.4240E-07 0.000397115 +2.4244E-07 0.000396076 +2.4247E-07 0.000395037 +2.4251E-07 0.000393999 +2.4254E-07 0.00039296 +2.4258E-07 0.000391921 +2.4262E-07 0.000390882 +2.4273E-07 0.000387698 +2.4284E-07 0.000384513 +2.4295E-07 0.000381328 +2.4306E-07 0.000378144 +2.4317E-07 0.000374959 +2.4328E-07 0.000371775 +2.4339E-07 0.00036859 +2.4345E-07 0.000366768 +2.4351E-07 0.000364946 +2.4358E-07 0.000363123 +2.4364E-07 0.000361301 +2.4371E-07 0.000359479 +2.4377E-07 0.000357657 +2.4384E-07 0.000355835 +2.4385E-07 0.000355443 +2.4386E-07 0.000355051 +2.4388E-07 0.00035466 +2.4389E-07 0.000354268 +2.4391E-07 0.000353876 +2.4392E-07 0.000353484 +2.4394E-07 0.000353093 +2.4398E-07 0.000351895 +2.4402E-07 0.000350701 +2.4406E-07 0.000349513 +2.4411E-07 0.000348329 +2.4415E-07 0.000347151 +2.4419E-07 0.000345977 +2.4424E-07 0.000344808 +2.4433E-07 0.000342376 +2.4442E-07 0.000339969 +2.4451E-07 0.000337586 +2.4460E-07 0.000335227 +2.4469E-07 0.000332893 +2.4478E-07 0.000330583 +2.4487E-07 0.000328297 +2.4491E-07 0.000327275 +2.4495E-07 0.000326254 +2.4499E-07 0.000325232 +2.4503E-07 0.00032421 +2.4507E-07 0.000323188 +2.4511E-07 0.000322166 +2.4516E-07 0.000321145 +2.4517E-07 0.000320906 +2.4522E-07 0.000319725 +2.4527E-07 0.000318549 +2.4532E-07 0.000317377 +2.4537E-07 0.000316211 +2.4542E-07 0.000315049 +2.4547E-07 0.000313892 +2.4552E-07 0.00031274 +2.4553E-07 0.000312562 +2.4554E-07 0.000312323 +2.4555E-07 0.000312085 +2.4556E-07 0.000311846 +2.4558E-07 0.000311429 +2.4559E-07 0.000311191 +2.4560E-07 0.000311012 +2.4561E-07 0.000310773 +2.4562E-07 0.000310535 +2.4563E-07 0.000310297 +2.4564E-07 0.000310118 +2.4565E-07 0.000309939 +2.4566E-07 0.000309701 +2.4567E-07 0.000309462 +2.4568E-07 0.000309283 +2.4569E-07 0.000309105 +2.4570E-07 0.000308866 +2.4572E-07 0.000308449 +2.4574E-07 0.000308032 +2.4575E-07 0.000307857 +2.4576E-07 0.000307672 +2.4577E-07 0.000307477 +2.4578E-07 0.000307273 +2.4579E-07 0.000307059 +2.4580E-07 0.000306835 +2.4581E-07 0.000306601 +2.4583E-07 0.000306244 +2.4585E-07 0.000305826 +2.4587E-07 0.000305469 +2.4589E-07 0.000305051 +2.4591E-07 0.000304694 +2.4593E-07 0.000304277 +2.4595E-07 0.000303859 +2.4598E-07 0.000303263 +2.4601E-07 0.000302727 +2.4602E-07 0.000302369 +2.4604E-07 0.000302012 +2.4606E-07 0.000301654 +2.4608E-07 0.000301296 +2.4610E-07 0.000300939 +2.4612E-07 0.000300581 +2.4614E-07 0.000300223 +2.4617E-07 0.000299536 +2.4621E-07 0.000298854 +2.4625E-07 0.000298176 +2.4628E-07 0.000297504 +2.4632E-07 0.000296836 +2.4636E-07 0.000296173 +2.4640E-07 0.000295515 +2.4648E-07 0.000293984 +2.4657E-07 0.000292493 +2.4666E-07 0.000291041 +2.4674E-07 0.000289627 +2.4683E-07 0.000288253 +2.4692E-07 0.000286917 +2.4701E-07 0.00028562 +2.4710E-07 0.00028418 +2.4720E-07 0.000282789 +2.4730E-07 0.000281446 +2.4740E-07 0.000280151 +2.4750E-07 0.000278906 +2.4760E-07 0.000277709 +2.4770E-07 0.00027656 +2.4775E-07 0.00027598 +2.4780E-07 0.000275415 +2.4785E-07 0.000274864 +2.4790E-07 0.000274327 +2.4795E-07 0.000273805 +2.4800E-07 0.000273298 +2.4806E-07 0.000272805 +2.4807E-07 0.000272646 +2.4809E-07 0.000272491 +2.4810E-07 0.000272342 +2.4812E-07 0.000272197 +2.4813E-07 0.000272057 +2.4815E-07 0.000271922 +2.4817E-07 0.000271792 +2.4823E-07 0.000271234 +2.4829E-07 0.0002707 +2.4835E-07 0.00027019 +2.4841E-07 0.000269705 +2.4847E-07 0.000269244 +2.4853E-07 0.000268807 +2.4860E-07 0.000268395 +2.4870E-07 0.000267685 +2.4881E-07 0.000267039 +2.4892E-07 0.000266457 +2.4902E-07 0.000265937 +2.4913E-07 0.000265481 +2.4924E-07 0.000265088 +2.4935E-07 0.000264759 +2.4941E-07 0.000264598 +2.4947E-07 0.000264457 +2.4953E-07 0.000264335 +2.4959E-07 0.000264233 +2.4965E-07 0.00026415 +2.4971E-07 0.000264087 +2.4978E-07 0.000264043 +2.4979E-07 0.00026405 +2.4980E-07 0.000264051 +2.4981E-07 0.000264047 +2.4983E-07 0.000264039 +2.4984E-07 0.000264025 +2.4985E-07 0.000264007 +2.4987E-07 0.000263984 +2.4989E-07 0.000263978 +2.4991E-07 0.000263977 +2.4993E-07 0.00026398 +2.4995E-07 0.000263989 +2.4997E-07 0.000264002 +2.4999E-07 0.00026402 +2.5001E-07 0.000264043 +2.5005E-07 0.000264048 +2.5009E-07 0.000264063 +2.5013E-07 0.000264087 +2.5017E-07 0.000264121 +2.5021E-07 0.000264165 +2.5025E-07 0.000264219 +2.5029E-07 0.000264282 +2.5034E-07 0.000264389 +2.5039E-07 0.000264506 +2.5044E-07 0.000264632 +2.5049E-07 0.000264768 +2.5054E-07 0.000264914 +2.5059E-07 0.00026507 +2.5064E-07 0.000265236 +2.5075E-07 0.000265633 +2.5087E-07 0.000266094 +2.5099E-07 0.000266619 +2.5111E-07 0.000267206 +2.5123E-07 0.000267857 +2.5135E-07 0.000268571 +2.5147E-07 0.000269348 +2.5155E-07 0.00026988 +2.5163E-07 0.000270436 +2.5171E-07 0.000271016 +2.5179E-07 0.000271621 +2.5187E-07 0.000272249 +2.5195E-07 0.000272903 +2.5204E-07 0.00027358 +2.5207E-07 0.000273853 +2.5210E-07 0.000274125 +2.5213E-07 0.000274398 +2.5216E-07 0.00027467 +2.5219E-07 0.000274943 +2.5222E-07 0.000275215 +2.5226E-07 0.000275488 +2.5228E-07 0.000275709 +2.5230E-07 0.00027593 +2.5233E-07 0.000276152 +2.5235E-07 0.000276373 +2.5238E-07 0.000276594 +2.5240E-07 0.000276816 +2.5243E-07 0.000277037 +2.5250E-07 0.000277787 +2.5258E-07 0.000278536 +2.5265E-07 0.000279285 +2.5273E-07 0.000280035 +2.5280E-07 0.000280784 +2.5288E-07 0.000281533 +2.5296E-07 0.000282282 +2.5305E-07 0.000283332 +2.5315E-07 0.000284387 +2.5325E-07 0.000285446 +2.5334E-07 0.000286511 +2.5344E-07 0.00028758 +2.5354E-07 0.000288654 +2.5364E-07 0.000289733 +2.5367E-07 0.000290097 +2.5370E-07 0.000290456 +2.5373E-07 0.00029081 +2.5376E-07 0.000291159 +2.5379E-07 0.000291503 +2.5382E-07 0.000291842 +2.5386E-07 0.000292177 +2.5387E-07 0.000292296 +2.5388E-07 0.000292415 +2.5389E-07 0.000292534 +2.5392E-07 0.000292892 +2.5393E-07 0.000293011 +2.5394E-07 0.000293131 +2.5395E-07 0.00029325 +2.5396E-07 0.000293369 +2.5397E-07 0.000293488 +2.5398E-07 0.000293607 +2.5400E-07 0.000293786 +2.5402E-07 0.000294025 +2.5405E-07 0.000294323 +2.5406E-07 0.000294499 +2.5407E-07 0.000294671 +2.5409E-07 0.000294837 +2.5410E-07 0.000294999 +2.5412E-07 0.000295156 +2.5413E-07 0.000295308 +2.5415E-07 0.000295455 +2.5416E-07 0.000295568 +2.5417E-07 0.000295686 +2.5418E-07 0.000295809 +2.5419E-07 0.000295937 +2.5420E-07 0.000296069 +2.5421E-07 0.000296207 +2.5423E-07 0.000296349 +2.5425E-07 0.000296605 +2.5427E-07 0.00029686 +2.5429E-07 0.000297116 +2.5432E-07 0.000297371 +2.5434E-07 0.000297626 +2.5436E-07 0.000297882 +2.5439E-07 0.000298137 +2.5445E-07 0.000298853 +2.5451E-07 0.000299568 +2.5458E-07 0.000300283 +2.5464E-07 0.000300998 +2.5471E-07 0.000301714 +2.5477E-07 0.000302429 +2.5484E-07 0.000303144 +2.5492E-07 0.00030399 +2.5500E-07 0.00030484 +2.5508E-07 0.000305695 +2.5516E-07 0.000306555 +2.5524E-07 0.00030742 +2.5532E-07 0.00030829 +2.5540E-07 0.000309164 +2.5541E-07 0.000309224 +2.5550E-07 0.000310207 +2.5559E-07 0.00031118 +2.5569E-07 0.000312143 +2.5578E-07 0.000313097 +2.5588E-07 0.000314041 +2.5597E-07 0.000314975 +2.5607E-07 0.000315899 +2.5611E-07 0.000316342 +2.5616E-07 0.000316785 +2.5621E-07 0.000317228 +2.5626E-07 0.000317671 +2.5631E-07 0.000318113 +2.5636E-07 0.000318556 +2.5641E-07 0.000318999 +2.5642E-07 0.000319118 +2.5643E-07 0.000319237 +2.5645E-07 0.000319357 +2.5646E-07 0.000319476 +2.5648E-07 0.000319595 +2.5649E-07 0.000319714 +2.5651E-07 0.000319833 +2.5657E-07 0.000320373 +2.5663E-07 0.000320904 +2.5669E-07 0.000321424 +2.5676E-07 0.000321935 +2.5682E-07 0.000322437 +2.5688E-07 0.000322928 +2.5695E-07 0.00032341 +2.5705E-07 0.000324178 +2.5716E-07 0.000324918 +2.5726E-07 0.000325628 +2.5737E-07 0.00032631 +2.5747E-07 0.000326962 +2.5758E-07 0.000327584 +2.5769E-07 0.000328178 +2.5775E-07 0.000328526 +2.5781E-07 0.000328854 +2.5787E-07 0.000329163 +2.5793E-07 0.000329453 +2.5799E-07 0.000329723 +2.5805E-07 0.000329973 +2.5812E-07 0.000330205 +2.5814E-07 0.00033029 +2.5816E-07 0.000330375 +2.5818E-07 0.00033046 +2.5820E-07 0.000330545 +2.5822E-07 0.00033063 +2.5824E-07 0.000330716 +2.5827E-07 0.000330801 +2.5829E-07 0.000330869 +2.5831E-07 0.000330937 +2.5833E-07 0.000331005 +2.5835E-07 0.000331073 +2.5837E-07 0.000331141 +2.5839E-07 0.000331209 +2.5842E-07 0.000331277 +2.5847E-07 0.00033142 +2.5852E-07 0.000331557 +2.5857E-07 0.00033169 +2.5862E-07 0.000331818 +2.5867E-07 0.00033194 +2.5872E-07 0.000332058 +2.5878E-07 0.000332172 +2.5882E-07 0.000332246 +2.5887E-07 0.000332315 +2.5891E-07 0.00033238 +2.5896E-07 0.000332439 +2.5900E-07 0.000332494 +2.5905E-07 0.000332544 +2.5910E-07 0.000332589 +2.5922E-07 0.00033265 +2.5934E-07 0.000332662 +2.5946E-07 0.000332625 +2.5958E-07 0.00033254 +2.5970E-07 0.000332406 +2.5982E-07 0.000332224 +2.5994E-07 0.000331993 +2.6001E-07 0.00033183 +2.6008E-07 0.000331647 +2.6015E-07 0.000331445 +2.6023E-07 0.000331224 +2.6030E-07 0.000330983 +2.6037E-07 0.000330723 +2.6045E-07 0.000330443 +2.6047E-07 0.000330358 +2.6049E-07 0.000330273 +2.6051E-07 0.000330188 +2.6053E-07 0.000330102 +2.6055E-07 0.000330017 +2.6057E-07 0.000329932 +2.6060E-07 0.000329847 +2.6063E-07 0.000329683 +2.6067E-07 0.000329514 +2.6071E-07 0.00032934 +2.6074E-07 0.000329161 +2.6078E-07 0.000328977 +2.6082E-07 0.000328789 +2.6086E-07 0.000328595 +2.6094E-07 0.000328126 +2.6103E-07 0.000327637 +2.6111E-07 0.000327128 +2.6120E-07 0.0003266 +2.6128E-07 0.000326053 +2.6137E-07 0.000325486 +2.6146E-07 0.0003249 +2.6154E-07 0.000324306 +2.6163E-07 0.000323683 +2.6172E-07 0.000323031 +2.6180E-07 0.00032235 +2.6189E-07 0.00032164 +2.6198E-07 0.0003209 +2.6207E-07 0.000320131 +2.6220E-07 0.000318999 +2.6221E-07 0.00031888 +2.6222E-07 0.00031882 +2.6224E-07 0.000318641 +2.6227E-07 0.000318343 +2.6229E-07 0.000318164 +2.6231E-07 0.000317986 +2.6234E-07 0.000317688 +2.6237E-07 0.000317449 +2.6238E-07 0.000317279 +2.6240E-07 0.000317109 +2.6242E-07 0.000316938 +2.6244E-07 0.000316768 +2.6246E-07 0.000316598 +2.6248E-07 0.000316427 +2.6250E-07 0.000316257 +2.6252E-07 0.000316002 +2.6255E-07 0.000315746 +2.6257E-07 0.000315491 +2.6260E-07 0.000315235 +2.6262E-07 0.00031498 +2.6265E-07 0.000314724 +2.6268E-07 0.000314469 +2.6273E-07 0.000313936 +2.6279E-07 0.000313394 +2.6284E-07 0.000312841 +2.6290E-07 0.000312279 +2.6295E-07 0.000311708 +2.6301E-07 0.000311126 +2.6307E-07 0.000310535 +2.6318E-07 0.000309321 +2.6329E-07 0.000308097 +2.6340E-07 0.000306864 +2.6351E-07 0.000305621 +2.6362E-07 0.000304368 +2.6373E-07 0.000303105 +2.6385E-07 0.000301833 +2.6393E-07 0.000300777 +2.6402E-07 0.000299721 +2.6411E-07 0.000298665 +2.6420E-07 0.000297609 +2.6429E-07 0.000296554 +2.6438E-07 0.000295498 +2.6447E-07 0.000294442 +2.6451E-07 0.000293902 +2.6455E-07 0.000293371 +2.6459E-07 0.000292851 +2.6463E-07 0.00029234 +2.6467E-07 0.000291839 +2.6471E-07 0.000291347 +2.6476E-07 0.000290866 +2.6478E-07 0.000290553 +2.6480E-07 0.000290245 +2.6483E-07 0.000289942 +2.6485E-07 0.000289644 +2.6488E-07 0.000289351 +2.6490E-07 0.000289063 +2.6493E-07 0.000288779 +2.6500E-07 0.000287837 +2.6508E-07 0.000286899 +2.6515E-07 0.000285966 +2.6523E-07 0.000285038 +2.6530E-07 0.000284114 +2.6538E-07 0.000283196 +2.6546E-07 0.000282282 +2.6548E-07 0.000281982 +2.6551E-07 0.000281677 +2.6553E-07 0.000281367 +2.6556E-07 0.000281051 +2.6558E-07 0.000280732 +2.6561E-07 0.000280407 +2.6564E-07 0.000280077 +2.6565E-07 0.000279958 +2.6573E-07 0.000278913 +2.6582E-07 0.000277873 +2.6590E-07 0.000276838 +2.6599E-07 0.000275807 +2.6607E-07 0.000274782 +2.6616E-07 0.000273761 +2.6625E-07 0.000272746 +2.6628E-07 0.000272332 +2.6632E-07 0.000271909 +2.6636E-07 0.000271476 +2.6640E-07 0.000271033 +2.6644E-07 0.00027058 +2.6648E-07 0.000270118 +2.6652E-07 0.000269646 +2.6654E-07 0.000269379 +2.6656E-07 0.000269121 +2.6658E-07 0.000268873 +2.6660E-07 0.000268634 +2.6662E-07 0.000268406 +2.6664E-07 0.000268187 +2.6667E-07 0.000267977 +2.6670E-07 0.00026762 +2.6673E-07 0.000267262 +2.6676E-07 0.000266904 +2.6679E-07 0.000266547 +2.6682E-07 0.000266189 +2.6685E-07 0.000265832 +2.6689E-07 0.000265474 +2.6691E-07 0.000265184 +2.6694E-07 0.000264895 +2.6697E-07 0.000264605 +2.6699E-07 0.000264316 +2.6702E-07 0.000264026 +2.6705E-07 0.000263737 +2.6708E-07 0.000263447 +2.6710E-07 0.000263192 +2.6712E-07 0.000262937 +2.6715E-07 0.000262681 +2.6717E-07 0.000262426 +2.6720E-07 0.00026217 +2.6722E-07 0.000261915 +2.6725E-07 0.000261659 +2.6728E-07 0.000261238 +2.6732E-07 0.000260827 +2.6736E-07 0.000260426 +2.6740E-07 0.000260034 +2.6744E-07 0.000259652 +2.6748E-07 0.00025928 +2.6752E-07 0.000258917 +2.6763E-07 0.000257763 +2.6775E-07 0.000256633 +2.6786E-07 0.000255527 +2.6798E-07 0.000254446 +2.6809E-07 0.000253389 +2.6821E-07 0.000252356 +2.6833E-07 0.000251348 +2.6839E-07 0.000250767 +2.6846E-07 0.000250202 +2.6853E-07 0.000249651 +2.6860E-07 0.000249114 +2.6867E-07 0.000248592 +2.6874E-07 0.000248085 +2.6881E-07 0.000247593 +2.6893E-07 0.000246698 +2.6896E-07 0.000246471 +2.6899E-07 0.000246248 +2.6902E-07 0.000246031 +2.6905E-07 0.000245818 +2.6908E-07 0.00024561 +2.6911E-07 0.000245407 +2.6915E-07 0.000245208 +2.6923E-07 0.000244673 +2.6931E-07 0.000244157 +2.6939E-07 0.000243661 +2.6947E-07 0.000243184 +2.6955E-07 0.000242727 +2.6963E-07 0.000242289 +2.6972E-07 0.000241871 +2.6981E-07 0.00024142 +2.6990E-07 0.00024099 +2.6999E-07 0.000240579 +2.7008E-07 0.000240187 +2.7017E-07 0.000239815 +2.7026E-07 0.000239462 +2.7036E-07 0.000239129 +2.7053E-07 0.000238592 +2.7054E-07 0.000238533 +2.7055E-07 0.000238533 +2.7056E-07 0.000238533 +2.7059E-07 0.000238413 +2.7060E-07 0.000238413 +2.7061E-07 0.000238354 +2.7062E-07 0.000238354 +2.7063E-07 0.000238294 +2.7064E-07 0.000238294 +2.7066E-07 0.000238235 +2.7068E-07 0.000238175 +2.7070E-07 0.000238175 +2.7073E-07 0.000238056 +2.7074E-07 0.000238045 +2.7076E-07 0.000238029 +2.7077E-07 0.000238008 +2.7079E-07 0.000237983 +2.7080E-07 0.000237952 +2.7082E-07 0.000237917 +2.7084E-07 0.000237877 +2.7087E-07 0.000237817 +2.7090E-07 0.000237758 +2.7092E-07 0.000237753 +2.7094E-07 0.000237738 +2.7096E-07 0.000237714 +2.7099E-07 0.00023768 +2.7101E-07 0.000237636 +2.7103E-07 0.000237583 +2.7106E-07 0.000237519 +2.7112E-07 0.000237468 +2.7118E-07 0.000237417 +2.7124E-07 0.000237366 +2.7130E-07 0.000237315 +2.7136E-07 0.000237264 +2.7142E-07 0.000237213 +2.7149E-07 0.000237162 +2.7161E-07 0.000237142 +2.7173E-07 0.000237152 +2.7185E-07 0.000237191 +2.7197E-07 0.000237259 +2.7209E-07 0.000237356 +2.7221E-07 0.000237483 +2.7233E-07 0.000237639 +2.7241E-07 0.000237763 +2.7249E-07 0.000237896 +2.7257E-07 0.00023804 +2.7265E-07 0.000238193 +2.7273E-07 0.000238356 +2.7281E-07 0.000238529 +2.7289E-07 0.000238711 +2.7292E-07 0.000238803 +2.7295E-07 0.000238889 +2.7298E-07 0.000238971 +2.7301E-07 0.000239047 +2.7304E-07 0.000239119 +2.7307E-07 0.000239186 +2.7310E-07 0.000239248 +2.7313E-07 0.000239367 +2.7317E-07 0.000239486 +2.7321E-07 0.000239606 +2.7324E-07 0.000239725 +2.7328E-07 0.000239844 +2.7332E-07 0.000239963 +2.7336E-07 0.000240082 +2.7344E-07 0.000240354 +2.7353E-07 0.00024064 +2.7361E-07 0.00024094 +2.7370E-07 0.000241255 +2.7378E-07 0.000241585 +2.7387E-07 0.000241929 +2.7396E-07 0.000242288 +2.7404E-07 0.000242627 +2.7413E-07 0.000242981 +2.7422E-07 0.00024335 +2.7430E-07 0.000243733 +2.7439E-07 0.000244131 +2.7448E-07 0.000244543 +2.7457E-07 0.00024497 +2.7461E-07 0.000245151 +2.7465E-07 0.000245337 +2.7469E-07 0.000245528 +2.7473E-07 0.000245724 +2.7477E-07 0.000245925 +2.7481E-07 0.00024613 +2.7485E-07 0.000246341 +2.7486E-07 0.00024638 +2.7487E-07 0.000246428 +2.7489E-07 0.000246487 +2.7490E-07 0.000246555 +2.7492E-07 0.000246633 +2.7493E-07 0.00024672 +2.7495E-07 0.000246818 +2.7497E-07 0.000246914 +2.7499E-07 0.000247015 +2.7501E-07 0.000247121 +2.7503E-07 0.000247231 +2.7505E-07 0.000247347 +2.7507E-07 0.000247467 +2.7510E-07 0.000247593 +2.7514E-07 0.000247831 +2.7519E-07 0.000248069 +2.7523E-07 0.000248308 +2.7528E-07 0.000248546 +2.7532E-07 0.000248785 +2.7537E-07 0.000249023 +2.7542E-07 0.000249261 +2.7546E-07 0.000249471 +2.7550E-07 0.00024969 +2.7555E-07 0.000249918 +2.7559E-07 0.000250157 +2.7564E-07 0.000250405 +2.7568E-07 0.000250663 +2.7573E-07 0.00025093 +2.7589E-07 0.000251765 +2.7600E-07 0.000252378 +2.7611E-07 0.000252991 +2.7622E-07 0.000253604 +2.7634E-07 0.000254217 +2.7645E-07 0.00025483 +2.7656E-07 0.000255443 +2.7668E-07 0.000256056 +2.7674E-07 0.000256397 +2.7681E-07 0.000256738 +2.7688E-07 0.000257078 +2.7694E-07 0.000257419 +2.7701E-07 0.000257759 +2.7708E-07 0.0002581 +2.7715E-07 0.000258441 +2.7717E-07 0.000258543 +2.7719E-07 0.000258645 +2.7721E-07 0.000258747 +2.7723E-07 0.000258849 +2.7725E-07 0.000258952 +2.7727E-07 0.000259054 +2.7729E-07 0.000259156 +2.7734E-07 0.000259394 +2.7739E-07 0.000259633 +2.7744E-07 0.000259871 +2.7749E-07 0.00026011 +2.7754E-07 0.000260348 +2.7759E-07 0.000260586 +2.7764E-07 0.000260825 +2.7773E-07 0.000261263 +2.7783E-07 0.000261691 +2.7792E-07 0.000262109 +2.7802E-07 0.000262518 +2.7811E-07 0.000262917 +2.7821E-07 0.000263306 +2.7831E-07 0.000263686 +2.7838E-07 0.000263987 +2.7846E-07 0.000264279 +2.7854E-07 0.000264562 +2.7861E-07 0.000264834 +2.7869E-07 0.000265097 +2.7877E-07 0.00026535 +2.7885E-07 0.000265593 +2.7887E-07 0.000265593 +2.7888E-07 0.000265653 +2.7889E-07 0.000265712 +2.7892E-07 0.000265772 +2.7894E-07 0.000265832 +2.7896E-07 0.000265891 +2.7898E-07 0.000265951 +2.7900E-07 0.00026601 +2.7903E-07 0.00026607 +2.7904E-07 0.000266104 +2.7906E-07 0.000266138 +2.7907E-07 0.000266172 +2.7909E-07 0.000266206 +2.7910E-07 0.00026624 +2.7912E-07 0.000266274 +2.7914E-07 0.000266308 +2.7915E-07 0.000266342 +2.7916E-07 0.000266377 +2.7917E-07 0.000266411 +2.7918E-07 0.000266445 +2.7919E-07 0.000266479 +2.7920E-07 0.000266513 +2.7922E-07 0.000266547 +2.7924E-07 0.000266598 +2.7927E-07 0.000266649 +2.7929E-07 0.0002667 +2.7932E-07 0.000266751 +2.7934E-07 0.000266802 +2.7937E-07 0.000266853 +2.7940E-07 0.000266904 +2.7946E-07 0.000267036 +2.7953E-07 0.000267157 +2.7959E-07 0.000267269 +2.7966E-07 0.000267372 +2.7972E-07 0.000267464 +2.7979E-07 0.000267547 +2.7986E-07 0.00026762 +2.7998E-07 0.000267752 +2.8010E-07 0.000267861 +2.8022E-07 0.000267945 +2.8034E-07 0.000268004 +2.8046E-07 0.000268039 +2.8058E-07 0.00026805 +2.8071E-07 0.000268037 +2.8078E-07 0.000267992 +2.8086E-07 0.000267942 +2.8094E-07 0.000267887 +2.8101E-07 0.000267828 +2.8109E-07 0.000267763 +2.8117E-07 0.000267694 +2.8125E-07 0.00026762 +2.8127E-07 0.000267563 +2.8130E-07 0.00026751 +2.8132E-07 0.000267463 +2.8135E-07 0.00026742 +2.8137E-07 0.000267383 +2.8140E-07 0.00026735 +2.8143E-07 0.000267322 +2.8146E-07 0.000267277 +2.8149E-07 0.000267227 +2.8152E-07 0.000267172 +2.8155E-07 0.000267112 +2.8158E-07 0.000267048 +2.8161E-07 0.000266979 +2.8165E-07 0.000266904 +2.8173E-07 0.000266735 +2.8181E-07 0.000266552 +2.8189E-07 0.000266353 +2.8197E-07 0.000266141 +2.8205E-07 0.000265913 +2.8213E-07 0.000265671 +2.8222E-07 0.000265414 +2.8231E-07 0.000265103 +2.8240E-07 0.000264782 +2.8249E-07 0.000264451 +2.8258E-07 0.00026411 +2.8267E-07 0.00026376 +2.8276E-07 0.0002634 +2.8286E-07 0.00026303 +2.8290E-07 0.000262855 +2.8294E-07 0.00026267 +2.8299E-07 0.000262475 +2.8303E-07 0.000262271 +2.8308E-07 0.000262057 +2.8312E-07 0.000261833 +2.8317E-07 0.0002616 +2.8318E-07 0.000261532 +2.8319E-07 0.000261463 +2.8321E-07 0.000261395 +2.8322E-07 0.000261327 +2.8324E-07 0.000261259 +2.8325E-07 0.000261191 +2.8327E-07 0.000261123 +2.8329E-07 0.000260998 +2.8331E-07 0.000260877 +2.8333E-07 0.000260762 +2.8335E-07 0.000260651 +2.8337E-07 0.000260545 +2.8339E-07 0.000260444 +2.8342E-07 0.000260348 +2.8346E-07 0.000260093 +2.8351E-07 0.000259837 +2.8356E-07 0.000259582 +2.8360E-07 0.000259326 +2.8365E-07 0.000259071 +2.8370E-07 0.000258815 +2.8375E-07 0.00025856 +2.8379E-07 0.000258287 +2.8383E-07 0.000258015 +2.8388E-07 0.000257742 +2.8392E-07 0.00025747 +2.8397E-07 0.000257197 +2.8401E-07 0.000256925 +2.8406E-07 0.000256652 +2.8418E-07 0.000255893 +2.8430E-07 0.000255115 +2.8442E-07 0.000254317 +2.8454E-07 0.0002535 +2.8466E-07 0.000252663 +2.8478E-07 0.000251806 +2.8491E-07 0.00025093 +2.8498E-07 0.000250368 +2.8505E-07 0.000249806 +2.8513E-07 0.000249244 +2.8520E-07 0.000248682 +2.8528E-07 0.00024812 +2.8535E-07 0.000247559 +2.8543E-07 0.000246997 +2.8545E-07 0.000246786 +2.8547E-07 0.000246581 +2.8550E-07 0.00024638 +2.8552E-07 0.000246184 +2.8555E-07 0.000245993 +2.8557E-07 0.000245807 +2.8560E-07 0.000245626 +2.8563E-07 0.000245342 +2.8567E-07 0.000245054 +2.8571E-07 0.000244761 +2.8574E-07 0.000244463 +2.8578E-07 0.00024416 +2.8582E-07 0.000243852 +2.8586E-07 0.000243539 +2.8589E-07 0.000243262 +2.8593E-07 0.000242975 +2.8597E-07 0.000242678 +2.8600E-07 0.000242372 +2.8604E-07 0.000242055 +2.8608E-07 0.000241729 +2.8612E-07 0.000241394 +2.8613E-07 0.000241334 +2.8623E-07 0.000240472 +2.8634E-07 0.000239604 +2.8644E-07 0.000238732 +2.8655E-07 0.000237855 +2.8665E-07 0.000236973 +2.8676E-07 0.000236086 +2.8687E-07 0.000235195 +2.8691E-07 0.000234803 +2.8696E-07 0.000234411 +2.8700E-07 0.00023402 +2.8705E-07 0.000233628 +2.8709E-07 0.000233236 +2.8714E-07 0.000232845 +2.8719E-07 0.000232453 +2.8720E-07 0.000232334 +2.8721E-07 0.000232274 +2.8722E-07 0.000232215 +2.8723E-07 0.000232095 +2.8725E-07 0.000231976 +2.8726E-07 0.000231857 +2.8727E-07 0.000231797 +2.8728E-07 0.000231738 +2.8729E-07 0.000231619 +2.8730E-07 0.000231499 +2.8732E-07 0.00023138 +2.8734E-07 0.000231201 +2.8736E-07 0.000231022 +2.8739E-07 0.000230784 +2.8740E-07 0.000230688 +2.8741E-07 0.000230587 +2.8743E-07 0.000230481 +2.8744E-07 0.00023037 +2.8746E-07 0.000230255 +2.8747E-07 0.000230134 +2.8749E-07 0.000230009 +2.8752E-07 0.000229771 +2.8755E-07 0.000229532 +2.8757E-07 0.000229322 +2.8759E-07 0.000229116 +2.8762E-07 0.000228916 +2.8764E-07 0.00022872 +2.8767E-07 0.000228529 +2.8769E-07 0.000228343 +2.8772E-07 0.000228161 +2.8778E-07 0.000227651 +2.8784E-07 0.00022714 +2.8791E-07 0.000226629 +2.8797E-07 0.000226118 +2.8804E-07 0.000225607 +2.8810E-07 0.000225096 +2.8817E-07 0.000224585 +2.8829E-07 0.000223613 +2.8841E-07 0.000222656 +2.8853E-07 0.000221713 +2.8865E-07 0.000220785 +2.8877E-07 0.000219872 +2.8889E-07 0.000218973 +2.8901E-07 0.000218088 +2.8908E-07 0.000217503 +2.8916E-07 0.000216923 +2.8924E-07 0.000216348 +2.8932E-07 0.000215777 +2.8940E-07 0.000215211 +2.8948E-07 0.000214651 +2.8956E-07 0.000214095 +2.8958E-07 0.000213884 +2.8961E-07 0.000213679 +2.8964E-07 0.000213478 +2.8967E-07 0.000213282 +2.8970E-07 0.000213091 +2.8973E-07 0.000212905 +2.8976E-07 0.000212724 +2.8978E-07 0.000212547 +2.8980E-07 0.000212376 +2.8983E-07 0.000212209 +2.8985E-07 0.000212048 +2.8988E-07 0.000211891 +2.8990E-07 0.000211739 +2.8993E-07 0.000211591 +2.9000E-07 0.000211062 +2.9008E-07 0.000210548 +2.9015E-07 0.000210048 +2.9023E-07 0.000209562 +2.9030E-07 0.000209092 +2.9038E-07 0.000208635 +2.9046E-07 0.000208194 +2.9055E-07 0.000207626 +2.9065E-07 0.000207063 +2.9075E-07 0.000206504 +2.9084E-07 0.000205951 +2.9094E-07 0.000205402 +2.9104E-07 0.000204858 +2.9114E-07 0.00020432 +2.9119E-07 0.000204081 +2.9124E-07 0.000203843 +2.9129E-07 0.000203604 +2.9134E-07 0.000203366 +2.9139E-07 0.000203128 +2.9144E-07 0.000202889 +2.9149E-07 0.000202651 +2.9151E-07 0.000202548 +2.9153E-07 0.000202446 +2.9155E-07 0.000202344 +2.9157E-07 0.000202242 +2.9159E-07 0.00020214 +2.9161E-07 0.000202038 +2.9163E-07 0.000201935 +2.9164E-07 0.000201867 +2.9166E-07 0.000201799 +2.9167E-07 0.000201731 +2.9169E-07 0.000201663 +2.9170E-07 0.000201595 +2.9172E-07 0.000201527 +2.9174E-07 0.000201459 +2.9179E-07 0.000201254 +2.9184E-07 0.00020105 +2.9189E-07 0.000200845 +2.9194E-07 0.000200641 +2.9199E-07 0.000200437 +2.9204E-07 0.000200232 +2.9210E-07 0.000200028 +2.9214E-07 0.000199852 +2.9218E-07 0.00019968 +2.9223E-07 0.000199514 +2.9227E-07 0.000199352 +2.9232E-07 0.000199195 +2.9236E-07 0.000199043 +2.9241E-07 0.000198896 +2.9253E-07 0.000198473 +2.9265E-07 0.000198076 +2.9277E-07 0.000197702 +2.9289E-07 0.000197353 +2.9301E-07 0.000197028 +2.9313E-07 0.000196728 +2.9326E-07 0.000196452 +2.9333E-07 0.000196286 +2.9340E-07 0.000196131 +2.9348E-07 0.000195985 +2.9355E-07 0.000195848 +2.9363E-07 0.000195722 +2.9370E-07 0.000195605 +2.9378E-07 0.000195498 +2.9380E-07 0.000195464 +2.9382E-07 0.00019543 +2.9384E-07 0.000195396 +2.9386E-07 0.000195362 +2.9388E-07 0.000195328 +2.9390E-07 0.000195294 +2.9393E-07 0.00019526 +2.9396E-07 0.000195226 +2.9399E-07 0.000195192 +2.9402E-07 0.000195158 +2.9405E-07 0.000195123 +2.9408E-07 0.000195089 +2.9411E-07 0.000195055 +2.9415E-07 0.000195021 +2.9423E-07 0.000194947 +2.9431E-07 0.000194878 +2.9439E-07 0.000194813 +2.9447E-07 0.000194754 +2.9455E-07 0.000194699 +2.9463E-07 0.000194649 +2.9472E-07 0.000194604 +2.9481E-07 0.000194581 +2.9490E-07 0.000194563 +2.9499E-07 0.000194549 +2.9508E-07 0.000194541 +2.9517E-07 0.000194537 +2.9526E-07 0.000194538 +2.9536E-07 0.000194544 +2.9554E-07 0.000194664 +2.9556E-07 0.000194664 +2.9557E-07 0.000194658 +2.9559E-07 0.000194656 +2.9561E-07 0.00019466 +2.9563E-07 0.000194669 +2.9565E-07 0.000194682 +2.9567E-07 0.0001947 +2.9569E-07 0.000194723 +2.9571E-07 0.00019474 +2.9573E-07 0.000194757 +2.9575E-07 0.000194774 +2.9577E-07 0.000194791 +2.9579E-07 0.000194808 +2.9581E-07 0.000194825 +2.9584E-07 0.000194842 +2.9587E-07 0.000194847 +2.9591E-07 0.000194862 +2.9595E-07 0.000194886 +2.9598E-07 0.00019492 +2.9602E-07 0.000194964 +2.9606E-07 0.000195018 +2.9610E-07 0.000195081 +2.9613E-07 0.000195109 +2.9617E-07 0.000195142 +2.9621E-07 0.000195179 +2.9624E-07 0.000195222 +2.9628E-07 0.000195269 +2.9632E-07 0.000195322 +2.9636E-07 0.000195379 +2.9637E-07 0.000195379 +2.9648E-07 0.000195509 +2.9659E-07 0.000195644 +2.9670E-07 0.000195784 +2.9681E-07 0.000195929 +2.9692E-07 0.000196078 +2.9703E-07 0.000196233 +2.9714E-07 0.000196392 +2.9723E-07 0.000196522 +2.9732E-07 0.000196657 +2.9741E-07 0.000196797 +2.9750E-07 0.000196942 +2.9759E-07 0.000197092 +2.9768E-07 0.000197246 +2.9778E-07 0.000197405 +2.9782E-07 0.000197474 +2.9786E-07 0.000197542 +2.9790E-07 0.00019761 +2.9795E-07 0.000197678 +2.9799E-07 0.000197746 +2.9803E-07 0.000197814 +2.9808E-07 0.000197882 +2.9809E-07 0.000197929 +2.9810E-07 0.000197965 +2.9811E-07 0.000197992 +2.9813E-07 0.000198009 +2.9814E-07 0.000198016 +2.9815E-07 0.000198014 +2.9817E-07 0.000198002 +2.9823E-07 0.000198133 +2.9829E-07 0.000198255 +2.9835E-07 0.000198366 +2.9841E-07 0.000198469 +2.9847E-07 0.000198561 +2.9853E-07 0.000198644 +2.9860E-07 0.000198717 +2.9870E-07 0.000198887 +2.9881E-07 0.000199057 +2.9892E-07 0.000199228 +2.9902E-07 0.000199398 +2.9913E-07 0.000199568 +2.9924E-07 0.000199739 +2.9935E-07 0.000199909 +2.9941E-07 0.000199994 +2.9947E-07 0.000200079 +2.9953E-07 0.000200164 +2.9959E-07 0.000200249 +2.9965E-07 0.000200335 +2.9971E-07 0.00020042 +2.9978E-07 0.000200505 +2.9979E-07 0.000200499 +2.9980E-07 0.000200498 +2.9981E-07 0.000200501 +2.9983E-07 0.00020051 +2.9984E-07 0.000200523 +2.9985E-07 0.000200541 +2.9987E-07 0.000200565 +2.9989E-07 0.000200575 +2.9991E-07 0.000200591 +2.9993E-07 0.000200612 +2.9995E-07 0.000200637 +2.9997E-07 0.000200668 +2.9999E-07 0.000200703 +3.0001E-07 0.000200743 +3.0005E-07 0.000200771 +3.0009E-07 0.000200804 +3.0013E-07 0.000200842 +3.0017E-07 0.000200884 +3.0021E-07 0.000200932 +3.0025E-07 0.000200984 +3.0029E-07 0.000201041 +3.0037E-07 0.000201116 +3.0046E-07 0.000201185 +3.0055E-07 0.000201249 +3.0064E-07 0.000201309 +3.0073E-07 0.000201364 +3.0082E-07 0.000201414 +3.0091E-07 0.000201459 +3.0102E-07 0.000201528 +3.0113E-07 0.000201583 +3.0124E-07 0.000201623 +3.0135E-07 0.000201648 +3.0146E-07 0.000201659 +3.0157E-07 0.000201656 +3.0169E-07 0.000201637 +3.0175E-07 0.000201626 +3.0182E-07 0.000201611 +3.0189E-07 0.00020159 +3.0195E-07 0.000201564 +3.0202E-07 0.000201534 +3.0209E-07 0.000201499 +3.0216E-07 0.000201459 +3.0218E-07 0.000201471 +3.0220E-07 0.000201473 +3.0222E-07 0.000201466 +3.0224E-07 0.000201449 +3.0226E-07 0.000201422 +3.0228E-07 0.000201386 +3.0230E-07 0.000201339 +3.0235E-07 0.000201311 +3.0240E-07 0.000201279 +3.0245E-07 0.000201241 +3.0251E-07 0.000201198 +3.0256E-07 0.000201151 +3.0261E-07 0.000201099 +3.0267E-07 0.000201041 +3.0276E-07 0.00020094 +3.0286E-07 0.000200825 +3.0296E-07 0.000200695 +3.0306E-07 0.00020055 +3.0316E-07 0.000200391 +3.0326E-07 0.000200217 +3.0336E-07 0.000200028 +3.0343E-07 0.000199904 +3.0350E-07 0.00019977 +3.0357E-07 0.000199627 +3.0365E-07 0.000199473 +3.0372E-07 0.00019931 +3.0379E-07 0.000199138 +3.0387E-07 0.000198955 +3.0389E-07 0.000198904 +3.0391E-07 0.000198853 +3.0393E-07 0.000198802 +3.0396E-07 0.000198751 +3.0398E-07 0.0001987 +3.0400E-07 0.000198649 +3.0403E-07 0.000198598 +3.0417E-07 0.00019824 +3.0420E-07 0.000198132 +3.0423E-07 0.000198028 +3.0426E-07 0.00019793 +3.0430E-07 0.000197836 +3.0433E-07 0.000197747 +3.0436E-07 0.000197663 +3.0440E-07 0.000197584 +3.0448E-07 0.000197335 +3.0456E-07 0.000197081 +3.0464E-07 0.000196822 +3.0473E-07 0.000196558 +3.0481E-07 0.000196289 +3.0489E-07 0.000196015 +3.0498E-07 0.000195737 +3.0509E-07 0.000195346 +3.0521E-07 0.000194941 +3.0533E-07 0.000194521 +3.0544E-07 0.000194087 +3.0556E-07 0.000193638 +3.0568E-07 0.000193175 +3.0580E-07 0.000192697 +3.0587E-07 0.000192419 +3.0594E-07 0.000192132 +3.0601E-07 0.000191835 +3.0608E-07 0.000191529 +3.0615E-07 0.000191213 +3.0622E-07 0.000190887 +3.0630E-07 0.000190551 +3.0631E-07 0.000190466 +3.0633E-07 0.000190381 +3.0635E-07 0.000190295 +3.0637E-07 0.00019021 +3.0639E-07 0.000190125 +3.0641E-07 0.00019004 +3.0643E-07 0.000189955 +3.0645E-07 0.00018983 +3.0647E-07 0.000189709 +3.0650E-07 0.000189594 +3.0652E-07 0.000189483 +3.0655E-07 0.000189377 +3.0657E-07 0.000189276 +3.0660E-07 0.00018918 +3.0661E-07 0.00018912 +3.0668E-07 0.000188775 +3.0676E-07 0.00018842 +3.0684E-07 0.000188055 +3.0691E-07 0.00018768 +3.0699E-07 0.000187296 +3.0707E-07 0.000186902 +3.0715E-07 0.000186498 +3.0724E-07 0.000185998 +3.0734E-07 0.000185503 +3.0743E-07 0.000185013 +3.0753E-07 0.000184527 +3.0762E-07 0.000184047 +3.0772E-07 0.000183571 +3.0782E-07 0.0001831 +3.0786E-07 0.000182822 +3.0791E-07 0.000182548 +3.0796E-07 0.000182279 +3.0801E-07 0.000182015 +3.0806E-07 0.000181756 +3.0811E-07 0.000181502 +3.0816E-07 0.000181253 +3.0817E-07 0.000181191 +3.0818E-07 0.000181124 +3.0820E-07 0.000181052 +3.0821E-07 0.000180975 +3.0823E-07 0.000180894 +3.0824E-07 0.000180807 +3.0826E-07 0.000180716 +3.0827E-07 0.000180648 +3.0828E-07 0.00018058 +3.0829E-07 0.000180512 +3.0831E-07 0.000180444 +3.0832E-07 0.000180376 +3.0833E-07 0.000180307 +3.0835E-07 0.000180239 +3.0839E-07 0.000180001 +3.0843E-07 0.000179762 +3.0848E-07 0.000179524 +3.0852E-07 0.000179286 +3.0857E-07 0.000179047 +3.0861E-07 0.000178809 +3.0866E-07 0.00017857 +3.0868E-07 0.000178388 +3.0871E-07 0.000178215 +3.0874E-07 0.000178052 +3.0877E-07 0.000177899 +3.0880E-07 0.000177755 +3.0883E-07 0.000177622 +3.0886E-07 0.000177498 +3.0889E-07 0.000177276 +3.0893E-07 0.000177055 +3.0897E-07 0.000176833 +3.0901E-07 0.000176612 +3.0905E-07 0.000176391 +3.0909E-07 0.000176169 +3.0913E-07 0.000175948 +3.0924E-07 0.000175301 +3.0936E-07 0.000174654 +3.0948E-07 0.000174006 +3.0960E-07 0.000173359 +3.0972E-07 0.000172712 +3.0984E-07 0.000172065 +3.0996E-07 0.000171418 +3.1003E-07 0.000171026 +3.1010E-07 0.000170634 +3.1017E-07 0.000170243 +3.1024E-07 0.000169851 +3.1031E-07 0.000169459 +3.1038E-07 0.000169068 +3.1046E-07 0.000168676 +3.1048E-07 0.000168574 +3.1050E-07 0.000168472 +3.1052E-07 0.000168369 +3.1054E-07 0.000168267 +3.1056E-07 0.000168165 +3.1058E-07 0.000168063 +3.1060E-07 0.000167961 +3.1063E-07 0.00016775 +3.1067E-07 0.000167545 +3.1071E-07 0.000167344 +3.1074E-07 0.000167148 +3.1078E-07 0.000166957 +3.1082E-07 0.000166771 +3.1086E-07 0.00016659 +3.1094E-07 0.00016617 +3.1103E-07 0.000165746 +3.1111E-07 0.000165316 +3.1120E-07 0.000164882 +3.1128E-07 0.000164443 +3.1137E-07 0.000163999 +3.1146E-07 0.00016355 +3.1154E-07 0.000163141 +3.1163E-07 0.000162733 +3.1172E-07 0.000162324 +3.1180E-07 0.000161915 +3.1189E-07 0.000161506 +3.1198E-07 0.000161098 +3.1207E-07 0.000160689 +3.1220E-07 0.000160093 +3.1221E-07 0.000160093 +3.1222E-07 0.000159974 +3.1224E-07 0.000159914 +3.1226E-07 0.000159855 +3.1228E-07 0.000159735 +3.1230E-07 0.000159676 +3.1232E-07 0.000159616 +3.1234E-07 0.000159497 +3.1237E-07 0.000159378 +3.1238E-07 0.00015931 +3.1240E-07 0.000159241 +3.1241E-07 0.000159173 +3.1243E-07 0.000159105 +3.1244E-07 0.000159037 +3.1246E-07 0.000158969 +3.1248E-07 0.000158901 +3.1249E-07 0.000158833 +3.1251E-07 0.000158765 +3.1253E-07 0.000158696 +3.1255E-07 0.000158628 +3.1257E-07 0.00015856 +3.1259E-07 0.000158492 +3.1261E-07 0.000158424 +3.1263E-07 0.000158293 +3.1266E-07 0.000158171 +3.1269E-07 0.000158059 +3.1271E-07 0.000157957 +3.1274E-07 0.000157864 +3.1277E-07 0.000157782 +3.1280E-07 0.000157709 +3.1285E-07 0.000157458 +3.1291E-07 0.000157217 +3.1297E-07 0.000156986 +3.1303E-07 0.000156765 +3.1309E-07 0.000156553 +3.1315E-07 0.000156351 +3.1321E-07 0.000156159 +3.1333E-07 0.000155738 +3.1345E-07 0.000155327 +3.1357E-07 0.000154926 +3.1369E-07 0.000154534 +3.1381E-07 0.000154152 +3.1393E-07 0.00015378 +3.1406E-07 0.000153417 +3.1413E-07 0.000153167 +3.1421E-07 0.000152926 +3.1428E-07 0.000152695 +3.1436E-07 0.000152473 +3.1443E-07 0.000152262 +3.1451E-07 0.00015206 +3.1459E-07 0.000151868 +3.1461E-07 0.000151823 +3.1464E-07 0.000151773 +3.1466E-07 0.000151718 +3.1469E-07 0.000151658 +3.1471E-07 0.000151594 +3.1474E-07 0.000151524 +3.1477E-07 0.00015145 +3.1481E-07 0.000151342 +3.1485E-07 0.000151239 +3.1489E-07 0.00015114 +3.1493E-07 0.000151046 +3.1497E-07 0.000150958 +3.1501E-07 0.000150874 +3.1505E-07 0.000150795 +3.1513E-07 0.000150601 +3.1522E-07 0.000150413 +3.1531E-07 0.000150229 +3.1540E-07 0.00015005 +3.1549E-07 0.000149876 +3.1558E-07 0.000149707 +3.1567E-07 0.000149543 +3.1575E-07 0.000149377 +3.1584E-07 0.000149222 +3.1592E-07 0.000149076 +3.1601E-07 0.00014894 +3.1609E-07 0.000148813 +3.1618E-07 0.000148696 +3.1627E-07 0.000148589 +3.1630E-07 0.000148532 +3.1634E-07 0.00014848 +3.1637E-07 0.000148432 +3.1641E-07 0.00014839 +3.1644E-07 0.000148352 +3.1648E-07 0.000148319 +3.1652E-07 0.000148291 +3.1654E-07 0.000148257 +3.1656E-07 0.000148223 +3.1658E-07 0.000148189 +3.1660E-07 0.000148155 +3.1662E-07 0.000148121 +3.1664E-07 0.000148087 +3.1667E-07 0.000148053 +3.1669E-07 0.000148036 +3.1671E-07 0.000148019 +3.1674E-07 0.000148002 +3.1676E-07 0.000147985 +3.1679E-07 0.000147968 +3.1681E-07 0.000147951 +3.1684E-07 0.000147934 +3.1685E-07 0.000147934 +3.1692E-07 0.000147836 +3.1700E-07 0.000147749 +3.1708E-07 0.000147671 +3.1715E-07 0.000147603 +3.1723E-07 0.000147544 +3.1731E-07 0.000147496 +3.1739E-07 0.000147457 +3.1751E-07 0.000147376 +3.1763E-07 0.000147306 +3.1775E-07 0.000147245 +3.1787E-07 0.000147194 +3.1799E-07 0.000147153 +3.1811E-07 0.000147121 +3.1824E-07 0.000147099 +3.1831E-07 0.000147082 +3.1839E-07 0.000147065 +3.1846E-07 0.000147048 +3.1854E-07 0.000147031 +3.1861E-07 0.000147014 +3.1869E-07 0.000146997 +3.1877E-07 0.00014698 +3.1879E-07 0.00014698 +3.1881E-07 0.00014698 +3.1883E-07 0.00014698 +3.1886E-07 0.00014698 +3.1888E-07 0.00014698 +3.1890E-07 0.00014698 +3.1893E-07 0.00014698 +3.1896E-07 0.00014698 +3.1899E-07 0.00014698 +3.1902E-07 0.00014698 +3.1905E-07 0.00014698 +3.1908E-07 0.00014698 +3.1911E-07 0.00014698 +3.1915E-07 0.00014698 +3.1923E-07 0.000146997 +3.1931E-07 0.000147014 +3.1939E-07 0.000147031 +3.1947E-07 0.000147048 +3.1955E-07 0.000147065 +3.1963E-07 0.000147082 +3.1972E-07 0.000147099 +3.1981E-07 0.000147087 +3.1990E-07 0.000147085 +3.1999E-07 0.000147092 +3.2008E-07 0.000147109 +3.2017E-07 0.000147136 +3.2026E-07 0.000147172 +3.2036E-07 0.000147218 +3.2040E-07 0.000147218 +3.2044E-07 0.000147218 +3.2049E-07 0.000147218 +3.2053E-07 0.000147218 +3.2058E-07 0.000147218 +3.2062E-07 0.000147218 +3.2067E-07 0.000147218 +3.2068E-07 0.000147241 +3.2069E-07 0.00014726 +3.2070E-07 0.000147273 +3.2071E-07 0.000147282 +3.2072E-07 0.000147285 +3.2073E-07 0.000147284 +3.2075E-07 0.000147278 +3.2076E-07 0.000147278 +3.2077E-07 0.000147278 +3.2079E-07 0.000147278 +3.2080E-07 0.000147278 +3.2082E-07 0.000147278 +3.2083E-07 0.000147278 +3.2085E-07 0.000147278 +3.2089E-07 0.000147301 +3.2093E-07 0.000147319 +3.2098E-07 0.000147333 +3.2102E-07 0.000147341 +3.2107E-07 0.000147345 +3.2111E-07 0.000147344 +3.2116E-07 0.000147338 +3.2125E-07 0.000147355 +3.2134E-07 0.000147372 +3.2143E-07 0.000147389 +3.2152E-07 0.000147406 +3.2161E-07 0.000147423 +3.2170E-07 0.00014744 +3.2180E-07 0.000147457 +3.2190E-07 0.000147463 +3.2201E-07 0.000147464 +3.2212E-07 0.00014746 +3.2223E-07 0.000147452 +3.2234E-07 0.000147439 +3.2245E-07 0.00014742 +3.2256E-07 0.000147397 +3.2262E-07 0.00014738 +3.2268E-07 0.000147363 +3.2275E-07 0.000147346 +3.2281E-07 0.000147329 +3.2288E-07 0.000147312 +3.2294E-07 0.000147295 +3.2301E-07 0.000147278 +3.2302E-07 0.000147284 +3.2303E-07 0.000147285 +3.2305E-07 0.000147282 +3.2306E-07 0.000147273 +3.2308E-07 0.00014726 +3.2309E-07 0.000147241 +3.2311E-07 0.000147218 +3.2315E-07 0.000147231 +3.2319E-07 0.000147233 +3.2324E-07 0.000147226 +3.2328E-07 0.000147209 +3.2333E-07 0.000147182 +3.2337E-07 0.000147145 +3.2342E-07 0.000147099 +3.2351E-07 0.000147054 +3.2360E-07 0.000147004 +3.2369E-07 0.00014695 +3.2378E-07 0.00014689 +3.2387E-07 0.000146825 +3.2396E-07 0.000146756 +3.2406E-07 0.000146682 +3.2414E-07 0.00014662 +3.2422E-07 0.000146553 +3.2430E-07 0.000146481 +3.2438E-07 0.000146405 +3.2446E-07 0.000146323 +3.2454E-07 0.000146237 +3.2463E-07 0.000146145 +3.2466E-07 0.000146111 +3.2469E-07 0.000146077 +3.2472E-07 0.000146043 +3.2475E-07 0.000146009 +3.2478E-07 0.000145975 +3.2481E-07 0.000145941 +3.2485E-07 0.000145907 +3.2486E-07 0.00014589 +3.2487E-07 0.000145873 +3.2489E-07 0.000145856 +3.2490E-07 0.000145839 +3.2492E-07 0.000145822 +3.2493E-07 0.000145805 +3.2495E-07 0.000145788 +3.2497E-07 0.000145754 +3.2499E-07 0.00014572 +3.2501E-07 0.000145686 +3.2503E-07 0.000145652 +3.2505E-07 0.000145618 +3.2507E-07 0.000145583 +3.2510E-07 0.000145549 +3.2516E-07 0.000145464 +3.2523E-07 0.000145379 +3.2529E-07 0.000145294 +3.2536E-07 0.000145209 +3.2542E-07 0.000145124 +3.2549E-07 0.000145039 +3.2556E-07 0.000144953 +3.2567E-07 0.000144749 +3.2578E-07 0.000144545 +3.2589E-07 0.00014434 +3.2600E-07 0.000144136 +3.2611E-07 0.000143932 +3.2622E-07 0.000143727 +3.2634E-07 0.000143523 +3.2642E-07 0.000143342 +3.2651E-07 0.000143155 +3.2660E-07 0.000142965 +3.2669E-07 0.000142769 +3.2678E-07 0.000142568 +3.2687E-07 0.000142362 +3.2696E-07 0.000142152 +3.2697E-07 0.000142124 +3.2699E-07 0.000142091 +3.2701E-07 0.000142053 +3.2702E-07 0.000142011 +3.2704E-07 0.000141963 +3.2706E-07 0.000141911 +3.2708E-07 0.000141854 +3.2709E-07 0.000141854 +3.2711E-07 0.00014178 +3.2714E-07 0.00014171 +3.2716E-07 0.000141646 +3.2719E-07 0.000141586 +3.2721E-07 0.000141532 +3.2724E-07 0.000141482 +3.2727E-07 0.000141437 +3.2731E-07 0.000141335 +3.2735E-07 0.000141232 +3.2739E-07 0.00014113 +3.2743E-07 0.000141028 +3.2747E-07 0.000140926 +3.2751E-07 0.000140824 +3.2755E-07 0.000140721 +3.2763E-07 0.000140489 +3.2772E-07 0.000140252 +3.2781E-07 0.00014001 +3.2790E-07 0.000139763 +3.2799E-07 0.000139511 +3.2808E-07 0.000139254 +3.2817E-07 0.000138993 +3.2825E-07 0.000138767 +3.2834E-07 0.000138531 +3.2842E-07 0.000138285 +3.2851E-07 0.000138029 +3.2859E-07 0.000137764 +3.2868E-07 0.000137489 +3.2877E-07 0.000137205 +3.2887E-07 0.000136966 +3.2888E-07 0.000136907 +3.2890E-07 0.000136847 +3.2893E-07 0.000136728 +3.2896E-07 0.000136668 +3.2899E-07 0.000136549 +3.2900E-07 0.000136504 +3.2902E-07 0.000136454 +3.2904E-07 0.000136399 +3.2906E-07 0.00013634 +3.2908E-07 0.000136275 +3.2910E-07 0.000136206 +3.2912E-07 0.000136132 +3.2913E-07 0.000136104 +3.2915E-07 0.000136071 +3.2916E-07 0.000136033 +3.2918E-07 0.000135991 +3.2919E-07 0.000135943 +3.2921E-07 0.000135891 +3.2923E-07 0.000135834 +3.2926E-07 0.000135709 +3.2930E-07 0.000135588 +3.2933E-07 0.000135473 +3.2937E-07 0.000135362 +3.2940E-07 0.000135256 +3.2944E-07 0.000135155 +3.2948E-07 0.000135059 +3.2956E-07 0.000134769 +3.2965E-07 0.00013448 +3.2974E-07 0.00013419 +3.2982E-07 0.000133901 +3.2991E-07 0.000133611 +3.3000E-07 0.000133322 +3.3009E-07 0.000133032 +3.3020E-07 0.000132687 +3.3031E-07 0.000132332 +3.3042E-07 0.000131967 +3.3053E-07 0.000131592 +3.3064E-07 0.000131208 +3.3075E-07 0.000130814 +3.3087E-07 0.00013041 +3.3093E-07 0.000130218 +3.3100E-07 0.000130016 +3.3106E-07 0.000129804 +3.3113E-07 0.000129583 +3.3119E-07 0.000129352 +3.3126E-07 0.000129111 +3.3133E-07 0.00012886 +3.3134E-07 0.000128809 +3.3136E-07 0.000128758 +3.3137E-07 0.000128707 +3.3139E-07 0.000128656 +3.3140E-07 0.000128605 +3.3142E-07 0.000128554 +3.3144E-07 0.000128502 +3.3148E-07 0.000128372 +3.3152E-07 0.000128237 +3.3156E-07 0.000128097 +3.3161E-07 0.000127953 +3.3165E-07 0.000127803 +3.3169E-07 0.000127649 +3.3174E-07 0.000127489 +3.3183E-07 0.000127153 +3.3192E-07 0.000126827 +3.3201E-07 0.000126511 +3.3210E-07 0.000126205 +3.3219E-07 0.000125908 +3.3228E-07 0.000125621 +3.3237E-07 0.000125343 +3.3245E-07 0.000125071 +3.3253E-07 0.000124798 +3.3261E-07 0.000124526 +3.3270E-07 0.000124254 +3.3278E-07 0.000123981 +3.3286E-07 0.000123709 +3.3295E-07 0.000123436 +3.3298E-07 0.00012334 +3.3301E-07 0.000123239 +3.3305E-07 0.000123133 +3.3308E-07 0.000123023 +3.3312E-07 0.000122907 +3.3315E-07 0.000122787 +3.3319E-07 0.000122661 +3.3321E-07 0.000122593 +3.3323E-07 0.000122525 +3.3325E-07 0.000122457 +3.3327E-07 0.000122389 +3.3329E-07 0.000122321 +3.3331E-07 0.000122253 +3.3334E-07 0.000122184 +3.3337E-07 0.000122088 +3.3341E-07 0.000121987 +3.3345E-07 0.000121882 +3.3348E-07 0.000121771 +3.3352E-07 0.000121655 +3.3356E-07 0.000121535 +3.3360E-07 0.00012141 +3.3364E-07 0.000121267 +3.3368E-07 0.00012113 +3.3372E-07 0.000120997 +3.3377E-07 0.000120869 +3.3381E-07 0.000120747 +3.3385E-07 0.000120629 +3.3390E-07 0.000120515 +3.3401E-07 0.000120163 +3.3412E-07 0.00011982 +3.3423E-07 0.000119486 +3.3434E-07 0.000119163 +3.3445E-07 0.000118849 +3.3456E-07 0.000118545 +3.3468E-07 0.00011825 +3.3476E-07 0.000118006 +3.3485E-07 0.000117766 +3.3494E-07 0.000117532 +3.3503E-07 0.000117302 +3.3512E-07 0.000117077 +3.3521E-07 0.000116856 +3.3530E-07 0.000116641 +3.3534E-07 0.000116533 +3.3538E-07 0.00011643 +3.3542E-07 0.000116331 +3.3546E-07 0.000116237 +3.3550E-07 0.000116149 +3.3554E-07 0.000116065 +3.3559E-07 0.000115986 +3.3560E-07 0.000115928 +3.3562E-07 0.000115876 +3.3563E-07 0.000115829 +3.3565E-07 0.000115786 +3.3566E-07 0.000115748 +3.3568E-07 0.000115715 +3.3570E-07 0.000115687 +3.3576E-07 0.000115528 +3.3583E-07 0.000115374 +3.3590E-07 0.000115224 +3.3596E-07 0.000115079 +3.3603E-07 0.000114939 +3.3610E-07 0.000114804 +3.3617E-07 0.000114674 +3.3627E-07 0.000114441 +3.3637E-07 0.000114217 +3.3647E-07 0.000114003 +3.3658E-07 0.000113798 +3.3668E-07 0.000113604 +3.3678E-07 0.000113419 +3.3689E-07 0.000113244 +3.3693E-07 0.000113182 +3.3697E-07 0.000113115 +3.3702E-07 0.000113043 +3.3706E-07 0.000112966 +3.3711E-07 0.000112885 +3.3715E-07 0.000112798 +3.3720E-07 0.000112707 +3.3721E-07 0.000112707 +3.3722E-07 0.000112648 +3.3724E-07 0.000112648 +3.3727E-07 0.000112588 +3.3730E-07 0.000112528 +3.3733E-07 0.000112528 +3.3734E-07 0.000112488 +3.3735E-07 0.000112453 +3.3737E-07 0.000112423 +3.3738E-07 0.000112397 +3.3740E-07 0.000112376 +3.3741E-07 0.000112361 +3.3743E-07 0.00011235 +3.3745E-07 0.000112316 +3.3747E-07 0.000112282 +3.3750E-07 0.000112247 +3.3752E-07 0.000112213 +3.3755E-07 0.000112179 +3.3757E-07 0.000112145 +3.3760E-07 0.000112111 +3.3763E-07 0.000112054 +3.3766E-07 0.000112002 +3.3770E-07 0.000111954 +3.3773E-07 0.000111912 +3.3777E-07 0.000111874 +3.3780E-07 0.000111841 +3.3784E-07 0.000111813 +3.3792E-07 0.000111711 +3.3800E-07 0.000111609 +3.3808E-07 0.000111507 +3.3817E-07 0.000111404 +3.3825E-07 0.000111302 +3.3833E-07 0.0001112 +3.3842E-07 0.000111098 +3.3853E-07 0.000110967 +3.3864E-07 0.000110845 +3.3875E-07 0.000110733 +3.3886E-07 0.000110631 +3.3897E-07 0.000110538 +3.3908E-07 0.000110456 +3.3920E-07 0.000110383 +3.3926E-07 0.000110302 +3.3933E-07 0.000110232 +3.3939E-07 0.000110171 +3.3946E-07 0.00011012 +3.3952E-07 0.000110079 +3.3959E-07 0.000110047 +3.3966E-07 0.000110025 +3.3968E-07 0.000109979 +3.3970E-07 0.000109942 +3.3972E-07 0.000109916 +3.3974E-07 0.000109899 +3.3976E-07 0.000109891 +3.3978E-07 0.000109894 +3.3980E-07 0.000109906 +3.3985E-07 0.000109872 +3.3990E-07 0.000109838 +3.3995E-07 0.000109804 +3.4001E-07 0.00010977 +3.4006E-07 0.000109736 +3.4011E-07 0.000109701 +3.4017E-07 0.000109667 +3.4026E-07 0.000109587 +3.4036E-07 0.000109517 +3.4046E-07 0.000109456 +3.4056E-07 0.000109405 +3.4066E-07 0.000109363 +3.4076E-07 0.000109332 +3.4086E-07 0.00010931 +3.4093E-07 0.000109276 +3.4100E-07 0.000109242 +3.4107E-07 0.000109208 +3.4115E-07 0.000109174 +3.4122E-07 0.000109139 +3.4129E-07 0.000109105 +3.4137E-07 0.000109071 +3.4139E-07 0.000109077 +3.4141E-07 0.000109079 +3.4143E-07 0.000109075 +3.4146E-07 0.000109067 +3.4148E-07 0.000109053 +3.4150E-07 0.000109035 +3.4153E-07 0.000109012 +3.4167E-07 0.000108952 +3.4170E-07 0.000108958 +3.4173E-07 0.000108959 +3.4176E-07 0.000108956 +3.4179E-07 0.000108947 +3.4182E-07 0.000108934 +3.4185E-07 0.000108916 +3.4189E-07 0.000108893 +3.4197E-07 0.000108852 +3.4205E-07 0.000108817 +3.4213E-07 0.000108787 +3.4221E-07 0.000108761 +3.4229E-07 0.000108741 +3.4237E-07 0.000108725 +3.4246E-07 0.000108714 +3.4257E-07 0.00010868 +3.4269E-07 0.000108646 +3.4281E-07 0.000108612 +3.4293E-07 0.000108578 +3.4305E-07 0.000108543 +3.4317E-07 0.000108509 +3.4329E-07 0.000108475 +3.4336E-07 0.000108441 +3.4343E-07 0.000108407 +3.4350E-07 0.000108373 +3.4357E-07 0.000108339 +3.4364E-07 0.000108305 +3.4371E-07 0.000108271 +3.4379E-07 0.000108237 +3.4381E-07 0.000108237 +3.4383E-07 0.000108237 +3.4385E-07 0.000108237 +3.4387E-07 0.000108237 +3.4389E-07 0.000108237 +3.4391E-07 0.000108237 +3.4393E-07 0.000108237 +3.4396E-07 0.00010822 +3.4399E-07 0.000108203 +3.4402E-07 0.000108186 +3.4405E-07 0.000108169 +3.4408E-07 0.000108152 +3.4411E-07 0.000108135 +3.4415E-07 0.000108118 +3.4423E-07 0.000108084 +3.4431E-07 0.00010805 +3.4439E-07 0.000108016 +3.4447E-07 0.000107981 +3.4455E-07 0.000107947 +3.4463E-07 0.000107913 +3.4472E-07 0.000107879 +3.4481E-07 0.000107828 +3.4490E-07 0.000107777 +3.4499E-07 0.000107726 +3.4508E-07 0.000107675 +3.4517E-07 0.000107624 +3.4526E-07 0.000107573 +3.4536E-07 0.000107522 +3.4538E-07 0.000107475 +3.4541E-07 0.000107439 +3.4544E-07 0.000107412 +3.4547E-07 0.000107395 +3.4550E-07 0.000107388 +3.4553E-07 0.00010739 +3.4556E-07 0.000107402 +3.4557E-07 0.000107385 +3.4559E-07 0.000107368 +3.4561E-07 0.000107351 +3.4563E-07 0.000107334 +3.4565E-07 0.000107317 +3.4567E-07 0.0001073 +3.4569E-07 0.000107283 +3.4571E-07 0.000107266 +3.4573E-07 0.000107249 +3.4575E-07 0.000107232 +3.4577E-07 0.000107215 +3.4579E-07 0.000107198 +3.4581E-07 0.000107181 +3.4584E-07 0.000107164 +3.4587E-07 0.00010713 +3.4591E-07 0.000107096 +3.4595E-07 0.000107062 +3.4599E-07 0.000107028 +3.4603E-07 0.000106994 +3.4607E-07 0.00010696 +3.4611E-07 0.000106926 +3.4619E-07 0.000106857 +3.4628E-07 0.000106789 +3.4637E-07 0.000106721 +3.4645E-07 0.000106653 +3.4654E-07 0.000106585 +3.4663E-07 0.000106517 +3.4672E-07 0.000106449 +3.4683E-07 0.000106336 +3.4694E-07 0.000106218 +3.4705E-07 0.000106095 +3.4717E-07 0.000105967 +3.4728E-07 0.000105834 +3.4739E-07 0.000105697 +3.4751E-07 0.000105555 +3.4757E-07 0.000105495 +3.4763E-07 0.000105433 +3.4769E-07 0.000105366 +3.4775E-07 0.000105294 +3.4782E-07 0.000105218 +3.4788E-07 0.000105136 +3.4794E-07 0.00010505 +3.4801E-07 0.000104959 +3.4802E-07 0.000104948 +3.4803E-07 0.000104932 +3.4805E-07 0.000104911 +3.4806E-07 0.000104886 +3.4808E-07 0.000104855 +3.4809E-07 0.00010482 +3.4811E-07 0.00010478 +3.4815E-07 0.000104735 +3.4819E-07 0.000104685 +3.4824E-07 0.00010463 +3.4828E-07 0.000104571 +3.4833E-07 0.000104506 +3.4837E-07 0.000104437 +3.4842E-07 0.000104363 +3.4851E-07 0.000104256 +3.4860E-07 0.000104139 +3.4869E-07 0.000104012 +3.4878E-07 0.000103876 +3.4887E-07 0.00010373 +3.4896E-07 0.000103574 +3.4906E-07 0.000103409 +3.4914E-07 0.000103279 +3.4922E-07 0.000103144 +3.4930E-07 0.000103004 +3.4938E-07 0.000102859 +3.4946E-07 0.000102709 +3.4954E-07 0.000102555 +3.4963E-07 0.000102396 +3.4966E-07 0.000102374 +3.4969E-07 0.000102342 +3.4972E-07 0.000102301 +3.4975E-07 0.00010225 +3.4978E-07 0.000102189 +3.4981E-07 0.000102118 +3.4985E-07 0.000102038 +3.4986E-07 0.000101998 +3.4987E-07 0.000101963 +3.4989E-07 0.000101932 +3.4990E-07 0.000101907 +3.4992E-07 0.000101886 +3.4993E-07 0.00010187 +3.4995E-07 0.000101859 +3.4997E-07 0.000101831 +3.4999E-07 0.000101798 +3.5001E-07 0.000101761 +3.5003E-07 0.000101718 +3.5005E-07 0.000101671 +3.5007E-07 0.000101618 +3.5010E-07 0.000101561 +3.5016E-07 0.000101442 +3.5023E-07 0.000101323 +3.5029E-07 0.000101204 +3.5036E-07 0.000101084 +3.5042E-07 0.000100965 +3.5049E-07 0.000100846 +3.5056E-07 0.000100727 +3.5067E-07 0.000100511 +3.5078E-07 0.000100291 +3.5089E-07 0.000100066 +3.5100E-07 9.98356E-05 +3.5111E-07 9.96016E-05 +3.5122E-07 9.93616E-05 +3.5134E-07 9.91166E-05 +3.5142E-07 9.89296E-05 +3.5151E-07 9.87426E-05 +3.5160E-07 9.85546E-05 +3.5169E-07 9.83676E-05 +3.5178E-07 9.81806E-05 +3.5187E-07 9.79926E-05 +3.5196E-07 9.78056E-05 +3.5200E-07 9.77266E-05 +3.5204E-07 9.76426E-05 +3.5208E-07 9.75536E-05 +3.5212E-07 9.74606E-05 +3.5216E-07 9.73616E-05 +3.5220E-07 9.72586E-05 +3.5225E-07 9.71496E-05 +3.5227E-07 9.71216E-05 +3.5229E-07 9.70896E-05 +3.5231E-07 9.70516E-05 +3.5233E-07 9.70086E-05 +3.5235E-07 9.69616E-05 +3.5237E-07 9.69096E-05 +3.5239E-07 9.68516E-05 +3.5246E-07 9.66986E-05 +3.5253E-07 9.65456E-05 +3.5260E-07 9.63926E-05 +3.5267E-07 9.62386E-05 +3.5274E-07 9.60856E-05 +3.5281E-07 9.59326E-05 +3.5288E-07 9.57796E-05 +3.5298E-07 9.55636E-05 +3.5308E-07 9.53436E-05 +3.5318E-07 9.51186E-05 +3.5328E-07 9.48886E-05 +3.5338E-07 9.46536E-05 +3.5348E-07 9.44146E-05 +3.5359E-07 9.41696E-05 +3.5363E-07 9.40846E-05 +3.5367E-07 9.39996E-05 +3.5371E-07 9.39146E-05 +3.5375E-07 9.38296E-05 +3.5379E-07 9.37436E-05 +3.5383E-07 9.36586E-05 +3.5387E-07 9.35736E-05 +3.5388E-07 9.35736E-05 +3.5390E-07 9.35146E-05 +3.5393E-07 9.34546E-05 +3.5396E-07 9.33946E-05 +3.5399E-07 9.33356E-05 +3.5400E-07 9.33076E-05 +3.5402E-07 9.32746E-05 +3.5404E-07 9.32366E-05 +3.5406E-07 9.31946E-05 +3.5408E-07 9.31466E-05 +3.5410E-07 9.30946E-05 +3.5412E-07 9.30376E-05 +3.5413E-07 9.29976E-05 +3.5415E-07 9.29616E-05 +3.5416E-07 9.29316E-05 +3.5418E-07 9.29056E-05 +3.5419E-07 9.28856E-05 +3.5421E-07 9.28696E-05 +3.5423E-07 9.28586E-05 +3.5426E-07 9.27736E-05 +3.5430E-07 9.26886E-05 +3.5433E-07 9.26026E-05 +3.5437E-07 9.25176E-05 +3.5440E-07 9.24326E-05 +3.5444E-07 9.23476E-05 +3.5448E-07 9.22626E-05 +3.5456E-07 9.20986E-05 +3.5465E-07 9.19296E-05 +3.5474E-07 9.17556E-05 +3.5483E-07 9.15766E-05 +3.5492E-07 9.13926E-05 +3.5501E-07 9.12046E-05 +3.5510E-07 9.10106E-05 +3.5521E-07 9.07896E-05 +3.5532E-07 9.05676E-05 +3.5543E-07 9.03466E-05 +3.5554E-07 9.01256E-05 +3.5565E-07 8.99036E-05 +3.5576E-07 8.96826E-05 +3.5588E-07 8.94606E-05 +3.5594E-07 8.93476E-05 +3.5601E-07 8.92296E-05 +3.5607E-07 8.91066E-05 +3.5614E-07 8.89796E-05 +3.5620E-07 8.88466E-05 +3.5627E-07 8.87096E-05 +3.5634E-07 8.85666E-05 +3.5635E-07 8.85496E-05 +3.5636E-07 8.85326E-05 +3.5638E-07 8.85156E-05 +3.5639E-07 8.84986E-05 +3.5641E-07 8.84816E-05 +3.5642E-07 8.84646E-05 +3.5644E-07 8.84476E-05 +3.5648E-07 8.83626E-05 +3.5652E-07 8.82776E-05 +3.5656E-07 8.81926E-05 +3.5661E-07 8.81076E-05 +3.5665E-07 8.80216E-05 +3.5669E-07 8.79366E-05 +3.5674E-07 8.78516E-05 +3.5683E-07 8.76986E-05 +3.5692E-07 8.75456E-05 +3.5701E-07 8.73916E-05 +3.5710E-07 8.72386E-05 +3.5719E-07 8.70856E-05 +3.5728E-07 8.69326E-05 +3.5737E-07 8.67786E-05 +3.5743E-07 8.66766E-05 +3.5749E-07 8.65746E-05 +3.5755E-07 8.64726E-05 +3.5761E-07 8.63706E-05 +3.5767E-07 8.62676E-05 +3.5773E-07 8.61656E-05 +3.5780E-07 8.60636E-05 +3.5781E-07 8.60636E-05 +3.5786E-07 8.60016E-05 +3.5791E-07 8.59346E-05 +3.5796E-07 8.58626E-05 +3.5801E-07 8.57866E-05 +3.5806E-07 8.57046E-05 +3.5811E-07 8.56186E-05 +3.5816E-07 8.55276E-05 +3.5817E-07 8.55106E-05 +3.5818E-07 8.54926E-05 +3.5820E-07 8.54756E-05 +3.5821E-07 8.54586E-05 +3.5823E-07 8.54416E-05 +3.5824E-07 8.54246E-05 +3.5826E-07 8.54076E-05 +3.5827E-07 8.53966E-05 +3.5828E-07 8.53816E-05 +3.5829E-07 8.53606E-05 +3.5831E-07 8.53346E-05 +3.5832E-07 8.53046E-05 +3.5833E-07 8.52696E-05 +3.5835E-07 8.52296E-05 +3.5839E-07 8.51846E-05 +3.5843E-07 8.51346E-05 +3.5848E-07 8.50796E-05 +3.5852E-07 8.50196E-05 +3.5857E-07 8.49556E-05 +3.5861E-07 8.48856E-05 +3.5866E-07 8.48116E-05 +3.5875E-07 8.46866E-05 +3.5884E-07 8.45666E-05 +3.5893E-07 8.44506E-05 +3.5902E-07 8.43396E-05 +3.5911E-07 8.42336E-05 +3.5920E-07 8.41336E-05 +3.5930E-07 8.40366E-05 +3.5940E-07 8.38946E-05 +3.5951E-07 8.37576E-05 +3.5962E-07 8.36246E-05 +3.5973E-07 8.34966E-05 +3.5984E-07 8.33736E-05 +3.5995E-07 8.32556E-05 +3.6006E-07 8.31426E-05 +3.6012E-07 8.30686E-05 +3.6018E-07 8.29996E-05 +3.6025E-07 8.29346E-05 +3.6031E-07 8.28756E-05 +3.6038E-07 8.28206E-05 +3.6044E-07 8.27706E-05 +3.6051E-07 8.27256E-05 +3.6052E-07 8.26796E-05 +3.6053E-07 8.26426E-05 +3.6055E-07 8.26166E-05 +3.6056E-07 8.25996E-05 +3.6058E-07 8.25916E-05 +3.6059E-07 8.25946E-05 +3.6061E-07 8.26066E-05 +3.6065E-07 8.25786E-05 +3.6069E-07 8.25456E-05 +3.6074E-07 8.25076E-05 +3.6078E-07 8.24656E-05 +3.6083E-07 8.24176E-05 +3.6087E-07 8.23656E-05 +3.6092E-07 8.23086E-05 +3.6101E-07 8.22176E-05 +3.6110E-07 8.21306E-05 +3.6119E-07 8.20496E-05 +3.6128E-07 8.19726E-05 +3.6137E-07 8.19006E-05 +3.6146E-07 8.18336E-05 +3.6156E-07 8.17716E-05 +3.6164E-07 8.17206E-05 +3.6172E-07 8.16696E-05 +3.6180E-07 8.16186E-05 +3.6188E-07 8.15676E-05 +3.6196E-07 8.15166E-05 +3.6204E-07 8.14656E-05 +3.6213E-07 8.14146E-05 +3.6214E-07 8.13916E-05 +3.6215E-07 8.13726E-05 +3.6216E-07 8.13596E-05 +3.6218E-07 8.13516E-05 +3.6219E-07 8.13476E-05 +3.6220E-07 8.13486E-05 +3.6222E-07 8.13546E-05 +3.6223E-07 8.13316E-05 +3.6225E-07 8.13136E-05 +3.6227E-07 8.12996E-05 +3.6228E-07 8.12916E-05 +3.6230E-07 8.12876E-05 +3.6232E-07 8.12896E-05 +3.6234E-07 8.12956E-05 +3.6235E-07 8.12786E-05 +3.6236E-07 8.12616E-05 +3.6238E-07 8.12446E-05 +3.6239E-07 8.12266E-05 +3.6241E-07 8.12096E-05 +3.6242E-07 8.11926E-05 +3.6244E-07 8.11756E-05 +3.6246E-07 8.11816E-05 +3.6248E-07 8.11836E-05 +3.6250E-07 8.11796E-05 +3.6252E-07 8.11716E-05 +3.6254E-07 8.11576E-05 +3.6256E-07 8.11396E-05 +3.6259E-07 8.11166E-05 +3.6264E-07 8.11056E-05 +3.6269E-07 8.10896E-05 +3.6274E-07 8.10686E-05 +3.6279E-07 8.10436E-05 +3.6284E-07 8.10126E-05 +3.6289E-07 8.09776E-05 +3.6295E-07 8.09376E-05 +3.6305E-07 8.08866E-05 +3.6315E-07 8.08356E-05 +3.6325E-07 8.07846E-05 +3.6336E-07 8.07336E-05 +3.6346E-07 8.06826E-05 +3.6356E-07 8.06306E-05 +3.6367E-07 8.05796E-05 +3.6376E-07 8.05286E-05 +3.6386E-07 8.04776E-05 +3.6396E-07 8.04266E-05 +3.6406E-07 8.03756E-05 +3.6416E-07 8.03246E-05 +3.6426E-07 8.02736E-05 +3.6436E-07 8.02226E-05 +3.6441E-07 8.02056E-05 +3.6446E-07 8.01886E-05 +3.6451E-07 8.01716E-05 +3.6457E-07 8.01546E-05 +3.6462E-07 8.01376E-05 +3.6467E-07 8.01206E-05 +3.6473E-07 8.01036E-05 +3.6475E-07 8.00856E-05 +3.6477E-07 8.00686E-05 +3.6479E-07 8.00516E-05 +3.6481E-07 8.00346E-05 +3.6483E-07 8.00176E-05 +3.6485E-07 8.00006E-05 +3.6487E-07 7.99836E-05 +3.6493E-07 7.99726E-05 +3.6500E-07 7.99576E-05 +3.6507E-07 7.99366E-05 +3.6513E-07 7.99106E-05 +3.6520E-07 7.98806E-05 +3.6527E-07 7.98456E-05 +3.6534E-07 7.98046E-05 +3.6544E-07 7.97536E-05 +3.6554E-07 7.97026E-05 +3.6564E-07 7.96516E-05 +3.6575E-07 7.96006E-05 +3.6585E-07 7.95496E-05 +3.6595E-07 7.94986E-05 +3.6606E-07 7.94476E-05 +3.6611E-07 7.94076E-05 +3.6617E-07 7.93716E-05 +3.6623E-07 7.93416E-05 +3.6629E-07 7.93156E-05 +3.6635E-07 7.92956E-05 +3.6641E-07 7.92796E-05 +3.6647E-07 7.92686E-05 +3.6649E-07 7.92516E-05 +3.6651E-07 7.92346E-05 +3.6653E-07 7.92176E-05 +3.6655E-07 7.92006E-05 +3.6657E-07 7.91836E-05 +3.6659E-07 7.91666E-05 +3.6662E-07 7.91496E-05 +3.6663E-07 7.91556E-05 +3.6665E-07 7.91566E-05 +3.6667E-07 7.91526E-05 +3.6668E-07 7.91446E-05 +3.6670E-07 7.91316E-05 +3.6672E-07 7.91126E-05 +3.6674E-07 7.90896E-05 +3.6680E-07 7.90266E-05 +3.6686E-07 7.89726E-05 +3.6692E-07 7.89296E-05 +3.6698E-07 7.88956E-05 +3.6704E-07 7.88706E-05 +3.6710E-07 7.88566E-05 +3.6717E-07 7.88516E-05 +3.6727E-07 7.87546E-05 +3.6738E-07 7.86666E-05 +3.6749E-07 7.85886E-05 +3.6759E-07 7.85206E-05 +3.6770E-07 7.84626E-05 +3.6781E-07 7.84136E-05 +3.6792E-07 7.83746E-05 +3.6805E-07 7.82556E-05 +3.6813E-07 7.82106E-05 +3.6822E-07 7.81606E-05 +3.6831E-07 7.81056E-05 +3.6839E-07 7.80466E-05 +3.6848E-07 7.79816E-05 +3.6857E-07 7.79126E-05 +3.6866E-07 7.78386E-05 +3.6869E-07 7.78036E-05 +3.6873E-07 7.77696E-05 +3.6877E-07 7.77356E-05 +3.6880E-07 7.77016E-05 +3.6884E-07 7.76676E-05 +3.6888E-07 7.76336E-05 +3.6892E-07 7.75996E-05 +3.6893E-07 7.75826E-05 +3.6895E-07 7.75656E-05 +3.6896E-07 7.75486E-05 +3.6898E-07 7.75316E-05 +3.6899E-07 7.75146E-05 +3.6901E-07 7.74976E-05 +3.6903E-07 7.74806E-05 +3.6909E-07 7.74296E-05 +3.6916E-07 7.73786E-05 +3.6922E-07 7.73276E-05 +3.6929E-07 7.72766E-05 +3.6935E-07 7.72246E-05 +3.6942E-07 7.71736E-05 +3.6949E-07 7.71226E-05 +3.6959E-07 7.70206E-05 +3.6969E-07 7.69186E-05 +3.6980E-07 7.68166E-05 +3.6990E-07 7.67146E-05 +3.7001E-07 7.66116E-05 +3.7011E-07 7.65096E-05 +3.7022E-07 7.64076E-05 +3.7026E-07 7.63566E-05 +3.7031E-07 7.63056E-05 +3.7036E-07 7.62546E-05 +3.7040E-07 7.62036E-05 +3.7045E-07 7.61526E-05 +3.7050E-07 7.61006E-05 +3.7055E-07 7.60496E-05 +3.7057E-07 7.60326E-05 +3.7059E-07 7.60156E-05 +3.7061E-07 7.59986E-05 +3.7063E-07 7.59816E-05 +3.7065E-07 7.59646E-05 +3.7067E-07 7.59476E-05 +3.7069E-07 7.59306E-05 +3.7071E-07 7.58906E-05 +3.7073E-07 7.58556E-05 +3.7075E-07 7.58246E-05 +3.7077E-07 7.57996E-05 +3.7079E-07 7.57786E-05 +3.7081E-07 7.57626E-05 +3.7084E-07 7.57516E-05 +3.7087E-07 7.56946E-05 +3.7091E-07 7.56426E-05 +3.7095E-07 7.55946E-05 +3.7099E-07 7.55526E-05 +3.7103E-07 7.55146E-05 +3.7107E-07 7.54816E-05 +3.7111E-07 7.54536E-05 +3.7119E-07 7.53516E-05 +3.7128E-07 7.52496E-05 +3.7137E-07 7.51476E-05 +3.7145E-07 7.50456E-05 +3.7154E-07 7.49426E-05 +3.7163E-07 7.48406E-05 +3.7172E-07 7.47386E-05 +3.7183E-07 7.46026E-05 +3.7194E-07 7.44666E-05 +3.7205E-07 7.43296E-05 +3.7217E-07 7.41936E-05 +3.7228E-07 7.40576E-05 +3.7239E-07 7.39216E-05 +3.7251E-07 7.37846E-05 +3.7257E-07 7.36766E-05 +3.7264E-07 7.35736E-05 +3.7271E-07 7.34746E-05 +3.7277E-07 7.33816E-05 +3.7284E-07 7.32926E-05 +3.7291E-07 7.32086E-05 +3.7298E-07 7.31296E-05 +3.7310E-07 7.29506E-05 +3.7313E-07 7.29286E-05 +3.7317E-07 7.28966E-05 +3.7321E-07 7.28556E-05 +3.7324E-07 7.28046E-05 +3.7328E-07 7.27436E-05 +3.7332E-07 7.26736E-05 +3.7336E-07 7.25926E-05 +3.7344E-07 7.25026E-05 +3.7353E-07 7.24036E-05 +3.7361E-07 7.22936E-05 +3.7370E-07 7.21746E-05 +3.7378E-07 7.20456E-05 +3.7387E-07 7.19066E-05 +3.7396E-07 7.17586E-05 +3.7404E-07 7.16686E-05 +3.7413E-07 7.15686E-05 +3.7422E-07 7.14596E-05 +3.7430E-07 7.13396E-05 +3.7439E-07 7.12106E-05 +3.7448E-07 7.10726E-05 +3.7457E-07 7.09236E-05 +3.7461E-07 7.08496E-05 +3.7465E-07 7.07806E-05 +3.7469E-07 7.07156E-05 +3.7473E-07 7.06566E-05 +3.7477E-07 7.06016E-05 +3.7481E-07 7.05516E-05 +3.7485E-07 7.05066E-05 +3.7486E-07 7.04896E-05 +3.7487E-07 7.04726E-05 +3.7489E-07 7.04556E-05 +3.7490E-07 7.04386E-05 +3.7492E-07 7.04216E-05 +3.7493E-07 7.04046E-05 +3.7495E-07 7.03876E-05 +3.7497E-07 7.03536E-05 +3.7499E-07 7.03196E-05 +3.7501E-07 7.02856E-05 +3.7503E-07 7.02516E-05 +3.7505E-07 7.02176E-05 +3.7507E-07 7.01836E-05 +3.7510E-07 7.01496E-05 +3.7516E-07 7.00696E-05 +3.7523E-07 6.99866E-05 +3.7529E-07 6.98976E-05 +3.7536E-07 6.98036E-05 +3.7542E-07 6.97056E-05 +3.7549E-07 6.96016E-05 +3.7556E-07 6.94936E-05 +3.7567E-07 6.93176E-05 +3.7578E-07 6.91456E-05 +3.7589E-07 6.89786E-05 +3.7600E-07 6.88176E-05 +3.7611E-07 6.86606E-05 +3.7622E-07 6.85086E-05 +3.7634E-07 6.83606E-05 +3.7642E-07 6.82476E-05 +3.7651E-07 6.81296E-05 +3.7660E-07 6.80066E-05 +3.7669E-07 6.78796E-05 +3.7678E-07 6.77466E-05 +3.7687E-07 6.76096E-05 +3.7696E-07 6.74666E-05 +3.7700E-07 6.74156E-05 +3.7704E-07 6.73646E-05 +3.7708E-07 6.73136E-05 +3.7712E-07 6.72626E-05 +3.7716E-07 6.72116E-05 +3.7720E-07 6.71606E-05 +3.7725E-07 6.71096E-05 +3.7727E-07 6.70756E-05 +3.7729E-07 6.70416E-05 +3.7731E-07 6.70076E-05 +3.7733E-07 6.69726E-05 +3.7735E-07 6.69386E-05 +3.7737E-07 6.69046E-05 +3.7739E-07 6.68706E-05 +3.7746E-07 6.67916E-05 +3.7753E-07 6.67076E-05 +3.7760E-07 6.66186E-05 +3.7767E-07 6.65256E-05 +3.7774E-07 6.64266E-05 +3.7781E-07 6.63236E-05 +3.7788E-07 6.62156E-05 +3.7793E-07 6.61536E-05 +3.7799E-07 6.60866E-05 +3.7805E-07 6.60146E-05 +3.7810E-07 6.59376E-05 +3.7816E-07 6.58566E-05 +3.7822E-07 6.57696E-05 +3.7828E-07 6.56786E-05 +3.7829E-07 6.56786E-05 +3.7836E-07 6.55706E-05 +3.7844E-07 6.54676E-05 +3.7852E-07 6.53686E-05 +3.7859E-07 6.52746E-05 +3.7867E-07 6.51866E-05 +3.7875E-07 6.51026E-05 +3.7883E-07 6.50236E-05 +3.7884E-07 6.50066E-05 +3.7885E-07 6.49886E-05 +3.7886E-07 6.49716E-05 +3.7888E-07 6.49546E-05 +3.7889E-07 6.49376E-05 +3.7890E-07 6.49206E-05 +3.7892E-07 6.49036E-05 +3.7895E-07 6.48446E-05 +3.7897E-07 6.48276E-05 +3.7899E-07 6.48106E-05 +3.7901E-07 6.47936E-05 +3.7903E-07 6.47766E-05 +3.7905E-07 6.47596E-05 +3.7907E-07 6.47426E-05 +3.7909E-07 6.47256E-05 +3.7917E-07 6.46056E-05 +3.7920E-07 6.45716E-05 +3.7923E-07 6.45376E-05 +3.7926E-07 6.45036E-05 +3.7930E-07 6.44696E-05 +3.7933E-07 6.44356E-05 +3.7936E-07 6.44016E-05 +3.7940E-07 6.43676E-05 +3.7948E-07 6.42536E-05 +3.7956E-07 6.41486E-05 +3.7964E-07 6.40536E-05 +3.7973E-07 6.39686E-05 +3.7981E-07 6.38926E-05 +3.7989E-07 6.38276E-05 +3.7998E-07 6.37716E-05 +3.8009E-07 6.36226E-05 +3.8021E-07 6.34846E-05 +3.8033E-07 6.33556E-05 +3.8044E-07 6.32366E-05 +3.8056E-07 6.31266E-05 +3.8068E-07 6.30266E-05 +3.8080E-07 6.29366E-05 +3.8087E-07 6.28686E-05 +3.8094E-07 6.28006E-05 +3.8101E-07 6.27326E-05 +3.8108E-07 6.26646E-05 +3.8115E-07 6.25966E-05 +3.8122E-07 6.25286E-05 +3.8130E-07 6.24606E-05 +3.8131E-07 6.24436E-05 +3.8133E-07 6.24256E-05 +3.8135E-07 6.24086E-05 +3.8137E-07 6.23916E-05 +3.8139E-07 6.23746E-05 +3.8141E-07 6.23576E-05 +3.8143E-07 6.23406E-05 +3.8146E-07 6.23006E-05 +3.8149E-07 6.22656E-05 +3.8152E-07 6.22356E-05 +3.8155E-07 6.22096E-05 +3.8158E-07 6.21886E-05 +3.8161E-07 6.21726E-05 +3.8165E-07 6.21626E-05 +3.8173E-07 6.20646E-05 +3.8181E-07 6.19776E-05 +3.8189E-07 6.18996E-05 +3.8197E-07 6.18316E-05 +3.8205E-07 6.17726E-05 +3.8213E-07 6.17246E-05 +3.8222E-07 6.16856E-05 +3.8231E-07 6.15876E-05 +3.8240E-07 6.15006E-05 +3.8249E-07 6.14226E-05 +3.8258E-07 6.13546E-05 +3.8267E-07 6.12956E-05 +3.8276E-07 6.12476E-05 +3.8286E-07 6.12086E-05 +3.8290E-07 6.12036E-05 +3.8294E-07 6.11886E-05 +3.8299E-07 6.11646E-05 +3.8303E-07 6.11306E-05 +3.8308E-07 6.10866E-05 +3.8312E-07 6.10336E-05 +3.8317E-07 6.09696E-05 +3.8318E-07 6.09766E-05 +3.8319E-07 6.09776E-05 +3.8321E-07 6.09736E-05 +3.8322E-07 6.09656E-05 +3.8324E-07 6.09516E-05 +3.8325E-07 6.09336E-05 +3.8327E-07 6.09106E-05 +3.8329E-07 6.09226E-05 +3.8331E-07 6.09246E-05 +3.8333E-07 6.09176E-05 +3.8335E-07 6.09006E-05 +3.8337E-07 6.08736E-05 +3.8339E-07 6.08376E-05 +3.8342E-07 6.07916E-05 +3.8348E-07 6.07576E-05 +3.8354E-07 6.07226E-05 +3.8360E-07 6.06886E-05 +3.8367E-07 6.06546E-05 +3.8373E-07 6.06206E-05 +3.8379E-07 6.05866E-05 +3.8386E-07 6.05526E-05 +3.8396E-07 6.04846E-05 +3.8407E-07 6.04166E-05 +3.8418E-07 6.03486E-05 +3.8429E-07 6.02806E-05 +3.8440E-07 6.02126E-05 +3.8451E-07 6.01436E-05 +3.8462E-07 6.00756E-05 +3.8471E-07 6.00246E-05 +3.8480E-07 5.99736E-05 +3.8489E-07 5.99226E-05 +3.8498E-07 5.98716E-05 +3.8507E-07 5.98206E-05 +3.8516E-07 5.97696E-05 +3.8526E-07 5.97186E-05 +3.8530E-07 5.97016E-05 +3.8535E-07 5.96846E-05 +3.8539E-07 5.96676E-05 +3.8544E-07 5.96506E-05 +3.8548E-07 5.96336E-05 +3.8553E-07 5.96166E-05 +3.8558E-07 5.95996E-05 +3.8559E-07 5.95756E-05 +3.8560E-07 5.95576E-05 +3.8561E-07 5.95446E-05 +3.8563E-07 5.95356E-05 +3.8564E-07 5.95326E-05 +3.8565E-07 5.95336E-05 +3.8567E-07 5.95396E-05 +3.8573E-07 5.94996E-05 +3.8579E-07 5.94636E-05 +3.8585E-07 5.94336E-05 +3.8591E-07 5.94086E-05 +3.8597E-07 5.93876E-05 +3.8603E-07 5.93716E-05 +3.8610E-07 5.93606E-05 +3.8620E-07 5.92806E-05 +3.8631E-07 5.92096E-05 +3.8642E-07 5.91486E-05 +3.8652E-07 5.90976E-05 +3.8663E-07 5.90566E-05 +3.8674E-07 5.90246E-05 +3.8685E-07 5.90026E-05 +3.8690E-07 5.89686E-05 +3.8695E-07 5.89346E-05 +3.8700E-07 5.89006E-05 +3.8706E-07 5.88666E-05 +3.8711E-07 5.88326E-05 +3.8716E-07 5.87986E-05 +3.8722E-07 5.87646E-05 +3.8724E-07 5.87706E-05 +3.8726E-07 5.87716E-05 +3.8728E-07 5.87686E-05 +3.8730E-07 5.87596E-05 +3.8732E-07 5.87466E-05 +3.8734E-07 5.87286E-05 +3.8736E-07 5.87046E-05 +3.8738E-07 5.87116E-05 +3.8740E-07 5.87126E-05 +3.8742E-07 5.87086E-05 +3.8744E-07 5.87006E-05 +3.8746E-07 5.86866E-05 +3.8748E-07 5.86686E-05 +3.8751E-07 5.86456E-05 +3.8755E-07 5.86286E-05 +3.8759E-07 5.86116E-05 +3.8763E-07 5.85946E-05 +3.8767E-07 5.85776E-05 +3.8771E-07 5.85606E-05 +3.8775E-07 5.85436E-05 +3.8780E-07 5.85266E-05 +3.8788E-07 5.84986E-05 +3.8797E-07 5.84656E-05 +3.8806E-07 5.84276E-05 +3.8815E-07 5.83856E-05 +3.8824E-07 5.83376E-05 +3.8833E-07 5.82856E-05 +3.8842E-07 5.82286E-05 +3.8853E-07 5.81686E-05 +3.8863E-07 5.81176E-05 +3.8874E-07 5.80666E-05 +3.8884E-07 5.80156E-05 +3.8895E-07 5.79646E-05 +3.8905E-07 5.79136E-05 +3.8916E-07 5.78616E-05 +3.8927E-07 5.78106E-05 +3.8933E-07 5.77766E-05 +3.8939E-07 5.77426E-05 +3.8945E-07 5.77086E-05 +3.8951E-07 5.76746E-05 +3.8957E-07 5.76406E-05 +3.8963E-07 5.76066E-05 +3.8969E-07 5.75726E-05 +3.8971E-07 5.75556E-05 +3.8973E-07 5.75386E-05 +3.8976E-07 5.75216E-05 +3.8978E-07 5.75046E-05 +3.8981E-07 5.74876E-05 +3.8983E-07 5.74706E-05 +3.8986E-07 5.74536E-05 +3.8992E-07 5.74196E-05 +3.8999E-07 5.73856E-05 +3.9005E-07 5.73516E-05 +3.9012E-07 5.73176E-05 +3.9018E-07 5.72826E-05 +3.9025E-07 5.72486E-05 +3.9032E-07 5.72146E-05 +3.9042E-07 5.71466E-05 +3.9052E-07 5.70786E-05 +3.9063E-07 5.70106E-05 +3.9073E-07 5.69426E-05 +3.9084E-07 5.68746E-05 +3.9094E-07 5.68066E-05 +3.9105E-07 5.67376E-05 +3.9110E-07 5.67036E-05 +3.9116E-07 5.66696E-05 +3.9122E-07 5.66356E-05 +3.9128E-07 5.66016E-05 +3.9134E-07 5.65676E-05 +3.9140E-07 5.65336E-05 +3.9146E-07 5.64996E-05 +3.9148E-07 5.64826E-05 +3.9150E-07 5.64656E-05 +3.9152E-07 5.64486E-05 +3.9155E-07 5.64316E-05 +3.9157E-07 5.64146E-05 +3.9159E-07 5.63976E-05 +3.9162E-07 5.63806E-05 +3.9163E-07 5.63636E-05 +3.9165E-07 5.63466E-05 +3.9167E-07 5.63296E-05 +3.9168E-07 5.63126E-05 +3.9170E-07 5.62956E-05 +3.9172E-07 5.62786E-05 +3.9174E-07 5.62616E-05 +3.9180E-07 5.62336E-05 +3.9186E-07 5.62006E-05 +3.9192E-07 5.61626E-05 +3.9198E-07 5.61206E-05 +3.9204E-07 5.60726E-05 +3.9210E-07 5.60206E-05 +3.9217E-07 5.59636E-05 +3.9227E-07 5.58716E-05 +3.9238E-07 5.57856E-05 +3.9249E-07 5.57046E-05 +3.9259E-07 5.56276E-05 +3.9270E-07 5.55556E-05 +3.9281E-07 5.54886E-05 +3.9292E-07 5.54266E-05 +3.9301E-07 5.53416E-05 +3.9310E-07 5.52566E-05 +3.9320E-07 5.51716E-05 +3.9329E-07 5.50866E-05 +3.9339E-07 5.50006E-05 +3.9348E-07 5.49156E-05 +3.9358E-07 5.48306E-05 +3.9362E-07 5.47966E-05 +3.9367E-07 5.47626E-05 +3.9372E-07 5.47286E-05 +3.9376E-07 5.46946E-05 +3.9381E-07 5.46606E-05 +3.9386E-07 5.46266E-05 +3.9391E-07 5.45926E-05 +3.9392E-07 5.45756E-05 +3.9393E-07 5.45586E-05 +3.9395E-07 5.45416E-05 +3.9396E-07 5.45246E-05 +3.9398E-07 5.45076E-05 +3.9399E-07 5.44906E-05 +3.9401E-07 5.44736E-05 +3.9407E-07 5.44216E-05 +3.9413E-07 5.43706E-05 +3.9419E-07 5.43196E-05 +3.9426E-07 5.42686E-05 +3.9432E-07 5.42176E-05 +3.9438E-07 5.41666E-05 +3.9445E-07 5.41156E-05 +3.9455E-07 5.40136E-05 +3.9466E-07 5.39116E-05 +3.9476E-07 5.38086E-05 +3.9487E-07 5.37066E-05 +3.9497E-07 5.36046E-05 +3.9508E-07 5.35026E-05 +3.9519E-07 5.34006E-05 +3.9524E-07 5.33726E-05 +3.9529E-07 5.33396E-05 +3.9534E-07 5.33016E-05 +3.9539E-07 5.32596E-05 +3.9544E-07 5.32116E-05 +3.9549E-07 5.31596E-05 +3.9554E-07 5.31026E-05 +3.9555E-07 5.30786E-05 +3.9556E-07 5.30606E-05 +3.9557E-07 5.30476E-05 +3.9558E-07 5.30386E-05 +3.9559E-07 5.30356E-05 +3.9560E-07 5.30366E-05 +3.9562E-07 5.30426E-05 +3.9563E-07 5.30256E-05 +3.9564E-07 5.30086E-05 +3.9565E-07 5.29916E-05 +3.9566E-07 5.29746E-05 +3.9567E-07 5.29576E-05 +3.9568E-07 5.29406E-05 +3.9570E-07 5.29236E-05 +3.9584E-07 5.28046E-05 +3.9587E-07 5.27706E-05 +3.9591E-07 5.27356E-05 +3.9595E-07 5.27016E-05 +3.9599E-07 5.26676E-05 +3.9603E-07 5.26336E-05 +3.9607E-07 5.25996E-05 +3.9611E-07 5.25656E-05 +3.9619E-07 5.24806E-05 +3.9628E-07 5.23956E-05 +3.9637E-07 5.23106E-05 +3.9645E-07 5.22256E-05 +3.9654E-07 5.21396E-05 +3.9663E-07 5.20546E-05 +3.9672E-07 5.19696E-05 +3.9683E-07 5.18676E-05 +3.9694E-07 5.17656E-05 +3.9705E-07 5.16636E-05 +3.9717E-07 5.15606E-05 +3.9728E-07 5.14586E-05 +3.9739E-07 5.13566E-05 +3.9751E-07 5.12546E-05 +3.9757E-07 5.11866E-05 +3.9764E-07 5.11186E-05 +3.9771E-07 5.10506E-05 +3.9777E-07 5.09816E-05 +3.9784E-07 5.09136E-05 +3.9791E-07 5.08456E-05 +3.9798E-07 5.07776E-05 +3.9810E-07 5.06586E-05 +3.9813E-07 5.06246E-05 +3.9817E-07 5.05906E-05 +3.9821E-07 5.05566E-05 +3.9824E-07 5.05226E-05 +3.9828E-07 5.04886E-05 +3.9832E-07 5.04536E-05 +3.9836E-07 5.04196E-05 +3.9841E-07 5.03686E-05 +3.9847E-07 5.03176E-05 +3.9853E-07 5.02666E-05 +3.9858E-07 5.02156E-05 +3.9864E-07 5.01646E-05 +3.9870E-07 5.01136E-05 +3.9876E-07 5.00626E-05 +3.9877E-07 5.00626E-05 +3.9886E-07 4.99546E-05 +3.9896E-07 4.98506E-05 +3.9906E-07 4.97526E-05 +3.9916E-07 4.96586E-05 +3.9926E-07 4.95696E-05 +3.9936E-07 4.94856E-05 +3.9946E-07 4.94066E-05 +3.9951E-07 4.93496E-05 +3.9956E-07 4.92976E-05 +3.9961E-07 4.92496E-05 +3.9966E-07 4.92076E-05 +3.9971E-07 4.91696E-05 +3.9976E-07 4.91366E-05 +3.9982E-07 4.91086E-05 +3.9983E-07 4.90626E-05 +3.9984E-07 4.90256E-05 +3.9986E-07 4.89996E-05 +3.9987E-07 4.89826E-05 +3.9989E-07 4.89746E-05 +3.9990E-07 4.89776E-05 +3.9992E-07 4.89896E-05 +4.0000E-07 4.89296E-05 +4.0000E-07 4.88706E-05 +# eof \ No newline at end of file diff --git a/parameter/MDTParamenter_WCTE.txt b/parameter/MDTParamenter_WCTE.txt index c965acc..85b6fb9 100644 --- a/parameter/MDTParamenter_WCTE.txt +++ b/parameter/MDTParamenter_WCTE.txt @@ -47,3 +47,4 @@ < SPECDFFile_PMT3inchR12199_02 = $MDTROOT/parameter/SPE_CDF_PMT3inchR12199_02.txt > +< WaveformFile = $MDTROOT/parameter/LC-gauss.txt > From d5d582279343fcd398ed0581090e7bb1e426b6e1 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Thu, 1 Jun 2023 09:45:53 +0900 Subject: [PATCH 02/55] Do pulse fitting --- README.md | 19 ++++++- app/utilities/WCRootData/include/WCRootData.h | 5 +- app/utilities/WCRootData/src/WCRootData.cc | 16 ++++++ cpp/include/HitDigitizer.h | 1 + cpp/include/HitTube.h | 6 +- cpp/src/HitDigitizer.cc | 57 +++++++++++++------ cpp/src/HitTube.cc | 2 + 7 files changed, 87 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index b7557f0..4d9bc41 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,25 @@ Then set up the MDT environment. source envMDT.sh cd $MDTROOT/cpp; make clean; make all cd $MDTROOT/app/utilities/WCRootData; make clean; make all -cd $MDTROOT/app/application; make appWCTESingleEvent +cd $MDTROOT/app/application; make clean; make appWCTESingleEvent cd $MDTROOT # edit variables properly in run_test_mdt4wcte.sh bash run_test_mdt4wcte.sh ``` + +## How to simulate and access digitized pulses +For each true hit, a digitized waveform is simulated by sampling the single PE pulse (defined by the `` parameter) every 8 ns with 1 mV resolution. If there is another PE arriving within the same pulse window, the waveforms are added and pulse window is extended. + +To do pulse fitting, the peak of each pulse is found, then a Gaussian fit is done and the fitted parameters are used to calculate the digitized time and charge. + +The waveform of the first pulse of each PMT in each event is saved in `TClonesArray`. To read the pulses, +``` +// open the file and get the digitzed waveform tree +TTree* wcsimDigiWFTree = (TTree*)f->Get("wcsimDigiWFTree"); +TClonesArray *arr = new TClonesArray("TH1F"); +wcsimDigiWFTree->GetBranch("wcsimDigiWF")->SetAutoDelete(kFALSE); +wcsimDigiWFTree->SetBranchAddress("wcsimDigiWF",&arr); +// In each event, each array index corresponds to PMT id (from 0 to nPMTs-1) +wcsimDigiWFTree->GetEntry(0); // event id +TH1F* h = (TH1F*)arr->At(0); // PMT id +``` \ No newline at end of file diff --git a/app/utilities/WCRootData/include/WCRootData.h b/app/utilities/WCRootData/include/WCRootData.h index 2b09afa..ab7d8be 100644 --- a/app/utilities/WCRootData/include/WCRootData.h +++ b/app/utilities/WCRootData/include/WCRootData.h @@ -69,9 +69,12 @@ class WCRootData bool fMultDigiHits; TTree *fWCSimDigiWFT; - //std::vector fDigiWF; TClonesArray* fDigiWF; + TTree *fWCSimDigiPulls; + float fPullQ; + float fPullT; + private: void SetTubes(HitTubeCollection*, const int); TString fOutFileName; diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index 4c084a5..bb0ba49 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -20,6 +20,11 @@ WCRootData::WCRootData() Conf->GetValue("FlagMultDigits", mult_flag); fMultDigiHits = bool(mult_flag); + + fWCSimDigiWFT = 0; + fWCSimDigiPulls = 0; + fPullQ = -99.; + fPullT = -99.; } WCRootData::~WCRootData() @@ -27,6 +32,8 @@ WCRootData::~WCRootData() if( fWCGeom ){ delete fWCGeom; fWCGeom = 0; } if( fWCSimT ){ delete fWCSimT; fWCSimT = 0; } if( fWCSimC ){ delete fWCSimC; fWCSimC = 0; } + if( fWCSimDigiWFT ){ delete fWCSimDigiWFT; fWCSimDigiWFT = 0; } + if( fWCSimDigiPulls ){ delete fWCSimDigiPulls; fWCSimDigiPulls = 0; } fSpEvt.clear(); fSpEvt.shrink_to_fit(); } @@ -180,6 +187,9 @@ void WCRootData::CreateTree(const char *filename, const vector &list) fWCSimDigiWFT = new TTree("wcsimDigiWFTree","Digitized waveform for each PMT"); fDigiWF = new TClonesArray("TH1F"); fWCSimDigiWFT->Branch("wcsimDigiWF",&fDigiWF); + fWCSimDigiPulls = new TTree("WCSimDigiPulls","Time and charge pulls of digitized hits"); + fWCSimDigiPulls->Branch("PullQ",&fPullQ); + fWCSimDigiPulls->Branch("PullT",&fPullT); } void WCRootData::AddDigiHits(MDTManager *mdt, int eventID, int iPMT) @@ -277,6 +287,11 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID if (aPH->GetDigiWF()) new(fDigiWFarray[aPH->GetTubeID()-1]) TH1F(*(aPH->GetDigiWF())); else new(fDigiWFarray[aPH->GetTubeID()-1]) TH1F(); + + fPullQ = aPH->GetPullQ(); + fPullT = aPH->GetPullT(); + fWCSimDigiPulls->Fill(); + aPH = NULL; } // PMT loop } @@ -401,6 +416,7 @@ void WCRootData::WriteTree() f->cd(); fWCSimT->Write(); fWCSimDigiWFT->Write(); + fWCSimDigiPulls->Write(); f->Close(); } diff --git a/cpp/include/HitDigitizer.h b/cpp/include/HitDigitizer.h index 9e0ffd8..24fa730 100644 --- a/cpp/include/HitDigitizer.h +++ b/cpp/include/HitDigitizer.h @@ -42,6 +42,7 @@ class HitDigitizer_mPMT : public HitDigitizer void LoadWaveform(const string &filename); void DigitizeTube(HitTube*, PMTResponse*); TH1F BuildWavetrain(const vector PEs, double waveform_window); + void FitWavetrain(TH1F hist, double& digiT, double& digiQ); private: TH1F* hWF; diff --git a/cpp/include/HitTube.h b/cpp/include/HitTube.h index f5077cc..6296ba2 100644 --- a/cpp/include/HitTube.h +++ b/cpp/include/HitTube.h @@ -82,7 +82,9 @@ class HitTube { return hDigiWF; } - + void SetDigiPulls(float pullT, float pullQ) { fPullT = pullT; fPullQ = pullQ;} + float GetPullT() {return fPullT;} + float GetPullQ() {return fPullQ;} private: int fNRawPE; @@ -97,4 +99,6 @@ class HitTube vector> fParentCompDigi; TH1F* hDigiWF; + float fPullT; + float fPullQ; }; diff --git a/cpp/src/HitDigitizer.cc b/cpp/src/HitDigitizer.cc index 33391a5..0cb9137 100644 --- a/cpp/src/HitDigitizer.cc +++ b/cpp/src/HitDigitizer.cc @@ -1,5 +1,7 @@ #include "HitDigitizer.h" #include "Configuration.h" +#include "TF1.h" +#include "TFitResult.h" HitDigitizer::HitDigitizer(int seed) : fPrecisionCharge(0.), @@ -204,7 +206,6 @@ void HitDigitizer_mPMT::DigitizeTube(HitTube *aHT, PMTResponse *pr) // Taken from WCSimWCDigitizerSKI::DigitizeHits double sumSPE = 0.; - double tSmeared = -9999.; bool isAlive = false; double digiT = 0.; double digiQ = 0.; @@ -227,25 +228,24 @@ void HitDigitizer_mPMT::DigitizeTube(HitTube *aHT, PMTResponse *pr) } else { - digiT = intgr_srt; - digiQ = sumSPE; + + TH1F hWT = BuildWavetrain(digiPEs, fIntegWindow); + this->FitWavetrain(hWT,digiT,digiQ); isAlive = true; if (fApplyEff ){ this->ApplyThreshold(digiQ, isAlive); } if( isAlive ) { - tSmeared = pr->HitTimeSmearing(digiQ); digiQ *= fEfficiency; - digiT += tSmeared; digiQ = this->DoTruncate(digiQ, fPrecisionCharge); digiT = this->DoTruncate(digiT, fPrecisionTiming); aHT->AddDigiHit(digiT, digiQ, parent_composition); + if (!aHT->GetDigiWF()) aHT->SetDigiWF(hWT); + aHT->SetDigiPulls(digiT-digiPEs.front()->GetTime(),digiQ-digiPEs.size()); } - TH1F hWT = BuildWavetrain(digiPEs, fIntegWindow); - if (!aHT->GetDigiWF()) aHT->SetDigiWF(hWT); + digiPEs.clear(); sumSPE = 0.; parent_composition.clear(); - digiPEs.clear(); intgr_srt = PEs[iPE]->GetTime(); intgr_end = intgr_srt+fIntegWindow; @@ -255,27 +255,25 @@ void HitDigitizer_mPMT::DigitizeTube(HitTube *aHT, PMTResponse *pr) } } - digiT = intgr_srt; - digiQ = sumSPE; - tSmeared = pr->HitTimeSmearing(digiQ); + TH1F hWT = BuildWavetrain(digiPEs, fIntegWindow); + this->FitWavetrain(hWT,digiT,digiQ); isAlive = true; if (fApplyEff ){ this->ApplyThreshold(digiQ, isAlive); } if( isAlive ) { digiQ *= fEfficiency; - digiT += tSmeared ; digiQ = this->DoTruncate(digiQ, fPrecisionCharge); digiT = this->DoTruncate(digiT, fPrecisionTiming); aHT->AddDigiHit(digiT, digiQ, parent_composition); + if (!aHT->GetDigiWF()) aHT->SetDigiWF(hWT); + aHT->SetDigiPulls(digiT-digiPEs.front()->GetTime(),digiQ-digiPEs.size()); } - TH1F hWT = BuildWavetrain(digiPEs, fIntegWindow); - if (!aHT->GetDigiWF()) aHT->SetDigiWF(hWT); } TH1F HitDigitizer_mPMT::BuildWavetrain(const vector PEs, double waveform_window) { - double dt = 8; // start, end, interval of sampling - double tmin = floor((PEs.front()->GetTime()-waveform_window)/dt)*dt; + double dt = 8; // interval, start, end of sampling + double tmin = floor((PEs.front()->GetTime())/dt)*dt; double tmax = ceil((PEs.back()->GetTime()+waveform_window)/dt)*dt; TH1F hWT("","",(int)(tmax-tmin)/dt,tmin,tmax); @@ -297,4 +295,31 @@ TH1F HitDigitizer_mPMT::BuildWavetrain(const vector PEs, double wavefo } return hWT; +} + +void HitDigitizer_mPMT::FitWavetrain(TH1F hist, double& digiT, double& digiQ) +{ + double dt = 8; + int maxBin = hist.GetMaximumBin(); + double digiT_guess = hist.GetBinCenter(maxBin); + double digiQ_guess = hist.GetBinContent(maxBin); + double sigma_guess = 6; + double range_min = hist.GetBinLowEdge(maxBin); + double range_max = hist.GetBinLowEdge(maxBin+1); + double adc_to_pe = 108; + for (int i=maxBin-1;i>=1;i--) + { + if (hist.GetBinContent(i)>0) range_min = hist.GetBinLowEdge(i); + else break; + } + for (int i=maxBin+1;i<=hist.GetNbinsX();i++) + { + if (hist.GetBinContent(i)>0) range_max = hist.GetBinLowEdge(i+1); + else break; + } + TF1 f1("f1", "gaus", range_min,range_max); + f1.SetParameters(digiQ_guess,digiT_guess,sigma_guess); + TFitResultPtr r = hist.Fit("f1","S Q N","",range_min,range_max); + digiQ = r->Parameter(0)*r->Parameter(2)/adc_to_pe; + digiT = r->Parameter(1) - 3*r->Parameter(2) - dt; } \ No newline at end of file diff --git a/cpp/src/HitTube.cc b/cpp/src/HitTube.cc index e72ad41..4eb819a 100644 --- a/cpp/src/HitTube.cc +++ b/cpp/src/HitTube.cc @@ -13,6 +13,8 @@ HitTube::HitTube(int id) fTubeID = id; hDigiWF = nullptr; + fPullQ = -99; + fPullT = -99; } From 10d6d6a7eace384d90656bd6c6066a5d18a4f74b Mon Sep 17 00:00:00 2001 From: kmtsui Date: Thu, 1 Jun 2023 10:48:11 +0900 Subject: [PATCH 03/55] Add HYBRIDWCSIM compatibility --- app/utilities/WCRootData/include/WCRootData.h | 1 + app/utilities/WCRootData/src/WCRootData.cc | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/utilities/WCRootData/include/WCRootData.h b/app/utilities/WCRootData/include/WCRootData.h index ab7d8be..78d94b0 100644 --- a/app/utilities/WCRootData/include/WCRootData.h +++ b/app/utilities/WCRootData/include/WCRootData.h @@ -70,6 +70,7 @@ class WCRootData TTree *fWCSimDigiWFT; TClonesArray* fDigiWF; + TClonesArray* fDigiWF2; TTree *fWCSimDigiPulls; float fPullQ; diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index bb0ba49..c5424cd 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -187,6 +187,10 @@ void WCRootData::CreateTree(const char *filename, const vector &list) fWCSimDigiWFT = new TTree("wcsimDigiWFTree","Digitized waveform for each PMT"); fDigiWF = new TClonesArray("TH1F"); fWCSimDigiWFT->Branch("wcsimDigiWF",&fDigiWF); +#ifdef HYBRIDWCSIM + fDigiWF2 = new TClonesArray("TH1F"); + fWCSimDigiWFT->Branch("wcsimDigiWF2",&fDigiWF2); +#endif fWCSimDigiPulls = new TTree("WCSimDigiPulls","Time and charge pulls of digitized hits"); fWCSimDigiPulls->Branch("PullQ",&fPullQ); fWCSimDigiPulls->Branch("PullT",&fPullT); @@ -279,8 +283,13 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID WCSimRootEventHeader *eh = anEvent->GetHeader(); eh->SetDate( int(triggerTime) ); } - +#ifdef HYBRIDWCSIM + TClonesArray &fDigiWFarray; + if (!bool(iPMT)) fDigiWFarray = *fDigiWF; + else fDigiWFarray = *fDigiWF2; +#else TClonesArray &fDigiWFarray = *fDigiWF; +#endif for(hc->Begin(); !hc->IsEnd(); hc->Next()) { HitTube *aPH = &(*hc)(); @@ -309,6 +318,9 @@ void WCRootData::FillTree() } fWCSimDigiWFT->Fill(); fDigiWF->Clear(); +#ifdef HYBRIDWCSIM + fDigiWF2->Clear(); +#endif } From 0fc2a73cbe74e20960c960c3c253fd435c35fc88 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Thu, 1 Jun 2023 15:59:27 +0900 Subject: [PATCH 04/55] Setup parameter inputs --- .gitignore | 5 +++-- cpp/include/HitDigitizer.h | 4 ++++ cpp/src/HitDigitizer.cc | 26 ++++++++++++++++++++------ cpp/src/MDTManager.cc | 8 ++++++-- parameter/MDTParamenter_WCTE.txt | 11 +++++++++-- 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index d068aa0..d26ee22 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ # binary appWCTESingleEvent -# root file -*.root \ No newline at end of file +# output files +*.root +*.pdf diff --git a/cpp/include/HitDigitizer.h b/cpp/include/HitDigitizer.h index 24fa730..648cd3d 100644 --- a/cpp/include/HitDigitizer.h +++ b/cpp/include/HitDigitizer.h @@ -46,4 +46,8 @@ class HitDigitizer_mPMT : public HitDigitizer private: TH1F* hWF; + float fDt; + float fWaveformOffset; + float fADCToPE; + float fSigmaGuess; }; \ No newline at end of file diff --git a/cpp/src/HitDigitizer.cc b/cpp/src/HitDigitizer.cc index 0cb9137..86d8418 100644 --- a/cpp/src/HitDigitizer.cc +++ b/cpp/src/HitDigitizer.cc @@ -150,8 +150,17 @@ double HitDigitizer::DoTruncate(const double x, const double precision) HitDigitizer_mPMT::HitDigitizer_mPMT(int seed) : HitDigitizer(seed) { hWF = nullptr; - string fTxtFileWF; + fDt = 8; + fWaveformOffset = 95; + fADCToPE = 108; + fSigmaGuess = 6; + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue("SamplingInterval", fDt); + Conf->GetValue("WaveformOffset", fWaveformOffset); + Conf->GetValue("ADCToPE", fADCToPE); + Conf->GetValue("SigmaGuess", fSigmaGuess); + this->LoadWaveform(Conf->GetValue("WaveformFile")); } @@ -272,12 +281,12 @@ void HitDigitizer_mPMT::DigitizeTube(HitTube *aHT, PMTResponse *pr) TH1F HitDigitizer_mPMT::BuildWavetrain(const vector PEs, double waveform_window) { - double dt = 8; // interval, start, end of sampling + double dt = fDt; // interval, start, end of sampling double tmin = floor((PEs.front()->GetTime())/dt)*dt; double tmax = ceil((PEs.back()->GetTime()+waveform_window)/dt)*dt; TH1F hWT("","",(int)(tmax-tmin)/dt,tmin,tmax); - double waveform_offset = 95; + double waveform_offset = fWaveformOffset; for(long unsigned int iPE=0; iPE PEs, double wavefo } } + for (int i=1;i<=hWT.GetNbinsX();i++) + { + hWT.SetBinError(i,1); + } + return hWT; } void HitDigitizer_mPMT::FitWavetrain(TH1F hist, double& digiT, double& digiQ) { - double dt = 8; + double dt = fDt; int maxBin = hist.GetMaximumBin(); double digiT_guess = hist.GetBinCenter(maxBin); double digiQ_guess = hist.GetBinContent(maxBin); - double sigma_guess = 6; + double sigma_guess = fSigmaGuess; double range_min = hist.GetBinLowEdge(maxBin); double range_max = hist.GetBinLowEdge(maxBin+1); - double adc_to_pe = 108; + double adc_to_pe = fADCToPE; for (int i=maxBin-1;i>=1;i--) { if (hist.GetBinContent(i)>0) range_min = hist.GetBinLowEdge(i); diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index b21248d..9b0616c 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -4,8 +4,12 @@ MDTManager::MDTManager(int seed) { fRndm = new MTRandom( seed ); fTrigAlgo = new TriggerAlgo(); - //fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); - fDgtzr = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); + + Configuration *Conf = Configuration::GetInstance(); + int UsemPMTDigitizer = 0; + Conf->GetValue("UsemPMTDigitizer", UsemPMTDigitizer); + if (!UsemPMTDigitizer) fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); + else fDgtzr = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); fPMTResp.clear(); fDark.clear(); diff --git a/parameter/MDTParamenter_WCTE.txt b/parameter/MDTParamenter_WCTE.txt index 85b6fb9..e7d7e56 100644 --- a/parameter/MDTParamenter_WCTE.txt +++ b/parameter/MDTParamenter_WCTE.txt @@ -43,8 +43,15 @@ # Output setting < TimeOffset = 950. > -< FlagMultDigits = 1 > - +< FlagMultDigits = 0 > +# WCSIM digitizer SPE charge spectrum < SPECDFFile_PMT3inchR12199_02 = $MDTROOT/parameter/SPE_CDF_PMT3inchR12199_02.txt > + +# mPMT digitizer setting +< UsemPMTDigitizer = 1 > # use mPMT digitizer or not < WaveformFile = $MDTROOT/parameter/LC-gauss.txt > +< SamplingInterval = 8 > # ns +< WaveformOffset = 95 > # ns +< SigmaGuess = 6 > # ns, initial guess of pulse width +< ADCToPE = 108 > # empirical conversion from adc to pe \ No newline at end of file From 161e8df240a524546183edcc969d518f5275caf1 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Tue, 6 Jun 2023 10:46:32 +0900 Subject: [PATCH 05/55] Save more true info --- app/utilities/WCRootData/include/WCRootData.h | 2 ++ app/utilities/WCRootData/src/WCRootData.cc | 7 +++++++ cpp/include/HitTube.h | 5 +++++ cpp/src/HitDigitizer.cc | 1 + 4 files changed, 15 insertions(+) diff --git a/app/utilities/WCRootData/include/WCRootData.h b/app/utilities/WCRootData/include/WCRootData.h index 78d94b0..8c78b0d 100644 --- a/app/utilities/WCRootData/include/WCRootData.h +++ b/app/utilities/WCRootData/include/WCRootData.h @@ -75,6 +75,8 @@ class WCRootData TTree *fWCSimDigiPulls; float fPullQ; float fPullT; + float fTrueQ; + float fTrueT; private: void SetTubes(HitTubeCollection*, const int); diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index c5424cd..4c1eb23 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -25,6 +25,8 @@ WCRootData::WCRootData() fWCSimDigiPulls = 0; fPullQ = -99.; fPullT = -99.; + fTrueQ = -99.; + fTrueT = -99.; } WCRootData::~WCRootData() @@ -194,6 +196,8 @@ void WCRootData::CreateTree(const char *filename, const vector &list) fWCSimDigiPulls = new TTree("WCSimDigiPulls","Time and charge pulls of digitized hits"); fWCSimDigiPulls->Branch("PullQ",&fPullQ); fWCSimDigiPulls->Branch("PullT",&fPullT); + fWCSimDigiPulls->Branch("TrueQ",&fTrueQ); + fWCSimDigiPulls->Branch("TrueT",&fTrueT); } void WCRootData::AddDigiHits(MDTManager *mdt, int eventID, int iPMT) @@ -290,6 +294,7 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID #else TClonesArray &fDigiWFarray = *fDigiWF; #endif + for(hc->Begin(); !hc->IsEnd(); hc->Next()) { HitTube *aPH = &(*hc)(); @@ -299,6 +304,8 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID fPullQ = aPH->GetPullQ(); fPullT = aPH->GetPullT(); + fTrueQ = aPH->GetTrueQ(); + fTrueT = aPH->GetTrueT(); fWCSimDigiPulls->Fill(); aPH = NULL; diff --git a/cpp/include/HitTube.h b/cpp/include/HitTube.h index 6296ba2..2aefbdb 100644 --- a/cpp/include/HitTube.h +++ b/cpp/include/HitTube.h @@ -83,8 +83,11 @@ class HitTube return hDigiWF; } void SetDigiPulls(float pullT, float pullQ) { fPullT = pullT; fPullQ = pullQ;} + void SetTrueTQ(float trueT, float trueQ) { fTrueT = trueT; fTrueQ = trueQ;} float GetPullT() {return fPullT;} float GetPullQ() {return fPullQ;} + float GetTrueT() {return fTrueT;} + float GetTrueQ() {return fTrueQ;} private: int fNRawPE; @@ -101,4 +104,6 @@ class HitTube TH1F* hDigiWF; float fPullT; float fPullQ; + float fTrueT; + float fTrueQ; }; diff --git a/cpp/src/HitDigitizer.cc b/cpp/src/HitDigitizer.cc index 86d8418..c5d30fc 100644 --- a/cpp/src/HitDigitizer.cc +++ b/cpp/src/HitDigitizer.cc @@ -276,6 +276,7 @@ void HitDigitizer_mPMT::DigitizeTube(HitTube *aHT, PMTResponse *pr) aHT->AddDigiHit(digiT, digiQ, parent_composition); if (!aHT->GetDigiWF()) aHT->SetDigiWF(hWT); aHT->SetDigiPulls(digiT-digiPEs.front()->GetTime(),digiQ-digiPEs.size()); + aHT->SetTrueTQ(digiPEs.front()->GetTime(),digiPEs.size()); } } From 559e9b4aca2aa3fef3fc946eec65234816fed95b Mon Sep 17 00:00:00 2001 From: kmtsui Date: Mon, 19 Jun 2023 16:35:56 +0900 Subject: [PATCH 06/55] Add flag to save waveform --- app/utilities/WCRootData/include/WCRootData.h | 1 + app/utilities/WCRootData/src/WCRootData.cc | 18 ++++++++++++------ parameter/MDTParamenter_WCTE.txt | 3 ++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/utilities/WCRootData/include/WCRootData.h b/app/utilities/WCRootData/include/WCRootData.h index 8c78b0d..92561c8 100644 --- a/app/utilities/WCRootData/include/WCRootData.h +++ b/app/utilities/WCRootData/include/WCRootData.h @@ -71,6 +71,7 @@ class WCRootData TTree *fWCSimDigiWFT; TClonesArray* fDigiWF; TClonesArray* fDigiWF2; + bool fSaveWF; TTree *fWCSimDigiPulls; float fPullQ; diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index 4c1eb23..ca0a369 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -14,12 +14,15 @@ WCRootData::WCRootData() int mult_flag = 1; fHitTimeOffset = 0.; + int save_wf = 0; Configuration *Conf = Configuration::GetInstance(); Conf->GetValue("TimeOffset", fHitTimeOffset); Conf->GetValue("FlagMultDigits", mult_flag); + Conf->GetValue("SaveWaveform", save_wf); fMultDigiHits = bool(mult_flag); + fSaveWF = bool(save_wf); fWCSimDigiWFT = 0; fWCSimDigiPulls = 0; @@ -287,6 +290,7 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID WCSimRootEventHeader *eh = anEvent->GetHeader(); eh->SetDate( int(triggerTime) ); } + #ifdef HYBRIDWCSIM TClonesArray &fDigiWFarray; if (!bool(iPMT)) fDigiWFarray = *fDigiWF; @@ -298,10 +302,12 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID for(hc->Begin(); !hc->IsEnd(); hc->Next()) { HitTube *aPH = &(*hc)(); - if (aPH->GetDigiWF()) - new(fDigiWFarray[aPH->GetTubeID()-1]) TH1F(*(aPH->GetDigiWF())); - else new(fDigiWFarray[aPH->GetTubeID()-1]) TH1F(); - + if (fSaveWF) + { + if (aPH->GetDigiWF()) + new(fDigiWFarray[aPH->GetTubeID()-1]) TH1F(*(aPH->GetDigiWF())); + else new(fDigiWFarray[aPH->GetTubeID()-1]) TH1F(); + } fPullQ = aPH->GetPullQ(); fPullT = aPH->GetPullT(); fTrueQ = aPH->GetTrueQ(); @@ -323,7 +329,7 @@ void WCRootData::FillTree() { fSpEvt[i]->ReInitialize(); } - fWCSimDigiWFT->Fill(); + if (fSaveWF) fWCSimDigiWFT->Fill(); fDigiWF->Clear(); #ifdef HYBRIDWCSIM fDigiWF2->Clear(); @@ -434,7 +440,7 @@ void WCRootData::WriteTree() TFile *f = fWCSimT->GetCurrentFile(); f->cd(); fWCSimT->Write(); - fWCSimDigiWFT->Write(); + if (fSaveWF) fWCSimDigiWFT->Write(); fWCSimDigiPulls->Write(); f->Close(); } diff --git a/parameter/MDTParamenter_WCTE.txt b/parameter/MDTParamenter_WCTE.txt index e7d7e56..cbd7a25 100644 --- a/parameter/MDTParamenter_WCTE.txt +++ b/parameter/MDTParamenter_WCTE.txt @@ -54,4 +54,5 @@ < SamplingInterval = 8 > # ns < WaveformOffset = 95 > # ns < SigmaGuess = 6 > # ns, initial guess of pulse width -< ADCToPE = 108 > # empirical conversion from adc to pe \ No newline at end of file +< ADCToPE = 108 > # empirical conversion from adc to pe +< SaveWaveform = 0 > # Save the digitized waveform in output, will significantly increase time storage usage \ No newline at end of file From 6ed8d57eb13521da278e3a135c54222689e15e70 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Mon, 19 Jun 2023 16:42:12 +0900 Subject: [PATCH 07/55] Debug save true TQ --- cpp/src/HitDigitizer.cc | 1 + cpp/src/HitTube.cc | 2 ++ 2 files changed, 3 insertions(+) diff --git a/cpp/src/HitDigitizer.cc b/cpp/src/HitDigitizer.cc index c5d30fc..f79a659 100644 --- a/cpp/src/HitDigitizer.cc +++ b/cpp/src/HitDigitizer.cc @@ -251,6 +251,7 @@ void HitDigitizer_mPMT::DigitizeTube(HitTube *aHT, PMTResponse *pr) aHT->AddDigiHit(digiT, digiQ, parent_composition); if (!aHT->GetDigiWF()) aHT->SetDigiWF(hWT); aHT->SetDigiPulls(digiT-digiPEs.front()->GetTime(),digiQ-digiPEs.size()); + aHT->SetTrueTQ(digiPEs.front()->GetTime(),digiPEs.size()); } digiPEs.clear(); sumSPE = 0.; diff --git a/cpp/src/HitTube.cc b/cpp/src/HitTube.cc index 4eb819a..61ab6df 100644 --- a/cpp/src/HitTube.cc +++ b/cpp/src/HitTube.cc @@ -15,6 +15,8 @@ HitTube::HitTube(int id) hDigiWF = nullptr; fPullQ = -99; fPullT = -99; + fTrueT = -99; + fTrueQ = -99; } From e57694503f75a6178c6a0a5ecf95cf3e63fc17b6 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Tue, 20 Jun 2023 16:31:46 +0900 Subject: [PATCH 08/55] Make digitizer be dependent on PMT type --- cpp/include/MDTManager.h | 3 ++- cpp/src/MDTManager.cc | 32 ++++++++++++++++++++++++-------- parameter/MDTParamenter_WCTE.txt | 4 ++-- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/cpp/include/MDTManager.h b/cpp/include/MDTManager.h index 81ac243..d0d31d7 100644 --- a/cpp/include/MDTManager.h +++ b/cpp/include/MDTManager.h @@ -38,7 +38,8 @@ class MDTManager private: TriggerAlgo *fTrigAlgo; - HitDigitizer *fDgtzr; + //HitDigitizer *fDgtzr; + map fDgtzr; MTRandom *fRndm; map fTrigInfo; diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index 9b0616c..bc75711 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -5,12 +5,13 @@ MDTManager::MDTManager(int seed) fRndm = new MTRandom( seed ); fTrigAlgo = new TriggerAlgo(); - Configuration *Conf = Configuration::GetInstance(); - int UsemPMTDigitizer = 0; - Conf->GetValue("UsemPMTDigitizer", UsemPMTDigitizer); - if (!UsemPMTDigitizer) fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); - else fDgtzr = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); + // Configuration *Conf = Configuration::GetInstance(); + // int UsemPMTDigitizer = 0; + // Conf->GetValue("UsemPMTDigitizer", UsemPMTDigitizer); + // if (!UsemPMTDigitizer) fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); + // else fDgtzr = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); + fDgtzr.clear(); fPMTResp.clear(); fDark.clear(); fPHC.clear(); @@ -22,10 +23,18 @@ MDTManager::~MDTManager() if( fTrigAlgo ){ delete fTrigAlgo; fTrigAlgo = NULL; } if( fRndm ){ delete fRndm; fRndm = NULL; } + map::iterator iDgtzr; + for(iDgtzr=fDgtzr.begin(); iDgtzr!=fDgtzr.end(); iDgtzr++) + { + std::cout<<" Deleting" << iDgtzr->first <second; iDgtzr->second = NULL; + } + fDgtzr.clear(); + map::iterator iPMTResp; for(iPMTResp=fPMTResp.begin(); iPMTResp!=fPMTResp.end(); iPMTResp++) { - std::cout<<" Deleting" << iPMTResp->first <first <second; iPMTResp->second = NULL; } fPMTResp.clear(); @@ -64,7 +73,7 @@ void MDTManager::DoDigitize(const string &pmtname) { if( this->HasThisPMTType(pmtname) ) { - fDgtzr->Digitize(fPHC[pmtname], fPMTResp[pmtname]); + fDgtzr[pmtname]->Digitize(fPHC[pmtname], fPMTResp[pmtname]); //cout<<" # true hits: " << fPHC[pmtname]->GetTotalNumOfTrueHits() // <<" # digitized hits: " << fPHC[pmtname]->GetTotalNumOfDigiHits() // <HasThisPMTType(pmtname) ) { - fDark[pmtname]->AddAfterpulse(fPHC[pmtname], fDgtzr, fPMTResp[pmtname]); + fDark[pmtname]->AddAfterpulse(fPHC[pmtname], fDgtzr[pmtname], fPMTResp[pmtname]); } } @@ -113,6 +122,13 @@ void MDTManager::SetHitTubeCollection(HitTubeCollection *hc, const string &pmtna void MDTManager::RegisterPMTType(const string &pmtname, PMTResponse *pmtResp) { + Configuration *Conf = Configuration::GetInstance(); + int UsemPMTDigitizer = 0; + string s = "UsemPMTDigitizer_"+pmtname; + Conf->GetValue(s, UsemPMTDigitizer); + if (!UsemPMTDigitizer) fDgtzr[pmtname] = new HitDigitizer( fRndm->Integer(1000000) ); + else fDgtzr[pmtname] = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); + fTrigInfo[pmtname] = new TriggerInfo(); fPHC[pmtname] = new HitTubeCollection(); fDark[pmtname] = new PMTNoise(fRndm->Integer(1000000), pmtname); diff --git a/parameter/MDTParamenter_WCTE.txt b/parameter/MDTParamenter_WCTE.txt index cbd7a25..740403e 100644 --- a/parameter/MDTParamenter_WCTE.txt +++ b/parameter/MDTParamenter_WCTE.txt @@ -45,11 +45,11 @@ < TimeOffset = 950. > < FlagMultDigits = 0 > -# WCSIM digitizer SPE charge spectrum +# WCSIM (default) digitizer SPE charge spectrum < SPECDFFile_PMT3inchR12199_02 = $MDTROOT/parameter/SPE_CDF_PMT3inchR12199_02.txt > # mPMT digitizer setting -< UsemPMTDigitizer = 1 > # use mPMT digitizer or not +< UsemPMTDigitizer_PMT3inchR12199_02 = 1 > # use mPMT digitizer or not < WaveformFile = $MDTROOT/parameter/LC-gauss.txt > < SamplingInterval = 8 > # ns < WaveformOffset = 95 > # ns From 2ab4535634060cf340924e4a84d01b8f02cf4c49 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Tue, 20 Jun 2023 16:43:04 +0900 Subject: [PATCH 09/55] Use switch conditional for digitizer choice --- cpp/src/MDTManager.cc | 20 +++++++++++++++----- parameter/MDTParamenter_WCTE.txt | 4 +++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index bc75711..fa31fa4 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -123,11 +123,21 @@ void MDTManager::SetHitTubeCollection(HitTubeCollection *hc, const string &pmtna void MDTManager::RegisterPMTType(const string &pmtname, PMTResponse *pmtResp) { Configuration *Conf = Configuration::GetInstance(); - int UsemPMTDigitizer = 0; - string s = "UsemPMTDigitizer_"+pmtname; - Conf->GetValue(s, UsemPMTDigitizer); - if (!UsemPMTDigitizer) fDgtzr[pmtname] = new HitDigitizer( fRndm->Integer(1000000) ); - else fDgtzr[pmtname] = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); + int DigitizerType = 0; + string s = "DigitizerType_"+pmtname; + Conf->GetValue(s, DigitizerType); + switch (DigitizerType) + { + case 1: + fDgtzr[pmtname] = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); + cout << "Use mPMT digitizer for "<Integer(1000000) ); + cout << "Use default digitizer for "<Integer(1000000) ); + // else fDgtzr[pmtname] = new HitDigitizer_mPMT( fRndm->Integer(1000000) ); fTrigInfo[pmtname] = new TriggerInfo(); fPHC[pmtname] = new HitTubeCollection(); diff --git a/parameter/MDTParamenter_WCTE.txt b/parameter/MDTParamenter_WCTE.txt index 740403e..75f33fe 100644 --- a/parameter/MDTParamenter_WCTE.txt +++ b/parameter/MDTParamenter_WCTE.txt @@ -45,11 +45,13 @@ < TimeOffset = 950. > < FlagMultDigits = 0 > +# Choice of digitizer +< DigitizerType_PMT3inchR12199_02 = 1 > # 0 = default WCSim digitizer, 1 = mPMT digitizer + # WCSIM (default) digitizer SPE charge spectrum < SPECDFFile_PMT3inchR12199_02 = $MDTROOT/parameter/SPE_CDF_PMT3inchR12199_02.txt > # mPMT digitizer setting -< UsemPMTDigitizer_PMT3inchR12199_02 = 1 > # use mPMT digitizer or not < WaveformFile = $MDTROOT/parameter/LC-gauss.txt > < SamplingInterval = 8 > # ns < WaveformOffset = 95 > # ns From a457d5ed95ce2f7dea026797f5e594b2984646b0 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Fri, 7 Jul 2023 14:22:40 +0900 Subject: [PATCH 10/55] Add voltage resolution parameter --- cpp/include/HitDigitizer.h | 1 + cpp/src/HitDigitizer.cc | 9 +++++++-- parameter/MDTParamenter_WCTE.txt | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cpp/include/HitDigitizer.h b/cpp/include/HitDigitizer.h index 648cd3d..40a2807 100644 --- a/cpp/include/HitDigitizer.h +++ b/cpp/include/HitDigitizer.h @@ -47,6 +47,7 @@ class HitDigitizer_mPMT : public HitDigitizer private: TH1F* hWF; float fDt; + float fDv; float fWaveformOffset; float fADCToPE; float fSigmaGuess; diff --git a/cpp/src/HitDigitizer.cc b/cpp/src/HitDigitizer.cc index f79a659..a27357a 100644 --- a/cpp/src/HitDigitizer.cc +++ b/cpp/src/HitDigitizer.cc @@ -151,12 +151,14 @@ HitDigitizer_mPMT::HitDigitizer_mPMT(int seed) : HitDigitizer(seed) { hWF = nullptr; fDt = 8; + fDv = 1; fWaveformOffset = 95; fADCToPE = 108; fSigmaGuess = 6; Configuration *Conf = Configuration::GetInstance(); Conf->GetValue("SamplingInterval", fDt); + Conf->GetValue("SamplingResolution", fDv); Conf->GetValue("WaveformOffset", fWaveformOffset); Conf->GetValue("ADCToPE", fADCToPE); Conf->GetValue("SigmaGuess", fSigmaGuess); @@ -233,7 +235,7 @@ void HitDigitizer_mPMT::DigitizeTube(HitTube *aHT, PMTResponse *pr) sumSPE += pr->GetRawSPE(PEs[iPE], aHT); parent_composition.push_back( PEs[iPE]->GetParentId() ); digiPEs.push_back(PEs[iPE]); - intgr_end = PEs[iPE]->GetTime()+fIntegWindow; + //intgr_end = PEs[iPE]->GetTime()+fIntegWindow; } else { @@ -307,7 +309,10 @@ TH1F HitDigitizer_mPMT::BuildWavetrain(const vector PEs, double wavefo for (int i=1;i<=hWT.GetNbinsX();i++) { - hWT.SetBinError(i,1); + double val = (int)(hWT.GetBinContent(i)/fDv); + val *= fDv; + hWT.SetBinContent(i,val); + hWT.SetBinError(i,fDv); } return hWT; diff --git a/parameter/MDTParamenter_WCTE.txt b/parameter/MDTParamenter_WCTE.txt index 75f33fe..542265e 100644 --- a/parameter/MDTParamenter_WCTE.txt +++ b/parameter/MDTParamenter_WCTE.txt @@ -54,6 +54,7 @@ # mPMT digitizer setting < WaveformFile = $MDTROOT/parameter/LC-gauss.txt > < SamplingInterval = 8 > # ns +< SamplingResolution = 1.5 > #mV < WaveformOffset = 95 > # ns < SigmaGuess = 6 > # ns, initial guess of pulse width < ADCToPE = 108 > # empirical conversion from adc to pe From 5222160735837fbc0f8dd9455b0c9a8e43c13407 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Fri, 7 Jul 2023 14:23:42 +0900 Subject: [PATCH 11/55] Correct default value --- parameter/MDTParamenter_WCTE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parameter/MDTParamenter_WCTE.txt b/parameter/MDTParamenter_WCTE.txt index 542265e..9cbb36b 100644 --- a/parameter/MDTParamenter_WCTE.txt +++ b/parameter/MDTParamenter_WCTE.txt @@ -54,7 +54,7 @@ # mPMT digitizer setting < WaveformFile = $MDTROOT/parameter/LC-gauss.txt > < SamplingInterval = 8 > # ns -< SamplingResolution = 1.5 > #mV +< SamplingResolution = 1 > #mV < WaveformOffset = 95 > # ns < SigmaGuess = 6 > # ns, initial guess of pulse width < ADCToPE = 108 > # empirical conversion from adc to pe From bc9aa9b60c152bba2e7961f12f2b3f25cb3a43bd Mon Sep 17 00:00:00 2001 From: kmtsui Date: Thu, 3 Aug 2023 11:39:45 +0900 Subject: [PATCH 12/55] Interface to WCSim v1.11.0 --- README.md | 6 ++- app/application/Makefile | 2 +- app/utilities/WCRootData/Makefile | 2 +- app/utilities/WCRootData/src/WCRootData.cc | 59 ++-------------------- cpp/include/PMTResponse.h | 1 + cpp/src/Configuration.cc | 6 +++ cpp/src/TriggerAlgo.cc | 1 - envMDT.sh | 10 +++- run_test_mdt4wcte.sh | 2 +- 9 files changed, 26 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index b7557f0..3f7324f 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,16 @@ Simple runtime procedures. First set up your ROOT and WCSIM: source your_thisroot.sh export WCSIMDIR=your_WCSIM_installation ``` +If `libWCSimRoot.so` is not directly under `WCSIMDIR`, export to `WCSIMROOTDIR`. +``` +export WCSIMROOTDIR=your_libWCSimRoot.so_installation +``` Then set up the MDT environment. ``` source envMDT.sh cd $MDTROOT/cpp; make clean; make all cd $MDTROOT/app/utilities/WCRootData; make clean; make all -cd $MDTROOT/app/application; make appWCTESingleEvent +cd $MDTROOT/app/application; make clean; make appWCTESingleEvent cd $MDTROOT # edit variables properly in run_test_mdt4wcte.sh bash run_test_mdt4wcte.sh diff --git a/app/application/Makefile b/app/application/Makefile index b3cf7d5..d11a4fc 100644 --- a/app/application/Makefile +++ b/app/application/Makefile @@ -7,7 +7,7 @@ CXXFLAGS += -Wall -std=c++11 -g $(shell root-config --cflags)\ -I${WCRDROOT}/include LDFLAGS += $(shell root-config --ldflags) $(shell root-config --libs) -lTreePlayer\ - -L$(WCSIMDIR) -lWCSimRoot\ + -L$(WCSIMROOTDIR) -lWCSimRoot\ -L${MDTROOT}/cpp -lMDT\ -L${WCRDROOT} -lWCRData diff --git a/app/utilities/WCRootData/Makefile b/app/utilities/WCRootData/Makefile index 22251ad..3599726 100644 --- a/app/utilities/WCRootData/Makefile +++ b/app/utilities/WCRootData/Makefile @@ -6,7 +6,7 @@ ifeq ($(HYBRIDWCSIM),1) CXXFLAGS += -DHYBRIDWCSIM endif #LDFLAGS += -shared $(shell root-config --ldflags) $(shell root-config --libs) -lTreePlayer -lMinuit2 -L$(WCSIMDIR) -lWCSimRoot -L${MDTROOT}/cpp -lMDT -LDFLAGS += -shared $(shell root-config --ldflags) $(shell root-config --libs) -L$(WCSIMDIR) -lWCSimRoot -L${MDTROOT}/cpp -lMDT +LDFLAGS += -shared $(shell root-config --ldflags) $(shell root-config --libs) -L$(WCSIMROOTDIR) -lWCSimRoot -L${MDTROOT}/cpp -lMDT TARGET=libWCRData.so diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index 6683431..12f337e 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -61,8 +61,6 @@ void WCRootData::AddTrueHitsToMDT(HitTubeCollection *hc, PMTResponse *pr, float const WCSimRootTrigger *aEvt = fSpEvt[iPMT]->GetTrigger(0); const int nCkovHits = aEvt->GetNcherenkovhits(); //std::cout<<" nCkovHits: " << nCkovHits <GetCherenkovHitTimes(); for(int iHit=0; iHit &list) fSpEvt.push_back( new WCSimRootEvent() ); fSpEvt[0]->Initialize(); TTree::SetBranchStyle(branchStyle); - TBranch *branch = fWCSimT->Branch(bName, bAddress, &fSpEvt[0], bufferSize, 2); + fWCSimT->Branch(bName, bAddress, &fSpEvt[0], bufferSize, 2); } else { @@ -173,7 +171,7 @@ void WCRootData::CreateTree(const char *filename, const vector &list) fSpEvt[i] = new WCSimRootEvent(); fSpEvt[i]->Initialize(); TTree::SetBranchStyle(branchStyle); - TBranch *branch = fWCSimT->Branch(list[i].c_str(), bAddress, &fSpEvt[i], bufferSize, 2); + fWCSimT->Branch(list[i].c_str(), bAddress, &fSpEvt[i], bufferSize, 2); } } } @@ -205,11 +203,7 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID anEvent->SetMode(0); } -#ifdef HYBRIDWCSIM vector info(1, ti->GetNHits(iTrig)); -#else - vector info(1, ti->GetNHits(iTrig)); -#endif anEvent->SetTriggerInfo(trigType, info); const float triggerTime = ti->GetTriggerTime(iTrig); @@ -269,7 +263,6 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID void WCRootData::FillTree() { - int tmp = (int)fSpEvt.size(); TFile *f = fWCSimT->GetCurrentFile(); f->cd(); fWCSimT->Fill(); @@ -295,12 +288,9 @@ void WCRootData::AddTracks(const WCSimRootTrigger *aEvtIn, float offset_time, in Int_t stopvol = aTrack->GetStopvol(); Int_t parenttype = aTrack->GetParenttype(); Int_t id = aTrack->GetId(); -#ifdef HYBRIDWCSIM Int_t idPrnt = aTrack->GetParentId(); -#endif -#ifdef HYBRIDWCSIM Double_t dir[3]; Double_t pdir[3]; Double_t stop[3]; @@ -309,16 +299,6 @@ void WCRootData::AddTracks(const WCSimRootTrigger *aEvtIn, float offset_time, in Double_t p = aTrack->GetP(); Double_t E = aTrack->GetE(); Double_t time = aTrack->GetTime() + offset_time; -#else - Float_t dir[3]; - Float_t pdir[3]; - Float_t stop[3]; - Float_t start[3]; - Float_t m = aTrack->GetM(); - Float_t p = aTrack->GetP(); - Float_t E = aTrack->GetE(); - Float_t time = aTrack->GetTime() + offset_time; -#endif for(int j=0; j<3; j++) { dir[j] = aTrack->GetDir(j); @@ -327,7 +307,6 @@ void WCRootData::AddTracks(const WCSimRootTrigger *aEvtIn, float offset_time, in start[j] = aTrack->GetStart(j); } -#ifdef HYBRIDWCSIM aEvtOut->AddTrack(ipnu, flag, m, @@ -343,38 +322,6 @@ void WCRootData::AddTracks(const WCSimRootTrigger *aEvtIn, float offset_time, in time, id, idPrnt); -#else - aEvtOut->AddTrack(ipnu, - flag, - m, - p, - E, - startvol, - stopvol, - dir, - pdir, - stop, - start, - parenttype, - time, - id); -#endif - - WCSimRootTrack *AddTrack(Int_t ipnu, - Int_t flag, - Float_t m, - Float_t p, - Float_t E, - Int_t startvol, - Int_t stopvol, - Float_t dir[3], - Float_t pdir[3], - Float_t stop[3], - Float_t start[3], - Int_t parenttype, - Float_t time, - Int_t id); - } } @@ -405,7 +352,7 @@ void WCRootData::CopyTree(const char *filename, // Copy all the entries if( savelist.size()==0 ) { - if( treename!="Settings" ) + if( strcmp(treename,"Settings")==0 ) { TTree *tin = (TTree*)fin->Get(treename); diff --git a/cpp/include/PMTResponse.h b/cpp/include/PMTResponse.h index 8a25388..b9680ee 100644 --- a/cpp/include/PMTResponse.h +++ b/cpp/include/PMTResponse.h @@ -14,6 +14,7 @@ using std::string; class PMTResponse { public: + virtual ~PMTResponse() {}; virtual double GetRawSPE(const TrueHit* th=NULL, const HitTube* ht=NULL) = 0; virtual float HitTimeSmearing(float) = 0; virtual void Initialize(int, const string &s="") = 0; diff --git a/cpp/src/Configuration.cc b/cpp/src/Configuration.cc index f5a1d24..e999ba4 100644 --- a/cpp/src/Configuration.cc +++ b/cpp/src/Configuration.cc @@ -38,18 +38,24 @@ template <> int Configuration::GetValue(string name) { if( this->IsAvailable(name) ) return fMpValue[name].i; + + return -999.; } template <> float Configuration::GetValue(string name) { if( this->IsAvailable(name) ) return fMpValue[name].f; + + return -999.; } template <> string Configuration::GetValue(string name) { if( this->IsAvailable(name) ) return fMpValue[name].s; + + return ""; } template <> void Configuration::GetValue(string name, int &t) diff --git a/cpp/src/TriggerAlgo.cc b/cpp/src/TriggerAlgo.cc index 9746135..c649089 100644 --- a/cpp/src/TriggerAlgo.cc +++ b/cpp/src/TriggerAlgo.cc @@ -49,7 +49,6 @@ void TriggerAlgo::NDigits(HitTubeCollection *hc, TriggerInfo* ti) } std::sort(times.begin(), times.end()); - float tFirstHit = times[0]; float tLastHit = times[nTotalDigiHits-1]; const double stepSize = fNDigitsStepSize; // in ns diff --git a/envMDT.sh b/envMDT.sh index f7e6331..00ee83a 100644 --- a/envMDT.sh +++ b/envMDT.sh @@ -27,7 +27,7 @@ if [ -n "${MDTROOT}" ] ; then drop_from_path "$LD_LIBRARY_PATH" "${old_mdtroot}/cpp" LD_LIBRARY_PATH=$newpath - drop_from_path "$LD_LIBRARY_PATH" "${WCSIMDIR}" + drop_from_path "$LD_LIBRARY_PATH" "${WCSIMROOTDIR}" LD_LIBRARY_PATH=$newpath drop_from_path "$LD_LIBRARY_PATH" "${WCRDROOT}" @@ -64,7 +64,13 @@ if [[ -z "${WCSIMDIR}" ]]; then return else echo "Using WCSIM installed in $WCSIMDIR" - export LD_LIBRARY_PATH=${WCSIMDIR}:$LD_LIBRARY_PATH + #export LD_LIBRARY_PATH=${WCSIMDIR}:$LD_LIBRARY_PATH + + if [[ -z "${WCSIMROOTDIR}" ]]; then + WCSIMROOTDIR=$WCSIMDIR + fi + echo "Using libWCSimRoot.so installed in $WCSIMROOTDIR" + export LD_LIBRARY_PATH=${WCSIMROOTDIR}:$LD_LIBRARY_PATH fi #--- MDT's utility diff --git a/run_test_mdt4wcte.sh b/run_test_mdt4wcte.sh index ea3f767..5dbf357 100644 --- a/run_test_mdt4wcte.sh +++ b/run_test_mdt4wcte.sh @@ -3,7 +3,7 @@ EXE=$MDTROOT/app/application/appWCTESingleEvent -WCSIM_FILE=/disk01/usr5/kmtsui/WCSim_output/wcsim_photocathode_spline_3.1_1.3_20.0_all.root +WCSIM_FILE=/disk01/usr5/kmtsui/hyperk_repo/WCSim/build/install/wcsim_output.root CONFIG_FILE=$MDTROOT/parameter/MDTParamenter_WCTE.txt OUT_FILE=out_appWCTESingleEvent.root SEED=65457869 From d01e76f097860ebc12d1bdec9dfab01b54b01c15 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Thu, 3 Aug 2023 16:25:24 +0900 Subject: [PATCH 13/55] Add OD support --- app/utilities/WCRootData/include/WCRootData.h | 1 + app/utilities/WCRootData/src/WCRootData.cc | 37 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/app/utilities/WCRootData/include/WCRootData.h b/app/utilities/WCRootData/include/WCRootData.h index 6db8271..2f6b174 100644 --- a/app/utilities/WCRootData/include/WCRootData.h +++ b/app/utilities/WCRootData/include/WCRootData.h @@ -61,6 +61,7 @@ class WCRootData TChain *fWCSimC; TTree *fWCSimT; vector fSpEvt; + vector isOD; WCSimRootGeom *fWCGeom; Float_t fDetCentreY; diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index 12f337e..167f0a9 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -10,6 +10,7 @@ WCRootData::WCRootData() fWCSimC = 0; fWCSimT = 0; fSpEvt.clear(); + isOD.clear(); fOutFileName = ""; int mult_flag = 1; @@ -29,6 +30,8 @@ WCRootData::~WCRootData() if( fWCSimC ){ delete fWCSimC; fWCSimC = 0; } fSpEvt.clear(); fSpEvt.shrink_to_fit(); + isOD.clear(); + isOD.shrink_to_fit(); } @@ -81,11 +84,11 @@ void WCRootData::AddTrueHitsToMDT(HitTubeCollection *hc, PMTResponse *pr, float if( aHitTime->GetParentID()<0 ){ continue; } TrueHit *th = new TrueHit(truetime, aHitTime->GetParentID()); -#ifdef HYBRIDWCSIM + for(int k=0; k<3; k++){ th->SetPosition(k, aHitTime->GetPhotonEndPos(k)); } for(int k=0; k<3; k++){ th->SetDirection(k, aHitTime->GetPhotonEndDir(k)); } for(int k=0; k<3; k++){ th->SetStartDirection(k, aHitTime->GetPhotonStartDir(k)); } -#endif + th->SetStartTime(aHitTime->GetPhotonStartTime()); for(int k=0; k<3; k++){ th->SetStartPosition(k, aHitTime->GetPhotonStartPos(k)); } if( !pr->ApplyDE(th) ){ continue; } @@ -110,15 +113,19 @@ void WCRootData::ReadFile(const char *filename, const vector &list) if( list.size()==0 ) // default { fSpEvt.push_back( 0 ); + isOD.push_back(false); fWCSimC->SetBranchAddress("wcsimrootevent", &fSpEvt[0]); } else { fSpEvt.clear(); fSpEvt = vector(list.size(),0); + isOD.clear(); + isOD = vector(list.size(),false); for(unsigned int i=0; iSetBranchAddress(list[i].c_str(), &fSpEvt[i]); + if ( list[i].find("OD")!=std::string::npos ) isOD[i] = true; } } fWCSimC->SetAutoDelete(); @@ -129,6 +136,8 @@ void WCRootData::CloseFile() delete fWCSimC; fWCSimC = 0; fSpEvt.clear(); fSpEvt.shrink_to_fit(); + isOD.clear(); + isOD.shrink_to_fit(); } int WCRootData::GetEntries() @@ -165,6 +174,8 @@ void WCRootData::CreateTree(const char *filename, const vector &list) { fSpEvt.clear(); fSpEvt = vector(list.size(), 0); + isOD.clear(); + isOD = vector(list.size(),false); for(unsigned int i=0; i &list) fSpEvt[i]->Initialize(); TTree::SetBranchStyle(branchStyle); fWCSimT->Branch(list[i].c_str(), bAddress, &fSpEvt[i], bufferSize, 2); + if ( list[i].find("OD")!=std::string::npos ) isOD[i] = true; } } } @@ -352,7 +364,7 @@ void WCRootData::CopyTree(const char *filename, // Copy all the entries if( savelist.size()==0 ) { - if( strcmp(treename,"Settings")==0 ) + if( strcmp(treename,"Settings")!=0 ) { TTree *tin = (TTree*)fin->Get(treename); @@ -433,11 +445,10 @@ void WCRootData::CopyTree(const char *filename, void WCRootData::SetTubes(HitTubeCollection *hc, const int iPMT) { -#ifdef HYBRIDWCSIM - const int nTubes = fWCGeom->GetWCNumPMT(bool(iPMT)); + const int nTubes = !isOD.at(iPMT) ? fWCGeom->GetWCNumPMT(bool(iPMT)) : fWCGeom->GetODWCNumPMT() ; for(int i=0; iGetPMTPtr(i, bool(iPMT)); + const WCSimRootPMT *tube = !isOD.at(iPMT) ? fWCGeom->GetPMTPtr(i, bool(iPMT)) : fWCGeom->GetODPMTPtr(i) ; const int tubeID = tube->GetTubeNo(); hc->AddHitTube(tubeID); @@ -447,18 +458,4 @@ void WCRootData::SetTubes(HitTubeCollection *hc, const int iPMT) (&(*hc)[tubeID])->SetOrientation(j, tube->GetOrientation(j)); } } -#else - const int nTubes = fWCGeom->GetWCNumPMT(); - for(int i=0; iGetPMT(i); - const int tubeID = tube.GetTubeNo(); - hc->AddHitTube(tubeID); - for(int j=0; j<3; j++) - { - (&(*hc)[tubeID])->SetPosition(j, tube.GetPosition(j)); - (&(*hc)[tubeID])->SetOrientation(j, tube.GetOrientation(j)); - } - } -#endif } From bf5af5320d9ad5d385651e955fbad13db10d7a7a Mon Sep 17 00:00:00 2001 From: kmtsui Date: Thu, 3 Aug 2023 17:28:52 +0900 Subject: [PATCH 14/55] Avoid double-registering PMT type in MDTManager --- cpp/src/MDTManager.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index 708f04f..c41cddc 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -108,13 +108,16 @@ void MDTManager::SetHitTubeCollection(HitTubeCollection *hc, const string &pmtna void MDTManager::RegisterPMTType(const string &pmtname, PMTResponse *pmtResp) { - fTrigInfo[pmtname] = new TriggerInfo(); - fPHC[pmtname] = new HitTubeCollection(); - fDark[pmtname] = new PMTNoise(fRndm->Integer(1000000), pmtname); + if( fPHC.count(pmtname)==0 ) + { + fTrigInfo[pmtname] = new TriggerInfo(); + fPHC[pmtname] = new HitTubeCollection(); + fDark[pmtname] = new PMTNoise(fRndm->Integer(1000000), pmtname); - if( pmtResp==0 ){ fPMTResp[pmtname] = new GenericPMTResponse(); } - else{ fPMTResp[pmtname] = pmtResp; } - fPMTResp[pmtname]->Initialize(fRndm->Integer(10000000), pmtname); + if( pmtResp==0 ){ fPMTResp[pmtname] = new GenericPMTResponse(); } + else{ fPMTResp[pmtname] = pmtResp; } + fPMTResp[pmtname]->Initialize(fRndm->Integer(10000000), pmtname); + } } bool MDTManager::HasThisPMTType(const string &pmtname) From b55e3882af743ba2aabe9c9ff716facd0084cd90 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Fri, 4 Aug 2023 13:39:11 +0900 Subject: [PATCH 15/55] Get noise NPMTs at runtime No need to setup in config --- cpp/src/PMTNoise.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cpp/src/PMTNoise.cc b/cpp/src/PMTNoise.cc index b5f135a..172cd51 100644 --- a/cpp/src/PMTNoise.cc +++ b/cpp/src/PMTNoise.cc @@ -145,6 +145,11 @@ int PMTNoise::GetNumberOfGeneratedDarkHits() const void PMTNoise::AddPhotoElectrons(HitTubeCollection* hc) { + // Get correct PMT numbers each time + fNPMTs = hc->GetHitTubeIDList().size(); + fMinTubeID = 0; + fMaxTubeID = fNPMTs-1; + vector< pair > range; if( fDarkMode==1 ) { @@ -218,10 +223,12 @@ void PMTNoise::FindRanges(HitTubeCollection *hc, vector> &r void PMTNoise::Add(HitTubeCollection *hc, double tWinLow, double tWinUp) { this->GenerateDarkNoise(tWinLow, tWinUp, true, false); + // Get correct tubeID matching + const vector& hitTubeIDList = hc->GetHitTubeIDList(); const int nDarkHits = this->GetNumberOfGeneratedDarkHits(); for(int k=0; kGetNoiseTube(k); + int tubeID = hitTubeIDList.at(this->GetNoiseTube(k)); float time = this->GetNoiseTime(k); hc->AddTrueHit(tubeID, time, -1); } From 3f91ec1cec37d845c03303e405d265319a0d480d Mon Sep 17 00:00:00 2001 From: kmtsui Date: Fri, 4 Aug 2023 16:22:44 +0900 Subject: [PATCH 16/55] Coincide TriggerType with WCSimEnumerations --- cpp/include/TriggerInfo.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cpp/include/TriggerInfo.h b/cpp/include/TriggerInfo.h index 7a273fc..7c410ef 100644 --- a/cpp/include/TriggerInfo.h +++ b/cpp/include/TriggerInfo.h @@ -14,7 +14,11 @@ using std::cout; using std::endl; using std::vector; -enum class TriggerType : int { eNDigits=0, +enum class TriggerType : int { eUndefined = -1, + eNDigits, + eNDigitsTest, + eTestVertices, + eNoTrig, eFailure}; class TriggerInfo From b13e32185e35232d95fadfd84b868b377f99bc60 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Fri, 4 Aug 2023 16:26:46 +0900 Subject: [PATCH 17/55] Add IWCD app --- .gitignore | 1 + README.md | 4 +- app/application/Makefile | 6 ++ app/application/appIWCDSingleEvent.cc | 121 ++++++++++++++++++++++++++ parameter/MDTParamenter_IWCD.txt | 57 ++++++++++++ run_test_mdt4iwcd.sh | 33 +++++++ 6 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 app/application/appIWCDSingleEvent.cc create mode 100644 parameter/MDTParamenter_IWCD.txt create mode 100644 run_test_mdt4iwcd.sh diff --git a/.gitignore b/.gitignore index d068aa0..f554c4b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ # binary appWCTESingleEvent +appIWCDSingleEvent # root file *.root \ No newline at end of file diff --git a/README.md b/README.md index 3f7324f..6f5829f 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,8 @@ Then set up the MDT environment. source envMDT.sh cd $MDTROOT/cpp; make clean; make all cd $MDTROOT/app/utilities/WCRootData; make clean; make all -cd $MDTROOT/app/application; make clean; make appWCTESingleEvent +cd $MDTROOT/app/application; make clean; make appIWCDSingleEvent cd $MDTROOT # edit variables properly in run_test_mdt4wcte.sh -bash run_test_mdt4wcte.sh +bash run_test_mdt4iwcd.sh ``` diff --git a/app/application/Makefile b/app/application/Makefile index d11a4fc..6b65f06 100644 --- a/app/application/Makefile +++ b/app/application/Makefile @@ -18,9 +18,15 @@ appWCTESingleEvent: appWCTESingleEvent.o PMTResponse3inchR12199_02.o $(LD) $^ $(LDFLAGS) -o $@ @echo "$@ done" +appIWCDSingleEvent: appIWCDSingleEvent.o PMTResponse3inchR12199_02.o + $(RM) $@ + $(LD) $^ $(LDFLAGS) -o $@ + @echo "$@ done" %o::%cc $(CXX) $(CXXFLAGS) -c $? -o $@ clean: $(RM) *.o + $(RM) -f appWCTESingleEvent + $(RM) -f appIWCDSingleEvent diff --git a/app/application/appIWCDSingleEvent.cc b/app/application/appIWCDSingleEvent.cc new file mode 100644 index 0000000..4cfa653 --- /dev/null +++ b/app/application/appIWCDSingleEvent.cc @@ -0,0 +1,121 @@ +// This is a MDT application for IWCD single event +// This takes true hits in the input file that is an output of WCSim +// and digitize those hits with the same method as used in WCSim (i.e. /DAQ/Digitizer SKI) +// Optionally, dark hits can be added to the true hits before the digitization is done. +// In addition, the same triggering algorithm as implemeted in WCSim (i.e. /DAQ/Trigger NDigits) +// The output of this code is a ROOT file which has the same format of the input file +// The digitized hits in the output file should be consistent with the ones in the input file +// wihtin a statistical fluctuation (, provided that the impelementation in MDT is exactly the same as in WCSim) + +#include +#include +#include + +#include "MDTManager.h" +#include "WCRootData.h" + +// PMT type used for 3-inch PMTs of IWCD/WCTE +#include "PMTResponse3inchR12199_02.h" + +using std::cout; +using std::endl; +using std::string; +using std::vector; + +int fNEvtToProc = -1; +int fSeed = 67592; +string fParFileName = ""; +string fInFileName = ""; +string fOutFileName = ""; +bool fUseOD = false; + +bool ParseCmdArguments(int, char**); + +int main(int argc, char **argv) +{ + ParseCmdArguments(argc, argv); + + Configuration *Conf = Configuration::GetInstance(); + Conf->ReadParameter(fParFileName); + Conf->PrintParameters(); + Conf = 0; + + // IWCD PMT type for ID and OD + int NPMTType = !fUseOD ? 1 : 2 ; + vector fPMTType(NPMTType); + fPMTType[0] = "PMT3inchR12199_02"; + if (fUseOD) fPMTType[1] = "PMT3inchR12199_02_OD"; + + MDTManager *MDT = new MDTManager(fSeed); + MDT->RegisterPMTType(fPMTType[0], new PMTResponse3inchR12199_02()); + if (fUseOD) MDT->RegisterPMTType(fPMTType[1], new PMTResponse3inchR12199_02()); + + vector listWCRootEvt(NPMTType); + listWCRootEvt[0] = "wcsimrootevent"; + if (fUseOD) listWCRootEvt[1] = "wcsimrootevent_OD"; + + // WCRootData is an interface class between MDT and WCSim root file + WCRootData *inData = new WCRootData(); + WCRootData *outData = new WCRootData(); + + // Read input WCSim file + inData->ReadFile(fInFileName.c_str(), listWCRootEvt); + + // Create TTrees to be saved in the output file + outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); + + int nEntries = inData->GetEntries(); + const float toffset = 0.; // for IWCD pile-up event generation -> just ignore + + if (fNEvtToProc>0 && fNEvtToProcGetEntry(iEntry); + + outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); + for(int j=0; jAddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), MDT->GetPMTResponse(fPMTType[j]), toffset, j); + MDT->DoAddDark(fPMTType[j]); + MDT->DoDigitize(fPMTType[j]); + MDT->DoTrigger(fPMTType[j]); + + TriggerInfo *ti = MDT->GetTriggerInfo(fPMTType[j]); + outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); + } + outData->FillTree(); + + MDT->DoInitialize(); + } + outData->WriteTree(); + inData->CloseFile(); +} + + +bool ParseCmdArguments(int argc, char **argv) +{ + cout<<" Parsing command line arguments..... " < +< NDigitsStepSize = 5 > +< NDigitsPostTriggerWindow = +950. > +< NDigitsPreTriggerWindow = -400. > +< FailurePostTriggerWindow = +950. > # seems to be +950 by default //+100000. +< FailurePreTriggerWindow = -400. > +< FailureTime = 100. > +< NDigitsWindow = 200. > + +# Dark noise setting +< NumOfTubes = 2014 > +< MinTubeID = 1 > +< MaxTubeID = 2014 > +< DarkAddMode = 1 > +< DarkRate = 0.0 > // kHz +< DarkM0WindowLow = 0. > // ns +< DarkM0WindowUp = 100000. > // ns +< DarkM1Window = 4000. > // ns +< NumOfTubes_PMT3inchR12199_02 = 2014 > +< MinTubeID_PMT3inchR12199_02 = 1 > +< MaxTubeID_PMT3inchR12199_02 = 2014 > +< DarkRate_PMT3inchR12199_02 = 0.0 > +< NumOfTubes_PMT3inchR12199_02_OD = 2014 > +< MinTubeID_PMT3inchR12199_02_OD = 1 > +< MaxTubeID_PMT3inchR12199_02_OD = 2014 > +< DarkRate_PMT3inchR12199_02_OD = 0.0 > + +# 3" PMT setting +< TimingResConstant = 1.890 > # TTS(FWHM) = 1ns at 1 charge +< TimingResMinimum = 0.58 > +< ScalFactorTTS = 1 > +< TimingResConstant_PMT3inchR12199_02 = 1.890 > # TTS(FWHM) = 1ns at 1 charge +< TimingResMinimum_PMT3inchR12199_02 = 0.58 > +< ScalFactorTTS_PMT3inchR12199_02 = 1 > +< TimingResConstant_PMT3inchR12199_02_OD = 1.890 > # TTS(FWHM) = 1ns at 1 charge +< TimingResMinimum_PMT3inchR12199_02_OD = 0.58 > +< ScalFactorTTS_PMT3inchR12199_02_OD = 1 > + +# Digitizer setting +< DigiHitIntegrationWindow = 200 > // ns +< PrecisionTiming = 0.1 > // ns +< PrecisionCharge = 0. > +< ApplyDAQEfficiency = 1 > + +# After pulse setting +< APDoAdd = 0 > + +# Output setting +< TimeOffset = 950. > +< FlagMultDigits = 0 > + + +< SPECDFFile_PMT3inchR12199_02 = $MDTROOT/parameter/SPE_CDF_PMT3inchR12199_02.txt > +< SPECDFFile_PMT3inchR12199_02_OD = $MDTROOT/parameter/SPE_CDF_PMT3inchR12199_02.txt > diff --git a/run_test_mdt4iwcd.sh b/run_test_mdt4iwcd.sh new file mode 100644 index 0000000..ae3e70c --- /dev/null +++ b/run_test_mdt4iwcd.sh @@ -0,0 +1,33 @@ +#!/bin/bash + + +EXE=$MDTROOT/app/application/appIWCDSingleEvent + +WCSIM_FILE=/disk01/usr5/kmtsui/hyperk_repo/WCSim/build/install/wcsim_output.root +CONFIG_FILE=$MDTROOT/parameter/MDTParamenter_IWCD.txt +OUT_FILE=out_appIWCDSingleEvent.root +SEED=65457869 + +args=( + # input file + -i $WCSIM_FILE + # config file + -p $CONFIG_FILE + # output file + -o $OUT_FILE + # RNG seed + -s $SEED + # use OD + -od + # number of events to run, -1 means all + -n -1 +) + +# $EXE -i $WCSIM_FILE\ +# -p $CONFIG_FILE\ +# -o $OUT_FILE\ +# -s $SEED\ +# -d \ +# -n -1 # to run all events + +$EXE "${args[@]}" \ No newline at end of file From 091ae83b217f43fa26373b7a733159dcd3bbc183 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Sat, 5 Aug 2023 00:41:29 +0900 Subject: [PATCH 18/55] Debug find trigger loop --- cpp/src/TriggerAlgo.cc | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/cpp/src/TriggerAlgo.cc b/cpp/src/TriggerAlgo.cc index c649089..5fcd3e8 100644 --- a/cpp/src/TriggerAlgo.cc +++ b/cpp/src/TriggerAlgo.cc @@ -52,13 +52,17 @@ void TriggerAlgo::NDigits(HitTubeCollection *hc, TriggerInfo* ti) float tLastHit = times[nTotalDigiHits-1]; const double stepSize = fNDigitsStepSize; // in ns - const double tWindowMax = std::max(0.f, tLastHit - fNDigitsWindow); // in ns + //const double tWindowMax = std::max(0.f, tLastHit - fNDigitsWindow); // in ns + const double tWindowMax = tLastHit - fNDigitsWindow + stepSize; double tWindowUp = 0.; - double tWindowLow = 0.; + //double tWindowLow = 0.; + double tWindowLow = times[0]; + if (tWindowLow>0) tWindowLow = ((int)(tWindowLow/stepSize))*stepSize; + else tWindowLow = ((int)(tWindowLow/stepSize)-1)*stepSize; // - Slide the time window with a width of "fNDigitsWindow" - // from "tWindowLow" (assumed to be 0 initially) to "tWindowMax" + // from "tWindowLow" to "tWindowMax" // with a step size of "stepSize" // // - For each step, all the digitized hits falling the corresponding window @@ -70,6 +74,7 @@ void TriggerAlgo::NDigits(HitTubeCollection *hc, TriggerInfo* ti) { vector Times; Times.clear(); + double next_hit_time = tWindowMax; for(iHit=0; iHittWindowLow && tfNDigitsThreshold ) { trigTime = Times[fNDigitsThreshold]; - trigTime -= (int)trigTime%5; + if (trigTime>0) trigTime = ((int)(trigTime/stepSize))*stepSize; + else trigTime = ((int)(trigTime/stepSize)-1)*stepSize; float trigTimeLow = trigTime + fPreTriggerWindow[TriggerType::eNDigits]; float trigTimeUp = trigTime + fPostTriggerWindow[TriggerType::eNDigits]; @@ -118,6 +125,12 @@ void TriggerAlgo::NDigits(HitTubeCollection *hc, TriggerInfo* ti) else { tWindowLow += stepSize; + if (tWindowLow0) tWindowLow = ((int)(tWindowLow/stepSize))*stepSize; + else tWindowLow = ((int)(tWindowLow/stepSize)-1)*stepSize; + } } tWindowUp = tWindowLow + fNDigitsWindow; } From 50acd11b6d61a78eb838c5c4284f7d00e4480974 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Mon, 7 Aug 2023 13:02:07 +0900 Subject: [PATCH 19/55] Add NoTrigger algorithm --- app/utilities/WCRootData/src/WCRootData.cc | 10 +++- cpp/include/PMTNoise.h | 2 +- cpp/include/TriggerAlgo.h | 5 ++ cpp/src/MDTManager.cc | 2 +- cpp/src/TriggerAlgo.cc | 57 +++++++++++++++++++++- parameter/MDTParamenter_IWCD.txt | 1 + 6 files changed, 73 insertions(+), 4 deletions(-) diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index 167f0a9..1ce82be 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -202,10 +202,16 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID for(int iTrig=0; iTrigGetType(iTrig)==(int)TriggerType::eFailure ) { trigType = kTriggerFailure; } + else if ( ti->GetType(iTrig)==(int)TriggerType::eNoTrig ) + { + trigType = kTriggerNoTrig; + hitTimeOffset = 0; + } if( iTrig>=1 ) { @@ -216,6 +222,8 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID } vector info(1, ti->GetNHits(iTrig)); + info.push_back(hitTimeOffset); + info.push_back(ti->GetTriggerTime(iTrig)); anEvent->SetTriggerInfo(trigType, info); const float triggerTime = ti->GetTriggerTime(iTrig); @@ -249,7 +257,7 @@ void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID if( doFill ) { vector true_pe_comp = aPH->GetParentCompositionDigi(i); - t = t + fHitTimeOffset - triggerTime; + t = t + hitTimeOffset - triggerTime; float q = aPH->GetChargeDigi(i); anEvent->AddCherenkovDigiHit(q, t, diff --git a/cpp/include/PMTNoise.h b/cpp/include/PMTNoise.h index 72836ac..559902d 100644 --- a/cpp/include/PMTNoise.h +++ b/cpp/include/PMTNoise.h @@ -55,10 +55,10 @@ class PMTNoise int fMaxTubeID; float fWinLow; float fWinUp; + float fWindow; float fDarkRate; float fAveNoise; float fConvRate; - float fWindow; int fDarkMode; int fNnoise; diff --git a/cpp/include/TriggerAlgo.h b/cpp/include/TriggerAlgo.h index fcf4045..b600277 100644 --- a/cpp/include/TriggerAlgo.h +++ b/cpp/include/TriggerAlgo.h @@ -20,7 +20,9 @@ class TriggerAlgo TriggerAlgo(); virtual ~TriggerAlgo(){}; + void DoTrigger(HitTubeCollection*, TriggerInfo*); void NDigits(HitTubeCollection*, TriggerInfo*); + void NoTrig(HitTubeCollection*, TriggerInfo*); float GetTriggerTimeForFailure() const { return fTriggerTimeForFailure; } private: @@ -31,4 +33,7 @@ class TriggerAlgo float fNDigitsWindow; float fNDigitsStepSize; int fNDigitsThreshold; + TriggerType fTriggerType; + + static const double fLongTime; ///< An arbitrary long time to use in loops (ns) }; diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index c41cddc..e2b912c 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -70,7 +70,7 @@ void MDTManager::DoTrigger(const string &pmtname) { if( this->HasThisPMTType(pmtname) ) { - fTrigAlgo->NDigits(fPHC[pmtname], fTrigInfo[pmtname]); + fTrigAlgo->DoTrigger(fPHC[pmtname], fTrigInfo[pmtname]); } } diff --git a/cpp/src/TriggerAlgo.cc b/cpp/src/TriggerAlgo.cc index 5fcd3e8..cd05639 100644 --- a/cpp/src/TriggerAlgo.cc +++ b/cpp/src/TriggerAlgo.cc @@ -2,17 +2,24 @@ #include "Configuration.h" #include "HitTube.h" +const double TriggerAlgo::fLongTime = 40E9; // ns = 40s. loooong time for SN simulations + TriggerAlgo::TriggerAlgo() : +fTriggerTimeForFailure( 100. ), fNDigitsWindow( 200. ), fNDigitsStepSize( 5. ), fNDigitsThreshold( 25 ), -fTriggerTimeForFailure( 100. ) +fTriggerType ( TriggerType::eNDigits ) { fPreTriggerWindow[TriggerType::eNDigits] = -400.; fPreTriggerWindow[TriggerType::eFailure] = -400.; + fPreTriggerWindow[TriggerType::eNoTrig] = -fLongTime; fPostTriggerWindow[TriggerType::eNDigits] = 950.; fPostTriggerWindow[TriggerType::eFailure] = 100000.; + fPostTriggerWindow[TriggerType::eNoTrig] = fLongTime; + + string sTriggerType; Configuration *Conf = Configuration::GetInstance(); Conf->GetValue("NDigitsWindow", fNDigitsWindow); @@ -23,8 +30,56 @@ fTriggerTimeForFailure( 100. ) Conf->GetValue("NDigitsPostTriggerWindow", fPostTriggerWindow[TriggerType::eNDigits]); Conf->GetValue("FailurePreTriggerWindow", fPreTriggerWindow[TriggerType::eFailure]); Conf->GetValue("FailurePostTriggerWindow", fPostTriggerWindow[TriggerType::eFailure]); + Conf->GetValue("TriggerType", sTriggerType); + + if ( sTriggerType=="NDigits" ) + { + fTriggerType = TriggerType::eNDigits; + cout<<" Use default NDigits trigger "<GetTotalNumOfDigiHits(); + float trigTimeLow = trigTime + fPreTriggerWindow[TriggerType::eNoTrig]; + float trigTimeUp = trigTime + fPostTriggerWindow[TriggerType::eNoTrig]; + ti->AddTrigger( trigTime, + trigTimeLow, + trigTimeUp, + nHits, + (int)TriggerType::eNoTrig); + + cout<<" Found trigger at: " << trigTime + <<" nHits: " << nHits + <<" trigger window: [" << trigTimeLow + <<", " << trigTimeUp + <<"] ns " + < < FailureTime = 100. > < NDigitsWindow = 200. > +< TriggerType = NoTrig > # Dark noise setting < NumOfTubes = 2014 > From d8225c5428e4716c727e3edc2522e16374c084ac Mon Sep 17 00:00:00 2001 From: kmtsui Date: Mon, 7 Aug 2023 13:46:41 +0900 Subject: [PATCH 20/55] Seperate triggers for different PMT types --- cpp/include/MDTManager.h | 3 +- cpp/include/TriggerAlgo.h | 4 ++- cpp/src/MDTManager.cc | 15 ++++++++-- cpp/src/TriggerAlgo.cc | 49 +++++++++++++++++++++++--------- parameter/MDTParamenter_IWCD.txt | 19 +++++++------ 5 files changed, 62 insertions(+), 28 deletions(-) diff --git a/cpp/include/MDTManager.h b/cpp/include/MDTManager.h index 81ac243..cb072e1 100644 --- a/cpp/include/MDTManager.h +++ b/cpp/include/MDTManager.h @@ -37,10 +37,11 @@ class MDTManager PMTResponse* GetPMTResponse(const string &s="Def") { return fPMTResp[s]; } private: - TriggerAlgo *fTrigAlgo; + // TriggerAlgo *fTrigAlgo; HitDigitizer *fDgtzr; MTRandom *fRndm; + map fTrigAlgo; map fTrigInfo; map fPMTResp; map fDark; diff --git a/cpp/include/TriggerAlgo.h b/cpp/include/TriggerAlgo.h index b600277..d90d2a2 100644 --- a/cpp/include/TriggerAlgo.h +++ b/cpp/include/TriggerAlgo.h @@ -17,7 +17,7 @@ using std::vector; class TriggerAlgo { public: - TriggerAlgo(); + TriggerAlgo(const string &s=""); virtual ~TriggerAlgo(){}; void DoTrigger(HitTubeCollection*, TriggerInfo*); @@ -36,4 +36,6 @@ class TriggerAlgo TriggerType fTriggerType; static const double fLongTime; ///< An arbitrary long time to use in loops (ns) + + string fPMTType; }; diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index e2b912c..fe8565a 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -3,9 +3,10 @@ MDTManager::MDTManager(int seed) { fRndm = new MTRandom( seed ); - fTrigAlgo = new TriggerAlgo(); + // fTrigAlgo = new TriggerAlgo(); fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); + fTrigAlgo.clear(); fPMTResp.clear(); fDark.clear(); fPHC.clear(); @@ -14,7 +15,7 @@ MDTManager::MDTManager(int seed) MDTManager::~MDTManager() { - if( fTrigAlgo ){ delete fTrigAlgo; fTrigAlgo = NULL; } + // if( fTrigAlgo ){ delete fTrigAlgo; fTrigAlgo = NULL; } if( fRndm ){ delete fRndm; fRndm = NULL; } map::iterator iPMTResp; @@ -39,6 +40,13 @@ MDTManager::~MDTManager() } fPHC.clear(); + map::iterator iTrigAlgo; + for(iTrigAlgo=fTrigAlgo.begin(); iTrigAlgo!=fTrigAlgo.end(); iTrigAlgo++) + { + delete iTrigAlgo->second; iTrigAlgo->second = NULL; + } + fTrigAlgo.clear(); + map::iterator iTrigInfo; for(iTrigInfo=fTrigInfo.begin(); iTrigInfo!=fTrigInfo.end(); iTrigInfo++) { @@ -70,7 +78,7 @@ void MDTManager::DoTrigger(const string &pmtname) { if( this->HasThisPMTType(pmtname) ) { - fTrigAlgo->DoTrigger(fPHC[pmtname], fTrigInfo[pmtname]); + fTrigAlgo[pmtname]->DoTrigger(fPHC[pmtname], fTrigInfo[pmtname]); } } @@ -110,6 +118,7 @@ void MDTManager::RegisterPMTType(const string &pmtname, PMTResponse *pmtResp) { if( fPHC.count(pmtname)==0 ) { + fTrigAlgo[pmtname] = new TriggerAlgo(pmtname) ; fTrigInfo[pmtname] = new TriggerInfo(); fPHC[pmtname] = new HitTubeCollection(); fDark[pmtname] = new PMTNoise(fRndm->Integer(1000000), pmtname); diff --git a/cpp/src/TriggerAlgo.cc b/cpp/src/TriggerAlgo.cc index cd05639..1368359 100644 --- a/cpp/src/TriggerAlgo.cc +++ b/cpp/src/TriggerAlgo.cc @@ -4,12 +4,13 @@ const double TriggerAlgo::fLongTime = 40E9; // ns = 40s. loooong time for SN simulations -TriggerAlgo::TriggerAlgo() : +TriggerAlgo::TriggerAlgo(const string &pmtname) : fTriggerTimeForFailure( 100. ), fNDigitsWindow( 200. ), fNDigitsStepSize( 5. ), fNDigitsThreshold( 25 ), -fTriggerType ( TriggerType::eNDigits ) +fTriggerType ( TriggerType::eNDigits ), +fPMTType( pmtname ) { fPreTriggerWindow[TriggerType::eNDigits] = -400.; fPreTriggerWindow[TriggerType::eFailure] = -400.; @@ -19,33 +20,53 @@ fTriggerType ( TriggerType::eNDigits ) fPostTriggerWindow[TriggerType::eFailure] = 100000.; fPostTriggerWindow[TriggerType::eNoTrig] = fLongTime; + map s; + s["NDigitsWindow"] = "NDigitsWindow"; + s["NDigitsStepSize"] = "NDigitsStepSize"; + s["NDigitsThreshold"] = "NDigitsThreshold"; + s["FailureTime"] = "FailureTime"; + s["NDigitsPreTriggerWindow"] = "NDigitsPreTriggerWindow"; + s["NDigitsPostTriggerWindow"] = "NDigitsPostTriggerWindow"; + s["FailurePreTriggerWindow"] = "FailurePreTriggerWindow"; + s["FailurePostTriggerWindow"] = "FailurePostTriggerWindow"; + s["TriggerType"] = "TriggerType"; + + if( fPMTType!="" ) + { + map::iterator i; + for(i=s.begin(); i!=s.end(); i++) + { + i->second += "_" + fPMTType; + } + } + string sTriggerType; Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue("NDigitsWindow", fNDigitsWindow); - Conf->GetValue("NDigitsStepSize", fNDigitsStepSize); - Conf->GetValue("NDigitsThreshold", fNDigitsThreshold ); - Conf->GetValue("FailureTime", fTriggerTimeForFailure); - Conf->GetValue("NDigitsPreTriggerWindow", fPreTriggerWindow[TriggerType::eNDigits]); - Conf->GetValue("NDigitsPostTriggerWindow", fPostTriggerWindow[TriggerType::eNDigits]); - Conf->GetValue("FailurePreTriggerWindow", fPreTriggerWindow[TriggerType::eFailure]); - Conf->GetValue("FailurePostTriggerWindow", fPostTriggerWindow[TriggerType::eFailure]); - Conf->GetValue("TriggerType", sTriggerType); + Conf->GetValue(s["NDigitsWindow"], fNDigitsWindow); + Conf->GetValue(s["NDigitsStepSize"], fNDigitsStepSize); + Conf->GetValue(s["NDigitsThreshold"], fNDigitsThreshold ); + Conf->GetValue(s["FailureTime"], fTriggerTimeForFailure); + Conf->GetValue(s["NDigitsPreTriggerWindow"], fPreTriggerWindow[TriggerType::eNDigits]); + Conf->GetValue(s["NDigitsPostTriggerWindow"], fPostTriggerWindow[TriggerType::eNDigits]); + Conf->GetValue(s["FailurePreTriggerWindow"], fPreTriggerWindow[TriggerType::eFailure]); + Conf->GetValue(s["FailurePostTriggerWindow"], fPostTriggerWindow[TriggerType::eFailure]); + Conf->GetValue(s["TriggerType"], sTriggerType); if ( sTriggerType=="NDigits" ) { fTriggerType = TriggerType::eNDigits; - cout<<" Use default NDigits trigger "< -< NDigitsStepSize = 5 > -< NDigitsPostTriggerWindow = +950. > -< NDigitsPreTriggerWindow = -400. > -< FailurePostTriggerWindow = +950. > # seems to be +950 by default //+100000. -< FailurePreTriggerWindow = -400. > -< FailureTime = 100. > -< NDigitsWindow = 200. > -< TriggerType = NoTrig > +< NDigitsThreshold_PMT3inchR12199_02 = 25 > +< NDigitsStepSize_PMT3inchR12199_02 = 5 > +< NDigitsPostTriggerWindow_PMT3inchR12199_02 = +950. > +< NDigitsPreTriggerWindow_PMT3inchR12199_02 = -400. > +< FailurePostTriggerWindow_PMT3inchR12199_02 = +950. > # seems to be +950 by default //+100000. +< FailurePreTriggerWindow_PMT3inchR12199_02 = -400. > +< FailureTime_PMT3inchR12199_02 = 100. > +< NDigitsWindow_PMT3inchR12199_02 = 200. > +< TriggerType_PMT3inchR12199_02 = NDigits > +< TriggerType_PMT3inchR12199_02_OD = NoTrig > # Dark noise setting < NumOfTubes = 2014 > From dd23cb18f2e2b855c01530e23c4c29272ba0a88a Mon Sep 17 00:00:00 2001 From: kmtsui Date: Mon, 7 Aug 2023 13:52:22 +0900 Subject: [PATCH 21/55] Remove obsolete HYBRIDWCSIM flag --- app/utilities/WCRootData/Makefile | 3 --- envMDT.sh | 12 ------------ 2 files changed, 15 deletions(-) diff --git a/app/utilities/WCRootData/Makefile b/app/utilities/WCRootData/Makefile index 3599726..ad090a8 100644 --- a/app/utilities/WCRootData/Makefile +++ b/app/utilities/WCRootData/Makefile @@ -2,9 +2,6 @@ CXX=g++ LD=g++ CXXFLAGS += -Wall -O2 -std=c++11 -g -fPIC -I./include $(shell root-config --cflags) -I$(WCSIMDIR)/include -I${MDTROOT}/cpp/include -ifeq ($(HYBRIDWCSIM),1) -CXXFLAGS += -DHYBRIDWCSIM -endif #LDFLAGS += -shared $(shell root-config --ldflags) $(shell root-config --libs) -lTreePlayer -lMinuit2 -L$(WCSIMDIR) -lWCSimRoot -L${MDTROOT}/cpp -lMDT LDFLAGS += -shared $(shell root-config --ldflags) $(shell root-config --libs) -L$(WCSIMROOTDIR) -lWCSimRoot -L${MDTROOT}/cpp -lMDT diff --git a/envMDT.sh b/envMDT.sh index 00ee83a..a60a2a8 100644 --- a/envMDT.sh +++ b/envMDT.sh @@ -77,18 +77,6 @@ fi export WCRDROOT=$MDTROOT/app/utilities/WCRootData export LD_LIBRARY_PATH=${WCRDROOT}:$LD_LIBRARY_PATH -#--- Option to read hybrid WCSIM files -if [[ -z "${HYBRIDWCSIM}" ]]; then - echo "HYBRIDWCSIM not set. Default to 0" - export HYBRIDWCSIM=0 -elif [[ $HYBRIDWCSIM -eq 0 ]]; then - echo "HYBRIDWCSIM set to 0" - export HYBRIDWCSIM=0 -else - echo "HYBRIDWCSIM set to 1" - export HYBRIDWCSIM=1 -fi - echo "Setup complete!" echo "MDTROOT=$MDTROOT" echo "WCRDROOT=$WCRDROOT" From 211d797efe746f091b77567fdbb45bda0840d2e2 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Tue, 15 Aug 2023 14:41:04 +0900 Subject: [PATCH 22/55] Debug find trigger end time --- cpp/src/TriggerAlgo.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/src/TriggerAlgo.cc b/cpp/src/TriggerAlgo.cc index 1368359..bc57c4f 100644 --- a/cpp/src/TriggerAlgo.cc +++ b/cpp/src/TriggerAlgo.cc @@ -129,14 +129,14 @@ void TriggerAlgo::NDigits(HitTubeCollection *hc, TriggerInfo* ti) const double stepSize = fNDigitsStepSize; // in ns //const double tWindowMax = std::max(0.f, tLastHit - fNDigitsWindow); // in ns - const double tWindowMax = tLastHit - fNDigitsWindow + stepSize; double tWindowUp = 0.; //double tWindowLow = 0.; double tWindowLow = times[0]; if (tWindowLow>0) tWindowLow = ((int)(tWindowLow/stepSize))*stepSize; else tWindowLow = ((int)(tWindowLow/stepSize)-1)*stepSize; - + const double tWindowMax = std::max(tWindowLow, (double)(tLastHit - fNDigitsWindow)) + stepSize; + // - Slide the time window with a width of "fNDigitsWindow" // from "tWindowLow" to "tWindowMax" // with a step size of "stepSize" From 521030a91449da85ec89062e8e7022cea44f2617 Mon Sep 17 00:00:00 2001 From: kmtsui Date: Tue, 15 Aug 2023 14:42:37 +0900 Subject: [PATCH 23/55] Compatibility with new boundary points info --- app/utilities/WCRootData/src/WCRootData.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index 1ce82be..c698bdd 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -327,6 +327,11 @@ void WCRootData::AddTracks(const WCSimRootTrigger *aEvtIn, float offset_time, in start[j] = aTrack->GetStart(j); } + std::vector> bPs = aTrack->GetBoundaryPoints(); + std::vector bKEs = aTrack->GetBoundaryKEs(); + std::vector bTimes = aTrack->GetBoundaryTimes(); + std::vector bTypes = aTrack->GetBoundaryTypes(); + aEvtOut->AddTrack(ipnu, flag, m, @@ -341,7 +346,11 @@ void WCRootData::AddTracks(const WCSimRootTrigger *aEvtIn, float offset_time, in parenttype, time, id, - idPrnt); + idPrnt, + bPs, + bKEs, + bTimes, + bTypes); } } From 03d4886cd22df69e337b4ed5b235265be653d67e Mon Sep 17 00:00:00 2001 From: kmtsui Date: Tue, 15 Aug 2023 15:15:41 +0900 Subject: [PATCH 24/55] Copy other trees into output --- app/application/appIWCDSingleEvent.cc | 4 + app/utilities/WCRootData/src/WCRootData.cc | 117 +++++++++++---------- 2 files changed, 67 insertions(+), 54 deletions(-) diff --git a/app/application/appIWCDSingleEvent.cc b/app/application/appIWCDSingleEvent.cc index 4cfa653..04bae9c 100644 --- a/app/application/appIWCDSingleEvent.cc +++ b/app/application/appIWCDSingleEvent.cc @@ -91,6 +91,10 @@ int main(int argc, char **argv) } outData->WriteTree(); inData->CloseFile(); + + // Copy geo trees, etc. + vector listTrees{"Settings","wcsimGeoT","wcsimRootOptionsT"}; + for (auto s:listTrees) outData->CopyTree(fInFileName.c_str(),s.c_str()); } diff --git a/app/utilities/WCRootData/src/WCRootData.cc b/app/utilities/WCRootData/src/WCRootData.cc index c698bdd..cc3a2be 100644 --- a/app/utilities/WCRootData/src/WCRootData.cc +++ b/app/utilities/WCRootData/src/WCRootData.cc @@ -381,61 +381,70 @@ void WCRootData::CopyTree(const char *filename, // Copy all the entries if( savelist.size()==0 ) { - if( strcmp(treename,"Settings")!=0 ) - { - TTree *tin = (TTree*)fin->Get(treename); + TTree *tin = (TTree*)fin->Get(treename); - TFile *fout = TFile::Open(fOutFileName, "update"); - fout->cd(); - TTree *tout = tin->CloneTree(-1, "fast"); - tout->Write(); - fout->Close(); - } - else // This is a special treatment - { - TTree *tin = (TTree*)fin->Get(treename); - - TBranch *bWCXRotation = tin->GetBranch("WCXRotation"); - TBranch *bWCYRotation = tin->GetBranch("WCYRotation"); - TBranch *bWCZRotation = tin->GetBranch("WCZRotation"); - TBranch *bWCDetCentre = tin->GetBranch("WCDetCentre"); - TBranch *bWCDetRadius = tin->GetBranch("WCDetRadius"); - TBranch *bWCDetHeight = tin->GetBranch("WCDetHeight"); - - Float_t WCXRotation[3] = {0.}; - Float_t WCYRotation[3] = {0.}; - Float_t WCZRotation[3] = {0.}; - Float_t WCDetCentre[3] = {0.}; - Float_t WCDetRadius = 0.; - Float_t WCDetHeight = 0.; - - bWCXRotation->SetAddress(WCXRotation); - bWCYRotation->SetAddress(WCYRotation); - bWCZRotation->SetAddress(WCZRotation); - bWCDetCentre->SetAddress(WCDetCentre); - bWCDetRadius->SetAddress(&WCDetRadius); - bWCDetHeight->SetAddress(&WCDetHeight); - - bWCXRotation->GetEntry(0); - bWCYRotation->GetEntry(0); - bWCZRotation->GetEntry(0); - bWCDetCentre->GetEntry(0); - bWCDetRadius->GetEntry(0); - bWCDetHeight->GetEntry(0); - - TFile *fout = TFile::Open(fOutFileName, "update"); - fout->cd(); - TTree *tout = new TTree("Settings", ""); - tout->Branch("WCXRotation", WCXRotation, "WCXRotation[3]/F"); - tout->Branch("WCYRotation", WCYRotation, "WCYRotation[3]/F"); - tout->Branch("WCZRotation", WCZRotation, "WCZRotation[3]/F"); - tout->Branch("WCDetCentre", WCDetCentre, "WCDetCentre[3]/F"); - tout->Branch("WCDetRadius", &WCDetRadius, "WCDetRadius/F"); - tout->Branch("WCDetHeight", &WCDetHeight, "WCDetHeight/F"); - tout->Fill(); - tout->Write(); - fout->Close(); - } + TFile *fout = TFile::Open(fOutFileName, "update"); + fout->cd(); + TTree *tout = tin->CloneTree(-1, "fast"); + tout->Write(); + fout->Close(); + + // Not sure why the special treatment is needed at the first place + // if( strcmp(treename,"Settings")!=0 ) + // { + // TTree *tin = (TTree*)fin->Get(treename); + + // TFile *fout = TFile::Open(fOutFileName, "update"); + // fout->cd(); + // TTree *tout = tin->CloneTree(-1, "fast"); + // tout->Write(); + // fout->Close(); + // } + // else // This is a special treatment + // { + // TTree *tin = (TTree*)fin->Get(treename); + + // TBranch *bWCXRotation = tin->GetBranch("WCXRotation"); + // TBranch *bWCYRotation = tin->GetBranch("WCYRotation"); + // TBranch *bWCZRotation = tin->GetBranch("WCZRotation"); + // TBranch *bWCDetCentre = tin->GetBranch("WCDetCentre"); + // TBranch *bWCDetRadius = tin->GetBranch("WCDetRadius"); + // TBranch *bWCDetHeight = tin->GetBranch("WCDetHeight"); + + // Float_t WCXRotation[3] = {0.}; + // Float_t WCYRotation[3] = {0.}; + // Float_t WCZRotation[3] = {0.}; + // Float_t WCDetCentre[3] = {0.}; + // Float_t WCDetRadius = 0.; + // Float_t WCDetHeight = 0.; + + // bWCXRotation->SetAddress(WCXRotation); + // bWCYRotation->SetAddress(WCYRotation); + // bWCZRotation->SetAddress(WCZRotation); + // bWCDetCentre->SetAddress(WCDetCentre); + // bWCDetRadius->SetAddress(&WCDetRadius); + // bWCDetHeight->SetAddress(&WCDetHeight); + + // bWCXRotation->GetEntry(0); + // bWCYRotation->GetEntry(0); + // bWCZRotation->GetEntry(0); + // bWCDetCentre->GetEntry(0); + // bWCDetRadius->GetEntry(0); + // bWCDetHeight->GetEntry(0); + + // TFile *fout = TFile::Open(fOutFileName, "update"); + // fout->cd(); + // TTree *tout = new TTree("Settings", ""); + // tout->Branch("WCXRotation", WCXRotation, "WCXRotation[3]/F"); + // tout->Branch("WCYRotation", WCYRotation, "WCYRotation[3]/F"); + // tout->Branch("WCZRotation", WCZRotation, "WCZRotation[3]/F"); + // tout->Branch("WCDetCentre", WCDetCentre, "WCDetCentre[3]/F"); + // tout->Branch("WCDetRadius", &WCDetRadius, "WCDetRadius/F"); + // tout->Branch("WCDetHeight", &WCDetHeight, "WCDetHeight/F"); + // tout->Fill(); + // tout->Write(); + // fout->Close(); + // } } else { From c088afb09d738384505fad5980b857a007257296 Mon Sep 17 00:00:00 2001 From: Mathieu Guigue Date: Mon, 21 Aug 2023 16:21:21 +0200 Subject: [PATCH 25/55] Add initial CI --- .github/workflows/Doxygen.yml | 40 ++++++++++++++++ .github/workflows/clang-format.yml | 21 +++++++++ .github/workflows/pullrequest_workflow.yml | 55 ++++++++++++++++++++++ .github/workflows/push_workflow.yml | 53 +++++++++++++++++++++ .gitignore | 6 ++- CMakeLists.txt | 27 +++++++++++ Dockerfile | 9 ++++ MDTConfig.cmake.in | 5 ++ app/CMakeLists.txt | 4 ++ app/application/CMakeLists.txt | 48 +++++++++++++++++++ app/utilities/WCRootData/CMakeLists.txt | 37 +++++++++++++++ cpp/CMakeLists.txt | 49 +++++++++++++++++++ dependencies.cmake | 2 + hkinstall.py | 8 ++++ 14 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/Doxygen.yml create mode 100644 .github/workflows/clang-format.yml create mode 100644 .github/workflows/pullrequest_workflow.yml create mode 100644 .github/workflows/push_workflow.yml create mode 100644 CMakeLists.txt create mode 100644 Dockerfile create mode 100644 MDTConfig.cmake.in create mode 100644 app/CMakeLists.txt create mode 100644 app/application/CMakeLists.txt create mode 100644 app/utilities/WCRootData/CMakeLists.txt create mode 100644 cpp/CMakeLists.txt create mode 100644 dependencies.cmake create mode 100644 hkinstall.py diff --git a/.github/workflows/Doxygen.yml b/.github/workflows/Doxygen.yml new file mode 100644 index 0000000..1bf16e9 --- /dev/null +++ b/.github/workflows/Doxygen.yml @@ -0,0 +1,40 @@ +# This is a basic workflow to help you get started with Actions + +name: Doxygen + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + + Doxygen: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Make docs folder + run: mkdir docs-output + + # Runs a single command using the runners shell + - name: Doxygen Action + uses: mattnotmitt/doxygen-action@1.9.1 + + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs-output + diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml new file mode 100644 index 0000000..4d994ba --- /dev/null +++ b/.github/workflows/clang-format.yml @@ -0,0 +1,21 @@ +name: Run clang-format Linter + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + container: ghcr.io/hyperk/clang_format:latest + steps: + - uses: actions/checkout@v2 + - name: make_safe + run: git config --global --add safe.directory '*' + - name: format + run: git clone https://github.com/hyperk/hk-ClangFormat.git && cd hk-ClangFormat && ./run.sh && cd .. && rm -rf hk-ClangFormat + - uses: EndBug/add-and-commit@v9 + with: + author_name: Clang Robot + author_email: robot@example.com + message: 'Committing clang-format changes' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/pullrequest_workflow.yml b/.github/workflows/pullrequest_workflow.yml new file mode 100644 index 0000000..fe6850e --- /dev/null +++ b/.github/workflows/pullrequest_workflow.yml @@ -0,0 +1,55 @@ +name: Build on push + +on: [pull_request] + + + + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: read + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.6.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + uses: docker/build-push-action@v3.1.0 + with: + context: . + file: Dockerfile + push: false + pull: true + github-token: ${{ secrets.GITHUB_TOKEN }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + ssh: | + default=${{ env.SSH_AUTH_SOCK }} + +# - name: Build the Docker image +# run: docker build . --file Dockerfile --tag ghcr.io/hyperk/geant4:latest \ No newline at end of file diff --git a/.github/workflows/push_workflow.yml b/.github/workflows/push_workflow.yml new file mode 100644 index 0000000..a62dd2d --- /dev/null +++ b/.github/workflows/push_workflow.yml @@ -0,0 +1,53 @@ +name: Build on push + +on: + push: + branches: [main] + tags: ['*'] + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + + + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.6.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + uses: docker/build-push-action@v3.1.0 + with: + context: . + file: Dockerfile + push: true + pull: true + github-token: ${{ secrets.GITHUB_TOKEN }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + ssh: | + default=${{ env.SSH_AUTH_SOCK }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index d068aa0..ebab893 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,8 @@ appWCTESingleEvent # root file -*.root \ No newline at end of file +*.root + +.idea +build-* +install-* \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..03754d0 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,27 @@ +# Minimum cmake verison 3.1 required for the variable CMAKE_CXX_STANDARD +cmake_minimum_required(VERSION 3.1) + + +set(PROJECT_NAME MDT) + +list(APPEND CMAKE_MODULE_PATH + $ENV{HK_PILOT_DIR}/cmake + ) +include(GetVersionGit) +MESSAGE("Preparing project ${PROJECT_NAME} version ${PROJECT_VERSION}" ) +project(${PROJECT_NAME} VERSION ${PROJECT_VERSION}) +include(HKPackageBuilder) +hkbuilder_prepare_project() +set( PUBLIC_EXT_LIBS ) +hk_check_dependencies() + +add_definitions(-DHYBRIDWCSIM) + + +include_directories(BEFORE + ${PROJECT_SOURCE_DIR}/cpp/include + ${PROJECT_SOURCE_DIR}/app/utilities/include + +) +add_subdirectory(cpp) +add_subdirectory(app) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2c0dd1f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM ghcr.io/hyperk/hk-meta-externals:latest + +COPY . /usr/local/hk/hk-DataModel + +RUN --mount=type=ssh mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts + +WORKDIR /usr/local/hk +RUN --mount=type=ssh . /usr/local/hk/hk-pilot/setup.sh &&\ + hkp install -r hk-DataModel diff --git a/MDTConfig.cmake.in b/MDTConfig.cmake.in new file mode 100644 index 0000000..6848433 --- /dev/null +++ b/MDTConfig.cmake.in @@ -0,0 +1,5 @@ +#${ PROJECT_NAME } Config.cmake + +get_filename_component($ { PROJECT_NAME } _CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) + + include("${${PROJECT_NAME}_CMAKE_DIR}/${PROJECT_NAME}_Library_Targets.cmake") \ No newline at end of file diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt new file mode 100644 index 0000000..4e562e4 --- /dev/null +++ b/app/CMakeLists.txt @@ -0,0 +1,4 @@ + +add_subdirectory(utilities/WCRootData) +add_subdirectory(application) + diff --git a/app/application/CMakeLists.txt b/app/application/CMakeLists.txt new file mode 100644 index 0000000..d5ca56f --- /dev/null +++ b/app/application/CMakeLists.txt @@ -0,0 +1,48 @@ + +################# +#Response library +################# + +set (SRC + PMTResponse3inchR12199_02.cc +) + +set (HEADERS + PMTResponse3inchR12199_02.h +) + + +pbuilder_library( + TARGET PMTResponse + SOURCES ${SRC} + PROJECT_LIBRARIES MDT + PUBLIC_EXTERNAL_LIBRARIES ${PUBLIC_EXT_LIBS} + PRIVATE_EXTERNAL_LIBRARIES ${PRIVATE_EXT_LIBS} +) + +pbuilder_install_headers(${HEADERS}) + +################# +#Executables +################# +set(exe_sources + appWCTESingleEvent.cc +) + +pbuilder_executables( + SOURCES ${exe_sources} + TARGETS_VAR programs + PROJECT_LIBRARIES WCRootData MDT PMTResponse + PUBLIC_EXTERNAL_LIBRARIES ${PUBLIC_EXT_LIBS} + PRIVATE_EXTERNAL_LIBRARIES ${PRIVATE_EXT_LIBS} +) + +######### +# target exportation +######### + +pbuilder_component_install_and_export( + COMPONENT Executable Libraries + LIBTARGETS PMTResponse + EXETARGETS ${programs} +) \ No newline at end of file diff --git a/app/utilities/WCRootData/CMakeLists.txt b/app/utilities/WCRootData/CMakeLists.txt new file mode 100644 index 0000000..3992a42 --- /dev/null +++ b/app/utilities/WCRootData/CMakeLists.txt @@ -0,0 +1,37 @@ + +include_directories(BEFORE + ${PROJECT_SOURCE_DIR}/app/utilities/WCRootData/include + ) + +# Don't include Utilities +#file(GLOB_RECURSE SRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cpp") +#file(GLOB_RECURSE HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h") + +set (SRC + src/BeamTiming.cc + src/SpillAnalyzer.cc + src/WCRootData.cc + src/WCRootDataBeamBkg.cc + src/WCRootDataIDNuInt.cc + src/WCRootDataNuInt.cc + src/WCRootDataPileUpSpill.cc + ) +set (HEADERS + include/BeamTiming.h + include/SpillAnalyzer.h + include/WCRootData.h + include/WCRootDataBeamBkg.h + include/WCRootDataIDNuInt.h + include/WCRootDataNuInt.h + include/WCRootDataPileUpSpill.h + ) + +pbuilder_library( + TARGET WCRootData + SOURCES ${SRC} + PROJECT_LIBRARIES MDT WCSim::WCSimCore + PUBLIC_EXTERNAL_LIBRARIES ${PUBLIC_EXT_LIBS} + PRIVATE_EXTERNAL_LIBRARIES ${PRIVATE_EXT_LIBS} +) + +pbuilder_install_headers(${HEADERS}) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt new file mode 100644 index 0000000..1f38ae2 --- /dev/null +++ b/cpp/CMakeLists.txt @@ -0,0 +1,49 @@ + + +# Don't include Utilities +#file(GLOB_RECURSE SRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cpp") +#file(GLOB_RECURSE HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h") + +set (SRC + src/Configuration.cc + src/HitDigitizer.cc + src/HitTube.cc + src/HitTubeCollection.cc + src/MDTManager.cc + src/MTRandom.cc + src/PMTAfterpulse.cc + src/PMTNoise.cc + src/PMTResponse.cc + src/TriggerAlgo.cc + src/TriggerInfo.cc + src/TrueHit.cc + ) +set (HEADERS + include/Configuration.h + include/HitDigitizer.h + include/HitTube.h + include/HitTubeCollection.h + include/MDTManager.h + include/MTRandom.h + include/PMTAfterpulse.h + include/PMTNoise.h + include/PMTResponse.h + include/TriggerAlgo.h + include/TriggerInfo.h + include/TrueHit.h + ) + +pbuilder_library( + TARGET MDT + SOURCES ${SRC} + PUBLIC_EXTERNAL_LIBRARIES ${PUBLIC_EXT_LIBS} + PRIVATE_EXTERNAL_LIBRARIES ${PRIVATE_EXT_LIBS} +) + + +pbuilder_component_install_and_export( + COMPONENT Library + LIBTARGETS MDT +) + +pbuilder_install_headers(${HEADERS}) diff --git a/dependencies.cmake b/dependencies.cmake new file mode 100644 index 0000000..91cdb5e --- /dev/null +++ b/dependencies.cmake @@ -0,0 +1,2 @@ +hk_package(ROOT *) +hk_package(WCSim *) # 1.11.1 needed for hybrid WCSim diff --git a/hkinstall.py b/hkinstall.py new file mode 100644 index 0000000..6229774 --- /dev/null +++ b/hkinstall.py @@ -0,0 +1,8 @@ +from hkpilot.utils.cmake import CMake + + +class MDT(CMake): + + def __init__(self, path): + super().__init__(path) + self._package_name = "MDT" From 0263d74c14777f6faa2aed4c20d80a48942e8dea Mon Sep 17 00:00:00 2001 From: Clang Robot Date: Mon, 21 Aug 2023 14:22:09 +0000 Subject: [PATCH 26/55] Committing clang-format changes --- app/application/PMTResponse3inchR12199_02.cc | 77 +- app/application/PMTResponse3inchR12199_02.h | 16 +- app/application/appExtrSinglNuIntBunch.cc | 173 ++-- app/application/appGenPileUpSpill.cc | 287 +++--- app/application/appHKHybridSingleEvent.cc | 135 +-- app/application/appWCTESingleEvent.cc | 152 ++-- app/utilities/WCRootData/include/BeamTiming.h | 33 +- .../WCRootData/include/PileUpSpill_t.h | 163 ++-- .../WCRootData/include/RedNRTVtx_t.h | 122 ++- .../WCRootData/include/SpillAnalyzer.h | 17 +- app/utilities/WCRootData/include/WCRootData.h | 85 +- .../WCRootData/include/WCRootDataBeamBkg.h | 26 +- .../WCRootData/include/WCRootDataIDNuInt.h | 25 +- .../WCRootData/include/WCRootDataNuInt.h | 102 +-- .../include/WCRootDataPileUpSpill.h | 85 +- app/utilities/WCRootData/src/BeamTiming.cc | 20 +- app/utilities/WCRootData/src/SpillAnalyzer.cc | 141 ++- app/utilities/WCRootData/src/WCRootData.cc | 820 +++++++++--------- .../WCRootData/src/WCRootDataBeamBkg.cc | 72 +- .../WCRootData/src/WCRootDataIDNuInt.cc | 89 +- .../WCRootData/src/WCRootDataNuInt.cc | 205 +++-- .../WCRootData/src/WCRootDataPileUpSpill.cc | 340 ++++---- cpp/include/Configuration.h | 56 +- cpp/include/HitDigitizer.h | 43 +- cpp/include/HitTube.h | 122 +-- cpp/include/HitTubeCollection.h | 58 +- cpp/include/MDTManager.h | 78 +- cpp/include/MTRandom.h | 107 +-- cpp/include/PMTAfterpulse.h | 40 +- cpp/include/PMTNoise.h | 110 +-- cpp/include/PMTResponse.h | 121 +-- cpp/include/TriggerAlgo.h | 38 +- cpp/include/TriggerInfo.h | 57 +- cpp/include/TrueHit.h | 77 +- cpp/src/Configuration.cc | 227 +++-- cpp/src/HitDigitizer.cc | 240 +++-- cpp/src/HitTube.cc | 33 +- cpp/src/HitTubeCollection.cc | 76 +- cpp/src/MDTManager.cc | 209 +++-- cpp/src/MTRandom.cc | 338 ++++---- cpp/src/PMTAfterpulse.cc | 134 ++- cpp/src/PMTNoise.cc | 449 +++++----- cpp/src/PMTResponse.cc | 350 ++++---- cpp/src/TriggerAlgo.cc | 228 +++-- cpp/src/TriggerInfo.cc | 50 +- cpp/src/TrueHit.cc | 26 +- pywrap/PyWrapMDT.cpp | 89 +- 47 files changed, 3197 insertions(+), 3344 deletions(-) diff --git a/app/application/PMTResponse3inchR12199_02.cc b/app/application/PMTResponse3inchR12199_02.cc index ee3e0b2..058b557 100644 --- a/app/application/PMTResponse3inchR12199_02.cc +++ b/app/application/PMTResponse3inchR12199_02.cc @@ -2,54 +2,47 @@ #include "Configuration.h" +#include #include -#include using std::map; -PMTResponse3inchR12199_02::PMTResponse3inchR12199_02(int seed, const string &pmtname) -{ - this->Initialize(seed, pmtname); +PMTResponse3inchR12199_02::PMTResponse3inchR12199_02(int seed, const string& pmtname) { + this->Initialize(seed, pmtname); } -PMTResponse3inchR12199_02::PMTResponse3inchR12199_02() -{ +PMTResponse3inchR12199_02::PMTResponse3inchR12199_02() {} + +PMTResponse3inchR12199_02::~PMTResponse3inchR12199_02() {} + +void PMTResponse3inchR12199_02::Initialize(int seed, const string& pmtname) { + fPMTType = pmtname; + fRand = new MTRandom(seed); + + map s; + s["TimingResConstant"] = "TimingResConstant"; + s["TimingResMinimum"] = "TimingResMinimum"; + s["ScalFactorTTS"] = "ScalFactorTTS"; + s["SPECDFFile"] = "SPECDFFile"; + if(fPMTType != "") { + map::iterator i; + for(i = s.begin(); i != s.end(); i++) { + i->second += "_" + fPMTType; + } + } + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue(s["TimingResConstant"], fTResConstant); + Conf->GetValue(s["TimingResMinimum"], fTResMinimum); + Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); + Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); + this->LoadCDFOfSPE(fTxtFileSPECDF); } -PMTResponse3inchR12199_02::~PMTResponse3inchR12199_02() -{ -} - -void PMTResponse3inchR12199_02::Initialize(int seed, const string &pmtname) -{ - fPMTType = pmtname; - fRand = new MTRandom(seed); - - map s; - s["TimingResConstant"] = "TimingResConstant"; - s["TimingResMinimum"] = "TimingResMinimum"; - s["ScalFactorTTS"] = "ScalFactorTTS"; - s["SPECDFFile"] = "SPECDFFile"; - if( fPMTType!="" ) - { - map::iterator i; - for(i=s.begin(); i!=s.end(); i++) - { - i->second += "_" + fPMTType; - } - } - Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue(s["TimingResConstant"], fTResConstant); - Conf->GetValue(s["TimingResMinimum"], fTResMinimum); - Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); - Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); - this->LoadCDFOfSPE(fTxtFileSPECDF); -} - -float PMTResponse3inchR12199_02::HitTimeSmearing(float Q) -{ - Q = (Q > 0.5) ? Q : 0.5; - float timingResolution = 0.5*fSclFacTTS*(0.33 + sqrt(fTResConstant/Q)); - if( timingResolutionGaus(0.0,timingResolution); +float PMTResponse3inchR12199_02::HitTimeSmearing(float Q) { + Q = (Q > 0.5) ? Q : 0.5; + float timingResolution = 0.5 * fSclFacTTS * (0.33 + sqrt(fTResConstant / Q)); + if(timingResolution < fTResMinimum) { + timingResolution = fTResMinimum; + } + return fRand->Gaus(0.0, timingResolution); } diff --git a/app/application/PMTResponse3inchR12199_02.h b/app/application/PMTResponse3inchR12199_02.h index e9bf0a3..f7be017 100644 --- a/app/application/PMTResponse3inchR12199_02.h +++ b/app/application/PMTResponse3inchR12199_02.h @@ -2,12 +2,12 @@ #include "PMTResponse.h" -class PMTResponse3inchR12199_02 : public GenericPMTResponse -{ - public: - PMTResponse3inchR12199_02(int, const string &s=""); - PMTResponse3inchR12199_02(); - virtual ~PMTResponse3inchR12199_02(); - float HitTimeSmearing(float); - void Initialize(int, const string &s=""); +class PMTResponse3inchR12199_02 : public GenericPMTResponse { + public: + + PMTResponse3inchR12199_02(int, const string& s = ""); + PMTResponse3inchR12199_02(); + virtual ~PMTResponse3inchR12199_02(); + float HitTimeSmearing(float); + void Initialize(int, const string& s = ""); }; diff --git a/app/application/appExtrSinglNuIntBunch.cc b/app/application/appExtrSinglNuIntBunch.cc index 9f7f495..96229cd 100644 --- a/app/application/appExtrSinglNuIntBunch.cc +++ b/app/application/appExtrSinglNuIntBunch.cc @@ -1,89 +1,92 @@ -#include "WCRootDataPileUpSpill.h" -#include "SpillAnalyzer.h" #include "BeamTiming.h" +#include "SpillAnalyzer.h" +#include "WCRootDataPileUpSpill.h" // Will dump digitized hits associated with give bunch id number -int main(int argc, char **argv) -{ - TString InFileName = argv[1]; - TString OutFileName = argv[2]; - string MDTParFileName = argv[3]; - int bunch_id = atoi( argv[4] ); - int seed = atoi( argv[5] ); - - Configuration *Conf = Configuration::GetInstance(); - Conf->ReadParameter(MDTParFileName); - Conf->PrintParameters(); - Conf = NULL; - - // Mange digitzed hits and add afterpulse (optinal) - MDTManager *MDT = new MDTManager(seed); - - // Mange input pile-up spill files - WCRootDataPileUpSpill *input = new WCRootDataPileUpSpill(); - input->ReadFile(InFileName); - - // Manage selected ""bunch events"" - WCRootData *output = new WCRootData(); - output->CreateTree(OutFileName); - - // Manage spill selection - SpillAnalyzer *sa = new SpillAnalyzer(); - - - // Peak time of the bunch - const float bunch_mean_time = (float)kBunchInterval*(bunch_id - 1);; - const float TimeMichelELow = bunch_mean_time - 3.*kBunchSigma; - const float TimeMichelEUp = bunch_mean_time + 3.*kBunchSigma; - - // Only digitized hits that belong to the time window will be extracted - const float TimeSelDigiLow = TimeMichelELow; - float TimeSelDigiUp = (float)kBunchInterval*bunch_id - 3.*kBunchSigma; - if( bunch_id==kNBunches ) - { - TimeSelDigiUp = (float)kBunchInterval*(bunch_id-1) + 3.*kBunchSigma + 10000.; - } - - - cout<<" Target bunch id: " << bunch_id <<" in [0, " << kNBunches <<"]" <GetEntries() ; - cout<<" Start processing " << input->GetEntries() <<" pile-up spills" < flagToSave(nEntries, false); - for(int iEntry=0; iEntryGetEntry(iEntry); - - // Check that the bunch of interest has just one ID interaction with true visible energy deposition<50 MeV - if( !sa->IsSingleIDIneractionAtBunch(input, 4-1, nuIntIdx) ){ continue; } - - // Check whether or not there is no secondary electrons (e.g. Michel-e) steming from earlier ID/beam bkg interations - // around the bunch of interest - if( sa->HasMichelEFromOtherInteractionAtBunch(input, nuIntIdx, TimeMichelELow, TimeMichelEUp) ){ continue; } - - // Extract digitized hits being in time window [TimeSelDigiLow, TimeSelDigiUp] - // The offset time, TimeSelDigiUp, will be subtracted from the extracted time just for late use - input->AddDigiHitsToMDT(MDT, TimeSelDigiLow, TimeSelDigiUp, bunch_mean_time); - - MDT->DoTrigger(); - output->AddDigiHits(MDT); - output->FillTree(); - MDT->DoInitialize(); - - flagToSave[iEntry] = true; - nPassed += 1; - } - cout<<" Number of passed entries: " << nPassed <<"/" << nEntries <WriteTree(); - output->CopyTree(InFileName, "pupspillT", flagToSave); - - Conf = Configuration::GetInstance(); - Conf->Finalize(); +int main(int argc, char** argv) { + TString InFileName = argv[1]; + TString OutFileName = argv[2]; + string MDTParFileName = argv[3]; + int bunch_id = atoi(argv[4]); + int seed = atoi(argv[5]); + + Configuration* Conf = Configuration::GetInstance(); + Conf->ReadParameter(MDTParFileName); + Conf->PrintParameters(); + Conf = NULL; + + // Mange digitzed hits and add afterpulse (optinal) + MDTManager* MDT = new MDTManager(seed); + + // Mange input pile-up spill files + WCRootDataPileUpSpill* input = new WCRootDataPileUpSpill(); + input->ReadFile(InFileName); + + // Manage selected ""bunch events"" + WCRootData* output = new WCRootData(); + output->CreateTree(OutFileName); + + // Manage spill selection + SpillAnalyzer* sa = new SpillAnalyzer(); + + // Peak time of the bunch + const float bunch_mean_time = (float)kBunchInterval * (bunch_id - 1); + ; + const float TimeMichelELow = bunch_mean_time - 3. * kBunchSigma; + const float TimeMichelEUp = bunch_mean_time + 3. * kBunchSigma; + + // Only digitized hits that belong to the time window will be extracted + const float TimeSelDigiLow = TimeMichelELow; + float TimeSelDigiUp = (float)kBunchInterval * bunch_id - 3. * kBunchSigma; + if(bunch_id == kNBunches) { + TimeSelDigiUp = (float)kBunchInterval * (bunch_id - 1) + 3. * kBunchSigma + 10000.; + } + + cout << " Target bunch id: " << bunch_id << " in [0, " << kNBunches << "]" << endl; + cout << " - True secondary electron search window: [" << TimeMichelELow << ", " << TimeMichelEUp + << " (ns)" << endl; + cout << " - Digi hit saving time window: [" << TimeSelDigiLow << ", " << TimeSelDigiUp << " (ns)" + << endl; + + int nuIntIdx = -1; + const int nEntries = input->GetEntries(); + cout << " Start processing " << input->GetEntries() << " pile-up spills" << endl; + int nPassed = 0; + + // Will copy a TTree object to the output file with selected spills + vector flagToSave(nEntries, false); + for(int iEntry = 0; iEntry < nEntries; iEntry++) { + input->GetEntry(iEntry); + + // Check that the bunch of interest has just one ID interaction with true visible energy deposition<50 + // MeV + if(!sa->IsSingleIDIneractionAtBunch(input, 4 - 1, nuIntIdx)) { + continue; + } + + // Check whether or not there is no secondary electrons (e.g. Michel-e) steming from earlier ID/beam + // bkg interations around the bunch of interest + if(sa->HasMichelEFromOtherInteractionAtBunch(input, nuIntIdx, TimeMichelELow, TimeMichelEUp)) { + continue; + } + + // Extract digitized hits being in time window [TimeSelDigiLow, TimeSelDigiUp] + // The offset time, TimeSelDigiUp, will be subtracted from the extracted time just for late use + input->AddDigiHitsToMDT(MDT, TimeSelDigiLow, TimeSelDigiUp, bunch_mean_time); + + MDT->DoTrigger(); + output->AddDigiHits(MDT); + output->FillTree(); + MDT->DoInitialize(); + + flagToSave[iEntry] = true; + nPassed += 1; + } + cout << " Number of passed entries: " << nPassed << "/" << nEntries << endl; + + output->WriteTree(); + output->CopyTree(InFileName, "pupspillT", flagToSave); + + Conf = Configuration::GetInstance(); + Conf->Finalize(); } diff --git a/app/application/appGenPileUpSpill.cc b/app/application/appGenPileUpSpill.cc index 29d3aa8..bafe009 100644 --- a/app/application/appGenPileUpSpill.cc +++ b/app/application/appGenPileUpSpill.cc @@ -1,166 +1,157 @@ -#include #include +#include #include #include "TRandom3.h" +#include "BeamTiming.h" #include "MDTManager.h" -#include "WCRootDataIDNuInt.h" #include "WCRootDataBeamBkg.h" +#include "WCRootDataIDNuInt.h" #include "WCRootDataPileUpSpill.h" -#include "BeamTiming.h" std::string fInFileTextIDNuInt = ""; std::string fInFileTextBeamBkg = ""; std::string fOutFileNamePrefix = ""; -std::string fMDTParFileName = ""; -int fSeed = 99999; -int fNumOfSpillsPerFile = 1000; -float fIDNuIntRate = 3.5; -float fBeamBkgRate = 7.5; -int fTotalNumofSpills = 10000; +std::string fMDTParFileName = ""; +int fSeed = 99999; +int fNumOfSpillsPerFile = 1000; +float fIDNuIntRate = 3.5; +float fBeamBkgRate = 7.5; +int fTotalNumofSpills = 10000; void ReadConfiguration(const char*); -int main(int argc, char **argv) -{ - std::string ConfigFileName = argv[1]; - ReadConfiguration(argv[1]); - - Configuration *Conf = Configuration::GetInstance(); - Conf->ReadParameter(fMDTParFileName); - Conf->PrintParameters(); - Conf = 0; - - TRandom3 *rndm = new TRandom3(fSeed); - const int seed_mdt = rndm->Integer(1000000); - const int seed_idnuint = rndm->Integer(1000000); - const int seed_beambkg = rndm->Integer(1000000); - const int seed_beamtiming = rndm->Integer(1000000); - delete rndm; rndm = 0; - - // Will be manaing marging true hits and digitizing merged true hits - MDTManager *MDT = new MDTManager(seed_mdt); - - // Manage input files for ID interactions - WCRootDataIDNuInt *daIDNuInt = new WCRootDataIDNuInt(); - - // Manage input files for Beam background interactions - WCRootDataBeamBkg *daBeamBkg = new WCRootDataBeamBkg(); - - // Manage pile-up spills (i.e. results of this program) - WCRootDataPileUpSpill *daPileUp = new WCRootDataPileUpSpill(); - - // Initialize random number generator - daIDNuInt->SetSeed(seed_idnuint); - daBeamBkg->SetSeed(seed_beambkg); - - // Will be used to extract file ID number - daIDNuInt->SetNDigitsFileIDNumber(5); - daBeamBkg->SetNDigitsFileIDNumber(6); - - // Load input files from text file - daIDNuInt->LoadFiles(fInFileTextIDNuInt.c_str()); - daBeamBkg->LoadFiles(fInFileTextBeamBkg.c_str()); - - // Set number of ID interactions per spill - daIDNuInt->SetInteractionRate(fIDNuIntRate); - daBeamBkg->SetInteractionRate(fBeamBkgRate); - - // Mange neutrino interaction timing - // Currently, T2K's 8 bunched beam structure is assumed - BeamTiming *bt = new BeamTiming(seed_beamtiming); - - // Set number of spills that will be saved per output file - daPileUp->SetNumOfSpillesSavedPerFile(fNumOfSpillsPerFile); - - // Some TTree objects contained in input files will be copied into output files. - // It is assumed that all these objects are identical among input files. - // So. will copy these objects from one of input files - daPileUp->SetFileNameForCopyTree(daIDNuInt->GetCurrentInputFileName()); - - // Create output file. Its name will be something like "OutFileNamePrefix".00000.root - daPileUp->CreateTree(fOutFileNamePrefix.c_str()); - - float nuIntTime; // interaction time - int nuIntBunch; // bunch id number - const int PCTLVerbose = (int)fTotalNumofSpills/10; - std::cout<<" Will be generating " << fTotalNumofSpills <<" pile-up spills " <DrawNumOfInteraction(); - int nThisBeamBkg = daBeamBkg->DrawNumOfInteraction(); - if( i%PCTLVerbose==0 ) - { - cout<<" i:" << i - <<" nIDNuInt:" << nThisIDNuInt - <<" nBeamBkg:" << nThisBeamBkg - <Next(); - // Drawing interaction time and bunch at which this interaction is taking place - bt->DrawInteractionTime(nuIntTime, nuIntBunch); - - // Add true hits of this interaction to MDT - daIDNuInt->AddTrueHitsToMDT(MDT, nuIntTime); - - // Add information about this interaction - daPileUp->AddInteraction(daIDNuInt, nuIntTime, nuIntBunch); - } - - // Repeating the above, but for beam bkg interactions - for(int j=0; jNext(); - - bt->DrawInteractionTime(nuIntTime, nuIntBunch); - daBeamBkg->AddTrueHitsToMDT(MDT, nuIntTime); - daPileUp->AddInteraction(daBeamBkg, nuIntTime, nuIntBunch); - } - - // Now all the true hits have been merged into one spill - // Add dark noise hits, and then make digitized hits - MDT->DoAddDark(); - MDT->DoDigitize(); - MDT->DoTrigger(); - - // Add the resultant digitized hits to the output - daPileUp->AddDigiHits(MDT); - daPileUp->FillTree(); - - // Clear all the true and digitized hits of this spill for the next spill - MDT->DoInitialize(); - } - - daIDNuInt->CloseFile(); - daBeamBkg->CloseFile(); - daPileUp->WriteTree(); - - Conf = Configuration::GetInstance(); - Conf->Finalize(); - - std::cout<<" ** FINISHED ** " <ReadParameter(fMDTParFileName); + Conf->PrintParameters(); + Conf = 0; + + TRandom3* rndm = new TRandom3(fSeed); + const int seed_mdt = rndm->Integer(1000000); + const int seed_idnuint = rndm->Integer(1000000); + const int seed_beambkg = rndm->Integer(1000000); + const int seed_beamtiming = rndm->Integer(1000000); + delete rndm; + rndm = 0; + + // Will be manaing marging true hits and digitizing merged true hits + MDTManager* MDT = new MDTManager(seed_mdt); + + // Manage input files for ID interactions + WCRootDataIDNuInt* daIDNuInt = new WCRootDataIDNuInt(); + + // Manage input files for Beam background interactions + WCRootDataBeamBkg* daBeamBkg = new WCRootDataBeamBkg(); + + // Manage pile-up spills (i.e. results of this program) + WCRootDataPileUpSpill* daPileUp = new WCRootDataPileUpSpill(); + + // Initialize random number generator + daIDNuInt->SetSeed(seed_idnuint); + daBeamBkg->SetSeed(seed_beambkg); + + // Will be used to extract file ID number + daIDNuInt->SetNDigitsFileIDNumber(5); + daBeamBkg->SetNDigitsFileIDNumber(6); + + // Load input files from text file + daIDNuInt->LoadFiles(fInFileTextIDNuInt.c_str()); + daBeamBkg->LoadFiles(fInFileTextBeamBkg.c_str()); + + // Set number of ID interactions per spill + daIDNuInt->SetInteractionRate(fIDNuIntRate); + daBeamBkg->SetInteractionRate(fBeamBkgRate); + + // Mange neutrino interaction timing + // Currently, T2K's 8 bunched beam structure is assumed + BeamTiming* bt = new BeamTiming(seed_beamtiming); + + // Set number of spills that will be saved per output file + daPileUp->SetNumOfSpillesSavedPerFile(fNumOfSpillsPerFile); + + // Some TTree objects contained in input files will be copied into output files. + // It is assumed that all these objects are identical among input files. + // So. will copy these objects from one of input files + daPileUp->SetFileNameForCopyTree(daIDNuInt->GetCurrentInputFileName()); + + // Create output file. Its name will be something like "OutFileNamePrefix".00000.root + daPileUp->CreateTree(fOutFileNamePrefix.c_str()); + + float nuIntTime; // interaction time + int nuIntBunch; // bunch id number + const int PCTLVerbose = (int)fTotalNumofSpills / 10; + std::cout << " Will be generating " << fTotalNumofSpills << " pile-up spills " << std::endl; + for(int i = 0; i < fTotalNumofSpills; i++) { + // Number of ID/Beam bkg interactions of this spill + int nThisIDNuInt = daIDNuInt->DrawNumOfInteraction(); + int nThisBeamBkg = daBeamBkg->DrawNumOfInteraction(); + if(i % PCTLVerbose == 0) { + cout << " i:" << i << " nIDNuInt:" << nThisIDNuInt << " nBeamBkg:" << nThisBeamBkg << endl; + } + + // ID interactions + for(int j = 0; j < nThisIDNuInt; j++) { + daIDNuInt->Next(); + // Drawing interaction time and bunch at which this interaction is taking place + bt->DrawInteractionTime(nuIntTime, nuIntBunch); + + // Add true hits of this interaction to MDT + daIDNuInt->AddTrueHitsToMDT(MDT, nuIntTime); + + // Add information about this interaction + daPileUp->AddInteraction(daIDNuInt, nuIntTime, nuIntBunch); + } + + // Repeating the above, but for beam bkg interactions + for(int j = 0; j < nThisBeamBkg; j++) { + daBeamBkg->Next(); + + bt->DrawInteractionTime(nuIntTime, nuIntBunch); + daBeamBkg->AddTrueHitsToMDT(MDT, nuIntTime); + daPileUp->AddInteraction(daBeamBkg, nuIntTime, nuIntBunch); + } + + // Now all the true hits have been merged into one spill + // Add dark noise hits, and then make digitized hits + MDT->DoAddDark(); + MDT->DoDigitize(); + MDT->DoTrigger(); + + // Add the resultant digitized hits to the output + daPileUp->AddDigiHits(MDT); + daPileUp->FillTree(); + + // Clear all the true and digitized hits of this spill for the next spill + MDT->DoInitialize(); + } + + daIDNuInt->CloseFile(); + daBeamBkg->CloseFile(); + daPileUp->WriteTree(); + + Conf = Configuration::GetInstance(); + Conf->Finalize(); + + std::cout << " ** FINISHED ** " << std::endl; } - -void ReadConfiguration(const char *filename) -{ - Configuration *Conf = Configuration::GetInstance(); - Conf->ReadParameter(std::string(filename)); - Conf->PrintParameters(); - Conf->GetValue("ListIDNuIntFiles", fInFileTextIDNuInt); - Conf->GetValue("ListBeamBkgFiles", fInFileTextBeamBkg); - Conf->GetValue("OutFileNamePrefix", fOutFileNamePrefix); - Conf->GetValue("MDTParFile", fMDTParFileName); - Conf->GetValue("InitialSeed", fSeed); - Conf->GetValue("NumOfSpillsSavedPerFile", fNumOfSpillsPerFile); - Conf->GetValue("IDNuIntRate", fIDNuIntRate); - Conf->GetValue("BeamBkgRate", fBeamBkgRate); - Conf->GetValue("TotalNumOfSpills", fTotalNumofSpills); - Conf->Finalize(); +void ReadConfiguration(const char* filename) { + Configuration* Conf = Configuration::GetInstance(); + Conf->ReadParameter(std::string(filename)); + Conf->PrintParameters(); + Conf->GetValue("ListIDNuIntFiles", fInFileTextIDNuInt); + Conf->GetValue("ListBeamBkgFiles", fInFileTextBeamBkg); + Conf->GetValue("OutFileNamePrefix", fOutFileNamePrefix); + Conf->GetValue("MDTParFile", fMDTParFileName); + Conf->GetValue("InitialSeed", fSeed); + Conf->GetValue("NumOfSpillsSavedPerFile", fNumOfSpillsPerFile); + Conf->GetValue("IDNuIntRate", fIDNuIntRate); + Conf->GetValue("BeamBkgRate", fBeamBkgRate); + Conf->GetValue("TotalNumOfSpills", fTotalNumofSpills); + Conf->Finalize(); } diff --git a/app/application/appHKHybridSingleEvent.cc b/app/application/appHKHybridSingleEvent.cc index 23e799f..f82b459 100644 --- a/app/application/appHKHybridSingleEvent.cc +++ b/app/application/appHKHybridSingleEvent.cc @@ -10,88 +10,97 @@ using std::endl; using std::string; using std::vector; -int fNEvtToProc = -1; -int fSeed = 67592; +int fNEvtToProc = -1; +int fSeed = 67592; string fParFileName = ""; -string fInFileName = ""; +string fInFileName = ""; string fOutFileName = ""; bool ParseCmdArguments(int, char**); -int main(int argc, char **argv) -{ - ParseCmdArguments(argc, argv); +int main(int argc, char** argv) { + ParseCmdArguments(argc, argv); - Configuration *Conf = Configuration::GetInstance(); - Conf->ReadParameter(fParFileName); - Conf->PrintParameters(); - Conf = 0; + Configuration* Conf = Configuration::GetInstance(); + Conf->ReadParameter(fParFileName); + Conf->PrintParameters(); + Conf = 0; + const int NPMTType = 2; + string fPMTType[NPMTType]; + fPMTType[0] = "BoxandLine20inchHQE"; + fPMTType[1] = "PMT3inchR14374"; - const int NPMTType = 2; - string fPMTType[NPMTType]; - fPMTType[0] = "BoxandLine20inchHQE"; - fPMTType[1] = "PMT3inchR14374"; + MDTManager* MDT = new MDTManager(fSeed); + MDT->RegisterPMTType(fPMTType[0], new ResponseBoxandLine20inchHQE()); + MDT->RegisterPMTType(fPMTType[1], new Response3inchR14374()); - MDTManager *MDT = new MDTManager(fSeed); - MDT->RegisterPMTType(fPMTType[0], new ResponseBoxandLine20inchHQE()); - MDT->RegisterPMTType(fPMTType[1], new Response3inchR14374()); + const vector listWCRootEvt { "wcsimrootevent", "wcsimrootevent2" }; - const vector listWCRootEvt{"wcsimrootevent", "wcsimrootevent2"}; + WCRootData* inData = new WCRootData(); + WCRootData* outData = new WCRootData(); - WCRootData *inData = new WCRootData(); - WCRootData *outData = new WCRootData(); + inData->ReadFile(fInFileName.c_str(), listWCRootEvt); + outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); - inData->ReadFile(fInFileName.c_str(), listWCRootEvt); - outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); + const int nEntries = inData->GetEntries(); + const float toffset = 0.; // for IWCD pile-up event generation - const int nEntries = inData->GetEntries(); - const float toffset = 0.; // for IWCD pile-up event generation + cout << " Start processing " << nEntries << " entries........ " << endl; + for(int iEntry = 0; iEntry < nEntries; iEntry++) { + inData->GetEntry(iEntry); - cout<<" Start processing " << nEntries <<" entries........ " <GetEntry(iEntry); + outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); + for(int j = 0; j < NPMTType; j++) { + inData->AddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), + MDT->GetPMTResponse(fPMTType[j]), + toffset, + j); + MDT->DoAddDark(fPMTType[j]); + MDT->DoDigitize(fPMTType[j]); + MDT->DoTrigger(fPMTType[j]); - outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); - for(int j=0; jAddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), MDT->GetPMTResponse(fPMTType[j]), toffset, j); - MDT->DoAddDark(fPMTType[j]); - MDT->DoDigitize(fPMTType[j]); - MDT->DoTrigger(fPMTType[j]); - - TriggerInfo *ti = MDT->GetTriggerInfo(fPMTType[j]); - outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); - } - outData->FillTree(); + TriggerInfo* ti = MDT->GetTriggerInfo(fPMTType[j]); + outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); + } + outData->FillTree(); - MDT->DoInitialize(); - } - outData->WriteTree(); - inData->CloseFile(); + MDT->DoInitialize(); + } + outData->WriteTree(); + inData->CloseFile(); } - -bool ParseCmdArguments(int argc, char **argv) -{ - cout<<" Parsing command line arguments..... " < #include #include -#include "MDTManager.h" +#include "MDTManager.h" #include "WCRootData.h" // PMT type used for 3-inch PMTs of WCTE @@ -22,92 +23,103 @@ using std::endl; using std::string; using std::vector; -int fNEvtToProc = -1; -int fSeed = 67592; +int fNEvtToProc = -1; +int fSeed = 67592; string fParFileName = ""; -string fInFileName = ""; +string fInFileName = ""; string fOutFileName = ""; bool ParseCmdArguments(int, char**); -int main(int argc, char **argv) -{ - ParseCmdArguments(argc, argv); +int main(int argc, char** argv) { + ParseCmdArguments(argc, argv); - Configuration *Conf = Configuration::GetInstance(); - Conf->ReadParameter(fParFileName); - Conf->PrintParameters(); - Conf = 0; + Configuration* Conf = Configuration::GetInstance(); + Conf->ReadParameter(fParFileName); + Conf->PrintParameters(); + Conf = 0; // WCTE will use single PMT type, so define the corresponding type of 3-inch PMT - const int NPMTType = 1; - string fPMTType[NPMTType]; - fPMTType[0] = "PMT3inchR12199_02"; + const int NPMTType = 1; + string fPMTType[NPMTType]; + fPMTType[0] = "PMT3inchR12199_02"; - MDTManager *MDT = new MDTManager(fSeed); - MDT->RegisterPMTType(fPMTType[0], new PMTResponse3inchR12199_02()); + MDTManager* MDT = new MDTManager(fSeed); + MDT->RegisterPMTType(fPMTType[0], new PMTResponse3inchR12199_02()); - const vector listWCRootEvt{"wcsimrootevent"}; + const vector listWCRootEvt { "wcsimrootevent" }; // WCRootData is an interface class between MDT and WCSim root file - WCRootData *inData = new WCRootData(); - WCRootData *outData = new WCRootData(); + WCRootData* inData = new WCRootData(); + WCRootData* outData = new WCRootData(); // Read input WCSim file - inData->ReadFile(fInFileName.c_str(), listWCRootEvt); + inData->ReadFile(fInFileName.c_str(), listWCRootEvt); // Create TTrees to be saved in the output file - outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); - - int nEntries = inData->GetEntries(); - const float toffset = 0.; // for IWCD pile-up event generation -> just ignore - - if (fNEvtToProc>0 && fNEvtToProcGetEntry(iEntry); - - outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); - for(int j=0; jAddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), MDT->GetPMTResponse(fPMTType[j]), toffset, j); - MDT->DoAddDark(fPMTType[j]); - MDT->DoDigitize(fPMTType[j]); - MDT->DoTrigger(fPMTType[j]); - - TriggerInfo *ti = MDT->GetTriggerInfo(fPMTType[j]); - outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); - } - outData->FillTree(); - - MDT->DoInitialize(); - } - outData->WriteTree(); - inData->CloseFile(); -} + outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); + + int nEntries = inData->GetEntries(); + const float toffset = 0.; // for IWCD pile-up event generation -> just ignore + + if(fNEvtToProc > 0 && fNEvtToProc < nEntries) + nEntries = fNEvtToProc; + + cout << " Start processing " << nEntries << " entries........ " << endl; + for(int iEntry = 0; iEntry < nEntries; iEntry++) { + inData->GetEntry(iEntry); + + outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); + for(int j = 0; j < NPMTType; j++) { + inData->AddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), + MDT->GetPMTResponse(fPMTType[j]), + toffset, + j); + MDT->DoAddDark(fPMTType[j]); + MDT->DoDigitize(fPMTType[j]); + MDT->DoTrigger(fPMTType[j]); + + TriggerInfo* ti = MDT->GetTriggerInfo(fPMTType[j]); + outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); + } + outData->FillTree(); + MDT->DoInitialize(); + } + outData->WriteTree(); + inData->CloseFile(); +} -bool ParseCmdArguments(int argc, char **argv) -{ - cout<<" Parsing command line arguments..... " <Branch("NNuIntTot", &NNuIntTot, "NNuIntTot/i"); - t->Branch("NIDNuInt", &NIDNuInt, "NIDNuInt/i"); - t->Branch("NBeamBkg", &NBeamBkg, "NBeamBkg/i"); - t->Branch("NuIntType", NuIntType, "NuIntType[NNuIntTot]/i"); - t->Branch("NuIntTime", NuIntTime, "NuIntTime[NNuIntTot]/F"); - t->Branch("NuIntBunch", NuIntBunch, "NuIntBunch[NNuIntTot]/i"); - t->Branch("NuPDG", NuPDG, "NuPDG[NNuIntTot]/I"); - t->Branch("NuEne", NuEne, "NuEne[NNuIntTot]/F"); - t->Branch("NuPos", NuPos, "NuPos[NNuIntTot][3]/F"); - t->Branch("NuDir", NuDir, "NuDir[NNuIntTot][3]/F"); - t->Branch("EdepoOD", EdepoOD, "EdepoOD[NNuIntTot]/F"); - t->Branch("FileIdNum", FileIdNum, "FileIdNum[NNuIntTot]/i"); - t->Branch("EventIdNum", EventIdNum, "EventIdNum[NNuIntTot]/i"); - t->Branch("NTracks", &NTracks, "NTracks/i"); - t->Branch("TrackNuIntIdx", TrackNuIntIdx, "TrackNuIntIdx[NTracks]/i"); - } + void Clear() { + NNuIntTot = 0; + NIDNuInt = 0; + NBeamBkg = 0; + for(int i = 0; i < kMaxNuInt; i++) { + NuIntType[i] = 99999; + NuIntTime[i] = -99999.; + NuIntBunch[i] = 99999; + EdepoOD[i] = -99999.; + Mode[i] = -99999; + NuPDG[i] = -99999; + NuEne[i] = -99999.; + for(int j = 0; j < 3; j++) { + NuPos[i][j] = -99999.; + NuDir[i][j] = -99999.; + } + FileIdNum[i] = 99999; + EventIdNum[i] = 99999; + } + NTracks = 0; + for(int i = 0; i < kMaxTracks; i++) { + TrackNuIntIdx[i] = 99999; + } + } - void SetBranch(TTree *t) - { - t->SetBranchAddress("NNuIntTot", &NNuIntTot); - t->SetBranchAddress("NIDNuInt", &NIDNuInt); - t->SetBranchAddress("NBeamBkg", &NBeamBkg); - t->SetBranchAddress("NuIntType", NuIntType); - t->SetBranchAddress("NuIntTime", NuIntTime); - t->SetBranchAddress("NuIntBunch", NuIntBunch); - t->SetBranchAddress("Mode", Mode); - t->SetBranchAddress("NuPDG", NuPDG); - t->SetBranchAddress("NuEne", NuEne); - t->SetBranchAddress("NuPos", NuPos); - t->SetBranchAddress("NuDir", NuDir); - t->SetBranchAddress("EdepoOD", EdepoOD); - t->SetBranchAddress("FileIdNum", FileIdNum); - t->SetBranchAddress("EventIdNum", EventIdNum); - t->SetBranchAddress("NTracks", &NTracks); - t->SetBranchAddress("TrackNuIntIdx", TrackNuIntIdx); - } + void CreateBranch(TTree* t) { + t->Branch("NNuIntTot", &NNuIntTot, "NNuIntTot/i"); + t->Branch("NIDNuInt", &NIDNuInt, "NIDNuInt/i"); + t->Branch("NBeamBkg", &NBeamBkg, "NBeamBkg/i"); + t->Branch("NuIntType", NuIntType, "NuIntType[NNuIntTot]/i"); + t->Branch("NuIntTime", NuIntTime, "NuIntTime[NNuIntTot]/F"); + t->Branch("NuIntBunch", NuIntBunch, "NuIntBunch[NNuIntTot]/i"); + t->Branch("NuPDG", NuPDG, "NuPDG[NNuIntTot]/I"); + t->Branch("NuEne", NuEne, "NuEne[NNuIntTot]/F"); + t->Branch("NuPos", NuPos, "NuPos[NNuIntTot][3]/F"); + t->Branch("NuDir", NuDir, "NuDir[NNuIntTot][3]/F"); + t->Branch("EdepoOD", EdepoOD, "EdepoOD[NNuIntTot]/F"); + t->Branch("FileIdNum", FileIdNum, "FileIdNum[NNuIntTot]/i"); + t->Branch("EventIdNum", EventIdNum, "EventIdNum[NNuIntTot]/i"); + t->Branch("NTracks", &NTracks, "NTracks/i"); + t->Branch("TrackNuIntIdx", TrackNuIntIdx, "TrackNuIntIdx[NTracks]/i"); + } + + void SetBranch(TTree* t) { + t->SetBranchAddress("NNuIntTot", &NNuIntTot); + t->SetBranchAddress("NIDNuInt", &NIDNuInt); + t->SetBranchAddress("NBeamBkg", &NBeamBkg); + t->SetBranchAddress("NuIntType", NuIntType); + t->SetBranchAddress("NuIntTime", NuIntTime); + t->SetBranchAddress("NuIntBunch", NuIntBunch); + t->SetBranchAddress("Mode", Mode); + t->SetBranchAddress("NuPDG", NuPDG); + t->SetBranchAddress("NuEne", NuEne); + t->SetBranchAddress("NuPos", NuPos); + t->SetBranchAddress("NuDir", NuDir); + t->SetBranchAddress("EdepoOD", EdepoOD); + t->SetBranchAddress("FileIdNum", FileIdNum); + t->SetBranchAddress("EventIdNum", EventIdNum); + t->SetBranchAddress("NTracks", &NTracks); + t->SetBranchAddress("TrackNuIntIdx", TrackNuIntIdx); + } }; diff --git a/app/utilities/WCRootData/include/RedNRTVtx_t.h b/app/utilities/WCRootData/include/RedNRTVtx_t.h index cb8790a..ce3e828 100644 --- a/app/utilities/WCRootData/include/RedNRTVtx_t.h +++ b/app/utilities/WCRootData/include/RedNRTVtx_t.h @@ -4,73 +4,63 @@ const int kMaxIntVtx = 1000; -struct RedNRTVtx_t -{ - Int_t NIntVtx; - Int_t Mode[kMaxIntVtx]; - Float_t NuEne[kMaxIntVtx]; - Int_t NuPDG[kMaxIntVtx]; - Float_t NuPos[kMaxIntVtx][3]; - Float_t NuDir[kMaxIntVtx][3]; - Float_t LepDir[kMaxIntVtx][3]; - Float_t LepMom[kMaxIntVtx]; +struct RedNRTVtx_t { + Int_t NIntVtx; + Int_t Mode[kMaxIntVtx]; + Float_t NuEne[kMaxIntVtx]; + Int_t NuPDG[kMaxIntVtx]; + Float_t NuPos[kMaxIntVtx][3]; + Float_t NuDir[kMaxIntVtx][3]; + Float_t LepDir[kMaxIntVtx][3]; + Float_t LepMom[kMaxIntVtx]; - void Clear() - { - NIntVtx = 0; - for(Int_t i=0; iBranch("NIntVtx", &NIntVtx, "NIntVtx/I"); - t->Branch("Mode", Mode, "Mode[NIntVtx]/I"); - t->Branch("NuPDG", NuPDG, "NuPDG[NIntVtx]/I"); - t->Branch("NuEne", NuEne, "NuEne[NIntVtx]/F"); - t->Branch("NuPos", NuPos, "NuPos[NIntVtx][3]/F"); - t->Branch("NuDir", NuDir, "NuDir[NIntVtx][3]/F"); - t->Branch("LepDir", LepDir, "LepDir[NIntVtx][3]/F"); - t->Branch("LepMom", LepMom, "LepMom[NIntVtx]/F"); - } - - void SetBranch(TTree *t) - { - t->SetBranchAddress("NIntVtx", &NIntVtx); - t->SetBranchAddress("Mode", Mode); - t->SetBranchAddress("NuPDG", NuPDG); - t->SetBranchAddress("NuEne", NuEne); - t->SetBranchAddress("NuPos", NuPos); - t->SetBranchAddress("NuDir", NuDir); - t->SetBranchAddress("LepDir", LepDir); - t->SetBranchAddress("LepMom", LepMom); - } -}; + void AddVertex(const RedNRTVtx_t& r, const int i) { + Mode[NIntVtx] = r.Mode[i]; + NuEne[NIntVtx] = r.NuEne[i]; + NuPDG[NIntVtx] = r.NuPDG[i]; + for(Int_t j = 0; j < 3; j++) { + NuPos[NIntVtx][j] = r.NuPos[i][j]; + NuDir[NIntVtx][j] = r.NuDir[i][j]; + LepDir[NIntVtx][j] = r.LepDir[i][j]; + } + LepMom[NIntVtx] = r.LepMom[i]; + NIntVtx += 1; + } + void CreateBranch(TTree* t) { + t->Branch("NIntVtx", &NIntVtx, "NIntVtx/I"); + t->Branch("Mode", Mode, "Mode[NIntVtx]/I"); + t->Branch("NuPDG", NuPDG, "NuPDG[NIntVtx]/I"); + t->Branch("NuEne", NuEne, "NuEne[NIntVtx]/F"); + t->Branch("NuPos", NuPos, "NuPos[NIntVtx][3]/F"); + t->Branch("NuDir", NuDir, "NuDir[NIntVtx][3]/F"); + t->Branch("LepDir", LepDir, "LepDir[NIntVtx][3]/F"); + t->Branch("LepMom", LepMom, "LepMom[NIntVtx]/F"); + } + void SetBranch(TTree* t) { + t->SetBranchAddress("NIntVtx", &NIntVtx); + t->SetBranchAddress("Mode", Mode); + t->SetBranchAddress("NuPDG", NuPDG); + t->SetBranchAddress("NuEne", NuEne); + t->SetBranchAddress("NuPos", NuPos); + t->SetBranchAddress("NuDir", NuDir); + t->SetBranchAddress("LepDir", LepDir); + t->SetBranchAddress("LepMom", LepMom); + } +}; diff --git a/app/utilities/WCRootData/include/SpillAnalyzer.h b/app/utilities/WCRootData/include/SpillAnalyzer.h index f59e71e..48c0ff6 100644 --- a/app/utilities/WCRootData/include/SpillAnalyzer.h +++ b/app/utilities/WCRootData/include/SpillAnalyzer.h @@ -8,14 +8,17 @@ using std::endl; class WCRootDataPileUpSpill; -class SpillAnalyzer -{ - public: - SpillAnalyzer(); - virtual ~SpillAnalyzer(); +class SpillAnalyzer { + public: - bool IsSingleIDIneractionAtBunch(const WCRootDataPileUpSpill*, const int, int&); - bool HasMichelEFromOtherInteractionAtBunch(const WCRootDataPileUpSpill*, const int, const float, const float); + SpillAnalyzer(); + virtual ~SpillAnalyzer(); + + bool IsSingleIDIneractionAtBunch(const WCRootDataPileUpSpill*, const int, int&); + bool HasMichelEFromOtherInteractionAtBunch(const WCRootDataPileUpSpill*, + const int, + const float, + const float); }; #endif diff --git a/app/utilities/WCRootData/include/WCRootData.h b/app/utilities/WCRootData/include/WCRootData.h index 6db8271..0c56610 100644 --- a/app/utilities/WCRootData/include/WCRootData.h +++ b/app/utilities/WCRootData/include/WCRootData.h @@ -1,76 +1,79 @@ #ifndef WCROOTDATA_H #define WCROOTDATA_H -#include -#include #include -#include +#include #include +#include #include +#include -#include "TFile.h" -#include "TChain.h" -#include "TTree.h" #include "TBranch.h" +#include "TChain.h" #include "TClonesArray.h" +#include "TFile.h" +#include "TTree.h" +#include "TNRooTrackerVtx.hh" #include "WCSimRootEvent.hh" #include "WCSimRootGeom.hh" -#include "TNRooTrackerVtx.hh" #include "MDTManager.h" using std::cout; using std::endl; -using std::vector; -using std::string; using std::map; using std::pair; +using std::string; +using std::vector; + +class WCRootData { + public: + + WCRootData(); + virtual ~WCRootData(); + + void ReadFile(const char*, const vector& v = vector()); + void CloseFile(); + + void CreateTree(const char*, const vector& v = vector()); + virtual void FillTree(); + virtual void WriteTree(); -class WCRootData -{ - public: - WCRootData(); - virtual ~WCRootData(); + void GetGeometryInfo(const char*); + void CopyTree(const char*, const char*, const vector& v = vector()); - void ReadFile(const char*, const vector &v=vector()); - void CloseFile(); + void SetOutFileName(const char* f) { fOutFileName = TString(f); } - void CreateTree(const char*, const vector &v=vector()); - virtual void FillTree(); - virtual void WriteTree(); + int GetEntries(); + void GetEntry(int); - void GetGeometryInfo(const char*); - void CopyTree(const char*, const char*, const vector&v=vector()); - void SetOutFileName(const char *f){ fOutFileName = TString(f); } + WCSimRootTrigger* GetTrigger(int i, int iPMT = 0) const { return fSpEvt[iPMT]->GetTrigger(i); } - int GetEntries(); - void GetEntry(int); + void AddTrueHitsToMDT(MDTManager*); + void AddTrueHitsToMDT(HitTubeCollection*, PMTResponse*, float offset_time = 0., int iPMT = 0); + void AddDigiHits(MDTManager*, int event_id = 0, int iPMT = 0); + void AddDigiHits(HitTubeCollection* hc, TriggerInfo* ti, int even_it = 0, int iPMT = 0); + void AddTracks(const WCSimRootTrigger*, float offset_time = 0., int iPMT = 0); - WCSimRootTrigger *GetTrigger(int i, int iPMT=0) const { return fSpEvt[iPMT]->GetTrigger(i); } + const char* GetCurrentInputFileName() const { return fWCSimC->GetFile()->GetName(); } - void AddTrueHitsToMDT(MDTManager*); - void AddTrueHitsToMDT(HitTubeCollection*, PMTResponse*, float offset_time=0., int iPMT=0); - void AddDigiHits(MDTManager*, int event_id=0, int iPMT=0); - void AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int even_it=0, int iPMT=0); - void AddTracks(const WCSimRootTrigger*, float offset_time=0., int iPMT=0); + protected: - const char *GetCurrentInputFileName() const { return fWCSimC->GetFile()->GetName(); } + TChain* fWCSimC; + TTree* fWCSimT; + vector fSpEvt; + WCSimRootGeom* fWCGeom; - protected: - TChain *fWCSimC; - TTree *fWCSimT; - vector fSpEvt; - WCSimRootGeom *fWCGeom; + Float_t fDetCentreY; - Float_t fDetCentreY; + float fHitTimeOffset; + bool fMultDigiHits; - float fHitTimeOffset; - bool fMultDigiHits; + private: - private: void SetTubes(HitTubeCollection*, const int); - TString fOutFileName; + TString fOutFileName; }; #endif diff --git a/app/utilities/WCRootData/include/WCRootDataBeamBkg.h b/app/utilities/WCRootData/include/WCRootDataBeamBkg.h index d63ee19..3a0015e 100644 --- a/app/utilities/WCRootData/include/WCRootDataBeamBkg.h +++ b/app/utilities/WCRootData/include/WCRootDataBeamBkg.h @@ -5,20 +5,22 @@ class WCRootDataNuInt; -class WCRootDataBeamBkg : public WCRootDataNuInt -{ - public : - WCRootDataBeamBkg(); - virtual ~WCRootDataBeamBkg(); +class WCRootDataBeamBkg : public WCRootDataNuInt { + public: - void LoadFiles(const char *); - float GetEnergyDepositionInOD() const { return fEdepoOD; } + WCRootDataBeamBkg(); + virtual ~WCRootDataBeamBkg(); - private : - void ReadFriend(const char*); - void CloseFriend(); + void LoadFiles(const char*); - Int_t fgrNPart; - Float_t fEdepoOD; + float GetEnergyDepositionInOD() const { return fEdepoOD; } + + private: + + void ReadFriend(const char*); + void CloseFriend(); + + Int_t fgrNPart; + Float_t fEdepoOD; }; #endif diff --git a/app/utilities/WCRootData/include/WCRootDataIDNuInt.h b/app/utilities/WCRootData/include/WCRootDataIDNuInt.h index 9f9c3d9..4cb193f 100644 --- a/app/utilities/WCRootData/include/WCRootDataIDNuInt.h +++ b/app/utilities/WCRootData/include/WCRootDataIDNuInt.h @@ -1,23 +1,24 @@ #ifndef WCROOTDATA_IDNUINT_H #define WCROOTDATA_IDNUINT_H -#include "WCRootDataNuInt.h" #include "RedNRTVtx_t.h" +#include "WCRootDataNuInt.h" class WCRootDataNuInt; -class WCRootDataIDNuInt : public WCRootDataNuInt -{ - public : - WCRootDataIDNuInt(); - virtual ~WCRootDataIDNuInt(); +class WCRootDataIDNuInt : public WCRootDataNuInt { + public: + + WCRootDataIDNuInt(); + virtual ~WCRootDataIDNuInt(); + + void LoadFiles(const char*); + void SetInteractionInformation(PileUpSpill_t*) const; - void LoadFiles(const char*); - void SetInteractionInformation(PileUpSpill_t*) const; + private: - private : - void ReadFriend(const char*); - void CloseFriend(); - RedNRTVtx_t fNRTVtx; + void ReadFriend(const char*); + void CloseFriend(); + RedNRTVtx_t fNRTVtx; }; #endif diff --git a/app/utilities/WCRootData/include/WCRootDataNuInt.h b/app/utilities/WCRootData/include/WCRootDataNuInt.h index e55083c..3478ec4 100644 --- a/app/utilities/WCRootData/include/WCRootDataNuInt.h +++ b/app/utilities/WCRootData/include/WCRootDataNuInt.h @@ -2,61 +2,65 @@ #define WCROOTDATANUINT_H #include +#include "PileUpSpill_t.h" #include "TRandom3.h" #include "WCRootData.h" -#include "PileUpSpill_t.h" using std::stringstream; class WCRootData; -enum ENuIntType{ eIDNuInt=0, - eBeamBkg, - eSingle - }; - -class WCRootDataNuInt : public WCRootData -{ - public: - WCRootDataNuInt(); - virtual ~WCRootDataNuInt(); - - void SetSeed(const int i){ fRnd->SetSeed(i); } - void LoadFiles(const char*); - virtual bool Next(); - - void SetNDigitsFileIDNumber(int i){ fNDigitsFileIdNum = i; } - int GetEventIdNumber() const { return fItrEntry-1; } - int GetFileIdNumber() const { return fFileIdNum; } - - void SetInteractionRate(const float f) { fIntRate = f; } - int DrawNumOfInteraction() const { return fRnd->Poisson(fIntRate); } - - unsigned GetInteractionType() const { return fNuIntType; } - virtual float GetEnergyDepositionInOD() const { return 0.; } - virtual void SetInteractionInformation(PileUpSpill_t*) const {}; - - protected: - int GetFileIdNumber(const char*, const char *prefix="wcsim."); - - virtual void ReadFriend(const char* f){ cout<<" Reading friend: " << f <> fFileList; - std::vector> fFriendList; - TChain *fFriendC; - - bool fHasFriend; - unsigned int fNuIntType; - - - int fItrEntry; - int fItrFile; - int fNumEntries; - int fNumFiles; - int fFileIdNum; - int fNDigitsFileIdNum; - float fIntRate; +enum ENuIntType { eIDNuInt = 0, eBeamBkg, eSingle }; + +class WCRootDataNuInt : public WCRootData { + public: + + WCRootDataNuInt(); + virtual ~WCRootDataNuInt(); + + void SetSeed(const int i) { fRnd->SetSeed(i); } + + void LoadFiles(const char*); + virtual bool Next(); + + void SetNDigitsFileIDNumber(int i) { fNDigitsFileIdNum = i; } + + int GetEventIdNumber() const { return fItrEntry - 1; } + + int GetFileIdNumber() const { return fFileIdNum; } + + void SetInteractionRate(const float f) { fIntRate = f; } + + int DrawNumOfInteraction() const { return fRnd->Poisson(fIntRate); } + + unsigned GetInteractionType() const { return fNuIntType; } + + virtual float GetEnergyDepositionInOD() const { return 0.; } + + virtual void SetInteractionInformation(PileUpSpill_t*) const {}; + + protected: + + int GetFileIdNumber(const char*, const char* prefix = "wcsim."); + + virtual void ReadFriend(const char* f) { cout << " Reading friend: " << f << endl; }; + + virtual void CloseFriend() {}; + + TRandom3* fRnd; + std::vector> fFileList; + std::vector> fFriendList; + TChain* fFriendC; + + bool fHasFriend; + unsigned int fNuIntType; + + int fItrEntry; + int fItrFile; + int fNumEntries; + int fNumFiles; + int fFileIdNum; + int fNDigitsFileIdNum; + float fIntRate; }; #endif diff --git a/app/utilities/WCRootData/include/WCRootDataPileUpSpill.h b/app/utilities/WCRootData/include/WCRootDataPileUpSpill.h index 6d06390..455d192 100644 --- a/app/utilities/WCRootData/include/WCRootDataPileUpSpill.h +++ b/app/utilities/WCRootData/include/WCRootDataPileUpSpill.h @@ -1,53 +1,56 @@ #ifndef WCROOTDATAPILEUPSPILL_H #define WCROOTDATAPILEUPSPILL_H -#include #include +#include -#include "WCRootData.h" #include "PileUpSpill_t.h" +#include "WCRootData.h" using std::stringstream; class WCRootDataNuInt; -class WCRootDataPileUpSpill : public WCRootData -{ - public: - WCRootDataPileUpSpill(); - virtual ~WCRootDataPileUpSpill(); - - // For reading - void ReadFile(const char*); - void CloseFile(); - int GetEntries(); - void GetEntry(const int); - const PileUpSpill_t *GetPileUpSpill() const {return &fPupSpill;} - - void AddDigiHitsToMDT(MDTManager*, float, float, float); - - // For writing - // void SetOutFilePrefix(const char *f){ fOutFilePrefix = TString(f); } - void CreateTree(const char *f=0); - void FillTree(); - void WriteTree(); - void AddInteraction(const WCRootDataNuInt*, float offset_time=0., int bunch_id=99999); - - void SetNumOfSpillesSavedPerFile(const int i){ fNumOfSpillsPerFile = i; } - void SetFileNameForCopyTree(const char *f){ fFileNameToBeCopied = TString(f); } - - private: - void GetOutFileIdNumber(const int, TString&); - - TString fOutFilePrefix; - TString fPupSpillTreeName; - int fOutFileNum; - int fNumOfSpillsPerFile; - int fCurSpill; - - PileUpSpill_t fPupSpill; - TTree *fPupSpillT; - TChain *fPupSpillC; - - TString fFileNameToBeCopied; +class WCRootDataPileUpSpill : public WCRootData { + public: + + WCRootDataPileUpSpill(); + virtual ~WCRootDataPileUpSpill(); + + // For reading + void ReadFile(const char*); + void CloseFile(); + int GetEntries(); + void GetEntry(const int); + + const PileUpSpill_t* GetPileUpSpill() const { return &fPupSpill; } + + void AddDigiHitsToMDT(MDTManager*, float, float, float); + + // For writing + // void SetOutFilePrefix(const char *f){ fOutFilePrefix = TString(f); } + void CreateTree(const char* f = 0); + void FillTree(); + void WriteTree(); + void AddInteraction(const WCRootDataNuInt*, float offset_time = 0., int bunch_id = 99999); + + void SetNumOfSpillesSavedPerFile(const int i) { fNumOfSpillsPerFile = i; } + + void SetFileNameForCopyTree(const char* f) { fFileNameToBeCopied = TString(f); } + + private: + + void GetOutFileIdNumber(const int, TString&); + + TString fOutFilePrefix; + TString fPupSpillTreeName; + int fOutFileNum; + int fNumOfSpillsPerFile; + int fCurSpill; + + PileUpSpill_t fPupSpill; + TTree* fPupSpillT; + TChain* fPupSpillC; + + TString fFileNameToBeCopied; }; #endif diff --git a/app/utilities/WCRootData/src/BeamTiming.cc b/app/utilities/WCRootData/src/BeamTiming.cc index ecbe2e8..6ca27f8 100644 --- a/app/utilities/WCRootData/src/BeamTiming.cc +++ b/app/utilities/WCRootData/src/BeamTiming.cc @@ -1,18 +1,16 @@ #include "BeamTiming.h" -BeamTiming::BeamTiming(int seed) -{ - fRnd = new TRandom3(seed); +BeamTiming::BeamTiming(int seed) { + fRnd = new TRandom3(seed); } -BeamTiming::~BeamTiming() -{ - delete fRnd; fRnd = 0; +BeamTiming::~BeamTiming() { + delete fRnd; + fRnd = 0; } -void BeamTiming::DrawInteractionTime(float &time, int &iBunch) -{ - iBunch = fRnd->Integer(kNBunches); - float bunchTime = fRnd->Gaus(0., kBunchSigma); - time =(float)kBunchInterval*iBunch + bunchTime; +void BeamTiming::DrawInteractionTime(float& time, int& iBunch) { + iBunch = fRnd->Integer(kNBunches); + float bunchTime = fRnd->Gaus(0., kBunchSigma); + time = (float)kBunchInterval * iBunch + bunchTime; } diff --git a/app/utilities/WCRootData/src/SpillAnalyzer.cc b/app/utilities/WCRootData/src/SpillAnalyzer.cc index fb802e5..63e59ed 100644 --- a/app/utilities/WCRootData/src/SpillAnalyzer.cc +++ b/app/utilities/WCRootData/src/SpillAnalyzer.cc @@ -4,91 +4,86 @@ #include "WCRootDataPileUpSpill.h" #include "WCSimRootEvent.hh" -SpillAnalyzer::SpillAnalyzer() -{ -} - -SpillAnalyzer::~SpillAnalyzer() -{ -} +SpillAnalyzer::SpillAnalyzer() {} -bool SpillAnalyzer::IsSingleIDIneractionAtBunch(const WCRootDataPileUpSpill *input, const int bunch_id, int &nuIntIdx) -{ - nuIntIdx = -1; +SpillAnalyzer::~SpillAnalyzer() {} - const PileUpSpill_t *pup = input->GetPileUpSpill(); - float EdepoODTot[kNBunches] = {0.}; - int nIDNuInt = 0; - int nBeamBkg = 0; +bool SpillAnalyzer::IsSingleIDIneractionAtBunch(const WCRootDataPileUpSpill* input, + const int bunch_id, + int& nuIntIdx) { + nuIntIdx = -1; - for(int i=0; iNNuIntTot; i++) - { - EdepoODTot[pup->NuIntBunch[i]] += pup->EdepoOD[i]; - if( pup->NuIntBunch[i]==bunch_id ) - { - if( pup->NuIntType[i]==0 ){ nIDNuInt += 1; nuIntIdx = i; } - else if( pup->NuIntType[i]==1 ){ nBeamBkg += 1; } + const PileUpSpill_t* pup = input->GetPileUpSpill(); + float EdepoODTot[kNBunches] = { 0. }; + int nIDNuInt = 0; + int nBeamBkg = 0; - } - } + for(int i = 0; i < pup->NNuIntTot; i++) { + EdepoODTot[pup->NuIntBunch[i]] += pup->EdepoOD[i]; + if(pup->NuIntBunch[i] == bunch_id) { + if(pup->NuIntType[i] == 0) { + nIDNuInt += 1; + nuIntIdx = i; + } + else if(pup->NuIntType[i] == 1) { + nBeamBkg += 1; + } + } + } - if( !(EdepoODTot[bunch_id]<50. && nIDNuInt==1) ){ return false; } + if(!(EdepoODTot[bunch_id] < 50. && nIDNuInt == 1)) { + return false; + } - //cout<<" NNuIntTot:" << pup->NNuIntTot - // <<" EdepoODTot["<< bunch_id <<"]: " << EdepoODTot[bunch_id] - // <<" nIDNuInt: " << nIDNuInt - // <<" nBeamBkg: " << nBeamBkg - // <NNuIntTot + // <<" EdepoODTot["<< bunch_id <<"]: " << EdepoODTot[bunch_id] + // <<" nIDNuInt: " << nIDNuInt + // <<" nBeamBkg: " << nBeamBkg + // <GetPileUpSpill(); - const int bunch_id = pup->NuIntBunch[nuIntIdx]; - - const WCSimRootTrigger *aEvt = input->GetTrigger(0); - TClonesArray *tracks = aEvt->GetTracks(); - const int nTracks = tracks->GetEntries(); - if( nTracks!=pup->NTracks ) - { - cout<<" Number of tracks are different " <NTracks <GetPileUpSpill(); + const int bunch_id = pup->NuIntBunch[nuIntIdx]; + + const WCSimRootTrigger* aEvt = input->GetTrigger(0); + TClonesArray* tracks = aEvt->GetTracks(); + const int nTracks = tracks->GetEntries(); + if(nTracks != pup->NTracks) { + cout << " Number of tracks are different " << endl; + cout << " - WCSim tree: " << nTracks << endl; + cout << " - PileUpSpill tree: " << pup->NTracks << endl; + } - int nSIEleFromOtherNuInt = 0; - for(int i=0; iTrackNuIntIdx[i]==nuIntIdx ) - { - // Tracks associated with interaction of interest - continue; - } + int nSIEleFromOtherNuInt = 0; + for(int i = 0; i < nTracks; i++) { + if(pup->TrackNuIntIdx[i] == nuIntIdx) { + // Tracks associated with interaction of interest + continue; + } - WCSimRootTrack *aTrack = (WCSimRootTrack*)tracks->At(i); - Int_t ipnu = aTrack->GetIpnu(); - if( TMath::Abs( ipnu )!=11 ){ continue; } + WCSimRootTrack* aTrack = (WCSimRootTrack*)tracks->At(i); + Int_t ipnu = aTrack->GetIpnu(); + if(TMath::Abs(ipnu) != 11) { + continue; + } - Float_t time = aTrack->GetTime(); - if( time>time_low && timeTrackNuIntIdx[i] - <<" nuIntIdx: " << nuIntIdx - <GetTime(); + if(time > time_low && time < time_up) { + cout << " Found " << ipnu << " at t=" << time << " time_low:" << time_low + << " time_up: " << time_up << " TrackNuIntIdx: " << pup->TrackNuIntIdx[i] + << " nuIntIdx: " << nuIntIdx << endl; + nSIEleFromOtherNuInt += 1; + } + } - if( nSIEleFromOtherNuInt==0 ){ return false; } - //cout<<" nSIEleFromOtherNuInt: " << nSIEleFromOtherNuInt <GetValue("TimeOffset", fHitTimeOffset); - Conf->GetValue("FlagMultDigits", mult_flag); - - fMultDigiHits = bool(mult_flag); +WCRootData::WCRootData() { + fDetCentreY = 0.; + fWCGeom = 0; + fWCSimC = 0; + fWCSimT = 0; + fSpEvt.clear(); + fOutFileName = ""; + + int mult_flag = 1; + fHitTimeOffset = 0.; + + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue("TimeOffset", fHitTimeOffset); + Conf->GetValue("FlagMultDigits", mult_flag); + + fMultDigiHits = bool(mult_flag); } -WCRootData::~WCRootData() -{ - if( fWCGeom ){ delete fWCGeom; fWCGeom = 0; } - if( fWCSimT ){ delete fWCSimT; fWCSimT = 0; } - if( fWCSimC ){ delete fWCSimC; fWCSimC = 0; } - fSpEvt.clear(); - fSpEvt.shrink_to_fit(); +WCRootData::~WCRootData() { + if(fWCGeom) { + delete fWCGeom; + fWCGeom = 0; + } + if(fWCSimT) { + delete fWCSimT; + fWCSimT = 0; + } + if(fWCSimC) { + delete fWCSimC; + fWCSimC = 0; + } + fSpEvt.clear(); + fSpEvt.shrink_to_fit(); } - -void WCRootData::GetGeometryInfo(const char *filename) -{ - TFile *f=TFile::Open(filename); - TTree *t=(TTree*)f->Get("wcsimGeoT"); - t->SetBranchAddress("wcsimrootgeom", &fWCGeom); - t->GetEntry( 0 ); - fDetCentreY = fWCGeom->GetWCOffset(1); - cout<<" DetCentreY: " << fDetCentreY <Close(); +void WCRootData::GetGeometryInfo(const char* filename) { + TFile* f = TFile::Open(filename); + TTree* t = (TTree*)f->Get("wcsimGeoT"); + t->SetBranchAddress("wcsimrootgeom", &fWCGeom); + t->GetEntry(0); + fDetCentreY = fWCGeom->GetWCOffset(1); + cout << " DetCentreY: " << fDetCentreY << endl; + f->Close(); } - -void WCRootData::AddTrueHitsToMDT(MDTManager *mdt) -{ - HitTubeCollection *hc = mdt->GetHitTubeCollection(); - this->AddTrueHitsToMDT(hc, mdt->GetPMTResponse(), 0., 0); - hc = 0; +void WCRootData::AddTrueHitsToMDT(MDTManager* mdt) { + HitTubeCollection* hc = mdt->GetHitTubeCollection(); + this->AddTrueHitsToMDT(hc, mdt->GetPMTResponse(), 0., 0); + hc = 0; } - -void WCRootData::AddTrueHitsToMDT(HitTubeCollection *hc, PMTResponse *pr, float intTime, int iPMT) -{ +void WCRootData::AddTrueHitsToMDT(HitTubeCollection* hc, PMTResponse* pr, float intTime, int iPMT) { // Set all tubes no matter how many of true hits, anyway // Position and orientation are also set to each tube this->SetTubes(hc, iPMT); - const WCSimRootTrigger *aEvt = fSpEvt[iPMT]->GetTrigger(0); - const int nCkovHits = aEvt->GetNcherenkovhits(); - //std::cout<<" nCkovHits: " << nCkovHits <GetTrigger(0); + const int nCkovHits = aEvt->GetNcherenkovhits(); + // std::cout<<" nCkovHits: " << nCkovHits <GetCherenkovHitTimes(); - for(int iHit=0; iHit((aEvt->GetCherenkovHits())->At(iHit)); - - int timeArrayIndex = aHit->GetTotalPe(0); - int peForTube = aHit->GetTotalPe(1); - int tubeID = aHit->GetTubeID(); - const int maxPE = timeArrayIndex + peForTube; - for(int jPE=timeArrayIndex; jPE(hitTimeArray->At(jPE)); - - float truetime = aHitTime->GetTruetime(); - if( truetime<0. ){ continue; } - if( aHitTime->GetParentID()<0 ){ continue; } - - TrueHit *th = new TrueHit(truetime, aHitTime->GetParentID()); + TClonesArray* hitTimeArray = aEvt->GetCherenkovHitTimes(); + for(int iHit = 0; iHit < nCkovHits; iHit++) { + WCSimRootCherenkovHit* aHit = + dynamic_cast((aEvt->GetCherenkovHits())->At(iHit)); + + int timeArrayIndex = aHit->GetTotalPe(0); + int peForTube = aHit->GetTotalPe(1); + int tubeID = aHit->GetTubeID(); + const int maxPE = timeArrayIndex + peForTube; + for(int jPE = timeArrayIndex; jPE < maxPE; jPE++) { + WCSimRootCherenkovHitTime* aHitTime = + dynamic_cast(hitTimeArray->At(jPE)); + + float truetime = aHitTime->GetTruetime(); + if(truetime < 0.) { + continue; + } + if(aHitTime->GetParentID() < 0) { + continue; + } + + TrueHit* th = new TrueHit(truetime, aHitTime->GetParentID()); #ifdef HYBRIDWCSIM - for(int k=0; k<3; k++){ th->SetPosition(k, aHitTime->GetPhotonEndPos(k)); } - for(int k=0; k<3; k++){ th->SetDirection(k, aHitTime->GetPhotonEndDir(k)); } - for(int k=0; k<3; k++){ th->SetStartDirection(k, aHitTime->GetPhotonStartDir(k)); } + for(int k = 0; k < 3; k++) { + th->SetPosition(k, aHitTime->GetPhotonEndPos(k)); + } + for(int k = 0; k < 3; k++) { + th->SetDirection(k, aHitTime->GetPhotonEndDir(k)); + } + for(int k = 0; k < 3; k++) { + th->SetStartDirection(k, aHitTime->GetPhotonStartDir(k)); + } #endif - th->SetStartTime(aHitTime->GetPhotonStartTime()); - for(int k=0; k<3; k++){ th->SetStartPosition(k, aHitTime->GetPhotonStartPos(k)); } - if( !pr->ApplyDE(th) ){ continue; } - - (&(*hc)[tubeID])->AddRawPE(th); - } - } + th->SetStartTime(aHitTime->GetPhotonStartTime()); + for(int k = 0; k < 3; k++) { + th->SetStartPosition(k, aHitTime->GetPhotonStartPos(k)); + } + if(!pr->ApplyDE(th)) { + continue; + } + + (&(*hc)[tubeID])->AddRawPE(th); + } + } } -void WCRootData::ReadFile(const char *filename, const vector &list) -{ - fWCSimC = new TChain("wcsimT"); - fWCSimC->Add(filename); +void WCRootData::ReadFile(const char* filename, const vector& list) { + fWCSimC = new TChain("wcsimT"); + fWCSimC->Add(filename); - const char *filename0 = NULL; - filename0 = fWCSimC->GetFile()->GetName(); - if( filename0!=NULL ) - { + const char* filename0 = NULL; + filename0 = fWCSimC->GetFile()->GetName(); + if(filename0 != NULL) { this->GetGeometryInfo(filename0); } - if( list.size()==0 ) // default - { - fSpEvt.push_back( 0 ); - fWCSimC->SetBranchAddress("wcsimrootevent", &fSpEvt[0]); - } - else - { - fSpEvt.clear(); - fSpEvt = vector(list.size(),0); - for(unsigned int i=0; iSetBranchAddress(list[i].c_str(), &fSpEvt[i]); - } - } - fWCSimC->SetAutoDelete(); + if(list.size() == 0) // default + { + fSpEvt.push_back(0); + fWCSimC->SetBranchAddress("wcsimrootevent", &fSpEvt[0]); + } + else { + fSpEvt.clear(); + fSpEvt = vector(list.size(), 0); + for(unsigned int i = 0; i < list.size(); i++) { + fWCSimC->SetBranchAddress(list[i].c_str(), &fSpEvt[i]); + } + } + fWCSimC->SetAutoDelete(); } -void WCRootData::CloseFile() -{ - delete fWCSimC; fWCSimC = 0; - fSpEvt.clear(); - fSpEvt.shrink_to_fit(); +void WCRootData::CloseFile() { + delete fWCSimC; + fWCSimC = 0; + fSpEvt.clear(); + fSpEvt.shrink_to_fit(); } -int WCRootData::GetEntries() -{ - return fWCSimC->GetEntries(); +int WCRootData::GetEntries() { + return fWCSimC->GetEntries(); } -void WCRootData::GetEntry(int i) -{ - fWCSimC->GetEntry(i); +void WCRootData::GetEntry(int i) { + fWCSimC->GetEntry(i); } - -void WCRootData::CreateTree(const char *filename, const vector &list) -{ - fOutFileName = TString(filename); - TFile *fout = new TFile(fOutFileName, "recreate"); - fout->SetCompressionLevel(2); - - Int_t branchStyle = 1; - Int_t bufferSize = 64000; - TString bName = "wcsimrootevent"; - TString bAddress = "WCSimRootEvent"; - - fWCSimT = new TTree("wcsimT", "Processed WCSim Tree for pile-up"); - if( list.size()==0 ) - { - fSpEvt.push_back( new WCSimRootEvent() ); - fSpEvt[0]->Initialize(); - TTree::SetBranchStyle(branchStyle); - TBranch *branch = fWCSimT->Branch(bName, bAddress, &fSpEvt[0], bufferSize, 2); - } - else - { - fSpEvt.clear(); - fSpEvt = vector(list.size(), 0); - for(unsigned int i=0; iInitialize(); - TTree::SetBranchStyle(branchStyle); - TBranch *branch = fWCSimT->Branch(list[i].c_str(), bAddress, &fSpEvt[i], bufferSize, 2); - } - } +void WCRootData::CreateTree(const char* filename, const vector& list) { + fOutFileName = TString(filename); + TFile* fout = new TFile(fOutFileName, "recreate"); + fout->SetCompressionLevel(2); + + Int_t branchStyle = 1; + Int_t bufferSize = 64000; + TString bName = "wcsimrootevent"; + TString bAddress = "WCSimRootEvent"; + + fWCSimT = new TTree("wcsimT", "Processed WCSim Tree for pile-up"); + if(list.size() == 0) { + fSpEvt.push_back(new WCSimRootEvent()); + fSpEvt[0]->Initialize(); + TTree::SetBranchStyle(branchStyle); + TBranch* branch = fWCSimT->Branch(bName, bAddress, &fSpEvt[0], bufferSize, 2); + } + else { + fSpEvt.clear(); + fSpEvt = vector(list.size(), 0); + for(unsigned int i = 0; i < list.size(); i++) { + // fSpEvt.push_back( new WCSimRootEvent() ); + fSpEvt[i] = new WCSimRootEvent(); + fSpEvt[i]->Initialize(); + TTree::SetBranchStyle(branchStyle); + TBranch* branch = fWCSimT->Branch(list[i].c_str(), bAddress, &fSpEvt[i], bufferSize, 2); + } + } } -void WCRootData::AddDigiHits(MDTManager *mdt, int eventID, int iPMT) -{ - HitTubeCollection *hc = mdt->GetHitTubeCollection(); - TriggerInfo *ti = mdt->GetTriggerInfo(); - this->AddDigiHits(hc, ti, eventID, iPMT); +void WCRootData::AddDigiHits(MDTManager* mdt, int eventID, int iPMT) { + HitTubeCollection* hc = mdt->GetHitTubeCollection(); + TriggerInfo* ti = mdt->GetTriggerInfo(); + this->AddDigiHits(hc, ti, eventID, iPMT); } -void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID, int iPMT) -{ - WCSimRootTrigger* anEvent = fSpEvt[iPMT]->GetTrigger(0); - const int nTriggers = ti->GetNumOfTrigger(); - for(int iTrig=0; iTrigGetType(iTrig)==(int)TriggerType::eFailure ) - { - trigType = kTriggerFailure; - } - - if( iTrig>=1 ) - { - fSpEvt[iPMT]->AddSubEvent(); - anEvent = fSpEvt[iPMT]->GetTrigger(iTrig); - anEvent->SetHeader(eventID, 0, 0, iTrig+1); - anEvent->SetMode(0); - } +void WCRootData::AddDigiHits(HitTubeCollection* hc, TriggerInfo* ti, int eventID, int iPMT) { + WCSimRootTrigger* anEvent = fSpEvt[iPMT]->GetTrigger(0); + const int nTriggers = ti->GetNumOfTrigger(); + for(int iTrig = 0; iTrig < nTriggers; iTrig++) { + TriggerType_t trigType = kTriggerNDigits; + if(ti->GetType(iTrig) == (int)TriggerType::eFailure) { + trigType = kTriggerFailure; + } + + if(iTrig >= 1) { + fSpEvt[iPMT]->AddSubEvent(); + anEvent = fSpEvt[iPMT]->GetTrigger(iTrig); + anEvent->SetHeader(eventID, 0, 0, iTrig + 1); + anEvent->SetMode(0); + } #ifdef HYBRIDWCSIM - vector info(1, ti->GetNHits(iTrig)); + vector info(1, ti->GetNHits(iTrig)); #else - vector info(1, ti->GetNHits(iTrig)); + vector info(1, ti->GetNHits(iTrig)); #endif - anEvent->SetTriggerInfo(trigType, info); - - const float triggerTime = ti->GetTriggerTime(iTrig); - const float tWinLowEdge = ti->GetLowEdge(iTrig); - const float tWinUpEdge = ti->GetUpEdge(iTrig); - - int nHits = 0; - float sumQ = 0.; - map tubeCount; - for(hc->Begin(); !hc->IsEnd(); hc->Next()) - { - HitTube *aPH = &(*hc)(); - int tubeID = aPH->GetTubeID(); - int nCount = 0; - for(int i=0; iGetNDigiHits(); i++) - { - float t = aPH->GetTimeDigi(i); - - // Need to be updated - int mPMT_module_id = 0; - int mPMT_pmt_id = 0; - if( t>=tWinLowEdge && t<=tWinUpEdge ) - { - bool doFill = false; - - // The first hit is always allowed to be saved. - // Later hits depend on your setting - if( tubeCount.count(tubeID)==0 ){ doFill = true; } - else { doFill = fMultDigiHits ? true : false; } - - if( doFill ) - { - vector true_pe_comp = aPH->GetParentCompositionDigi(i); - t = t + fHitTimeOffset - triggerTime; - float q = aPH->GetChargeDigi(i); - anEvent->AddCherenkovDigiHit(q, - t, - tubeID, - mPMT_module_id, - mPMT_pmt_id, - true_pe_comp); - nHits += 1; - sumQ += q; - nCount+=1; - tubeCount[tubeID] = 1; - } - } - } // digi hit loop - aPH = NULL; - } // PMT loop - anEvent->SetNumDigitizedTubes(nHits); - anEvent->SetSumQ(sumQ); - WCSimRootEventHeader *eh = anEvent->GetHeader(); - eh->SetDate( int(triggerTime) ); - } + anEvent->SetTriggerInfo(trigType, info); + + const float triggerTime = ti->GetTriggerTime(iTrig); + const float tWinLowEdge = ti->GetLowEdge(iTrig); + const float tWinUpEdge = ti->GetUpEdge(iTrig); + + int nHits = 0; + float sumQ = 0.; + map tubeCount; + for(hc->Begin(); !hc->IsEnd(); hc->Next()) { + HitTube* aPH = &(*hc)(); + int tubeID = aPH->GetTubeID(); + int nCount = 0; + for(int i = 0; i < aPH->GetNDigiHits(); i++) { + float t = aPH->GetTimeDigi(i); + + // Need to be updated + int mPMT_module_id = 0; + int mPMT_pmt_id = 0; + if(t >= tWinLowEdge && t <= tWinUpEdge) { + bool doFill = false; + + // The first hit is always allowed to be saved. + // Later hits depend on your setting + if(tubeCount.count(tubeID) == 0) { + doFill = true; + } + else { + doFill = fMultDigiHits ? true : false; + } + + if(doFill) { + vector true_pe_comp = aPH->GetParentCompositionDigi(i); + t = t + fHitTimeOffset - triggerTime; + float q = aPH->GetChargeDigi(i); + anEvent->AddCherenkovDigiHit(q, t, tubeID, mPMT_module_id, mPMT_pmt_id, true_pe_comp); + nHits += 1; + sumQ += q; + nCount += 1; + tubeCount[tubeID] = 1; + } + } + } // digi hit loop + aPH = NULL; + } // PMT loop + anEvent->SetNumDigitizedTubes(nHits); + anEvent->SetSumQ(sumQ); + WCSimRootEventHeader* eh = anEvent->GetHeader(); + eh->SetDate(int(triggerTime)); + } } -void WCRootData::FillTree() -{ - int tmp = (int)fSpEvt.size(); - TFile *f = fWCSimT->GetCurrentFile(); - f->cd(); - fWCSimT->Fill(); - fWCSimT->Write("",TObject::kOverwrite); - for(unsigned int i=0; iReInitialize(); - } +void WCRootData::FillTree() { + int tmp = (int)fSpEvt.size(); + TFile* f = fWCSimT->GetCurrentFile(); + f->cd(); + fWCSimT->Fill(); + fWCSimT->Write("", TObject::kOverwrite); + for(unsigned int i = 0; i < fSpEvt.size(); i++) { + fSpEvt[i]->ReInitialize(); + } } - -void WCRootData::AddTracks(const WCSimRootTrigger *aEvtIn, float offset_time, int iPMT) -{ - WCSimRootTrigger *aEvtOut = fSpEvt[iPMT]->GetTrigger(0); - TClonesArray *tracks = aEvtIn->GetTracks(); - const int ntrack = tracks->GetEntries(); - for(int i=0; iAt(i); - Int_t ipnu = aTrack->GetIpnu(); - Int_t flag = aTrack->GetFlag(); - Int_t startvol = aTrack->GetStartvol(); - Int_t stopvol = aTrack->GetStopvol(); - Int_t parenttype = aTrack->GetParenttype(); - Int_t id = aTrack->GetId(); +void WCRootData::AddTracks(const WCSimRootTrigger* aEvtIn, float offset_time, int iPMT) { + WCSimRootTrigger* aEvtOut = fSpEvt[iPMT]->GetTrigger(0); + TClonesArray* tracks = aEvtIn->GetTracks(); + const int ntrack = tracks->GetEntries(); + for(int i = 0; i < ntrack; i++) { + WCSimRootTrack* aTrack = (WCSimRootTrack*)tracks->At(i); + Int_t ipnu = aTrack->GetIpnu(); + Int_t flag = aTrack->GetFlag(); + Int_t startvol = aTrack->GetStartvol(); + Int_t stopvol = aTrack->GetStopvol(); + Int_t parenttype = aTrack->GetParenttype(); + Int_t id = aTrack->GetId(); #ifdef HYBRIDWCSIM - Int_t idPrnt = aTrack->GetParentId(); + Int_t idPrnt = aTrack->GetParentId(); #endif - #ifdef HYBRIDWCSIM - Double_t dir[3]; - Double_t pdir[3]; - Double_t stop[3]; - Double_t start[3]; - Double_t m = aTrack->GetM(); - Double_t p = aTrack->GetP(); - Double_t E = aTrack->GetE(); - Double_t time = aTrack->GetTime() + offset_time; -#else - Float_t dir[3]; - Float_t pdir[3]; - Float_t stop[3]; - Float_t start[3]; - Float_t m = aTrack->GetM(); - Float_t p = aTrack->GetP(); - Float_t E = aTrack->GetE(); - Float_t time = aTrack->GetTime() + offset_time; + Double_t dir[3]; + Double_t pdir[3]; + Double_t stop[3]; + Double_t start[3]; + Double_t m = aTrack->GetM(); + Double_t p = aTrack->GetP(); + Double_t E = aTrack->GetE(); + Double_t time = aTrack->GetTime() + offset_time; +#else + Float_t dir[3]; + Float_t pdir[3]; + Float_t stop[3]; + Float_t start[3]; + Float_t m = aTrack->GetM(); + Float_t p = aTrack->GetP(); + Float_t E = aTrack->GetE(); + Float_t time = aTrack->GetTime() + offset_time; #endif - for(int j=0; j<3; j++) - { - dir[j] = aTrack->GetDir(j); - pdir[j] = aTrack->GetPdir(j); - stop[j] = aTrack->GetStop(j); - start[j] = aTrack->GetStart(j); - } + for(int j = 0; j < 3; j++) { + dir[j] = aTrack->GetDir(j); + pdir[j] = aTrack->GetPdir(j); + stop[j] = aTrack->GetStop(j); + start[j] = aTrack->GetStart(j); + } #ifdef HYBRIDWCSIM - aEvtOut->AddTrack(ipnu, - flag, - m, - p, - E, - startvol, - stopvol, - dir, - pdir, - stop, - start, - parenttype, - time, - id, - idPrnt); + aEvtOut->AddTrack(ipnu, + flag, + m, + p, + E, + startvol, + stopvol, + dir, + pdir, + stop, + start, + parenttype, + time, + id, + idPrnt); #else - aEvtOut->AddTrack(ipnu, - flag, - m, - p, - E, - startvol, - stopvol, - dir, - pdir, - stop, - start, - parenttype, - time, - id); + aEvtOut + ->AddTrack(ipnu, flag, m, p, E, startvol, stopvol, dir, pdir, stop, start, parenttype, time, id); #endif - WCSimRootTrack *AddTrack(Int_t ipnu, - Int_t flag, - Float_t m, - Float_t p, - Float_t E, - Int_t startvol, - Int_t stopvol, - Float_t dir[3], - Float_t pdir[3], - Float_t stop[3], - Float_t start[3], - Int_t parenttype, - Float_t time, - Int_t id); - - - } + WCSimRootTrack* AddTrack(Int_t ipnu, + Int_t flag, + Float_t m, + Float_t p, + Float_t E, + Int_t startvol, + Int_t stopvol, + Float_t dir[3], + Float_t pdir[3], + Float_t stop[3], + Float_t start[3], + Int_t parenttype, + Float_t time, + Int_t id); + } } -void WCRootData::WriteTree() -{ - TFile *f = fWCSimT->GetCurrentFile(); - f->cd(); - fWCSimT->Write(); - f->Close(); +void WCRootData::WriteTree() { + TFile* f = fWCSimT->GetCurrentFile(); + f->cd(); + fWCSimT->Write(); + f->Close(); } +void WCRootData::CopyTree(const char* filename, const char* treename, const vector& savelist) { -void WCRootData::CopyTree(const char *filename, - const char *treename, - const vector &savelist) -{ - - TFile *fin = TFile::Open(filename); - if( !fin->FindKey(treename) ) - { + TFile* fin = TFile::Open(filename); + if(!fin->FindKey(treename)) { fin->Close(); - std::cout<<" [ERROR] WCRootData::CopyTree " <Get(treename); - - TFile *fout = TFile::Open(fOutFileName, "update"); - fout->cd(); - TTree *tout = tin->CloneTree(-1, "fast"); - tout->Write(); - fout->Close(); - } - else // This is a special treatment - { - TTree *tin = (TTree*)fin->Get(treename); - - TBranch *bWCXRotation = tin->GetBranch("WCXRotation"); - TBranch *bWCYRotation = tin->GetBranch("WCYRotation"); - TBranch *bWCZRotation = tin->GetBranch("WCZRotation"); - TBranch *bWCDetCentre = tin->GetBranch("WCDetCentre"); - TBranch *bWCDetRadius = tin->GetBranch("WCDetRadius"); - TBranch *bWCDetHeight = tin->GetBranch("WCDetHeight"); - - Float_t WCXRotation[3] = {0.}; - Float_t WCYRotation[3] = {0.}; - Float_t WCZRotation[3] = {0.}; - Float_t WCDetCentre[3] = {0.}; - Float_t WCDetRadius = 0.; - Float_t WCDetHeight = 0.; - - bWCXRotation->SetAddress(WCXRotation); - bWCYRotation->SetAddress(WCYRotation); - bWCZRotation->SetAddress(WCZRotation); - bWCDetCentre->SetAddress(WCDetCentre); - bWCDetRadius->SetAddress(&WCDetRadius); - bWCDetHeight->SetAddress(&WCDetHeight); - - bWCXRotation->GetEntry(0); - bWCYRotation->GetEntry(0); - bWCZRotation->GetEntry(0); - bWCDetCentre->GetEntry(0); - bWCDetRadius->GetEntry(0); - bWCDetHeight->GetEntry(0); - - TFile *fout = TFile::Open(fOutFileName, "update"); - fout->cd(); - TTree *tout = new TTree("Settings", ""); - tout->Branch("WCXRotation", WCXRotation, "WCXRotation[3]/F"); - tout->Branch("WCYRotation", WCYRotation, "WCYRotation[3]/F"); - tout->Branch("WCZRotation", WCZRotation, "WCZRotation[3]/F"); - tout->Branch("WCDetCentre", WCDetCentre, "WCDetCentre[3]/F"); - tout->Branch("WCDetRadius", &WCDetRadius, "WCDetRadius/F"); - tout->Branch("WCDetHeight", &WCDetHeight, "WCDetHeight/F"); - tout->Fill(); - tout->Write(); - fout->Close(); - } - } - else - { - TTree *tin = (TTree*)fin->Get(treename); - - TFile *fout = TFile::Open(fOutFileName, "update"); - fout->cd(); - TTree *tout = tin->CloneTree(0); - - const int nEntries = tin->GetEntries(); - for(int iEntry=0; iEntryGetEntry(iEntry); - if( !savelist[iEntry] ){ continue; } - fout->cd(); - tout->Fill(); - } - fout->cd(); - tout->Write(); - fout->Close(); - } - fin->Close(); + // Copy all the entries + if(savelist.size() == 0) { + if(treename != "Settings") { + TTree* tin = (TTree*)fin->Get(treename); + + TFile* fout = TFile::Open(fOutFileName, "update"); + fout->cd(); + TTree* tout = tin->CloneTree(-1, "fast"); + tout->Write(); + fout->Close(); + } + else // This is a special treatment + { + TTree* tin = (TTree*)fin->Get(treename); + + TBranch* bWCXRotation = tin->GetBranch("WCXRotation"); + TBranch* bWCYRotation = tin->GetBranch("WCYRotation"); + TBranch* bWCZRotation = tin->GetBranch("WCZRotation"); + TBranch* bWCDetCentre = tin->GetBranch("WCDetCentre"); + TBranch* bWCDetRadius = tin->GetBranch("WCDetRadius"); + TBranch* bWCDetHeight = tin->GetBranch("WCDetHeight"); + + Float_t WCXRotation[3] = { 0. }; + Float_t WCYRotation[3] = { 0. }; + Float_t WCZRotation[3] = { 0. }; + Float_t WCDetCentre[3] = { 0. }; + Float_t WCDetRadius = 0.; + Float_t WCDetHeight = 0.; + + bWCXRotation->SetAddress(WCXRotation); + bWCYRotation->SetAddress(WCYRotation); + bWCZRotation->SetAddress(WCZRotation); + bWCDetCentre->SetAddress(WCDetCentre); + bWCDetRadius->SetAddress(&WCDetRadius); + bWCDetHeight->SetAddress(&WCDetHeight); + + bWCXRotation->GetEntry(0); + bWCYRotation->GetEntry(0); + bWCZRotation->GetEntry(0); + bWCDetCentre->GetEntry(0); + bWCDetRadius->GetEntry(0); + bWCDetHeight->GetEntry(0); + + TFile* fout = TFile::Open(fOutFileName, "update"); + fout->cd(); + TTree* tout = new TTree("Settings", ""); + tout->Branch("WCXRotation", WCXRotation, "WCXRotation[3]/F"); + tout->Branch("WCYRotation", WCYRotation, "WCYRotation[3]/F"); + tout->Branch("WCZRotation", WCZRotation, "WCZRotation[3]/F"); + tout->Branch("WCDetCentre", WCDetCentre, "WCDetCentre[3]/F"); + tout->Branch("WCDetRadius", &WCDetRadius, "WCDetRadius/F"); + tout->Branch("WCDetHeight", &WCDetHeight, "WCDetHeight/F"); + tout->Fill(); + tout->Write(); + fout->Close(); + } + } + else { + TTree* tin = (TTree*)fin->Get(treename); + + TFile* fout = TFile::Open(fOutFileName, "update"); + fout->cd(); + TTree* tout = tin->CloneTree(0); + + const int nEntries = tin->GetEntries(); + for(int iEntry = 0; iEntry < nEntries; iEntry++) { + tin->GetEntry(iEntry); + if(!savelist[iEntry]) { + continue; + } + fout->cd(); + tout->Fill(); + } + fout->cd(); + tout->Write(); + fout->Close(); + } + fin->Close(); } -void WCRootData::SetTubes(HitTubeCollection *hc, const int iPMT) -{ +void WCRootData::SetTubes(HitTubeCollection* hc, const int iPMT) { #ifdef HYBRIDWCSIM const int nTubes = fWCGeom->GetWCNumPMT(bool(iPMT)); - for(int i=0; iGetPMTPtr(i, bool(iPMT)); + for(int i = 0; i < nTubes; i++) { + const WCSimRootPMT* tube = fWCGeom->GetPMTPtr(i, bool(iPMT)); const int tubeID = tube->GetTubeNo(); hc->AddHitTube(tubeID); - for(int j=0; j<3; j++) - { + for(int j = 0; j < 3; j++) { (&(*hc)[tubeID])->SetPosition(j, tube->GetPosition(j)); (&(*hc)[tubeID])->SetOrientation(j, tube->GetOrientation(j)); } } #else const int nTubes = fWCGeom->GetWCNumPMT(); - for(int i=0; iGetPMT(i); + for(int i = 0; i < nTubes; i++) { + WCSimRootPMT tube = fWCGeom->GetPMT(i); const int tubeID = tube.GetTubeNo(); hc->AddHitTube(tubeID); - for(int j=0; j<3; j++) - { + for(int j = 0; j < 3; j++) { (&(*hc)[tubeID])->SetPosition(j, tube.GetPosition(j)); (&(*hc)[tubeID])->SetOrientation(j, tube.GetOrientation(j)); } diff --git a/app/utilities/WCRootData/src/WCRootDataBeamBkg.cc b/app/utilities/WCRootData/src/WCRootDataBeamBkg.cc index 1548408..b97b455 100644 --- a/app/utilities/WCRootData/src/WCRootDataBeamBkg.cc +++ b/app/utilities/WCRootData/src/WCRootDataBeamBkg.cc @@ -1,50 +1,44 @@ #include "WCRootDataBeamBkg.h" -WCRootDataBeamBkg::WCRootDataBeamBkg() -{ - fHasFriend = true; - fNuIntType = eBeamBkg; +WCRootDataBeamBkg::WCRootDataBeamBkg() { + fHasFriend = true; + fNuIntType = eBeamBkg; }; -WCRootDataBeamBkg::~WCRootDataBeamBkg() -{ -} +WCRootDataBeamBkg::~WCRootDataBeamBkg() {} -void WCRootDataBeamBkg::LoadFiles(const char *filename) -{ - // Read input file list of WCSim first - this->WCRootDataNuInt::LoadFiles(filename); +void WCRootDataBeamBkg::LoadFiles(const char* filename) { + // Read input file list of WCSim first + this->WCRootDataNuInt::LoadFiles(filename); - ifstream fin(filename); - string aLine; - string sname; - string svalue; - int num = -1; - while( std::getline(fin, aLine) ) - { - stringstream ss(aLine); - string stmp; - ss>>stmp; - ss>>stmp; - num = this->GetFileIdNumber(stmp.c_str(), "redgene."); - fFriendList.push_back(pair(stmp, num)); - } - fin.close(); - this->ReadFriend(fFriendList[fItrFile].first); + ifstream fin(filename); + string aLine; + string sname; + string svalue; + int num = -1; + while(std::getline(fin, aLine)) { + stringstream ss(aLine); + string stmp; + ss >> stmp; + ss >> stmp; + num = this->GetFileIdNumber(stmp.c_str(), "redgene."); + fFriendList.push_back(pair(stmp, num)); + } + fin.close(); + this->ReadFriend(fFriendList[fItrFile].first); } -void WCRootDataBeamBkg::ReadFriend(const char *filename) -{ - fFriendC = new TChain("geneT"); - //fFriendC->SetBranchStatus("*", 0); - //fFriendC->SetBranchStatus("EdepoOD", 1); - //fFriendC->SetBranchStatus("grNPart", 1); - fFriendC->SetBranchAddress("EdepoOD", &fEdepoOD); - fFriendC->SetBranchAddress("grNPart", &fgrNPart); - fFriendC->Add(filename); +void WCRootDataBeamBkg::ReadFriend(const char* filename) { + fFriendC = new TChain("geneT"); + // fFriendC->SetBranchStatus("*", 0); + // fFriendC->SetBranchStatus("EdepoOD", 1); + // fFriendC->SetBranchStatus("grNPart", 1); + fFriendC->SetBranchAddress("EdepoOD", &fEdepoOD); + fFriendC->SetBranchAddress("grNPart", &fgrNPart); + fFriendC->Add(filename); } -void WCRootDataBeamBkg::CloseFriend() -{ - delete fFriendC; fFriendC = 0; +void WCRootDataBeamBkg::CloseFriend() { + delete fFriendC; + fFriendC = 0; } diff --git a/app/utilities/WCRootData/src/WCRootDataIDNuInt.cc b/app/utilities/WCRootData/src/WCRootDataIDNuInt.cc index c75cb6c..86e9484 100644 --- a/app/utilities/WCRootData/src/WCRootDataIDNuInt.cc +++ b/app/utilities/WCRootData/src/WCRootDataIDNuInt.cc @@ -1,60 +1,51 @@ #include "WCRootDataIDNuInt.h" -WCRootDataIDNuInt::WCRootDataIDNuInt() -{ - fHasFriend = true; - fNuIntType = eIDNuInt; +WCRootDataIDNuInt::WCRootDataIDNuInt() { + fHasFriend = true; + fNuIntType = eIDNuInt; }; -WCRootDataIDNuInt::~WCRootDataIDNuInt() -{ +WCRootDataIDNuInt::~WCRootDataIDNuInt() {} + +void WCRootDataIDNuInt::LoadFiles(const char* filename) { + // Read input file list of WCSim first + this->WCRootDataNuInt::LoadFiles(filename); + + ifstream fin(filename); + string aLine; + string sname; + string svalue; + int num = -1; + while(std::getline(fin, aLine)) { + stringstream ss(aLine); + string stmp; + ss >> stmp; + ss >> stmp; + num = this->GetFileIdNumber(stmp.c_str(), "rednrtvtx."); + fFriendList.push_back(pair(stmp, num)); + } + fin.close(); + this->ReadFriend(fFriendList[fItrFile].first); } -void WCRootDataIDNuInt::LoadFiles(const char *filename) -{ - // Read input file list of WCSim first - this->WCRootDataNuInt::LoadFiles(filename); - - ifstream fin(filename); - string aLine; - string sname; - string svalue; - int num = -1; - while( std::getline(fin, aLine) ) - { - stringstream ss(aLine); - string stmp; - ss>>stmp; - ss>>stmp; - num = this->GetFileIdNumber(stmp.c_str(), "rednrtvtx."); - fFriendList.push_back(pair(stmp, num)); - } - fin.close(); - this->ReadFriend(fFriendList[fItrFile].first); -} - -void WCRootDataIDNuInt::ReadFriend(const char *filename) -{ - cout<<" RedNRTVtxT reading: " << filename <Add(filename); - fNRTVtx.SetBranch(fFriendC); +void WCRootDataIDNuInt::ReadFriend(const char* filename) { + cout << " RedNRTVtxT reading: " << filename << endl; + fFriendC = new TChain("RedNRTVtxT"); + fFriendC->Add(filename); + fNRTVtx.SetBranch(fFriendC); } -void WCRootDataIDNuInt::CloseFriend() -{ - delete fFriendC; fFriendC = 0; +void WCRootDataIDNuInt::CloseFriend() { + delete fFriendC; + fFriendC = 0; } - -void WCRootDataIDNuInt::SetInteractionInformation(PileUpSpill_t *p) const -{ - p->Mode[p->NNuIntTot] = fNRTVtx.Mode[0]; - p->NuPDG[p->NNuIntTot] = fNRTVtx.NuPDG[0]; - p->NuEne[p->NNuIntTot] = fNRTVtx.NuEne[0]; - for(int i=0; i<3; i++) - { - p->NuPos[p->NNuIntTot][i] = fNRTVtx.NuPos[0][i]; - p->NuDir[p->NNuIntTot][i] = fNRTVtx.NuDir[0][i]; - } +void WCRootDataIDNuInt::SetInteractionInformation(PileUpSpill_t* p) const { + p->Mode[p->NNuIntTot] = fNRTVtx.Mode[0]; + p->NuPDG[p->NNuIntTot] = fNRTVtx.NuPDG[0]; + p->NuEne[p->NNuIntTot] = fNRTVtx.NuEne[0]; + for(int i = 0; i < 3; i++) { + p->NuPos[p->NNuIntTot][i] = fNRTVtx.NuPos[0][i]; + p->NuDir[p->NNuIntTot][i] = fNRTVtx.NuDir[0][i]; + } } diff --git a/app/utilities/WCRootData/src/WCRootDataNuInt.cc b/app/utilities/WCRootData/src/WCRootDataNuInt.cc index 68b2bd6..8c7c0dc 100644 --- a/app/utilities/WCRootData/src/WCRootDataNuInt.cc +++ b/app/utilities/WCRootData/src/WCRootDataNuInt.cc @@ -1,134 +1,129 @@ #include "WCRootDataNuInt.h" -//WCRootDataNuInt::WCRootDataNuInt(int seed) -WCRootDataNuInt::WCRootDataNuInt() -{ - fRnd = new TRandom3(7698); -// fRnd = new TRandom3(seed); - fFriendC = 0; - fFileList.clear(); - fFriendList.clear(); +// WCRootDataNuInt::WCRootDataNuInt(int seed) +WCRootDataNuInt::WCRootDataNuInt() { + fRnd = new TRandom3(7698); + // fRnd = new TRandom3(seed); + fFriendC = 0; + fFileList.clear(); + fFriendList.clear(); - fHasFriend = false; - fNuIntType = eSingle; + fHasFriend = false; + fNuIntType = eSingle; - fItrEntry = 0; - fItrFile = 0; - fNumEntries = 0; - fNumFiles = 0; - fFileIdNum = -9999; - fIntRate = 0.; - fNDigitsFileIdNum = 5; + fItrEntry = 0; + fItrFile = 0; + fNumEntries = 0; + fNumFiles = 0; + fFileIdNum = -9999; + fIntRate = 0.; + fNDigitsFileIdNum = 5; } -WCRootDataNuInt::~WCRootDataNuInt() -{ - delete fRnd; fRnd = 0; - if( fFriendC ){ delete fFriendC; fFriendC = 0; } - fFileList.clear(); - fFriendList.clear(); - std::vector>().swap(fFileList); - std::vector>().swap(fFriendList); +WCRootDataNuInt::~WCRootDataNuInt() { + delete fRnd; + fRnd = 0; + if(fFriendC) { + delete fFriendC; + fFriendC = 0; + } + fFileList.clear(); + fFriendList.clear(); + std::vector>().swap(fFileList); + std::vector>().swap(fFriendList); } -void WCRootDataNuInt::LoadFiles(const char *filename) -{ - ifstream fin(filename); - string aLine; - string sname; - string svalue; - int num = -1; - while( std::getline(fin, aLine) ) - { - stringstream ss(aLine); - string stmp; - ss>>stmp; - num = this->GetFileIdNumber(stmp.c_str()); - fFileList.push_back(pair(stmp, num)); - std::cout<<" Adding " << stmp <<" " << num <>stmp ) - //{ - // std::cout<<" stmp " << stmp <> stmp; + num = this->GetFileIdNumber(stmp.c_str()); + fFileList.push_back(pair(stmp, num)); + std::cout << " Adding " << stmp << " " << num << std::endl; + // while( ss>>stmp ) + //{ + // std::cout<<" stmp " << stmp <Integer(fNumFiles); - this->ReadFile(fFileList[fItrFile].first); - fFileIdNum = fFileList[fItrFile].second; - fNumEntries = this->GetEntries(); - fItrEntry = fRnd->Integer(fNumEntries); + fNumFiles = fFileList.size(); + std::cout << " Found " << fNumFiles << " files " << std::endl; - std::cout<<" Starting from: " << fFileList[fItrFile].first - <<" " << fFileList[fItrFile].second - <<" " << fItrEntry - <<"/" << fNumEntries - <Integer(fNumFiles); + this->ReadFile(fFileList[fItrFile].first); + fFileIdNum = fFileList[fItrFile].second; + fNumEntries = this->GetEntries(); + fItrEntry = fRnd->Integer(fNumEntries); + std::cout << " Starting from: " << fFileList[fItrFile].first << " " << fFileList[fItrFile].second << " " + << fItrEntry << "/" << fNumEntries << std::endl; +} -bool WCRootDataNuInt::Next() -{ - if( fItrEntry>=fNumEntries ) - { - this->CloseFile(); - if( fHasFriend ){ this->CloseFriend(); }; - fItrFile += 1; - if( fItrFile==fNumFiles ) - { - fItrFile = fRnd->Integer(fNumFiles); - std::cout<<" Rewiding file from " << fFileList[fItrFile].first <ReadFile(fFileList[fItrFile].first); - if( fHasFriend ){ this->ReadFriend(fFriendList[fItrFile].first); }; +bool WCRootDataNuInt::Next() { + if(fItrEntry >= fNumEntries) { + this->CloseFile(); + if(fHasFriend) { + this->CloseFriend(); + }; + fItrFile += 1; + if(fItrFile == fNumFiles) { + fItrFile = fRnd->Integer(fNumFiles); + std::cout << " Rewiding file from " << fFileList[fItrFile].first << std::endl; + } + this->ReadFile(fFileList[fItrFile].first); + if(fHasFriend) { + this->ReadFriend(fFriendList[fItrFile].first); + }; - fFileIdNum = fFileList[fItrFile].second; - fNumEntries = this->GetEntries(); - fItrEntry = fRnd->Integer(fNumEntries); + fFileIdNum = fFileList[fItrFile].second; + fNumEntries = this->GetEntries(); + fItrEntry = fRnd->Integer(fNumEntries); - std::cout<<" Reading " << fFileList[fItrFile].first - <<" " << fFileList[fItrFile].second - <<" " << fItrEntry - <<"/" << fNumEntries - <GetEntry(fItrEntry); - if( fHasFriend ){ fFriendC->GetEntry(fItrEntry); } - fItrEntry++; + std::cout << " Reading " << fFileList[fItrFile].first << " " << fFileList[fItrFile].second << " " + << fItrEntry << "/" << fNumEntries << std::endl; + } + this->GetEntry(fItrEntry); + if(fHasFriend) { + fFriendC->GetEntry(fItrEntry); + } + fItrEntry++; - return true; + return true; } -int WCRootDataNuInt::GetFileIdNumber(const char *filename, const char *prefix) -{ +int WCRootDataNuInt::GetFileIdNumber(const char* filename, const char* prefix) { const int size_of_num = fNDigitsFileIdNum; TString InFileName(filename); int total_size = InFileName.Sizeof() - 1; TString sPrefix(prefix); TString sROOT(".root"); - int index_Prefix = InFileName.Index( sPrefix ); - int len_Prefix = sPrefix.Sizeof() - 1; - int len_ROOT = sROOT.Sizeof() - 1; + int index_Prefix = InFileName.Index(sPrefix); + int len_Prefix = sPrefix.Sizeof() - 1; + int len_ROOT = sROOT.Sizeof() - 1; int reco_total_size = index_Prefix + len_Prefix + size_of_num + len_ROOT; // Check if the file name is acceptable - if( reco_total_size!=total_size ) - { - std::cout<<" [ERROR] WCRootDataNuInt::GetFileIdNumber " < EXIT "<< std::endl; + if(reco_total_size != total_size) { + std::cout << " [ERROR] WCRootDataNuInt::GetFileIdNumber " << std::endl; + std::cout << " - Input file name is not formatted in: -----" << sPrefix << "XXXXX.root " + << std::endl; + std::cout << " , where XXXX assumed to be 00000 - 99999 " << std::endl; + std::cout << " Cannot obtain file number for: " << InFileName << std::endl; + std::cout << " -> EXIT " << std::endl; exit(-1); } int index_start = index_Prefix + sPrefix.Sizeof(); - TString sNum = InFileName(index_start, size_of_num); - return atoi( sNum ); + TString sNum = InFileName(index_start, size_of_num); + return atoi(sNum); } diff --git a/app/utilities/WCRootData/src/WCRootDataPileUpSpill.cc b/app/utilities/WCRootData/src/WCRootDataPileUpSpill.cc index 75cbe60..5c2b4a7 100644 --- a/app/utilities/WCRootData/src/WCRootDataPileUpSpill.cc +++ b/app/utilities/WCRootData/src/WCRootDataPileUpSpill.cc @@ -1,212 +1,198 @@ #include "WCRootDataPileUpSpill.h" #include "WCRootDataNuInt.h" -WCRootDataPileUpSpill::WCRootDataPileUpSpill() -{ - fOutFileNum = 0; - fOutFilePrefix = ""; - fNumOfSpillsPerFile = 1000; - fCurSpill = 0; - fPupSpillC = 0; +WCRootDataPileUpSpill::WCRootDataPileUpSpill() { + fOutFileNum = 0; + fOutFilePrefix = ""; + fNumOfSpillsPerFile = 1000; + fCurSpill = 0; + fPupSpillC = 0; - fPupSpillTreeName = "pupspillT"; + fPupSpillTreeName = "pupspillT"; - fFileNameToBeCopied = ""; + fFileNameToBeCopied = ""; } -WCRootDataPileUpSpill::~WCRootDataPileUpSpill() -{ - if( fPupSpillC ){ delete fPupSpillC; fPupSpillC = 0; } +WCRootDataPileUpSpill::~WCRootDataPileUpSpill() { + if(fPupSpillC) { + delete fPupSpillC; + fPupSpillC = 0; + } } -void WCRootDataPileUpSpill::ReadFile(const char *filename) -{ - fPupSpillC = new TChain(fPupSpillTreeName); - fPupSpillC->Add(filename); - fPupSpill.Clear(); - fPupSpill.SetBranch(fPupSpillC); - this->WCRootData::ReadFile(filename); +void WCRootDataPileUpSpill::ReadFile(const char* filename) { + fPupSpillC = new TChain(fPupSpillTreeName); + fPupSpillC->Add(filename); + fPupSpill.Clear(); + fPupSpill.SetBranch(fPupSpillC); + this->WCRootData::ReadFile(filename); } - -void WCRootDataPileUpSpill::CloseFile() -{ - delete fPupSpillC; fPupSpillC = 0; - this->WCRootData::CloseFile(); +void WCRootDataPileUpSpill::CloseFile() { + delete fPupSpillC; + fPupSpillC = 0; + this->WCRootData::CloseFile(); } -int WCRootDataPileUpSpill::GetEntries() -{ - if( this->WCRootData::GetEntries()!=fPupSpillC->GetEntries() ) - { - cout<<" Number of enetries are different" <WCRootData::GetEntries() <GetEntries() <WCRootData::GetEntries(); +int WCRootDataPileUpSpill::GetEntries() { + if(this->WCRootData::GetEntries() != fPupSpillC->GetEntries()) { + cout << " Number of enetries are different" << endl; + cout << " - wcsimT: " << this->WCRootData::GetEntries() << endl; + cout << " - " << fPupSpillTreeName << ": " << fPupSpillC->GetEntries() << endl; + } + return this->WCRootData::GetEntries(); } -void WCRootDataPileUpSpill::GetEntry(const int i) -{ - fPupSpillC->GetEntry(i); - this->WCRootData::GetEntry(i); +void WCRootDataPileUpSpill::GetEntry(const int i) { + fPupSpillC->GetEntry(i); + this->WCRootData::GetEntry(i); } -void WCRootDataPileUpSpill::GetOutFileIdNumber(const int i, TString &s) -{ - std::stringstream ss; - ss << std::setw(5) << std::setfill('0') <GetOutFileIdNumber(fOutFileNum, sOutFileNum); +void WCRootDataPileUpSpill::CreateTree(const char* prefix) { + TString sOutFileNum = ""; + this->GetOutFileIdNumber(fOutFileNum, sOutFileNum); + + if(prefix != 0) { + fOutFilePrefix = TString(prefix); + } + TString OutFileName = fOutFilePrefix + "." + sOutFileNum + ".root"; + std::cout << " Creating new output file: " << OutFileName << std::endl; + fOutFileNum += 1; + this->WCRootData::CreateTree(OutFileName); + + TFile* f = fWCSimT->GetCurrentFile(); + fPupSpillT = new TTree(fPupSpillTreeName, "Pile-up spill tree"); + fPupSpillT->SetDirectory(f); + fPupSpill.CreateBranch(fPupSpillT); + fPupSpill.Clear(); + + fCurSpill = 0; +} - if( prefix!=0 ){ fOutFilePrefix = TString(prefix); } - TString OutFileName = fOutFilePrefix + "." + sOutFileNum + ".root"; - std::cout<<" Creating new output file: " << OutFileName <WCRootData::CreateTree(OutFileName); +void WCRootDataPileUpSpill::FillTree() { + if(fCurSpill == fNumOfSpillsPerFile) { + this->WriteTree(); + this->CreateTree(); + } - TFile *f = fWCSimT->GetCurrentFile(); - fPupSpillT = new TTree(fPupSpillTreeName, "Pile-up spill tree"); - fPupSpillT->SetDirectory(f); - fPupSpill.CreateBranch(fPupSpillT); - fPupSpill.Clear(); + TFile* f = fWCSimT->GetCurrentFile(); + f->cd(); + fWCSimT->Fill(); + fWCSimT->Write("", TObject::kOverwrite); + fPupSpillT->Fill(); + fPupSpillT->Write("", TObject::kOverwrite); - fCurSpill = 0; -} + fSpEvt[0]->ReInitialize(); + fPupSpill.Clear(); -void WCRootDataPileUpSpill::FillTree() -{ - if( fCurSpill==fNumOfSpillsPerFile ) - { - this->WriteTree(); - this->CreateTree(); - } - - TFile *f = fWCSimT->GetCurrentFile(); - f->cd(); - fWCSimT->Fill(); - fWCSimT->Write("", TObject::kOverwrite); - fPupSpillT->Fill(); - fPupSpillT->Write("", TObject::kOverwrite); - - fSpEvt[0]->ReInitialize(); - fPupSpill.Clear(); - - fCurSpill += 1; + fCurSpill += 1; } -void WCRootDataPileUpSpill::WriteTree() -{ - TFile *f = fWCSimT->GetCurrentFile(); - this->WCRootData::SetOutFileName(f->GetName()); - f->cd(); +void WCRootDataPileUpSpill::WriteTree() { + TFile* f = fWCSimT->GetCurrentFile(); + this->WCRootData::SetOutFileName(f->GetName()); + f->cd(); - fWCSimT->Write(); - fPupSpillT->Write(); + fWCSimT->Write(); + fPupSpillT->Write(); - f->Close(); + f->Close(); - if( fFileNameToBeCopied!="" ) - { - this->CopyTree(fFileNameToBeCopied, "wcsimGeoT"); - this->CopyTree(fFileNameToBeCopied, "Settings"); - } + if(fFileNameToBeCopied != "") { + this->CopyTree(fFileNameToBeCopied, "wcsimGeoT"); + this->CopyTree(fFileNameToBeCopied, "Settings"); + } } -void WCRootDataPileUpSpill::AddInteraction(const WCRootDataNuInt *aNuInt, - float offset_time, - int bunch_id) -{ - fPupSpill.NuIntType[fPupSpill.NNuIntTot] = aNuInt->GetInteractionType(); - fPupSpill.NuIntTime[fPupSpill.NNuIntTot] = offset_time; - fPupSpill.NuIntBunch[fPupSpill.NNuIntTot] = bunch_id; - fPupSpill.EdepoOD[fPupSpill.NNuIntTot] = aNuInt->GetEnergyDepositionInOD(); - fPupSpill.FileIdNum[fPupSpill.NNuIntTot] = aNuInt->GetFileIdNumber(); - fPupSpill.EventIdNum[fPupSpill.NNuIntTot] = aNuInt->GetEventIdNumber(); - aNuInt->SetInteractionInformation(&fPupSpill); - - this->AddTracks(aNuInt->GetTrigger(0), offset_time); - - const int iFirst = fPupSpill.NTracks; - const int nTrackTmp = ((TClonesArray*)fSpEvt[0]->GetTrigger(0)->GetTracks())->GetEntries(); - for(int i=iFirst; iGetInteractionType()==0 ){ fPupSpill.NIDNuInt += 1; } - else if( aNuInt->GetInteractionType()==1 ){ fPupSpill.NBeamBkg += 1; } +void WCRootDataPileUpSpill::AddInteraction(const WCRootDataNuInt* aNuInt, float offset_time, int bunch_id) { + fPupSpill.NuIntType[fPupSpill.NNuIntTot] = aNuInt->GetInteractionType(); + fPupSpill.NuIntTime[fPupSpill.NNuIntTot] = offset_time; + fPupSpill.NuIntBunch[fPupSpill.NNuIntTot] = bunch_id; + fPupSpill.EdepoOD[fPupSpill.NNuIntTot] = aNuInt->GetEnergyDepositionInOD(); + fPupSpill.FileIdNum[fPupSpill.NNuIntTot] = aNuInt->GetFileIdNumber(); + fPupSpill.EventIdNum[fPupSpill.NNuIntTot] = aNuInt->GetEventIdNumber(); + aNuInt->SetInteractionInformation(&fPupSpill); + + this->AddTracks(aNuInt->GetTrigger(0), offset_time); + + const int iFirst = fPupSpill.NTracks; + const int nTrackTmp = ((TClonesArray*)fSpEvt[0]->GetTrigger(0)->GetTracks())->GetEntries(); + for(int i = iFirst; i < nTrackTmp; i++) { + fPupSpill.TrackNuIntIdx[i] = fPupSpill.NNuIntTot; + fPupSpill.NTracks += 1; + } + + fPupSpill.NNuIntTot += 1; + if(aNuInt->GetInteractionType() == 0) { + fPupSpill.NIDNuInt += 1; + } + else if(aNuInt->GetInteractionType() == 1) { + fPupSpill.NBeamBkg += 1; + } } -void WCRootDataPileUpSpill::AddDigiHitsToMDT(MDTManager *mdt, +void WCRootDataPileUpSpill::AddDigiHitsToMDT(MDTManager* mdt, float time_low, float time_up, - float mean_bunch_time) -{ - const WCSimRootTrigger* aEvt = this->WCRootData::GetTrigger(0); - const TClonesArray *allDigiHits = aEvt->GetCherenkovDigiHits(); - const int nAllDigiHits = allDigiHits->GetEntries(); - - HitTubeCollection *hc = mdt->GetHitTubeCollection(); - for(int i=0; iAt(i); - - float t = aHit->GetT(); - - int tube_id = aHit->GetTubeId(); - float q = aHit->GetQ(); - int mPMT_module_id = aHit->GetmPMTId(); - int mPMT_pmt_id = aHit->GetmPMT_PMTId(); - vector true_hit_ids = aHit->GetPhotonIds(); - - if( !hc->HasTube(tube_id) ) - { - hc->AddHitTube(tube_id); - } - (&(*hc)[tube_id])->AddDigiHit(t, q, true_hit_ids); - } - cout<<" Total - before adding AP: " << hc->GetTotalNumOfDigiHits() <GetHitTubeCollection(); - mdt->DoAddAfterpulse(); - cout<<" Total - after adding AP: " << hc->GetTotalNumOfDigiHits() <Begin(); !hc->IsEnd(); hc->Next()) - { - HitTube *aPH = &(*hc)(); - int tube_id = aPH->GetTubeID(); - for(int i=0; iGetNDigiHits(); i++) - { - float t = aPH->GetTimeDigi(i); - if( !(t>time_low && t true_hit_ids = aPH->GetParentCompositionDigi(i); - t = t - mean_bunch_time; - float q = aPH->GetChargeDigi(i); - - if( !hcSel->HasTube(tube_id) ) - { - hcSel->AddHitTube(tube_id); - } - (&(*hcSel)[tube_id])->AddDigiHit(t, q, true_hit_ids); - } // digi hit loop - aPH = NULL; - n++; - } // PMT loop - cout<<" Selected with adding AP: " << hcSel->GetTotalNumOfDigiHits() <SetHitTubeCollection(hcSel); - hc = 0; - hcSel = 0; + float mean_bunch_time) { + const WCSimRootTrigger* aEvt = this->WCRootData::GetTrigger(0); + const TClonesArray* allDigiHits = aEvt->GetCherenkovDigiHits(); + const int nAllDigiHits = allDigiHits->GetEntries(); + + HitTubeCollection* hc = mdt->GetHitTubeCollection(); + for(int i = 0; i < nAllDigiHits; i++) { + WCSimRootCherenkovDigiHit* aHit = (WCSimRootCherenkovDigiHit*)allDigiHits->At(i); + + float t = aHit->GetT(); + + int tube_id = aHit->GetTubeId(); + float q = aHit->GetQ(); + int mPMT_module_id = aHit->GetmPMTId(); + int mPMT_pmt_id = aHit->GetmPMT_PMTId(); + vector true_hit_ids = aHit->GetPhotonIds(); + + if(!hc->HasTube(tube_id)) { + hc->AddHitTube(tube_id); + } + (&(*hc)[tube_id])->AddDigiHit(t, q, true_hit_ids); + } + cout << " Total - before adding AP: " << hc->GetTotalNumOfDigiHits() << endl; + hc = 0; + hc = mdt->GetHitTubeCollection(); + mdt->DoAddAfterpulse(); + cout << " Total - after adding AP: " << hc->GetTotalNumOfDigiHits() << endl; + + HitTubeCollection* hcSel = new HitTubeCollection(); + int n = 0; + for(hc->Begin(); !hc->IsEnd(); hc->Next()) { + HitTube* aPH = &(*hc)(); + int tube_id = aPH->GetTubeID(); + for(int i = 0; i < aPH->GetNDigiHits(); i++) { + float t = aPH->GetTimeDigi(i); + if(!(t > time_low && t < time_up)) { + continue; + } + + vector true_hit_ids = aPH->GetParentCompositionDigi(i); + t = t - mean_bunch_time; + float q = aPH->GetChargeDigi(i); + + if(!hcSel->HasTube(tube_id)) { + hcSel->AddHitTube(tube_id); + } + (&(*hcSel)[tube_id])->AddDigiHit(t, q, true_hit_ids); + } // digi hit loop + aPH = NULL; + n++; + } // PMT loop + cout << " Selected with adding AP: " << hcSel->GetTotalNumOfDigiHits() << endl; + mdt->SetHitTubeCollection(hcSel); + hc = 0; + hcSel = 0; } diff --git a/cpp/include/Configuration.h b/cpp/include/Configuration.h index 120e2ad..938b1af 100644 --- a/cpp/include/Configuration.h +++ b/cpp/include/Configuration.h @@ -1,48 +1,48 @@ #pragma once -#include #include +#include +#include #include -#include #include -#include +#include using std::cout; using std::endl; -using std::vector; -using std::stringstream; -using std::string; using std::ifstream; using std::map; +using std::string; +using std::stringstream; +using std::vector; - -struct Value_t -{ - int i; - float f; - string s; +struct Value_t { + int i; + float f; + string s; }; -class Configuration -{ - public : - static Configuration* GetInstance(); - void Finalize(); +class Configuration { + public: + + static Configuration* GetInstance(); + void Finalize(); - void ReadParameter(string); - void PrintParameters(); + void ReadParameter(string); + void PrintParameters(); void AddValue(string, string); - template T GetValue(string); - template void GetValue(string, T&); + template T GetValue(string); + template void GetValue(string, T&); + + string ParseMDTROOT(string); + + protected: - string ParseMDTROOT(string); + Configuration(); - protected : - Configuration(); + private: - private : - static Configuration *fTheInstance; + static Configuration* fTheInstance; - bool IsAvailable(string&,bool forceexit=true); - map fMpValue; + bool IsAvailable(string&, bool forceexit = true); + map fMpValue; }; diff --git a/cpp/include/HitDigitizer.h b/cpp/include/HitDigitizer.h index 70d56b1..9925216 100644 --- a/cpp/include/HitDigitizer.h +++ b/cpp/include/HitDigitizer.h @@ -1,32 +1,33 @@ +#include #include #include -#include #include "HitTubeCollection.h" -#include "PMTResponse.h" #include "MTRandom.h" +#include "PMTResponse.h" using std::cout; using std::endl; using std::vector; -class HitDigitizer -{ - public: - HitDigitizer(int s=67823); - virtual ~HitDigitizer(); - void Digitize(HitTubeCollection*, PMTResponse*); - void DigitizeTube(HitTube*, PMTResponse*); - - void ApplyThreshold(double&, bool&); - double DoTruncate(const double, const double); - - private: - float fPrecisionCharge; - float fPrecisionTiming; - float fEfficiency; - float fIntegWindow; - int fApplyEff; - - MTRandom *fRand; +class HitDigitizer { + public: + + HitDigitizer(int s = 67823); + virtual ~HitDigitizer(); + void Digitize(HitTubeCollection*, PMTResponse*); + void DigitizeTube(HitTube*, PMTResponse*); + + void ApplyThreshold(double&, bool&); + double DoTruncate(const double, const double); + + private: + + float fPrecisionCharge; + float fPrecisionTiming; + float fEfficiency; + float fIntegWindow; + int fApplyEff; + + MTRandom* fRand; }; diff --git a/cpp/include/HitTube.h b/cpp/include/HitTube.h index 5822ee2..79951c7 100644 --- a/cpp/include/HitTube.h +++ b/cpp/include/HitTube.h @@ -1,12 +1,12 @@ -// This class manages informaion about both true and digitized hits +// This class manages informaion about both true and digitized hits // This class assumed to be instanceated for each PMT // The following information is stored: // // - true hits (just photoelectrons) // - number of true hits -// - true hit time -// - parent charged particle ID -// - negative value for noise +// - true hit time +// - parent charged particle ID +// - negative value for noise // // - digitized hits // - number of digitized hits @@ -16,70 +16,78 @@ #pragma once -#include #include +#include #include "TrueHit.h" using std::vector; -class HitTube -{ - public: - HitTube(int); - virtual ~HitTube(); - void SetTubeID(const int i){ fTubeID = i; } - int GetTubeID() const { return fTubeID; } +class HitTube { + public: + + HitTube(int); + virtual ~HitTube(); + + void SetTubeID(const int i) { fTubeID = i; } + + int GetTubeID() const { return fTubeID; } + float GetPosition(int i) const { return fPosition[i]; } + float GetOrientation(int i) const { return fOrientation[i]; } + void SetPosition(int i, float f) { fPosition[i] = f; } + void SetOrientation(int i, float f) { fOrientation[i] = f; } + void AddRawPE(const float t, const int id = 9999999) { + fPhotoElectrons.push_back(new TrueHit(t, id)); + fNRawPE += 1; + } + + void AddRawPE(TrueHit* th) { + fPhotoElectrons.push_back(th); + fNRawPE += 1; + } + + int GetNRawPE() const { return fNRawPE; } + + float GetTimeRaw(const int i) const { return fPhotoElectrons[i]->GetTime(); } + + void SortTrueHits() { + std::sort( + fPhotoElectrons.begin(), + fPhotoElectrons.end(), + [](const TrueHit* left, const TrueHit* right) { return left->GetTime() < right->GetTime(); }); + } + + const vector& GetPhotoElectrons() const { return fPhotoElectrons; } + + void AddDigiHit(const float t, const float q, const vector& id = vector()) { + fTimeDigi.push_back(t); + fChargeDigi.push_back(q); + fParentCompDigi.push_back(id); + fNDigiHits += 1; + } + + int GetNDigiHits() const { return fNDigiHits; } + + float GetTimeDigi(const int i) const { return fTimeDigi[i]; } + + float GetChargeDigi(const int i) const { return fChargeDigi[i]; } + + const vector& GetParentCompositionDigi(const int i) const { return fParentCompDigi[i]; } + + private: + + int fNRawPE; + vector fPhotoElectrons; - void AddRawPE(const float t, const int id=9999999) - { - fPhotoElectrons.push_back(new TrueHit(t, id)); - fNRawPE+=1; - } - void AddRawPE(TrueHit* th) - { - fPhotoElectrons.push_back(th); - fNRawPE+=1; - } - int GetNRawPE() const { return fNRawPE; } - float GetTimeRaw(const int i) const { return fPhotoElectrons[i]->GetTime(); } - void SortTrueHits() - { - std::sort(fPhotoElectrons.begin(), - fPhotoElectrons.end(), - [](const TrueHit* left, const TrueHit* right) - { return left->GetTime() < right->GetTime(); } - ); - } - const vector& GetPhotoElectrons() const { return fPhotoElectrons; } - - void AddDigiHit(const float t, const float q, const vector &id=vector()) - { - fTimeDigi.push_back( t ); - fChargeDigi.push_back( q ); - fParentCompDigi.push_back( id ); - fNDigiHits+=1; - } - - int GetNDigiHits() const { return fNDigiHits; } - float GetTimeDigi(const int i) const { return fTimeDigi[i]; } - float GetChargeDigi(const int i) const { return fChargeDigi[i]; } - const vector& GetParentCompositionDigi(const int i) const { return fParentCompDigi[i]; } - - - private: - int fNRawPE; - vector fPhotoElectrons; - - int fTubeID; - int fNDigiHits; + int fTubeID; + int fNDigiHits; float fPosition[3]; float fOrientation[3]; - vector fTimeDigi; - vector fChargeDigi; - vector> fParentCompDigi; + vector fTimeDigi; + vector fChargeDigi; + vector> fParentCompDigi; }; diff --git a/cpp/include/HitTubeCollection.h b/cpp/include/HitTubeCollection.h index 31188d3..58f04f0 100644 --- a/cpp/include/HitTubeCollection.h +++ b/cpp/include/HitTubeCollection.h @@ -11,34 +11,48 @@ using std::endl; using std::map; using std::string; -class HitTubeCollection -{ - public: - HitTubeCollection(); - virtual ~HitTubeCollection(); - bool HasTube(const int id){ return fPHs.count(id)!=0 ? true : false; } - void AddHitTube(const int); +class HitTubeCollection { + public: + + HitTubeCollection(); + virtual ~HitTubeCollection(); + + bool HasTube(const int id) { return fPHs.count(id) != 0 ? true : false; } + + void AddHitTube(const int); void AddTrueHit(const int, const float, const int); void AddDigiHit(const int, const float, const float); - int GetNumOfHitTubes() const { return fPHs.size(); } - int GetTotalNumOfTrueHits(); - int GetTotalNumOfDigiHits(); - void Clear(); - void Begin() { fItr = fPHs.begin(); } - bool IsEnd() { return fItr==fPHs.end() ? true : false; } - void Next() { fItr++; } - HitTube* GetHitTube(int id=-1) { if( id<0 ){ return &(*fPHs[fItr->first]); } return &(*fPHs[id]); } + int GetNumOfHitTubes() const { return fPHs.size(); } + + int GetTotalNumOfTrueHits(); + int GetTotalNumOfDigiHits(); + void Clear(); + + void Begin() { fItr = fPHs.begin(); } - HitTube& operator ()() { return *fPHs[fItr->first]; } - HitTube& operator [](int id) { return *fPHs[id]; } + bool IsEnd() { return fItr == fPHs.end() ? true : false; } + + void Next() { fItr++; } + + HitTube* GetHitTube(int id = -1) { + if(id < 0) { + return &(*fPHs[fItr->first]); + } + return &(*fPHs[id]); + } + + HitTube& operator()() { return *fPHs[fItr->first]; } + + HitTube& operator[](int id) { return *fPHs[id]; } const vector& GetHitTubeIDList() const { return fTubeList; } - private: - map fPHs; - map::iterator fItr; + private: + + map fPHs; + map::iterator fItr; vector fTubeList; - int fNTrueHitsTotal; - int fNDigiHitsTotal; + int fNTrueHitsTotal; + int fNDigiHitsTotal; }; diff --git a/cpp/include/MDTManager.h b/cpp/include/MDTManager.h index 81ac243..60065b0 100644 --- a/cpp/include/MDTManager.h +++ b/cpp/include/MDTManager.h @@ -2,48 +2,50 @@ #include +#include "Configuration.h" +#include "HitDigitizer.h" #include "HitTube.h" -#include "PMTNoise.h" #include "HitTubeCollection.h" -#include "HitDigitizer.h" -#include "TriggerInfo.h" -#include "TriggerAlgo.h" -#include "Configuration.h" -#include "PMTAfterpulse.h" #include "MTRandom.h" +#include "PMTAfterpulse.h" +#include "PMTNoise.h" +#include "TriggerAlgo.h" +#include "TriggerInfo.h" using std::map; -class MDTManager -{ - public: - MDTManager(int seed=78923); - virtual ~MDTManager(); - - HitTubeCollection* GetHitTubeCollection(const string &s="Def") { return fPHC[s]; } - TriggerInfo* GetTriggerInfo(const string &s="Def") { return fTrigInfo[s]; } - - void RegisterPMTType(const string &s="Def", PMTResponse *p=0); - - void DoInitialize(); - void DoAddDark(const string &s="Def"); - void DoDigitize(const string &s="Def"); - void DoTrigger(const string &s="Def"); - void DoAddAfterpulse(const string &s="Def"); - - void SetHitTubeCollection(HitTubeCollection*, const string &s="Def"); - bool HasThisPMTType(const string&); - - PMTResponse* GetPMTResponse(const string &s="Def") { return fPMTResp[s]; } - - private: - TriggerAlgo *fTrigAlgo; - HitDigitizer *fDgtzr; - MTRandom *fRndm; - - map fTrigInfo; - map fPMTResp; - map fDark; - map fPHC; - string fDefName; +class MDTManager { + public: + + MDTManager(int seed = 78923); + virtual ~MDTManager(); + + HitTubeCollection* GetHitTubeCollection(const string& s = "Def") { return fPHC[s]; } + + TriggerInfo* GetTriggerInfo(const string& s = "Def") { return fTrigInfo[s]; } + + void RegisterPMTType(const string& s = "Def", PMTResponse* p = 0); + + void DoInitialize(); + void DoAddDark(const string& s = "Def"); + void DoDigitize(const string& s = "Def"); + void DoTrigger(const string& s = "Def"); + void DoAddAfterpulse(const string& s = "Def"); + + void SetHitTubeCollection(HitTubeCollection*, const string& s = "Def"); + bool HasThisPMTType(const string&); + + PMTResponse* GetPMTResponse(const string& s = "Def") { return fPMTResp[s]; } + + private: + + TriggerAlgo* fTrigAlgo; + HitDigitizer* fDgtzr; + MTRandom* fRndm; + + map fTrigInfo; + map fPMTResp; + map fDark; + map fPHC; + string fDefName; }; diff --git a/cpp/include/MTRandom.h b/cpp/include/MTRandom.h index 4b3a351..a04de50 100644 --- a/cpp/include/MTRandom.h +++ b/cpp/include/MTRandom.h @@ -1,58 +1,63 @@ #pragma once -#include #include +#include using std::vector; -class MTRandom -{ - public: - MTRandom(int s){ SetSeed(s); } - virtual ~MTRandom(){}; - double Rndm(); - double Gaus(double m=0., double s=1.0); - int Poisson(double); - unsigned int Integer(unsigned int imax){ return (unsigned int)(imax*Rndm()); } - double Uniform(double x1, double x2){ return x1 + (x2-x1)*Rndm(); } - double Histogram(vector&, vector&, vector&); - - private : - void SetSeed(int); - unsigned int fMt[624]; - int fCount624; - int fSeed; - - static const int kM; - static const int kN; - static const unsigned int kTemperingMaskB; - static const unsigned int kTemperingMaskC; - static const unsigned int kUpperMask; - static const unsigned int kLowerMask; - static const unsigned int kMatrixA; - - static const double kC1; - static const double kC2; - static const double kC3; - static const double kD1; - static const double kD2; - static const double kD3; - static const double kHm; - static const double kZm; - static const double kHp; - static const double kZp; - static const double kPhln; - static const double kHm1; - static const double kHp1; - static const double kHzm; - static const double kHzmp; - /*zhm 0.967882898*/ - static const double kAs; - static const double kBs; - static const double kCs; - static const double kB ; - static const double kX0; - static const double kYm; - static const double kS ; - static const double kT ; +class MTRandom { + public: + + MTRandom(int s) { SetSeed(s); } + + virtual ~MTRandom() {}; + double Rndm(); + double Gaus(double m = 0., double s = 1.0); + int Poisson(double); + + unsigned int Integer(unsigned int imax) { return (unsigned int)(imax * Rndm()); } + + double Uniform(double x1, double x2) { return x1 + (x2 - x1) * Rndm(); } + + double Histogram(vector&, vector&, vector&); + + private: + + void SetSeed(int); + unsigned int fMt[624]; + int fCount624; + int fSeed; + + static const int kM; + static const int kN; + static const unsigned int kTemperingMaskB; + static const unsigned int kTemperingMaskC; + static const unsigned int kUpperMask; + static const unsigned int kLowerMask; + static const unsigned int kMatrixA; + + static const double kC1; + static const double kC2; + static const double kC3; + static const double kD1; + static const double kD2; + static const double kD3; + static const double kHm; + static const double kZm; + static const double kHp; + static const double kZp; + static const double kPhln; + static const double kHm1; + static const double kHp1; + static const double kHzm; + static const double kHzmp; + /*zhm 0.967882898*/ + static const double kAs; + static const double kBs; + static const double kCs; + static const double kB; + static const double kX0; + static const double kYm; + static const double kS; + static const double kT; }; diff --git a/cpp/include/PMTAfterpulse.h b/cpp/include/PMTAfterpulse.h index b294e39..b8959cc 100644 --- a/cpp/include/PMTAfterpulse.h +++ b/cpp/include/PMTAfterpulse.h @@ -1,9 +1,9 @@ #pragma once -#include #include -#include +#include #include +#include #include "MTRandom.h" @@ -13,26 +13,26 @@ using std::string; using std::stringstream; using std::vector; -class PMTAfterpulse -{ - public: - PMTAfterpulse(); - virtual ~PMTAfterpulse(); +class PMTAfterpulse { + public: + + PMTAfterpulse(); + virtual ~PMTAfterpulse(); + + bool GenerateAfterpulse(const float, const vector&, MTRandom*); + float GetAfterpulseTime(const float, MTRandom*); - bool GenerateAfterpulse(const float, const vector&, MTRandom*); - float GetAfterpulseTime(const float, MTRandom*); + private: - - private: - void LoadTimingCDF(const string&); + void LoadTimingCDF(const string&); - vector fCDF_BinEdgeLow; - vector fCDF_BinEdgeUp; - vector fCDF_BinCenter; - vector fCDF; - float fSlope; - float fIntercept; + vector fCDF_BinEdgeLow; + vector fCDF_BinEdgeUp; + vector fCDF_BinCenter; + vector fCDF; + float fSlope; + float fIntercept; - int fDoAdd; - string fTxtFileCDF; + int fDoAdd; + string fTxtFileCDF; }; diff --git a/cpp/include/PMTNoise.h b/cpp/include/PMTNoise.h index 72836ac..574be15 100644 --- a/cpp/include/PMTNoise.h +++ b/cpp/include/PMTNoise.h @@ -1,71 +1,75 @@ #pragma once -#include -#include -#include -#include #include +#include +#include #include #include +#include +#include -#include "MTRandom.h" #include "HitTubeCollection.h" +#include "MTRandom.h" #include "PMTAfterpulse.h" using std::cout; using std::endl; -using std::vector; -using std::pair; using std::map; +using std::pair; using std::string; +using std::vector; class HitDigitizer; class PMTResponse; -class PMTNoise -{ - public : - PMTNoise(const int, const string &s=""); - virtual ~PMTNoise(); - - void SetNumberOfPMTs(const int); - void SetMinTubeID(const int); - void SetMaxTubeID(const int); - void SetWindowLow(const double /* ns */); - void SetWindowUp(const double /* ns */); - void SetDarkRate(const double /* kHz */); - void SetDarkMode(const int i){ fDarkMode = i; } - - void GenerateDarkNoise(double, double, bool isDPE=false, const bool verbose=false); - int GetNumberOfGeneratedDarkHits() const; - int GetNumberOfGeneratedDarkPhotoElectrons() const; - int GetNoiseTube(const int i) const { return fNoisePMT[i]; } - double GetNoiseTime(const int i) const { return fNoiseTime[i]; } - - void AddPhotoElectrons(HitTubeCollection*); - void Add(HitTubeCollection*, double, double); - void FindRanges(HitTubeCollection*, vector>&); - - void AddAfterpulse(HitTubeCollection*, HitDigitizer*, PMTResponse *pr); - - private : - MTRandom *fRand; - int fNPMTs; - int fMinTubeID; - int fMaxTubeID; - float fWinLow; - float fWinUp; - float fDarkRate; - float fAveNoise; - float fConvRate; - float fWindow; - int fDarkMode; - - int fNnoise; - vector fNoisePMT; - vector fNoiseTime; - - PMTAfterpulse *fAftpulse; - - string fPMTType; +class PMTNoise { + public: + + PMTNoise(const int, const string& s = ""); + virtual ~PMTNoise(); + + void SetNumberOfPMTs(const int); + void SetMinTubeID(const int); + void SetMaxTubeID(const int); + void SetWindowLow(const double /* ns */); + void SetWindowUp(const double /* ns */); + void SetDarkRate(const double /* kHz */); + + void SetDarkMode(const int i) { fDarkMode = i; } + + void GenerateDarkNoise(double, double, bool isDPE = false, const bool verbose = false); + int GetNumberOfGeneratedDarkHits() const; + int GetNumberOfGeneratedDarkPhotoElectrons() const; + + int GetNoiseTube(const int i) const { return fNoisePMT[i]; } + + double GetNoiseTime(const int i) const { return fNoiseTime[i]; } + + void AddPhotoElectrons(HitTubeCollection*); + void Add(HitTubeCollection*, double, double); + void FindRanges(HitTubeCollection*, vector>&); + + void AddAfterpulse(HitTubeCollection*, HitDigitizer*, PMTResponse* pr); + + private: + + MTRandom* fRand; + int fNPMTs; + int fMinTubeID; + int fMaxTubeID; + float fWinLow; + float fWinUp; + float fDarkRate; + float fAveNoise; + float fConvRate; + float fWindow; + int fDarkMode; + + int fNnoise; + vector fNoisePMT; + vector fNoiseTime; + + PMTAfterpulse* fAftpulse; + + string fPMTType; }; diff --git a/cpp/include/PMTResponse.h b/cpp/include/PMTResponse.h index 8a25388..7ab0da0 100644 --- a/cpp/include/PMTResponse.h +++ b/cpp/include/PMTResponse.h @@ -1,8 +1,8 @@ #pragma once #include -#include "MTRandom.h" #include "HitTube.h" +#include "MTRandom.h" using std::string; @@ -11,69 +11,74 @@ using std::string; // - generation of SPE // - timing resolution // -class PMTResponse -{ - public: - virtual double GetRawSPE(const TrueHit* th=NULL, const HitTube* ht=NULL) = 0; - virtual float HitTimeSmearing(float) = 0; - virtual void Initialize(int, const string &s="") = 0; - virtual bool ApplyDE(const TrueHit* th=NULL, const HitTube* ht=NULL) = 0; - - protected: - MTRandom *fRand; - string fPMTType; - float fSclFacTTS; +class PMTResponse { + public: + + virtual double GetRawSPE(const TrueHit* th = NULL, const HitTube* ht = NULL) = 0; + virtual float HitTimeSmearing(float) = 0; + virtual void Initialize(int, const string& s = "") = 0; + virtual bool ApplyDE(const TrueHit* th = NULL, const HitTube* ht = NULL) = 0; + + protected: + + MTRandom* fRand; + string fPMTType; + float fSclFacTTS; }; -// Based on the implementation of R12199_02 3'' PMT for mPMT in WCSim -// - WCSimPMTObject.cc -class GenericPMTResponse : public PMTResponse -{ - public: - GenericPMTResponse(const int, const string &s=""); - GenericPMTResponse(); - virtual ~GenericPMTResponse(); - void Initialize(int, const string &s=""); - virtual double GetRawSPE(const TrueHit* th=NULL, const HitTube* ht=NULL); - virtual float HitTimeSmearing(float); - virtual bool ApplyDE(const TrueHit* th=NULL, const HitTube* ht=NULL); - - protected: - void LoadCDFOfSPE(const string &s); - float fqpe0[501]; - string fTxtFileSPECDF; - - //private: - protected: - float fTResConstant; - float fTResMinimum; +// Based on the implementation of R12199_02 3'' PMT for mPMT in WCSim +// - WCSimPMTObject.cc +class GenericPMTResponse : public PMTResponse { + public: + + GenericPMTResponse(const int, const string& s = ""); + GenericPMTResponse(); + virtual ~GenericPMTResponse(); + void Initialize(int, const string& s = ""); + virtual double GetRawSPE(const TrueHit* th = NULL, const HitTube* ht = NULL); + virtual float HitTimeSmearing(float); + virtual bool ApplyDE(const TrueHit* th = NULL, const HitTube* ht = NULL); + + protected: + + void LoadCDFOfSPE(const string& s); + float fqpe0[501]; + string fTxtFileSPECDF; + + // private: + + protected: + + float fTResConstant; + float fTResMinimum; }; +class ResponseBoxandLine20inchHQE : public GenericPMTResponse { + public: + + ResponseBoxandLine20inchHQE(int, const string& s = ""); + ResponseBoxandLine20inchHQE(); + virtual ~ResponseBoxandLine20inchHQE(); + float HitTimeSmearing(float); + void Initialize(int, const string& s = ""); -class ResponseBoxandLine20inchHQE : public GenericPMTResponse -{ - public: - ResponseBoxandLine20inchHQE(int, const string &s=""); - ResponseBoxandLine20inchHQE(); - virtual ~ResponseBoxandLine20inchHQE(); - float HitTimeSmearing(float); - void Initialize(int, const string &s=""); + private: - private: - static const double ksig_param[4]; - static const double klambda_param[2]; - double fhighcharge_param[2]; + static const double ksig_param[4]; + static const double klambda_param[2]; + double fhighcharge_param[2]; }; -class Response3inchR14374 : public GenericPMTResponse -{ - public: - Response3inchR14374(int, const string &s=""); - Response3inchR14374(); - virtual ~Response3inchR14374(); - float HitTimeSmearing(float); - void Initialize(int, const string &s=""); - - private: - double fTimeResAt1PE; +class Response3inchR14374 : public GenericPMTResponse { + public: + + Response3inchR14374(int, const string& s = ""); + Response3inchR14374(); + virtual ~Response3inchR14374(); + float HitTimeSmearing(float); + void Initialize(int, const string& s = ""); + + private: + + double fTimeResAt1PE; }; diff --git a/cpp/include/TriggerAlgo.h b/cpp/include/TriggerAlgo.h index fcf4045..b015af2 100644 --- a/cpp/include/TriggerAlgo.h +++ b/cpp/include/TriggerAlgo.h @@ -1,10 +1,10 @@ // Apply event trigger to a given set of dititized PMT hits (map) // The resultant triggers are saved in a TrggerInfo class object #pragma once +#include #include #include #include -#include #include "HitTubeCollection.h" #include "TriggerInfo.h" @@ -14,21 +14,23 @@ using std::endl; using std::map; using std::vector; -class TriggerAlgo -{ - public: - TriggerAlgo(); - virtual ~TriggerAlgo(){}; - - void NDigits(HitTubeCollection*, TriggerInfo*); - float GetTriggerTimeForFailure() const { return fTriggerTimeForFailure; } - - private: - map fPreTriggerWindow; - map fPostTriggerWindow; - float fTriggerOffsetTime; - float fTriggerTimeForFailure; - float fNDigitsWindow; - float fNDigitsStepSize; - int fNDigitsThreshold; +class TriggerAlgo { + public: + + TriggerAlgo(); + virtual ~TriggerAlgo() {}; + + void NDigits(HitTubeCollection*, TriggerInfo*); + + float GetTriggerTimeForFailure() const { return fTriggerTimeForFailure; } + + private: + + map fPreTriggerWindow; + map fPostTriggerWindow; + float fTriggerOffsetTime; + float fTriggerTimeForFailure; + float fNDigitsWindow; + float fNDigitsStepSize; + int fNDigitsThreshold; }; diff --git a/cpp/include/TriggerInfo.h b/cpp/include/TriggerInfo.h index 7a273fc..a281b22 100644 --- a/cpp/include/TriggerInfo.h +++ b/cpp/include/TriggerInfo.h @@ -1,5 +1,5 @@ // Store the following information -// - Number of event triggers +// - Number of event triggers // - Triggered time // - Lower edge // - Upper edge @@ -14,29 +14,34 @@ using std::cout; using std::endl; using std::vector; -enum class TriggerType : int { eNDigits=0, - eFailure}; - -class TriggerInfo -{ - public: - TriggerInfo(); - virtual ~TriggerInfo(); - - void AddTrigger(float, float, float, int, int); - void Clear(); - - int GetNumOfTrigger() const { return (int)fTrigTime.size(); } - float GetTriggerTime(int i) const { return fTrigTime[i]; } - float GetLowEdge(int i) const { return fTimeLow[i]; } - float GetUpEdge(int i) const { return fTimeUp[i]; } - int GetNHits(int i) const { return fNHits[i]; } - int GetType(int i) const { return fTrigType[i]; } - - private: - vector fTrigTime; - vector fTimeLow; - vector fTimeUp; - vector fNHits; - vector fTrigType; +enum class TriggerType : int { eNDigits = 0, eFailure }; + +class TriggerInfo { + public: + + TriggerInfo(); + virtual ~TriggerInfo(); + + void AddTrigger(float, float, float, int, int); + void Clear(); + + int GetNumOfTrigger() const { return (int)fTrigTime.size(); } + + float GetTriggerTime(int i) const { return fTrigTime[i]; } + + float GetLowEdge(int i) const { return fTimeLow[i]; } + + float GetUpEdge(int i) const { return fTimeUp[i]; } + + int GetNHits(int i) const { return fNHits[i]; } + + int GetType(int i) const { return fTrigType[i]; } + + private: + + vector fTrigTime; + vector fTimeLow; + vector fTimeUp; + vector fNHits; + vector fTrigType; }; diff --git a/cpp/include/TrueHit.h b/cpp/include/TrueHit.h index d0b591a..2ba7a92 100644 --- a/cpp/include/TrueHit.h +++ b/cpp/include/TrueHit.h @@ -1,35 +1,48 @@ #pragma once -class TrueHit -{ - public: - TrueHit(float t, int id=999999999); - TrueHit(); - virtual ~TrueHit(); - - float GetTime() const { return fTime; } - float GetParentId() const { return fParentId; } - float GetPosition(int i) const { return fPosition[i]; } - float GetDirection(int i) const { return fDirection[i]; } - float GetStartTime() const {return fStartTime; } - float GetStartPosition(int i) const { return fStartPosition[i]; } - float GetStartDirection(int i) const { return fStartDirection[i]; } - int GetPosBin(int i) const { return fBin[i]; } - - void SetPosition(int i, float f) { fPosition[i] = f; } - void SetDirection(int i, float f) { fDirection[i] = f; } - void SetStartTime(float f) { fStartTime = f; } - void SetStartPosition(int i, float f) { fStartPosition[i] = f; } - void SetStartDirection(int i, float f) { fStartDirection[i] = f; } - void SetPosBin(int i, int b){ fBin[i] = b; } - - private: - float fTime; - float fPosition[3]; // Hit position on photocade - float fDirection[3]; // Direction of photon hitting photocathode - float fStartTime; // Photon track initial time - float fStartPosition[3]; // Photon track initial position - float fStartDirection[3]; // Photon track initial direction - int fParentId; - int fBin[3]; +class TrueHit { + public: + + TrueHit(float t, int id = 999999999); + TrueHit(); + virtual ~TrueHit(); + + float GetTime() const { return fTime; } + + float GetParentId() const { return fParentId; } + + float GetPosition(int i) const { return fPosition[i]; } + + float GetDirection(int i) const { return fDirection[i]; } + + float GetStartTime() const { return fStartTime; } + + float GetStartPosition(int i) const { return fStartPosition[i]; } + + float GetStartDirection(int i) const { return fStartDirection[i]; } + + int GetPosBin(int i) const { return fBin[i]; } + + void SetPosition(int i, float f) { fPosition[i] = f; } + + void SetDirection(int i, float f) { fDirection[i] = f; } + + void SetStartTime(float f) { fStartTime = f; } + + void SetStartPosition(int i, float f) { fStartPosition[i] = f; } + + void SetStartDirection(int i, float f) { fStartDirection[i] = f; } + + void SetPosBin(int i, int b) { fBin[i] = b; } + + private: + + float fTime; + float fPosition[3]; // Hit position on photocade + float fDirection[3]; // Direction of photon hitting photocathode + float fStartTime; // Photon track initial time + float fStartPosition[3]; // Photon track initial position + float fStartDirection[3]; // Photon track initial direction + int fParentId; + int fBin[3]; }; diff --git a/cpp/src/Configuration.cc b/cpp/src/Configuration.cc index f5a1d24..28140cb 100644 --- a/cpp/src/Configuration.cc +++ b/cpp/src/Configuration.cc @@ -2,152 +2,141 @@ #include -Configuration* Configuration::fTheInstance=0; +Configuration* Configuration::fTheInstance = 0; -Configuration::Configuration() -{ - fMpValue.clear(); +Configuration::Configuration() { + fMpValue.clear(); } -void Configuration::Finalize() -{ - fMpValue.clear(); +void Configuration::Finalize() { + fMpValue.clear(); } -Configuration* Configuration::GetInstance() -{ - if( fTheInstance==0 ) - { - fTheInstance=new Configuration(); - cout<<" Instanciating Configuration for the first time" < int Configuration::GetValue(string name) -{ - if( this->IsAvailable(name) ) - return fMpValue[name].i; +template<> int Configuration::GetValue(string name) { + if(this->IsAvailable(name)) + return fMpValue[name].i; } -template <> float Configuration::GetValue(string name) -{ - if( this->IsAvailable(name) ) - return fMpValue[name].f; +template<> float Configuration::GetValue(string name) { + if(this->IsAvailable(name)) + return fMpValue[name].f; } -template <> string Configuration::GetValue(string name) -{ - if( this->IsAvailable(name) ) - return fMpValue[name].s; +template<> string Configuration::GetValue(string name) { + if(this->IsAvailable(name)) + return fMpValue[name].s; } -template <> void Configuration::GetValue(string name, int &t) -{ - if( this->IsAvailable(name, false) ){ t = fMpValue[name].i; } +template<> void Configuration::GetValue(string name, int& t) { + if(this->IsAvailable(name, false)) { + t = fMpValue[name].i; + } } -template <> void Configuration::GetValue(string name, float &t) -{ - if( this->IsAvailable(name, false) ){ t = fMpValue[name].f; } +template<> void Configuration::GetValue(string name, float& t) { + if(this->IsAvailable(name, false)) { + t = fMpValue[name].f; + } } - -template <> void Configuration::GetValue(string name, string &t) -{ - if( this->IsAvailable(name, false) ){ t = fMpValue[name].s; } +template<> void Configuration::GetValue(string name, string& t) { + if(this->IsAvailable(name, false)) { + t = fMpValue[name].s; + } } -void Configuration::ReadParameter(string infilename) -{ -// Array parameter is not supported yet - infilename = ParseMDTROOT(infilename); - ifstream fin(infilename); - if( !fin.is_open() ) - { - cout<<" Cannot open the file: " << infilename <')!=string::npos) ){ continue; } - - stringstream ss(aLine); - ss.ignore(aLine.size(), '<'); - ss >> sname; - ss.ignore(aLine.size(), '='); - ss >> svalue; - this->AddValue(sname, svalue); - } - fin.close(); +void Configuration::ReadParameter(string infilename) { + // Array parameter is not supported yet + infilename = ParseMDTROOT(infilename); + ifstream fin(infilename); + if(!fin.is_open()) { + cout << " Cannot open the file: " << infilename << endl; + exit(-1); + } + cout << " Loading parameter settings from: " << infilename << endl; + + string aLine; + string sname; + string svalue; + while(std::getline(fin, aLine)) { + if(aLine[0] == '#') { + continue; + } + + if(!(aLine.find('<') != string::npos && aLine.find('=') != string::npos && + aLine.find('>') != string::npos)) { + continue; + } + + stringstream ss(aLine); + ss.ignore(aLine.size(), '<'); + ss >> sname; + ss.ignore(aLine.size(), '='); + ss >> svalue; + this->AddValue(sname, svalue); + } + fin.close(); } -void Configuration::PrintParameters() -{ - map::iterator itr; +void Configuration::PrintParameters() { + map::iterator itr; - string stmp1 = " *********** Available Pareameters ********** " ; - string stmp2 = " ******************************************** " ; + string stmp1 = " *********** Available Pareameters ********** "; + string stmp2 = " ******************************************** "; - cout<< stmp1 <first <<": " << itr->second.s <first << ": " << itr->second.s << endl; + } + cout << stmp2 << endl; } -bool Configuration::IsAvailable(string &sName, bool forceexit) -{ - bool tmp = false; - if( fMpValue.count(sName)==0 ) - { - cout<<" Parameter: " << sName <<" is not available " < EXIT " < EXIT " << endl; + exit(-1); + } + } + else { + tmp = true; + } + return tmp; } -string Configuration::ParseMDTROOT(string filename) -{ - std::size_t found = filename.find("$MDTROOT"); - if (found!=string::npos) - { - if (std::getenv("MDTROOT")) filename.replace(found,8,std::getenv("MDTROOT")); - else - { - cout<<" [ERROR] Configuration::ParseMDTROOT" < EXIT" < EXIT" << endl; + exit(-1); + } + } + + return filename; } \ No newline at end of file diff --git a/cpp/src/HitDigitizer.cc b/cpp/src/HitDigitizer.cc index 4d00858..bbaba19 100644 --- a/cpp/src/HitDigitizer.cc +++ b/cpp/src/HitDigitizer.cc @@ -1,145 +1,139 @@ #include "HitDigitizer.h" #include "Configuration.h" - + HitDigitizer::HitDigitizer(int seed) : -fPrecisionCharge(0.), -fPrecisionTiming(0.1), -fEfficiency( 0.985 ), -fIntegWindow( 200. ), -fApplyEff( 1 ) -{ - fRand = new MTRandom( seed ); - Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue("DigiHitIntegrationWindow", fIntegWindow); - Conf->GetValue("PrecisionTiming", fPrecisionTiming); - Conf->GetValue("PrecisionCharge", fPrecisionCharge); - Conf->GetValue("ApplyDAQEfficiency", fApplyEff); + fPrecisionCharge(0.), fPrecisionTiming(0.1), fEfficiency(0.985), fIntegWindow(200.), fApplyEff(1) { + fRand = new MTRandom(seed); + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue("DigiHitIntegrationWindow", fIntegWindow); + Conf->GetValue("PrecisionTiming", fPrecisionTiming); + Conf->GetValue("PrecisionCharge", fPrecisionCharge); + Conf->GetValue("ApplyDAQEfficiency", fApplyEff); } -HitDigitizer::~HitDigitizer() -{ - if( fRand ){ delete fRand; fRand = NULL; } +HitDigitizer::~HitDigitizer() { + if(fRand) { + delete fRand; + fRand = NULL; + } } -void HitDigitizer::Digitize(HitTubeCollection *hc, PMTResponse *pr) -{ - for(hc->Begin(); !hc->IsEnd(); hc->Next()) - { - if( (&(*hc)())->GetNRawPE()>0 ) - { - this->DigitizeTube(&(*hc)(), pr); - } - } +void HitDigitizer::Digitize(HitTubeCollection* hc, PMTResponse* pr) { + for(hc->Begin(); !hc->IsEnd(); hc->Next()) { + if((&(*hc)())->GetNRawPE() > 0) { + this->DigitizeTube(&(*hc)(), pr); + } + } } // Based on WCSimWCDigitizerSKI::DigitizeHits in WCSimWCDigitizer.cc -void HitDigitizer::DigitizeTube(HitTube *aHT, PMTResponse *pr) -{ - aHT->SortTrueHits(); - const int NPE = aHT->GetNRawPE(); - const vector PEs = aHT->GetPhotoElectrons(); +void HitDigitizer::DigitizeTube(HitTube* aHT, PMTResponse* pr) { + aHT->SortTrueHits(); + const int NPE = aHT->GetNRawPE(); + const vector PEs = aHT->GetPhotoElectrons(); - // Taken from WCSimWCDigitizerSKI::DigitizeHits - double sumSPE = 0.; - double tSmeared = -9999.; - bool isAlive = false; - double digiT = 0.; - double digiQ = 0.; + // Taken from WCSimWCDigitizerSKI::DigitizeHits + double sumSPE = 0.; + double tSmeared = -9999.; + bool isAlive = false; + double digiT = 0.; + double digiQ = 0.; - double intgr_srt = (double)PEs[0]->GetTime(); - double intgr_end = intgr_srt+fIntegWindow; - vector parent_composition; - parent_composition.clear(); + double intgr_srt = (double)PEs[0]->GetTime(); + double intgr_end = intgr_srt + fIntegWindow; + vector parent_composition; + parent_composition.clear(); - for(int iPE=0; iPEGetTime()>=intgr_srt && PEs[iPE]->GetTime()GetRawSPE(PEs[iPE], aHT); - parent_composition.push_back( PEs[iPE]->GetParentId() ); - } - else - { - digiT = intgr_srt; - digiQ = sumSPE; + for(int iPE = 0; iPE < NPE; iPE++) { + if(PEs[iPE]->GetTime() >= intgr_srt && PEs[iPE]->GetTime() < intgr_end) { + sumSPE += pr->GetRawSPE(PEs[iPE], aHT); + parent_composition.push_back(PEs[iPE]->GetParentId()); + } + else { + digiT = intgr_srt; + digiQ = sumSPE; - isAlive = true; - if (fApplyEff ){ this->ApplyThreshold(digiQ, isAlive); } - if( isAlive ) - { - tSmeared = pr->HitTimeSmearing(digiQ); - digiQ *= fEfficiency; - digiT += tSmeared; - digiQ = this->DoTruncate(digiQ, fPrecisionCharge); - digiT = this->DoTruncate(digiT, fPrecisionTiming); - aHT->AddDigiHit(digiT, digiQ, parent_composition); - } - sumSPE = 0.; - parent_composition.clear(); + isAlive = true; + if(fApplyEff) { + this->ApplyThreshold(digiQ, isAlive); + } + if(isAlive) { + tSmeared = pr->HitTimeSmearing(digiQ); + digiQ *= fEfficiency; + digiT += tSmeared; + digiQ = this->DoTruncate(digiQ, fPrecisionCharge); + digiT = this->DoTruncate(digiT, fPrecisionTiming); + aHT->AddDigiHit(digiT, digiQ, parent_composition); + } + sumSPE = 0.; + parent_composition.clear(); - intgr_srt = PEs[iPE]->GetTime(); - intgr_end = intgr_srt+fIntegWindow; - sumSPE += pr->GetRawSPE(PEs[iPE], aHT); - parent_composition.push_back( PEs[iPE]->GetParentId() ); - } - } + intgr_srt = PEs[iPE]->GetTime(); + intgr_end = intgr_srt + fIntegWindow; + sumSPE += pr->GetRawSPE(PEs[iPE], aHT); + parent_composition.push_back(PEs[iPE]->GetParentId()); + } + } - digiT = intgr_srt; - digiQ = sumSPE; - tSmeared = pr->HitTimeSmearing(digiQ); - isAlive = true; - if (fApplyEff ){ this->ApplyThreshold(digiQ, isAlive); } - if( isAlive ) - { - digiQ *= fEfficiency; - digiT += tSmeared ; - digiQ = this->DoTruncate(digiQ, fPrecisionCharge); - digiT = this->DoTruncate(digiT, fPrecisionTiming); - aHT->AddDigiHit(digiT, digiQ, parent_composition); - } + digiT = intgr_srt; + digiQ = sumSPE; + tSmeared = pr->HitTimeSmearing(digiQ); + isAlive = true; + if(fApplyEff) { + this->ApplyThreshold(digiQ, isAlive); + } + if(isAlive) { + digiQ *= fEfficiency; + digiT += tSmeared; + digiQ = this->DoTruncate(digiQ, fPrecisionCharge); + digiT = this->DoTruncate(digiT, fPrecisionTiming); + aHT->AddDigiHit(digiT, digiQ, parent_composition); + } } +void HitDigitizer::ApplyThreshold(double& pe, bool& pass) { + // Apply DAQ efficiency + // Taken from WCSimWCDigitizerSKI::Threshold + // in WCSimWCDigitizer.hh + // + // NOTE: the input charge, pe, will be altered in this function + pass = true; + double x = pe + 0.1; + double thr = 0.; + if(x < 1.1) { + thr = std::min( + 1.0, + -0.06374 + + x * (3.748 + + x * (-63.23 + + x * (452.0 + + x * (-1449.0 + + x * (2513.0 + + x * (-2529. + + x * (1472.0 + x * (-452.2 + x * (51.34 + x * 2.370)))))))))); + } + else { + thr = 1.0; + } -void HitDigitizer::ApplyThreshold(double& pe, bool& pass) -{ -// Apply DAQ efficiency -// Taken from WCSimWCDigitizerSKI::Threshold -// in WCSimWCDigitizer.hh -// -// NOTE: the input charge, pe, will be altered in this function - pass=true; - double x=pe+0.1; - double thr=0.; - if( x<1.1 ) - { - thr = std::min(1.0, - -0.06374+x*(3.748+x*(-63.23+x*(452.0+x*(-1449.0+x*(2513.0 - +x*(-2529.+x*(1472.0+x*(-452.2+x*(51.34+x*2.370)))))))))); - } - else - { - thr = 1.0; - } - - if( thrRndm() ) - { - pe=0.; - pass=false; - } - else - { - pe += fRand->Gaus(0., 0.03); - } + if(thr < fRand->Rndm()) { + pe = 0.; + pass = false; + } + else { + pe += fRand->Gaus(0., 0.03); + } } -double HitDigitizer::DoTruncate(const double x, const double precision) -{ -// Based on WCSimWCDigitizerBase::AddNewDigit in WCSimWCDigitizer.hh -// digitised hit information does not have infinite precision -// so need to round the charge and time information -// -// The following is based on WCSimWCDigitizerBas::Truncate -// in WCSimWCDigitizer.hh - if(precision < 1E-10){ return x; } - return precision * (int)(x/precision); +double HitDigitizer::DoTruncate(const double x, const double precision) { + // Based on WCSimWCDigitizerBase::AddNewDigit in WCSimWCDigitizer.hh + // digitised hit information does not have infinite precision + // so need to round the charge and time information + // + // The following is based on WCSimWCDigitizerBas::Truncate + // in WCSimWCDigitizer.hh + if(precision < 1E-10) { + return x; + } + return precision * (int)(x / precision); } diff --git a/cpp/src/HitTube.cc b/cpp/src/HitTube.cc index a7fd84d..d3de2eb 100644 --- a/cpp/src/HitTube.cc +++ b/cpp/src/HitTube.cc @@ -1,26 +1,23 @@ #include "HitTube.h" -HitTube::HitTube(int id) -{ - fNRawPE=0; - fPhotoElectrons.clear(); +HitTube::HitTube(int id) { + fNRawPE = 0; + fPhotoElectrons.clear(); - fNDigiHits=0; - fTimeDigi.clear(); - fChargeDigi.clear(); - fParentCompDigi.clear(); + fNDigiHits = 0; + fTimeDigi.clear(); + fChargeDigi.clear(); + fParentCompDigi.clear(); - fTubeID = id; + fTubeID = id; } +HitTube::~HitTube() { + vector().swap(fPhotoElectrons); + // vector>().swap( fPhotoElectrons ); + // vector().swap( fTrueHitInfo ); -HitTube::~HitTube() -{ - vector().swap(fPhotoElectrons ); - // vector>().swap( fPhotoElectrons ); - // vector().swap( fTrueHitInfo ); - - vector().swap( fTimeDigi ); - vector().swap( fChargeDigi ); - vector>().swap( fParentCompDigi ); + vector().swap(fTimeDigi); + vector().swap(fChargeDigi); + vector>().swap(fParentCompDigi); } diff --git a/cpp/src/HitTubeCollection.cc b/cpp/src/HitTubeCollection.cc index a68d22b..b196443 100644 --- a/cpp/src/HitTubeCollection.cc +++ b/cpp/src/HitTubeCollection.cc @@ -1,67 +1,53 @@ #include "HitTubeCollection.h" -HitTubeCollection::HitTubeCollection() : -fNTrueHitsTotal(0), -fNDigiHitsTotal(0) -{ - fPHs.clear(); +HitTubeCollection::HitTubeCollection() : fNTrueHitsTotal(0), fNDigiHitsTotal(0) { + fPHs.clear(); fTubeList.clear(); } -HitTubeCollection::~HitTubeCollection() -{ - this->Clear(); +HitTubeCollection::~HitTubeCollection() { + this->Clear(); } -void HitTubeCollection::Clear() -{ - map::iterator itr; - for(itr=fPHs.begin(); itr!=fPHs.end(); ++itr) - { - delete itr->second; itr->second=NULL; - } - fPHs.clear(); - vector().swap(fTubeList); +void HitTubeCollection::Clear() { + map::iterator itr; + for(itr = fPHs.begin(); itr != fPHs.end(); ++itr) { + delete itr->second; + itr->second = NULL; + } + fPHs.clear(); + vector().swap(fTubeList); } -void HitTubeCollection::AddHitTube(const int id) -{ - if( fPHs.count(id)==0 ) - { - fPHs[id] = new HitTube(id); +void HitTubeCollection::AddHitTube(const int id) { + if(fPHs.count(id) == 0) { + fPHs[id] = new HitTube(id); fTubeList.push_back(id); - } + } } -void HitTubeCollection::AddTrueHit(const int tube_id, const float time, const int parent_id) -{ +void HitTubeCollection::AddTrueHit(const int tube_id, const float time, const int parent_id) { this->AddHitTube(tube_id); fPHs[tube_id]->AddRawPE(time, parent_id); } -void HitTubeCollection::AddDigiHit(const int id, const float time, const float charge) -{ +void HitTubeCollection::AddDigiHit(const int id, const float time, const float charge) { this->AddHitTube(id); - fPHs[id]->AddDigiHit(time, charge); + fPHs[id]->AddDigiHit(time, charge); } - -int HitTubeCollection::GetTotalNumOfTrueHits() -{ - int n = 0; - for(fItr=fPHs.begin(); fItr!=fPHs.end(); fItr++) - { - n += fItr->second->GetNRawPE(); - } - return n; +int HitTubeCollection::GetTotalNumOfTrueHits() { + int n = 0; + for(fItr = fPHs.begin(); fItr != fPHs.end(); fItr++) { + n += fItr->second->GetNRawPE(); + } + return n; } -int HitTubeCollection::GetTotalNumOfDigiHits() -{ - int n = 0; - for(fItr=fPHs.begin(); fItr!=fPHs.end(); fItr++) - { - n += fItr->second->GetNDigiHits(); - } - return n; +int HitTubeCollection::GetTotalNumOfDigiHits() { + int n = 0; + for(fItr = fPHs.begin(); fItr != fPHs.end(); fItr++) { + n += fItr->second->GetNDigiHits(); + } + return n; } diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index 708f04f..e9ab213 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -1,130 +1,125 @@ #include "MDTManager.h" -MDTManager::MDTManager(int seed) -{ - fRndm = new MTRandom( seed ); - fTrigAlgo = new TriggerAlgo(); - fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); - - fPMTResp.clear(); - fDark.clear(); - fPHC.clear(); - fTrigInfo.clear(); +MDTManager::MDTManager(int seed) { + fRndm = new MTRandom(seed); + fTrigAlgo = new TriggerAlgo(); + fDgtzr = new HitDigitizer(fRndm->Integer(1000000)); + + fPMTResp.clear(); + fDark.clear(); + fPHC.clear(); + fTrigInfo.clear(); } -MDTManager::~MDTManager() -{ - if( fTrigAlgo ){ delete fTrigAlgo; fTrigAlgo = NULL; } - if( fRndm ){ delete fRndm; fRndm = NULL; } - - map::iterator iPMTResp; - for(iPMTResp=fPMTResp.begin(); iPMTResp!=fPMTResp.end(); iPMTResp++) - { - std::cout<<" Deleting" << iPMTResp->first <second; iPMTResp->second = NULL; - } - fPMTResp.clear(); - - map::iterator iDark; - for(iDark=fDark.begin(); iDark!=fDark.end(); iDark++) - { - delete iDark->second; iDark->second = NULL; - } - fDark.clear(); - - map::iterator iPHC; - for(iPHC=fPHC.begin(); iPHC!=fPHC.end(); iPHC++) - { - delete iPHC->second; iPHC->second = NULL; - } - fPHC.clear(); - - map::iterator iTrigInfo; - for(iTrigInfo=fTrigInfo.begin(); iTrigInfo!=fTrigInfo.end(); iTrigInfo++) - { - delete iTrigInfo->second; iTrigInfo->second = NULL; - } - fTrigInfo.clear(); +MDTManager::~MDTManager() { + if(fTrigAlgo) { + delete fTrigAlgo; + fTrigAlgo = NULL; + } + if(fRndm) { + delete fRndm; + fRndm = NULL; + } + + map::iterator iPMTResp; + for(iPMTResp = fPMTResp.begin(); iPMTResp != fPMTResp.end(); iPMTResp++) { + std::cout << " Deleting" << iPMTResp->first << std::endl; + delete iPMTResp->second; + iPMTResp->second = NULL; + } + fPMTResp.clear(); + + map::iterator iDark; + for(iDark = fDark.begin(); iDark != fDark.end(); iDark++) { + delete iDark->second; + iDark->second = NULL; + } + fDark.clear(); + + map::iterator iPHC; + for(iPHC = fPHC.begin(); iPHC != fPHC.end(); iPHC++) { + delete iPHC->second; + iPHC->second = NULL; + } + fPHC.clear(); + + map::iterator iTrigInfo; + for(iTrigInfo = fTrigInfo.begin(); iTrigInfo != fTrigInfo.end(); iTrigInfo++) { + delete iTrigInfo->second; + iTrigInfo->second = NULL; + } + fTrigInfo.clear(); } -void MDTManager::DoAddDark(const string &pmtname) -{ - if( this->HasThisPMTType(pmtname) ) - { - fDark[pmtname]->AddPhotoElectrons(fPHC[pmtname]); - } +void MDTManager::DoAddDark(const string& pmtname) { + if(this->HasThisPMTType(pmtname)) { + fDark[pmtname]->AddPhotoElectrons(fPHC[pmtname]); + } } -void MDTManager::DoDigitize(const string &pmtname) -{ - if( this->HasThisPMTType(pmtname) ) - { - fDgtzr->Digitize(fPHC[pmtname], fPMTResp[pmtname]); - //cout<<" # true hits: " << fPHC[pmtname]->GetTotalNumOfTrueHits() +void MDTManager::DoDigitize(const string& pmtname) { + if(this->HasThisPMTType(pmtname)) { + fDgtzr->Digitize(fPHC[pmtname], fPMTResp[pmtname]); + // cout<<" # true hits: " << fPHC[pmtname]->GetTotalNumOfTrueHits() // <<" # digitized hits: " << fPHC[pmtname]->GetTotalNumOfDigiHits() // <HasThisPMTType(pmtname) ) - { - fTrigAlgo->NDigits(fPHC[pmtname], fTrigInfo[pmtname]); - } +void MDTManager::DoTrigger(const string& pmtname) { + if(this->HasThisPMTType(pmtname)) { + fTrigAlgo->NDigits(fPHC[pmtname], fTrigInfo[pmtname]); + } } -void MDTManager::DoAddAfterpulse(const string &pmtname) -{ - if( this->HasThisPMTType(pmtname) ) - { - fDark[pmtname]->AddAfterpulse(fPHC[pmtname], fDgtzr, fPMTResp[pmtname]); - } +void MDTManager::DoAddAfterpulse(const string& pmtname) { + if(this->HasThisPMTType(pmtname)) { + fDark[pmtname]->AddAfterpulse(fPHC[pmtname], fDgtzr, fPMTResp[pmtname]); + } } -void MDTManager::DoInitialize() -{ - map::iterator iTrigInfo; - for(iTrigInfo=fTrigInfo.begin(); iTrigInfo!=fTrigInfo.end(); iTrigInfo++) - { - iTrigInfo->second->Clear(); - } - - map::iterator iPHC; - for(iPHC=fPHC.begin(); iPHC!=fPHC.end(); iPHC++) - { - iPHC->second->Clear(); - } -} +void MDTManager::DoInitialize() { + map::iterator iTrigInfo; + for(iTrigInfo = fTrigInfo.begin(); iTrigInfo != fTrigInfo.end(); iTrigInfo++) { + iTrigInfo->second->Clear(); + } -void MDTManager::SetHitTubeCollection(HitTubeCollection *hc, const string &pmtname) -{ - if( this->HasThisPMTType(pmtname) ) - { - if( fPHC[pmtname] ){ delete fPHC[pmtname]; fPHC[pmtname] = NULL; } - fPHC[pmtname] = hc; - } + map::iterator iPHC; + for(iPHC = fPHC.begin(); iPHC != fPHC.end(); iPHC++) { + iPHC->second->Clear(); + } } -void MDTManager::RegisterPMTType(const string &pmtname, PMTResponse *pmtResp) -{ - fTrigInfo[pmtname] = new TriggerInfo(); - fPHC[pmtname] = new HitTubeCollection(); - fDark[pmtname] = new PMTNoise(fRndm->Integer(1000000), pmtname); +void MDTManager::SetHitTubeCollection(HitTubeCollection* hc, const string& pmtname) { + if(this->HasThisPMTType(pmtname)) { + if(fPHC[pmtname]) { + delete fPHC[pmtname]; + fPHC[pmtname] = NULL; + } + fPHC[pmtname] = hc; + } +} - if( pmtResp==0 ){ fPMTResp[pmtname] = new GenericPMTResponse(); } - else{ fPMTResp[pmtname] = pmtResp; } - fPMTResp[pmtname]->Initialize(fRndm->Integer(10000000), pmtname); +void MDTManager::RegisterPMTType(const string& pmtname, PMTResponse* pmtResp) { + fTrigInfo[pmtname] = new TriggerInfo(); + fPHC[pmtname] = new HitTubeCollection(); + fDark[pmtname] = new PMTNoise(fRndm->Integer(1000000), pmtname); + + if(pmtResp == 0) { + fPMTResp[pmtname] = new GenericPMTResponse(); + } + else { + fPMTResp[pmtname] = pmtResp; + } + fPMTResp[pmtname]->Initialize(fRndm->Integer(10000000), pmtname); } -bool MDTManager::HasThisPMTType(const string &pmtname) -{ - bool b = true; - if( fPHC.count(pmtname)==0 ) - { - std::cout<<" [ERROR] MDTManager::HasPMTType " < #include -const double kPI = 3.14159265358979323846; // TMath::Pi +const double kPI = 3.14159265358979323846; // TMath::Pi // Taken from $ROOTSYS/math/mathcore/TRadom.cxx and TRandom3.cxx -const int MTRandom::kM = 397; -const int MTRandom::kN = 624; -const unsigned int MTRandom::kTemperingMaskB = 0x9d2c5680; -const unsigned int MTRandom::kTemperingMaskC = 0xefc60000; -const unsigned int MTRandom::kUpperMask = 0x80000000; -const unsigned int MTRandom::kLowerMask = 0x7fffffff; -const unsigned int MTRandom::kMatrixA = 0x9908b0df; - -const double MTRandom::kC1 = 1.448242853; -const double MTRandom::kC2 = 3.307147487; -const double MTRandom::kC3 = 1.46754004; -const double MTRandom::kD1 = 1.036467755; -const double MTRandom::kD2 = 5.295844968; -const double MTRandom::kD3 = 3.631288474; -const double MTRandom::kHm = 0.483941449; -const double MTRandom::kZm = 0.107981933; -const double MTRandom::kHp = 4.132731354; -const double MTRandom::kZp = 18.52161694; +const int MTRandom::kM = 397; +const int MTRandom::kN = 624; +const unsigned int MTRandom::kTemperingMaskB = 0x9d2c5680; +const unsigned int MTRandom::kTemperingMaskC = 0xefc60000; +const unsigned int MTRandom::kUpperMask = 0x80000000; +const unsigned int MTRandom::kLowerMask = 0x7fffffff; +const unsigned int MTRandom::kMatrixA = 0x9908b0df; + +const double MTRandom::kC1 = 1.448242853; +const double MTRandom::kC2 = 3.307147487; +const double MTRandom::kC3 = 1.46754004; +const double MTRandom::kD1 = 1.036467755; +const double MTRandom::kD2 = 5.295844968; +const double MTRandom::kD3 = 3.631288474; +const double MTRandom::kHm = 0.483941449; +const double MTRandom::kZm = 0.107981933; +const double MTRandom::kHp = 4.132731354; +const double MTRandom::kZp = 18.52161694; const double MTRandom::kPhln = 0.4515827053; -const double MTRandom::kHm1 = 0.516058551; -const double MTRandom::kHp1 = 3.132731354; -const double MTRandom::kHzm = 0.375959516; +const double MTRandom::kHm1 = 0.516058551; +const double MTRandom::kHp1 = 3.132731354; +const double MTRandom::kHzm = 0.375959516; const double MTRandom::kHzmp = 0.591923442; /*zhm 0.967882898*/ @@ -34,155 +34,169 @@ const double MTRandom::kBs = 0.2452635696; const double MTRandom::kCs = 0.2770276848; const double MTRandom::kB = 0.5029324303; const double MTRandom::kX0 = 0.4571828819; -const double MTRandom::kYm = 0.187308492 ; -const double MTRandom::kS = 0.7270572718 ; +const double MTRandom::kYm = 0.187308492; +const double MTRandom::kS = 0.7270572718; const double MTRandom::kT = 0.03895759111; -void MTRandom::SetSeed(int s) -{ - fMt[0] = s; - fCount624 = 624; - // use multipliers from Knuth's "Art of Computer Programming" Vol. 2, 3rd Ed. p.106 - for(int i=1; i<624; i++) { - fMt[i] = (1812433253 * ( fMt[i-1] ^ ( fMt[i-1] >> 30)) + i ); - } +void MTRandom::SetSeed(int s) { + fMt[0] = s; + fCount624 = 624; + // use multipliers from Knuth's "Art of Computer Programming" Vol. 2, 3rd Ed. p.106 + for(int i = 1; i < 624; i++) { + fMt[i] = (1812433253 * (fMt[i - 1] ^ (fMt[i - 1] >> 30)) + i); + } } -double MTRandom::Gaus(double mean, double sigma) -{ - double result; - double rn,x,y,z; - do { - y = Rndm(); - - if (y>kHm1) { - result = kHp*y-kHp1; break; } - - else if (y0) ? (1+rn) : (-1+rn); - break; - } - - else if (y0) ? 2-rn : -2-rn; - if ((kC1-y)*(kC3+std::abs(z))0) - rn = 2+y/x; - else { - x = 1-x; - y = kYm-y; - rn = -(2+y/x); - } - if ((y-kAs+x)*(kCs+x)+kBs<0) { - result = rn; break; } - else if (y kHm1) { + result = kHp * y - kHp1; + break; + } + + else if(y < kZm) { + rn = kZp * y - 1; + result = (rn > 0) ? (1 + rn) : (-1 + rn); + break; + } + + else if(y < kHm) { + rn = Rndm(); + rn = rn - 1 + rn; + z = (rn > 0) ? 2 - rn : -2 - rn; + if((kC1 - y) * (kC3 + std::abs(z)) < kC2) { + result = z; + break; + } + else { + x = rn * rn; + if((y + kD1) * (kD3 + x) < kD2) { + result = rn; + break; + } + else if(kHzmp - y < exp(-(z * z + kPhln) / 2)) { + result = z; + break; + } + else if(y + kHzm < exp(-(x + kPhln) / 2)) { + result = rn; + break; + } + } + } + + while(1) { + x = Rndm(); + y = kYm * Rndm(); + z = kX0 - kS * x - y; + if(z > 0) + rn = 2 + y / x; + else { + x = 1 - x; + y = kYm - y; + rn = -(2 + y / x); + } + if((y - kAs + x) * (kCs + x) + kBs < 0) { + result = rn; + break; + } + else if(y < x + kT) + if(rn * rn < 4 * (kB - log(x))) { + result = rn; + break; + } + } + } + while(0); + return mean + sigma * result; } -//inline double MTRandom::Rndm() -double MTRandom::Rndm() -{ - unsigned int y; - if (fCount624 >= kN) { - int i; - - for (i=0; i < kN-kM; i++) { - y = (fMt[i] & kUpperMask) | (fMt[i+1] & kLowerMask); - fMt[i] = fMt[i+kM] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); - } - - for ( ; i < kN-1 ; i++) { - y = (fMt[i] & kUpperMask) | (fMt[i+1] & kLowerMask); - fMt[i] = fMt[i+kM-kN] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); - } - - y = (fMt[kN-1] & kUpperMask) | (fMt[0] & kLowerMask); - fMt[kN-1] = fMt[kM-1] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); - fCount624 = 0; - } - y = fMt[fCount624++]; - y ^= (y >> 11); - y ^= ((y << 7 ) & kTemperingMaskB ); - y ^= ((y << 15) & kTemperingMaskC ); - y ^= (y >> 18); - - // 2.3283064365386963e-10 == 1./(max+1) -> then returned value cannot be = 1.0 - if( y ) return { ( (double) y * 2.3283064365386963e-10) }; // * Power(2,-32) - return Rndm(); +// inline double MTRandom::Rndm() +double MTRandom::Rndm() { + unsigned int y; + if(fCount624 >= kN) { + int i; + + for(i = 0; i < kN - kM; i++) { + y = (fMt[i] & kUpperMask) | (fMt[i + 1] & kLowerMask); + fMt[i] = fMt[i + kM] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); + } + + for(; i < kN - 1; i++) { + y = (fMt[i] & kUpperMask) | (fMt[i + 1] & kLowerMask); + fMt[i] = fMt[i + kM - kN] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); + } + + y = (fMt[kN - 1] & kUpperMask) | (fMt[0] & kLowerMask); + fMt[kN - 1] = fMt[kM - 1] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); + fCount624 = 0; + } + y = fMt[fCount624++]; + y ^= (y >> 11); + y ^= ((y << 7) & kTemperingMaskB); + y ^= ((y << 15) & kTemperingMaskC); + y ^= (y >> 18); + + // 2.3283064365386963e-10 == 1./(max+1) -> then returned value cannot be = 1.0 + if(y) + return { ((double)y * 2.3283064365386963e-10) }; // * Power(2,-32) + return Rndm(); } -int MTRandom::Poisson(double mean) -{ - int n; - if (mean <= 0) return 0; - if (mean < 25) { - double expmean = exp(-mean); - double pir = 1; - n = -1; - while(1) { - n++; - pir *= Rndm(); - if (pir <= expmean) break; - } - return n; - } - // for large value we use inversion method - else if (mean < 1E9) { - double em, t, y; - - double sq = sqrt(2.0*mean); - double alxm = log(mean); - double g = mean*alxm - lgamma(mean + 1.0); - do { - do { - y = tan(kPI*Rndm()); - em = sq*y + mean; - } while( em < 0.0 ); - - em = floor(em); - t = 0.9*(1.0 + y*y)* exp(em*alxm - lgamma(em + 1.0) - g); - } while( Rndm()>t ); - return static_cast (em); - } - else { - // use Gaussian approximation vor very large values - return int(Gaus(0.,1.)*sqrt(mean) + mean +0.5); - } +int MTRandom::Poisson(double mean) { + int n; + if(mean <= 0) + return 0; + if(mean < 25) { + double expmean = exp(-mean); + double pir = 1; + n = -1; + while(1) { + n++; + pir *= Rndm(); + if(pir <= expmean) + break; + } + return n; + } + // for large value we use inversion method + else if(mean < 1E9) { + double em, t, y; + + double sq = sqrt(2.0 * mean); + double alxm = log(mean); + double g = mean * alxm - lgamma(mean + 1.0); + do { + do { + y = tan(kPI * Rndm()); + em = sq * y + mean; + } + while(em < 0.0); + + em = floor(em); + t = 0.9 * (1.0 + y * y) * exp(em * alxm - lgamma(em + 1.0) - g); + } + while(Rndm() > t); + return static_cast(em); + } + else { + // use Gaussian approximation vor very large values + return int(Gaus(0., 1.) * sqrt(mean) + mean + 0.5); + } } - // Generate random number that follows given 1D histogram (CDF) -double MTRandom::Histogram(vector &edgeLow, - vector &binCenter, - vector &cdf) -{ - double value = this->Rndm(); - auto low = lower_bound(cdf.begin(), cdf.end(), value); - int index = low - cdf.begin(); - if( *low!=value ){ index -= 1; } - double dx = binCenter[index+1] - binCenter[index]; - return binCenter[index] + dx*( (value - cdf[index])/(cdf[index+1] - cdf[index]) ); +double MTRandom::Histogram(vector& edgeLow, vector& binCenter, vector& cdf) { + double value = this->Rndm(); + auto low = lower_bound(cdf.begin(), cdf.end(), value); + int index = low - cdf.begin(); + if(*low != value) { + index -= 1; + } + double dx = binCenter[index + 1] - binCenter[index]; + return binCenter[index] + dx * ((value - cdf[index]) / (cdf[index + 1] - cdf[index])); } diff --git a/cpp/src/PMTAfterpulse.cc b/cpp/src/PMTAfterpulse.cc index 7068acc..74854f3 100644 --- a/cpp/src/PMTAfterpulse.cc +++ b/cpp/src/PMTAfterpulse.cc @@ -1,88 +1,80 @@ #include "PMTAfterpulse.h" #include "Configuration.h" -PMTAfterpulse::PMTAfterpulse() : -fSlope(0.3523), -fIntercept(0.5662), -fDoAdd(0), -fTxtFileCDF("") -{ - fCDF_BinEdgeLow.clear(); - fCDF_BinEdgeUp.clear(); - fCDF_BinCenter.clear(); - fCDF.clear(); +PMTAfterpulse::PMTAfterpulse() : fSlope(0.3523), fIntercept(0.5662), fDoAdd(0), fTxtFileCDF("") { + fCDF_BinEdgeLow.clear(); + fCDF_BinEdgeUp.clear(); + fCDF_BinCenter.clear(); + fCDF.clear(); - Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue("APRateSlope", fSlope); - Conf->GetValue("APRateIntercept", fIntercept); - Conf->GetValue("APTimeCDFFile", fTxtFileCDF); - Conf->GetValue("APDoAdd", fDoAdd); + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue("APRateSlope", fSlope); + Conf->GetValue("APRateIntercept", fIntercept); + Conf->GetValue("APTimeCDFFile", fTxtFileCDF); + Conf->GetValue("APDoAdd", fDoAdd); - if( fDoAdd==1 ){ this->LoadTimingCDF(fTxtFileCDF); } + if(fDoAdd == 1) { + this->LoadTimingCDF(fTxtFileCDF); + } } -PMTAfterpulse::~PMTAfterpulse() -{ - vector().swap( fCDF_BinEdgeLow ); - vector().swap( fCDF_BinEdgeUp ); - vector().swap( fCDF_BinCenter ); - vector().swap( fCDF ); +PMTAfterpulse::~PMTAfterpulse() { + vector().swap(fCDF_BinEdgeLow); + vector().swap(fCDF_BinEdgeUp); + vector().swap(fCDF_BinCenter); + vector().swap(fCDF); } -bool PMTAfterpulse::GenerateAfterpulse(const float charge, const vector &composition, MTRandom *r) -{ - // Do not add afterpulsing by default - if( fDoAdd==0 ){ return false; } +bool PMTAfterpulse::GenerateAfterpulse(const float charge, const vector& composition, MTRandom* r) { + // Do not add afterpulsing by default + if(fDoAdd == 0) { + return false; + } - float rate = fSlope*charge + fIntercept; - bool afterpulse = false; - if( composition.size()==1 && composition[0]==-1 ){ return afterpulse; } + float rate = fSlope * charge + fIntercept; + bool afterpulse = false; + if(composition.size() == 1 && composition[0] == -1) { + return afterpulse; + } - if( rate>1.0 ) - { - afterpulse = true; - } - else if( rate<1.0 ) - { - afterpulse = r->Rndm() 1.0) { + afterpulse = true; + } + else if(rate < 1.0) { + afterpulse = r->Rndm() < rate ? true : false; + } + return afterpulse; } -float PMTAfterpulse::GetAfterpulseTime(const float time, MTRandom *r) -{ - float dt = r->Histogram(fCDF_BinEdgeLow, fCDF_BinCenter, fCDF); - return time + dt*1000.; +float PMTAfterpulse::GetAfterpulseTime(const float time, MTRandom* r) { + float dt = r->Histogram(fCDF_BinEdgeLow, fCDF_BinCenter, fCDF); + return time + dt * 1000.; } -void PMTAfterpulse::LoadTimingCDF(const string &infiletxt) -{ - string aline; - string svalue; - ifstream fin(infiletxt); - if( !fin.is_open() ) - { - cout<<" [ERROR] PMTAfterpulse::LoadTimingCDF " <> svalue; - fCDF_BinEdgeLow.push_back( atof(svalue.c_str()) ); - ss >> svalue; - fCDF_BinCenter.push_back( atof(svalue.c_str()) ); - ss >> svalue; - fCDF_BinEdgeUp.push_back( atof(svalue.c_str()) ); - ss >> svalue; - fCDF.push_back( atof(svalue.c_str()) ); - if( fCDF[nRead]==1.0 ) - { - break; - } - } - fin.close(); + int nRead = 0; + while(std::getline(fin, aline)) { + stringstream ss(aline); + ss >> svalue; + fCDF_BinEdgeLow.push_back(atof(svalue.c_str())); + ss >> svalue; + fCDF_BinCenter.push_back(atof(svalue.c_str())); + ss >> svalue; + fCDF_BinEdgeUp.push_back(atof(svalue.c_str())); + ss >> svalue; + fCDF.push_back(atof(svalue.c_str())); + if(fCDF[nRead] == 1.0) { + break; + } + } + fin.close(); } diff --git a/cpp/src/PMTNoise.cc b/cpp/src/PMTNoise.cc index b5f135a..e528632 100644 --- a/cpp/src/PMTNoise.cc +++ b/cpp/src/PMTNoise.cc @@ -1,281 +1,246 @@ #include "PMTNoise.h" #include "Configuration.h" -#include "HitTube.h" #include "HitDigitizer.h" +#include "HitTube.h" #include "PMTResponse.h" -PMTNoise::PMTNoise(const int seed, const string &pmtname) : -fNPMTs( 10184 ), -fMinTubeID( 1 ), -fMaxTubeID( 10184 ), -fWinLow( 0. ), -fWinUp( 30000. ), -fWindow( 4000. ), -fDarkRate( 1. ), -fConvRate( 1.126 ), -fDarkMode( 1 ), -fNnoise( 0 ), -fPMTType( pmtname ) -{ - fRand = new MTRandom(seed); - fAftpulse = new PMTAfterpulse(); - - fNoisePMT.clear(); - fNoiseTime.clear(); - - map s; - s["DarkAddMode"] = "DarkAddMode"; - s["DarkRate"] = "DarkRate"; - s["DarkM0WindowLow"] = "DarkM0WindowLow"; - s["DarkM0WindowUp"] = "DarkM0WindowUp"; - s["DarkM1Window"] = "DarkM1Window"; - s["NumOfTubes"] = "NumOfTubes"; - s["MinTubeID"] = "MinTubeID"; - s["MaxTubeID"] = "MaxTubeID"; - - if( fPMTType!="" ) - { - map::iterator i; - for(i=s.begin(); i!=s.end(); i++) - { - i->second += "_" + fPMTType; - } - } - - Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue(s["DarkAddMode"], fDarkMode); - Conf->GetValue(s["DarkRate"], fDarkRate); - Conf->GetValue(s["DarkM0WindowLow"], fWinLow); - Conf->GetValue(s["DarkM0WindowUp"], fWinUp); - Conf->GetValue(s["DarkM1Window"], fWindow); +PMTNoise::PMTNoise(const int seed, const string& pmtname) : + fNPMTs(10184), + fMinTubeID(1), + fMaxTubeID(10184), + fWinLow(0.), + fWinUp(30000.), + fWindow(4000.), + fDarkRate(1.), + fConvRate(1.126), + fDarkMode(1), + fNnoise(0), + fPMTType(pmtname) { + fRand = new MTRandom(seed); + fAftpulse = new PMTAfterpulse(); + + fNoisePMT.clear(); + fNoiseTime.clear(); + + map s; + s["DarkAddMode"] = "DarkAddMode"; + s["DarkRate"] = "DarkRate"; + s["DarkM0WindowLow"] = "DarkM0WindowLow"; + s["DarkM0WindowUp"] = "DarkM0WindowUp"; + s["DarkM1Window"] = "DarkM1Window"; + s["NumOfTubes"] = "NumOfTubes"; + s["MinTubeID"] = "MinTubeID"; + s["MaxTubeID"] = "MaxTubeID"; + + if(fPMTType != "") { + map::iterator i; + for(i = s.begin(); i != s.end(); i++) { + i->second += "_" + fPMTType; + } + } + + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue(s["DarkAddMode"], fDarkMode); + Conf->GetValue(s["DarkRate"], fDarkRate); + Conf->GetValue(s["DarkM0WindowLow"], fWinLow); + Conf->GetValue(s["DarkM0WindowUp"], fWinUp); + Conf->GetValue(s["DarkM1Window"], fWindow); Conf->GetValue(s["NumOfTubes"], fNPMTs); Conf->GetValue(s["MinTubeID"], fMinTubeID); Conf->GetValue(s["MaxTubeID"], fMaxTubeID); - } -PMTNoise::~PMTNoise() -{ - if( !fRand ){ delete fRand; fRand = NULL;} - if( fAftpulse ){ delete fAftpulse; fAftpulse = NULL; } +PMTNoise::~PMTNoise() { + if(!fRand) { + delete fRand; + fRand = NULL; + } + if(fAftpulse) { + delete fAftpulse; + fAftpulse = NULL; + } } - -void PMTNoise::SetNumberOfPMTs(const int npmts) -{ - fNPMTs = npmts; +void PMTNoise::SetNumberOfPMTs(const int npmts) { + fNPMTs = npmts; } -void PMTNoise::SetMinTubeID(const int tubeID) -{ - fMinTubeID = tubeID; +void PMTNoise::SetMinTubeID(const int tubeID) { + fMinTubeID = tubeID; } -void PMTNoise::SetMaxTubeID(const int tubeID) -{ - fMaxTubeID = tubeID; +void PMTNoise::SetMaxTubeID(const int tubeID) { + fMaxTubeID = tubeID; } -void PMTNoise::SetWindowLow(const double wlow) -{ - fWinLow = wlow; +void PMTNoise::SetWindowLow(const double wlow) { + fWinLow = wlow; } - -void PMTNoise::SetWindowUp(const double wup) -{ - fWinUp = wup; +void PMTNoise::SetWindowUp(const double wup) { + fWinUp = wup; } - -void PMTNoise::SetDarkRate(const double rate) -{ - fDarkRate = rate; +void PMTNoise::SetDarkRate(const double rate) { + fDarkRate = rate; } -void PMTNoise::GenerateDarkNoise(double tWinLow, double tWinUp, bool isDPE, const bool verbose) -{ - fAveNoise=(double)fNPMTs*fDarkRate*(tWinUp - tWinLow); - // Generate photoelectrons corresponding given dark rate +void PMTNoise::GenerateDarkNoise(double tWinLow, double tWinUp, bool isDPE, const bool verbose) { + fAveNoise = (double)fNPMTs * fDarkRate * (tWinUp - tWinLow); + // Generate photoelectrons corresponding given dark rate // fConvRate: a correction that accounts for the effect of DAQ efficiency // NOTE: digi hit having charge < 1 p.e can be rejected by DAQ - if( isDPE ){ fAveNoise = fAveNoise*fConvRate; } - - // fDarkRate and windowSize are given in kHz and ns, respectively - fAveNoise/=1000000.; - - fNoisePMT.clear(); - fNoiseTime.clear(); - - fNnoise = fRand->Poisson( fAveNoise ); - fNoisePMT.reserve( fNnoise ); - fNoiseTime.reserve( fNnoise ); - int iTubeID=0; - for(int i=0; iInteger( fNPMTs ); - if( iTubeID>fMaxTubeID ) - { - cout<<" [ERROR] PMTNoise::GenerateDarkNoise " < EXIT " <Uniform(tWinLow, tWinUp); - } - - if( verbose ) - { - cout<<" [INFO] PMTNoise::GenerateDarkNoise " <Poisson(fAveNoise); + fNoisePMT.reserve(fNnoise); + fNoiseTime.reserve(fNnoise); + int iTubeID = 0; + for(int i = 0; i < fNnoise; i++) { + iTubeID = fMinTubeID + fRand->Integer(fNPMTs); + if(iTubeID > fMaxTubeID) { + cout << " [ERROR] PMTNoise::GenerateDarkNoise " << endl; + cout << " - Generated tube ID:" << iTubeID << endl; + cout << " - EXceeding max tube ID:" << fMaxTubeID << endl; + cout << " -> EXIT " << endl; + exit(-1); + } + fNoisePMT[i] = iTubeID; + fNoiseTime[i] = fRand->Uniform(tWinLow, tWinUp); + } + + if(verbose) { + cout << " [INFO] PMTNoise::GenerateDarkNoise " << endl; + cout << " - Window Low:" << fWinLow << " (ns)" << endl; + cout << " - Window Up:" << fWinUp << " (ns)" << endl; + cout << " - # PMTs:" << fNPMTs << endl; + cout << " - Dark rate:" << fDarkRate << " (kHz)" << endl; + cout << " - Mean # noise hits:" << fAveNoise << endl; + cout << " - # generated noise hits:" << fNnoise << endl; + } } -int PMTNoise::GetNumberOfGeneratedDarkHits() const -{ - return fNnoise; +int PMTNoise::GetNumberOfGeneratedDarkHits() const { + return fNnoise; } -void PMTNoise::AddPhotoElectrons(HitTubeCollection* hc) -{ - vector< pair > range; - if( fDarkMode==1 ) - { - this->FindRanges(hc, range); - } - else - { - range.push_back( pair(fWinLow, fWinUp) ); - } - - for(unsigned int i=0; iAdd(hc, range[i].first, range[i].second); - } +void PMTNoise::AddPhotoElectrons(HitTubeCollection* hc) { + vector> range; + if(fDarkMode == 1) { + this->FindRanges(hc, range); + } + else { + range.push_back(pair(fWinLow, fWinUp)); + } + + for(unsigned int i = 0; i < range.size(); i++) { + this->Add(hc, range[i].first, range[i].second); + } } // Based on WCSimWCAddDarkNoise::FindDarkNoiseRanges in WCSimWCAddDarkNoise.cc -void PMTNoise::FindRanges(HitTubeCollection *hc, vector> &range) -{ -// - Add photoelectrons corresponding dark current -// to each true Cherenkov hit around +- "fWindow"/2 -// - Here these time windows are calculated - - range.clear(); - const int nTrueHits = hc->GetTotalNumOfTrueHits(); - vector> tmp; - tmp.reserve(nTrueHits); - - for(hc->Begin(); !hc->IsEnd(); hc->Next()) - { - HitTube *aPH = &(*hc)(); - const int nPE = aPH->GetNRawPE(); - for(int i=0; iGetTimeRaw(i); - double tLow = t - fWindow/2.; - double tUp = t + fWindow/2.; - tmp.push_back(pair(tLow, tUp)); - } - } - - // If no true hits are stored, add a dummy such that no dark noise is added in later stage - if( tmp.size()==0 ) - { - range.push_back(pair(0., 0.)); - } - else - { - // Sort the "tmp" vector in increasing order, then check whether or not - // the windows defined above overlapp with other window - std::sort(tmp.begin(), tmp.end()); - - vector>::iterator itr2 = tmp.begin(); - pair cur = *(itr2)++; - for(; itr2!=tmp.end(); itr2++) - { - if( cur.second>=itr2->first ) - { - cur.second = std::max(cur.second,itr2->second); - } - else - { - range.push_back( cur ); - cur = *(itr2); - } - } - range.push_back( cur ); - } +void PMTNoise::FindRanges(HitTubeCollection* hc, vector>& range) { + // - Add photoelectrons corresponding dark current + // to each true Cherenkov hit around +- "fWindow"/2 + // - Here these time windows are calculated + + range.clear(); + const int nTrueHits = hc->GetTotalNumOfTrueHits(); + vector> tmp; + tmp.reserve(nTrueHits); + + for(hc->Begin(); !hc->IsEnd(); hc->Next()) { + HitTube* aPH = &(*hc)(); + const int nPE = aPH->GetNRawPE(); + for(int i = 0; i < nPE; i++) { + float t = aPH->GetTimeRaw(i); + double tLow = t - fWindow / 2.; + double tUp = t + fWindow / 2.; + tmp.push_back(pair(tLow, tUp)); + } + } + + // If no true hits are stored, add a dummy such that no dark noise is added in later stage + if(tmp.size() == 0) { + range.push_back(pair(0., 0.)); + } + else { + // Sort the "tmp" vector in increasing order, then check whether or not + // the windows defined above overlapp with other window + std::sort(tmp.begin(), tmp.end()); + + vector>::iterator itr2 = tmp.begin(); + pair cur = *(itr2)++; + for(; itr2 != tmp.end(); itr2++) { + if(cur.second >= itr2->first) { + cur.second = std::max(cur.second, itr2->second); + } + else { + range.push_back(cur); + cur = *(itr2); + } + } + range.push_back(cur); + } } -void PMTNoise::Add(HitTubeCollection *hc, double tWinLow, double tWinUp) -{ - this->GenerateDarkNoise(tWinLow, tWinUp, true, false); - const int nDarkHits = this->GetNumberOfGeneratedDarkHits(); - for(int k=0; kGetNoiseTube(k); - float time = this->GetNoiseTime(k); +void PMTNoise::Add(HitTubeCollection* hc, double tWinLow, double tWinUp) { + this->GenerateDarkNoise(tWinLow, tWinUp, true, false); + const int nDarkHits = this->GetNumberOfGeneratedDarkHits(); + for(int k = 0; k < nDarkHits; k++) { + int tubeID = this->GetNoiseTube(k); + float time = this->GetNoiseTime(k); hc->AddTrueHit(tubeID, time, -1); - } - //cout<<" NumCkovPE(dark PE): " << nDarkHits <GetTotalNumOfDigiHits(); - int NAP = 0; - int NDigi = 0; - for(hc->Begin(); !hc->IsEnd(); hc->Next()) - { - HitTube *aPH = &(*hc)(); - NDigi += aPH->GetNDigiHits(); - - // Store digitize hits due to afterpluse temporally - HitTube *aPHAP = new HitTube(aPH->GetTubeID()); - for(int i=0; iGetNDigiHits(); i++) - { - float charge = aPH->GetChargeDigi(i); - const vector composition = aPH->GetParentCompositionDigi(i); - if( fAftpulse->GenerateAfterpulse(charge, composition, fRand) ) - { - double charge_ap = pr->GetRawSPE(); - bool pass = false; - hd->ApplyThreshold(charge_ap, pass); - while( !pass ) - { - charge_ap = pr->GetRawSPE(); - hd->ApplyThreshold(charge_ap, pass); - } - - float time_ap = fAftpulse->GetAfterpulseTime(aPH->GetTimeDigi(i), fRand); - vector comp_ap(1, -2); - aPHAP->AddDigiHit(time_ap, charge_ap, comp_ap); - NAP += 1; - } - } - - for(int i=0; iGetNDigiHits(); i++) - { - float time = aPHAP->GetTimeDigi(i); - float charge = aPHAP->GetChargeDigi(i); - const vector comp = aPHAP->GetParentCompositionDigi(i); - aPH->AddDigiHit(time, charge, comp); - } - } - - int NDigiHitsAf = hc->GetTotalNumOfDigiHits(); - cout<<" NDigiHits(w/o AP): " << NDigiHitsBf - <<" NDigiHits(w/ AP): " << NDigiHitsAf - <<" NAP: " << NAP - <<" NDigi: " << NDigi - <GetTotalNumOfDigiHits(); + int NAP = 0; + int NDigi = 0; + for(hc->Begin(); !hc->IsEnd(); hc->Next()) { + HitTube* aPH = &(*hc)(); + NDigi += aPH->GetNDigiHits(); + + // Store digitize hits due to afterpluse temporally + HitTube* aPHAP = new HitTube(aPH->GetTubeID()); + for(int i = 0; i < aPH->GetNDigiHits(); i++) { + float charge = aPH->GetChargeDigi(i); + const vector composition = aPH->GetParentCompositionDigi(i); + if(fAftpulse->GenerateAfterpulse(charge, composition, fRand)) { + double charge_ap = pr->GetRawSPE(); + bool pass = false; + hd->ApplyThreshold(charge_ap, pass); + while(!pass) { + charge_ap = pr->GetRawSPE(); + hd->ApplyThreshold(charge_ap, pass); + } + + float time_ap = fAftpulse->GetAfterpulseTime(aPH->GetTimeDigi(i), fRand); + vector comp_ap(1, -2); + aPHAP->AddDigiHit(time_ap, charge_ap, comp_ap); + NAP += 1; + } + } + + for(int i = 0; i < aPHAP->GetNDigiHits(); i++) { + float time = aPHAP->GetTimeDigi(i); + float charge = aPHAP->GetChargeDigi(i); + const vector comp = aPHAP->GetParentCompositionDigi(i); + aPH->AddDigiHit(time, charge, comp); + } + } + + int NDigiHitsAf = hc->GetTotalNumOfDigiHits(); + cout << " NDigiHits(w/o AP): " << NDigiHitsBf << " NDigiHits(w/ AP): " << NDigiHitsAf << " NAP: " << NAP + << " NDigi: " << NDigi << endl; } diff --git a/cpp/src/PMTResponse.cc b/cpp/src/PMTResponse.cc index f42f739..c60b964 100644 --- a/cpp/src/PMTResponse.cc +++ b/cpp/src/PMTResponse.cc @@ -1,231 +1,207 @@ #include "PMTResponse.h" #include "Configuration.h" -#include -#include #include -#include #include +#include #include +#include -using std::string; using std::ifstream; +using std::string; using std::stringstream; using std::vector; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// -GenericPMTResponse::GenericPMTResponse(int seed, const string &pmtname) -{ - fSclFacTTS = 1.0; - this->Initialize(seed, pmtname); +GenericPMTResponse::GenericPMTResponse(int seed, const string& pmtname) { + fSclFacTTS = 1.0; + this->Initialize(seed, pmtname); } -GenericPMTResponse::GenericPMTResponse() -{ - fSclFacTTS = 1.0; +GenericPMTResponse::GenericPMTResponse() { + fSclFacTTS = 1.0; } -GenericPMTResponse::~GenericPMTResponse() -{ - if( !fRand ){ delete fRand; fRand=NULL; } -} - -void GenericPMTResponse::Initialize(int seed, const string &pmtname) -{ - fRand=new MTRandom(seed); - fPMTType = pmtname; - - fTResConstant = 1.890; - fTResMinimum = 0.32; - - map s; - s["TimingResConstant"] = "TimingResConstant"; - s["TimingResMinimum"] = "TimingResMinimum"; - s["ScalFactorTTS"] = "ScalFactorTTS"; - s["SPECDFFile"] = "SPECDFFile"; - - if( fPMTType!="" ) - { - map::iterator i; - for(i=s.begin(); i!=s.end(); i++) - { - i->second += "_" + fPMTType; - } - } - - Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue(s["TimingResConstant"], fTResConstant); - Conf->GetValue(s["TimingResMinimum"], fTResMinimum); - Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); - Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); - - this->LoadCDFOfSPE(fTxtFileSPECDF); +GenericPMTResponse::~GenericPMTResponse() { + if(!fRand) { + delete fRand; + fRand = NULL; + } } +void GenericPMTResponse::Initialize(int seed, const string& pmtname) { + fRand = new MTRandom(seed); + fPMTType = pmtname; -double GenericPMTResponse::GetRawSPE(const TrueHit* th, const HitTube* ht) -{ - int i; - double random1=fRand->Rndm(); - for(i = 0; i < 501; i++){ - if( random1<=*(fqpe0+i) ){ break; } - } - return (double(i-50) + fRand->Rndm())/22.83; -} - -bool GenericPMTResponse::ApplyDE(const TrueHit* th, const HitTube *ht) -{ - return true; -} - -//// Currently based on 8" (instead of 20") -//// But shifted to requirements (2ns TTS FWHM) for 1 pe -float GenericPMTResponse::HitTimeSmearing(float Q) -{ - Q = (Q > 0.5) ? Q : 0.5; - float timingResolution = 0.5*fSclFacTTS*(0.33 + sqrt(fTResConstant/Q)); - if( timingResolutionGaus(0.0,timingResolution); -} + fTResConstant = 1.890; + fTResMinimum = 0.32; -void GenericPMTResponse::LoadCDFOfSPE(const string &filename) -{ - ifstream ifs(filename.c_str()); - string aLine; - vector qCDF; - while( std::getline(ifs, aLine) ) - { - if( aLine[0] == '#' ){ continue; } - stringstream ssline(aLine); - string item; - while (getline(ssline, item, ssline.widen(' '))) - { - qCDF.push_back( atof(item.c_str()) ); - } - } - ifs.close(); - - const unsigned int nBin = qCDF.size(); - if( nBin!=501 ) - { - cout<<" [ERROR] PMTResponse::LoadCDFOfSPE" < EXIT" < s; + s["TimingResConstant"] = "TimingResConstant"; + s["TimingResMinimum"] = "TimingResMinimum"; + s["ScalFactorTTS"] = "ScalFactorTTS"; + s["SPECDFFile"] = "SPECDFFile"; -/////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////// -const double ResponseBoxandLine20inchHQE::ksig_param[4] = {0.6314, 0.06260, 0.5711,23.96}; -const double ResponseBoxandLine20inchHQE::klambda_param[2] = {0.4113, 0.07827}; + if(fPMTType != "") { + map::iterator i; + for(i = s.begin(); i != s.end(); i++) { + i->second += "_" + fPMTType; + } + } -ResponseBoxandLine20inchHQE::ResponseBoxandLine20inchHQE(int seed, const string &pmtname) -{ - this->Initialize(seed, pmtname); -} + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue(s["TimingResConstant"], fTResConstant); + Conf->GetValue(s["TimingResMinimum"], fTResMinimum); + Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); + Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); -ResponseBoxandLine20inchHQE::ResponseBoxandLine20inchHQE() -{ + this->LoadCDFOfSPE(fTxtFileSPECDF); } -ResponseBoxandLine20inchHQE::~ResponseBoxandLine20inchHQE() -{ +double GenericPMTResponse::GetRawSPE(const TrueHit* th, const HitTube* ht) { + int i; + double random1 = fRand->Rndm(); + for(i = 0; i < 501; i++) { + if(random1 <= *(fqpe0 + i)) { + break; + } + } + return (double(i - 50) + fRand->Rndm()) / 22.83; } -void ResponseBoxandLine20inchHQE::Initialize(int seed, const string &pmtname) -{ - fPMTType = pmtname; - fRand=new MTRandom(seed); - - fhighcharge_param[0] = 2*ksig_param[0]*ksig_param[1]*ksig_param[3]*sqrt(ksig_param[3])*exp(-ksig_param[1]*ksig_param[3]); - fhighcharge_param[1] = ksig_param[0]*((1-2*ksig_param[1]*ksig_param[3])*exp(-ksig_param[1]*ksig_param[3])+ksig_param[2]); - - map s; - s["ScalFactorTTS"] = "ScalFactorTTS"; - s["SPECDFFile"] = "SPECDFFile"; - - if( fPMTType!="" ) - { - map::iterator i; - for(i=s.begin(); i!=s.end(); i++) - { - i->second += "_" + fPMTType; - } - } - Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); - Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); - this->LoadCDFOfSPE(fTxtFileSPECDF); +bool GenericPMTResponse::ApplyDE(const TrueHit* th, const HitTube* ht) { + return true; } - -float ResponseBoxandLine20inchHQE::HitTimeSmearing(float Q) -{ - double sigma_lowcharge = ksig_param[0]*(exp(-ksig_param[1]*Q)+ksig_param[2]); - double sigma_highcharge = fhighcharge_param[0]/sqrt(Q) + fhighcharge_param[1]; - double sigma = sigma_lowcharge*(Qksig_param[3]); - double lambda = klambda_param[0]+klambda_param[1]*Q; - return fRand->Gaus(-0.2, sigma)-1./lambda*log(1-fRand->Rndm()); +//// Currently based on 8" (instead of 20") +//// But shifted to requirements (2ns TTS FWHM) for 1 pe +float GenericPMTResponse::HitTimeSmearing(float Q) { + Q = (Q > 0.5) ? Q : 0.5; + float timingResolution = 0.5 * fSclFacTTS * (0.33 + sqrt(fTResConstant / Q)); + if(timingResolution < fTResMinimum) { + timingResolution = fTResMinimum; + } + return fRand->Gaus(0.0, timingResolution); +} + +void GenericPMTResponse::LoadCDFOfSPE(const string& filename) { + ifstream ifs(filename.c_str()); + string aLine; + vector qCDF; + while(std::getline(ifs, aLine)) { + if(aLine[0] == '#') { + continue; + } + stringstream ssline(aLine); + string item; + while(getline(ssline, item, ssline.widen(' '))) { + qCDF.push_back(atof(item.c_str())); + } + } + ifs.close(); + + const unsigned int nBin = qCDF.size(); + if(nBin != 501) { + cout << " [ERROR] PMTResponse::LoadCDFOfSPE" << endl; + cout << " - Different format: " << filename << endl; + cout << " - # bins found: " << nBin << endl; + cout << " -> EXIT" << endl; + exit(-1); + } + for(unsigned int i = 0; i < nBin; i++) { + fqpe0[i] = qCDF[i]; + } } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// -Response3inchR14374::Response3inchR14374(int seed, const string &pmtname) -{ - fTimeResAt1PE = 0.6; // B. Quilain, to match the TTS = 1.4ns (sigma at 0.6) measured at 1 p.e. - this->Initialize(seed, pmtname); -} +const double ResponseBoxandLine20inchHQE::ksig_param[4] = { 0.6314, 0.06260, 0.5711, 23.96 }; +const double ResponseBoxandLine20inchHQE::klambda_param[2] = { 0.4113, 0.07827 }; -Response3inchR14374::Response3inchR14374() -{ - fTimeResAt1PE = 0.6; // B. Quilain, to match the TTS = 1.4ns (sigma at 0.6) measured at 1 p.e. +ResponseBoxandLine20inchHQE::ResponseBoxandLine20inchHQE(int seed, const string& pmtname) { + this->Initialize(seed, pmtname); } +ResponseBoxandLine20inchHQE::ResponseBoxandLine20inchHQE() {} + +ResponseBoxandLine20inchHQE::~ResponseBoxandLine20inchHQE() {} + +void ResponseBoxandLine20inchHQE::Initialize(int seed, const string& pmtname) { + fPMTType = pmtname; + fRand = new MTRandom(seed); + fhighcharge_param[0] = 2 * ksig_param[0] * ksig_param[1] * ksig_param[3] * sqrt(ksig_param[3]) * + exp(-ksig_param[1] * ksig_param[3]); + fhighcharge_param[1] = + ksig_param[0] * + ((1 - 2 * ksig_param[1] * ksig_param[3]) * exp(-ksig_param[1] * ksig_param[3]) + ksig_param[2]); -Response3inchR14374::~Response3inchR14374() -{ + map s; + s["ScalFactorTTS"] = "ScalFactorTTS"; + s["SPECDFFile"] = "SPECDFFile"; + + if(fPMTType != "") { + map::iterator i; + for(i = s.begin(); i != s.end(); i++) { + i->second += "_" + fPMTType; + } + } + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); + Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); + this->LoadCDFOfSPE(fTxtFileSPECDF); } -void Response3inchR14374::Initialize(int seed, const string &pmtname) -{ - fPMTType = pmtname; - fRand = new MTRandom(seed); - - map s; - s["ScalFactorTTS"] = "ScalFactorTTS"; - s["SPECDFFile"] = "SPECDFFile"; - if( fPMTType!="" ) - { - map::iterator i; - for(i=s.begin(); i!=s.end(); i++) - { - i->second += "_" + fPMTType; - } - } - Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); - Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); - this->LoadCDFOfSPE(fTxtFileSPECDF); +float ResponseBoxandLine20inchHQE::HitTimeSmearing(float Q) { + double sigma_lowcharge = ksig_param[0] * (exp(-ksig_param[1] * Q) + ksig_param[2]); + double sigma_highcharge = fhighcharge_param[0] / sqrt(Q) + fhighcharge_param[1]; + double sigma = sigma_lowcharge * (Q < ksig_param[3]) + sigma_highcharge * (Q > ksig_param[3]); + double lambda = klambda_param[0] + klambda_param[1] * Q; + return fRand->Gaus(-0.2, sigma) - 1. / lambda * log(1 - fRand->Rndm()); } -float Response3inchR14374::HitTimeSmearing(float Q) -{ -// Use a tentative Q dependence proposed by B. Quilain, -// - Q<0.5.: force Q to be 0.5 to avoid divergence of timing resolution -// - This comes from some PMT types's implementation in WCSimPMTObject.cc -// - Q<10p.e.: timing resolution follows TTS/sqrt(Q) -// - Q>=10p.e.: no charge dependence, so use a constant value of TTS/sqrt(10p.e.) - //Q = (Q > 0.5) ? Q : 0.5; - //if( Q>10. ){ Q = 10.; } - //float timingResolution = (fTimeResAt1PE/sqrt(Q))*fSclFacTTS; - float timingResolution = 0.6*fSclFacTTS; - return fRand->Gaus(0., timingResolution); +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +Response3inchR14374::Response3inchR14374(int seed, const string& pmtname) { + fTimeResAt1PE = 0.6; // B. Quilain, to match the TTS = 1.4ns (sigma at 0.6) measured at 1 p.e. + this->Initialize(seed, pmtname); +} + +Response3inchR14374::Response3inchR14374() { + fTimeResAt1PE = 0.6; // B. Quilain, to match the TTS = 1.4ns (sigma at 0.6) measured at 1 p.e. +} + +Response3inchR14374::~Response3inchR14374() {} + +void Response3inchR14374::Initialize(int seed, const string& pmtname) { + fPMTType = pmtname; + fRand = new MTRandom(seed); + + map s; + s["ScalFactorTTS"] = "ScalFactorTTS"; + s["SPECDFFile"] = "SPECDFFile"; + if(fPMTType != "") { + map::iterator i; + for(i = s.begin(); i != s.end(); i++) { + i->second += "_" + fPMTType; + } + } + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); + Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); + this->LoadCDFOfSPE(fTxtFileSPECDF); +} + +float Response3inchR14374::HitTimeSmearing(float Q) { + // Use a tentative Q dependence proposed by B. Quilain, + // - Q<0.5.: force Q to be 0.5 to avoid divergence of timing resolution + // - This comes from some PMT types's implementation in WCSimPMTObject.cc + // - Q<10p.e.: timing resolution follows TTS/sqrt(Q) + // - Q>=10p.e.: no charge dependence, so use a constant value of TTS/sqrt(10p.e.) + // Q = (Q > 0.5) ? Q : 0.5; + // if( Q>10. ){ Q = 10.; } + // float timingResolution = (fTimeResAt1PE/sqrt(Q))*fSclFacTTS; + float timingResolution = 0.6 * fSclFacTTS; + return fRand->Gaus(0., timingResolution); } diff --git a/cpp/src/TriggerAlgo.cc b/cpp/src/TriggerAlgo.cc index 9746135..0bc1a92 100644 --- a/cpp/src/TriggerAlgo.cc +++ b/cpp/src/TriggerAlgo.cc @@ -3,144 +3,118 @@ #include "HitTube.h" TriggerAlgo::TriggerAlgo() : -fNDigitsWindow( 200. ), -fNDigitsStepSize( 5. ), -fNDigitsThreshold( 25 ), -fTriggerTimeForFailure( 100. ) -{ - fPreTriggerWindow[TriggerType::eNDigits] = -400.; - fPreTriggerWindow[TriggerType::eFailure] = -400.; - - fPostTriggerWindow[TriggerType::eNDigits] = 950.; - fPostTriggerWindow[TriggerType::eFailure] = 100000.; + fNDigitsWindow(200.), fNDigitsStepSize(5.), fNDigitsThreshold(25), fTriggerTimeForFailure(100.) { + fPreTriggerWindow[TriggerType::eNDigits] = -400.; + fPreTriggerWindow[TriggerType::eFailure] = -400.; - Configuration *Conf = Configuration::GetInstance(); - Conf->GetValue("NDigitsWindow", fNDigitsWindow); - Conf->GetValue("NDigitsStepSize", fNDigitsStepSize); - Conf->GetValue("NDigitsThreshold", fNDigitsThreshold ); - Conf->GetValue("FailureTime", fTriggerTimeForFailure); - Conf->GetValue("NDigitsPreTriggerWindow", fPreTriggerWindow[TriggerType::eNDigits]); - Conf->GetValue("NDigitsPostTriggerWindow", fPostTriggerWindow[TriggerType::eNDigits]); - Conf->GetValue("FailurePreTriggerWindow", fPreTriggerWindow[TriggerType::eFailure]); - Conf->GetValue("FailurePostTriggerWindow", fPostTriggerWindow[TriggerType::eFailure]); -} + fPostTriggerWindow[TriggerType::eNDigits] = 950.; + fPostTriggerWindow[TriggerType::eFailure] = 100000.; + Configuration* Conf = Configuration::GetInstance(); + Conf->GetValue("NDigitsWindow", fNDigitsWindow); + Conf->GetValue("NDigitsStepSize", fNDigitsStepSize); + Conf->GetValue("NDigitsThreshold", fNDigitsThreshold); + Conf->GetValue("FailureTime", fTriggerTimeForFailure); + Conf->GetValue("NDigitsPreTriggerWindow", fPreTriggerWindow[TriggerType::eNDigits]); + Conf->GetValue("NDigitsPostTriggerWindow", fPostTriggerWindow[TriggerType::eNDigits]); + Conf->GetValue("FailurePreTriggerWindow", fPreTriggerWindow[TriggerType::eFailure]); + Conf->GetValue("FailurePostTriggerWindow", fPostTriggerWindow[TriggerType::eFailure]); +} // This is based on WCSimWCTriggerBase::AlgNDigits in WCSimWCTrigger.cc -void TriggerAlgo::NDigits(HitTubeCollection *hc, TriggerInfo* ti) -{ - ti->Clear(); - const int nTotalDigiHits = hc->GetTotalNumOfDigiHits(); - int nTriggers = 0; - float trigTime = 0.; +void TriggerAlgo::NDigits(HitTubeCollection* hc, TriggerInfo* ti) { + ti->Clear(); + const int nTotalDigiHits = hc->GetTotalNumOfDigiHits(); + int nTriggers = 0; + float trigTime = 0.; + + if(nTotalDigiHits > 0) { + vector times; + times.reserve(nTotalDigiHits); + for(hc->Begin(); !hc->IsEnd(); hc->Next()) { + HitTube* aPH = &(*hc)(); + for(int i = 0; i < aPH->GetNDigiHits(); i++) { + times.push_back(aPH->GetTimeDigi(i)); + } + aPH = NULL; + } + std::sort(times.begin(), times.end()); + + float tFirstHit = times[0]; + float tLastHit = times[nTotalDigiHits - 1]; - if( nTotalDigiHits>0 ) - { - vector times; - times.reserve(nTotalDigiHits); - for(hc->Begin(); !hc->IsEnd(); hc->Next()) - { - HitTube *aPH = &(*hc)(); - for(int i=0; iGetNDigiHits(); i++) - { - times.push_back( aPH->GetTimeDigi(i) ); - } - aPH = NULL; - } - std::sort(times.begin(), times.end()); - - float tFirstHit = times[0]; - float tLastHit = times[nTotalDigiHits-1]; + const double stepSize = fNDigitsStepSize; // in ns + const double tWindowMax = std::max(0.f, tLastHit - fNDigitsWindow); // in ns - const double stepSize = fNDigitsStepSize; // in ns - const double tWindowMax = std::max(0.f, tLastHit - fNDigitsWindow); // in ns + double tWindowUp = 0.; + double tWindowLow = 0.; - double tWindowUp = 0.; - double tWindowLow = 0.; + // - Slide the time window with a width of "fNDigitsWindow" + // from "tWindowLow" (assumed to be 0 initially) to "tWindowMax" + // with a step size of "stepSize" + // + // - For each step, all the digitized hits falling the corresponding window + // are counted. If the number of those hits are greater than "fNDigitsThreshold" + // a new trigger is created + tWindowUp = tWindowLow + fNDigitsWindow; + int iHit = 0; + while(tWindowLow <= tWindowMax) { + vector Times; + Times.clear(); + for(iHit = 0; iHit < nTotalDigiHits; iHit++) { + float t = times[iHit]; + if(t >= tWindowLow && t <= tWindowUp) { + Times.push_back(t); + } + } - // - Slide the time window with a width of "fNDigitsWindow" - // from "tWindowLow" (assumed to be 0 initially) to "tWindowMax" - // with a step size of "stepSize" - // - // - For each step, all the digitized hits falling the corresponding window - // are counted. If the number of those hits are greater than "fNDigitsThreshold" - // a new trigger is created - tWindowUp = tWindowLow + fNDigitsWindow; - int iHit = 0; - while( tWindowLow<=tWindowMax ) - { - vector Times; - Times.clear(); - for(iHit=0; iHit=tWindowLow && t<=tWindowUp ) - { - Times.push_back( t ); - } - } + bool isTriggerFound = false; + if((int)Times.size() > fNDigitsThreshold) { + trigTime = Times[fNDigitsThreshold]; + trigTime -= (int)trigTime % 5; + float trigTimeLow = trigTime + fPreTriggerWindow[TriggerType::eNDigits]; + float trigTimeUp = trigTime + fPostTriggerWindow[TriggerType::eNDigits]; - bool isTriggerFound = false; - if( (int)Times.size()>fNDigitsThreshold ) - { - trigTime = Times[fNDigitsThreshold]; - trigTime -= (int)trigTime%5; - float trigTimeLow = trigTime + fPreTriggerWindow[TriggerType::eNDigits]; - float trigTimeUp = trigTime + fPostTriggerWindow[TriggerType::eNDigits]; + // Avoid overlapping with previous trigger window + if(nTriggers >= 1) { + float trigTimeUpPrevious = ti->GetUpEdge(nTriggers - 1); + if(trigTimeUpPrevious > trigTimeLow) { + trigTimeLow = trigTimeUpPrevious; + } + } + ti->AddTrigger(trigTime, + trigTimeLow, + trigTimeUp, + (int)Times.size(), + (int)TriggerType::eNDigits); + cout << " Found trigger at: " << trigTime << " nHits: " << Times.size() + << " trigger window: [" << trigTimeLow << ", " << trigTimeUp << "] ns " << endl; + isTriggerFound = true; + nTriggers += 1; + } - // Avoid overlapping with previous trigger window - if( nTriggers>=1 ) - { - float trigTimeUpPrevious = ti->GetUpEdge(nTriggers-1); - if( trigTimeUpPrevious>trigTimeLow ) - { - trigTimeLow = trigTimeUpPrevious; - } - } - ti->AddTrigger(trigTime, - trigTimeLow, - trigTimeUp, - (int)Times.size(), - (int)TriggerType::eNDigits); - cout<<" Found trigger at: " << trigTime - <<" nHits: " << Times.size() - <<" trigger window: [" << trigTimeLow - <<", " << trigTimeUp - <<"] ns " - <AddTrigger(trigTime, - trigTimeLow, - trigTimeUp, - -1, - (int)TriggerType::eFailure); - //cout<<" No trigger found " <AddTrigger(trigTime, trigTimeLow, trigTimeUp, -1, (int)TriggerType::eFailure); + // cout<<" No trigger found " <Clear(); +TriggerInfo::TriggerInfo() { + this->Clear(); } -TriggerInfo::~TriggerInfo() -{ - this->Clear(); +TriggerInfo::~TriggerInfo() { + this->Clear(); } -void TriggerInfo::AddTrigger(float timeTrig, - float timeLow, - float timeUp, - int nHits, - int type) -{ - fTrigTime.push_back(timeTrig); - fTimeLow.push_back(timeLow); - fTimeUp.push_back(timeUp); - fNHits.push_back(nHits); - fTrigType.push_back(type); +void TriggerInfo::AddTrigger(float timeTrig, float timeLow, float timeUp, int nHits, int type) { + fTrigTime.push_back(timeTrig); + fTimeLow.push_back(timeLow); + fTimeUp.push_back(timeUp); + fNHits.push_back(nHits); + fTrigType.push_back(type); } -void TriggerInfo::Clear() -{ - fTrigTime.clear(); - fTimeLow.clear(); - fTimeUp.clear(); - fNHits.clear(); - fTrigType.clear(); - vector().swap(fTrigTime); - vector().swap(fTimeLow); - vector().swap(fTimeUp); - vector().swap(fNHits); - vector().swap(fTrigType); +void TriggerInfo::Clear() { + fTrigTime.clear(); + fTimeLow.clear(); + fTimeUp.clear(); + fNHits.clear(); + fTrigType.clear(); + vector().swap(fTrigTime); + vector().swap(fTimeLow); + vector().swap(fTimeUp); + vector().swap(fNHits); + vector().swap(fTrigType); } diff --git a/cpp/src/TrueHit.cc b/cpp/src/TrueHit.cc index c2a7fdc..07b3806 100644 --- a/cpp/src/TrueHit.cc +++ b/cpp/src/TrueHit.cc @@ -1,21 +1,17 @@ #include "TrueHit.h" -TrueHit::TrueHit(float t, int id) -{ - fTime = t; - fParentId = id; - fPosition[0] = 0.; - fPosition[1] = 0.; - fPosition[2] = 0.; +TrueHit::TrueHit(float t, int id) { + fTime = t; + fParentId = id; + fPosition[0] = 0.; + fPosition[1] = 0.; + fPosition[2] = 0.; }; -TrueHit::TrueHit() -{ - fPosition[0] = 0.; - fPosition[1] = 0.; - fPosition[2] = 0.; +TrueHit::TrueHit() { + fPosition[0] = 0.; + fPosition[1] = 0.; + fPosition[2] = 0.; }; -TrueHit::~TrueHit() -{ -}; +TrueHit::~TrueHit() {}; diff --git a/pywrap/PyWrapMDT.cpp b/pywrap/PyWrapMDT.cpp index 5611b93..62a9dc4 100644 --- a/pywrap/PyWrapMDT.cpp +++ b/pywrap/PyWrapMDT.cpp @@ -1,55 +1,54 @@ #include #include +#include "Configuration.h" #include "HitTube.h" #include "HitTubeCollection.h" -#include "Configuration.h" -#include "TriggerInfo.h" #include "MDTManager.h" +#include "TriggerInfo.h" namespace py = pybind11; -PYBIND11_MODULE(MDT, m){ -py::class_(m, "HitTube") - .def(py::init()) - .def("GetTubeID", &HitTube::GetTubeID) - .def("GetNDigiHits", &HitTube::GetNDigiHits) - .def("GetTimeDigi", &HitTube::GetTimeDigi) - .def("GetChargeDigi", &HitTube::GetChargeDigi); - - -py::class_(m, "HitTubeCollection") - .def(py::init<>()) - .def("AddTrueHit", &HitTubeCollection::AddTrueHit) - .def("AddDigiHit", &HitTubeCollection::AddDigiHit) - .def("GetNumOfHitTubes", &HitTubeCollection::GetNumOfHitTubes) - .def("GetTotalNumOfTrueHits", &HitTubeCollection::GetTotalNumOfTrueHits) - .def("GetTotalNumOfDigiHits", &HitTubeCollection::GetTotalNumOfDigiHits) - .def("GetHitTubeIDList", &HitTubeCollection::GetHitTubeIDList) - .def("Begin", &HitTubeCollection::Begin) - .def("IsEnd", &HitTubeCollection::IsEnd) - .def("Next", &HitTubeCollection::Next) - .def("GetHitTube", &HitTubeCollection::GetHitTube, py::return_value_policy::reference); - -py::class_>(m, "Configuration") - .def(py::init(&Configuration::GetInstance), py::return_value_policy::reference) - .def("ReadParameter", &Configuration::ReadParameter) - .def("PrintParameters", &Configuration::PrintParameters); - -py::class_(m, "TriggerInfo") - .def(py::init<>()) - .def("GetNumOfTrigger", &TriggerInfo::GetNumOfTrigger) - .def("GetTriggerTime", &TriggerInfo::GetTriggerTime) - .def("GetLowEdge", &TriggerInfo::GetLowEdge) - .def("GetUpEdge", &TriggerInfo::GetUpEdge) - .def("GetType", &TriggerInfo::GetType); - -py::class_(m, "MDTManager") - .def(py::init()) - .def("DoAddDark", &MDTManager::DoAddDark) - .def("DoDigitize", &MDTManager::DoDigitize) - .def("DoTrigger", &MDTManager::DoTrigger) - .def("DoInitialize", &MDTManager::DoInitialize) - .def("GetTriggerInfo", &MDTManager::GetTriggerInfo, py::return_value_policy::reference) - .def("GetHitTubeCollection", &MDTManager::GetHitTubeCollection, py::return_value_policy::reference); +PYBIND11_MODULE(MDT, m) { + py::class_(m, "HitTube") + .def(py::init()) + .def("GetTubeID", &HitTube::GetTubeID) + .def("GetNDigiHits", &HitTube::GetNDigiHits) + .def("GetTimeDigi", &HitTube::GetTimeDigi) + .def("GetChargeDigi", &HitTube::GetChargeDigi); + + py::class_(m, "HitTubeCollection") + .def(py::init<>()) + .def("AddTrueHit", &HitTubeCollection::AddTrueHit) + .def("AddDigiHit", &HitTubeCollection::AddDigiHit) + .def("GetNumOfHitTubes", &HitTubeCollection::GetNumOfHitTubes) + .def("GetTotalNumOfTrueHits", &HitTubeCollection::GetTotalNumOfTrueHits) + .def("GetTotalNumOfDigiHits", &HitTubeCollection::GetTotalNumOfDigiHits) + .def("GetHitTubeIDList", &HitTubeCollection::GetHitTubeIDList) + .def("Begin", &HitTubeCollection::Begin) + .def("IsEnd", &HitTubeCollection::IsEnd) + .def("Next", &HitTubeCollection::Next) + .def("GetHitTube", &HitTubeCollection::GetHitTube, py::return_value_policy::reference); + + py::class_>(m, "Configuration") + .def(py::init(&Configuration::GetInstance), py::return_value_policy::reference) + .def("ReadParameter", &Configuration::ReadParameter) + .def("PrintParameters", &Configuration::PrintParameters); + + py::class_(m, "TriggerInfo") + .def(py::init<>()) + .def("GetNumOfTrigger", &TriggerInfo::GetNumOfTrigger) + .def("GetTriggerTime", &TriggerInfo::GetTriggerTime) + .def("GetLowEdge", &TriggerInfo::GetLowEdge) + .def("GetUpEdge", &TriggerInfo::GetUpEdge) + .def("GetType", &TriggerInfo::GetType); + + py::class_(m, "MDTManager") + .def(py::init()) + .def("DoAddDark", &MDTManager::DoAddDark) + .def("DoDigitize", &MDTManager::DoDigitize) + .def("DoTrigger", &MDTManager::DoTrigger) + .def("DoInitialize", &MDTManager::DoInitialize) + .def("GetTriggerInfo", &MDTManager::GetTriggerInfo, py::return_value_policy::reference) + .def("GetHitTubeCollection", &MDTManager::GetHitTubeCollection, py::return_value_policy::reference); } From ac09770686101e5ce69dccefa86b4f2ad8268494 Mon Sep 17 00:00:00 2001 From: Mathieu Guigue Date: Mon, 21 Aug 2023 16:22:37 +0200 Subject: [PATCH 27/55] Use master branch (not main) --- .github/workflows/Doxygen.yml | 2 +- .github/workflows/push_workflow.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Doxygen.yml b/.github/workflows/Doxygen.yml index 1bf16e9..da16b26 100644 --- a/.github/workflows/Doxygen.yml +++ b/.github/workflows/Doxygen.yml @@ -6,7 +6,7 @@ name: Doxygen on: # Triggers the workflow on push or pull request events but only for the main branch push: - branches: [ main ] + branches: [ main, master ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.github/workflows/push_workflow.yml b/.github/workflows/push_workflow.yml index a62dd2d..ae5b1ec 100644 --- a/.github/workflows/push_workflow.yml +++ b/.github/workflows/push_workflow.yml @@ -2,7 +2,7 @@ name: Build on push on: push: - branches: [main] + branches: [main, master] tags: ['*'] env: From f8953dcab5491334bb88a18b6b0b7dc501bcb992 Mon Sep 17 00:00:00 2001 From: Mathieu Guigue Date: Mon, 21 Aug 2023 16:23:58 +0200 Subject: [PATCH 28/55] Revert "Committing clang-format changes" This reverts commit 0263d74c14777f6faa2aed4c20d80a48942e8dea. --- app/application/PMTResponse3inchR12199_02.cc | 77 +- app/application/PMTResponse3inchR12199_02.h | 16 +- app/application/appExtrSinglNuIntBunch.cc | 173 ++-- app/application/appGenPileUpSpill.cc | 287 +++--- app/application/appHKHybridSingleEvent.cc | 135 ++- app/application/appWCTESingleEvent.cc | 152 ++-- app/utilities/WCRootData/include/BeamTiming.h | 33 +- .../WCRootData/include/PileUpSpill_t.h | 163 ++-- .../WCRootData/include/RedNRTVtx_t.h | 122 +-- .../WCRootData/include/SpillAnalyzer.h | 17 +- app/utilities/WCRootData/include/WCRootData.h | 85 +- .../WCRootData/include/WCRootDataBeamBkg.h | 26 +- .../WCRootData/include/WCRootDataIDNuInt.h | 25 +- .../WCRootData/include/WCRootDataNuInt.h | 102 ++- .../include/WCRootDataPileUpSpill.h | 85 +- app/utilities/WCRootData/src/BeamTiming.cc | 20 +- app/utilities/WCRootData/src/SpillAnalyzer.cc | 141 +-- app/utilities/WCRootData/src/WCRootData.cc | 820 +++++++++--------- .../WCRootData/src/WCRootDataBeamBkg.cc | 72 +- .../WCRootData/src/WCRootDataIDNuInt.cc | 89 +- .../WCRootData/src/WCRootDataNuInt.cc | 205 ++--- .../WCRootData/src/WCRootDataPileUpSpill.cc | 340 ++++---- cpp/include/Configuration.h | 56 +- cpp/include/HitDigitizer.h | 43 +- cpp/include/HitTube.h | 122 ++- cpp/include/HitTubeCollection.h | 58 +- cpp/include/MDTManager.h | 78 +- cpp/include/MTRandom.h | 107 ++- cpp/include/PMTAfterpulse.h | 40 +- cpp/include/PMTNoise.h | 110 ++- cpp/include/PMTResponse.h | 121 ++- cpp/include/TriggerAlgo.h | 38 +- cpp/include/TriggerInfo.h | 57 +- cpp/include/TrueHit.h | 77 +- cpp/src/Configuration.cc | 227 ++--- cpp/src/HitDigitizer.cc | 240 ++--- cpp/src/HitTube.cc | 33 +- cpp/src/HitTubeCollection.cc | 76 +- cpp/src/MDTManager.cc | 209 ++--- cpp/src/MTRandom.cc | 338 ++++---- cpp/src/PMTAfterpulse.cc | 134 +-- cpp/src/PMTNoise.cc | 449 +++++----- cpp/src/PMTResponse.cc | 350 ++++---- cpp/src/TriggerAlgo.cc | 228 ++--- cpp/src/TriggerInfo.cc | 50 +- cpp/src/TrueHit.cc | 26 +- pywrap/PyWrapMDT.cpp | 89 +- 47 files changed, 3344 insertions(+), 3197 deletions(-) diff --git a/app/application/PMTResponse3inchR12199_02.cc b/app/application/PMTResponse3inchR12199_02.cc index 058b557..ee3e0b2 100644 --- a/app/application/PMTResponse3inchR12199_02.cc +++ b/app/application/PMTResponse3inchR12199_02.cc @@ -2,47 +2,54 @@ #include "Configuration.h" -#include #include +#include using std::map; -PMTResponse3inchR12199_02::PMTResponse3inchR12199_02(int seed, const string& pmtname) { - this->Initialize(seed, pmtname); +PMTResponse3inchR12199_02::PMTResponse3inchR12199_02(int seed, const string &pmtname) +{ + this->Initialize(seed, pmtname); } -PMTResponse3inchR12199_02::PMTResponse3inchR12199_02() {} - -PMTResponse3inchR12199_02::~PMTResponse3inchR12199_02() {} - -void PMTResponse3inchR12199_02::Initialize(int seed, const string& pmtname) { - fPMTType = pmtname; - fRand = new MTRandom(seed); - - map s; - s["TimingResConstant"] = "TimingResConstant"; - s["TimingResMinimum"] = "TimingResMinimum"; - s["ScalFactorTTS"] = "ScalFactorTTS"; - s["SPECDFFile"] = "SPECDFFile"; - if(fPMTType != "") { - map::iterator i; - for(i = s.begin(); i != s.end(); i++) { - i->second += "_" + fPMTType; - } - } - Configuration* Conf = Configuration::GetInstance(); - Conf->GetValue(s["TimingResConstant"], fTResConstant); - Conf->GetValue(s["TimingResMinimum"], fTResMinimum); - Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); - Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); - this->LoadCDFOfSPE(fTxtFileSPECDF); +PMTResponse3inchR12199_02::PMTResponse3inchR12199_02() +{ } -float PMTResponse3inchR12199_02::HitTimeSmearing(float Q) { - Q = (Q > 0.5) ? Q : 0.5; - float timingResolution = 0.5 * fSclFacTTS * (0.33 + sqrt(fTResConstant / Q)); - if(timingResolution < fTResMinimum) { - timingResolution = fTResMinimum; - } - return fRand->Gaus(0.0, timingResolution); +PMTResponse3inchR12199_02::~PMTResponse3inchR12199_02() +{ +} + +void PMTResponse3inchR12199_02::Initialize(int seed, const string &pmtname) +{ + fPMTType = pmtname; + fRand = new MTRandom(seed); + + map s; + s["TimingResConstant"] = "TimingResConstant"; + s["TimingResMinimum"] = "TimingResMinimum"; + s["ScalFactorTTS"] = "ScalFactorTTS"; + s["SPECDFFile"] = "SPECDFFile"; + if( fPMTType!="" ) + { + map::iterator i; + for(i=s.begin(); i!=s.end(); i++) + { + i->second += "_" + fPMTType; + } + } + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue(s["TimingResConstant"], fTResConstant); + Conf->GetValue(s["TimingResMinimum"], fTResMinimum); + Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); + Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); + this->LoadCDFOfSPE(fTxtFileSPECDF); +} + +float PMTResponse3inchR12199_02::HitTimeSmearing(float Q) +{ + Q = (Q > 0.5) ? Q : 0.5; + float timingResolution = 0.5*fSclFacTTS*(0.33 + sqrt(fTResConstant/Q)); + if( timingResolutionGaus(0.0,timingResolution); } diff --git a/app/application/PMTResponse3inchR12199_02.h b/app/application/PMTResponse3inchR12199_02.h index f7be017..e9bf0a3 100644 --- a/app/application/PMTResponse3inchR12199_02.h +++ b/app/application/PMTResponse3inchR12199_02.h @@ -2,12 +2,12 @@ #include "PMTResponse.h" -class PMTResponse3inchR12199_02 : public GenericPMTResponse { - public: - - PMTResponse3inchR12199_02(int, const string& s = ""); - PMTResponse3inchR12199_02(); - virtual ~PMTResponse3inchR12199_02(); - float HitTimeSmearing(float); - void Initialize(int, const string& s = ""); +class PMTResponse3inchR12199_02 : public GenericPMTResponse +{ + public: + PMTResponse3inchR12199_02(int, const string &s=""); + PMTResponse3inchR12199_02(); + virtual ~PMTResponse3inchR12199_02(); + float HitTimeSmearing(float); + void Initialize(int, const string &s=""); }; diff --git a/app/application/appExtrSinglNuIntBunch.cc b/app/application/appExtrSinglNuIntBunch.cc index 96229cd..9f7f495 100644 --- a/app/application/appExtrSinglNuIntBunch.cc +++ b/app/application/appExtrSinglNuIntBunch.cc @@ -1,92 +1,89 @@ -#include "BeamTiming.h" -#include "SpillAnalyzer.h" #include "WCRootDataPileUpSpill.h" +#include "SpillAnalyzer.h" +#include "BeamTiming.h" // Will dump digitized hits associated with give bunch id number -int main(int argc, char** argv) { - TString InFileName = argv[1]; - TString OutFileName = argv[2]; - string MDTParFileName = argv[3]; - int bunch_id = atoi(argv[4]); - int seed = atoi(argv[5]); - - Configuration* Conf = Configuration::GetInstance(); - Conf->ReadParameter(MDTParFileName); - Conf->PrintParameters(); - Conf = NULL; - - // Mange digitzed hits and add afterpulse (optinal) - MDTManager* MDT = new MDTManager(seed); - - // Mange input pile-up spill files - WCRootDataPileUpSpill* input = new WCRootDataPileUpSpill(); - input->ReadFile(InFileName); - - // Manage selected ""bunch events"" - WCRootData* output = new WCRootData(); - output->CreateTree(OutFileName); - - // Manage spill selection - SpillAnalyzer* sa = new SpillAnalyzer(); - - // Peak time of the bunch - const float bunch_mean_time = (float)kBunchInterval * (bunch_id - 1); - ; - const float TimeMichelELow = bunch_mean_time - 3. * kBunchSigma; - const float TimeMichelEUp = bunch_mean_time + 3. * kBunchSigma; - - // Only digitized hits that belong to the time window will be extracted - const float TimeSelDigiLow = TimeMichelELow; - float TimeSelDigiUp = (float)kBunchInterval * bunch_id - 3. * kBunchSigma; - if(bunch_id == kNBunches) { - TimeSelDigiUp = (float)kBunchInterval * (bunch_id - 1) + 3. * kBunchSigma + 10000.; - } - - cout << " Target bunch id: " << bunch_id << " in [0, " << kNBunches << "]" << endl; - cout << " - True secondary electron search window: [" << TimeMichelELow << ", " << TimeMichelEUp - << " (ns)" << endl; - cout << " - Digi hit saving time window: [" << TimeSelDigiLow << ", " << TimeSelDigiUp << " (ns)" - << endl; - - int nuIntIdx = -1; - const int nEntries = input->GetEntries(); - cout << " Start processing " << input->GetEntries() << " pile-up spills" << endl; - int nPassed = 0; - - // Will copy a TTree object to the output file with selected spills - vector flagToSave(nEntries, false); - for(int iEntry = 0; iEntry < nEntries; iEntry++) { - input->GetEntry(iEntry); - - // Check that the bunch of interest has just one ID interaction with true visible energy deposition<50 - // MeV - if(!sa->IsSingleIDIneractionAtBunch(input, 4 - 1, nuIntIdx)) { - continue; - } - - // Check whether or not there is no secondary electrons (e.g. Michel-e) steming from earlier ID/beam - // bkg interations around the bunch of interest - if(sa->HasMichelEFromOtherInteractionAtBunch(input, nuIntIdx, TimeMichelELow, TimeMichelEUp)) { - continue; - } - - // Extract digitized hits being in time window [TimeSelDigiLow, TimeSelDigiUp] - // The offset time, TimeSelDigiUp, will be subtracted from the extracted time just for late use - input->AddDigiHitsToMDT(MDT, TimeSelDigiLow, TimeSelDigiUp, bunch_mean_time); - - MDT->DoTrigger(); - output->AddDigiHits(MDT); - output->FillTree(); - MDT->DoInitialize(); - - flagToSave[iEntry] = true; - nPassed += 1; - } - cout << " Number of passed entries: " << nPassed << "/" << nEntries << endl; - - output->WriteTree(); - output->CopyTree(InFileName, "pupspillT", flagToSave); - - Conf = Configuration::GetInstance(); - Conf->Finalize(); +int main(int argc, char **argv) +{ + TString InFileName = argv[1]; + TString OutFileName = argv[2]; + string MDTParFileName = argv[3]; + int bunch_id = atoi( argv[4] ); + int seed = atoi( argv[5] ); + + Configuration *Conf = Configuration::GetInstance(); + Conf->ReadParameter(MDTParFileName); + Conf->PrintParameters(); + Conf = NULL; + + // Mange digitzed hits and add afterpulse (optinal) + MDTManager *MDT = new MDTManager(seed); + + // Mange input pile-up spill files + WCRootDataPileUpSpill *input = new WCRootDataPileUpSpill(); + input->ReadFile(InFileName); + + // Manage selected ""bunch events"" + WCRootData *output = new WCRootData(); + output->CreateTree(OutFileName); + + // Manage spill selection + SpillAnalyzer *sa = new SpillAnalyzer(); + + + // Peak time of the bunch + const float bunch_mean_time = (float)kBunchInterval*(bunch_id - 1);; + const float TimeMichelELow = bunch_mean_time - 3.*kBunchSigma; + const float TimeMichelEUp = bunch_mean_time + 3.*kBunchSigma; + + // Only digitized hits that belong to the time window will be extracted + const float TimeSelDigiLow = TimeMichelELow; + float TimeSelDigiUp = (float)kBunchInterval*bunch_id - 3.*kBunchSigma; + if( bunch_id==kNBunches ) + { + TimeSelDigiUp = (float)kBunchInterval*(bunch_id-1) + 3.*kBunchSigma + 10000.; + } + + + cout<<" Target bunch id: " << bunch_id <<" in [0, " << kNBunches <<"]" <GetEntries() ; + cout<<" Start processing " << input->GetEntries() <<" pile-up spills" < flagToSave(nEntries, false); + for(int iEntry=0; iEntryGetEntry(iEntry); + + // Check that the bunch of interest has just one ID interaction with true visible energy deposition<50 MeV + if( !sa->IsSingleIDIneractionAtBunch(input, 4-1, nuIntIdx) ){ continue; } + + // Check whether or not there is no secondary electrons (e.g. Michel-e) steming from earlier ID/beam bkg interations + // around the bunch of interest + if( sa->HasMichelEFromOtherInteractionAtBunch(input, nuIntIdx, TimeMichelELow, TimeMichelEUp) ){ continue; } + + // Extract digitized hits being in time window [TimeSelDigiLow, TimeSelDigiUp] + // The offset time, TimeSelDigiUp, will be subtracted from the extracted time just for late use + input->AddDigiHitsToMDT(MDT, TimeSelDigiLow, TimeSelDigiUp, bunch_mean_time); + + MDT->DoTrigger(); + output->AddDigiHits(MDT); + output->FillTree(); + MDT->DoInitialize(); + + flagToSave[iEntry] = true; + nPassed += 1; + } + cout<<" Number of passed entries: " << nPassed <<"/" << nEntries <WriteTree(); + output->CopyTree(InFileName, "pupspillT", flagToSave); + + Conf = Configuration::GetInstance(); + Conf->Finalize(); } diff --git a/app/application/appGenPileUpSpill.cc b/app/application/appGenPileUpSpill.cc index bafe009..29d3aa8 100644 --- a/app/application/appGenPileUpSpill.cc +++ b/app/application/appGenPileUpSpill.cc @@ -1,157 +1,166 @@ -#include #include +#include #include #include "TRandom3.h" -#include "BeamTiming.h" #include "MDTManager.h" -#include "WCRootDataBeamBkg.h" #include "WCRootDataIDNuInt.h" +#include "WCRootDataBeamBkg.h" #include "WCRootDataPileUpSpill.h" +#include "BeamTiming.h" std::string fInFileTextIDNuInt = ""; std::string fInFileTextBeamBkg = ""; std::string fOutFileNamePrefix = ""; -std::string fMDTParFileName = ""; -int fSeed = 99999; -int fNumOfSpillsPerFile = 1000; -float fIDNuIntRate = 3.5; -float fBeamBkgRate = 7.5; -int fTotalNumofSpills = 10000; +std::string fMDTParFileName = ""; +int fSeed = 99999; +int fNumOfSpillsPerFile = 1000; +float fIDNuIntRate = 3.5; +float fBeamBkgRate = 7.5; +int fTotalNumofSpills = 10000; void ReadConfiguration(const char*); -int main(int argc, char** argv) { - std::string ConfigFileName = argv[1]; - ReadConfiguration(argv[1]); - - Configuration* Conf = Configuration::GetInstance(); - Conf->ReadParameter(fMDTParFileName); - Conf->PrintParameters(); - Conf = 0; - - TRandom3* rndm = new TRandom3(fSeed); - const int seed_mdt = rndm->Integer(1000000); - const int seed_idnuint = rndm->Integer(1000000); - const int seed_beambkg = rndm->Integer(1000000); - const int seed_beamtiming = rndm->Integer(1000000); - delete rndm; - rndm = 0; - - // Will be manaing marging true hits and digitizing merged true hits - MDTManager* MDT = new MDTManager(seed_mdt); - - // Manage input files for ID interactions - WCRootDataIDNuInt* daIDNuInt = new WCRootDataIDNuInt(); - - // Manage input files for Beam background interactions - WCRootDataBeamBkg* daBeamBkg = new WCRootDataBeamBkg(); - - // Manage pile-up spills (i.e. results of this program) - WCRootDataPileUpSpill* daPileUp = new WCRootDataPileUpSpill(); - - // Initialize random number generator - daIDNuInt->SetSeed(seed_idnuint); - daBeamBkg->SetSeed(seed_beambkg); - - // Will be used to extract file ID number - daIDNuInt->SetNDigitsFileIDNumber(5); - daBeamBkg->SetNDigitsFileIDNumber(6); - - // Load input files from text file - daIDNuInt->LoadFiles(fInFileTextIDNuInt.c_str()); - daBeamBkg->LoadFiles(fInFileTextBeamBkg.c_str()); - - // Set number of ID interactions per spill - daIDNuInt->SetInteractionRate(fIDNuIntRate); - daBeamBkg->SetInteractionRate(fBeamBkgRate); - - // Mange neutrino interaction timing - // Currently, T2K's 8 bunched beam structure is assumed - BeamTiming* bt = new BeamTiming(seed_beamtiming); - - // Set number of spills that will be saved per output file - daPileUp->SetNumOfSpillesSavedPerFile(fNumOfSpillsPerFile); - - // Some TTree objects contained in input files will be copied into output files. - // It is assumed that all these objects are identical among input files. - // So. will copy these objects from one of input files - daPileUp->SetFileNameForCopyTree(daIDNuInt->GetCurrentInputFileName()); - - // Create output file. Its name will be something like "OutFileNamePrefix".00000.root - daPileUp->CreateTree(fOutFileNamePrefix.c_str()); - - float nuIntTime; // interaction time - int nuIntBunch; // bunch id number - const int PCTLVerbose = (int)fTotalNumofSpills / 10; - std::cout << " Will be generating " << fTotalNumofSpills << " pile-up spills " << std::endl; - for(int i = 0; i < fTotalNumofSpills; i++) { - // Number of ID/Beam bkg interactions of this spill - int nThisIDNuInt = daIDNuInt->DrawNumOfInteraction(); - int nThisBeamBkg = daBeamBkg->DrawNumOfInteraction(); - if(i % PCTLVerbose == 0) { - cout << " i:" << i << " nIDNuInt:" << nThisIDNuInt << " nBeamBkg:" << nThisBeamBkg << endl; - } - - // ID interactions - for(int j = 0; j < nThisIDNuInt; j++) { - daIDNuInt->Next(); - // Drawing interaction time and bunch at which this interaction is taking place - bt->DrawInteractionTime(nuIntTime, nuIntBunch); - - // Add true hits of this interaction to MDT - daIDNuInt->AddTrueHitsToMDT(MDT, nuIntTime); - - // Add information about this interaction - daPileUp->AddInteraction(daIDNuInt, nuIntTime, nuIntBunch); - } - - // Repeating the above, but for beam bkg interactions - for(int j = 0; j < nThisBeamBkg; j++) { - daBeamBkg->Next(); - - bt->DrawInteractionTime(nuIntTime, nuIntBunch); - daBeamBkg->AddTrueHitsToMDT(MDT, nuIntTime); - daPileUp->AddInteraction(daBeamBkg, nuIntTime, nuIntBunch); - } - - // Now all the true hits have been merged into one spill - // Add dark noise hits, and then make digitized hits - MDT->DoAddDark(); - MDT->DoDigitize(); - MDT->DoTrigger(); - - // Add the resultant digitized hits to the output - daPileUp->AddDigiHits(MDT); - daPileUp->FillTree(); - - // Clear all the true and digitized hits of this spill for the next spill - MDT->DoInitialize(); - } - - daIDNuInt->CloseFile(); - daBeamBkg->CloseFile(); - daPileUp->WriteTree(); - - Conf = Configuration::GetInstance(); - Conf->Finalize(); - - std::cout << " ** FINISHED ** " << std::endl; +int main(int argc, char **argv) +{ + std::string ConfigFileName = argv[1]; + ReadConfiguration(argv[1]); + + Configuration *Conf = Configuration::GetInstance(); + Conf->ReadParameter(fMDTParFileName); + Conf->PrintParameters(); + Conf = 0; + + TRandom3 *rndm = new TRandom3(fSeed); + const int seed_mdt = rndm->Integer(1000000); + const int seed_idnuint = rndm->Integer(1000000); + const int seed_beambkg = rndm->Integer(1000000); + const int seed_beamtiming = rndm->Integer(1000000); + delete rndm; rndm = 0; + + // Will be manaing marging true hits and digitizing merged true hits + MDTManager *MDT = new MDTManager(seed_mdt); + + // Manage input files for ID interactions + WCRootDataIDNuInt *daIDNuInt = new WCRootDataIDNuInt(); + + // Manage input files for Beam background interactions + WCRootDataBeamBkg *daBeamBkg = new WCRootDataBeamBkg(); + + // Manage pile-up spills (i.e. results of this program) + WCRootDataPileUpSpill *daPileUp = new WCRootDataPileUpSpill(); + + // Initialize random number generator + daIDNuInt->SetSeed(seed_idnuint); + daBeamBkg->SetSeed(seed_beambkg); + + // Will be used to extract file ID number + daIDNuInt->SetNDigitsFileIDNumber(5); + daBeamBkg->SetNDigitsFileIDNumber(6); + + // Load input files from text file + daIDNuInt->LoadFiles(fInFileTextIDNuInt.c_str()); + daBeamBkg->LoadFiles(fInFileTextBeamBkg.c_str()); + + // Set number of ID interactions per spill + daIDNuInt->SetInteractionRate(fIDNuIntRate); + daBeamBkg->SetInteractionRate(fBeamBkgRate); + + // Mange neutrino interaction timing + // Currently, T2K's 8 bunched beam structure is assumed + BeamTiming *bt = new BeamTiming(seed_beamtiming); + + // Set number of spills that will be saved per output file + daPileUp->SetNumOfSpillesSavedPerFile(fNumOfSpillsPerFile); + + // Some TTree objects contained in input files will be copied into output files. + // It is assumed that all these objects are identical among input files. + // So. will copy these objects from one of input files + daPileUp->SetFileNameForCopyTree(daIDNuInt->GetCurrentInputFileName()); + + // Create output file. Its name will be something like "OutFileNamePrefix".00000.root + daPileUp->CreateTree(fOutFileNamePrefix.c_str()); + + float nuIntTime; // interaction time + int nuIntBunch; // bunch id number + const int PCTLVerbose = (int)fTotalNumofSpills/10; + std::cout<<" Will be generating " << fTotalNumofSpills <<" pile-up spills " <DrawNumOfInteraction(); + int nThisBeamBkg = daBeamBkg->DrawNumOfInteraction(); + if( i%PCTLVerbose==0 ) + { + cout<<" i:" << i + <<" nIDNuInt:" << nThisIDNuInt + <<" nBeamBkg:" << nThisBeamBkg + <Next(); + // Drawing interaction time and bunch at which this interaction is taking place + bt->DrawInteractionTime(nuIntTime, nuIntBunch); + + // Add true hits of this interaction to MDT + daIDNuInt->AddTrueHitsToMDT(MDT, nuIntTime); + + // Add information about this interaction + daPileUp->AddInteraction(daIDNuInt, nuIntTime, nuIntBunch); + } + + // Repeating the above, but for beam bkg interactions + for(int j=0; jNext(); + + bt->DrawInteractionTime(nuIntTime, nuIntBunch); + daBeamBkg->AddTrueHitsToMDT(MDT, nuIntTime); + daPileUp->AddInteraction(daBeamBkg, nuIntTime, nuIntBunch); + } + + // Now all the true hits have been merged into one spill + // Add dark noise hits, and then make digitized hits + MDT->DoAddDark(); + MDT->DoDigitize(); + MDT->DoTrigger(); + + // Add the resultant digitized hits to the output + daPileUp->AddDigiHits(MDT); + daPileUp->FillTree(); + + // Clear all the true and digitized hits of this spill for the next spill + MDT->DoInitialize(); + } + + daIDNuInt->CloseFile(); + daBeamBkg->CloseFile(); + daPileUp->WriteTree(); + + Conf = Configuration::GetInstance(); + Conf->Finalize(); + + std::cout<<" ** FINISHED ** " <ReadParameter(std::string(filename)); - Conf->PrintParameters(); - Conf->GetValue("ListIDNuIntFiles", fInFileTextIDNuInt); - Conf->GetValue("ListBeamBkgFiles", fInFileTextBeamBkg); - Conf->GetValue("OutFileNamePrefix", fOutFileNamePrefix); - Conf->GetValue("MDTParFile", fMDTParFileName); - Conf->GetValue("InitialSeed", fSeed); - Conf->GetValue("NumOfSpillsSavedPerFile", fNumOfSpillsPerFile); - Conf->GetValue("IDNuIntRate", fIDNuIntRate); - Conf->GetValue("BeamBkgRate", fBeamBkgRate); - Conf->GetValue("TotalNumOfSpills", fTotalNumofSpills); - Conf->Finalize(); + +void ReadConfiguration(const char *filename) +{ + Configuration *Conf = Configuration::GetInstance(); + Conf->ReadParameter(std::string(filename)); + Conf->PrintParameters(); + Conf->GetValue("ListIDNuIntFiles", fInFileTextIDNuInt); + Conf->GetValue("ListBeamBkgFiles", fInFileTextBeamBkg); + Conf->GetValue("OutFileNamePrefix", fOutFileNamePrefix); + Conf->GetValue("MDTParFile", fMDTParFileName); + Conf->GetValue("InitialSeed", fSeed); + Conf->GetValue("NumOfSpillsSavedPerFile", fNumOfSpillsPerFile); + Conf->GetValue("IDNuIntRate", fIDNuIntRate); + Conf->GetValue("BeamBkgRate", fBeamBkgRate); + Conf->GetValue("TotalNumOfSpills", fTotalNumofSpills); + Conf->Finalize(); } diff --git a/app/application/appHKHybridSingleEvent.cc b/app/application/appHKHybridSingleEvent.cc index f82b459..23e799f 100644 --- a/app/application/appHKHybridSingleEvent.cc +++ b/app/application/appHKHybridSingleEvent.cc @@ -10,97 +10,88 @@ using std::endl; using std::string; using std::vector; -int fNEvtToProc = -1; -int fSeed = 67592; +int fNEvtToProc = -1; +int fSeed = 67592; string fParFileName = ""; -string fInFileName = ""; +string fInFileName = ""; string fOutFileName = ""; bool ParseCmdArguments(int, char**); -int main(int argc, char** argv) { - ParseCmdArguments(argc, argv); +int main(int argc, char **argv) +{ + ParseCmdArguments(argc, argv); - Configuration* Conf = Configuration::GetInstance(); - Conf->ReadParameter(fParFileName); - Conf->PrintParameters(); - Conf = 0; + Configuration *Conf = Configuration::GetInstance(); + Conf->ReadParameter(fParFileName); + Conf->PrintParameters(); + Conf = 0; - const int NPMTType = 2; - string fPMTType[NPMTType]; - fPMTType[0] = "BoxandLine20inchHQE"; - fPMTType[1] = "PMT3inchR14374"; - MDTManager* MDT = new MDTManager(fSeed); - MDT->RegisterPMTType(fPMTType[0], new ResponseBoxandLine20inchHQE()); - MDT->RegisterPMTType(fPMTType[1], new Response3inchR14374()); + const int NPMTType = 2; + string fPMTType[NPMTType]; + fPMTType[0] = "BoxandLine20inchHQE"; + fPMTType[1] = "PMT3inchR14374"; - const vector listWCRootEvt { "wcsimrootevent", "wcsimrootevent2" }; + MDTManager *MDT = new MDTManager(fSeed); + MDT->RegisterPMTType(fPMTType[0], new ResponseBoxandLine20inchHQE()); + MDT->RegisterPMTType(fPMTType[1], new Response3inchR14374()); - WCRootData* inData = new WCRootData(); - WCRootData* outData = new WCRootData(); + const vector listWCRootEvt{"wcsimrootevent", "wcsimrootevent2"}; - inData->ReadFile(fInFileName.c_str(), listWCRootEvt); - outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); + WCRootData *inData = new WCRootData(); + WCRootData *outData = new WCRootData(); - const int nEntries = inData->GetEntries(); - const float toffset = 0.; // for IWCD pile-up event generation + inData->ReadFile(fInFileName.c_str(), listWCRootEvt); + outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); - cout << " Start processing " << nEntries << " entries........ " << endl; - for(int iEntry = 0; iEntry < nEntries; iEntry++) { - inData->GetEntry(iEntry); + const int nEntries = inData->GetEntries(); + const float toffset = 0.; // for IWCD pile-up event generation - outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); - for(int j = 0; j < NPMTType; j++) { - inData->AddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), - MDT->GetPMTResponse(fPMTType[j]), - toffset, - j); - MDT->DoAddDark(fPMTType[j]); - MDT->DoDigitize(fPMTType[j]); - MDT->DoTrigger(fPMTType[j]); + cout<<" Start processing " << nEntries <<" entries........ " <GetEntry(iEntry); - TriggerInfo* ti = MDT->GetTriggerInfo(fPMTType[j]); - outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); - } - outData->FillTree(); + outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); + for(int j=0; jAddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), MDT->GetPMTResponse(fPMTType[j]), toffset, j); + MDT->DoAddDark(fPMTType[j]); + MDT->DoDigitize(fPMTType[j]); + MDT->DoTrigger(fPMTType[j]); - MDT->DoInitialize(); - } - outData->WriteTree(); - inData->CloseFile(); + TriggerInfo *ti = MDT->GetTriggerInfo(fPMTType[j]); + outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); + } + outData->FillTree(); + + MDT->DoInitialize(); + } + outData->WriteTree(); + inData->CloseFile(); } -bool ParseCmdArguments(int argc, char** argv) { - cout << " Parsing command line arguments..... " << endl; - for(int i = 1; i < argc; i++) { - cout << " - argv[" << i << "] :" << argv[i] << endl; - } - cout << endl; - for(int i = 1; i < argc; i++) { - if(string(argv[i]) == "-i") { - fInFileName = TString(argv[i + 1]); - i++; - } - else if(string(argv[i]) == "-p") { - fParFileName = TString(argv[i + 1]); - i++; - } - else if(string(argv[i]) == "-o") { - fOutFileName = TString(argv[i + 1]); - i++; - } - else if(string(argv[i]) == "-s") { - fSeed = atoi(argv[i + 1]); - i++; - } - else if(string(argv[i]) == "-n") { - fNEvtToProc = atoi(argv[i + 1]); - i++; - } - else { - cout << " i: " << argv[i] << endl; +bool ParseCmdArguments(int argc, char **argv) +{ + cout<<" Parsing command line arguments..... " < #include #include -#include "MDTManager.h" +#include "MDTManager.h" #include "WCRootData.h" // PMT type used for 3-inch PMTs of WCTE @@ -23,103 +22,92 @@ using std::endl; using std::string; using std::vector; -int fNEvtToProc = -1; -int fSeed = 67592; +int fNEvtToProc = -1; +int fSeed = 67592; string fParFileName = ""; -string fInFileName = ""; +string fInFileName = ""; string fOutFileName = ""; bool ParseCmdArguments(int, char**); -int main(int argc, char** argv) { - ParseCmdArguments(argc, argv); +int main(int argc, char **argv) +{ + ParseCmdArguments(argc, argv); - Configuration* Conf = Configuration::GetInstance(); - Conf->ReadParameter(fParFileName); - Conf->PrintParameters(); - Conf = 0; + Configuration *Conf = Configuration::GetInstance(); + Conf->ReadParameter(fParFileName); + Conf->PrintParameters(); + Conf = 0; // WCTE will use single PMT type, so define the corresponding type of 3-inch PMT - const int NPMTType = 1; - string fPMTType[NPMTType]; - fPMTType[0] = "PMT3inchR12199_02"; + const int NPMTType = 1; + string fPMTType[NPMTType]; + fPMTType[0] = "PMT3inchR12199_02"; - MDTManager* MDT = new MDTManager(fSeed); - MDT->RegisterPMTType(fPMTType[0], new PMTResponse3inchR12199_02()); + MDTManager *MDT = new MDTManager(fSeed); + MDT->RegisterPMTType(fPMTType[0], new PMTResponse3inchR12199_02()); - const vector listWCRootEvt { "wcsimrootevent" }; + const vector listWCRootEvt{"wcsimrootevent"}; // WCRootData is an interface class between MDT and WCSim root file - WCRootData* inData = new WCRootData(); - WCRootData* outData = new WCRootData(); + WCRootData *inData = new WCRootData(); + WCRootData *outData = new WCRootData(); // Read input WCSim file - inData->ReadFile(fInFileName.c_str(), listWCRootEvt); + inData->ReadFile(fInFileName.c_str(), listWCRootEvt); // Create TTrees to be saved in the output file - outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); - - int nEntries = inData->GetEntries(); - const float toffset = 0.; // for IWCD pile-up event generation -> just ignore - - if(fNEvtToProc > 0 && fNEvtToProc < nEntries) - nEntries = fNEvtToProc; - - cout << " Start processing " << nEntries << " entries........ " << endl; - for(int iEntry = 0; iEntry < nEntries; iEntry++) { - inData->GetEntry(iEntry); - - outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); - for(int j = 0; j < NPMTType; j++) { - inData->AddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), - MDT->GetPMTResponse(fPMTType[j]), - toffset, - j); - MDT->DoAddDark(fPMTType[j]); - MDT->DoDigitize(fPMTType[j]); - MDT->DoTrigger(fPMTType[j]); - - TriggerInfo* ti = MDT->GetTriggerInfo(fPMTType[j]); - outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); - } - outData->FillTree(); - - MDT->DoInitialize(); - } - outData->WriteTree(); - inData->CloseFile(); + outData->CreateTree(fOutFileName.c_str(), listWCRootEvt); + + int nEntries = inData->GetEntries(); + const float toffset = 0.; // for IWCD pile-up event generation -> just ignore + + if (fNEvtToProc>0 && fNEvtToProcGetEntry(iEntry); + + outData->AddTracks(inData->GetTrigger(0, 0), toffset, 0); + for(int j=0; jAddTrueHitsToMDT(MDT->GetHitTubeCollection(fPMTType[j]), MDT->GetPMTResponse(fPMTType[j]), toffset, j); + MDT->DoAddDark(fPMTType[j]); + MDT->DoDigitize(fPMTType[j]); + MDT->DoTrigger(fPMTType[j]); + + TriggerInfo *ti = MDT->GetTriggerInfo(fPMTType[j]); + outData->AddDigiHits(MDT->GetHitTubeCollection(fPMTType[j]), ti, iEntry, j); + } + outData->FillTree(); + + MDT->DoInitialize(); + } + outData->WriteTree(); + inData->CloseFile(); } -bool ParseCmdArguments(int argc, char** argv) { - cout << " Parsing command line arguments..... " << endl; - for(int i = 1; i < argc; i++) { - cout << " - argv[" << i << "] :" << argv[i] << endl; - } - cout << endl; - for(int i = 1; i < argc; i++) { - if(string(argv[i]) == "-i") { - fInFileName = TString(argv[i + 1]); - i++; - } - else if(string(argv[i]) == "-p") { - fParFileName = TString(argv[i + 1]); - i++; - } - else if(string(argv[i]) == "-o") { - fOutFileName = TString(argv[i + 1]); - i++; - } - else if(string(argv[i]) == "-s") { - fSeed = atoi(argv[i + 1]); - i++; - } - else if(string(argv[i]) == "-n") { - fNEvtToProc = atoi(argv[i + 1]); - i++; - } - else { - cout << " i: " << argv[i] << endl; +bool ParseCmdArguments(int argc, char **argv) +{ + cout<<" Parsing command line arguments..... " <Branch("NNuIntTot", &NNuIntTot, "NNuIntTot/i"); + t->Branch("NIDNuInt", &NIDNuInt, "NIDNuInt/i"); + t->Branch("NBeamBkg", &NBeamBkg, "NBeamBkg/i"); + t->Branch("NuIntType", NuIntType, "NuIntType[NNuIntTot]/i"); + t->Branch("NuIntTime", NuIntTime, "NuIntTime[NNuIntTot]/F"); + t->Branch("NuIntBunch", NuIntBunch, "NuIntBunch[NNuIntTot]/i"); + t->Branch("NuPDG", NuPDG, "NuPDG[NNuIntTot]/I"); + t->Branch("NuEne", NuEne, "NuEne[NNuIntTot]/F"); + t->Branch("NuPos", NuPos, "NuPos[NNuIntTot][3]/F"); + t->Branch("NuDir", NuDir, "NuDir[NNuIntTot][3]/F"); + t->Branch("EdepoOD", EdepoOD, "EdepoOD[NNuIntTot]/F"); + t->Branch("FileIdNum", FileIdNum, "FileIdNum[NNuIntTot]/i"); + t->Branch("EventIdNum", EventIdNum, "EventIdNum[NNuIntTot]/i"); + t->Branch("NTracks", &NTracks, "NTracks/i"); + t->Branch("TrackNuIntIdx", TrackNuIntIdx, "TrackNuIntIdx[NTracks]/i"); + } - void CreateBranch(TTree* t) { - t->Branch("NNuIntTot", &NNuIntTot, "NNuIntTot/i"); - t->Branch("NIDNuInt", &NIDNuInt, "NIDNuInt/i"); - t->Branch("NBeamBkg", &NBeamBkg, "NBeamBkg/i"); - t->Branch("NuIntType", NuIntType, "NuIntType[NNuIntTot]/i"); - t->Branch("NuIntTime", NuIntTime, "NuIntTime[NNuIntTot]/F"); - t->Branch("NuIntBunch", NuIntBunch, "NuIntBunch[NNuIntTot]/i"); - t->Branch("NuPDG", NuPDG, "NuPDG[NNuIntTot]/I"); - t->Branch("NuEne", NuEne, "NuEne[NNuIntTot]/F"); - t->Branch("NuPos", NuPos, "NuPos[NNuIntTot][3]/F"); - t->Branch("NuDir", NuDir, "NuDir[NNuIntTot][3]/F"); - t->Branch("EdepoOD", EdepoOD, "EdepoOD[NNuIntTot]/F"); - t->Branch("FileIdNum", FileIdNum, "FileIdNum[NNuIntTot]/i"); - t->Branch("EventIdNum", EventIdNum, "EventIdNum[NNuIntTot]/i"); - t->Branch("NTracks", &NTracks, "NTracks/i"); - t->Branch("TrackNuIntIdx", TrackNuIntIdx, "TrackNuIntIdx[NTracks]/i"); - } - - void SetBranch(TTree* t) { - t->SetBranchAddress("NNuIntTot", &NNuIntTot); - t->SetBranchAddress("NIDNuInt", &NIDNuInt); - t->SetBranchAddress("NBeamBkg", &NBeamBkg); - t->SetBranchAddress("NuIntType", NuIntType); - t->SetBranchAddress("NuIntTime", NuIntTime); - t->SetBranchAddress("NuIntBunch", NuIntBunch); - t->SetBranchAddress("Mode", Mode); - t->SetBranchAddress("NuPDG", NuPDG); - t->SetBranchAddress("NuEne", NuEne); - t->SetBranchAddress("NuPos", NuPos); - t->SetBranchAddress("NuDir", NuDir); - t->SetBranchAddress("EdepoOD", EdepoOD); - t->SetBranchAddress("FileIdNum", FileIdNum); - t->SetBranchAddress("EventIdNum", EventIdNum); - t->SetBranchAddress("NTracks", &NTracks); - t->SetBranchAddress("TrackNuIntIdx", TrackNuIntIdx); - } + void SetBranch(TTree *t) + { + t->SetBranchAddress("NNuIntTot", &NNuIntTot); + t->SetBranchAddress("NIDNuInt", &NIDNuInt); + t->SetBranchAddress("NBeamBkg", &NBeamBkg); + t->SetBranchAddress("NuIntType", NuIntType); + t->SetBranchAddress("NuIntTime", NuIntTime); + t->SetBranchAddress("NuIntBunch", NuIntBunch); + t->SetBranchAddress("Mode", Mode); + t->SetBranchAddress("NuPDG", NuPDG); + t->SetBranchAddress("NuEne", NuEne); + t->SetBranchAddress("NuPos", NuPos); + t->SetBranchAddress("NuDir", NuDir); + t->SetBranchAddress("EdepoOD", EdepoOD); + t->SetBranchAddress("FileIdNum", FileIdNum); + t->SetBranchAddress("EventIdNum", EventIdNum); + t->SetBranchAddress("NTracks", &NTracks); + t->SetBranchAddress("TrackNuIntIdx", TrackNuIntIdx); + } }; diff --git a/app/utilities/WCRootData/include/RedNRTVtx_t.h b/app/utilities/WCRootData/include/RedNRTVtx_t.h index ce3e828..cb8790a 100644 --- a/app/utilities/WCRootData/include/RedNRTVtx_t.h +++ b/app/utilities/WCRootData/include/RedNRTVtx_t.h @@ -4,63 +4,73 @@ const int kMaxIntVtx = 1000; -struct RedNRTVtx_t { - Int_t NIntVtx; - Int_t Mode[kMaxIntVtx]; - Float_t NuEne[kMaxIntVtx]; - Int_t NuPDG[kMaxIntVtx]; - Float_t NuPos[kMaxIntVtx][3]; - Float_t NuDir[kMaxIntVtx][3]; - Float_t LepDir[kMaxIntVtx][3]; - Float_t LepMom[kMaxIntVtx]; +struct RedNRTVtx_t +{ + Int_t NIntVtx; + Int_t Mode[kMaxIntVtx]; + Float_t NuEne[kMaxIntVtx]; + Int_t NuPDG[kMaxIntVtx]; + Float_t NuPos[kMaxIntVtx][3]; + Float_t NuDir[kMaxIntVtx][3]; + Float_t LepDir[kMaxIntVtx][3]; + Float_t LepMom[kMaxIntVtx]; - void Clear() { - NIntVtx = 0; - for(Int_t i = 0; i < kMaxIntVtx; i++) { - Mode[i] = -9999; - NuEne[i] = -9999.; - NuPDG[i] = -9999; - for(Int_t j = 0; j < 3; j++) { - NuPos[i][j] = -9999.; - NuDir[i][j] = -9999.; - LepDir[i][j] = -9999.; - } - LepMom[i] = -9999.; - } - } + void Clear() + { + NIntVtx = 0; + for(Int_t i=0; iBranch("NIntVtx", &NIntVtx, "NIntVtx/I"); + t->Branch("Mode", Mode, "Mode[NIntVtx]/I"); + t->Branch("NuPDG", NuPDG, "NuPDG[NIntVtx]/I"); + t->Branch("NuEne", NuEne, "NuEne[NIntVtx]/F"); + t->Branch("NuPos", NuPos, "NuPos[NIntVtx][3]/F"); + t->Branch("NuDir", NuDir, "NuDir[NIntVtx][3]/F"); + t->Branch("LepDir", LepDir, "LepDir[NIntVtx][3]/F"); + t->Branch("LepMom", LepMom, "LepMom[NIntVtx]/F"); + } - void CreateBranch(TTree* t) { - t->Branch("NIntVtx", &NIntVtx, "NIntVtx/I"); - t->Branch("Mode", Mode, "Mode[NIntVtx]/I"); - t->Branch("NuPDG", NuPDG, "NuPDG[NIntVtx]/I"); - t->Branch("NuEne", NuEne, "NuEne[NIntVtx]/F"); - t->Branch("NuPos", NuPos, "NuPos[NIntVtx][3]/F"); - t->Branch("NuDir", NuDir, "NuDir[NIntVtx][3]/F"); - t->Branch("LepDir", LepDir, "LepDir[NIntVtx][3]/F"); - t->Branch("LepMom", LepMom, "LepMom[NIntVtx]/F"); - } - - void SetBranch(TTree* t) { - t->SetBranchAddress("NIntVtx", &NIntVtx); - t->SetBranchAddress("Mode", Mode); - t->SetBranchAddress("NuPDG", NuPDG); - t->SetBranchAddress("NuEne", NuEne); - t->SetBranchAddress("NuPos", NuPos); - t->SetBranchAddress("NuDir", NuDir); - t->SetBranchAddress("LepDir", LepDir); - t->SetBranchAddress("LepMom", LepMom); - } + void SetBranch(TTree *t) + { + t->SetBranchAddress("NIntVtx", &NIntVtx); + t->SetBranchAddress("Mode", Mode); + t->SetBranchAddress("NuPDG", NuPDG); + t->SetBranchAddress("NuEne", NuEne); + t->SetBranchAddress("NuPos", NuPos); + t->SetBranchAddress("NuDir", NuDir); + t->SetBranchAddress("LepDir", LepDir); + t->SetBranchAddress("LepMom", LepMom); + } }; + + diff --git a/app/utilities/WCRootData/include/SpillAnalyzer.h b/app/utilities/WCRootData/include/SpillAnalyzer.h index 48c0ff6..f59e71e 100644 --- a/app/utilities/WCRootData/include/SpillAnalyzer.h +++ b/app/utilities/WCRootData/include/SpillAnalyzer.h @@ -8,17 +8,14 @@ using std::endl; class WCRootDataPileUpSpill; -class SpillAnalyzer { - public: +class SpillAnalyzer +{ + public: + SpillAnalyzer(); + virtual ~SpillAnalyzer(); - SpillAnalyzer(); - virtual ~SpillAnalyzer(); - - bool IsSingleIDIneractionAtBunch(const WCRootDataPileUpSpill*, const int, int&); - bool HasMichelEFromOtherInteractionAtBunch(const WCRootDataPileUpSpill*, - const int, - const float, - const float); + bool IsSingleIDIneractionAtBunch(const WCRootDataPileUpSpill*, const int, int&); + bool HasMichelEFromOtherInteractionAtBunch(const WCRootDataPileUpSpill*, const int, const float, const float); }; #endif diff --git a/app/utilities/WCRootData/include/WCRootData.h b/app/utilities/WCRootData/include/WCRootData.h index 0c56610..6db8271 100644 --- a/app/utilities/WCRootData/include/WCRootData.h +++ b/app/utilities/WCRootData/include/WCRootData.h @@ -1,79 +1,76 @@ #ifndef WCROOTDATA_H #define WCROOTDATA_H -#include #include -#include +#include +#include #include +#include #include -#include -#include "TBranch.h" -#include "TChain.h" -#include "TClonesArray.h" #include "TFile.h" +#include "TChain.h" #include "TTree.h" +#include "TBranch.h" +#include "TClonesArray.h" -#include "TNRooTrackerVtx.hh" #include "WCSimRootEvent.hh" #include "WCSimRootGeom.hh" +#include "TNRooTrackerVtx.hh" #include "MDTManager.h" using std::cout; using std::endl; +using std::vector; +using std::string; using std::map; using std::pair; -using std::string; -using std::vector; - -class WCRootData { - public: - - WCRootData(); - virtual ~WCRootData(); - - void ReadFile(const char*, const vector& v = vector()); - void CloseFile(); - - void CreateTree(const char*, const vector& v = vector()); - virtual void FillTree(); - virtual void WriteTree(); - void GetGeometryInfo(const char*); - void CopyTree(const char*, const char*, const vector& v = vector()); +class WCRootData +{ + public: + WCRootData(); + virtual ~WCRootData(); - void SetOutFileName(const char* f) { fOutFileName = TString(f); } + void ReadFile(const char*, const vector &v=vector()); + void CloseFile(); - int GetEntries(); - void GetEntry(int); + void CreateTree(const char*, const vector &v=vector()); + virtual void FillTree(); + virtual void WriteTree(); - WCSimRootTrigger* GetTrigger(int i, int iPMT = 0) const { return fSpEvt[iPMT]->GetTrigger(i); } + void GetGeometryInfo(const char*); + void CopyTree(const char*, const char*, const vector&v=vector()); + void SetOutFileName(const char *f){ fOutFileName = TString(f); } - void AddTrueHitsToMDT(MDTManager*); - void AddTrueHitsToMDT(HitTubeCollection*, PMTResponse*, float offset_time = 0., int iPMT = 0); - void AddDigiHits(MDTManager*, int event_id = 0, int iPMT = 0); - void AddDigiHits(HitTubeCollection* hc, TriggerInfo* ti, int even_it = 0, int iPMT = 0); - void AddTracks(const WCSimRootTrigger*, float offset_time = 0., int iPMT = 0); + int GetEntries(); + void GetEntry(int); - const char* GetCurrentInputFileName() const { return fWCSimC->GetFile()->GetName(); } + WCSimRootTrigger *GetTrigger(int i, int iPMT=0) const { return fSpEvt[iPMT]->GetTrigger(i); } - protected: + void AddTrueHitsToMDT(MDTManager*); + void AddTrueHitsToMDT(HitTubeCollection*, PMTResponse*, float offset_time=0., int iPMT=0); + void AddDigiHits(MDTManager*, int event_id=0, int iPMT=0); + void AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int even_it=0, int iPMT=0); + void AddTracks(const WCSimRootTrigger*, float offset_time=0., int iPMT=0); - TChain* fWCSimC; - TTree* fWCSimT; - vector fSpEvt; - WCSimRootGeom* fWCGeom; + const char *GetCurrentInputFileName() const { return fWCSimC->GetFile()->GetName(); } - Float_t fDetCentreY; + protected: + TChain *fWCSimC; + TTree *fWCSimT; + vector fSpEvt; + WCSimRootGeom *fWCGeom; - float fHitTimeOffset; - bool fMultDigiHits; + Float_t fDetCentreY; - private: + float fHitTimeOffset; + bool fMultDigiHits; + private: void SetTubes(HitTubeCollection*, const int); - TString fOutFileName; + TString fOutFileName; }; #endif diff --git a/app/utilities/WCRootData/include/WCRootDataBeamBkg.h b/app/utilities/WCRootData/include/WCRootDataBeamBkg.h index 3a0015e..d63ee19 100644 --- a/app/utilities/WCRootData/include/WCRootDataBeamBkg.h +++ b/app/utilities/WCRootData/include/WCRootDataBeamBkg.h @@ -5,22 +5,20 @@ class WCRootDataNuInt; -class WCRootDataBeamBkg : public WCRootDataNuInt { - public: +class WCRootDataBeamBkg : public WCRootDataNuInt +{ + public : + WCRootDataBeamBkg(); + virtual ~WCRootDataBeamBkg(); - WCRootDataBeamBkg(); - virtual ~WCRootDataBeamBkg(); + void LoadFiles(const char *); + float GetEnergyDepositionInOD() const { return fEdepoOD; } - void LoadFiles(const char*); + private : + void ReadFriend(const char*); + void CloseFriend(); - float GetEnergyDepositionInOD() const { return fEdepoOD; } - - private: - - void ReadFriend(const char*); - void CloseFriend(); - - Int_t fgrNPart; - Float_t fEdepoOD; + Int_t fgrNPart; + Float_t fEdepoOD; }; #endif diff --git a/app/utilities/WCRootData/include/WCRootDataIDNuInt.h b/app/utilities/WCRootData/include/WCRootDataIDNuInt.h index 4cb193f..9f9c3d9 100644 --- a/app/utilities/WCRootData/include/WCRootDataIDNuInt.h +++ b/app/utilities/WCRootData/include/WCRootDataIDNuInt.h @@ -1,24 +1,23 @@ #ifndef WCROOTDATA_IDNUINT_H #define WCROOTDATA_IDNUINT_H -#include "RedNRTVtx_t.h" #include "WCRootDataNuInt.h" +#include "RedNRTVtx_t.h" class WCRootDataNuInt; -class WCRootDataIDNuInt : public WCRootDataNuInt { - public: - - WCRootDataIDNuInt(); - virtual ~WCRootDataIDNuInt(); - - void LoadFiles(const char*); - void SetInteractionInformation(PileUpSpill_t*) const; +class WCRootDataIDNuInt : public WCRootDataNuInt +{ + public : + WCRootDataIDNuInt(); + virtual ~WCRootDataIDNuInt(); - private: + void LoadFiles(const char*); + void SetInteractionInformation(PileUpSpill_t*) const; - void ReadFriend(const char*); - void CloseFriend(); - RedNRTVtx_t fNRTVtx; + private : + void ReadFriend(const char*); + void CloseFriend(); + RedNRTVtx_t fNRTVtx; }; #endif diff --git a/app/utilities/WCRootData/include/WCRootDataNuInt.h b/app/utilities/WCRootData/include/WCRootDataNuInt.h index 3478ec4..e55083c 100644 --- a/app/utilities/WCRootData/include/WCRootDataNuInt.h +++ b/app/utilities/WCRootData/include/WCRootDataNuInt.h @@ -2,65 +2,61 @@ #define WCROOTDATANUINT_H #include -#include "PileUpSpill_t.h" #include "TRandom3.h" #include "WCRootData.h" +#include "PileUpSpill_t.h" using std::stringstream; class WCRootData; -enum ENuIntType { eIDNuInt = 0, eBeamBkg, eSingle }; - -class WCRootDataNuInt : public WCRootData { - public: - - WCRootDataNuInt(); - virtual ~WCRootDataNuInt(); - - void SetSeed(const int i) { fRnd->SetSeed(i); } - - void LoadFiles(const char*); - virtual bool Next(); - - void SetNDigitsFileIDNumber(int i) { fNDigitsFileIdNum = i; } - - int GetEventIdNumber() const { return fItrEntry - 1; } - - int GetFileIdNumber() const { return fFileIdNum; } - - void SetInteractionRate(const float f) { fIntRate = f; } - - int DrawNumOfInteraction() const { return fRnd->Poisson(fIntRate); } - - unsigned GetInteractionType() const { return fNuIntType; } - - virtual float GetEnergyDepositionInOD() const { return 0.; } - - virtual void SetInteractionInformation(PileUpSpill_t*) const {}; - - protected: - - int GetFileIdNumber(const char*, const char* prefix = "wcsim."); - - virtual void ReadFriend(const char* f) { cout << " Reading friend: " << f << endl; }; - - virtual void CloseFriend() {}; - - TRandom3* fRnd; - std::vector> fFileList; - std::vector> fFriendList; - TChain* fFriendC; - - bool fHasFriend; - unsigned int fNuIntType; - - int fItrEntry; - int fItrFile; - int fNumEntries; - int fNumFiles; - int fFileIdNum; - int fNDigitsFileIdNum; - float fIntRate; +enum ENuIntType{ eIDNuInt=0, + eBeamBkg, + eSingle + }; + +class WCRootDataNuInt : public WCRootData +{ + public: + WCRootDataNuInt(); + virtual ~WCRootDataNuInt(); + + void SetSeed(const int i){ fRnd->SetSeed(i); } + void LoadFiles(const char*); + virtual bool Next(); + + void SetNDigitsFileIDNumber(int i){ fNDigitsFileIdNum = i; } + int GetEventIdNumber() const { return fItrEntry-1; } + int GetFileIdNumber() const { return fFileIdNum; } + + void SetInteractionRate(const float f) { fIntRate = f; } + int DrawNumOfInteraction() const { return fRnd->Poisson(fIntRate); } + + unsigned GetInteractionType() const { return fNuIntType; } + virtual float GetEnergyDepositionInOD() const { return 0.; } + virtual void SetInteractionInformation(PileUpSpill_t*) const {}; + + protected: + int GetFileIdNumber(const char*, const char *prefix="wcsim."); + + virtual void ReadFriend(const char* f){ cout<<" Reading friend: " << f <> fFileList; + std::vector> fFriendList; + TChain *fFriendC; + + bool fHasFriend; + unsigned int fNuIntType; + + + int fItrEntry; + int fItrFile; + int fNumEntries; + int fNumFiles; + int fFileIdNum; + int fNDigitsFileIdNum; + float fIntRate; }; #endif diff --git a/app/utilities/WCRootData/include/WCRootDataPileUpSpill.h b/app/utilities/WCRootData/include/WCRootDataPileUpSpill.h index 455d192..6d06390 100644 --- a/app/utilities/WCRootData/include/WCRootDataPileUpSpill.h +++ b/app/utilities/WCRootData/include/WCRootDataPileUpSpill.h @@ -1,56 +1,53 @@ #ifndef WCROOTDATAPILEUPSPILL_H #define WCROOTDATAPILEUPSPILL_H -#include #include +#include -#include "PileUpSpill_t.h" #include "WCRootData.h" +#include "PileUpSpill_t.h" using std::stringstream; class WCRootDataNuInt; -class WCRootDataPileUpSpill : public WCRootData { - public: - - WCRootDataPileUpSpill(); - virtual ~WCRootDataPileUpSpill(); - - // For reading - void ReadFile(const char*); - void CloseFile(); - int GetEntries(); - void GetEntry(const int); - - const PileUpSpill_t* GetPileUpSpill() const { return &fPupSpill; } - - void AddDigiHitsToMDT(MDTManager*, float, float, float); - - // For writing - // void SetOutFilePrefix(const char *f){ fOutFilePrefix = TString(f); } - void CreateTree(const char* f = 0); - void FillTree(); - void WriteTree(); - void AddInteraction(const WCRootDataNuInt*, float offset_time = 0., int bunch_id = 99999); - - void SetNumOfSpillesSavedPerFile(const int i) { fNumOfSpillsPerFile = i; } - - void SetFileNameForCopyTree(const char* f) { fFileNameToBeCopied = TString(f); } - - private: - - void GetOutFileIdNumber(const int, TString&); - - TString fOutFilePrefix; - TString fPupSpillTreeName; - int fOutFileNum; - int fNumOfSpillsPerFile; - int fCurSpill; - - PileUpSpill_t fPupSpill; - TTree* fPupSpillT; - TChain* fPupSpillC; - - TString fFileNameToBeCopied; +class WCRootDataPileUpSpill : public WCRootData +{ + public: + WCRootDataPileUpSpill(); + virtual ~WCRootDataPileUpSpill(); + + // For reading + void ReadFile(const char*); + void CloseFile(); + int GetEntries(); + void GetEntry(const int); + const PileUpSpill_t *GetPileUpSpill() const {return &fPupSpill;} + + void AddDigiHitsToMDT(MDTManager*, float, float, float); + + // For writing + // void SetOutFilePrefix(const char *f){ fOutFilePrefix = TString(f); } + void CreateTree(const char *f=0); + void FillTree(); + void WriteTree(); + void AddInteraction(const WCRootDataNuInt*, float offset_time=0., int bunch_id=99999); + + void SetNumOfSpillesSavedPerFile(const int i){ fNumOfSpillsPerFile = i; } + void SetFileNameForCopyTree(const char *f){ fFileNameToBeCopied = TString(f); } + + private: + void GetOutFileIdNumber(const int, TString&); + + TString fOutFilePrefix; + TString fPupSpillTreeName; + int fOutFileNum; + int fNumOfSpillsPerFile; + int fCurSpill; + + PileUpSpill_t fPupSpill; + TTree *fPupSpillT; + TChain *fPupSpillC; + + TString fFileNameToBeCopied; }; #endif diff --git a/app/utilities/WCRootData/src/BeamTiming.cc b/app/utilities/WCRootData/src/BeamTiming.cc index 6ca27f8..ecbe2e8 100644 --- a/app/utilities/WCRootData/src/BeamTiming.cc +++ b/app/utilities/WCRootData/src/BeamTiming.cc @@ -1,16 +1,18 @@ #include "BeamTiming.h" -BeamTiming::BeamTiming(int seed) { - fRnd = new TRandom3(seed); +BeamTiming::BeamTiming(int seed) +{ + fRnd = new TRandom3(seed); } -BeamTiming::~BeamTiming() { - delete fRnd; - fRnd = 0; +BeamTiming::~BeamTiming() +{ + delete fRnd; fRnd = 0; } -void BeamTiming::DrawInteractionTime(float& time, int& iBunch) { - iBunch = fRnd->Integer(kNBunches); - float bunchTime = fRnd->Gaus(0., kBunchSigma); - time = (float)kBunchInterval * iBunch + bunchTime; +void BeamTiming::DrawInteractionTime(float &time, int &iBunch) +{ + iBunch = fRnd->Integer(kNBunches); + float bunchTime = fRnd->Gaus(0., kBunchSigma); + time =(float)kBunchInterval*iBunch + bunchTime; } diff --git a/app/utilities/WCRootData/src/SpillAnalyzer.cc b/app/utilities/WCRootData/src/SpillAnalyzer.cc index 63e59ed..fb802e5 100644 --- a/app/utilities/WCRootData/src/SpillAnalyzer.cc +++ b/app/utilities/WCRootData/src/SpillAnalyzer.cc @@ -4,86 +4,91 @@ #include "WCRootDataPileUpSpill.h" #include "WCSimRootEvent.hh" -SpillAnalyzer::SpillAnalyzer() {} +SpillAnalyzer::SpillAnalyzer() +{ +} + +SpillAnalyzer::~SpillAnalyzer() +{ +} -SpillAnalyzer::~SpillAnalyzer() {} +bool SpillAnalyzer::IsSingleIDIneractionAtBunch(const WCRootDataPileUpSpill *input, const int bunch_id, int &nuIntIdx) +{ + nuIntIdx = -1; -bool SpillAnalyzer::IsSingleIDIneractionAtBunch(const WCRootDataPileUpSpill* input, - const int bunch_id, - int& nuIntIdx) { - nuIntIdx = -1; + const PileUpSpill_t *pup = input->GetPileUpSpill(); + float EdepoODTot[kNBunches] = {0.}; + int nIDNuInt = 0; + int nBeamBkg = 0; - const PileUpSpill_t* pup = input->GetPileUpSpill(); - float EdepoODTot[kNBunches] = { 0. }; - int nIDNuInt = 0; - int nBeamBkg = 0; + for(int i=0; iNNuIntTot; i++) + { + EdepoODTot[pup->NuIntBunch[i]] += pup->EdepoOD[i]; + if( pup->NuIntBunch[i]==bunch_id ) + { + if( pup->NuIntType[i]==0 ){ nIDNuInt += 1; nuIntIdx = i; } + else if( pup->NuIntType[i]==1 ){ nBeamBkg += 1; } - for(int i = 0; i < pup->NNuIntTot; i++) { - EdepoODTot[pup->NuIntBunch[i]] += pup->EdepoOD[i]; - if(pup->NuIntBunch[i] == bunch_id) { - if(pup->NuIntType[i] == 0) { - nIDNuInt += 1; - nuIntIdx = i; - } - else if(pup->NuIntType[i] == 1) { - nBeamBkg += 1; - } - } - } + } + } - if(!(EdepoODTot[bunch_id] < 50. && nIDNuInt == 1)) { - return false; - } + if( !(EdepoODTot[bunch_id]<50. && nIDNuInt==1) ){ return false; } - // cout<<" NNuIntTot:" << pup->NNuIntTot - // <<" EdepoODTot["<< bunch_id <<"]: " << EdepoODTot[bunch_id] - // <<" nIDNuInt: " << nIDNuInt - // <<" nBeamBkg: " << nBeamBkg - // <NNuIntTot + // <<" EdepoODTot["<< bunch_id <<"]: " << EdepoODTot[bunch_id] + // <<" nIDNuInt: " << nIDNuInt + // <<" nBeamBkg: " << nBeamBkg + // <GetPileUpSpill(); - const int bunch_id = pup->NuIntBunch[nuIntIdx]; - - const WCSimRootTrigger* aEvt = input->GetTrigger(0); - TClonesArray* tracks = aEvt->GetTracks(); - const int nTracks = tracks->GetEntries(); - if(nTracks != pup->NTracks) { - cout << " Number of tracks are different " << endl; - cout << " - WCSim tree: " << nTracks << endl; - cout << " - PileUpSpill tree: " << pup->NTracks << endl; - } + const float time_up) +{ + const PileUpSpill_t *pup = input->GetPileUpSpill(); + const int bunch_id = pup->NuIntBunch[nuIntIdx]; + + const WCSimRootTrigger *aEvt = input->GetTrigger(0); + TClonesArray *tracks = aEvt->GetTracks(); + const int nTracks = tracks->GetEntries(); + if( nTracks!=pup->NTracks ) + { + cout<<" Number of tracks are different " <NTracks <TrackNuIntIdx[i] == nuIntIdx) { - // Tracks associated with interaction of interest - continue; - } + int nSIEleFromOtherNuInt = 0; + for(int i=0; iTrackNuIntIdx[i]==nuIntIdx ) + { + // Tracks associated with interaction of interest + continue; + } - WCSimRootTrack* aTrack = (WCSimRootTrack*)tracks->At(i); - Int_t ipnu = aTrack->GetIpnu(); - if(TMath::Abs(ipnu) != 11) { - continue; - } + WCSimRootTrack *aTrack = (WCSimRootTrack*)tracks->At(i); + Int_t ipnu = aTrack->GetIpnu(); + if( TMath::Abs( ipnu )!=11 ){ continue; } - Float_t time = aTrack->GetTime(); - if(time > time_low && time < time_up) { - cout << " Found " << ipnu << " at t=" << time << " time_low:" << time_low - << " time_up: " << time_up << " TrackNuIntIdx: " << pup->TrackNuIntIdx[i] - << " nuIntIdx: " << nuIntIdx << endl; - nSIEleFromOtherNuInt += 1; - } - } + Float_t time = aTrack->GetTime(); + if( time>time_low && timeTrackNuIntIdx[i] + <<" nuIntIdx: " << nuIntIdx + <GetValue("TimeOffset", fHitTimeOffset); - Conf->GetValue("FlagMultDigits", mult_flag); - - fMultDigiHits = bool(mult_flag); +WCRootData::WCRootData() +{ + fDetCentreY = 0.; + fWCGeom = 0; + fWCSimC = 0; + fWCSimT = 0; + fSpEvt.clear(); + fOutFileName = ""; + + int mult_flag = 1; + fHitTimeOffset = 0.; + + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue("TimeOffset", fHitTimeOffset); + Conf->GetValue("FlagMultDigits", mult_flag); + + fMultDigiHits = bool(mult_flag); } -WCRootData::~WCRootData() { - if(fWCGeom) { - delete fWCGeom; - fWCGeom = 0; - } - if(fWCSimT) { - delete fWCSimT; - fWCSimT = 0; - } - if(fWCSimC) { - delete fWCSimC; - fWCSimC = 0; - } - fSpEvt.clear(); - fSpEvt.shrink_to_fit(); +WCRootData::~WCRootData() +{ + if( fWCGeom ){ delete fWCGeom; fWCGeom = 0; } + if( fWCSimT ){ delete fWCSimT; fWCSimT = 0; } + if( fWCSimC ){ delete fWCSimC; fWCSimC = 0; } + fSpEvt.clear(); + fSpEvt.shrink_to_fit(); } -void WCRootData::GetGeometryInfo(const char* filename) { - TFile* f = TFile::Open(filename); - TTree* t = (TTree*)f->Get("wcsimGeoT"); - t->SetBranchAddress("wcsimrootgeom", &fWCGeom); - t->GetEntry(0); - fDetCentreY = fWCGeom->GetWCOffset(1); - cout << " DetCentreY: " << fDetCentreY << endl; - f->Close(); + +void WCRootData::GetGeometryInfo(const char *filename) +{ + TFile *f=TFile::Open(filename); + TTree *t=(TTree*)f->Get("wcsimGeoT"); + t->SetBranchAddress("wcsimrootgeom", &fWCGeom); + t->GetEntry( 0 ); + fDetCentreY = fWCGeom->GetWCOffset(1); + cout<<" DetCentreY: " << fDetCentreY <Close(); } -void WCRootData::AddTrueHitsToMDT(MDTManager* mdt) { - HitTubeCollection* hc = mdt->GetHitTubeCollection(); - this->AddTrueHitsToMDT(hc, mdt->GetPMTResponse(), 0., 0); - hc = 0; + +void WCRootData::AddTrueHitsToMDT(MDTManager *mdt) +{ + HitTubeCollection *hc = mdt->GetHitTubeCollection(); + this->AddTrueHitsToMDT(hc, mdt->GetPMTResponse(), 0., 0); + hc = 0; } -void WCRootData::AddTrueHitsToMDT(HitTubeCollection* hc, PMTResponse* pr, float intTime, int iPMT) { + +void WCRootData::AddTrueHitsToMDT(HitTubeCollection *hc, PMTResponse *pr, float intTime, int iPMT) +{ // Set all tubes no matter how many of true hits, anyway // Position and orientation are also set to each tube this->SetTubes(hc, iPMT); - const WCSimRootTrigger* aEvt = fSpEvt[iPMT]->GetTrigger(0); - const int nCkovHits = aEvt->GetNcherenkovhits(); - // std::cout<<" nCkovHits: " << nCkovHits <GetTrigger(0); + const int nCkovHits = aEvt->GetNcherenkovhits(); + //std::cout<<" nCkovHits: " << nCkovHits <GetCherenkovHitTimes(); - for(int iHit = 0; iHit < nCkovHits; iHit++) { - WCSimRootCherenkovHit* aHit = - dynamic_cast((aEvt->GetCherenkovHits())->At(iHit)); - - int timeArrayIndex = aHit->GetTotalPe(0); - int peForTube = aHit->GetTotalPe(1); - int tubeID = aHit->GetTubeID(); - const int maxPE = timeArrayIndex + peForTube; - for(int jPE = timeArrayIndex; jPE < maxPE; jPE++) { - WCSimRootCherenkovHitTime* aHitTime = - dynamic_cast(hitTimeArray->At(jPE)); - - float truetime = aHitTime->GetTruetime(); - if(truetime < 0.) { - continue; - } - if(aHitTime->GetParentID() < 0) { - continue; - } - - TrueHit* th = new TrueHit(truetime, aHitTime->GetParentID()); + TClonesArray *hitTimeArray = aEvt->GetCherenkovHitTimes(); + for(int iHit=0; iHit((aEvt->GetCherenkovHits())->At(iHit)); + + int timeArrayIndex = aHit->GetTotalPe(0); + int peForTube = aHit->GetTotalPe(1); + int tubeID = aHit->GetTubeID(); + const int maxPE = timeArrayIndex + peForTube; + for(int jPE=timeArrayIndex; jPE(hitTimeArray->At(jPE)); + + float truetime = aHitTime->GetTruetime(); + if( truetime<0. ){ continue; } + if( aHitTime->GetParentID()<0 ){ continue; } + + TrueHit *th = new TrueHit(truetime, aHitTime->GetParentID()); #ifdef HYBRIDWCSIM - for(int k = 0; k < 3; k++) { - th->SetPosition(k, aHitTime->GetPhotonEndPos(k)); - } - for(int k = 0; k < 3; k++) { - th->SetDirection(k, aHitTime->GetPhotonEndDir(k)); - } - for(int k = 0; k < 3; k++) { - th->SetStartDirection(k, aHitTime->GetPhotonStartDir(k)); - } + for(int k=0; k<3; k++){ th->SetPosition(k, aHitTime->GetPhotonEndPos(k)); } + for(int k=0; k<3; k++){ th->SetDirection(k, aHitTime->GetPhotonEndDir(k)); } + for(int k=0; k<3; k++){ th->SetStartDirection(k, aHitTime->GetPhotonStartDir(k)); } #endif - th->SetStartTime(aHitTime->GetPhotonStartTime()); - for(int k = 0; k < 3; k++) { - th->SetStartPosition(k, aHitTime->GetPhotonStartPos(k)); - } - if(!pr->ApplyDE(th)) { - continue; - } - - (&(*hc)[tubeID])->AddRawPE(th); - } - } + th->SetStartTime(aHitTime->GetPhotonStartTime()); + for(int k=0; k<3; k++){ th->SetStartPosition(k, aHitTime->GetPhotonStartPos(k)); } + if( !pr->ApplyDE(th) ){ continue; } + + (&(*hc)[tubeID])->AddRawPE(th); + } + } } -void WCRootData::ReadFile(const char* filename, const vector& list) { - fWCSimC = new TChain("wcsimT"); - fWCSimC->Add(filename); +void WCRootData::ReadFile(const char *filename, const vector &list) +{ + fWCSimC = new TChain("wcsimT"); + fWCSimC->Add(filename); - const char* filename0 = NULL; - filename0 = fWCSimC->GetFile()->GetName(); - if(filename0 != NULL) { + const char *filename0 = NULL; + filename0 = fWCSimC->GetFile()->GetName(); + if( filename0!=NULL ) + { this->GetGeometryInfo(filename0); } - if(list.size() == 0) // default - { - fSpEvt.push_back(0); - fWCSimC->SetBranchAddress("wcsimrootevent", &fSpEvt[0]); - } - else { - fSpEvt.clear(); - fSpEvt = vector(list.size(), 0); - for(unsigned int i = 0; i < list.size(); i++) { - fWCSimC->SetBranchAddress(list[i].c_str(), &fSpEvt[i]); - } - } - fWCSimC->SetAutoDelete(); + if( list.size()==0 ) // default + { + fSpEvt.push_back( 0 ); + fWCSimC->SetBranchAddress("wcsimrootevent", &fSpEvt[0]); + } + else + { + fSpEvt.clear(); + fSpEvt = vector(list.size(),0); + for(unsigned int i=0; iSetBranchAddress(list[i].c_str(), &fSpEvt[i]); + } + } + fWCSimC->SetAutoDelete(); } -void WCRootData::CloseFile() { - delete fWCSimC; - fWCSimC = 0; - fSpEvt.clear(); - fSpEvt.shrink_to_fit(); +void WCRootData::CloseFile() +{ + delete fWCSimC; fWCSimC = 0; + fSpEvt.clear(); + fSpEvt.shrink_to_fit(); } -int WCRootData::GetEntries() { - return fWCSimC->GetEntries(); +int WCRootData::GetEntries() +{ + return fWCSimC->GetEntries(); } -void WCRootData::GetEntry(int i) { - fWCSimC->GetEntry(i); +void WCRootData::GetEntry(int i) +{ + fWCSimC->GetEntry(i); } -void WCRootData::CreateTree(const char* filename, const vector& list) { - fOutFileName = TString(filename); - TFile* fout = new TFile(fOutFileName, "recreate"); - fout->SetCompressionLevel(2); - - Int_t branchStyle = 1; - Int_t bufferSize = 64000; - TString bName = "wcsimrootevent"; - TString bAddress = "WCSimRootEvent"; - - fWCSimT = new TTree("wcsimT", "Processed WCSim Tree for pile-up"); - if(list.size() == 0) { - fSpEvt.push_back(new WCSimRootEvent()); - fSpEvt[0]->Initialize(); - TTree::SetBranchStyle(branchStyle); - TBranch* branch = fWCSimT->Branch(bName, bAddress, &fSpEvt[0], bufferSize, 2); - } - else { - fSpEvt.clear(); - fSpEvt = vector(list.size(), 0); - for(unsigned int i = 0; i < list.size(); i++) { - // fSpEvt.push_back( new WCSimRootEvent() ); - fSpEvt[i] = new WCSimRootEvent(); - fSpEvt[i]->Initialize(); - TTree::SetBranchStyle(branchStyle); - TBranch* branch = fWCSimT->Branch(list[i].c_str(), bAddress, &fSpEvt[i], bufferSize, 2); - } - } -} -void WCRootData::AddDigiHits(MDTManager* mdt, int eventID, int iPMT) { - HitTubeCollection* hc = mdt->GetHitTubeCollection(); - TriggerInfo* ti = mdt->GetTriggerInfo(); - this->AddDigiHits(hc, ti, eventID, iPMT); +void WCRootData::CreateTree(const char *filename, const vector &list) +{ + fOutFileName = TString(filename); + TFile *fout = new TFile(fOutFileName, "recreate"); + fout->SetCompressionLevel(2); + + Int_t branchStyle = 1; + Int_t bufferSize = 64000; + TString bName = "wcsimrootevent"; + TString bAddress = "WCSimRootEvent"; + + fWCSimT = new TTree("wcsimT", "Processed WCSim Tree for pile-up"); + if( list.size()==0 ) + { + fSpEvt.push_back( new WCSimRootEvent() ); + fSpEvt[0]->Initialize(); + TTree::SetBranchStyle(branchStyle); + TBranch *branch = fWCSimT->Branch(bName, bAddress, &fSpEvt[0], bufferSize, 2); + } + else + { + fSpEvt.clear(); + fSpEvt = vector(list.size(), 0); + for(unsigned int i=0; iInitialize(); + TTree::SetBranchStyle(branchStyle); + TBranch *branch = fWCSimT->Branch(list[i].c_str(), bAddress, &fSpEvt[i], bufferSize, 2); + } + } } -void WCRootData::AddDigiHits(HitTubeCollection* hc, TriggerInfo* ti, int eventID, int iPMT) { - WCSimRootTrigger* anEvent = fSpEvt[iPMT]->GetTrigger(0); - const int nTriggers = ti->GetNumOfTrigger(); - for(int iTrig = 0; iTrig < nTriggers; iTrig++) { - TriggerType_t trigType = kTriggerNDigits; - if(ti->GetType(iTrig) == (int)TriggerType::eFailure) { - trigType = kTriggerFailure; - } +void WCRootData::AddDigiHits(MDTManager *mdt, int eventID, int iPMT) +{ + HitTubeCollection *hc = mdt->GetHitTubeCollection(); + TriggerInfo *ti = mdt->GetTriggerInfo(); + this->AddDigiHits(hc, ti, eventID, iPMT); +} - if(iTrig >= 1) { - fSpEvt[iPMT]->AddSubEvent(); - anEvent = fSpEvt[iPMT]->GetTrigger(iTrig); - anEvent->SetHeader(eventID, 0, 0, iTrig + 1); - anEvent->SetMode(0); - } +void WCRootData::AddDigiHits(HitTubeCollection *hc, TriggerInfo *ti, int eventID, int iPMT) +{ + WCSimRootTrigger* anEvent = fSpEvt[iPMT]->GetTrigger(0); + const int nTriggers = ti->GetNumOfTrigger(); + for(int iTrig=0; iTrigGetType(iTrig)==(int)TriggerType::eFailure ) + { + trigType = kTriggerFailure; + } + + if( iTrig>=1 ) + { + fSpEvt[iPMT]->AddSubEvent(); + anEvent = fSpEvt[iPMT]->GetTrigger(iTrig); + anEvent->SetHeader(eventID, 0, 0, iTrig+1); + anEvent->SetMode(0); + } #ifdef HYBRIDWCSIM - vector info(1, ti->GetNHits(iTrig)); + vector info(1, ti->GetNHits(iTrig)); #else - vector info(1, ti->GetNHits(iTrig)); + vector info(1, ti->GetNHits(iTrig)); #endif - anEvent->SetTriggerInfo(trigType, info); - - const float triggerTime = ti->GetTriggerTime(iTrig); - const float tWinLowEdge = ti->GetLowEdge(iTrig); - const float tWinUpEdge = ti->GetUpEdge(iTrig); - - int nHits = 0; - float sumQ = 0.; - map tubeCount; - for(hc->Begin(); !hc->IsEnd(); hc->Next()) { - HitTube* aPH = &(*hc)(); - int tubeID = aPH->GetTubeID(); - int nCount = 0; - for(int i = 0; i < aPH->GetNDigiHits(); i++) { - float t = aPH->GetTimeDigi(i); - - // Need to be updated - int mPMT_module_id = 0; - int mPMT_pmt_id = 0; - if(t >= tWinLowEdge && t <= tWinUpEdge) { - bool doFill = false; - - // The first hit is always allowed to be saved. - // Later hits depend on your setting - if(tubeCount.count(tubeID) == 0) { - doFill = true; - } - else { - doFill = fMultDigiHits ? true : false; - } - - if(doFill) { - vector true_pe_comp = aPH->GetParentCompositionDigi(i); - t = t + fHitTimeOffset - triggerTime; - float q = aPH->GetChargeDigi(i); - anEvent->AddCherenkovDigiHit(q, t, tubeID, mPMT_module_id, mPMT_pmt_id, true_pe_comp); - nHits += 1; - sumQ += q; - nCount += 1; - tubeCount[tubeID] = 1; - } - } - } // digi hit loop - aPH = NULL; - } // PMT loop - anEvent->SetNumDigitizedTubes(nHits); - anEvent->SetSumQ(sumQ); - WCSimRootEventHeader* eh = anEvent->GetHeader(); - eh->SetDate(int(triggerTime)); - } + anEvent->SetTriggerInfo(trigType, info); + + const float triggerTime = ti->GetTriggerTime(iTrig); + const float tWinLowEdge = ti->GetLowEdge(iTrig); + const float tWinUpEdge = ti->GetUpEdge(iTrig); + + int nHits = 0; + float sumQ = 0.; + map tubeCount; + for(hc->Begin(); !hc->IsEnd(); hc->Next()) + { + HitTube *aPH = &(*hc)(); + int tubeID = aPH->GetTubeID(); + int nCount = 0; + for(int i=0; iGetNDigiHits(); i++) + { + float t = aPH->GetTimeDigi(i); + + // Need to be updated + int mPMT_module_id = 0; + int mPMT_pmt_id = 0; + if( t>=tWinLowEdge && t<=tWinUpEdge ) + { + bool doFill = false; + + // The first hit is always allowed to be saved. + // Later hits depend on your setting + if( tubeCount.count(tubeID)==0 ){ doFill = true; } + else { doFill = fMultDigiHits ? true : false; } + + if( doFill ) + { + vector true_pe_comp = aPH->GetParentCompositionDigi(i); + t = t + fHitTimeOffset - triggerTime; + float q = aPH->GetChargeDigi(i); + anEvent->AddCherenkovDigiHit(q, + t, + tubeID, + mPMT_module_id, + mPMT_pmt_id, + true_pe_comp); + nHits += 1; + sumQ += q; + nCount+=1; + tubeCount[tubeID] = 1; + } + } + } // digi hit loop + aPH = NULL; + } // PMT loop + anEvent->SetNumDigitizedTubes(nHits); + anEvent->SetSumQ(sumQ); + WCSimRootEventHeader *eh = anEvent->GetHeader(); + eh->SetDate( int(triggerTime) ); + } } -void WCRootData::FillTree() { - int tmp = (int)fSpEvt.size(); - TFile* f = fWCSimT->GetCurrentFile(); - f->cd(); - fWCSimT->Fill(); - fWCSimT->Write("", TObject::kOverwrite); - for(unsigned int i = 0; i < fSpEvt.size(); i++) { - fSpEvt[i]->ReInitialize(); - } +void WCRootData::FillTree() +{ + int tmp = (int)fSpEvt.size(); + TFile *f = fWCSimT->GetCurrentFile(); + f->cd(); + fWCSimT->Fill(); + fWCSimT->Write("",TObject::kOverwrite); + for(unsigned int i=0; iReInitialize(); + } } -void WCRootData::AddTracks(const WCSimRootTrigger* aEvtIn, float offset_time, int iPMT) { - WCSimRootTrigger* aEvtOut = fSpEvt[iPMT]->GetTrigger(0); - TClonesArray* tracks = aEvtIn->GetTracks(); - const int ntrack = tracks->GetEntries(); - for(int i = 0; i < ntrack; i++) { - WCSimRootTrack* aTrack = (WCSimRootTrack*)tracks->At(i); - Int_t ipnu = aTrack->GetIpnu(); - Int_t flag = aTrack->GetFlag(); - Int_t startvol = aTrack->GetStartvol(); - Int_t stopvol = aTrack->GetStopvol(); - Int_t parenttype = aTrack->GetParenttype(); - Int_t id = aTrack->GetId(); + +void WCRootData::AddTracks(const WCSimRootTrigger *aEvtIn, float offset_time, int iPMT) +{ + WCSimRootTrigger *aEvtOut = fSpEvt[iPMT]->GetTrigger(0); + TClonesArray *tracks = aEvtIn->GetTracks(); + const int ntrack = tracks->GetEntries(); + for(int i=0; iAt(i); + Int_t ipnu = aTrack->GetIpnu(); + Int_t flag = aTrack->GetFlag(); + Int_t startvol = aTrack->GetStartvol(); + Int_t stopvol = aTrack->GetStopvol(); + Int_t parenttype = aTrack->GetParenttype(); + Int_t id = aTrack->GetId(); #ifdef HYBRIDWCSIM - Int_t idPrnt = aTrack->GetParentId(); + Int_t idPrnt = aTrack->GetParentId(); #endif + #ifdef HYBRIDWCSIM - Double_t dir[3]; - Double_t pdir[3]; - Double_t stop[3]; - Double_t start[3]; - Double_t m = aTrack->GetM(); - Double_t p = aTrack->GetP(); - Double_t E = aTrack->GetE(); - Double_t time = aTrack->GetTime() + offset_time; -#else - Float_t dir[3]; - Float_t pdir[3]; - Float_t stop[3]; - Float_t start[3]; - Float_t m = aTrack->GetM(); - Float_t p = aTrack->GetP(); - Float_t E = aTrack->GetE(); - Float_t time = aTrack->GetTime() + offset_time; + Double_t dir[3]; + Double_t pdir[3]; + Double_t stop[3]; + Double_t start[3]; + Double_t m = aTrack->GetM(); + Double_t p = aTrack->GetP(); + Double_t E = aTrack->GetE(); + Double_t time = aTrack->GetTime() + offset_time; +#else + Float_t dir[3]; + Float_t pdir[3]; + Float_t stop[3]; + Float_t start[3]; + Float_t m = aTrack->GetM(); + Float_t p = aTrack->GetP(); + Float_t E = aTrack->GetE(); + Float_t time = aTrack->GetTime() + offset_time; #endif - for(int j = 0; j < 3; j++) { - dir[j] = aTrack->GetDir(j); - pdir[j] = aTrack->GetPdir(j); - stop[j] = aTrack->GetStop(j); - start[j] = aTrack->GetStart(j); - } + for(int j=0; j<3; j++) + { + dir[j] = aTrack->GetDir(j); + pdir[j] = aTrack->GetPdir(j); + stop[j] = aTrack->GetStop(j); + start[j] = aTrack->GetStart(j); + } #ifdef HYBRIDWCSIM - aEvtOut->AddTrack(ipnu, - flag, - m, - p, - E, - startvol, - stopvol, - dir, - pdir, - stop, - start, - parenttype, - time, - id, - idPrnt); + aEvtOut->AddTrack(ipnu, + flag, + m, + p, + E, + startvol, + stopvol, + dir, + pdir, + stop, + start, + parenttype, + time, + id, + idPrnt); #else - aEvtOut - ->AddTrack(ipnu, flag, m, p, E, startvol, stopvol, dir, pdir, stop, start, parenttype, time, id); + aEvtOut->AddTrack(ipnu, + flag, + m, + p, + E, + startvol, + stopvol, + dir, + pdir, + stop, + start, + parenttype, + time, + id); #endif - WCSimRootTrack* AddTrack(Int_t ipnu, - Int_t flag, - Float_t m, - Float_t p, - Float_t E, - Int_t startvol, - Int_t stopvol, - Float_t dir[3], - Float_t pdir[3], - Float_t stop[3], - Float_t start[3], - Int_t parenttype, - Float_t time, - Int_t id); - } + WCSimRootTrack *AddTrack(Int_t ipnu, + Int_t flag, + Float_t m, + Float_t p, + Float_t E, + Int_t startvol, + Int_t stopvol, + Float_t dir[3], + Float_t pdir[3], + Float_t stop[3], + Float_t start[3], + Int_t parenttype, + Float_t time, + Int_t id); + + + } } -void WCRootData::WriteTree() { - TFile* f = fWCSimT->GetCurrentFile(); - f->cd(); - fWCSimT->Write(); - f->Close(); +void WCRootData::WriteTree() +{ + TFile *f = fWCSimT->GetCurrentFile(); + f->cd(); + fWCSimT->Write(); + f->Close(); } -void WCRootData::CopyTree(const char* filename, const char* treename, const vector& savelist) { - TFile* fin = TFile::Open(filename); - if(!fin->FindKey(treename)) { +void WCRootData::CopyTree(const char *filename, + const char *treename, + const vector &savelist) +{ + + TFile *fin = TFile::Open(filename); + if( !fin->FindKey(treename) ) + { fin->Close(); - std::cout << " [ERROR] WCRootData::CopyTree " << std::endl; - std::cout << " - No " << treename << " tree is saved in : " << filename << std::endl; - exit(-1); + std::cout<<" [ERROR] WCRootData::CopyTree " <Get(treename); - - TFile* fout = TFile::Open(fOutFileName, "update"); - fout->cd(); - TTree* tout = tin->CloneTree(-1, "fast"); - tout->Write(); - fout->Close(); - } - else // This is a special treatment - { - TTree* tin = (TTree*)fin->Get(treename); - - TBranch* bWCXRotation = tin->GetBranch("WCXRotation"); - TBranch* bWCYRotation = tin->GetBranch("WCYRotation"); - TBranch* bWCZRotation = tin->GetBranch("WCZRotation"); - TBranch* bWCDetCentre = tin->GetBranch("WCDetCentre"); - TBranch* bWCDetRadius = tin->GetBranch("WCDetRadius"); - TBranch* bWCDetHeight = tin->GetBranch("WCDetHeight"); - - Float_t WCXRotation[3] = { 0. }; - Float_t WCYRotation[3] = { 0. }; - Float_t WCZRotation[3] = { 0. }; - Float_t WCDetCentre[3] = { 0. }; - Float_t WCDetRadius = 0.; - Float_t WCDetHeight = 0.; - - bWCXRotation->SetAddress(WCXRotation); - bWCYRotation->SetAddress(WCYRotation); - bWCZRotation->SetAddress(WCZRotation); - bWCDetCentre->SetAddress(WCDetCentre); - bWCDetRadius->SetAddress(&WCDetRadius); - bWCDetHeight->SetAddress(&WCDetHeight); - - bWCXRotation->GetEntry(0); - bWCYRotation->GetEntry(0); - bWCZRotation->GetEntry(0); - bWCDetCentre->GetEntry(0); - bWCDetRadius->GetEntry(0); - bWCDetHeight->GetEntry(0); - - TFile* fout = TFile::Open(fOutFileName, "update"); - fout->cd(); - TTree* tout = new TTree("Settings", ""); - tout->Branch("WCXRotation", WCXRotation, "WCXRotation[3]/F"); - tout->Branch("WCYRotation", WCYRotation, "WCYRotation[3]/F"); - tout->Branch("WCZRotation", WCZRotation, "WCZRotation[3]/F"); - tout->Branch("WCDetCentre", WCDetCentre, "WCDetCentre[3]/F"); - tout->Branch("WCDetRadius", &WCDetRadius, "WCDetRadius/F"); - tout->Branch("WCDetHeight", &WCDetHeight, "WCDetHeight/F"); - tout->Fill(); - tout->Write(); - fout->Close(); - } - } - else { - TTree* tin = (TTree*)fin->Get(treename); - - TFile* fout = TFile::Open(fOutFileName, "update"); - fout->cd(); - TTree* tout = tin->CloneTree(0); - - const int nEntries = tin->GetEntries(); - for(int iEntry = 0; iEntry < nEntries; iEntry++) { - tin->GetEntry(iEntry); - if(!savelist[iEntry]) { - continue; - } - fout->cd(); - tout->Fill(); - } - fout->cd(); - tout->Write(); - fout->Close(); - } - fin->Close(); + // Copy all the entries + if( savelist.size()==0 ) + { + if( treename!="Settings" ) + { + TTree *tin = (TTree*)fin->Get(treename); + + TFile *fout = TFile::Open(fOutFileName, "update"); + fout->cd(); + TTree *tout = tin->CloneTree(-1, "fast"); + tout->Write(); + fout->Close(); + } + else // This is a special treatment + { + TTree *tin = (TTree*)fin->Get(treename); + + TBranch *bWCXRotation = tin->GetBranch("WCXRotation"); + TBranch *bWCYRotation = tin->GetBranch("WCYRotation"); + TBranch *bWCZRotation = tin->GetBranch("WCZRotation"); + TBranch *bWCDetCentre = tin->GetBranch("WCDetCentre"); + TBranch *bWCDetRadius = tin->GetBranch("WCDetRadius"); + TBranch *bWCDetHeight = tin->GetBranch("WCDetHeight"); + + Float_t WCXRotation[3] = {0.}; + Float_t WCYRotation[3] = {0.}; + Float_t WCZRotation[3] = {0.}; + Float_t WCDetCentre[3] = {0.}; + Float_t WCDetRadius = 0.; + Float_t WCDetHeight = 0.; + + bWCXRotation->SetAddress(WCXRotation); + bWCYRotation->SetAddress(WCYRotation); + bWCZRotation->SetAddress(WCZRotation); + bWCDetCentre->SetAddress(WCDetCentre); + bWCDetRadius->SetAddress(&WCDetRadius); + bWCDetHeight->SetAddress(&WCDetHeight); + + bWCXRotation->GetEntry(0); + bWCYRotation->GetEntry(0); + bWCZRotation->GetEntry(0); + bWCDetCentre->GetEntry(0); + bWCDetRadius->GetEntry(0); + bWCDetHeight->GetEntry(0); + + TFile *fout = TFile::Open(fOutFileName, "update"); + fout->cd(); + TTree *tout = new TTree("Settings", ""); + tout->Branch("WCXRotation", WCXRotation, "WCXRotation[3]/F"); + tout->Branch("WCYRotation", WCYRotation, "WCYRotation[3]/F"); + tout->Branch("WCZRotation", WCZRotation, "WCZRotation[3]/F"); + tout->Branch("WCDetCentre", WCDetCentre, "WCDetCentre[3]/F"); + tout->Branch("WCDetRadius", &WCDetRadius, "WCDetRadius/F"); + tout->Branch("WCDetHeight", &WCDetHeight, "WCDetHeight/F"); + tout->Fill(); + tout->Write(); + fout->Close(); + } + } + else + { + TTree *tin = (TTree*)fin->Get(treename); + + TFile *fout = TFile::Open(fOutFileName, "update"); + fout->cd(); + TTree *tout = tin->CloneTree(0); + + const int nEntries = tin->GetEntries(); + for(int iEntry=0; iEntryGetEntry(iEntry); + if( !savelist[iEntry] ){ continue; } + fout->cd(); + tout->Fill(); + } + fout->cd(); + tout->Write(); + fout->Close(); + } + fin->Close(); } -void WCRootData::SetTubes(HitTubeCollection* hc, const int iPMT) { +void WCRootData::SetTubes(HitTubeCollection *hc, const int iPMT) +{ #ifdef HYBRIDWCSIM const int nTubes = fWCGeom->GetWCNumPMT(bool(iPMT)); - for(int i = 0; i < nTubes; i++) { - const WCSimRootPMT* tube = fWCGeom->GetPMTPtr(i, bool(iPMT)); + for(int i=0; iGetPMTPtr(i, bool(iPMT)); const int tubeID = tube->GetTubeNo(); hc->AddHitTube(tubeID); - for(int j = 0; j < 3; j++) { + for(int j=0; j<3; j++) + { (&(*hc)[tubeID])->SetPosition(j, tube->GetPosition(j)); (&(*hc)[tubeID])->SetOrientation(j, tube->GetOrientation(j)); } } #else const int nTubes = fWCGeom->GetWCNumPMT(); - for(int i = 0; i < nTubes; i++) { - WCSimRootPMT tube = fWCGeom->GetPMT(i); + for(int i=0; iGetPMT(i); const int tubeID = tube.GetTubeNo(); hc->AddHitTube(tubeID); - for(int j = 0; j < 3; j++) { + for(int j=0; j<3; j++) + { (&(*hc)[tubeID])->SetPosition(j, tube.GetPosition(j)); (&(*hc)[tubeID])->SetOrientation(j, tube.GetOrientation(j)); } diff --git a/app/utilities/WCRootData/src/WCRootDataBeamBkg.cc b/app/utilities/WCRootData/src/WCRootDataBeamBkg.cc index b97b455..1548408 100644 --- a/app/utilities/WCRootData/src/WCRootDataBeamBkg.cc +++ b/app/utilities/WCRootData/src/WCRootDataBeamBkg.cc @@ -1,44 +1,50 @@ #include "WCRootDataBeamBkg.h" -WCRootDataBeamBkg::WCRootDataBeamBkg() { - fHasFriend = true; - fNuIntType = eBeamBkg; +WCRootDataBeamBkg::WCRootDataBeamBkg() +{ + fHasFriend = true; + fNuIntType = eBeamBkg; }; -WCRootDataBeamBkg::~WCRootDataBeamBkg() {} +WCRootDataBeamBkg::~WCRootDataBeamBkg() +{ +} -void WCRootDataBeamBkg::LoadFiles(const char* filename) { - // Read input file list of WCSim first - this->WCRootDataNuInt::LoadFiles(filename); +void WCRootDataBeamBkg::LoadFiles(const char *filename) +{ + // Read input file list of WCSim first + this->WCRootDataNuInt::LoadFiles(filename); - ifstream fin(filename); - string aLine; - string sname; - string svalue; - int num = -1; - while(std::getline(fin, aLine)) { - stringstream ss(aLine); - string stmp; - ss >> stmp; - ss >> stmp; - num = this->GetFileIdNumber(stmp.c_str(), "redgene."); - fFriendList.push_back(pair(stmp, num)); - } - fin.close(); - this->ReadFriend(fFriendList[fItrFile].first); + ifstream fin(filename); + string aLine; + string sname; + string svalue; + int num = -1; + while( std::getline(fin, aLine) ) + { + stringstream ss(aLine); + string stmp; + ss>>stmp; + ss>>stmp; + num = this->GetFileIdNumber(stmp.c_str(), "redgene."); + fFriendList.push_back(pair(stmp, num)); + } + fin.close(); + this->ReadFriend(fFriendList[fItrFile].first); } -void WCRootDataBeamBkg::ReadFriend(const char* filename) { - fFriendC = new TChain("geneT"); - // fFriendC->SetBranchStatus("*", 0); - // fFriendC->SetBranchStatus("EdepoOD", 1); - // fFriendC->SetBranchStatus("grNPart", 1); - fFriendC->SetBranchAddress("EdepoOD", &fEdepoOD); - fFriendC->SetBranchAddress("grNPart", &fgrNPart); - fFriendC->Add(filename); +void WCRootDataBeamBkg::ReadFriend(const char *filename) +{ + fFriendC = new TChain("geneT"); + //fFriendC->SetBranchStatus("*", 0); + //fFriendC->SetBranchStatus("EdepoOD", 1); + //fFriendC->SetBranchStatus("grNPart", 1); + fFriendC->SetBranchAddress("EdepoOD", &fEdepoOD); + fFriendC->SetBranchAddress("grNPart", &fgrNPart); + fFriendC->Add(filename); } -void WCRootDataBeamBkg::CloseFriend() { - delete fFriendC; - fFriendC = 0; +void WCRootDataBeamBkg::CloseFriend() +{ + delete fFriendC; fFriendC = 0; } diff --git a/app/utilities/WCRootData/src/WCRootDataIDNuInt.cc b/app/utilities/WCRootData/src/WCRootDataIDNuInt.cc index 86e9484..c75cb6c 100644 --- a/app/utilities/WCRootData/src/WCRootDataIDNuInt.cc +++ b/app/utilities/WCRootData/src/WCRootDataIDNuInt.cc @@ -1,51 +1,60 @@ #include "WCRootDataIDNuInt.h" -WCRootDataIDNuInt::WCRootDataIDNuInt() { - fHasFriend = true; - fNuIntType = eIDNuInt; +WCRootDataIDNuInt::WCRootDataIDNuInt() +{ + fHasFriend = true; + fNuIntType = eIDNuInt; }; -WCRootDataIDNuInt::~WCRootDataIDNuInt() {} - -void WCRootDataIDNuInt::LoadFiles(const char* filename) { - // Read input file list of WCSim first - this->WCRootDataNuInt::LoadFiles(filename); - - ifstream fin(filename); - string aLine; - string sname; - string svalue; - int num = -1; - while(std::getline(fin, aLine)) { - stringstream ss(aLine); - string stmp; - ss >> stmp; - ss >> stmp; - num = this->GetFileIdNumber(stmp.c_str(), "rednrtvtx."); - fFriendList.push_back(pair(stmp, num)); - } - fin.close(); - this->ReadFriend(fFriendList[fItrFile].first); +WCRootDataIDNuInt::~WCRootDataIDNuInt() +{ } -void WCRootDataIDNuInt::ReadFriend(const char* filename) { - cout << " RedNRTVtxT reading: " << filename << endl; - fFriendC = new TChain("RedNRTVtxT"); - fFriendC->Add(filename); - fNRTVtx.SetBranch(fFriendC); +void WCRootDataIDNuInt::LoadFiles(const char *filename) +{ + // Read input file list of WCSim first + this->WCRootDataNuInt::LoadFiles(filename); + + ifstream fin(filename); + string aLine; + string sname; + string svalue; + int num = -1; + while( std::getline(fin, aLine) ) + { + stringstream ss(aLine); + string stmp; + ss>>stmp; + ss>>stmp; + num = this->GetFileIdNumber(stmp.c_str(), "rednrtvtx."); + fFriendList.push_back(pair(stmp, num)); + } + fin.close(); + this->ReadFriend(fFriendList[fItrFile].first); +} + +void WCRootDataIDNuInt::ReadFriend(const char *filename) +{ + cout<<" RedNRTVtxT reading: " << filename <Add(filename); + fNRTVtx.SetBranch(fFriendC); } -void WCRootDataIDNuInt::CloseFriend() { - delete fFriendC; - fFriendC = 0; +void WCRootDataIDNuInt::CloseFriend() +{ + delete fFriendC; fFriendC = 0; } -void WCRootDataIDNuInt::SetInteractionInformation(PileUpSpill_t* p) const { - p->Mode[p->NNuIntTot] = fNRTVtx.Mode[0]; - p->NuPDG[p->NNuIntTot] = fNRTVtx.NuPDG[0]; - p->NuEne[p->NNuIntTot] = fNRTVtx.NuEne[0]; - for(int i = 0; i < 3; i++) { - p->NuPos[p->NNuIntTot][i] = fNRTVtx.NuPos[0][i]; - p->NuDir[p->NNuIntTot][i] = fNRTVtx.NuDir[0][i]; - } + +void WCRootDataIDNuInt::SetInteractionInformation(PileUpSpill_t *p) const +{ + p->Mode[p->NNuIntTot] = fNRTVtx.Mode[0]; + p->NuPDG[p->NNuIntTot] = fNRTVtx.NuPDG[0]; + p->NuEne[p->NNuIntTot] = fNRTVtx.NuEne[0]; + for(int i=0; i<3; i++) + { + p->NuPos[p->NNuIntTot][i] = fNRTVtx.NuPos[0][i]; + p->NuDir[p->NNuIntTot][i] = fNRTVtx.NuDir[0][i]; + } } diff --git a/app/utilities/WCRootData/src/WCRootDataNuInt.cc b/app/utilities/WCRootData/src/WCRootDataNuInt.cc index 8c7c0dc..68b2bd6 100644 --- a/app/utilities/WCRootData/src/WCRootDataNuInt.cc +++ b/app/utilities/WCRootData/src/WCRootDataNuInt.cc @@ -1,129 +1,134 @@ #include "WCRootDataNuInt.h" -// WCRootDataNuInt::WCRootDataNuInt(int seed) -WCRootDataNuInt::WCRootDataNuInt() { - fRnd = new TRandom3(7698); - // fRnd = new TRandom3(seed); - fFriendC = 0; - fFileList.clear(); - fFriendList.clear(); +//WCRootDataNuInt::WCRootDataNuInt(int seed) +WCRootDataNuInt::WCRootDataNuInt() +{ + fRnd = new TRandom3(7698); +// fRnd = new TRandom3(seed); + fFriendC = 0; + fFileList.clear(); + fFriendList.clear(); - fHasFriend = false; - fNuIntType = eSingle; + fHasFriend = false; + fNuIntType = eSingle; - fItrEntry = 0; - fItrFile = 0; - fNumEntries = 0; - fNumFiles = 0; - fFileIdNum = -9999; - fIntRate = 0.; - fNDigitsFileIdNum = 5; + fItrEntry = 0; + fItrFile = 0; + fNumEntries = 0; + fNumFiles = 0; + fFileIdNum = -9999; + fIntRate = 0.; + fNDigitsFileIdNum = 5; } -WCRootDataNuInt::~WCRootDataNuInt() { - delete fRnd; - fRnd = 0; - if(fFriendC) { - delete fFriendC; - fFriendC = 0; - } - fFileList.clear(); - fFriendList.clear(); - std::vector>().swap(fFileList); - std::vector>().swap(fFriendList); +WCRootDataNuInt::~WCRootDataNuInt() +{ + delete fRnd; fRnd = 0; + if( fFriendC ){ delete fFriendC; fFriendC = 0; } + fFileList.clear(); + fFriendList.clear(); + std::vector>().swap(fFileList); + std::vector>().swap(fFriendList); } -void WCRootDataNuInt::LoadFiles(const char* filename) { - ifstream fin(filename); - string aLine; - string sname; - string svalue; - int num = -1; - while(std::getline(fin, aLine)) { - stringstream ss(aLine); - string stmp; - ss >> stmp; - num = this->GetFileIdNumber(stmp.c_str()); - fFileList.push_back(pair(stmp, num)); - std::cout << " Adding " << stmp << " " << num << std::endl; - // while( ss>>stmp ) - //{ - // std::cout<<" stmp " << stmp <>stmp; + num = this->GetFileIdNumber(stmp.c_str()); + fFileList.push_back(pair(stmp, num)); + std::cout<<" Adding " << stmp <<" " << num <>stmp ) + //{ + // std::cout<<" stmp " << stmp <Integer(fNumFiles); - this->ReadFile(fFileList[fItrFile].first); - fFileIdNum = fFileList[fItrFile].second; - fNumEntries = this->GetEntries(); - fItrEntry = fRnd->Integer(fNumEntries); + fNumFiles = fFileList.size(); + std::cout<<" Found " << fNumFiles <<" files " <Integer(fNumFiles); + this->ReadFile(fFileList[fItrFile].first); + fFileIdNum = fFileList[fItrFile].second; + fNumEntries = this->GetEntries(); + fItrEntry = fRnd->Integer(fNumEntries); - std::cout << " Starting from: " << fFileList[fItrFile].first << " " << fFileList[fItrFile].second << " " - << fItrEntry << "/" << fNumEntries << std::endl; + std::cout<<" Starting from: " << fFileList[fItrFile].first + <<" " << fFileList[fItrFile].second + <<" " << fItrEntry + <<"/" << fNumEntries + <= fNumEntries) { - this->CloseFile(); - if(fHasFriend) { - this->CloseFriend(); - }; - fItrFile += 1; - if(fItrFile == fNumFiles) { - fItrFile = fRnd->Integer(fNumFiles); - std::cout << " Rewiding file from " << fFileList[fItrFile].first << std::endl; - } - this->ReadFile(fFileList[fItrFile].first); - if(fHasFriend) { - this->ReadFriend(fFriendList[fItrFile].first); - }; - fFileIdNum = fFileList[fItrFile].second; - fNumEntries = this->GetEntries(); - fItrEntry = fRnd->Integer(fNumEntries); +bool WCRootDataNuInt::Next() +{ + if( fItrEntry>=fNumEntries ) + { + this->CloseFile(); + if( fHasFriend ){ this->CloseFriend(); }; + fItrFile += 1; + if( fItrFile==fNumFiles ) + { + fItrFile = fRnd->Integer(fNumFiles); + std::cout<<" Rewiding file from " << fFileList[fItrFile].first <ReadFile(fFileList[fItrFile].first); + if( fHasFriend ){ this->ReadFriend(fFriendList[fItrFile].first); }; - std::cout << " Reading " << fFileList[fItrFile].first << " " << fFileList[fItrFile].second << " " - << fItrEntry << "/" << fNumEntries << std::endl; - } - this->GetEntry(fItrEntry); - if(fHasFriend) { - fFriendC->GetEntry(fItrEntry); - } - fItrEntry++; + fFileIdNum = fFileList[fItrFile].second; + fNumEntries = this->GetEntries(); + fItrEntry = fRnd->Integer(fNumEntries); + + std::cout<<" Reading " << fFileList[fItrFile].first + <<" " << fFileList[fItrFile].second + <<" " << fItrEntry + <<"/" << fNumEntries + <GetEntry(fItrEntry); + if( fHasFriend ){ fFriendC->GetEntry(fItrEntry); } + fItrEntry++; - return true; + return true; } -int WCRootDataNuInt::GetFileIdNumber(const char* filename, const char* prefix) { +int WCRootDataNuInt::GetFileIdNumber(const char *filename, const char *prefix) +{ const int size_of_num = fNDigitsFileIdNum; TString InFileName(filename); int total_size = InFileName.Sizeof() - 1; TString sPrefix(prefix); TString sROOT(".root"); - int index_Prefix = InFileName.Index(sPrefix); - int len_Prefix = sPrefix.Sizeof() - 1; - int len_ROOT = sROOT.Sizeof() - 1; + int index_Prefix = InFileName.Index( sPrefix ); + int len_Prefix = sPrefix.Sizeof() - 1; + int len_ROOT = sROOT.Sizeof() - 1; int reco_total_size = index_Prefix + len_Prefix + size_of_num + len_ROOT; // Check if the file name is acceptable - if(reco_total_size != total_size) { - std::cout << " [ERROR] WCRootDataNuInt::GetFileIdNumber " << std::endl; - std::cout << " - Input file name is not formatted in: -----" << sPrefix << "XXXXX.root " - << std::endl; - std::cout << " , where XXXX assumed to be 00000 - 99999 " << std::endl; - std::cout << " Cannot obtain file number for: " << InFileName << std::endl; - std::cout << " -> EXIT " << std::endl; + if( reco_total_size!=total_size ) + { + std::cout<<" [ERROR] WCRootDataNuInt::GetFileIdNumber " < EXIT "<< std::endl; exit(-1); } int index_start = index_Prefix + sPrefix.Sizeof(); - TString sNum = InFileName(index_start, size_of_num); - return atoi(sNum); + TString sNum = InFileName(index_start, size_of_num); + return atoi( sNum ); } diff --git a/app/utilities/WCRootData/src/WCRootDataPileUpSpill.cc b/app/utilities/WCRootData/src/WCRootDataPileUpSpill.cc index 5c2b4a7..75cbe60 100644 --- a/app/utilities/WCRootData/src/WCRootDataPileUpSpill.cc +++ b/app/utilities/WCRootData/src/WCRootDataPileUpSpill.cc @@ -1,198 +1,212 @@ #include "WCRootDataPileUpSpill.h" #include "WCRootDataNuInt.h" -WCRootDataPileUpSpill::WCRootDataPileUpSpill() { - fOutFileNum = 0; - fOutFilePrefix = ""; - fNumOfSpillsPerFile = 1000; - fCurSpill = 0; - fPupSpillC = 0; +WCRootDataPileUpSpill::WCRootDataPileUpSpill() +{ + fOutFileNum = 0; + fOutFilePrefix = ""; + fNumOfSpillsPerFile = 1000; + fCurSpill = 0; + fPupSpillC = 0; - fPupSpillTreeName = "pupspillT"; + fPupSpillTreeName = "pupspillT"; - fFileNameToBeCopied = ""; + fFileNameToBeCopied = ""; } -WCRootDataPileUpSpill::~WCRootDataPileUpSpill() { - if(fPupSpillC) { - delete fPupSpillC; - fPupSpillC = 0; - } +WCRootDataPileUpSpill::~WCRootDataPileUpSpill() +{ + if( fPupSpillC ){ delete fPupSpillC; fPupSpillC = 0; } } -void WCRootDataPileUpSpill::ReadFile(const char* filename) { - fPupSpillC = new TChain(fPupSpillTreeName); - fPupSpillC->Add(filename); - fPupSpill.Clear(); - fPupSpill.SetBranch(fPupSpillC); - this->WCRootData::ReadFile(filename); +void WCRootDataPileUpSpill::ReadFile(const char *filename) +{ + fPupSpillC = new TChain(fPupSpillTreeName); + fPupSpillC->Add(filename); + fPupSpill.Clear(); + fPupSpill.SetBranch(fPupSpillC); + this->WCRootData::ReadFile(filename); } -void WCRootDataPileUpSpill::CloseFile() { - delete fPupSpillC; - fPupSpillC = 0; - this->WCRootData::CloseFile(); -} -int WCRootDataPileUpSpill::GetEntries() { - if(this->WCRootData::GetEntries() != fPupSpillC->GetEntries()) { - cout << " Number of enetries are different" << endl; - cout << " - wcsimT: " << this->WCRootData::GetEntries() << endl; - cout << " - " << fPupSpillTreeName << ": " << fPupSpillC->GetEntries() << endl; - } - return this->WCRootData::GetEntries(); +void WCRootDataPileUpSpill::CloseFile() +{ + delete fPupSpillC; fPupSpillC = 0; + this->WCRootData::CloseFile(); } -void WCRootDataPileUpSpill::GetEntry(const int i) { - fPupSpillC->GetEntry(i); - this->WCRootData::GetEntry(i); +int WCRootDataPileUpSpill::GetEntries() +{ + if( this->WCRootData::GetEntries()!=fPupSpillC->GetEntries() ) + { + cout<<" Number of enetries are different" <WCRootData::GetEntries() <GetEntries() <WCRootData::GetEntries(); } -void WCRootDataPileUpSpill::GetOutFileIdNumber(const int i, TString& s) { - std::stringstream ss; - ss << std::setw(5) << std::setfill('0') << i; - s = TString(ss.str()); +void WCRootDataPileUpSpill::GetEntry(const int i) +{ + fPupSpillC->GetEntry(i); + this->WCRootData::GetEntry(i); } -void WCRootDataPileUpSpill::CreateTree(const char* prefix) { - TString sOutFileNum = ""; - this->GetOutFileIdNumber(fOutFileNum, sOutFileNum); - - if(prefix != 0) { - fOutFilePrefix = TString(prefix); - } - TString OutFileName = fOutFilePrefix + "." + sOutFileNum + ".root"; - std::cout << " Creating new output file: " << OutFileName << std::endl; - fOutFileNum += 1; - this->WCRootData::CreateTree(OutFileName); - - TFile* f = fWCSimT->GetCurrentFile(); - fPupSpillT = new TTree(fPupSpillTreeName, "Pile-up spill tree"); - fPupSpillT->SetDirectory(f); - fPupSpill.CreateBranch(fPupSpillT); - fPupSpill.Clear(); - - fCurSpill = 0; +void WCRootDataPileUpSpill::GetOutFileIdNumber(const int i, TString &s) +{ + std::stringstream ss; + ss << std::setw(5) << std::setfill('0') <WriteTree(); - this->CreateTree(); - } +void WCRootDataPileUpSpill::CreateTree(const char *prefix) +{ + TString sOutFileNum = ""; + this->GetOutFileIdNumber(fOutFileNum, sOutFileNum); + + if( prefix!=0 ){ fOutFilePrefix = TString(prefix); } + TString OutFileName = fOutFilePrefix + "." + sOutFileNum + ".root"; + std::cout<<" Creating new output file: " << OutFileName <WCRootData::CreateTree(OutFileName); - TFile* f = fWCSimT->GetCurrentFile(); - f->cd(); - fWCSimT->Fill(); - fWCSimT->Write("", TObject::kOverwrite); - fPupSpillT->Fill(); - fPupSpillT->Write("", TObject::kOverwrite); + TFile *f = fWCSimT->GetCurrentFile(); + fPupSpillT = new TTree(fPupSpillTreeName, "Pile-up spill tree"); + fPupSpillT->SetDirectory(f); + fPupSpill.CreateBranch(fPupSpillT); + fPupSpill.Clear(); - fSpEvt[0]->ReInitialize(); - fPupSpill.Clear(); + fCurSpill = 0; +} - fCurSpill += 1; +void WCRootDataPileUpSpill::FillTree() +{ + if( fCurSpill==fNumOfSpillsPerFile ) + { + this->WriteTree(); + this->CreateTree(); + } + + TFile *f = fWCSimT->GetCurrentFile(); + f->cd(); + fWCSimT->Fill(); + fWCSimT->Write("", TObject::kOverwrite); + fPupSpillT->Fill(); + fPupSpillT->Write("", TObject::kOverwrite); + + fSpEvt[0]->ReInitialize(); + fPupSpill.Clear(); + + fCurSpill += 1; } -void WCRootDataPileUpSpill::WriteTree() { - TFile* f = fWCSimT->GetCurrentFile(); - this->WCRootData::SetOutFileName(f->GetName()); - f->cd(); +void WCRootDataPileUpSpill::WriteTree() +{ + TFile *f = fWCSimT->GetCurrentFile(); + this->WCRootData::SetOutFileName(f->GetName()); + f->cd(); - fWCSimT->Write(); - fPupSpillT->Write(); + fWCSimT->Write(); + fPupSpillT->Write(); - f->Close(); + f->Close(); - if(fFileNameToBeCopied != "") { - this->CopyTree(fFileNameToBeCopied, "wcsimGeoT"); - this->CopyTree(fFileNameToBeCopied, "Settings"); - } + if( fFileNameToBeCopied!="" ) + { + this->CopyTree(fFileNameToBeCopied, "wcsimGeoT"); + this->CopyTree(fFileNameToBeCopied, "Settings"); + } } -void WCRootDataPileUpSpill::AddInteraction(const WCRootDataNuInt* aNuInt, float offset_time, int bunch_id) { - fPupSpill.NuIntType[fPupSpill.NNuIntTot] = aNuInt->GetInteractionType(); - fPupSpill.NuIntTime[fPupSpill.NNuIntTot] = offset_time; - fPupSpill.NuIntBunch[fPupSpill.NNuIntTot] = bunch_id; - fPupSpill.EdepoOD[fPupSpill.NNuIntTot] = aNuInt->GetEnergyDepositionInOD(); - fPupSpill.FileIdNum[fPupSpill.NNuIntTot] = aNuInt->GetFileIdNumber(); - fPupSpill.EventIdNum[fPupSpill.NNuIntTot] = aNuInt->GetEventIdNumber(); - aNuInt->SetInteractionInformation(&fPupSpill); - - this->AddTracks(aNuInt->GetTrigger(0), offset_time); - - const int iFirst = fPupSpill.NTracks; - const int nTrackTmp = ((TClonesArray*)fSpEvt[0]->GetTrigger(0)->GetTracks())->GetEntries(); - for(int i = iFirst; i < nTrackTmp; i++) { - fPupSpill.TrackNuIntIdx[i] = fPupSpill.NNuIntTot; - fPupSpill.NTracks += 1; - } - - fPupSpill.NNuIntTot += 1; - if(aNuInt->GetInteractionType() == 0) { - fPupSpill.NIDNuInt += 1; - } - else if(aNuInt->GetInteractionType() == 1) { - fPupSpill.NBeamBkg += 1; - } +void WCRootDataPileUpSpill::AddInteraction(const WCRootDataNuInt *aNuInt, + float offset_time, + int bunch_id) +{ + fPupSpill.NuIntType[fPupSpill.NNuIntTot] = aNuInt->GetInteractionType(); + fPupSpill.NuIntTime[fPupSpill.NNuIntTot] = offset_time; + fPupSpill.NuIntBunch[fPupSpill.NNuIntTot] = bunch_id; + fPupSpill.EdepoOD[fPupSpill.NNuIntTot] = aNuInt->GetEnergyDepositionInOD(); + fPupSpill.FileIdNum[fPupSpill.NNuIntTot] = aNuInt->GetFileIdNumber(); + fPupSpill.EventIdNum[fPupSpill.NNuIntTot] = aNuInt->GetEventIdNumber(); + aNuInt->SetInteractionInformation(&fPupSpill); + + this->AddTracks(aNuInt->GetTrigger(0), offset_time); + + const int iFirst = fPupSpill.NTracks; + const int nTrackTmp = ((TClonesArray*)fSpEvt[0]->GetTrigger(0)->GetTracks())->GetEntries(); + for(int i=iFirst; iGetInteractionType()==0 ){ fPupSpill.NIDNuInt += 1; } + else if( aNuInt->GetInteractionType()==1 ){ fPupSpill.NBeamBkg += 1; } } -void WCRootDataPileUpSpill::AddDigiHitsToMDT(MDTManager* mdt, +void WCRootDataPileUpSpill::AddDigiHitsToMDT(MDTManager *mdt, float time_low, float time_up, - float mean_bunch_time) { - const WCSimRootTrigger* aEvt = this->WCRootData::GetTrigger(0); - const TClonesArray* allDigiHits = aEvt->GetCherenkovDigiHits(); - const int nAllDigiHits = allDigiHits->GetEntries(); - - HitTubeCollection* hc = mdt->GetHitTubeCollection(); - for(int i = 0; i < nAllDigiHits; i++) { - WCSimRootCherenkovDigiHit* aHit = (WCSimRootCherenkovDigiHit*)allDigiHits->At(i); - - float t = aHit->GetT(); - - int tube_id = aHit->GetTubeId(); - float q = aHit->GetQ(); - int mPMT_module_id = aHit->GetmPMTId(); - int mPMT_pmt_id = aHit->GetmPMT_PMTId(); - vector true_hit_ids = aHit->GetPhotonIds(); - - if(!hc->HasTube(tube_id)) { - hc->AddHitTube(tube_id); - } - (&(*hc)[tube_id])->AddDigiHit(t, q, true_hit_ids); - } - cout << " Total - before adding AP: " << hc->GetTotalNumOfDigiHits() << endl; - hc = 0; - hc = mdt->GetHitTubeCollection(); - mdt->DoAddAfterpulse(); - cout << " Total - after adding AP: " << hc->GetTotalNumOfDigiHits() << endl; - - HitTubeCollection* hcSel = new HitTubeCollection(); - int n = 0; - for(hc->Begin(); !hc->IsEnd(); hc->Next()) { - HitTube* aPH = &(*hc)(); - int tube_id = aPH->GetTubeID(); - for(int i = 0; i < aPH->GetNDigiHits(); i++) { - float t = aPH->GetTimeDigi(i); - if(!(t > time_low && t < time_up)) { - continue; - } - - vector true_hit_ids = aPH->GetParentCompositionDigi(i); - t = t - mean_bunch_time; - float q = aPH->GetChargeDigi(i); - - if(!hcSel->HasTube(tube_id)) { - hcSel->AddHitTube(tube_id); - } - (&(*hcSel)[tube_id])->AddDigiHit(t, q, true_hit_ids); - } // digi hit loop - aPH = NULL; - n++; - } // PMT loop - cout << " Selected with adding AP: " << hcSel->GetTotalNumOfDigiHits() << endl; - mdt->SetHitTubeCollection(hcSel); - hc = 0; - hcSel = 0; + float mean_bunch_time) +{ + const WCSimRootTrigger* aEvt = this->WCRootData::GetTrigger(0); + const TClonesArray *allDigiHits = aEvt->GetCherenkovDigiHits(); + const int nAllDigiHits = allDigiHits->GetEntries(); + + HitTubeCollection *hc = mdt->GetHitTubeCollection(); + for(int i=0; iAt(i); + + float t = aHit->GetT(); + + int tube_id = aHit->GetTubeId(); + float q = aHit->GetQ(); + int mPMT_module_id = aHit->GetmPMTId(); + int mPMT_pmt_id = aHit->GetmPMT_PMTId(); + vector true_hit_ids = aHit->GetPhotonIds(); + + if( !hc->HasTube(tube_id) ) + { + hc->AddHitTube(tube_id); + } + (&(*hc)[tube_id])->AddDigiHit(t, q, true_hit_ids); + } + cout<<" Total - before adding AP: " << hc->GetTotalNumOfDigiHits() <GetHitTubeCollection(); + mdt->DoAddAfterpulse(); + cout<<" Total - after adding AP: " << hc->GetTotalNumOfDigiHits() <Begin(); !hc->IsEnd(); hc->Next()) + { + HitTube *aPH = &(*hc)(); + int tube_id = aPH->GetTubeID(); + for(int i=0; iGetNDigiHits(); i++) + { + float t = aPH->GetTimeDigi(i); + if( !(t>time_low && t true_hit_ids = aPH->GetParentCompositionDigi(i); + t = t - mean_bunch_time; + float q = aPH->GetChargeDigi(i); + + if( !hcSel->HasTube(tube_id) ) + { + hcSel->AddHitTube(tube_id); + } + (&(*hcSel)[tube_id])->AddDigiHit(t, q, true_hit_ids); + } // digi hit loop + aPH = NULL; + n++; + } // PMT loop + cout<<" Selected with adding AP: " << hcSel->GetTotalNumOfDigiHits() <SetHitTubeCollection(hcSel); + hc = 0; + hcSel = 0; } diff --git a/cpp/include/Configuration.h b/cpp/include/Configuration.h index 938b1af..120e2ad 100644 --- a/cpp/include/Configuration.h +++ b/cpp/include/Configuration.h @@ -1,48 +1,48 @@ #pragma once -#include #include -#include +#include #include -#include #include +#include +#include using std::cout; using std::endl; +using std::vector; +using std::stringstream; +using std::string; using std::ifstream; using std::map; -using std::string; -using std::stringstream; -using std::vector; -struct Value_t { - int i; - float f; - string s; -}; -class Configuration { - public: +struct Value_t +{ + int i; + float f; + string s; +}; - static Configuration* GetInstance(); - void Finalize(); +class Configuration +{ + public : + static Configuration* GetInstance(); + void Finalize(); - void ReadParameter(string); - void PrintParameters(); + void ReadParameter(string); + void PrintParameters(); void AddValue(string, string); - template T GetValue(string); - template void GetValue(string, T&); - - string ParseMDTROOT(string); - - protected: + template T GetValue(string); + template void GetValue(string, T&); - Configuration(); + string ParseMDTROOT(string); - private: + protected : + Configuration(); - static Configuration* fTheInstance; + private : + static Configuration *fTheInstance; - bool IsAvailable(string&, bool forceexit = true); - map fMpValue; + bool IsAvailable(string&,bool forceexit=true); + map fMpValue; }; diff --git a/cpp/include/HitDigitizer.h b/cpp/include/HitDigitizer.h index 9925216..70d56b1 100644 --- a/cpp/include/HitDigitizer.h +++ b/cpp/include/HitDigitizer.h @@ -1,33 +1,32 @@ -#include #include #include +#include #include "HitTubeCollection.h" -#include "MTRandom.h" #include "PMTResponse.h" +#include "MTRandom.h" using std::cout; using std::endl; using std::vector; -class HitDigitizer { - public: - - HitDigitizer(int s = 67823); - virtual ~HitDigitizer(); - void Digitize(HitTubeCollection*, PMTResponse*); - void DigitizeTube(HitTube*, PMTResponse*); - - void ApplyThreshold(double&, bool&); - double DoTruncate(const double, const double); - - private: - - float fPrecisionCharge; - float fPrecisionTiming; - float fEfficiency; - float fIntegWindow; - int fApplyEff; - - MTRandom* fRand; +class HitDigitizer +{ + public: + HitDigitizer(int s=67823); + virtual ~HitDigitizer(); + void Digitize(HitTubeCollection*, PMTResponse*); + void DigitizeTube(HitTube*, PMTResponse*); + + void ApplyThreshold(double&, bool&); + double DoTruncate(const double, const double); + + private: + float fPrecisionCharge; + float fPrecisionTiming; + float fEfficiency; + float fIntegWindow; + int fApplyEff; + + MTRandom *fRand; }; diff --git a/cpp/include/HitTube.h b/cpp/include/HitTube.h index 79951c7..5822ee2 100644 --- a/cpp/include/HitTube.h +++ b/cpp/include/HitTube.h @@ -1,12 +1,12 @@ -// This class manages informaion about both true and digitized hits +// This class manages informaion about both true and digitized hits // This class assumed to be instanceated for each PMT // The following information is stored: // // - true hits (just photoelectrons) // - number of true hits -// - true hit time -// - parent charged particle ID -// - negative value for noise +// - true hit time +// - parent charged particle ID +// - negative value for noise // // - digitized hits // - number of digitized hits @@ -16,78 +16,70 @@ #pragma once -#include #include +#include #include "TrueHit.h" using std::vector; -class HitTube { - public: - - HitTube(int); - virtual ~HitTube(); - - void SetTubeID(const int i) { fTubeID = i; } - - int GetTubeID() const { return fTubeID; } - +class HitTube +{ + public: + HitTube(int); + virtual ~HitTube(); + void SetTubeID(const int i){ fTubeID = i; } + int GetTubeID() const { return fTubeID; } float GetPosition(int i) const { return fPosition[i]; } - float GetOrientation(int i) const { return fOrientation[i]; } - void SetPosition(int i, float f) { fPosition[i] = f; } - void SetOrientation(int i, float f) { fOrientation[i] = f; } - void AddRawPE(const float t, const int id = 9999999) { - fPhotoElectrons.push_back(new TrueHit(t, id)); - fNRawPE += 1; - } - - void AddRawPE(TrueHit* th) { - fPhotoElectrons.push_back(th); - fNRawPE += 1; - } - - int GetNRawPE() const { return fNRawPE; } - - float GetTimeRaw(const int i) const { return fPhotoElectrons[i]->GetTime(); } - - void SortTrueHits() { - std::sort( - fPhotoElectrons.begin(), - fPhotoElectrons.end(), - [](const TrueHit* left, const TrueHit* right) { return left->GetTime() < right->GetTime(); }); - } - - const vector& GetPhotoElectrons() const { return fPhotoElectrons; } - - void AddDigiHit(const float t, const float q, const vector& id = vector()) { - fTimeDigi.push_back(t); - fChargeDigi.push_back(q); - fParentCompDigi.push_back(id); - fNDigiHits += 1; - } - - int GetNDigiHits() const { return fNDigiHits; } - - float GetTimeDigi(const int i) const { return fTimeDigi[i]; } - - float GetChargeDigi(const int i) const { return fChargeDigi[i]; } - - const vector& GetParentCompositionDigi(const int i) const { return fParentCompDigi[i]; } - - private: - - int fNRawPE; - vector fPhotoElectrons; - int fTubeID; - int fNDigiHits; + void AddRawPE(const float t, const int id=9999999) + { + fPhotoElectrons.push_back(new TrueHit(t, id)); + fNRawPE+=1; + } + void AddRawPE(TrueHit* th) + { + fPhotoElectrons.push_back(th); + fNRawPE+=1; + } + int GetNRawPE() const { return fNRawPE; } + float GetTimeRaw(const int i) const { return fPhotoElectrons[i]->GetTime(); } + void SortTrueHits() + { + std::sort(fPhotoElectrons.begin(), + fPhotoElectrons.end(), + [](const TrueHit* left, const TrueHit* right) + { return left->GetTime() < right->GetTime(); } + ); + } + const vector& GetPhotoElectrons() const { return fPhotoElectrons; } + + void AddDigiHit(const float t, const float q, const vector &id=vector()) + { + fTimeDigi.push_back( t ); + fChargeDigi.push_back( q ); + fParentCompDigi.push_back( id ); + fNDigiHits+=1; + } + + int GetNDigiHits() const { return fNDigiHits; } + float GetTimeDigi(const int i) const { return fTimeDigi[i]; } + float GetChargeDigi(const int i) const { return fChargeDigi[i]; } + const vector& GetParentCompositionDigi(const int i) const { return fParentCompDigi[i]; } + + + private: + int fNRawPE; + vector fPhotoElectrons; + + int fTubeID; + int fNDigiHits; float fPosition[3]; float fOrientation[3]; - vector fTimeDigi; - vector fChargeDigi; - vector> fParentCompDigi; + vector fTimeDigi; + vector fChargeDigi; + vector> fParentCompDigi; }; diff --git a/cpp/include/HitTubeCollection.h b/cpp/include/HitTubeCollection.h index 58f04f0..31188d3 100644 --- a/cpp/include/HitTubeCollection.h +++ b/cpp/include/HitTubeCollection.h @@ -11,48 +11,34 @@ using std::endl; using std::map; using std::string; -class HitTubeCollection { - public: - - HitTubeCollection(); - virtual ~HitTubeCollection(); - - bool HasTube(const int id) { return fPHs.count(id) != 0 ? true : false; } - - void AddHitTube(const int); +class HitTubeCollection +{ + public: + HitTubeCollection(); + virtual ~HitTubeCollection(); + bool HasTube(const int id){ return fPHs.count(id)!=0 ? true : false; } + void AddHitTube(const int); void AddTrueHit(const int, const float, const int); void AddDigiHit(const int, const float, const float); + int GetNumOfHitTubes() const { return fPHs.size(); } + int GetTotalNumOfTrueHits(); + int GetTotalNumOfDigiHits(); + void Clear(); - int GetNumOfHitTubes() const { return fPHs.size(); } - - int GetTotalNumOfTrueHits(); - int GetTotalNumOfDigiHits(); - void Clear(); - - void Begin() { fItr = fPHs.begin(); } + void Begin() { fItr = fPHs.begin(); } + bool IsEnd() { return fItr==fPHs.end() ? true : false; } + void Next() { fItr++; } + HitTube* GetHitTube(int id=-1) { if( id<0 ){ return &(*fPHs[fItr->first]); } return &(*fPHs[id]); } - bool IsEnd() { return fItr == fPHs.end() ? true : false; } - - void Next() { fItr++; } - - HitTube* GetHitTube(int id = -1) { - if(id < 0) { - return &(*fPHs[fItr->first]); - } - return &(*fPHs[id]); - } - - HitTube& operator()() { return *fPHs[fItr->first]; } - - HitTube& operator[](int id) { return *fPHs[id]; } + HitTube& operator ()() { return *fPHs[fItr->first]; } + HitTube& operator [](int id) { return *fPHs[id]; } const vector& GetHitTubeIDList() const { return fTubeList; } - private: - - map fPHs; - map::iterator fItr; + private: + map fPHs; + map::iterator fItr; vector fTubeList; - int fNTrueHitsTotal; - int fNDigiHitsTotal; + int fNTrueHitsTotal; + int fNDigiHitsTotal; }; diff --git a/cpp/include/MDTManager.h b/cpp/include/MDTManager.h index 60065b0..81ac243 100644 --- a/cpp/include/MDTManager.h +++ b/cpp/include/MDTManager.h @@ -2,50 +2,48 @@ #include -#include "Configuration.h" -#include "HitDigitizer.h" #include "HitTube.h" -#include "HitTubeCollection.h" -#include "MTRandom.h" -#include "PMTAfterpulse.h" #include "PMTNoise.h" -#include "TriggerAlgo.h" +#include "HitTubeCollection.h" +#include "HitDigitizer.h" #include "TriggerInfo.h" +#include "TriggerAlgo.h" +#include "Configuration.h" +#include "PMTAfterpulse.h" +#include "MTRandom.h" using std::map; -class MDTManager { - public: - - MDTManager(int seed = 78923); - virtual ~MDTManager(); - - HitTubeCollection* GetHitTubeCollection(const string& s = "Def") { return fPHC[s]; } - - TriggerInfo* GetTriggerInfo(const string& s = "Def") { return fTrigInfo[s]; } - - void RegisterPMTType(const string& s = "Def", PMTResponse* p = 0); - - void DoInitialize(); - void DoAddDark(const string& s = "Def"); - void DoDigitize(const string& s = "Def"); - void DoTrigger(const string& s = "Def"); - void DoAddAfterpulse(const string& s = "Def"); - - void SetHitTubeCollection(HitTubeCollection*, const string& s = "Def"); - bool HasThisPMTType(const string&); - - PMTResponse* GetPMTResponse(const string& s = "Def") { return fPMTResp[s]; } - - private: - - TriggerAlgo* fTrigAlgo; - HitDigitizer* fDgtzr; - MTRandom* fRndm; - - map fTrigInfo; - map fPMTResp; - map fDark; - map fPHC; - string fDefName; +class MDTManager +{ + public: + MDTManager(int seed=78923); + virtual ~MDTManager(); + + HitTubeCollection* GetHitTubeCollection(const string &s="Def") { return fPHC[s]; } + TriggerInfo* GetTriggerInfo(const string &s="Def") { return fTrigInfo[s]; } + + void RegisterPMTType(const string &s="Def", PMTResponse *p=0); + + void DoInitialize(); + void DoAddDark(const string &s="Def"); + void DoDigitize(const string &s="Def"); + void DoTrigger(const string &s="Def"); + void DoAddAfterpulse(const string &s="Def"); + + void SetHitTubeCollection(HitTubeCollection*, const string &s="Def"); + bool HasThisPMTType(const string&); + + PMTResponse* GetPMTResponse(const string &s="Def") { return fPMTResp[s]; } + + private: + TriggerAlgo *fTrigAlgo; + HitDigitizer *fDgtzr; + MTRandom *fRndm; + + map fTrigInfo; + map fPMTResp; + map fDark; + map fPHC; + string fDefName; }; diff --git a/cpp/include/MTRandom.h b/cpp/include/MTRandom.h index a04de50..4b3a351 100644 --- a/cpp/include/MTRandom.h +++ b/cpp/include/MTRandom.h @@ -1,63 +1,58 @@ #pragma once -#include #include +#include using std::vector; -class MTRandom { - public: - - MTRandom(int s) { SetSeed(s); } - - virtual ~MTRandom() {}; - double Rndm(); - double Gaus(double m = 0., double s = 1.0); - int Poisson(double); - - unsigned int Integer(unsigned int imax) { return (unsigned int)(imax * Rndm()); } - - double Uniform(double x1, double x2) { return x1 + (x2 - x1) * Rndm(); } - - double Histogram(vector&, vector&, vector&); - - private: - - void SetSeed(int); - unsigned int fMt[624]; - int fCount624; - int fSeed; - - static const int kM; - static const int kN; - static const unsigned int kTemperingMaskB; - static const unsigned int kTemperingMaskC; - static const unsigned int kUpperMask; - static const unsigned int kLowerMask; - static const unsigned int kMatrixA; - - static const double kC1; - static const double kC2; - static const double kC3; - static const double kD1; - static const double kD2; - static const double kD3; - static const double kHm; - static const double kZm; - static const double kHp; - static const double kZp; - static const double kPhln; - static const double kHm1; - static const double kHp1; - static const double kHzm; - static const double kHzmp; - /*zhm 0.967882898*/ - static const double kAs; - static const double kBs; - static const double kCs; - static const double kB; - static const double kX0; - static const double kYm; - static const double kS; - static const double kT; +class MTRandom +{ + public: + MTRandom(int s){ SetSeed(s); } + virtual ~MTRandom(){}; + double Rndm(); + double Gaus(double m=0., double s=1.0); + int Poisson(double); + unsigned int Integer(unsigned int imax){ return (unsigned int)(imax*Rndm()); } + double Uniform(double x1, double x2){ return x1 + (x2-x1)*Rndm(); } + double Histogram(vector&, vector&, vector&); + + private : + void SetSeed(int); + unsigned int fMt[624]; + int fCount624; + int fSeed; + + static const int kM; + static const int kN; + static const unsigned int kTemperingMaskB; + static const unsigned int kTemperingMaskC; + static const unsigned int kUpperMask; + static const unsigned int kLowerMask; + static const unsigned int kMatrixA; + + static const double kC1; + static const double kC2; + static const double kC3; + static const double kD1; + static const double kD2; + static const double kD3; + static const double kHm; + static const double kZm; + static const double kHp; + static const double kZp; + static const double kPhln; + static const double kHm1; + static const double kHp1; + static const double kHzm; + static const double kHzmp; + /*zhm 0.967882898*/ + static const double kAs; + static const double kBs; + static const double kCs; + static const double kB ; + static const double kX0; + static const double kYm; + static const double kS ; + static const double kT ; }; diff --git a/cpp/include/PMTAfterpulse.h b/cpp/include/PMTAfterpulse.h index b8959cc..b294e39 100644 --- a/cpp/include/PMTAfterpulse.h +++ b/cpp/include/PMTAfterpulse.h @@ -1,9 +1,9 @@ #pragma once -#include #include -#include +#include #include +#include #include "MTRandom.h" @@ -13,26 +13,26 @@ using std::string; using std::stringstream; using std::vector; -class PMTAfterpulse { - public: - - PMTAfterpulse(); - virtual ~PMTAfterpulse(); - - bool GenerateAfterpulse(const float, const vector&, MTRandom*); - float GetAfterpulseTime(const float, MTRandom*); +class PMTAfterpulse +{ + public: + PMTAfterpulse(); + virtual ~PMTAfterpulse(); - private: + bool GenerateAfterpulse(const float, const vector&, MTRandom*); + float GetAfterpulseTime(const float, MTRandom*); - void LoadTimingCDF(const string&); + + private: + void LoadTimingCDF(const string&); - vector fCDF_BinEdgeLow; - vector fCDF_BinEdgeUp; - vector fCDF_BinCenter; - vector fCDF; - float fSlope; - float fIntercept; + vector fCDF_BinEdgeLow; + vector fCDF_BinEdgeUp; + vector fCDF_BinCenter; + vector fCDF; + float fSlope; + float fIntercept; - int fDoAdd; - string fTxtFileCDF; + int fDoAdd; + string fTxtFileCDF; }; diff --git a/cpp/include/PMTNoise.h b/cpp/include/PMTNoise.h index 574be15..72836ac 100644 --- a/cpp/include/PMTNoise.h +++ b/cpp/include/PMTNoise.h @@ -1,75 +1,71 @@ #pragma once -#include -#include #include +#include +#include +#include +#include #include #include -#include -#include -#include "HitTubeCollection.h" #include "MTRandom.h" +#include "HitTubeCollection.h" #include "PMTAfterpulse.h" using std::cout; using std::endl; -using std::map; +using std::vector; using std::pair; +using std::map; using std::string; -using std::vector; class HitDigitizer; class PMTResponse; -class PMTNoise { - public: - - PMTNoise(const int, const string& s = ""); - virtual ~PMTNoise(); - - void SetNumberOfPMTs(const int); - void SetMinTubeID(const int); - void SetMaxTubeID(const int); - void SetWindowLow(const double /* ns */); - void SetWindowUp(const double /* ns */); - void SetDarkRate(const double /* kHz */); - - void SetDarkMode(const int i) { fDarkMode = i; } - - void GenerateDarkNoise(double, double, bool isDPE = false, const bool verbose = false); - int GetNumberOfGeneratedDarkHits() const; - int GetNumberOfGeneratedDarkPhotoElectrons() const; - - int GetNoiseTube(const int i) const { return fNoisePMT[i]; } - - double GetNoiseTime(const int i) const { return fNoiseTime[i]; } - - void AddPhotoElectrons(HitTubeCollection*); - void Add(HitTubeCollection*, double, double); - void FindRanges(HitTubeCollection*, vector>&); - - void AddAfterpulse(HitTubeCollection*, HitDigitizer*, PMTResponse* pr); - - private: - - MTRandom* fRand; - int fNPMTs; - int fMinTubeID; - int fMaxTubeID; - float fWinLow; - float fWinUp; - float fDarkRate; - float fAveNoise; - float fConvRate; - float fWindow; - int fDarkMode; - - int fNnoise; - vector fNoisePMT; - vector fNoiseTime; - - PMTAfterpulse* fAftpulse; - - string fPMTType; +class PMTNoise +{ + public : + PMTNoise(const int, const string &s=""); + virtual ~PMTNoise(); + + void SetNumberOfPMTs(const int); + void SetMinTubeID(const int); + void SetMaxTubeID(const int); + void SetWindowLow(const double /* ns */); + void SetWindowUp(const double /* ns */); + void SetDarkRate(const double /* kHz */); + void SetDarkMode(const int i){ fDarkMode = i; } + + void GenerateDarkNoise(double, double, bool isDPE=false, const bool verbose=false); + int GetNumberOfGeneratedDarkHits() const; + int GetNumberOfGeneratedDarkPhotoElectrons() const; + int GetNoiseTube(const int i) const { return fNoisePMT[i]; } + double GetNoiseTime(const int i) const { return fNoiseTime[i]; } + + void AddPhotoElectrons(HitTubeCollection*); + void Add(HitTubeCollection*, double, double); + void FindRanges(HitTubeCollection*, vector>&); + + void AddAfterpulse(HitTubeCollection*, HitDigitizer*, PMTResponse *pr); + + private : + MTRandom *fRand; + int fNPMTs; + int fMinTubeID; + int fMaxTubeID; + float fWinLow; + float fWinUp; + float fDarkRate; + float fAveNoise; + float fConvRate; + float fWindow; + int fDarkMode; + + int fNnoise; + vector fNoisePMT; + vector fNoiseTime; + + PMTAfterpulse *fAftpulse; + + string fPMTType; }; diff --git a/cpp/include/PMTResponse.h b/cpp/include/PMTResponse.h index 7ab0da0..8a25388 100644 --- a/cpp/include/PMTResponse.h +++ b/cpp/include/PMTResponse.h @@ -1,8 +1,8 @@ #pragma once #include -#include "HitTube.h" #include "MTRandom.h" +#include "HitTube.h" using std::string; @@ -11,74 +11,69 @@ using std::string; // - generation of SPE // - timing resolution // -class PMTResponse { - public: - - virtual double GetRawSPE(const TrueHit* th = NULL, const HitTube* ht = NULL) = 0; - virtual float HitTimeSmearing(float) = 0; - virtual void Initialize(int, const string& s = "") = 0; - virtual bool ApplyDE(const TrueHit* th = NULL, const HitTube* ht = NULL) = 0; - - protected: - - MTRandom* fRand; - string fPMTType; - float fSclFacTTS; +class PMTResponse +{ + public: + virtual double GetRawSPE(const TrueHit* th=NULL, const HitTube* ht=NULL) = 0; + virtual float HitTimeSmearing(float) = 0; + virtual void Initialize(int, const string &s="") = 0; + virtual bool ApplyDE(const TrueHit* th=NULL, const HitTube* ht=NULL) = 0; + + protected: + MTRandom *fRand; + string fPMTType; + float fSclFacTTS; }; -// Based on the implementation of R12199_02 3'' PMT for mPMT in WCSim -// - WCSimPMTObject.cc -class GenericPMTResponse : public PMTResponse { - public: - - GenericPMTResponse(const int, const string& s = ""); - GenericPMTResponse(); - virtual ~GenericPMTResponse(); - void Initialize(int, const string& s = ""); - virtual double GetRawSPE(const TrueHit* th = NULL, const HitTube* ht = NULL); - virtual float HitTimeSmearing(float); - virtual bool ApplyDE(const TrueHit* th = NULL, const HitTube* ht = NULL); - - protected: - - void LoadCDFOfSPE(const string& s); - float fqpe0[501]; - string fTxtFileSPECDF; - - // private: - - protected: - - float fTResConstant; - float fTResMinimum; +// Based on the implementation of R12199_02 3'' PMT for mPMT in WCSim +// - WCSimPMTObject.cc +class GenericPMTResponse : public PMTResponse +{ + public: + GenericPMTResponse(const int, const string &s=""); + GenericPMTResponse(); + virtual ~GenericPMTResponse(); + void Initialize(int, const string &s=""); + virtual double GetRawSPE(const TrueHit* th=NULL, const HitTube* ht=NULL); + virtual float HitTimeSmearing(float); + virtual bool ApplyDE(const TrueHit* th=NULL, const HitTube* ht=NULL); + + protected: + void LoadCDFOfSPE(const string &s); + float fqpe0[501]; + string fTxtFileSPECDF; + + //private: + protected: + float fTResConstant; + float fTResMinimum; }; -class ResponseBoxandLine20inchHQE : public GenericPMTResponse { - public: - - ResponseBoxandLine20inchHQE(int, const string& s = ""); - ResponseBoxandLine20inchHQE(); - virtual ~ResponseBoxandLine20inchHQE(); - float HitTimeSmearing(float); - void Initialize(int, const string& s = ""); - private: +class ResponseBoxandLine20inchHQE : public GenericPMTResponse +{ + public: + ResponseBoxandLine20inchHQE(int, const string &s=""); + ResponseBoxandLine20inchHQE(); + virtual ~ResponseBoxandLine20inchHQE(); + float HitTimeSmearing(float); + void Initialize(int, const string &s=""); - static const double ksig_param[4]; - static const double klambda_param[2]; - double fhighcharge_param[2]; + private: + static const double ksig_param[4]; + static const double klambda_param[2]; + double fhighcharge_param[2]; }; -class Response3inchR14374 : public GenericPMTResponse { - public: - - Response3inchR14374(int, const string& s = ""); - Response3inchR14374(); - virtual ~Response3inchR14374(); - float HitTimeSmearing(float); - void Initialize(int, const string& s = ""); - - private: - - double fTimeResAt1PE; +class Response3inchR14374 : public GenericPMTResponse +{ + public: + Response3inchR14374(int, const string &s=""); + Response3inchR14374(); + virtual ~Response3inchR14374(); + float HitTimeSmearing(float); + void Initialize(int, const string &s=""); + + private: + double fTimeResAt1PE; }; diff --git a/cpp/include/TriggerAlgo.h b/cpp/include/TriggerAlgo.h index b015af2..fcf4045 100644 --- a/cpp/include/TriggerAlgo.h +++ b/cpp/include/TriggerAlgo.h @@ -1,10 +1,10 @@ // Apply event trigger to a given set of dititized PMT hits (map) // The resultant triggers are saved in a TrggerInfo class object #pragma once -#include #include #include #include +#include #include "HitTubeCollection.h" #include "TriggerInfo.h" @@ -14,23 +14,21 @@ using std::endl; using std::map; using std::vector; -class TriggerAlgo { - public: - - TriggerAlgo(); - virtual ~TriggerAlgo() {}; - - void NDigits(HitTubeCollection*, TriggerInfo*); - - float GetTriggerTimeForFailure() const { return fTriggerTimeForFailure; } - - private: - - map fPreTriggerWindow; - map fPostTriggerWindow; - float fTriggerOffsetTime; - float fTriggerTimeForFailure; - float fNDigitsWindow; - float fNDigitsStepSize; - int fNDigitsThreshold; +class TriggerAlgo +{ + public: + TriggerAlgo(); + virtual ~TriggerAlgo(){}; + + void NDigits(HitTubeCollection*, TriggerInfo*); + float GetTriggerTimeForFailure() const { return fTriggerTimeForFailure; } + + private: + map fPreTriggerWindow; + map fPostTriggerWindow; + float fTriggerOffsetTime; + float fTriggerTimeForFailure; + float fNDigitsWindow; + float fNDigitsStepSize; + int fNDigitsThreshold; }; diff --git a/cpp/include/TriggerInfo.h b/cpp/include/TriggerInfo.h index a281b22..7a273fc 100644 --- a/cpp/include/TriggerInfo.h +++ b/cpp/include/TriggerInfo.h @@ -1,5 +1,5 @@ // Store the following information -// - Number of event triggers +// - Number of event triggers // - Triggered time // - Lower edge // - Upper edge @@ -14,34 +14,29 @@ using std::cout; using std::endl; using std::vector; -enum class TriggerType : int { eNDigits = 0, eFailure }; - -class TriggerInfo { - public: - - TriggerInfo(); - virtual ~TriggerInfo(); - - void AddTrigger(float, float, float, int, int); - void Clear(); - - int GetNumOfTrigger() const { return (int)fTrigTime.size(); } - - float GetTriggerTime(int i) const { return fTrigTime[i]; } - - float GetLowEdge(int i) const { return fTimeLow[i]; } - - float GetUpEdge(int i) const { return fTimeUp[i]; } - - int GetNHits(int i) const { return fNHits[i]; } - - int GetType(int i) const { return fTrigType[i]; } - - private: - - vector fTrigTime; - vector fTimeLow; - vector fTimeUp; - vector fNHits; - vector fTrigType; +enum class TriggerType : int { eNDigits=0, + eFailure}; + +class TriggerInfo +{ + public: + TriggerInfo(); + virtual ~TriggerInfo(); + + void AddTrigger(float, float, float, int, int); + void Clear(); + + int GetNumOfTrigger() const { return (int)fTrigTime.size(); } + float GetTriggerTime(int i) const { return fTrigTime[i]; } + float GetLowEdge(int i) const { return fTimeLow[i]; } + float GetUpEdge(int i) const { return fTimeUp[i]; } + int GetNHits(int i) const { return fNHits[i]; } + int GetType(int i) const { return fTrigType[i]; } + + private: + vector fTrigTime; + vector fTimeLow; + vector fTimeUp; + vector fNHits; + vector fTrigType; }; diff --git a/cpp/include/TrueHit.h b/cpp/include/TrueHit.h index 2ba7a92..d0b591a 100644 --- a/cpp/include/TrueHit.h +++ b/cpp/include/TrueHit.h @@ -1,48 +1,35 @@ #pragma once -class TrueHit { - public: - - TrueHit(float t, int id = 999999999); - TrueHit(); - virtual ~TrueHit(); - - float GetTime() const { return fTime; } - - float GetParentId() const { return fParentId; } - - float GetPosition(int i) const { return fPosition[i]; } - - float GetDirection(int i) const { return fDirection[i]; } - - float GetStartTime() const { return fStartTime; } - - float GetStartPosition(int i) const { return fStartPosition[i]; } - - float GetStartDirection(int i) const { return fStartDirection[i]; } - - int GetPosBin(int i) const { return fBin[i]; } - - void SetPosition(int i, float f) { fPosition[i] = f; } - - void SetDirection(int i, float f) { fDirection[i] = f; } - - void SetStartTime(float f) { fStartTime = f; } - - void SetStartPosition(int i, float f) { fStartPosition[i] = f; } - - void SetStartDirection(int i, float f) { fStartDirection[i] = f; } - - void SetPosBin(int i, int b) { fBin[i] = b; } - - private: - - float fTime; - float fPosition[3]; // Hit position on photocade - float fDirection[3]; // Direction of photon hitting photocathode - float fStartTime; // Photon track initial time - float fStartPosition[3]; // Photon track initial position - float fStartDirection[3]; // Photon track initial direction - int fParentId; - int fBin[3]; +class TrueHit +{ + public: + TrueHit(float t, int id=999999999); + TrueHit(); + virtual ~TrueHit(); + + float GetTime() const { return fTime; } + float GetParentId() const { return fParentId; } + float GetPosition(int i) const { return fPosition[i]; } + float GetDirection(int i) const { return fDirection[i]; } + float GetStartTime() const {return fStartTime; } + float GetStartPosition(int i) const { return fStartPosition[i]; } + float GetStartDirection(int i) const { return fStartDirection[i]; } + int GetPosBin(int i) const { return fBin[i]; } + + void SetPosition(int i, float f) { fPosition[i] = f; } + void SetDirection(int i, float f) { fDirection[i] = f; } + void SetStartTime(float f) { fStartTime = f; } + void SetStartPosition(int i, float f) { fStartPosition[i] = f; } + void SetStartDirection(int i, float f) { fStartDirection[i] = f; } + void SetPosBin(int i, int b){ fBin[i] = b; } + + private: + float fTime; + float fPosition[3]; // Hit position on photocade + float fDirection[3]; // Direction of photon hitting photocathode + float fStartTime; // Photon track initial time + float fStartPosition[3]; // Photon track initial position + float fStartDirection[3]; // Photon track initial direction + int fParentId; + int fBin[3]; }; diff --git a/cpp/src/Configuration.cc b/cpp/src/Configuration.cc index 28140cb..f5a1d24 100644 --- a/cpp/src/Configuration.cc +++ b/cpp/src/Configuration.cc @@ -2,141 +2,152 @@ #include -Configuration* Configuration::fTheInstance = 0; +Configuration* Configuration::fTheInstance=0; -Configuration::Configuration() { - fMpValue.clear(); +Configuration::Configuration() +{ + fMpValue.clear(); } -void Configuration::Finalize() { - fMpValue.clear(); +void Configuration::Finalize() +{ + fMpValue.clear(); } -Configuration* Configuration::GetInstance() { - if(fTheInstance == 0) { - fTheInstance = new Configuration(); - cout << " Instanciating Configuration for the first time" << endl; - } - return fTheInstance; +Configuration* Configuration::GetInstance() +{ + if( fTheInstance==0 ) + { + fTheInstance=new Configuration(); + cout<<" Instanciating Configuration for the first time" < int Configuration::GetValue(string name) { - if(this->IsAvailable(name)) - return fMpValue[name].i; +template <> int Configuration::GetValue(string name) +{ + if( this->IsAvailable(name) ) + return fMpValue[name].i; } -template<> float Configuration::GetValue(string name) { - if(this->IsAvailable(name)) - return fMpValue[name].f; +template <> float Configuration::GetValue(string name) +{ + if( this->IsAvailable(name) ) + return fMpValue[name].f; } -template<> string Configuration::GetValue(string name) { - if(this->IsAvailable(name)) - return fMpValue[name].s; +template <> string Configuration::GetValue(string name) +{ + if( this->IsAvailable(name) ) + return fMpValue[name].s; } -template<> void Configuration::GetValue(string name, int& t) { - if(this->IsAvailable(name, false)) { - t = fMpValue[name].i; - } +template <> void Configuration::GetValue(string name, int &t) +{ + if( this->IsAvailable(name, false) ){ t = fMpValue[name].i; } } -template<> void Configuration::GetValue(string name, float& t) { - if(this->IsAvailable(name, false)) { - t = fMpValue[name].f; - } +template <> void Configuration::GetValue(string name, float &t) +{ + if( this->IsAvailable(name, false) ){ t = fMpValue[name].f; } } -template<> void Configuration::GetValue(string name, string& t) { - if(this->IsAvailable(name, false)) { - t = fMpValue[name].s; - } + +template <> void Configuration::GetValue(string name, string &t) +{ + if( this->IsAvailable(name, false) ){ t = fMpValue[name].s; } } -void Configuration::ReadParameter(string infilename) { - // Array parameter is not supported yet - infilename = ParseMDTROOT(infilename); - ifstream fin(infilename); - if(!fin.is_open()) { - cout << " Cannot open the file: " << infilename << endl; - exit(-1); - } - cout << " Loading parameter settings from: " << infilename << endl; - - string aLine; - string sname; - string svalue; - while(std::getline(fin, aLine)) { - if(aLine[0] == '#') { - continue; - } - - if(!(aLine.find('<') != string::npos && aLine.find('=') != string::npos && - aLine.find('>') != string::npos)) { - continue; - } - - stringstream ss(aLine); - ss.ignore(aLine.size(), '<'); - ss >> sname; - ss.ignore(aLine.size(), '='); - ss >> svalue; - this->AddValue(sname, svalue); - } - fin.close(); +void Configuration::ReadParameter(string infilename) +{ +// Array parameter is not supported yet + infilename = ParseMDTROOT(infilename); + ifstream fin(infilename); + if( !fin.is_open() ) + { + cout<<" Cannot open the file: " << infilename <')!=string::npos) ){ continue; } + + stringstream ss(aLine); + ss.ignore(aLine.size(), '<'); + ss >> sname; + ss.ignore(aLine.size(), '='); + ss >> svalue; + this->AddValue(sname, svalue); + } + fin.close(); } -void Configuration::PrintParameters() { - map::iterator itr; +void Configuration::PrintParameters() +{ + map::iterator itr; - string stmp1 = " *********** Available Pareameters ********** "; - string stmp2 = " ******************************************** "; + string stmp1 = " *********** Available Pareameters ********** " ; + string stmp2 = " ******************************************** " ; - cout << stmp1 << endl; - for(itr = fMpValue.begin(); itr != fMpValue.end(); itr++) { - cout << " - " << itr->first << ": " << itr->second.s << endl; - } - cout << stmp2 << endl; + cout<< stmp1 <first <<": " << itr->second.s < EXIT " << endl; - exit(-1); - } - } - else { - tmp = true; - } - return tmp; +bool Configuration::IsAvailable(string &sName, bool forceexit) +{ + bool tmp = false; + if( fMpValue.count(sName)==0 ) + { + cout<<" Parameter: " << sName <<" is not available " < EXIT " < EXIT" << endl; - exit(-1); - } - } - - return filename; +string Configuration::ParseMDTROOT(string filename) +{ + std::size_t found = filename.find("$MDTROOT"); + if (found!=string::npos) + { + if (std::getenv("MDTROOT")) filename.replace(found,8,std::getenv("MDTROOT")); + else + { + cout<<" [ERROR] Configuration::ParseMDTROOT" < EXIT" <GetValue("DigiHitIntegrationWindow", fIntegWindow); - Conf->GetValue("PrecisionTiming", fPrecisionTiming); - Conf->GetValue("PrecisionCharge", fPrecisionCharge); - Conf->GetValue("ApplyDAQEfficiency", fApplyEff); +fPrecisionCharge(0.), +fPrecisionTiming(0.1), +fEfficiency( 0.985 ), +fIntegWindow( 200. ), +fApplyEff( 1 ) +{ + fRand = new MTRandom( seed ); + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue("DigiHitIntegrationWindow", fIntegWindow); + Conf->GetValue("PrecisionTiming", fPrecisionTiming); + Conf->GetValue("PrecisionCharge", fPrecisionCharge); + Conf->GetValue("ApplyDAQEfficiency", fApplyEff); } -HitDigitizer::~HitDigitizer() { - if(fRand) { - delete fRand; - fRand = NULL; - } +HitDigitizer::~HitDigitizer() +{ + if( fRand ){ delete fRand; fRand = NULL; } } -void HitDigitizer::Digitize(HitTubeCollection* hc, PMTResponse* pr) { - for(hc->Begin(); !hc->IsEnd(); hc->Next()) { - if((&(*hc)())->GetNRawPE() > 0) { - this->DigitizeTube(&(*hc)(), pr); - } - } +void HitDigitizer::Digitize(HitTubeCollection *hc, PMTResponse *pr) +{ + for(hc->Begin(); !hc->IsEnd(); hc->Next()) + { + if( (&(*hc)())->GetNRawPE()>0 ) + { + this->DigitizeTube(&(*hc)(), pr); + } + } } // Based on WCSimWCDigitizerSKI::DigitizeHits in WCSimWCDigitizer.cc -void HitDigitizer::DigitizeTube(HitTube* aHT, PMTResponse* pr) { - aHT->SortTrueHits(); - const int NPE = aHT->GetNRawPE(); - const vector PEs = aHT->GetPhotoElectrons(); +void HitDigitizer::DigitizeTube(HitTube *aHT, PMTResponse *pr) +{ + aHT->SortTrueHits(); + const int NPE = aHT->GetNRawPE(); + const vector PEs = aHT->GetPhotoElectrons(); - // Taken from WCSimWCDigitizerSKI::DigitizeHits - double sumSPE = 0.; - double tSmeared = -9999.; - bool isAlive = false; - double digiT = 0.; - double digiQ = 0.; + // Taken from WCSimWCDigitizerSKI::DigitizeHits + double sumSPE = 0.; + double tSmeared = -9999.; + bool isAlive = false; + double digiT = 0.; + double digiQ = 0.; - double intgr_srt = (double)PEs[0]->GetTime(); - double intgr_end = intgr_srt + fIntegWindow; - vector parent_composition; - parent_composition.clear(); + double intgr_srt = (double)PEs[0]->GetTime(); + double intgr_end = intgr_srt+fIntegWindow; + vector parent_composition; + parent_composition.clear(); - for(int iPE = 0; iPE < NPE; iPE++) { - if(PEs[iPE]->GetTime() >= intgr_srt && PEs[iPE]->GetTime() < intgr_end) { - sumSPE += pr->GetRawSPE(PEs[iPE], aHT); - parent_composition.push_back(PEs[iPE]->GetParentId()); - } - else { - digiT = intgr_srt; - digiQ = sumSPE; + for(int iPE=0; iPEGetTime()>=intgr_srt && PEs[iPE]->GetTime()GetRawSPE(PEs[iPE], aHT); + parent_composition.push_back( PEs[iPE]->GetParentId() ); + } + else + { + digiT = intgr_srt; + digiQ = sumSPE; - isAlive = true; - if(fApplyEff) { - this->ApplyThreshold(digiQ, isAlive); - } - if(isAlive) { - tSmeared = pr->HitTimeSmearing(digiQ); - digiQ *= fEfficiency; - digiT += tSmeared; - digiQ = this->DoTruncate(digiQ, fPrecisionCharge); - digiT = this->DoTruncate(digiT, fPrecisionTiming); - aHT->AddDigiHit(digiT, digiQ, parent_composition); - } - sumSPE = 0.; - parent_composition.clear(); + isAlive = true; + if (fApplyEff ){ this->ApplyThreshold(digiQ, isAlive); } + if( isAlive ) + { + tSmeared = pr->HitTimeSmearing(digiQ); + digiQ *= fEfficiency; + digiT += tSmeared; + digiQ = this->DoTruncate(digiQ, fPrecisionCharge); + digiT = this->DoTruncate(digiT, fPrecisionTiming); + aHT->AddDigiHit(digiT, digiQ, parent_composition); + } + sumSPE = 0.; + parent_composition.clear(); - intgr_srt = PEs[iPE]->GetTime(); - intgr_end = intgr_srt + fIntegWindow; - sumSPE += pr->GetRawSPE(PEs[iPE], aHT); - parent_composition.push_back(PEs[iPE]->GetParentId()); - } - } + intgr_srt = PEs[iPE]->GetTime(); + intgr_end = intgr_srt+fIntegWindow; + sumSPE += pr->GetRawSPE(PEs[iPE], aHT); + parent_composition.push_back( PEs[iPE]->GetParentId() ); + } + } - digiT = intgr_srt; - digiQ = sumSPE; - tSmeared = pr->HitTimeSmearing(digiQ); - isAlive = true; - if(fApplyEff) { - this->ApplyThreshold(digiQ, isAlive); - } - if(isAlive) { - digiQ *= fEfficiency; - digiT += tSmeared; - digiQ = this->DoTruncate(digiQ, fPrecisionCharge); - digiT = this->DoTruncate(digiT, fPrecisionTiming); - aHT->AddDigiHit(digiT, digiQ, parent_composition); - } + digiT = intgr_srt; + digiQ = sumSPE; + tSmeared = pr->HitTimeSmearing(digiQ); + isAlive = true; + if (fApplyEff ){ this->ApplyThreshold(digiQ, isAlive); } + if( isAlive ) + { + digiQ *= fEfficiency; + digiT += tSmeared ; + digiQ = this->DoTruncate(digiQ, fPrecisionCharge); + digiT = this->DoTruncate(digiT, fPrecisionTiming); + aHT->AddDigiHit(digiT, digiQ, parent_composition); + } } -void HitDigitizer::ApplyThreshold(double& pe, bool& pass) { - // Apply DAQ efficiency - // Taken from WCSimWCDigitizerSKI::Threshold - // in WCSimWCDigitizer.hh - // - // NOTE: the input charge, pe, will be altered in this function - pass = true; - double x = pe + 0.1; - double thr = 0.; - if(x < 1.1) { - thr = std::min( - 1.0, - -0.06374 + - x * (3.748 + - x * (-63.23 + - x * (452.0 + - x * (-1449.0 + - x * (2513.0 + - x * (-2529. + - x * (1472.0 + x * (-452.2 + x * (51.34 + x * 2.370)))))))))); - } - else { - thr = 1.0; - } - if(thr < fRand->Rndm()) { - pe = 0.; - pass = false; - } - else { - pe += fRand->Gaus(0., 0.03); - } +void HitDigitizer::ApplyThreshold(double& pe, bool& pass) +{ +// Apply DAQ efficiency +// Taken from WCSimWCDigitizerSKI::Threshold +// in WCSimWCDigitizer.hh +// +// NOTE: the input charge, pe, will be altered in this function + pass=true; + double x=pe+0.1; + double thr=0.; + if( x<1.1 ) + { + thr = std::min(1.0, + -0.06374+x*(3.748+x*(-63.23+x*(452.0+x*(-1449.0+x*(2513.0 + +x*(-2529.+x*(1472.0+x*(-452.2+x*(51.34+x*2.370)))))))))); + } + else + { + thr = 1.0; + } + + if( thrRndm() ) + { + pe=0.; + pass=false; + } + else + { + pe += fRand->Gaus(0., 0.03); + } } -double HitDigitizer::DoTruncate(const double x, const double precision) { - // Based on WCSimWCDigitizerBase::AddNewDigit in WCSimWCDigitizer.hh - // digitised hit information does not have infinite precision - // so need to round the charge and time information - // - // The following is based on WCSimWCDigitizerBas::Truncate - // in WCSimWCDigitizer.hh - if(precision < 1E-10) { - return x; - } - return precision * (int)(x / precision); +double HitDigitizer::DoTruncate(const double x, const double precision) +{ +// Based on WCSimWCDigitizerBase::AddNewDigit in WCSimWCDigitizer.hh +// digitised hit information does not have infinite precision +// so need to round the charge and time information +// +// The following is based on WCSimWCDigitizerBas::Truncate +// in WCSimWCDigitizer.hh + if(precision < 1E-10){ return x; } + return precision * (int)(x/precision); } diff --git a/cpp/src/HitTube.cc b/cpp/src/HitTube.cc index d3de2eb..a7fd84d 100644 --- a/cpp/src/HitTube.cc +++ b/cpp/src/HitTube.cc @@ -1,23 +1,26 @@ #include "HitTube.h" -HitTube::HitTube(int id) { - fNRawPE = 0; - fPhotoElectrons.clear(); +HitTube::HitTube(int id) +{ + fNRawPE=0; + fPhotoElectrons.clear(); - fNDigiHits = 0; - fTimeDigi.clear(); - fChargeDigi.clear(); - fParentCompDigi.clear(); + fNDigiHits=0; + fTimeDigi.clear(); + fChargeDigi.clear(); + fParentCompDigi.clear(); - fTubeID = id; + fTubeID = id; } -HitTube::~HitTube() { - vector().swap(fPhotoElectrons); - // vector>().swap( fPhotoElectrons ); - // vector().swap( fTrueHitInfo ); - vector().swap(fTimeDigi); - vector().swap(fChargeDigi); - vector>().swap(fParentCompDigi); +HitTube::~HitTube() +{ + vector().swap(fPhotoElectrons ); + // vector>().swap( fPhotoElectrons ); + // vector().swap( fTrueHitInfo ); + + vector().swap( fTimeDigi ); + vector().swap( fChargeDigi ); + vector>().swap( fParentCompDigi ); } diff --git a/cpp/src/HitTubeCollection.cc b/cpp/src/HitTubeCollection.cc index b196443..a68d22b 100644 --- a/cpp/src/HitTubeCollection.cc +++ b/cpp/src/HitTubeCollection.cc @@ -1,53 +1,67 @@ #include "HitTubeCollection.h" -HitTubeCollection::HitTubeCollection() : fNTrueHitsTotal(0), fNDigiHitsTotal(0) { - fPHs.clear(); +HitTubeCollection::HitTubeCollection() : +fNTrueHitsTotal(0), +fNDigiHitsTotal(0) +{ + fPHs.clear(); fTubeList.clear(); } -HitTubeCollection::~HitTubeCollection() { - this->Clear(); +HitTubeCollection::~HitTubeCollection() +{ + this->Clear(); } -void HitTubeCollection::Clear() { - map::iterator itr; - for(itr = fPHs.begin(); itr != fPHs.end(); ++itr) { - delete itr->second; - itr->second = NULL; - } - fPHs.clear(); - vector().swap(fTubeList); +void HitTubeCollection::Clear() +{ + map::iterator itr; + for(itr=fPHs.begin(); itr!=fPHs.end(); ++itr) + { + delete itr->second; itr->second=NULL; + } + fPHs.clear(); + vector().swap(fTubeList); } -void HitTubeCollection::AddHitTube(const int id) { - if(fPHs.count(id) == 0) { - fPHs[id] = new HitTube(id); +void HitTubeCollection::AddHitTube(const int id) +{ + if( fPHs.count(id)==0 ) + { + fPHs[id] = new HitTube(id); fTubeList.push_back(id); - } + } } -void HitTubeCollection::AddTrueHit(const int tube_id, const float time, const int parent_id) { +void HitTubeCollection::AddTrueHit(const int tube_id, const float time, const int parent_id) +{ this->AddHitTube(tube_id); fPHs[tube_id]->AddRawPE(time, parent_id); } -void HitTubeCollection::AddDigiHit(const int id, const float time, const float charge) { +void HitTubeCollection::AddDigiHit(const int id, const float time, const float charge) +{ this->AddHitTube(id); - fPHs[id]->AddDigiHit(time, charge); + fPHs[id]->AddDigiHit(time, charge); } -int HitTubeCollection::GetTotalNumOfTrueHits() { - int n = 0; - for(fItr = fPHs.begin(); fItr != fPHs.end(); fItr++) { - n += fItr->second->GetNRawPE(); - } - return n; + +int HitTubeCollection::GetTotalNumOfTrueHits() +{ + int n = 0; + for(fItr=fPHs.begin(); fItr!=fPHs.end(); fItr++) + { + n += fItr->second->GetNRawPE(); + } + return n; } -int HitTubeCollection::GetTotalNumOfDigiHits() { - int n = 0; - for(fItr = fPHs.begin(); fItr != fPHs.end(); fItr++) { - n += fItr->second->GetNDigiHits(); - } - return n; +int HitTubeCollection::GetTotalNumOfDigiHits() +{ + int n = 0; + for(fItr=fPHs.begin(); fItr!=fPHs.end(); fItr++) + { + n += fItr->second->GetNDigiHits(); + } + return n; } diff --git a/cpp/src/MDTManager.cc b/cpp/src/MDTManager.cc index e9ab213..708f04f 100644 --- a/cpp/src/MDTManager.cc +++ b/cpp/src/MDTManager.cc @@ -1,125 +1,130 @@ #include "MDTManager.h" -MDTManager::MDTManager(int seed) { - fRndm = new MTRandom(seed); - fTrigAlgo = new TriggerAlgo(); - fDgtzr = new HitDigitizer(fRndm->Integer(1000000)); - - fPMTResp.clear(); - fDark.clear(); - fPHC.clear(); - fTrigInfo.clear(); +MDTManager::MDTManager(int seed) +{ + fRndm = new MTRandom( seed ); + fTrigAlgo = new TriggerAlgo(); + fDgtzr = new HitDigitizer( fRndm->Integer(1000000) ); + + fPMTResp.clear(); + fDark.clear(); + fPHC.clear(); + fTrigInfo.clear(); } -MDTManager::~MDTManager() { - if(fTrigAlgo) { - delete fTrigAlgo; - fTrigAlgo = NULL; - } - if(fRndm) { - delete fRndm; - fRndm = NULL; - } - - map::iterator iPMTResp; - for(iPMTResp = fPMTResp.begin(); iPMTResp != fPMTResp.end(); iPMTResp++) { - std::cout << " Deleting" << iPMTResp->first << std::endl; - delete iPMTResp->second; - iPMTResp->second = NULL; - } - fPMTResp.clear(); - - map::iterator iDark; - for(iDark = fDark.begin(); iDark != fDark.end(); iDark++) { - delete iDark->second; - iDark->second = NULL; - } - fDark.clear(); - - map::iterator iPHC; - for(iPHC = fPHC.begin(); iPHC != fPHC.end(); iPHC++) { - delete iPHC->second; - iPHC->second = NULL; - } - fPHC.clear(); - - map::iterator iTrigInfo; - for(iTrigInfo = fTrigInfo.begin(); iTrigInfo != fTrigInfo.end(); iTrigInfo++) { - delete iTrigInfo->second; - iTrigInfo->second = NULL; - } - fTrigInfo.clear(); +MDTManager::~MDTManager() +{ + if( fTrigAlgo ){ delete fTrigAlgo; fTrigAlgo = NULL; } + if( fRndm ){ delete fRndm; fRndm = NULL; } + + map::iterator iPMTResp; + for(iPMTResp=fPMTResp.begin(); iPMTResp!=fPMTResp.end(); iPMTResp++) + { + std::cout<<" Deleting" << iPMTResp->first <second; iPMTResp->second = NULL; + } + fPMTResp.clear(); + + map::iterator iDark; + for(iDark=fDark.begin(); iDark!=fDark.end(); iDark++) + { + delete iDark->second; iDark->second = NULL; + } + fDark.clear(); + + map::iterator iPHC; + for(iPHC=fPHC.begin(); iPHC!=fPHC.end(); iPHC++) + { + delete iPHC->second; iPHC->second = NULL; + } + fPHC.clear(); + + map::iterator iTrigInfo; + for(iTrigInfo=fTrigInfo.begin(); iTrigInfo!=fTrigInfo.end(); iTrigInfo++) + { + delete iTrigInfo->second; iTrigInfo->second = NULL; + } + fTrigInfo.clear(); } -void MDTManager::DoAddDark(const string& pmtname) { - if(this->HasThisPMTType(pmtname)) { - fDark[pmtname]->AddPhotoElectrons(fPHC[pmtname]); - } +void MDTManager::DoAddDark(const string &pmtname) +{ + if( this->HasThisPMTType(pmtname) ) + { + fDark[pmtname]->AddPhotoElectrons(fPHC[pmtname]); + } } -void MDTManager::DoDigitize(const string& pmtname) { - if(this->HasThisPMTType(pmtname)) { - fDgtzr->Digitize(fPHC[pmtname], fPMTResp[pmtname]); - // cout<<" # true hits: " << fPHC[pmtname]->GetTotalNumOfTrueHits() +void MDTManager::DoDigitize(const string &pmtname) +{ + if( this->HasThisPMTType(pmtname) ) + { + fDgtzr->Digitize(fPHC[pmtname], fPMTResp[pmtname]); + //cout<<" # true hits: " << fPHC[pmtname]->GetTotalNumOfTrueHits() // <<" # digitized hits: " << fPHC[pmtname]->GetTotalNumOfDigiHits() // <HasThisPMTType(pmtname)) { - fTrigAlgo->NDigits(fPHC[pmtname], fTrigInfo[pmtname]); - } +void MDTManager::DoTrigger(const string &pmtname) +{ + if( this->HasThisPMTType(pmtname) ) + { + fTrigAlgo->NDigits(fPHC[pmtname], fTrigInfo[pmtname]); + } } -void MDTManager::DoAddAfterpulse(const string& pmtname) { - if(this->HasThisPMTType(pmtname)) { - fDark[pmtname]->AddAfterpulse(fPHC[pmtname], fDgtzr, fPMTResp[pmtname]); - } +void MDTManager::DoAddAfterpulse(const string &pmtname) +{ + if( this->HasThisPMTType(pmtname) ) + { + fDark[pmtname]->AddAfterpulse(fPHC[pmtname], fDgtzr, fPMTResp[pmtname]); + } } -void MDTManager::DoInitialize() { - map::iterator iTrigInfo; - for(iTrigInfo = fTrigInfo.begin(); iTrigInfo != fTrigInfo.end(); iTrigInfo++) { - iTrigInfo->second->Clear(); - } - - map::iterator iPHC; - for(iPHC = fPHC.begin(); iPHC != fPHC.end(); iPHC++) { - iPHC->second->Clear(); - } +void MDTManager::DoInitialize() +{ + map::iterator iTrigInfo; + for(iTrigInfo=fTrigInfo.begin(); iTrigInfo!=fTrigInfo.end(); iTrigInfo++) + { + iTrigInfo->second->Clear(); + } + + map::iterator iPHC; + for(iPHC=fPHC.begin(); iPHC!=fPHC.end(); iPHC++) + { + iPHC->second->Clear(); + } } -void MDTManager::SetHitTubeCollection(HitTubeCollection* hc, const string& pmtname) { - if(this->HasThisPMTType(pmtname)) { - if(fPHC[pmtname]) { - delete fPHC[pmtname]; - fPHC[pmtname] = NULL; - } - fPHC[pmtname] = hc; - } +void MDTManager::SetHitTubeCollection(HitTubeCollection *hc, const string &pmtname) +{ + if( this->HasThisPMTType(pmtname) ) + { + if( fPHC[pmtname] ){ delete fPHC[pmtname]; fPHC[pmtname] = NULL; } + fPHC[pmtname] = hc; + } } -void MDTManager::RegisterPMTType(const string& pmtname, PMTResponse* pmtResp) { - fTrigInfo[pmtname] = new TriggerInfo(); - fPHC[pmtname] = new HitTubeCollection(); - fDark[pmtname] = new PMTNoise(fRndm->Integer(1000000), pmtname); - - if(pmtResp == 0) { - fPMTResp[pmtname] = new GenericPMTResponse(); - } - else { - fPMTResp[pmtname] = pmtResp; - } - fPMTResp[pmtname]->Initialize(fRndm->Integer(10000000), pmtname); +void MDTManager::RegisterPMTType(const string &pmtname, PMTResponse *pmtResp) +{ + fTrigInfo[pmtname] = new TriggerInfo(); + fPHC[pmtname] = new HitTubeCollection(); + fDark[pmtname] = new PMTNoise(fRndm->Integer(1000000), pmtname); + + if( pmtResp==0 ){ fPMTResp[pmtname] = new GenericPMTResponse(); } + else{ fPMTResp[pmtname] = pmtResp; } + fPMTResp[pmtname]->Initialize(fRndm->Integer(10000000), pmtname); } -bool MDTManager::HasThisPMTType(const string& pmtname) { - bool b = true; - if(fPHC.count(pmtname) == 0) { - std::cout << " [ERROR] MDTManager::HasPMTType " << std::endl; - std::cout << " PMT type: " << pmtname << " is not registered" << endl; - b = false; - } - return b; +bool MDTManager::HasThisPMTType(const string &pmtname) +{ + bool b = true; + if( fPHC.count(pmtname)==0 ) + { + std::cout<<" [ERROR] MDTManager::HasPMTType " < #include -const double kPI = 3.14159265358979323846; // TMath::Pi +const double kPI = 3.14159265358979323846; // TMath::Pi // Taken from $ROOTSYS/math/mathcore/TRadom.cxx and TRandom3.cxx -const int MTRandom::kM = 397; -const int MTRandom::kN = 624; -const unsigned int MTRandom::kTemperingMaskB = 0x9d2c5680; -const unsigned int MTRandom::kTemperingMaskC = 0xefc60000; -const unsigned int MTRandom::kUpperMask = 0x80000000; -const unsigned int MTRandom::kLowerMask = 0x7fffffff; -const unsigned int MTRandom::kMatrixA = 0x9908b0df; - -const double MTRandom::kC1 = 1.448242853; -const double MTRandom::kC2 = 3.307147487; -const double MTRandom::kC3 = 1.46754004; -const double MTRandom::kD1 = 1.036467755; -const double MTRandom::kD2 = 5.295844968; -const double MTRandom::kD3 = 3.631288474; -const double MTRandom::kHm = 0.483941449; -const double MTRandom::kZm = 0.107981933; -const double MTRandom::kHp = 4.132731354; -const double MTRandom::kZp = 18.52161694; +const int MTRandom::kM = 397; +const int MTRandom::kN = 624; +const unsigned int MTRandom::kTemperingMaskB = 0x9d2c5680; +const unsigned int MTRandom::kTemperingMaskC = 0xefc60000; +const unsigned int MTRandom::kUpperMask = 0x80000000; +const unsigned int MTRandom::kLowerMask = 0x7fffffff; +const unsigned int MTRandom::kMatrixA = 0x9908b0df; + +const double MTRandom::kC1 = 1.448242853; +const double MTRandom::kC2 = 3.307147487; +const double MTRandom::kC3 = 1.46754004; +const double MTRandom::kD1 = 1.036467755; +const double MTRandom::kD2 = 5.295844968; +const double MTRandom::kD3 = 3.631288474; +const double MTRandom::kHm = 0.483941449; +const double MTRandom::kZm = 0.107981933; +const double MTRandom::kHp = 4.132731354; +const double MTRandom::kZp = 18.52161694; const double MTRandom::kPhln = 0.4515827053; -const double MTRandom::kHm1 = 0.516058551; -const double MTRandom::kHp1 = 3.132731354; -const double MTRandom::kHzm = 0.375959516; +const double MTRandom::kHm1 = 0.516058551; +const double MTRandom::kHp1 = 3.132731354; +const double MTRandom::kHzm = 0.375959516; const double MTRandom::kHzmp = 0.591923442; /*zhm 0.967882898*/ @@ -34,169 +34,155 @@ const double MTRandom::kBs = 0.2452635696; const double MTRandom::kCs = 0.2770276848; const double MTRandom::kB = 0.5029324303; const double MTRandom::kX0 = 0.4571828819; -const double MTRandom::kYm = 0.187308492; -const double MTRandom::kS = 0.7270572718; +const double MTRandom::kYm = 0.187308492 ; +const double MTRandom::kS = 0.7270572718 ; const double MTRandom::kT = 0.03895759111; -void MTRandom::SetSeed(int s) { - fMt[0] = s; - fCount624 = 624; - // use multipliers from Knuth's "Art of Computer Programming" Vol. 2, 3rd Ed. p.106 - for(int i = 1; i < 624; i++) { - fMt[i] = (1812433253 * (fMt[i - 1] ^ (fMt[i - 1] >> 30)) + i); - } +void MTRandom::SetSeed(int s) +{ + fMt[0] = s; + fCount624 = 624; + // use multipliers from Knuth's "Art of Computer Programming" Vol. 2, 3rd Ed. p.106 + for(int i=1; i<624; i++) { + fMt[i] = (1812433253 * ( fMt[i-1] ^ ( fMt[i-1] >> 30)) + i ); + } } -double MTRandom::Gaus(double mean, double sigma) { - double result; - double rn, x, y, z; - do { - y = Rndm(); - - if(y > kHm1) { - result = kHp * y - kHp1; - break; - } - - else if(y < kZm) { - rn = kZp * y - 1; - result = (rn > 0) ? (1 + rn) : (-1 + rn); - break; - } - - else if(y < kHm) { - rn = Rndm(); - rn = rn - 1 + rn; - z = (rn > 0) ? 2 - rn : -2 - rn; - if((kC1 - y) * (kC3 + std::abs(z)) < kC2) { - result = z; - break; - } - else { - x = rn * rn; - if((y + kD1) * (kD3 + x) < kD2) { - result = rn; - break; - } - else if(kHzmp - y < exp(-(z * z + kPhln) / 2)) { - result = z; - break; - } - else if(y + kHzm < exp(-(x + kPhln) / 2)) { - result = rn; - break; - } - } - } - - while(1) { - x = Rndm(); - y = kYm * Rndm(); - z = kX0 - kS * x - y; - if(z > 0) - rn = 2 + y / x; - else { - x = 1 - x; - y = kYm - y; - rn = -(2 + y / x); - } - if((y - kAs + x) * (kCs + x) + kBs < 0) { - result = rn; - break; - } - else if(y < x + kT) - if(rn * rn < 4 * (kB - log(x))) { - result = rn; - break; - } - } - } - while(0); - return mean + sigma * result; +double MTRandom::Gaus(double mean, double sigma) +{ + double result; + double rn,x,y,z; + do { + y = Rndm(); + + if (y>kHm1) { + result = kHp*y-kHp1; break; } + + else if (y0) ? (1+rn) : (-1+rn); + break; + } + + else if (y0) ? 2-rn : -2-rn; + if ((kC1-y)*(kC3+std::abs(z))0) + rn = 2+y/x; + else { + x = 1-x; + y = kYm-y; + rn = -(2+y/x); + } + if ((y-kAs+x)*(kCs+x)+kBs<0) { + result = rn; break; } + else if (y= kN) { - int i; - - for(i = 0; i < kN - kM; i++) { - y = (fMt[i] & kUpperMask) | (fMt[i + 1] & kLowerMask); - fMt[i] = fMt[i + kM] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); - } - - for(; i < kN - 1; i++) { - y = (fMt[i] & kUpperMask) | (fMt[i + 1] & kLowerMask); - fMt[i] = fMt[i + kM - kN] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); - } - - y = (fMt[kN - 1] & kUpperMask) | (fMt[0] & kLowerMask); - fMt[kN - 1] = fMt[kM - 1] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); - fCount624 = 0; - } - y = fMt[fCount624++]; - y ^= (y >> 11); - y ^= ((y << 7) & kTemperingMaskB); - y ^= ((y << 15) & kTemperingMaskC); - y ^= (y >> 18); - - // 2.3283064365386963e-10 == 1./(max+1) -> then returned value cannot be = 1.0 - if(y) - return { ((double)y * 2.3283064365386963e-10) }; // * Power(2,-32) - return Rndm(); +//inline double MTRandom::Rndm() +double MTRandom::Rndm() +{ + unsigned int y; + if (fCount624 >= kN) { + int i; + + for (i=0; i < kN-kM; i++) { + y = (fMt[i] & kUpperMask) | (fMt[i+1] & kLowerMask); + fMt[i] = fMt[i+kM] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); + } + + for ( ; i < kN-1 ; i++) { + y = (fMt[i] & kUpperMask) | (fMt[i+1] & kLowerMask); + fMt[i] = fMt[i+kM-kN] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); + } + + y = (fMt[kN-1] & kUpperMask) | (fMt[0] & kLowerMask); + fMt[kN-1] = fMt[kM-1] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0); + fCount624 = 0; + } + y = fMt[fCount624++]; + y ^= (y >> 11); + y ^= ((y << 7 ) & kTemperingMaskB ); + y ^= ((y << 15) & kTemperingMaskC ); + y ^= (y >> 18); + + // 2.3283064365386963e-10 == 1./(max+1) -> then returned value cannot be = 1.0 + if( y ) return { ( (double) y * 2.3283064365386963e-10) }; // * Power(2,-32) + return Rndm(); } -int MTRandom::Poisson(double mean) { - int n; - if(mean <= 0) - return 0; - if(mean < 25) { - double expmean = exp(-mean); - double pir = 1; - n = -1; - while(1) { - n++; - pir *= Rndm(); - if(pir <= expmean) - break; - } - return n; - } - // for large value we use inversion method - else if(mean < 1E9) { - double em, t, y; - - double sq = sqrt(2.0 * mean); - double alxm = log(mean); - double g = mean * alxm - lgamma(mean + 1.0); - do { - do { - y = tan(kPI * Rndm()); - em = sq * y + mean; - } - while(em < 0.0); - - em = floor(em); - t = 0.9 * (1.0 + y * y) * exp(em * alxm - lgamma(em + 1.0) - g); - } - while(Rndm() > t); - return static_cast(em); - } - else { - // use Gaussian approximation vor very large values - return int(Gaus(0., 1.) * sqrt(mean) + mean + 0.5); - } +int MTRandom::Poisson(double mean) +{ + int n; + if (mean <= 0) return 0; + if (mean < 25) { + double expmean = exp(-mean); + double pir = 1; + n = -1; + while(1) { + n++; + pir *= Rndm(); + if (pir <= expmean) break; + } + return n; + } + // for large value we use inversion method + else if (mean < 1E9) { + double em, t, y; + + double sq = sqrt(2.0*mean); + double alxm = log(mean); + double g = mean*alxm - lgamma(mean + 1.0); + do { + do { + y = tan(kPI*Rndm()); + em = sq*y + mean; + } while( em < 0.0 ); + + em = floor(em); + t = 0.9*(1.0 + y*y)* exp(em*alxm - lgamma(em + 1.0) - g); + } while( Rndm()>t ); + return static_cast (em); + } + else { + // use Gaussian approximation vor very large values + return int(Gaus(0.,1.)*sqrt(mean) + mean +0.5); + } } + // Generate random number that follows given 1D histogram (CDF) -double MTRandom::Histogram(vector& edgeLow, vector& binCenter, vector& cdf) { - double value = this->Rndm(); - auto low = lower_bound(cdf.begin(), cdf.end(), value); - int index = low - cdf.begin(); - if(*low != value) { - index -= 1; - } - double dx = binCenter[index + 1] - binCenter[index]; - return binCenter[index] + dx * ((value - cdf[index]) / (cdf[index + 1] - cdf[index])); +double MTRandom::Histogram(vector &edgeLow, + vector &binCenter, + vector &cdf) +{ + double value = this->Rndm(); + auto low = lower_bound(cdf.begin(), cdf.end(), value); + int index = low - cdf.begin(); + if( *low!=value ){ index -= 1; } + double dx = binCenter[index+1] - binCenter[index]; + return binCenter[index] + dx*( (value - cdf[index])/(cdf[index+1] - cdf[index]) ); } diff --git a/cpp/src/PMTAfterpulse.cc b/cpp/src/PMTAfterpulse.cc index 74854f3..7068acc 100644 --- a/cpp/src/PMTAfterpulse.cc +++ b/cpp/src/PMTAfterpulse.cc @@ -1,80 +1,88 @@ #include "PMTAfterpulse.h" #include "Configuration.h" -PMTAfterpulse::PMTAfterpulse() : fSlope(0.3523), fIntercept(0.5662), fDoAdd(0), fTxtFileCDF("") { - fCDF_BinEdgeLow.clear(); - fCDF_BinEdgeUp.clear(); - fCDF_BinCenter.clear(); - fCDF.clear(); +PMTAfterpulse::PMTAfterpulse() : +fSlope(0.3523), +fIntercept(0.5662), +fDoAdd(0), +fTxtFileCDF("") +{ + fCDF_BinEdgeLow.clear(); + fCDF_BinEdgeUp.clear(); + fCDF_BinCenter.clear(); + fCDF.clear(); - Configuration* Conf = Configuration::GetInstance(); - Conf->GetValue("APRateSlope", fSlope); - Conf->GetValue("APRateIntercept", fIntercept); - Conf->GetValue("APTimeCDFFile", fTxtFileCDF); - Conf->GetValue("APDoAdd", fDoAdd); + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue("APRateSlope", fSlope); + Conf->GetValue("APRateIntercept", fIntercept); + Conf->GetValue("APTimeCDFFile", fTxtFileCDF); + Conf->GetValue("APDoAdd", fDoAdd); - if(fDoAdd == 1) { - this->LoadTimingCDF(fTxtFileCDF); - } + if( fDoAdd==1 ){ this->LoadTimingCDF(fTxtFileCDF); } } -PMTAfterpulse::~PMTAfterpulse() { - vector().swap(fCDF_BinEdgeLow); - vector().swap(fCDF_BinEdgeUp); - vector().swap(fCDF_BinCenter); - vector().swap(fCDF); +PMTAfterpulse::~PMTAfterpulse() +{ + vector().swap( fCDF_BinEdgeLow ); + vector().swap( fCDF_BinEdgeUp ); + vector().swap( fCDF_BinCenter ); + vector().swap( fCDF ); } -bool PMTAfterpulse::GenerateAfterpulse(const float charge, const vector& composition, MTRandom* r) { - // Do not add afterpulsing by default - if(fDoAdd == 0) { - return false; - } +bool PMTAfterpulse::GenerateAfterpulse(const float charge, const vector &composition, MTRandom *r) +{ + // Do not add afterpulsing by default + if( fDoAdd==0 ){ return false; } - float rate = fSlope * charge + fIntercept; - bool afterpulse = false; - if(composition.size() == 1 && composition[0] == -1) { - return afterpulse; - } + float rate = fSlope*charge + fIntercept; + bool afterpulse = false; + if( composition.size()==1 && composition[0]==-1 ){ return afterpulse; } - if(rate > 1.0) { - afterpulse = true; - } - else if(rate < 1.0) { - afterpulse = r->Rndm() < rate ? true : false; - } - return afterpulse; + if( rate>1.0 ) + { + afterpulse = true; + } + else if( rate<1.0 ) + { + afterpulse = r->Rndm()Histogram(fCDF_BinEdgeLow, fCDF_BinCenter, fCDF); - return time + dt * 1000.; +float PMTAfterpulse::GetAfterpulseTime(const float time, MTRandom *r) +{ + float dt = r->Histogram(fCDF_BinEdgeLow, fCDF_BinCenter, fCDF); + return time + dt*1000.; } -void PMTAfterpulse::LoadTimingCDF(const string& infiletxt) { - string aline; - string svalue; - ifstream fin(infiletxt); - if(!fin.is_open()) { - cout << " [ERROR] PMTAfterpulse::LoadTimingCDF " << endl; - cout << " - Cannot opent file: " << infiletxt << endl; - exit(-1); - } +void PMTAfterpulse::LoadTimingCDF(const string &infiletxt) +{ + string aline; + string svalue; + ifstream fin(infiletxt); + if( !fin.is_open() ) + { + cout<<" [ERROR] PMTAfterpulse::LoadTimingCDF " <> svalue; - fCDF_BinEdgeLow.push_back(atof(svalue.c_str())); - ss >> svalue; - fCDF_BinCenter.push_back(atof(svalue.c_str())); - ss >> svalue; - fCDF_BinEdgeUp.push_back(atof(svalue.c_str())); - ss >> svalue; - fCDF.push_back(atof(svalue.c_str())); - if(fCDF[nRead] == 1.0) { - break; - } - } - fin.close(); + int nRead = 0; + while( std::getline(fin, aline) ) + { + stringstream ss(aline); + ss >> svalue; + fCDF_BinEdgeLow.push_back( atof(svalue.c_str()) ); + ss >> svalue; + fCDF_BinCenter.push_back( atof(svalue.c_str()) ); + ss >> svalue; + fCDF_BinEdgeUp.push_back( atof(svalue.c_str()) ); + ss >> svalue; + fCDF.push_back( atof(svalue.c_str()) ); + if( fCDF[nRead]==1.0 ) + { + break; + } + } + fin.close(); } diff --git a/cpp/src/PMTNoise.cc b/cpp/src/PMTNoise.cc index e528632..b5f135a 100644 --- a/cpp/src/PMTNoise.cc +++ b/cpp/src/PMTNoise.cc @@ -1,246 +1,281 @@ #include "PMTNoise.h" #include "Configuration.h" -#include "HitDigitizer.h" #include "HitTube.h" +#include "HitDigitizer.h" #include "PMTResponse.h" -PMTNoise::PMTNoise(const int seed, const string& pmtname) : - fNPMTs(10184), - fMinTubeID(1), - fMaxTubeID(10184), - fWinLow(0.), - fWinUp(30000.), - fWindow(4000.), - fDarkRate(1.), - fConvRate(1.126), - fDarkMode(1), - fNnoise(0), - fPMTType(pmtname) { - fRand = new MTRandom(seed); - fAftpulse = new PMTAfterpulse(); - - fNoisePMT.clear(); - fNoiseTime.clear(); - - map s; - s["DarkAddMode"] = "DarkAddMode"; - s["DarkRate"] = "DarkRate"; - s["DarkM0WindowLow"] = "DarkM0WindowLow"; - s["DarkM0WindowUp"] = "DarkM0WindowUp"; - s["DarkM1Window"] = "DarkM1Window"; - s["NumOfTubes"] = "NumOfTubes"; - s["MinTubeID"] = "MinTubeID"; - s["MaxTubeID"] = "MaxTubeID"; - - if(fPMTType != "") { - map::iterator i; - for(i = s.begin(); i != s.end(); i++) { - i->second += "_" + fPMTType; - } - } - - Configuration* Conf = Configuration::GetInstance(); - Conf->GetValue(s["DarkAddMode"], fDarkMode); - Conf->GetValue(s["DarkRate"], fDarkRate); - Conf->GetValue(s["DarkM0WindowLow"], fWinLow); - Conf->GetValue(s["DarkM0WindowUp"], fWinUp); - Conf->GetValue(s["DarkM1Window"], fWindow); +PMTNoise::PMTNoise(const int seed, const string &pmtname) : +fNPMTs( 10184 ), +fMinTubeID( 1 ), +fMaxTubeID( 10184 ), +fWinLow( 0. ), +fWinUp( 30000. ), +fWindow( 4000. ), +fDarkRate( 1. ), +fConvRate( 1.126 ), +fDarkMode( 1 ), +fNnoise( 0 ), +fPMTType( pmtname ) +{ + fRand = new MTRandom(seed); + fAftpulse = new PMTAfterpulse(); + + fNoisePMT.clear(); + fNoiseTime.clear(); + + map s; + s["DarkAddMode"] = "DarkAddMode"; + s["DarkRate"] = "DarkRate"; + s["DarkM0WindowLow"] = "DarkM0WindowLow"; + s["DarkM0WindowUp"] = "DarkM0WindowUp"; + s["DarkM1Window"] = "DarkM1Window"; + s["NumOfTubes"] = "NumOfTubes"; + s["MinTubeID"] = "MinTubeID"; + s["MaxTubeID"] = "MaxTubeID"; + + if( fPMTType!="" ) + { + map::iterator i; + for(i=s.begin(); i!=s.end(); i++) + { + i->second += "_" + fPMTType; + } + } + + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue(s["DarkAddMode"], fDarkMode); + Conf->GetValue(s["DarkRate"], fDarkRate); + Conf->GetValue(s["DarkM0WindowLow"], fWinLow); + Conf->GetValue(s["DarkM0WindowUp"], fWinUp); + Conf->GetValue(s["DarkM1Window"], fWindow); Conf->GetValue(s["NumOfTubes"], fNPMTs); Conf->GetValue(s["MinTubeID"], fMinTubeID); Conf->GetValue(s["MaxTubeID"], fMaxTubeID); + } -PMTNoise::~PMTNoise() { - if(!fRand) { - delete fRand; - fRand = NULL; - } - if(fAftpulse) { - delete fAftpulse; - fAftpulse = NULL; - } +PMTNoise::~PMTNoise() +{ + if( !fRand ){ delete fRand; fRand = NULL;} + if( fAftpulse ){ delete fAftpulse; fAftpulse = NULL; } } -void PMTNoise::SetNumberOfPMTs(const int npmts) { - fNPMTs = npmts; + +void PMTNoise::SetNumberOfPMTs(const int npmts) +{ + fNPMTs = npmts; } -void PMTNoise::SetMinTubeID(const int tubeID) { - fMinTubeID = tubeID; +void PMTNoise::SetMinTubeID(const int tubeID) +{ + fMinTubeID = tubeID; } -void PMTNoise::SetMaxTubeID(const int tubeID) { - fMaxTubeID = tubeID; +void PMTNoise::SetMaxTubeID(const int tubeID) +{ + fMaxTubeID = tubeID; } -void PMTNoise::SetWindowLow(const double wlow) { - fWinLow = wlow; +void PMTNoise::SetWindowLow(const double wlow) +{ + fWinLow = wlow; } -void PMTNoise::SetWindowUp(const double wup) { - fWinUp = wup; + +void PMTNoise::SetWindowUp(const double wup) +{ + fWinUp = wup; } -void PMTNoise::SetDarkRate(const double rate) { - fDarkRate = rate; + +void PMTNoise::SetDarkRate(const double rate) +{ + fDarkRate = rate; } -void PMTNoise::GenerateDarkNoise(double tWinLow, double tWinUp, bool isDPE, const bool verbose) { - fAveNoise = (double)fNPMTs * fDarkRate * (tWinUp - tWinLow); - // Generate photoelectrons corresponding given dark rate +void PMTNoise::GenerateDarkNoise(double tWinLow, double tWinUp, bool isDPE, const bool verbose) +{ + fAveNoise=(double)fNPMTs*fDarkRate*(tWinUp - tWinLow); + // Generate photoelectrons corresponding given dark rate // fConvRate: a correction that accounts for the effect of DAQ efficiency // NOTE: digi hit having charge < 1 p.e can be rejected by DAQ - if(isDPE) { - fAveNoise = fAveNoise * fConvRate; - } - - // fDarkRate and windowSize are given in kHz and ns, respectively - fAveNoise /= 1000000.; - - fNoisePMT.clear(); - fNoiseTime.clear(); - - fNnoise = fRand->Poisson(fAveNoise); - fNoisePMT.reserve(fNnoise); - fNoiseTime.reserve(fNnoise); - int iTubeID = 0; - for(int i = 0; i < fNnoise; i++) { - iTubeID = fMinTubeID + fRand->Integer(fNPMTs); - if(iTubeID > fMaxTubeID) { - cout << " [ERROR] PMTNoise::GenerateDarkNoise " << endl; - cout << " - Generated tube ID:" << iTubeID << endl; - cout << " - EXceeding max tube ID:" << fMaxTubeID << endl; - cout << " -> EXIT " << endl; - exit(-1); - } - fNoisePMT[i] = iTubeID; - fNoiseTime[i] = fRand->Uniform(tWinLow, tWinUp); - } - - if(verbose) { - cout << " [INFO] PMTNoise::GenerateDarkNoise " << endl; - cout << " - Window Low:" << fWinLow << " (ns)" << endl; - cout << " - Window Up:" << fWinUp << " (ns)" << endl; - cout << " - # PMTs:" << fNPMTs << endl; - cout << " - Dark rate:" << fDarkRate << " (kHz)" << endl; - cout << " - Mean # noise hits:" << fAveNoise << endl; - cout << " - # generated noise hits:" << fNnoise << endl; - } + if( isDPE ){ fAveNoise = fAveNoise*fConvRate; } + + // fDarkRate and windowSize are given in kHz and ns, respectively + fAveNoise/=1000000.; + + fNoisePMT.clear(); + fNoiseTime.clear(); + + fNnoise = fRand->Poisson( fAveNoise ); + fNoisePMT.reserve( fNnoise ); + fNoiseTime.reserve( fNnoise ); + int iTubeID=0; + for(int i=0; iInteger( fNPMTs ); + if( iTubeID>fMaxTubeID ) + { + cout<<" [ERROR] PMTNoise::GenerateDarkNoise " < EXIT " <Uniform(tWinLow, tWinUp); + } + + if( verbose ) + { + cout<<" [INFO] PMTNoise::GenerateDarkNoise " <> range; - if(fDarkMode == 1) { - this->FindRanges(hc, range); - } - else { - range.push_back(pair(fWinLow, fWinUp)); - } - - for(unsigned int i = 0; i < range.size(); i++) { - this->Add(hc, range[i].first, range[i].second); - } +void PMTNoise::AddPhotoElectrons(HitTubeCollection* hc) +{ + vector< pair > range; + if( fDarkMode==1 ) + { + this->FindRanges(hc, range); + } + else + { + range.push_back( pair(fWinLow, fWinUp) ); + } + + for(unsigned int i=0; iAdd(hc, range[i].first, range[i].second); + } } // Based on WCSimWCAddDarkNoise::FindDarkNoiseRanges in WCSimWCAddDarkNoise.cc -void PMTNoise::FindRanges(HitTubeCollection* hc, vector>& range) { - // - Add photoelectrons corresponding dark current - // to each true Cherenkov hit around +- "fWindow"/2 - // - Here these time windows are calculated - - range.clear(); - const int nTrueHits = hc->GetTotalNumOfTrueHits(); - vector> tmp; - tmp.reserve(nTrueHits); - - for(hc->Begin(); !hc->IsEnd(); hc->Next()) { - HitTube* aPH = &(*hc)(); - const int nPE = aPH->GetNRawPE(); - for(int i = 0; i < nPE; i++) { - float t = aPH->GetTimeRaw(i); - double tLow = t - fWindow / 2.; - double tUp = t + fWindow / 2.; - tmp.push_back(pair(tLow, tUp)); - } - } - - // If no true hits are stored, add a dummy such that no dark noise is added in later stage - if(tmp.size() == 0) { - range.push_back(pair(0., 0.)); - } - else { - // Sort the "tmp" vector in increasing order, then check whether or not - // the windows defined above overlapp with other window - std::sort(tmp.begin(), tmp.end()); - - vector>::iterator itr2 = tmp.begin(); - pair cur = *(itr2)++; - for(; itr2 != tmp.end(); itr2++) { - if(cur.second >= itr2->first) { - cur.second = std::max(cur.second, itr2->second); - } - else { - range.push_back(cur); - cur = *(itr2); - } - } - range.push_back(cur); - } +void PMTNoise::FindRanges(HitTubeCollection *hc, vector> &range) +{ +// - Add photoelectrons corresponding dark current +// to each true Cherenkov hit around +- "fWindow"/2 +// - Here these time windows are calculated + + range.clear(); + const int nTrueHits = hc->GetTotalNumOfTrueHits(); + vector> tmp; + tmp.reserve(nTrueHits); + + for(hc->Begin(); !hc->IsEnd(); hc->Next()) + { + HitTube *aPH = &(*hc)(); + const int nPE = aPH->GetNRawPE(); + for(int i=0; iGetTimeRaw(i); + double tLow = t - fWindow/2.; + double tUp = t + fWindow/2.; + tmp.push_back(pair(tLow, tUp)); + } + } + + // If no true hits are stored, add a dummy such that no dark noise is added in later stage + if( tmp.size()==0 ) + { + range.push_back(pair(0., 0.)); + } + else + { + // Sort the "tmp" vector in increasing order, then check whether or not + // the windows defined above overlapp with other window + std::sort(tmp.begin(), tmp.end()); + + vector>::iterator itr2 = tmp.begin(); + pair cur = *(itr2)++; + for(; itr2!=tmp.end(); itr2++) + { + if( cur.second>=itr2->first ) + { + cur.second = std::max(cur.second,itr2->second); + } + else + { + range.push_back( cur ); + cur = *(itr2); + } + } + range.push_back( cur ); + } } -void PMTNoise::Add(HitTubeCollection* hc, double tWinLow, double tWinUp) { - this->GenerateDarkNoise(tWinLow, tWinUp, true, false); - const int nDarkHits = this->GetNumberOfGeneratedDarkHits(); - for(int k = 0; k < nDarkHits; k++) { - int tubeID = this->GetNoiseTube(k); - float time = this->GetNoiseTime(k); +void PMTNoise::Add(HitTubeCollection *hc, double tWinLow, double tWinUp) +{ + this->GenerateDarkNoise(tWinLow, tWinUp, true, false); + const int nDarkHits = this->GetNumberOfGeneratedDarkHits(); + for(int k=0; kGetNoiseTube(k); + float time = this->GetNoiseTime(k); hc->AddTrueHit(tubeID, time, -1); - } - // cout<<" NumCkovPE(dark PE): " << nDarkHits <GetTotalNumOfDigiHits(); - int NAP = 0; - int NDigi = 0; - for(hc->Begin(); !hc->IsEnd(); hc->Next()) { - HitTube* aPH = &(*hc)(); - NDigi += aPH->GetNDigiHits(); - - // Store digitize hits due to afterpluse temporally - HitTube* aPHAP = new HitTube(aPH->GetTubeID()); - for(int i = 0; i < aPH->GetNDigiHits(); i++) { - float charge = aPH->GetChargeDigi(i); - const vector composition = aPH->GetParentCompositionDigi(i); - if(fAftpulse->GenerateAfterpulse(charge, composition, fRand)) { - double charge_ap = pr->GetRawSPE(); - bool pass = false; - hd->ApplyThreshold(charge_ap, pass); - while(!pass) { - charge_ap = pr->GetRawSPE(); - hd->ApplyThreshold(charge_ap, pass); - } - - float time_ap = fAftpulse->GetAfterpulseTime(aPH->GetTimeDigi(i), fRand); - vector comp_ap(1, -2); - aPHAP->AddDigiHit(time_ap, charge_ap, comp_ap); - NAP += 1; - } - } - - for(int i = 0; i < aPHAP->GetNDigiHits(); i++) { - float time = aPHAP->GetTimeDigi(i); - float charge = aPHAP->GetChargeDigi(i); - const vector comp = aPHAP->GetParentCompositionDigi(i); - aPH->AddDigiHit(time, charge, comp); - } - } - - int NDigiHitsAf = hc->GetTotalNumOfDigiHits(); - cout << " NDigiHits(w/o AP): " << NDigiHitsBf << " NDigiHits(w/ AP): " << NDigiHitsAf << " NAP: " << NAP - << " NDigi: " << NDigi << endl; + +void PMTNoise::AddAfterpulse(HitTubeCollection *hc, HitDigitizer *hd, PMTResponse *pr) +{ + int NDigiHitsBf = hc->GetTotalNumOfDigiHits(); + int NAP = 0; + int NDigi = 0; + for(hc->Begin(); !hc->IsEnd(); hc->Next()) + { + HitTube *aPH = &(*hc)(); + NDigi += aPH->GetNDigiHits(); + + // Store digitize hits due to afterpluse temporally + HitTube *aPHAP = new HitTube(aPH->GetTubeID()); + for(int i=0; iGetNDigiHits(); i++) + { + float charge = aPH->GetChargeDigi(i); + const vector composition = aPH->GetParentCompositionDigi(i); + if( fAftpulse->GenerateAfterpulse(charge, composition, fRand) ) + { + double charge_ap = pr->GetRawSPE(); + bool pass = false; + hd->ApplyThreshold(charge_ap, pass); + while( !pass ) + { + charge_ap = pr->GetRawSPE(); + hd->ApplyThreshold(charge_ap, pass); + } + + float time_ap = fAftpulse->GetAfterpulseTime(aPH->GetTimeDigi(i), fRand); + vector comp_ap(1, -2); + aPHAP->AddDigiHit(time_ap, charge_ap, comp_ap); + NAP += 1; + } + } + + for(int i=0; iGetNDigiHits(); i++) + { + float time = aPHAP->GetTimeDigi(i); + float charge = aPHAP->GetChargeDigi(i); + const vector comp = aPHAP->GetParentCompositionDigi(i); + aPH->AddDigiHit(time, charge, comp); + } + } + + int NDigiHitsAf = hc->GetTotalNumOfDigiHits(); + cout<<" NDigiHits(w/o AP): " << NDigiHitsBf + <<" NDigiHits(w/ AP): " << NDigiHitsAf + <<" NAP: " << NAP + <<" NDigi: " << NDigi + < +#include #include +#include #include -#include #include -#include -using std::ifstream; using std::string; +using std::ifstream; using std::stringstream; using std::vector; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// -GenericPMTResponse::GenericPMTResponse(int seed, const string& pmtname) { - fSclFacTTS = 1.0; - this->Initialize(seed, pmtname); +GenericPMTResponse::GenericPMTResponse(int seed, const string &pmtname) +{ + fSclFacTTS = 1.0; + this->Initialize(seed, pmtname); } -GenericPMTResponse::GenericPMTResponse() { - fSclFacTTS = 1.0; +GenericPMTResponse::GenericPMTResponse() +{ + fSclFacTTS = 1.0; } -GenericPMTResponse::~GenericPMTResponse() { - if(!fRand) { - delete fRand; - fRand = NULL; - } +GenericPMTResponse::~GenericPMTResponse() +{ + if( !fRand ){ delete fRand; fRand=NULL; } } -void GenericPMTResponse::Initialize(int seed, const string& pmtname) { - fRand = new MTRandom(seed); - fPMTType = pmtname; - - fTResConstant = 1.890; - fTResMinimum = 0.32; +void GenericPMTResponse::Initialize(int seed, const string &pmtname) +{ + fRand=new MTRandom(seed); + fPMTType = pmtname; + + fTResConstant = 1.890; + fTResMinimum = 0.32; + + map s; + s["TimingResConstant"] = "TimingResConstant"; + s["TimingResMinimum"] = "TimingResMinimum"; + s["ScalFactorTTS"] = "ScalFactorTTS"; + s["SPECDFFile"] = "SPECDFFile"; + + if( fPMTType!="" ) + { + map::iterator i; + for(i=s.begin(); i!=s.end(); i++) + { + i->second += "_" + fPMTType; + } + } + + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue(s["TimingResConstant"], fTResConstant); + Conf->GetValue(s["TimingResMinimum"], fTResMinimum); + Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); + Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); + + this->LoadCDFOfSPE(fTxtFileSPECDF); +} - map s; - s["TimingResConstant"] = "TimingResConstant"; - s["TimingResMinimum"] = "TimingResMinimum"; - s["ScalFactorTTS"] = "ScalFactorTTS"; - s["SPECDFFile"] = "SPECDFFile"; - if(fPMTType != "") { - map::iterator i; - for(i = s.begin(); i != s.end(); i++) { - i->second += "_" + fPMTType; - } - } +double GenericPMTResponse::GetRawSPE(const TrueHit* th, const HitTube* ht) +{ + int i; + double random1=fRand->Rndm(); + for(i = 0; i < 501; i++){ + if( random1<=*(fqpe0+i) ){ break; } + } + return (double(i-50) + fRand->Rndm())/22.83; +} - Configuration* Conf = Configuration::GetInstance(); - Conf->GetValue(s["TimingResConstant"], fTResConstant); - Conf->GetValue(s["TimingResMinimum"], fTResMinimum); - Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); - Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); +bool GenericPMTResponse::ApplyDE(const TrueHit* th, const HitTube *ht) +{ + return true; +} - this->LoadCDFOfSPE(fTxtFileSPECDF); +//// Currently based on 8" (instead of 20") +//// But shifted to requirements (2ns TTS FWHM) for 1 pe +float GenericPMTResponse::HitTimeSmearing(float Q) +{ + Q = (Q > 0.5) ? Q : 0.5; + float timingResolution = 0.5*fSclFacTTS*(0.33 + sqrt(fTResConstant/Q)); + if( timingResolutionGaus(0.0,timingResolution); } -double GenericPMTResponse::GetRawSPE(const TrueHit* th, const HitTube* ht) { - int i; - double random1 = fRand->Rndm(); - for(i = 0; i < 501; i++) { - if(random1 <= *(fqpe0 + i)) { - break; - } - } - return (double(i - 50) + fRand->Rndm()) / 22.83; +void GenericPMTResponse::LoadCDFOfSPE(const string &filename) +{ + ifstream ifs(filename.c_str()); + string aLine; + vector qCDF; + while( std::getline(ifs, aLine) ) + { + if( aLine[0] == '#' ){ continue; } + stringstream ssline(aLine); + string item; + while (getline(ssline, item, ssline.widen(' '))) + { + qCDF.push_back( atof(item.c_str()) ); + } + } + ifs.close(); + + const unsigned int nBin = qCDF.size(); + if( nBin!=501 ) + { + cout<<" [ERROR] PMTResponse::LoadCDFOfSPE" < EXIT" <Initialize(seed, pmtname); } -//// Currently based on 8" (instead of 20") -//// But shifted to requirements (2ns TTS FWHM) for 1 pe -float GenericPMTResponse::HitTimeSmearing(float Q) { - Q = (Q > 0.5) ? Q : 0.5; - float timingResolution = 0.5 * fSclFacTTS * (0.33 + sqrt(fTResConstant / Q)); - if(timingResolution < fTResMinimum) { - timingResolution = fTResMinimum; - } - return fRand->Gaus(0.0, timingResolution); -} - -void GenericPMTResponse::LoadCDFOfSPE(const string& filename) { - ifstream ifs(filename.c_str()); - string aLine; - vector qCDF; - while(std::getline(ifs, aLine)) { - if(aLine[0] == '#') { - continue; - } - stringstream ssline(aLine); - string item; - while(getline(ssline, item, ssline.widen(' '))) { - qCDF.push_back(atof(item.c_str())); - } - } - ifs.close(); - - const unsigned int nBin = qCDF.size(); - if(nBin != 501) { - cout << " [ERROR] PMTResponse::LoadCDFOfSPE" << endl; - cout << " - Different format: " << filename << endl; - cout << " - # bins found: " << nBin << endl; - cout << " -> EXIT" << endl; - exit(-1); - } - for(unsigned int i = 0; i < nBin; i++) { - fqpe0[i] = qCDF[i]; - } +ResponseBoxandLine20inchHQE::ResponseBoxandLine20inchHQE() +{ } -/////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////// -const double ResponseBoxandLine20inchHQE::ksig_param[4] = { 0.6314, 0.06260, 0.5711, 23.96 }; -const double ResponseBoxandLine20inchHQE::klambda_param[2] = { 0.4113, 0.07827 }; +ResponseBoxandLine20inchHQE::~ResponseBoxandLine20inchHQE() +{ +} -ResponseBoxandLine20inchHQE::ResponseBoxandLine20inchHQE(int seed, const string& pmtname) { - this->Initialize(seed, pmtname); +void ResponseBoxandLine20inchHQE::Initialize(int seed, const string &pmtname) +{ + fPMTType = pmtname; + fRand=new MTRandom(seed); + + fhighcharge_param[0] = 2*ksig_param[0]*ksig_param[1]*ksig_param[3]*sqrt(ksig_param[3])*exp(-ksig_param[1]*ksig_param[3]); + fhighcharge_param[1] = ksig_param[0]*((1-2*ksig_param[1]*ksig_param[3])*exp(-ksig_param[1]*ksig_param[3])+ksig_param[2]); + + map s; + s["ScalFactorTTS"] = "ScalFactorTTS"; + s["SPECDFFile"] = "SPECDFFile"; + + if( fPMTType!="" ) + { + map::iterator i; + for(i=s.begin(); i!=s.end(); i++) + { + i->second += "_" + fPMTType; + } + } + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); + Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); + this->LoadCDFOfSPE(fTxtFileSPECDF); } -ResponseBoxandLine20inchHQE::ResponseBoxandLine20inchHQE() {} -ResponseBoxandLine20inchHQE::~ResponseBoxandLine20inchHQE() {} +float ResponseBoxandLine20inchHQE::HitTimeSmearing(float Q) +{ + double sigma_lowcharge = ksig_param[0]*(exp(-ksig_param[1]*Q)+ksig_param[2]); + double sigma_highcharge = fhighcharge_param[0]/sqrt(Q) + fhighcharge_param[1]; + double sigma = sigma_lowcharge*(Qksig_param[3]); + double lambda = klambda_param[0]+klambda_param[1]*Q; + return fRand->Gaus(-0.2, sigma)-1./lambda*log(1-fRand->Rndm()); +} + +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +Response3inchR14374::Response3inchR14374(int seed, const string &pmtname) +{ + fTimeResAt1PE = 0.6; // B. Quilain, to match the TTS = 1.4ns (sigma at 0.6) measured at 1 p.e. + this->Initialize(seed, pmtname); +} -void ResponseBoxandLine20inchHQE::Initialize(int seed, const string& pmtname) { - fPMTType = pmtname; - fRand = new MTRandom(seed); +Response3inchR14374::Response3inchR14374() +{ + fTimeResAt1PE = 0.6; // B. Quilain, to match the TTS = 1.4ns (sigma at 0.6) measured at 1 p.e. +} - fhighcharge_param[0] = 2 * ksig_param[0] * ksig_param[1] * ksig_param[3] * sqrt(ksig_param[3]) * - exp(-ksig_param[1] * ksig_param[3]); - fhighcharge_param[1] = - ksig_param[0] * - ((1 - 2 * ksig_param[1] * ksig_param[3]) * exp(-ksig_param[1] * ksig_param[3]) + ksig_param[2]); - map s; - s["ScalFactorTTS"] = "ScalFactorTTS"; - s["SPECDFFile"] = "SPECDFFile"; - if(fPMTType != "") { - map::iterator i; - for(i = s.begin(); i != s.end(); i++) { - i->second += "_" + fPMTType; - } - } - Configuration* Conf = Configuration::GetInstance(); - Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); - Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); - this->LoadCDFOfSPE(fTxtFileSPECDF); +Response3inchR14374::~Response3inchR14374() +{ } -float ResponseBoxandLine20inchHQE::HitTimeSmearing(float Q) { - double sigma_lowcharge = ksig_param[0] * (exp(-ksig_param[1] * Q) + ksig_param[2]); - double sigma_highcharge = fhighcharge_param[0] / sqrt(Q) + fhighcharge_param[1]; - double sigma = sigma_lowcharge * (Q < ksig_param[3]) + sigma_highcharge * (Q > ksig_param[3]); - double lambda = klambda_param[0] + klambda_param[1] * Q; - return fRand->Gaus(-0.2, sigma) - 1. / lambda * log(1 - fRand->Rndm()); +void Response3inchR14374::Initialize(int seed, const string &pmtname) +{ + fPMTType = pmtname; + fRand = new MTRandom(seed); + + map s; + s["ScalFactorTTS"] = "ScalFactorTTS"; + s["SPECDFFile"] = "SPECDFFile"; + if( fPMTType!="" ) + { + map::iterator i; + for(i=s.begin(); i!=s.end(); i++) + { + i->second += "_" + fPMTType; + } + } + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); + Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); + this->LoadCDFOfSPE(fTxtFileSPECDF); } -/////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////// -Response3inchR14374::Response3inchR14374(int seed, const string& pmtname) { - fTimeResAt1PE = 0.6; // B. Quilain, to match the TTS = 1.4ns (sigma at 0.6) measured at 1 p.e. - this->Initialize(seed, pmtname); -} - -Response3inchR14374::Response3inchR14374() { - fTimeResAt1PE = 0.6; // B. Quilain, to match the TTS = 1.4ns (sigma at 0.6) measured at 1 p.e. -} - -Response3inchR14374::~Response3inchR14374() {} - -void Response3inchR14374::Initialize(int seed, const string& pmtname) { - fPMTType = pmtname; - fRand = new MTRandom(seed); - - map s; - s["ScalFactorTTS"] = "ScalFactorTTS"; - s["SPECDFFile"] = "SPECDFFile"; - if(fPMTType != "") { - map::iterator i; - for(i = s.begin(); i != s.end(); i++) { - i->second += "_" + fPMTType; - } - } - Configuration* Conf = Configuration::GetInstance(); - Conf->GetValue(s["ScalFactorTTS"], fSclFacTTS); - Conf->GetValue(s["SPECDFFile"], fTxtFileSPECDF); - this->LoadCDFOfSPE(fTxtFileSPECDF); -} - -float Response3inchR14374::HitTimeSmearing(float Q) { - // Use a tentative Q dependence proposed by B. Quilain, - // - Q<0.5.: force Q to be 0.5 to avoid divergence of timing resolution - // - This comes from some PMT types's implementation in WCSimPMTObject.cc - // - Q<10p.e.: timing resolution follows TTS/sqrt(Q) - // - Q>=10p.e.: no charge dependence, so use a constant value of TTS/sqrt(10p.e.) - // Q = (Q > 0.5) ? Q : 0.5; - // if( Q>10. ){ Q = 10.; } - // float timingResolution = (fTimeResAt1PE/sqrt(Q))*fSclFacTTS; - float timingResolution = 0.6 * fSclFacTTS; - return fRand->Gaus(0., timingResolution); +float Response3inchR14374::HitTimeSmearing(float Q) +{ +// Use a tentative Q dependence proposed by B. Quilain, +// - Q<0.5.: force Q to be 0.5 to avoid divergence of timing resolution +// - This comes from some PMT types's implementation in WCSimPMTObject.cc +// - Q<10p.e.: timing resolution follows TTS/sqrt(Q) +// - Q>=10p.e.: no charge dependence, so use a constant value of TTS/sqrt(10p.e.) + //Q = (Q > 0.5) ? Q : 0.5; + //if( Q>10. ){ Q = 10.; } + //float timingResolution = (fTimeResAt1PE/sqrt(Q))*fSclFacTTS; + float timingResolution = 0.6*fSclFacTTS; + return fRand->Gaus(0., timingResolution); } diff --git a/cpp/src/TriggerAlgo.cc b/cpp/src/TriggerAlgo.cc index 0bc1a92..9746135 100644 --- a/cpp/src/TriggerAlgo.cc +++ b/cpp/src/TriggerAlgo.cc @@ -3,118 +3,144 @@ #include "HitTube.h" TriggerAlgo::TriggerAlgo() : - fNDigitsWindow(200.), fNDigitsStepSize(5.), fNDigitsThreshold(25), fTriggerTimeForFailure(100.) { - fPreTriggerWindow[TriggerType::eNDigits] = -400.; - fPreTriggerWindow[TriggerType::eFailure] = -400.; +fNDigitsWindow( 200. ), +fNDigitsStepSize( 5. ), +fNDigitsThreshold( 25 ), +fTriggerTimeForFailure( 100. ) +{ + fPreTriggerWindow[TriggerType::eNDigits] = -400.; + fPreTriggerWindow[TriggerType::eFailure] = -400.; + + fPostTriggerWindow[TriggerType::eNDigits] = 950.; + fPostTriggerWindow[TriggerType::eFailure] = 100000.; - fPostTriggerWindow[TriggerType::eNDigits] = 950.; - fPostTriggerWindow[TriggerType::eFailure] = 100000.; - - Configuration* Conf = Configuration::GetInstance(); - Conf->GetValue("NDigitsWindow", fNDigitsWindow); - Conf->GetValue("NDigitsStepSize", fNDigitsStepSize); - Conf->GetValue("NDigitsThreshold", fNDigitsThreshold); - Conf->GetValue("FailureTime", fTriggerTimeForFailure); - Conf->GetValue("NDigitsPreTriggerWindow", fPreTriggerWindow[TriggerType::eNDigits]); - Conf->GetValue("NDigitsPostTriggerWindow", fPostTriggerWindow[TriggerType::eNDigits]); - Conf->GetValue("FailurePreTriggerWindow", fPreTriggerWindow[TriggerType::eFailure]); - Conf->GetValue("FailurePostTriggerWindow", fPostTriggerWindow[TriggerType::eFailure]); + Configuration *Conf = Configuration::GetInstance(); + Conf->GetValue("NDigitsWindow", fNDigitsWindow); + Conf->GetValue("NDigitsStepSize", fNDigitsStepSize); + Conf->GetValue("NDigitsThreshold", fNDigitsThreshold ); + Conf->GetValue("FailureTime", fTriggerTimeForFailure); + Conf->GetValue("NDigitsPreTriggerWindow", fPreTriggerWindow[TriggerType::eNDigits]); + Conf->GetValue("NDigitsPostTriggerWindow", fPostTriggerWindow[TriggerType::eNDigits]); + Conf->GetValue("FailurePreTriggerWindow", fPreTriggerWindow[TriggerType::eFailure]); + Conf->GetValue("FailurePostTriggerWindow", fPostTriggerWindow[TriggerType::eFailure]); } -// This is based on WCSimWCTriggerBase::AlgNDigits in WCSimWCTrigger.cc -void TriggerAlgo::NDigits(HitTubeCollection* hc, TriggerInfo* ti) { - ti->Clear(); - const int nTotalDigiHits = hc->GetTotalNumOfDigiHits(); - int nTriggers = 0; - float trigTime = 0.; - - if(nTotalDigiHits > 0) { - vector times; - times.reserve(nTotalDigiHits); - for(hc->Begin(); !hc->IsEnd(); hc->Next()) { - HitTube* aPH = &(*hc)(); - for(int i = 0; i < aPH->GetNDigiHits(); i++) { - times.push_back(aPH->GetTimeDigi(i)); - } - aPH = NULL; - } - std::sort(times.begin(), times.end()); - float tFirstHit = times[0]; - float tLastHit = times[nTotalDigiHits - 1]; +// This is based on WCSimWCTriggerBase::AlgNDigits in WCSimWCTrigger.cc +void TriggerAlgo::NDigits(HitTubeCollection *hc, TriggerInfo* ti) +{ + ti->Clear(); + const int nTotalDigiHits = hc->GetTotalNumOfDigiHits(); + int nTriggers = 0; + float trigTime = 0.; - const double stepSize = fNDigitsStepSize; // in ns - const double tWindowMax = std::max(0.f, tLastHit - fNDigitsWindow); // in ns + if( nTotalDigiHits>0 ) + { + vector times; + times.reserve(nTotalDigiHits); + for(hc->Begin(); !hc->IsEnd(); hc->Next()) + { + HitTube *aPH = &(*hc)(); + for(int i=0; iGetNDigiHits(); i++) + { + times.push_back( aPH->GetTimeDigi(i) ); + } + aPH = NULL; + } + std::sort(times.begin(), times.end()); + + float tFirstHit = times[0]; + float tLastHit = times[nTotalDigiHits-1]; - double tWindowUp = 0.; - double tWindowLow = 0.; + const double stepSize = fNDigitsStepSize; // in ns + const double tWindowMax = std::max(0.f, tLastHit - fNDigitsWindow); // in ns - // - Slide the time window with a width of "fNDigitsWindow" - // from "tWindowLow" (assumed to be 0 initially) to "tWindowMax" - // with a step size of "stepSize" - // - // - For each step, all the digitized hits falling the corresponding window - // are counted. If the number of those hits are greater than "fNDigitsThreshold" - // a new trigger is created - tWindowUp = tWindowLow + fNDigitsWindow; - int iHit = 0; - while(tWindowLow <= tWindowMax) { - vector Times; - Times.clear(); - for(iHit = 0; iHit < nTotalDigiHits; iHit++) { - float t = times[iHit]; - if(t >= tWindowLow && t <= tWindowUp) { - Times.push_back(t); - } - } + double tWindowUp = 0.; + double tWindowLow = 0.; - bool isTriggerFound = false; - if((int)Times.size() > fNDigitsThreshold) { - trigTime = Times[fNDigitsThreshold]; - trigTime -= (int)trigTime % 5; - float trigTimeLow = trigTime + fPreTriggerWindow[TriggerType::eNDigits]; - float trigTimeUp = trigTime + fPostTriggerWindow[TriggerType::eNDigits]; + // - Slide the time window with a width of "fNDigitsWindow" + // from "tWindowLow" (assumed to be 0 initially) to "tWindowMax" + // with a step size of "stepSize" + // + // - For each step, all the digitized hits falling the corresponding window + // are counted. If the number of those hits are greater than "fNDigitsThreshold" + // a new trigger is created + tWindowUp = tWindowLow + fNDigitsWindow; + int iHit = 0; + while( tWindowLow<=tWindowMax ) + { + vector Times; + Times.clear(); + for(iHit=0; iHit=tWindowLow && t<=tWindowUp ) + { + Times.push_back( t ); + } + } - // Avoid overlapping with previous trigger window - if(nTriggers >= 1) { - float trigTimeUpPrevious = ti->GetUpEdge(nTriggers - 1); - if(trigTimeUpPrevious > trigTimeLow) { - trigTimeLow = trigTimeUpPrevious; - } - } - ti->AddTrigger(trigTime, - trigTimeLow, - trigTimeUp, - (int)Times.size(), - (int)TriggerType::eNDigits); - cout << " Found trigger at: " << trigTime << " nHits: " << Times.size() - << " trigger window: [" << trigTimeLow << ", " << trigTimeUp << "] ns " << endl; - isTriggerFound = true; - nTriggers += 1; - } + bool isTriggerFound = false; + if( (int)Times.size()>fNDigitsThreshold ) + { + trigTime = Times[fNDigitsThreshold]; + trigTime -= (int)trigTime%5; + float trigTimeLow = trigTime + fPreTriggerWindow[TriggerType::eNDigits]; + float trigTimeUp = trigTime + fPostTriggerWindow[TriggerType::eNDigits]; - if(isTriggerFound) { - tWindowLow = trigTime + fPostTriggerWindow[TriggerType::eNDigits]; - } - else { - tWindowLow += stepSize; - } - tWindowUp = tWindowLow + fNDigitsWindow; - } - } + // Avoid overlapping with previous trigger window + if( nTriggers>=1 ) + { + float trigTimeUpPrevious = ti->GetUpEdge(nTriggers-1); + if( trigTimeUpPrevious>trigTimeLow ) + { + trigTimeLow = trigTimeUpPrevious; + } + } + ti->AddTrigger(trigTime, + trigTimeLow, + trigTimeUp, + (int)Times.size(), + (int)TriggerType::eNDigits); + cout<<" Found trigger at: " << trigTime + <<" nHits: " << Times.size() + <<" trigger window: [" << trigTimeLow + <<", " << trigTimeUp + <<"] ns " + <AddTrigger(trigTime, trigTimeLow, trigTimeUp, -1, (int)TriggerType::eFailure); - // cout<<" No trigger found " <AddTrigger(trigTime, + trigTimeLow, + trigTimeUp, + -1, + (int)TriggerType::eFailure); + //cout<<" No trigger found " <Clear(); +TriggerInfo::TriggerInfo() +{ + this->Clear(); } -TriggerInfo::~TriggerInfo() { - this->Clear(); +TriggerInfo::~TriggerInfo() +{ + this->Clear(); } -void TriggerInfo::AddTrigger(float timeTrig, float timeLow, float timeUp, int nHits, int type) { - fTrigTime.push_back(timeTrig); - fTimeLow.push_back(timeLow); - fTimeUp.push_back(timeUp); - fNHits.push_back(nHits); - fTrigType.push_back(type); +void TriggerInfo::AddTrigger(float timeTrig, + float timeLow, + float timeUp, + int nHits, + int type) +{ + fTrigTime.push_back(timeTrig); + fTimeLow.push_back(timeLow); + fTimeUp.push_back(timeUp); + fNHits.push_back(nHits); + fTrigType.push_back(type); } -void TriggerInfo::Clear() { - fTrigTime.clear(); - fTimeLow.clear(); - fTimeUp.clear(); - fNHits.clear(); - fTrigType.clear(); - vector().swap(fTrigTime); - vector().swap(fTimeLow); - vector().swap(fTimeUp); - vector().swap(fNHits); - vector().swap(fTrigType); +void TriggerInfo::Clear() +{ + fTrigTime.clear(); + fTimeLow.clear(); + fTimeUp.clear(); + fNHits.clear(); + fTrigType.clear(); + vector().swap(fTrigTime); + vector().swap(fTimeLow); + vector().swap(fTimeUp); + vector().swap(fNHits); + vector().swap(fTrigType); } diff --git a/cpp/src/TrueHit.cc b/cpp/src/TrueHit.cc index 07b3806..c2a7fdc 100644 --- a/cpp/src/TrueHit.cc +++ b/cpp/src/TrueHit.cc @@ -1,17 +1,21 @@ #include "TrueHit.h" -TrueHit::TrueHit(float t, int id) { - fTime = t; - fParentId = id; - fPosition[0] = 0.; - fPosition[1] = 0.; - fPosition[2] = 0.; +TrueHit::TrueHit(float t, int id) +{ + fTime = t; + fParentId = id; + fPosition[0] = 0.; + fPosition[1] = 0.; + fPosition[2] = 0.; }; -TrueHit::TrueHit() { - fPosition[0] = 0.; - fPosition[1] = 0.; - fPosition[2] = 0.; +TrueHit::TrueHit() +{ + fPosition[0] = 0.; + fPosition[1] = 0.; + fPosition[2] = 0.; }; -TrueHit::~TrueHit() {}; +TrueHit::~TrueHit() +{ +}; diff --git a/pywrap/PyWrapMDT.cpp b/pywrap/PyWrapMDT.cpp index 62a9dc4..5611b93 100644 --- a/pywrap/PyWrapMDT.cpp +++ b/pywrap/PyWrapMDT.cpp @@ -1,54 +1,55 @@ #include #include -#include "Configuration.h" #include "HitTube.h" #include "HitTubeCollection.h" -#include "MDTManager.h" +#include "Configuration.h" #include "TriggerInfo.h" +#include "MDTManager.h" namespace py = pybind11; -PYBIND11_MODULE(MDT, m) { - py::class_(m, "HitTube") - .def(py::init()) - .def("GetTubeID", &HitTube::GetTubeID) - .def("GetNDigiHits", &HitTube::GetNDigiHits) - .def("GetTimeDigi", &HitTube::GetTimeDigi) - .def("GetChargeDigi", &HitTube::GetChargeDigi); - - py::class_(m, "HitTubeCollection") - .def(py::init<>()) - .def("AddTrueHit", &HitTubeCollection::AddTrueHit) - .def("AddDigiHit", &HitTubeCollection::AddDigiHit) - .def("GetNumOfHitTubes", &HitTubeCollection::GetNumOfHitTubes) - .def("GetTotalNumOfTrueHits", &HitTubeCollection::GetTotalNumOfTrueHits) - .def("GetTotalNumOfDigiHits", &HitTubeCollection::GetTotalNumOfDigiHits) - .def("GetHitTubeIDList", &HitTubeCollection::GetHitTubeIDList) - .def("Begin", &HitTubeCollection::Begin) - .def("IsEnd", &HitTubeCollection::IsEnd) - .def("Next", &HitTubeCollection::Next) - .def("GetHitTube", &HitTubeCollection::GetHitTube, py::return_value_policy::reference); - - py::class_>(m, "Configuration") - .def(py::init(&Configuration::GetInstance), py::return_value_policy::reference) - .def("ReadParameter", &Configuration::ReadParameter) - .def("PrintParameters", &Configuration::PrintParameters); - - py::class_(m, "TriggerInfo") - .def(py::init<>()) - .def("GetNumOfTrigger", &TriggerInfo::GetNumOfTrigger) - .def("GetTriggerTime", &TriggerInfo::GetTriggerTime) - .def("GetLowEdge", &TriggerInfo::GetLowEdge) - .def("GetUpEdge", &TriggerInfo::GetUpEdge) - .def("GetType", &TriggerInfo::GetType); - - py::class_(m, "MDTManager") - .def(py::init()) - .def("DoAddDark", &MDTManager::DoAddDark) - .def("DoDigitize", &MDTManager::DoDigitize) - .def("DoTrigger", &MDTManager::DoTrigger) - .def("DoInitialize", &MDTManager::DoInitialize) - .def("GetTriggerInfo", &MDTManager::GetTriggerInfo, py::return_value_policy::reference) - .def("GetHitTubeCollection", &MDTManager::GetHitTubeCollection, py::return_value_policy::reference); +PYBIND11_MODULE(MDT, m){ +py::class_(m, "HitTube") + .def(py::init()) + .def("GetTubeID", &HitTube::GetTubeID) + .def("GetNDigiHits", &HitTube::GetNDigiHits) + .def("GetTimeDigi", &HitTube::GetTimeDigi) + .def("GetChargeDigi", &HitTube::GetChargeDigi); + + +py::class_(m, "HitTubeCollection") + .def(py::init<>()) + .def("AddTrueHit", &HitTubeCollection::AddTrueHit) + .def("AddDigiHit", &HitTubeCollection::AddDigiHit) + .def("GetNumOfHitTubes", &HitTubeCollection::GetNumOfHitTubes) + .def("GetTotalNumOfTrueHits", &HitTubeCollection::GetTotalNumOfTrueHits) + .def("GetTotalNumOfDigiHits", &HitTubeCollection::GetTotalNumOfDigiHits) + .def("GetHitTubeIDList", &HitTubeCollection::GetHitTubeIDList) + .def("Begin", &HitTubeCollection::Begin) + .def("IsEnd", &HitTubeCollection::IsEnd) + .def("Next", &HitTubeCollection::Next) + .def("GetHitTube", &HitTubeCollection::GetHitTube, py::return_value_policy::reference); + +py::class_>(m, "Configuration") + .def(py::init(&Configuration::GetInstance), py::return_value_policy::reference) + .def("ReadParameter", &Configuration::ReadParameter) + .def("PrintParameters", &Configuration::PrintParameters); + +py::class_(m, "TriggerInfo") + .def(py::init<>()) + .def("GetNumOfTrigger", &TriggerInfo::GetNumOfTrigger) + .def("GetTriggerTime", &TriggerInfo::GetTriggerTime) + .def("GetLowEdge", &TriggerInfo::GetLowEdge) + .def("GetUpEdge", &TriggerInfo::GetUpEdge) + .def("GetType", &TriggerInfo::GetType); + +py::class_(m, "MDTManager") + .def(py::init()) + .def("DoAddDark", &MDTManager::DoAddDark) + .def("DoDigitize", &MDTManager::DoDigitize) + .def("DoTrigger", &MDTManager::DoTrigger) + .def("DoInitialize", &MDTManager::DoInitialize) + .def("GetTriggerInfo", &MDTManager::GetTriggerInfo, py::return_value_policy::reference) + .def("GetHitTubeCollection", &MDTManager::GetHitTubeCollection, py::return_value_policy::reference); } From 012fbd7a51b49f489de2400dc518c567b8328ad4 Mon Sep 17 00:00:00 2001 From: Mathieu Guigue Date: Mon, 21 Aug 2023 16:24:24 +0200 Subject: [PATCH 29/55] Remove clang format --- .github/workflows/clang-format.yml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .github/workflows/clang-format.yml diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml deleted file mode 100644 index 4d994ba..0000000 --- a/.github/workflows/clang-format.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Run clang-format Linter - -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - container: ghcr.io/hyperk/clang_format:latest - steps: - - uses: actions/checkout@v2 - - name: make_safe - run: git config --global --add safe.directory '*' - - name: format - run: git clone https://github.com/hyperk/hk-ClangFormat.git && cd hk-ClangFormat && ./run.sh && cd .. && rm -rf hk-ClangFormat - - uses: EndBug/add-and-commit@v9 - with: - author_name: Clang Robot - author_email: robot@example.com - message: 'Committing clang-format changes' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 71ea87a4bd4bf30ecf0876946b42f44584cb9ed2 Mon Sep 17 00:00:00 2001 From: Mathieu Guigue Date: Mon, 21 Aug 2023 16:29:05 +0200 Subject: [PATCH 30/55] Typo in dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2c0dd1f..ed3b3f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ FROM ghcr.io/hyperk/hk-meta-externals:latest -COPY . /usr/local/hk/hk-DataModel +COPY . /usr/local/hk/MDT RUN --mount=type=ssh mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts WORKDIR /usr/local/hk RUN --mount=type=ssh . /usr/local/hk/hk-pilot/setup.sh &&\ - hkp install -r hk-DataModel + hkp install MDT From c106270361a9a94f760f7a950a5eb6aac5a2df16 Mon Sep 17 00:00:00 2001 From: Mathieu Guigue Date: Mon, 21 Aug 2023 16:35:12 +0200 Subject: [PATCH 31/55] Add WCSim lib in main CMakeLists.txt --- CMakeLists.txt | 6 +++++- app/utilities/WCRootData/CMakeLists.txt | 2 +- cpp/CMakeLists.txt | 7 +------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 03754d0..0bf6e02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,11 @@ set( PUBLIC_EXT_LIBS ) hk_check_dependencies() add_definitions(-DHYBRIDWCSIM) - +# manually include WCSim libraries +list( APPEND PUBLIC_EXT_LIBS + WCSim::WCSimRoot + WCSim::WCSimCore +) include_directories(BEFORE ${PROJECT_SOURCE_DIR}/cpp/include diff --git a/app/utilities/WCRootData/CMakeLists.txt b/app/utilities/WCRootData/CMakeLists.txt index 3992a42..1a1a575 100644 --- a/app/utilities/WCRootData/CMakeLists.txt +++ b/app/utilities/WCRootData/CMakeLists.txt @@ -29,7 +29,7 @@ set (HEADERS pbuilder_library( TARGET WCRootData SOURCES ${SRC} - PROJECT_LIBRARIES MDT WCSim::WCSimCore + PROJECT_LIBRARIES MDT PUBLIC_EXTERNAL_LIBRARIES ${PUBLIC_EXT_LIBS} PRIVATE_EXTERNAL_LIBRARIES ${PRIVATE_EXT_LIBS} ) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 1f38ae2..3c70f6f 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -1,10 +1,5 @@ - -# Don't include Utilities -#file(GLOB_RECURSE SRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cpp") -#file(GLOB_RECURSE HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h") - -set (SRC +set (SRC src/Configuration.cc src/HitDigitizer.cc src/HitTube.cc From 05d5fd01961f940f0e1f022cd926e98f4b844ef4 Mon Sep 17 00:00:00 2001 From: Mathieu Guigue Date: Tue, 22 Aug 2023 10:45:11 +0200 Subject: [PATCH 32/55] Add IWCD app --- app/application/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/application/CMakeLists.txt b/app/application/CMakeLists.txt index d5ca56f..a912751 100644 --- a/app/application/CMakeLists.txt +++ b/app/application/CMakeLists.txt @@ -26,6 +26,7 @@ pbuilder_install_headers(${HEADERS}) #Executables ################# set(exe_sources + appIWCDSingleEvent.cc appWCTESingleEvent.cc ) From 698fed88459d04a6afe3cc18f23cbf7948196a2d Mon Sep 17 00:00:00 2001 From: Mathieu Guigue Date: Mon, 4 Sep 2023 08:44:56 +0200 Subject: [PATCH 33/55] Add Doxygen file via upload --- Doxyfile | 2280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2280 insertions(+) create mode 100644 Doxyfile diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..8f1ffa0 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,2280 @@ +# Doxyfile 1.8.5 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "libDataModel.so" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is included in +# the documentation. The maximum height of the logo should not exceed 55 pixels +# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo +# to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./docs-output/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese- +# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en, +# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, +# Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a +# new page for each member. If set to NO, the documentation of a member will be +# part of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. +# +# Note For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO these classes will be included in the various overviews. This option has +# no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the +# todo list. This list is created by putting \todo commands in the +# documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the +# test list. This list is created by putting \test commands in the +# documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES the list +# will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. Do not use file names with spaces, bibtex cannot handle them. See +# also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO doxygen will only warn about wrong or incomplete parameter +# documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = ./ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER ) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = ./ + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- +# defined cascading style sheet that is included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefor more robust against future updates. +# Doxygen will copy the style sheet file to the output directory. For an example +# see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the stylesheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated ( +# YES) or that it should be included in the master .chm file ( NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated ( +# YES) or a normal table of contents ( NO) in the .chm file. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /