From 9e0585102e72bcf5c1c6cda294c237ac8fa90132 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sun, 17 May 2026 11:54:03 +0200 Subject: [PATCH 01/33] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b992f891..0da8cb4ed 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ It has been primarily developed for the analysis of VERITAS and CTAO data to gen This repository contains the Eventdisplay version used for VERITAS analysis ([CTAO version](https://github.com/Eventdisplay/Eventdisplay)) * Original developers: Gernot Maier and Jamie Holder -* Authors and contributors: [CITATION.cff](CITATION.cff) +* Authors and contributors: [CITATION.cff](CITATION.cff) and [CONTRIBUTORS.md](CONTRIBUTORS.md) * License: [LICENSE](LICENSE) * Contributing: [CONTRIBUTING.md](CONTRIBUTING.md) * Changelog: [CHANGELOG.md](CHANGELOG.md) From c1cfa149b4174fd0256f62304d46bd2e8a248b4b Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Wed, 27 May 2026 20:20:28 +0200 Subject: [PATCH 02/33] fix release link --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b3bc7448..0430192e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to the Eventdisplay_v4 project will be documented in this file. Changes for upcoming releases can be found in the [docs/changes](docs/changes) directory. Note that changes before release v492.0 are not documented here, but can be found in the -[GitHub repository](https://github.com/VERITAS-Observatory/VTS-SimPipe/releases). +[GitHub repository](https://github.com/VERITAS-Observatory/EventDisplay_v4/releases). This changelog is generated using [Towncrier](https://towncrier.readthedocs.io/). From 24887cae0738b1d414675f12fb452f2723b6f778 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 08:45:03 +0200 Subject: [PATCH 03/33] CTA alignment --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0da8cb4ed..5afb598e7 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## Overview Eventdisplay is a reconstruction and analysis pipeline for data of -Imaging Atmospheric Cherenkov Telescopes. +Imaging Atmospheric Cherenkov Telescopes (IACT). It has been primarily developed for the analysis of VERITAS and CTAO data to generate results for scientific publications. This repository contains the Eventdisplay version used for VERITAS analysis ([CTAO version](https://github.com/Eventdisplay/Eventdisplay)) From 48c2d20e1636d608a49f0f7692291680821446ac Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 08:45:27 +0200 Subject: [PATCH 04/33] A1 --- src/VTraceHandler.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/VTraceHandler.cpp b/src/VTraceHandler.cpp index ab3c7311d..06b89a945 100644 --- a/src/VTraceHandler.cpp +++ b/src/VTraceHandler.cpp @@ -322,6 +322,19 @@ vector< float >& VTraceHandler::getPulseTiming( int fFirst, int fLast, int fTFir { fFirst = 0; } + int nTrace = ( int )fpTrace.size(); + if( nTrace < 2 ) + { + return fpulsetiming; + } + if( fTFirst < 0 ) + { + fTFirst = 0; + } + if( fTLast > nTrace - 1 ) + { + fTLast = nTrace - 1; + } // reset pulse timing vector for( unsigned int i = 0; i < fpulsetiming.size(); i++ ) { @@ -343,7 +356,12 @@ vector< float >& VTraceHandler::getPulseTiming( int fFirst, int fLast, int fTFir // (loop backwards over pulse) bool bBreak = false; fFindPulseTiming = false; - for( int i = maxpos; i >= fTFirst ; i-- ) + int i_start = maxpos; + if( i_start > nTrace - 2 ) + { + i_start = nTrace - 2; + } + for( int i = i_start; i >= fTFirst ; i-- ) { i_trace = fpTrace[i] - fPed; // loop over all pulse level From 90e0d4f37043c23ae5d0d5aac73edb80e232c587 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 08:46:18 +0200 Subject: [PATCH 05/33] A6 --- src/VArrayAnalyzer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VArrayAnalyzer.cpp b/src/VArrayAnalyzer.cpp index ab982101c..9ff8c43f2 100644 --- a/src/VArrayAnalyzer.cpp +++ b/src/VArrayAnalyzer.cpp @@ -944,7 +944,7 @@ int VArrayAnalyzer::rcs_method_0( unsigned int iMethod ) bool VArrayAnalyzer::fillShowerCore( unsigned int iMeth, float ximp, float yimp ) { // check validity - if(!isnormal( ximp ) || !isnormal( ximp ) ) + if(!isnormal( ximp ) || !isnormal( yimp ) ) { ximp = -99999.; yimp = -99999.; From cef898142b4324b943ca6d193603e2fef31ccda3 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 08:57:13 +0200 Subject: [PATCH 06/33] A7 --- src/VArrayAnalyzer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VArrayAnalyzer.cpp b/src/VArrayAnalyzer.cpp index 9ff8c43f2..1a278882e 100644 --- a/src/VArrayAnalyzer.cpp +++ b/src/VArrayAnalyzer.cpp @@ -1243,7 +1243,7 @@ int VArrayAnalyzer::rcs_method_3( unsigned int iMethod ) iangdiff = sin( fabs( atan( m[jj] ) - atan( m[ii] ) ) ); // discard all pairs with almost parallel lines - float i_diff = fabs( atan( m[0] ) - atan( m[1] ) ); + float i_diff = fabs( atan( mm[0] ) - atan( mm[1] ) ); if( i_diff < fEvndispReconstructionParameter->fAxesAngles_min[iMethod] / TMath::RadToDeg() || fabs( 180. / TMath::RadToDeg() - i_diff ) < fEvndispReconstructionParameter->fAxesAngles_min[iMethod] / TMath::RadToDeg() ) { From 31e6eb32a8de30cd001bc80d7a15ac209a087996 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 08:59:24 +0200 Subject: [PATCH 07/33] A8 --- src/VImageParameterCalculation.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/VImageParameterCalculation.cpp b/src/VImageParameterCalculation.cpp index cfdd440de..d7393e4ba 100644 --- a/src/VImageParameterCalculation.cpp +++ b/src/VImageParameterCalculation.cpp @@ -1544,11 +1544,13 @@ vector VImageParameterCalculation::calcLL( bool iUseSums2 ) // image centroid should not be outside of the FOV (by more than 10%) if( fData->getDetectorGeometry() && fData->getTelID() < fData->getDetectorGeometry()->getFieldofView().size() ) { + fdistXmin = -1.1 * 0.5 * fData->getDetectorGeometry()->getFieldofView()[fData->getTelID()]; fdistXmax = 1.1 * 0.5 * fData->getDetectorGeometry()->getFieldofView()[fData->getTelID()]; } // should never land here else { + fdistXmin = -5.; fdistXmax = 5.; } } @@ -1590,11 +1592,13 @@ vector VImageParameterCalculation::calcLL( bool iUseSums2 ) // image centroid should not be outside of the FOV (by more than 10%) if( fData->getDetectorGeometry() && fData->getTelID() < fData->getDetectorGeometry()->getFieldofView().size() ) { + fdistYmin = -1.1 * 0.5 * fData->getDetectorGeometry()->getFieldofView()[fData->getTelID()]; fdistYmax = 1.1 * 0.5 * fData->getDetectorGeometry()->getFieldofView()[fData->getTelID()]; } else { // should never land here + fdistYmin = -5.; fdistYmax = 5.; } } From b0d30e16dcd71fb4870fd04400e89ec8cc74c646 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 09:00:54 +0200 Subject: [PATCH 08/33] A9 --- src/VImageParameterCalculation.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/VImageParameterCalculation.cpp b/src/VImageParameterCalculation.cpp index d7393e4ba..d5221c4a0 100644 --- a/src/VImageParameterCalculation.cpp +++ b/src/VImageParameterCalculation.cpp @@ -739,6 +739,10 @@ float VImageParameterCalculation::correctSizeInMuonRing() { float xi_tmp = ( float )i / ( float )numSteps; + if( xi_tmp <= 0. ) + { + continue; + } float kTest_tmp = 2.0 * ngExi[i] * kRatio / xi_tmp; if( fabs( 1.0 - kTest_tmp ) < fabs( 1.0 - kTest ) ) From 3461a593e25df8060d9ab313485f422076775b3b Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 09:02:38 +0200 Subject: [PATCH 09/33] A10 --- src/VEmissionHeightCalculator.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/VEmissionHeightCalculator.cpp b/src/VEmissionHeightCalculator.cpp index 85c361474..a02471f1f 100644 --- a/src/VEmissionHeightCalculator.cpp +++ b/src/VEmissionHeightCalculator.cpp @@ -53,12 +53,18 @@ double VEmissionHeightCalculator::getEmissionHeight( float* cen_x, float* cen_y, fImageDistance = TMath::Tan( imageDistance( cen_x[i], cen_x[j], cen_y[i], cen_y[j] ) / TMath::RadToDeg() ); if( fImageDistance > 0. ) { + double iLogSizeI = log10( size[i] ); + double iLogSizeJ = log10( size[j] ); + if( iLogSizeI <= 0. || iLogSizeJ <= 0. ) + { + continue; + } // get distance between the two telescopes in shower coordinates fTelescopeDistanceSC = getTelescopeDistanceSC( i, j, az, el ); // calculate emission height [km] iEmissionHeightTemp = fTelescopeDistanceSC / fImageDistance / 1.e3; // weight for pairwise emission height calculation - iEmissionHeightWeightTemp = 1. / (( 1. / log10( size[i] ) ) + ( 1. / log10( size[j] ) ) ); + iEmissionHeightWeightTemp = 1. / (( 1. / iLogSizeI ) + ( 1. / iLogSizeJ ) ); iEmissionHeightWeight += iEmissionHeightWeightTemp; iEmissionHeight += iEmissionHeightTemp * iEmissionHeightWeightTemp; iEmissionHeight2 += iEmissionHeightTemp * iEmissionHeightTemp * iEmissionHeightWeightTemp; From a3cde891c00cf5073868fcb204903ebc9faa379d Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 09:03:30 +0200 Subject: [PATCH 10/33] A11 --- src/VEmissionHeightCalculator.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/VEmissionHeightCalculator.cpp b/src/VEmissionHeightCalculator.cpp index a02471f1f..300937272 100644 --- a/src/VEmissionHeightCalculator.cpp +++ b/src/VEmissionHeightCalculator.cpp @@ -111,6 +111,9 @@ void VEmissionHeightCalculator::setTelescopePositions( vector< float > x, vector { return; } + fTelX.clear(); + fTelY.clear(); + fTelZ.clear(); for( unsigned int i = 0; i < fNTel; i++ ) { fTelX.push_back( x[i] ); @@ -127,6 +130,9 @@ void VEmissionHeightCalculator::setTelescopePositions( vector< float > x, vector void VEmissionHeightCalculator::setTelescopePositions( unsigned int ntel, double* x, double* y, double* z ) { fNTel = ntel; + fTelX.clear(); + fTelY.clear(); + fTelZ.clear(); for( unsigned int i = 0; i < ntel; i++ ) { fTelX.push_back( x[i] ); From fede3fc4e01bdfee7956ff4ea07add7c062df2d9 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 09:04:54 +0200 Subject: [PATCH 11/33] A12 --- src/VInstrumentResponseFunctionData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VInstrumentResponseFunctionData.cpp b/src/VInstrumentResponseFunctionData.cpp index b7d87c741..0e73e88a5 100644 --- a/src/VInstrumentResponseFunctionData.cpp +++ b/src/VInstrumentResponseFunctionData.cpp @@ -476,7 +476,7 @@ void VInstrumentResponseFunctionData::fill( double iWeight ) iDiff = sqrt(( fData->Xcore - fData->MCxcore ) * ( fData->Xcore - fData->MCxcore ) + ( fData->Ycore - fData->MCycore ) * ( fData->Ycore - fData->MCycore ) ); // core error - iError = sqrt( fData->Xcore* fData->Xcore + fData->Xcore* fData->Xcore ) - + iError = sqrt( fData->Xcore* fData->Xcore + fData->Ycore* fData->Ycore ) - sqrt( fData->MCxcore* fData->MCxcore + fData->MCycore* fData->MCycore ); // relative error if( sqrt( fData->MCxcore * fData->MCxcore + fData->MCycore * fData->MCycore ) > 0. ) From 7b23c7d683f6a3ab9e1b60629e780712028fb2a1 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 09:06:10 +0200 Subject: [PATCH 12/33] A13 --- src/trainTMVAforGammaHadronSeparation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trainTMVAforGammaHadronSeparation.cpp b/src/trainTMVAforGammaHadronSeparation.cpp index 588ad9608..ad05a19dd 100644 --- a/src/trainTMVAforGammaHadronSeparation.cpp +++ b/src/trainTMVAforGammaHadronSeparation.cpp @@ -257,7 +257,7 @@ bool train( VTMVARunData* iRun, cout << "error during training: energy bin out of range " << iEnergyBin << endl; return false; } - if( iRun->fZenithCutData.size() < iZenithBin || iRun->fOutputFile[0].size() < iZenithBin ) + if( iRun->fZenithCutData.size() <= iZenithBin || iRun->fOutputFile[0].size() <= iZenithBin ) { cout << "error during training: zenith bin out of range " << iZenithBin << endl; return false; From 43fac3f2a8eacd30bfd1be812ad0e900111428e7 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 09:07:15 +0200 Subject: [PATCH 13/33] A14 --- src/trainTMVAforGammaHadronSeparation.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/trainTMVAforGammaHadronSeparation.cpp b/src/trainTMVAforGammaHadronSeparation.cpp index ad05a19dd..6abb9a134 100644 --- a/src/trainTMVAforGammaHadronSeparation.cpp +++ b/src/trainTMVAforGammaHadronSeparation.cpp @@ -340,9 +340,18 @@ bool train( VTMVARunData* iRun, ////////////////////////////////////////// // defining training class + TString iFactoryOptions = "V:!DrawProgressBar"; + if( iTrainGammaHadronSeparation ) + { + iFactoryOptions += ":AnalysisType=Classification"; + } + else + { + iFactoryOptions += ":AnalysisType=Regression"; + } TMVA::Factory *factory = new TMVA::Factory( iRun->fOutputFile[iEnergyBin][iZenithBin]->GetTitle(), iRun->fOutputFile[iEnergyBin][iZenithBin], - "V:!DrawProgressBar" ); + iFactoryOptions ); TMVA::DataLoader *dataloader = new TMVA::DataLoader( "" ); //////////////////////////// // train gamma/hadron separation From db2075fa38640a2be4123538149840bbbd5e4f53 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 09:08:19 +0200 Subject: [PATCH 14/33] A15 --- src/trainTMVAforAngularReconstruction.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/trainTMVAforAngularReconstruction.cpp b/src/trainTMVAforAngularReconstruction.cpp index f7d37f1f8..e3d726ad9 100644 --- a/src/trainTMVAforAngularReconstruction.cpp +++ b/src/trainTMVAforAngularReconstruction.cpp @@ -122,9 +122,6 @@ bool trainTMVA( string iOutputDir, float iTrainTest, cout << endl; exit( EXIT_FAILURE ); } - // unclear why factor of 0.8 - ntrain *= 0.8; - ntest *= 0.8; cout << "\tnumber of training events: " << ntrain << endl; cout << "\tnumber of test events : " << ntest << endl; cout << "\tfraction of training events : " << iTrainTest << endl << endl; From dd5629fe36fb7e76ca1d53691261b0cd67875fe6 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Fri, 29 May 2026 09:14:29 +0200 Subject: [PATCH 15/33] A17 --- src/VTraceHandler.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/VTraceHandler.cpp b/src/VTraceHandler.cpp index 06b89a945..f85659b6f 100644 --- a/src/VTraceHandler.cpp +++ b/src/VTraceHandler.cpp @@ -798,7 +798,10 @@ double VTraceHandler::calculateTraceSum_slidingWindow( unsigned int iSearchStart fSumWindowLast = n; } } - xmax = xmax - FADC[i] + FADC[i + iIntegrationWindow]; + if( i + iIntegrationWindow < n ) + { + xmax = xmax - FADC[i] + FADC[i + iIntegrationWindow]; + } } // arrival times (weighted average) float tcharge = 0.; From 3e036fabfdb1e36971353cbbef57599895b770d2 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 15:27:26 +0200 Subject: [PATCH 16/33] A4 --- src/VCalibrationData.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/VCalibrationData.cpp b/src/VCalibrationData.cpp index f85589b32..448ae9618 100644 --- a/src/VCalibrationData.cpp +++ b/src/VCalibrationData.cpp @@ -367,6 +367,7 @@ void VCalibrationData::setAverageTZero( double iAverageTzero, bool iLowGain ) if( iLowGain ) { fAverageTZero_lowgain = iAverageTzero; + return; } fAverageTZero_highgain = iAverageTzero; From d5da3d79ef29d53b85ab93c762b439c85587d334 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 15:47:54 +0200 Subject: [PATCH 17/33] B1 --- src/CData.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/CData.cpp b/src/CData.cpp index 7bacdbad4..995539f80 100644 --- a/src/CData.cpp +++ b/src/CData.cpp @@ -1077,7 +1077,15 @@ TTree* CData::getXGBTree( string file_name, string file_suffix, string tree_name return 0; } - file_name = file_name.replace( file_name.find( ".root" ), 5, "." + file_suffix + ".root" ); + size_t iRootPos = file_name.rfind( ".root" ); + if( iRootPos != string::npos && iRootPos + 5 == file_name.size() ) + { + file_name.replace( iRootPos, 5, "." + file_suffix + ".root" ); + } + else + { + file_name += "." + file_suffix + ".root"; + } TFile *iFile = TFile::Open( file_name.c_str() ); if(!iFile || iFile->IsZombie() ) { From f0d7588f85d40def7dfaf39c56e5702513974d19 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 16:02:45 +0200 Subject: [PATCH 18/33] B5 --- src/VTMVARunData.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VTMVARunData.cpp b/src/VTMVARunData.cpp index 11877d2ec..7a57a42ce 100644 --- a/src/VTMVARunData.cpp +++ b/src/VTMVARunData.cpp @@ -720,7 +720,7 @@ bool VTMVARunData::readConfigurationFile( char* iC ) // check sanity if( iZenithCut_min.size() < 2 ) { - cout << "VTMVARunData::readConfigurationFile error: need at least one zenith bin "; + cout << "VTMVARunData::readConfigurationFile error: insufficient number of zenith bins "; cout << iZenithCut_min.size() << endl; return false; } @@ -795,7 +795,7 @@ bool VTMVARunData::fillEnergyCutData( // check sanity if( iEnergyCut_Log10TeV_min.size() < 1 ) { - cout << "VTMVARunData::readConfigurationFile error: need at least two energy bins "; + cout << "VTMVARunData::readConfigurationFile error: insufficient number of energy bins "; cout << iEnergyCut_Log10TeV_min.size() << endl; return false; } From 311a727c69ce9105c416eaa0d60b604238e52ecc Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 16:05:16 +0200 Subject: [PATCH 19/33] B8 --- src/makeEffectiveArea.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/makeEffectiveArea.cpp b/src/makeEffectiveArea.cpp index 5d1cede19..7de358ced 100644 --- a/src/makeEffectiveArea.cpp +++ b/src/makeEffectiveArea.cpp @@ -379,20 +379,26 @@ VEffectiveAreaCalculatorMCHistograms* copyMCHistograms( TChain* c ) unsigned int z = 0; while(( chEl = ( TChainElement* )next() ) ) { - TFile* ifInput = new TFile( chEl->GetTitle() ); - if(!ifInput->IsZombie() ) + TFile ifInput( chEl->GetTitle() ); + if(!ifInput.IsZombie() ) { + VEffectiveAreaCalculatorMCHistograms* iMCHisFromFile = + ( VEffectiveAreaCalculatorMCHistograms* )ifInput.Get( "MChistos" ); + if(!iMCHisFromFile ) + { + continue; + } + if( z == 0 ) { - iMC_his = ( VEffectiveAreaCalculatorMCHistograms* )ifInput->Get( "MChistos" ); + iMC_his = ( VEffectiveAreaCalculatorMCHistograms* )iMCHisFromFile->Clone(); } else { if( iMC_his ) { - iMC_his->add(( VEffectiveAreaCalculatorMCHistograms* )ifInput->Get( "MChistos" ) ); + iMC_his->add( iMCHisFromFile ); } - ifInput->Close(); } z++; } From 05aed057cdb5fdce322e8fab27de83218318671f Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 16:11:39 +0200 Subject: [PATCH 20/33] B9 --- src/anasum.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anasum.cpp b/src/anasum.cpp index 65fe9fa1c..80f77eb5b 100644 --- a/src/anasum.cpp +++ b/src/anasum.cpp @@ -105,7 +105,7 @@ int main( int argc, char* argv[] ) // stereo analysis (default) if( analysisType == 3 || analysisType == 4 ) { - anasum->doStereoAnalysis(( analysisType == 3 ) || ( analysisType == 5 ) ); + anasum->doStereoAnalysis( analysisType == 3 ); } else { From 7f829f795d68435c4fd1c60a4d26c006091482f3 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 16:18:07 +0200 Subject: [PATCH 21/33] B13 --- src/makeEffectiveArea.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/makeEffectiveArea.cpp b/src/makeEffectiveArea.cpp index 7de358ced..43c679f54 100644 --- a/src/makeEffectiveArea.cpp +++ b/src/makeEffectiveArea.cpp @@ -115,7 +115,7 @@ int main( int argc, char* argv[] ) fCuts->printCutSummary(); ///////////////////////////////////////////////////////////////// - // read MC header (might not be there, no problem; but depend on right input in runparameter file) + // read MC header VMonteCarloRunHeader* iMonteCarloHeader = fRunPara->readMCRunHeader(); ///////////////////////////////////////////////////////////////// From 5b3a611980d6abf9984cd1277d93f494b9a490bd Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 16:19:16 +0200 Subject: [PATCH 22/33] B14 --- src/printRunParameter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/printRunParameter.cpp b/src/printRunParameter.cpp index c8128f458..1c5474df9 100644 --- a/src/printRunParameter.cpp +++ b/src/printRunParameter.cpp @@ -332,7 +332,7 @@ int main( int argc, char* argv[] ) { cout << "error: file not found: " << argv[1] << endl; cout << "exiting..." << endl; - exit( 0 ); + exit( EXIT_FAILURE ); } if( fOption.size() > 0 ) From 975b6cc421f353d0c92f211787c49eb3e70610e4 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 16:21:19 +0200 Subject: [PATCH 23/33] B13 --- src/VInstrumentResponseFunctionRunParameter.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/VInstrumentResponseFunctionRunParameter.cpp b/src/VInstrumentResponseFunctionRunParameter.cpp index 114f8d242..8071fa6ab 100644 --- a/src/VInstrumentResponseFunctionRunParameter.cpp +++ b/src/VInstrumentResponseFunctionRunParameter.cpp @@ -356,6 +356,13 @@ bool VInstrumentResponseFunctionRunParameter::readRunParameterFromTextFile( stri is_stream >> fRerunStereoReconstruction_3telescopes; } } + else + { + cout << "VInstrumentResponseFunctionRunParameter::readRunParameterFromTextFile error: unknown run parameter key " << temp << endl; + cout << "line: " << is_line << endl; + cout << "exiting..." << endl; + exit( EXIT_FAILURE ); + } } } cout << "========================================" << endl << endl; From 030c14c801fa947c98470261f0ed40bdfaf8181d Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 16:24:46 +0200 Subject: [PATCH 24/33] B15 --- src/VTableLookupRunParameter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VTableLookupRunParameter.cpp b/src/VTableLookupRunParameter.cpp index 327ae05f1..60d43f145 100644 --- a/src/VTableLookupRunParameter.cpp +++ b/src/VTableLookupRunParameter.cpp @@ -172,7 +172,7 @@ bool VTableLookupRunParameter::fillParameters( int argc, char* argv[] ) } else { - cout << "unknown parameter, choose 1=fill or 2=read lookup tables" << endl; + cout << "unknown parameter, choose 1=fill or 0=read lookup tables" << endl; return false; } } From 8675442912eb91ff1cd1080d71b31648b7464f21 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sat, 30 May 2026 16:26:47 +0200 Subject: [PATCH 25/33] changelog --- docs/changes/351.bugfix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/351.bugfix.md diff --git a/docs/changes/351.bugfix.md b/docs/changes/351.bugfix.md new file mode 100644 index 000000000..332994cb9 --- /dev/null +++ b/docs/changes/351.bugfix.md @@ -0,0 +1 @@ +Fixes long list of bugs listed in [Issue #351](https://github.com/VERITAS-Observatory/EventDisplay_v4/issues/352). From 303042f48899d3bcf9a7ce44048400ed22c5fff8 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sun, 31 May 2026 20:06:02 +0200 Subject: [PATCH 26/33] A2: fix sliding-window fRaw branch returning FADC[1] instead of charge calculateTraceSum_slidingWindow() fRaw branch accumulated the raw charge sum in 'charge' but returned FADC[1] (second sample, ped-subtracted) instead. Replace with 'return charge'. Fixes A2 in issue #352. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/changes/351.bugfix.md | 1 + src/VTraceHandler.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/changes/351.bugfix.md b/docs/changes/351.bugfix.md index 332994cb9..4d3d4a140 100644 --- a/docs/changes/351.bugfix.md +++ b/docs/changes/351.bugfix.md @@ -1 +1,2 @@ Fixes long list of bugs listed in [Issue #351](https://github.com/VERITAS-Observatory/EventDisplay_v4/issues/352). +Fix A2: `VTraceHandler::calculateTraceSum_slidingWindow()` fRaw branch returned `FADC[1]` (second FADC sample, ped-subtracted) instead of the accumulated raw charge sum. Affected pedestal calculation path. diff --git a/src/VTraceHandler.cpp b/src/VTraceHandler.cpp index f85659b6f..e8bd3b3c7 100644 --- a/src/VTraceHandler.cpp +++ b/src/VTraceHandler.cpp @@ -771,7 +771,7 @@ double VTraceHandler::calculateTraceSum_slidingWindow( unsigned int iSearchStart fSumWindowFirst = n - iIntegrationWindow; fSumWindowLast = n; - return FADC[1]; + return charge; } //////////////////////////////////////// From 7906bdab01f5073943f4c2bd6a324747b7e669fa Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sun, 31 May 2026 20:06:02 +0200 Subject: [PATCH 27/33] A2: fix sliding-window fRaw branch returning FADC[1] instead of charge calculateTraceSum_slidingWindow() fRaw branch accumulated the raw charge sum in 'charge' but returned FADC[1] (second sample, ped-subtracted) instead. Replace with 'return charge'. Fixes A2 in issue #352. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/changes/351.bugfix.md | 1 + src/VTraceHandler.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/changes/351.bugfix.md b/docs/changes/351.bugfix.md index 332994cb9..4d3d4a140 100644 --- a/docs/changes/351.bugfix.md +++ b/docs/changes/351.bugfix.md @@ -1 +1,2 @@ Fixes long list of bugs listed in [Issue #351](https://github.com/VERITAS-Observatory/EventDisplay_v4/issues/352). +Fix A2: `VTraceHandler::calculateTraceSum_slidingWindow()` fRaw branch returned `FADC[1]` (second FADC sample, ped-subtracted) instead of the accumulated raw charge sum. Affected pedestal calculation path. diff --git a/src/VTraceHandler.cpp b/src/VTraceHandler.cpp index f85659b6f..e8bd3b3c7 100644 --- a/src/VTraceHandler.cpp +++ b/src/VTraceHandler.cpp @@ -771,7 +771,7 @@ double VTraceHandler::calculateTraceSum_slidingWindow( unsigned int iSearchStart fSumWindowFirst = n - iIntegrationWindow; fSumWindowLast = n; - return FADC[1]; + return charge; } //////////////////////////////////////// From 70982afa3790f10c1af69ed57434686fc144bfeb Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sun, 31 May 2026 20:36:01 +0200 Subject: [PATCH 28/33] fix(E4): guard XGB sidecar file opens by reconstruction method and cut type Non-XGB effective-area and stereo-analysis jobs were unconditionally opening both XGB friend files (stereo + gamma-hadron) whenever their suffix strings were non-empty, even when the active reconstruction method and gamma-hadron cut type did not require them. Changes: - CData: store data file name in fDataFileName for deferred tree loading - CData::loadGHXGBTree(): new idempotent method to load the GH XGB friend tree on demand, after the analysis type is known - VStereoAnalysis::getDataFromFile(): pass stereo suffix only when fEnergyReconstructionMethod==2 or fDirectionReconstructionMethod==2; always pass empty GH suffix (deferred loading) - VStereoAnalysis::fillHistograms(): call loadGHXGBTree() after setCuts() if and only if fCuts->useXGBoostCuts() is true - makeEffectiveArea.cpp: guard both suffixes at construction time; fCuts->readCuts() is already called before CData is built Fixes: VERITAS-Observatory/EventDisplay_v4#352 (item E4) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/changes/352.bugfix.md | 23 +++++++++++++++++++++++ inc/CData.h | 2 ++ src/CData.cpp | 23 +++++++++++++++++++++++ src/VStereoAnalysis.cpp | 13 +++++++++++-- src/makeEffectiveArea.cpp | 6 +++++- 5 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 docs/changes/352.bugfix.md diff --git a/docs/changes/352.bugfix.md b/docs/changes/352.bugfix.md new file mode 100644 index 000000000..d9348b284 --- /dev/null +++ b/docs/changes/352.bugfix.md @@ -0,0 +1,23 @@ +# Bug fix: non-XGB jobs no longer probe XGB sidecar files (E4) + +**Files:** `src/CData.cpp`, `inc/CData.h`, `src/VStereoAnalysis.cpp`, `src/makeEffectiveArea.cpp` + +`CData` previously opened both the stereo-XGB and gamma-hadron-XGB friend files +unconditionally whenever their suffix strings were non-empty, even for jobs that +use reconstruction method 0 (DispBDT) or TMVA gamma-hadron cuts. This caused +spurious ROOT file-open errors and hidden dependencies on XGB artifacts that are +not required by those jobs. + +Changes: +- Added `fDataFileName` private member to `CData` so the data file path is + available for deferred loading. +- Added `CData::loadGHXGBTree(string gh_suffix)`: idempotent method that loads + the XGB gamma-hadron friend tree on demand, after the analysis type is known. +- `VStereoAnalysis::getDataFromFile()`: stereo-XGB suffix is now only passed when + `fEnergyReconstructionMethod == 2` or `fDirectionReconstructionMethod == 2`; + GH-XGB suffix is always passed as `""` here. +- `VStereoAnalysis::fillHistograms()`: after `setCuts()`, calls + `fDataRun->loadGHXGBTree()` only when `fCuts->useXGBoostCuts()` is true. +- `makeEffectiveArea.cpp`: guards both suffixes at construction time using the + same conditions; `fCuts->readCuts()` is called before `CData` is constructed, + so the analysis type is already known. diff --git a/inc/CData.h b/inc/CData.h index b1cc9a726..380a01e17 100644 --- a/inc/CData.h +++ b/inc/CData.h @@ -30,6 +30,7 @@ class CData vector< double > fTelX; vector< double > fTelY; vector< double > fTelZ; + string fDataFileName; void reconstruct_3tel_images( long unsigned int ); void reconstruct_3tel_images_direction(); @@ -280,6 +281,7 @@ class CData float get_Yoff( unsigned int method ); void initialize_xgb_tree(); TTree* getXGBTree( string file_name, string suffix, string tree_name ); + bool loadGHXGBTree( string gh_suffix ); pair get_XYoff_derot( unsigned int method ); virtual Long64_t LoadTree( Long64_t entry ); float get_GH_Gamma_Prediction(); diff --git a/src/CData.cpp b/src/CData.cpp index 7bacdbad4..ce7ee5b57 100644 --- a/src/CData.cpp +++ b/src/CData.cpp @@ -31,6 +31,7 @@ CData::CData( TTree* tree, bool bMC, bool bShort, string file_name, string stere fShort = bShort; fVersion = 6; fTelescopeCombination = 0; + fDataFileName = file_name; Init( tree ); fStereoFriendTree = getXGBTree( file_name, stereo_suffix, "StereoAnalysis" ); @@ -1126,3 +1127,25 @@ void CData::initialize_xgb_tree() GH_Is_Gamma = false; } } + +/* + * Deferred loading of the XGB gamma-hadron friend tree. + * Call this after the analysis type is known (e.g. after readCuts()), + * when the caller has confirmed that XGB gamma-hadron cuts are active. + * Idempotent: a second call is a no-op if the tree is already loaded. + */ +bool CData::loadGHXGBTree( string gh_suffix ) +{ + if( fGHFriendTree ) + { + return true; + } + if( fDataFileName.empty() ) + { + cout << "CData::loadGHXGBTree error: no data file name stored" << endl; + return false; + } + fGHFriendTree = getXGBTree( fDataFileName, gh_suffix, "Classification" ); + initialize_xgb_tree(); + return ( fGHFriendTree != 0 ); +} diff --git a/src/VStereoAnalysis.cpp b/src/VStereoAnalysis.cpp index 3147257f0..8cbe42126 100644 --- a/src/VStereoAnalysis.cpp +++ b/src/VStereoAnalysis.cpp @@ -348,6 +348,14 @@ double VStereoAnalysis::fillHistograms( int icounter, int irun, double iAzMin, d // initialize cuts setCuts( fRunPara->fRunList[fHisCounter], irun ); + // load XGB gamma-hadron friend tree now that the analysis type is known + if( fCuts && fCuts->useXGBoostCuts() + && fDataRun + && !fRunPara->fXGB_gh_file_suffix.empty() ) + { + fDataRun->loadGHXGBTree( fRunPara->fXGB_gh_file_suffix ); + } + // define histograms fDirTotRun[fHisCounter]->cd(); fHisto[fHisCounter]->setRunNumber( irun ); @@ -1967,8 +1975,9 @@ CData* VStereoAnalysis::getDataFromFile( int i_runNumber ) false, false, iFileName, - fRunPara->fXGB_stereo_file_suffix, - fRunPara->fXGB_gh_file_suffix + ( fRunPara->fEnergyReconstructionMethod == 2 || fRunPara->fDirectionReconstructionMethod == 2 ) + ? fRunPara->fXGB_stereo_file_suffix : "", + "" // GH XGB tree loaded later, after analysis type is known from cut file ); // read current (major) epoch from data file VEvndispRunParameter* i_runPara = ( VEvndispRunParameter* )fDataFile->Get( "runparameterV2" ); diff --git a/src/makeEffectiveArea.cpp b/src/makeEffectiveArea.cpp index 5d1cede19..d29f4665e 100644 --- a/src/makeEffectiveArea.cpp +++ b/src/makeEffectiveArea.cpp @@ -180,7 +180,11 @@ int main( int argc, char* argv[] ) exit( EXIT_FAILURE ); } - CData d( c, true, false, fRunPara->fdatafile, fRunPara->fXGB_stereo_file_suffix, fRunPara->fXGB_gh_file_suffix ); + const bool i_need_stereo_xgb = ( fRunPara->fEnergyReconstructionMethod == 2 + || fRunPara->fDirectionReconstructionMethod == 2 ); + CData d( c, true, false, fRunPara->fdatafile, + i_need_stereo_xgb ? fRunPara->fXGB_stereo_file_suffix : "", + fCuts->useXGBoostCuts() ? fRunPara->fXGB_gh_file_suffix : "" ); d.initialize_3tel_reconstruction( fRunPara->fRerunStereoReconstruction_3telescopes, fRunPara->fRerunStereoReconstruction_minAngle, From 219f1d49a607f846e9e47c4bb7e314d1fc2cb4af Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sun, 31 May 2026 20:40:27 +0200 Subject: [PATCH 29/33] docs: shorten E4 changelog entry Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/changes/352.bugfix.md | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/docs/changes/352.bugfix.md b/docs/changes/352.bugfix.md index d9348b284..7b8285127 100644 --- a/docs/changes/352.bugfix.md +++ b/docs/changes/352.bugfix.md @@ -1,23 +1,5 @@ # Bug fix: non-XGB jobs no longer probe XGB sidecar files (E4) -**Files:** `src/CData.cpp`, `inc/CData.h`, `src/VStereoAnalysis.cpp`, `src/makeEffectiveArea.cpp` - -`CData` previously opened both the stereo-XGB and gamma-hadron-XGB friend files -unconditionally whenever their suffix strings were non-empty, even for jobs that -use reconstruction method 0 (DispBDT) or TMVA gamma-hadron cuts. This caused -spurious ROOT file-open errors and hidden dependencies on XGB artifacts that are -not required by those jobs. - -Changes: -- Added `fDataFileName` private member to `CData` so the data file path is - available for deferred loading. -- Added `CData::loadGHXGBTree(string gh_suffix)`: idempotent method that loads - the XGB gamma-hadron friend tree on demand, after the analysis type is known. -- `VStereoAnalysis::getDataFromFile()`: stereo-XGB suffix is now only passed when - `fEnergyReconstructionMethod == 2` or `fDirectionReconstructionMethod == 2`; - GH-XGB suffix is always passed as `""` here. -- `VStereoAnalysis::fillHistograms()`: after `setCuts()`, calls - `fDataRun->loadGHXGBTree()` only when `fCuts->useXGBoostCuts()` is true. -- `makeEffectiveArea.cpp`: guards both suffixes at construction time using the - same conditions; `fCuts->readCuts()` is called before `CData` is constructed, - so the analysis type is already known. +XGB sidecar files (stereo and gamma-hadron) are now opened only when the active +reconstruction method and gamma-hadron cut type actually require them, eliminating +spurious ROOT file-open errors in non-XGB jobs. From 8386431e77fa527db26d2c0e63c3e1267abdc76d Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Sun, 31 May 2026 21:09:18 +0200 Subject: [PATCH 30/33] fix: explicit NegWeightTreatment=Pray for BoostType=Grad in TMVA angular training BoostType=Grad does not support InverseBoostNegWeights (TMVA's global default for BDT), which caused TMVA to silently replace it with Pray, making the effective training configuration differ from the nominal one. Explicitly setting NegWeightTreatment=Pray in the default options string eliminates the silent substitution and ensures the logged configuration matches actual training behaviour. Fixes: VERITAS-Observatory/EventDisplay_v4#352 (item from mvaAngRes log) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/changes/353.bugfix.md | 7 +++++++ src/trainTMVAforAngularReconstruction.cpp | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 docs/changes/353.bugfix.md diff --git a/docs/changes/353.bugfix.md b/docs/changes/353.bugfix.md new file mode 100644 index 000000000..14b2bfb55 --- /dev/null +++ b/docs/changes/353.bugfix.md @@ -0,0 +1,7 @@ +# Bug fix: explicit NegWeightTreatment for TMVA Gradient BDT angular reconstruction + +Added `NegWeightTreatment=Pray` to the default TMVA options in +`trainTMVAforAngularReconstruction` to match actual TMVA behaviour: +`BoostType=Grad` does not support `InverseBoostNegWeights` (TMVA's global +default) and silently replaces it with `Pray`; the options string now +declares this explicitly so the training configuration matches what is used. diff --git a/src/trainTMVAforAngularReconstruction.cpp b/src/trainTMVAforAngularReconstruction.cpp index f7d37f1f8..015a95a80 100644 --- a/src/trainTMVAforAngularReconstruction.cpp +++ b/src/trainTMVAforAngularReconstruction.cpp @@ -878,8 +878,10 @@ int main( int argc, char* argv[] ) iQualityCut = argv[7]; } // TMVA options (default options derived from hyperparameter optimisation on CTAO prod3 simulations) + // NegWeightTreatment=Pray is explicit here: BoostType=Grad does not support + // InverseBoostNegWeights (TMVA's global default) and silently replaces it with Pray. string iTMVAOptions = "NTrees=100:BoostType=Grad:Shrinkage=0.1:UseBaggedBoost:GradBaggingFraction=0.5:nCuts=20:MaxDepth=10:"; - iTMVAOptions += "PruneMethod=ExpectedError:RegressionLossFunctionBDTG=Huber:MinNodeSize=0.02:VarTransform=N"; + iTMVAOptions += "PruneMethod=ExpectedError:RegressionLossFunctionBDTG=Huber:MinNodeSize=0.02:NegWeightTreatment=Pray:VarTransform=N"; if( argc >= 9 ) { iTMVAOptions = argv[8]; From d24c1b62a01bc0002aa0778d6c69a4c86d81d98c Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Mon, 1 Jun 2026 20:56:00 +0200 Subject: [PATCH 31/33] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/VStereoAnalysis.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/VStereoAnalysis.cpp b/src/VStereoAnalysis.cpp index 8cbe42126..3efe644b9 100644 --- a/src/VStereoAnalysis.cpp +++ b/src/VStereoAnalysis.cpp @@ -353,7 +353,13 @@ double VStereoAnalysis::fillHistograms( int icounter, int irun, double iAzMin, d && fDataRun && !fRunPara->fXGB_gh_file_suffix.empty() ) { - fDataRun->loadGHXGBTree( fRunPara->fXGB_gh_file_suffix ); + if(!fDataRun->loadGHXGBTree( fRunPara->fXGB_gh_file_suffix ) ) + { + cout << "VStereoAnalysis::fillHistograms error: failed to load XGB gamma-hadron friend tree" << endl; + cout << "suffix: " << fRunPara->fXGB_gh_file_suffix << endl; + cout << "exiting..." << endl; + exit( EXIT_FAILURE ); + } } // define histograms From a820596b44d14c97d00372c7dcaf53ec00435aa1 Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Mon, 1 Jun 2026 20:56:47 +0200 Subject: [PATCH 32/33] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/changes/351.bugfix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changes/351.bugfix.md b/docs/changes/351.bugfix.md index 4d3d4a140..66290ef36 100644 --- a/docs/changes/351.bugfix.md +++ b/docs/changes/351.bugfix.md @@ -1,2 +1,2 @@ -Fixes long list of bugs listed in [Issue #351](https://github.com/VERITAS-Observatory/EventDisplay_v4/issues/352). +Fixes long list of bugs listed in [Issue #352](https://github.com/VERITAS-Observatory/EventDisplay_v4/issues/352). Fix A2: `VTraceHandler::calculateTraceSum_slidingWindow()` fRaw branch returned `FADC[1]` (second FADC sample, ped-subtracted) instead of the accumulated raw charge sum. Affected pedestal calculation path. From 94f00c16e114dcf5faf09b6e070f522cfad13fed Mon Sep 17 00:00:00 2001 From: Gernot Maier Date: Mon, 1 Jun 2026 20:58:47 +0200 Subject: [PATCH 33/33] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/VInstrumentResponseFunctionRunParameter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/VInstrumentResponseFunctionRunParameter.cpp b/src/VInstrumentResponseFunctionRunParameter.cpp index 8071fa6ab..5d7f66ede 100644 --- a/src/VInstrumentResponseFunctionRunParameter.cpp +++ b/src/VInstrumentResponseFunctionRunParameter.cpp @@ -360,8 +360,7 @@ bool VInstrumentResponseFunctionRunParameter::readRunParameterFromTextFile( stri { cout << "VInstrumentResponseFunctionRunParameter::readRunParameterFromTextFile error: unknown run parameter key " << temp << endl; cout << "line: " << is_line << endl; - cout << "exiting..." << endl; - exit( EXIT_FAILURE ); + return false; } } }