//////////////////////////////////////////////////////////////////////////////// /// \file fitquad.cc /// /// \brief This plots the fitter performance /// /// \author P Jones /// /// REVISION HISTORY:\n /// 2014-06-16 : P G Jones - new file.\n // 2018-02-10 : R Lane - change to function arguments necessary for ROOT 6 compatibility /// /// \details The performance is defined as the resolution in both /// position and energy verus radius, energy etc... /// //////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include void fitquad(std::string event_file, std::string outfile) { RAT::DU::DSReader* dsReader = new RAT::DU::DSReader(event_file); TFile *outtfile = new TFile(outfile.c_str(),"RECREATE"); TH1D *hCenterRes = new TH1D("hCenterRes", "1 MeV electrons at the center;Reconstructed X (mm);Events per bin", 100, -6000, 6000); TProfile *hReconVsRadius = new TProfile("hReconVsRadius", "1 MeV electrons (error bars are RMS);(Radius/6005 mm)**3;Reconstructed X - True X (mm)", 5, 0, 1, -750.0, 750.0, "s"); TProfile *hReconVsEnergy = new TProfile("hReconVsEnergy", "Electrons at center (error bars are RMS);Kinetic energy (MeV);Reconstructed X (mm)", 5, 0.9, 3.6, -750.0, 750.0, "s"); for( size_t iEntry = 0; iEntry < dsReader->GetEntryCount(); iEntry++ ) { const RAT::DS::Entry& rDS = dsReader->GetEntry( iEntry ); const TVector3 mcPos = rDS.GetMC().GetMCParticle(0).GetPosition(); const double mcEnergy = rDS.GetMC().GetMCParticle(0).GetKineticEnergy(); for( size_t iEV = 0; iEV < rDS.GetEVCount(); iEV++ ) { const RAT::DS::EV& rEV = rDS.GetEV( iEV ); if( !rEV.FitResultExists( "quad" ) || rEV.GetFitResult( "quad" ).GetVertexCount() == 0 || !rEV.GetFitResult( "quad" ).GetValid() ) continue; const TVector3 fitPos = rEV.GetFitResult( "quad" ).GetVertex(0).GetPosition(); if( mcEnergy < 1.05 && mcPos.X() < 0.5 ) hCenterRes->Fill( fitPos.X() ); if( mcEnergy > 1.05 && mcPos.X() < 0.5 ) hReconVsEnergy->Fill( mcEnergy, fitPos.X() ); if( mcEnergy < 1.05 && mcPos.X() > 0.5 ) hReconVsRadius->Fill( TMath::Power( mcPos.Mag() / 6005, 3.0 ), fitPos.X() - mcPos.X() ); } } TF1 *g1 = new TF1("g1","gaus",-2000,2000); hCenterRes->Fit(g1,"R"); hReconVsRadius->SetMinimum(-600); hReconVsRadius->SetMaximum(600); hReconVsEnergy->SetMinimum(-600); hReconVsEnergy->SetMaximum(600); outtfile->cd(); hCenterRes->Write(); hReconVsRadius->Write(); hReconVsEnergy->Write(); outtfile->Close(); delete outtfile; delete dsReader; }