diff --git a/.travis.yml b/.travis.yml index 5f17d9b9462171004b3c5b6f758be4a9cc12b8ed..b3c76136d89f79c4e4577f4f550b1f1e332134ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,10 +11,10 @@ compiler: before_install: # Linux - - if [ "$TRAVIS_OS_NAME" == "linux" ]; then cd && wget https://root.cern.ch/download/root_v6.14.00.Linux-ubuntu14-x86_64-gcc4.8.tar.gz; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then cd && wget -q https://root.cern.ch/download/root_v6.14.00.Linux-ubuntu14-x86_64-gcc4.8.tar.gz; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then tar -xf root_v6.14.00.Linux-ubuntu14-x86_64-gcc4.8.tar.gz; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then source ~/root/bin/thisroot.sh; fi - - if [ "$TRAVIS_OS_NAME" == "linux" ]; then cd && wget https://www.dropbox.com/s/8hxjkd6twdsv5fi/geant4_install_new.tar.gz; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then cd && wget -q https://www.dropbox.com/s/8hxjkd6twdsv5fi/geant4_install_new.tar.gz; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then tar -xf geant4_install_new.tar.gz; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then source ~/geant4_install/share/Geant4-10.1.2/geant4make/geant4make.sh; fi diff --git a/Examples/Example1/ShowResults.C b/Examples/Example1/ShowResults.C index eabef9bf3da7fce25623e7d096d46b3c72f27876..8ea68944e989e3f7845c980a10f7837f31c3488e 100644 --- a/Examples/Example1/ShowResults.C +++ b/Examples/Example1/ShowResults.C @@ -1,5 +1,5 @@ -#include"NPReaction.h" - +#include "NPReaction.h" +#include "NPNucleus.h" TCutG* ETOF=NULL; TCutG* EDE=NULL; TChain* chain=NULL ; @@ -31,21 +31,33 @@ void ShowResults(){ // E-DE c1->cd(1); chain->Draw("SSSD.Energy:MUST2.Si_E>>hIDE(1000,0,35,1000,0,5)","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5","colz"); - + TH1F* hIDE = (TH1F*) gDirectory->FindObjectAny("hIDE"); + hIDE->GetYaxis()->SetTitle("SSSD Energy (MeV)"); + hIDE->GetXaxis()->SetTitle("MUST2 Energy (MeV)"); + EDE->Draw("same"); // E-TOF c1->cd(2); chain->Draw("MUST2.Si_T:SSSD.Energy+MUST2.Si_E>>hIDT(1000,0,35,500,450,500)","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5","colz"); - + TH1F* hIDT = (TH1F*) gDirectory->FindObjectAny("hIDT"); + hIDT->GetYaxis()->SetTitle("TOF (ns)"); + hIDT->GetXaxis()->SetTitle("Energy (MeV)"); + ETOF->Draw("same"); // Kinematical Line // c1->cd(3); chain->Draw("ELab:ThetaLab>>h(1000,0,90,1000,0,30)","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5 && EDE && ETOF","colz"); + TH1F* h = (TH1F*) gDirectory->FindObjectAny("h"); + h->GetYaxis()->SetTitle("Energy (MeV)"); + h->GetXaxis()->SetTitle("Theta Lab(deg)"); NPL::Reaction r("11Li(d,3He)10He@553"); + vector<string> v={"8He","n","n"}; + r.GetNucleus4()->DefineMassByThreshold(v); + r.SetExcitationHeavy(1.4); TGraph* Kine = r.GetKinematicLine3(); Kine->SetLineWidth(2); @@ -78,17 +90,32 @@ void ShowResults(){ c2->cd(1); chain->Draw("OriginalELab:OriginalThetaLab>>hS(1000,0,90,1000,0,30)","","col"); + TH1F* hS = (TH1F*) gDirectory->FindObjectAny("hS"); + hS->GetYaxis()->SetTitle("Simulated Energy (MeV)"); + hS->GetXaxis()->SetTitle("Simulated Theta Lab (deg)"); Kine->Draw("c"); c2->cd(2); chain->Draw("OriginalELab:ELab>>hS2(1000,0,30,1000,0,30)","ELab>0","col"); + TH1F* hS2 = (TH1F*) gDirectory->FindObjectAny("hS2"); + hS2->GetYaxis()->SetTitle("Simulated Energy (MeV)"); + hS2->GetXaxis()->SetTitle("Reconstructed Energy (MeV)"); + TLine* lE = new TLine(0,0,30,30); lE->Draw(); c2->cd(3); chain->Draw("OriginalThetaLab:ThetaLab>>hS3(1000,0,90,1000,0,90)","ThetaLab>0","col"); + TH1F* hS3 = (TH1F*) gDirectory->FindObjectAny("hS3"); + hS3->GetYaxis()->SetTitle("Simulated Theta Lab (deg)"); + hS3->GetXaxis()->SetTitle("Reconstructed Theta Lab (deg)"); + TLine* lT = new TLine(0,0,90,90); lT->Draw(); c2->cd(4); chain->Draw("OriginalBeamEnergy:BeamEnergy>>hS4(1000,500,600,1000,500,600)","BeamEnergy>0","col"); + TH1F* hS4 = (TH1F*) gDirectory->FindObjectAny("hS4"); + hS4->GetYaxis()->SetTitle("Simulated Beam Energy (MeV)"); + hS4->GetXaxis()->SetTitle("Reconstructed Beam Energy (MeV)"); + TLine* lB = new TLine(500,500,600,600); lB->Draw(); diff --git a/Examples/Example4/Analysis.cxx b/Examples/Example4/Analysis.cxx new file mode 100644 index 0000000000000000000000000000000000000000..ddc53e84c67d791f859aed8ad8a9fcddc992522f --- /dev/null +++ b/Examples/Example4/Analysis.cxx @@ -0,0 +1,293 @@ +/***************************************************************************** + * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Morfouace Pierre contact address: morfouace@ganil.fr * + * * + * Creation Date : April 2018 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe Actar analysis project * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +#include<iostream> + +using namespace std; +#include"Analysis.h" +#include"NPAnalysisFactory.h" +#include"NPDetectorManager.h" +#include"RootOutput.h" +#include"RootInput.h" + + +//////////////////////////////////////////////////////////////////////////////// +Analysis::Analysis(){ +} +//////////////////////////////////////////////////////////////////////////////// +Analysis::~Analysis(){ +} + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::Init(){ + Actar= (TActarPhysics*) m_DetectorManager->GetDetector("Actar"); + ReactionConditions = new TReactionConditions(); + + Actar->ReadAnalysisConfig(); + if(Actar->GetRansacStatus()){ + Actar->SetRansacParameter("./configs/RansacConfig.dat"); + } + + DriftVelocity = Actar->GetDriftVelocity(); + PadSizeX = Actar->GetPadSizeX(); + PadSizeY = Actar->GetPadSizeY(); + NumberOfPadsX = Actar->GetNumberOfPadsX(); + NumberOfPadsY = Actar->GetNumberOfPadsY(); + + EnergyLoss_1H = NPL::EnergyLoss("./EnergyLossTable/proton_iC4H10_6.24151e+07_295.G4table","G4Table",100); + EnergyLoss_18O = NPL::EnergyLoss("./EnergyLossTable/O18_iC4H10_6.24151e+07_295.G4table","G4Table",100); + TheReaction = new NPL::Reaction("18O(p,p)18O@59"); + + InitInputBranch(); + InitOutputBranch(); +} + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::TreatEvent(){ + ReInitValue(); + + LightName=""; + if(ReactionConditions->GetParticleMultiplicity()>0){ + InitXVertex = ReactionConditions->GetVertexPositionZ(); + InitTheta3 = ReactionConditions->GetTheta(0); + InitE3 = ReactionConditions->GetKineticEnergy(0); + LightName = ReactionConditions->GetParticleName(0); + } + int TrackMult = Actar->GetTrackMult(); + + TVector3 vX = TVector3(1,0,0); + TVector3 aTrack, vB; + + if(TrackMult>1){ + vTrack = Actar->GetTracks(); + double scalarproduct=0; + int BeamTrack=0; + for(unsigned int i=0; i<TrackMult; i++){ + TVector3 vtest = TVector3(vTrack[i].GetDirectionVector().X(),vTrack[i].GetDirectionVector().Y(),vTrack[i].GetDirectionVector().Z()); + TVector3 vunit = vtest.Unit(); + double scalar = abs(vunit.Dot(vX)); + vScalar.push_back(scalar); + //cout << scalar << endl; + //cout << scalarproduct << endl; + if(scalar>scalarproduct){ + BeamTrack=i; + scalarproduct=scalar; + } + } + + double XBeam = vTrack[BeamTrack].GetDirectionVector().X(); + double YBeam = vTrack[BeamTrack].GetDirectionVector().Y(); + double ZBeam = vTrack[BeamTrack].GetDirectionVector().Z(); + TVector3 vBeam = TVector3(XBeam,YBeam,ZBeam); + + double XBeamPoint = vTrack[BeamTrack].GetXh(); + double YBeamPoint = vTrack[BeamTrack].GetYh(); + double ZBeamPoint = vTrack[BeamTrack].GetZh(); + TVector3 vBeamPos = TVector3(XBeamPoint,YBeamPoint,ZBeamPoint); + + vB = TVector3(XBeam*PadSizeX, YBeam*PadSizeY,ZBeam*DriftVelocity); + BeamAngle = (vX.Angle(vB))*180/TMath::Pi(); + + for(unsigned int i=0; i<TrackMult; i++){ + if(i!=BeamTrack){ + double Xdir = vTrack[i].GetDirectionVector().X(); + double Ydir = vTrack[i].GetDirectionVector().Y(); + double Zdir = vTrack[i].GetDirectionVector().Z(); + + double vertex_x = vTrack[i].GetVertexPostion(vBeam,vBeamPos).X()*PadSizeX; + double vertex_y = vTrack[i].GetVertexPostion(vBeam,vBeamPos).Y()*PadSizeY; + double vertex_z = vTrack[i].GetVertexPostion(vBeam,vBeamPos).Z()*DriftVelocity; + + aTrack = TVector3(Xdir*PadSizeX, Ydir*PadSizeY, Zdir*DriftVelocity); + double angle = vX.Angle(aTrack)*180/TMath::Pi(); + //double angle = vB.Angle(aTrack)*180/TMath::Pi(); + if(angle>90) angle = 180-angle; + + double x1 = vTrack[i].GetXm()*PadSizeX; + double x2 = vTrack[i].GetXh()*PadSizeX; + double y1 = vTrack[i].GetYm()*PadSizeY-0.5*NumberOfPadsY*PadSizeY; + double y2 = vTrack[i].GetYh()*PadSizeY-0.5*NumberOfPadsY*PadSizeY; + //double z1 = -(vTrack[i].GetZm()-256)*DriftVelocity; + //double z2 = -(vTrack[i].GetZh()-256)*DriftVelocity; + double z1 = vTrack[i].GetZm()*DriftVelocity; + double z2 = vTrack[i].GetZh()*DriftVelocity; + + + + if(vertex_x>0 && vertex_x<256){ + double LengthInGas = fSiDistanceX - vertex_x; + for(unsigned int k=0; k<Actar->Si_E.size(); k++){ + XVertex.push_back(vertex_x); + YVertex.push_back(vertex_y); + ZVertex.push_back(vertex_z); + + GetMayaSiHitPosition(x1,x2,y1,y2,z1,z2); + ESi.push_back(Actar->Si_E[k]); + SiNumber.push_back(Actar->Si_Number[k]); + + DE.push_back(vTrack[i].GetPartialCharge(108,128)/(20./cos(angle*TMath::Pi()/180))); + double E3; + + if(LightName=="proton")E3 = EnergyLoss_1H.EvaluateInitialEnergy(Actar->Si_E[k]*MeV,LengthInGas*mm,angle*TMath::Pi()/180); + if(LightName=="deuteron")E3 = EnergyLoss_2H.EvaluateInitialEnergy(Actar->Si_E[k]*MeV,LengthInGas*mm,angle*TMath::Pi()/180); + if(LightName=="triton")E3 = EnergyLoss_3H.EvaluateInitialEnergy(Actar->Si_E[k]*MeV,LengthInGas*mm,angle*TMath::Pi()/180); + if(LightName=="He3")E3 = EnergyLoss_3He.EvaluateInitialEnergy(Actar->Si_E[k]*MeV,LengthInGas*mm,angle*TMath::Pi()/180); + if(LightName=="alpha")E3 = EnergyLoss_4He.EvaluateInitialEnergy(Actar->Si_E[k]*MeV,LengthInGas*mm,angle*TMath::Pi()/180); + //double BeamEnergy = EnergyLoss_18O.Slow(59.4*MeV,(vertex_x[i]+60)*mm, BeamAngle*TMath::Pi()/180); + double Energy_beam = EnergyLoss_18O.Slow(59.4*MeV,(vertex_x+60)*mm, 0); + BeamEnergy.push_back(Energy_beam); + TheReaction->SetBeamEnergy(Energy_beam); + ELab.push_back(E3); + ThetaLab.push_back(angle); + TheReaction->SetNuclei3(E3,angle*TMath::Pi()/180); + Ex.push_back(TheReaction->GetExcitation4()); + ThetaCM.push_back(TheReaction->GetThetaCM()*180./TMath::Pi()); + } + } + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::GetMayaSiHitPosition(double xm, double xh, double ym, double yh, double zm, double zh) +{ + double X1, X2, Y1, Y2, Z1, Z2; + + if(xm>xh){ + X1 = xh; + Y1 = yh; + Z1 = zh; + + X2 = xm; + Y2 = ym; + Z2 = zm; + } + else if(xh>xm){ + X1 = xm; + Y1 = ym; + Z1 = zm; + + X2 = xh; + Y2 = yh; + Z2 = zh; + } + + double l, L, t; + double zf, yf; + + if(fSiDistanceX>X2){ + L = fSiDistanceX-X2; + l = X2 - X1; + t = (l+L)/l; + + zf = Z1 + (Z2-Z1)*t; + yf = Y1 + (Y2-Y1)*t; + } + else if(fSiDistanceX<X2){ + L = X2 - fSiDistanceX; + l = fSiDistanceX - X1; + t = (l+L)/l; + + zf = Z1 + (Z2-Z1)/t; + yf = Y1 + (Y2-Y1)/t; + } + + SiPosY.push_back(yf); + SiPosZ.push_back(zf); +} + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::End(){ +} + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::InitInputBranch() { + RootInput::getInstance()->GetChain()->SetBranchStatus("ReactionConditions",true); + RootInput::getInstance()->GetChain()->SetBranchStatus("fRC_*",true); + RootInput::getInstance()->GetChain()->SetBranchAddress("ReactionConditions",&ReactionConditions); +} +//////////////////////////////////////////////////////////////////////////////// +void Analysis::InitOutputBranch() { + RootOutput::getInstance()->GetTree()->Branch("DE",&DE); + RootOutput::getInstance()->GetTree()->Branch("SiNumber",&SiNumber); + RootOutput::getInstance()->GetTree()->Branch("ESi",&ESi); + RootOutput::getInstance()->GetTree()->Branch("ELab",&ELab); + RootOutput::getInstance()->GetTree()->Branch("ThetaLab",&ThetaLab); + RootOutput::getInstance()->GetTree()->Branch("Ex",&Ex); + RootOutput::getInstance()->GetTree()->Branch("ThetaCM",&ThetaCM); + RootOutput::getInstance()->GetTree()->Branch("vScalar",&vScalar); + RootOutput::getInstance()->GetTree()->Branch("XVertex",&XVertex); + RootOutput::getInstance()->GetTree()->Branch("YVertex",&YVertex); + RootOutput::getInstance()->GetTree()->Branch("ZVertex",&ZVertex); + RootOutput::getInstance()->GetTree()->Branch("BeamAngle",&BeamAngle,"BeamAngle/D"); + RootOutput::getInstance()->GetTree()->Branch("BeamEnergy",&BeamEnergy); + RootOutput::getInstance()->GetTree()->Branch("SiPosY",&SiPosY); + RootOutput::getInstance()->GetTree()->Branch("SiPosZ",&SiPosZ); + RootOutput::getInstance()->GetTree()->Branch("InitXVertex",&InitXVertex,"InitXVertex/D"); + RootOutput::getInstance()->GetTree()->Branch("InitE3",&InitE3,"InitE3/D"); + RootOutput::getInstance()->GetTree()->Branch("InitTheta3",&InitTheta3,"InitTheta3/D"); + +} + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::ReInitValue(){ + DE.clear(); + SiNumber.clear(); + ESi.clear(); + ELab.clear(); + ThetaLab.clear(); + Ex.clear(); + ThetaCM.clear(); + vScalar.clear(); + XVertex.clear(); + YVertex.clear(); + ZVertex.clear(); + SiPosY.clear(); + SiPosZ.clear(); + BeamEnergy.clear(); + + BeamAngle=-1000; + InitE3=-1000; + InitTheta3=-1000; + InitXVertex=-1000; +} + +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPL::VAnalysis* Analysis::Construct(){ + return (NPL::VAnalysis*) new Analysis(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern "C"{ + class proxy{ + public: + proxy(){ + NPL::AnalysisFactory::getInstance()->SetConstructor(Analysis::Construct); + } + }; + + proxy p; +} diff --git a/Examples/Example4/Analysis.h b/Examples/Example4/Analysis.h new file mode 100644 index 0000000000000000000000000000000000000000..562d4eae0a44a023624a5af0a2e8394c2f85af87 --- /dev/null +++ b/Examples/Example4/Analysis.h @@ -0,0 +1,99 @@ +#ifndef Analysis_h +#define Analysis_h +/***************************************************************************** + * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: XAUTHORX contact address: XMAILX * + * * + * Creation Date : XMONTHX XYEARX * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe Actar analysis project * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +#include "NPVAnalysis.h" +#include "TActarPhysics.h" +#include "NPEnergyLoss.h" +#include "NPReaction.h" +#include "NPTrack.h" +#include "TReactionConditions.h" + + + +class Analysis: public NPL::VAnalysis{ +public: + Analysis(); + ~Analysis(); + +public: + void Init(); + void TreatEvent(); + void End(); + void InitOutputBranch(); + void InitInputBranch(); + void ReInitValue(); + void GetMayaSiHitPosition(double xm, double xh, double ym, double yh, double zm, double zh); + + + + static NPL::VAnalysis* Construct(); + +public: + double DriftVelocity; + double PadSizeX; + double PadSizeY; + int NumberOfPadsX; + int NumberOfPadsY; + + string LightName=""; + + +private: + double fSiDistanceX=256+47; + + TActarPhysics* Actar; + + vector<NPL::Track> vTrack; + + double BeamAngle; + double InitXVertex; + double InitE3; + double InitTheta3; + vector<double> BeamEnergy; + vector<double> vScalar; + vector<double> ThetaLab; + vector<double> ELab; + vector<int> SiNumber; + vector<double> ESi; + vector<double> DE; + vector<double> Ex; + vector<double> ThetaCM; + vector<double> XVertex; + vector<double> YVertex; + vector<double> ZVertex; + vector<double> SiPosY; + vector<double> SiPosZ; + + NPL::EnergyLoss EnergyLoss_1H; + NPL::EnergyLoss EnergyLoss_2H; + NPL::EnergyLoss EnergyLoss_3H; + NPL::EnergyLoss EnergyLoss_3He; + NPL::EnergyLoss EnergyLoss_4He; + NPL::EnergyLoss EnergyLoss_18O; + NPL::Reaction* TheReaction; + + TReactionConditions* ReactionConditions; + + +}; +#endif diff --git a/Examples/Example4/CMakeLists.txt b/Examples/Example4/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..22c74affdfc45019bdda2594f8439c52d4ab97ec --- /dev/null +++ b/Examples/Example4/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 2.8) +# Setting the policy to match Cmake version +cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) +# include the default NPAnalysis cmake file +include("../../NPLib/ressources/CMake/NPAnalysis.cmake") diff --git a/Examples/Example4/EnergyLossTable/O18_iC4H10_6.24151e+07_295.G4table b/Examples/Example4/EnergyLossTable/O18_iC4H10_6.24151e+07_295.G4table new file mode 100644 index 0000000000000000000000000000000000000000..33d5719b2ac9f4ffa61eb3bc1c7e295d33a1854e --- /dev/null +++ b/Examples/Example4/EnergyLossTable/O18_iC4H10_6.24151e+07_295.G4table @@ -0,0 +1,441 @@ +Table from Geant4 generate using NPSimulation Particle: O18 Material: NPS_iC4H10_6.24151e+07_295 +1e-09 4.40156e-07 +0.001 5.61818e-05 +0.002 6.05315e-05 +0.003 6.23148e-05 +0.004 6.33219e-05 +0.005 6.38752e-05 +0.007 6.4395e-05 +0.011 6.46829e-05 +0.019 6.50493e-05 +0.035 6.68188e-05 +0.051 6.9555e-05 +0.067 7.26073e-05 +0.083 7.59032e-05 +0.099 7.90338e-05 +0.115 8.21993e-05 +0.131 8.55109e-05 +0.147 8.8655e-05 +0.163 9.15793e-05 +0.179 9.4442e-05 +0.195 9.75325e-05 +0.211 0.00010052 +0.227 0.00010338 +0.243 0.000106125 +0.259 0.000108767 +0.275 0.000111316 +0.291 0.000113779 +0.307 0.000116163 +0.323 0.000118475 +0.339 0.000120719 +0.355 0.000122981 +0.371 0.000125285 +0.387 0.000127585 +0.403 0.000129834 +0.419 0.000132036 +0.435 0.000134191 +0.451 0.000136326 +0.467 0.00013879 +0.483 0.00014127 +0.499 0.000143769 +0.515 0.000146261 +0.531 0.000148742 +0.547 0.000151159 +0.563 0.000153494 +0.579 0.00015582 +0.595 0.000158149 +0.611 0.000160466 +0.627 0.000162778 +0.643 0.000165071 +0.659 0.000167344 +0.675 0.000169597 +0.691 0.000171829 +0.707 0.000174055 +0.723 0.000176253 +0.739 0.000178416 +0.755 0.000180559 +0.771 0.000182678 +0.787 0.000184774 +0.803 0.000186847 +0.819 0.000188898 +0.835 0.000190929 +0.851 0.000192938 +0.867 0.000194927 +0.883 0.000196896 +0.899 0.000198847 +0.931 0.000202698 +0.963 0.000206493 +0.995 0.000210228 +1.027 0.000213891 +1.059 0.000217475 +1.091 0.000220981 +1.123 0.000224408 +1.155 0.000227761 +1.187 0.000231056 +1.219 0.000234282 +1.251 0.000237447 +1.283 0.000240541 +1.315 0.000243565 +1.347 0.000246517 +1.379 0.000249397 +1.411 0.000252204 +1.443 0.000254935 +1.475 0.000257592 +1.507 0.000260175 +1.539 0.000262686 +1.603 0.000267498 +1.667 0.000272041 +1.731 0.000276328 +1.795 0.000280389 +1.859 0.00028423 +1.923 0.00028785 +1.987 0.000291251 +2.051 0.000294445 +2.115 0.000297441 +2.179 0.000300251 +2.307 0.000305353 +2.435 0.000309866 +2.563 0.000313862 +2.691 0.000317407 +2.819 0.000320464 +3.075 0.000325575 +3.331 0.00032954 +3.587 0.000332578 +4.099 0.000336674 +4.611 0.000338757 +5.635 0.000339553 +7.683 0.000334263 +9.731 0.000325617 +11.779 0.000315867 +13.827 0.00030597 +15.875 0.000296216 +17.923 0.000286801 +19.971 0.000277819 +22.019 0.000269243 +24.067 0.000261071 +26.115 0.000253301 +28.163 0.000245941 +30.211 0.000238971 +32.259 0.000232351 +34.307 0.000226059 +36.355 0.000220076 +38.403 0.000214371 +40.451 0.000208938 +42.499 0.00020376 +44.547 0.000198824 +46.595 0.000194113 +48.643 0.000189615 +50.691 0.000185316 +52.739 0.000181203 +54.787 0.000177259 +56.835 0.000173473 +58.883 0.000169839 +60.931 0.000166351 +62.979 0.000163001 +65.027 0.000159781 +67.075 0.000156682 +69.123 0.000153697 +71.171 0.00015082 +73.219 0.00014805 +75.267 0.00014538 +77.315 0.000142801 +79.363 0.000140308 +81.411 0.000137899 +83.459 0.00013557 +85.507 0.000133318 +87.555 0.000131138 +89.603 0.000129029 +91.651 0.000126984 +93.699 0.000125002 +95.747 0.000123081 +97.795 0.000121219 +99.843 0.000119414 +101.891 0.000117663 +103.939 0.000115964 +105.987 0.000114314 +108.035 0.00011271 +110.083 0.000111151 +112.131 0.000109634 +114.179 0.000108159 +116.227 0.000106724 +118.275 0.000105327 +120.323 0.000103967 +122.371 0.000102643 +124.419 0.000101352 +126.467 0.000100095 +128.515 9.88682e-05 +130.563 9.76719e-05 +132.611 9.65048e-05 +134.659 9.53661e-05 +136.707 9.42548e-05 +138.755 9.317e-05 +140.803 9.21108e-05 +142.851 9.10761e-05 +144.899 9.00652e-05 +146.947 8.90771e-05 +148.995 8.81113e-05 +151.043 8.71671e-05 +153.091 8.62438e-05 +155.139 8.53409e-05 +157.187 8.44576e-05 +159.235 8.35933e-05 +161.283 8.27475e-05 +163.331 8.19194e-05 +165.379 8.11084e-05 +169.475 7.95358e-05 +173.571 7.80253e-05 +177.667 7.65727e-05 +181.763 7.51722e-05 +185.859 7.38205e-05 +189.955 7.25172e-05 +194.051 7.12605e-05 +198.147 7.00489e-05 +202.243 6.88808e-05 +206.339 6.77544e-05 +210.435 6.66681e-05 +214.531 6.56203e-05 +218.627 6.46093e-05 +222.723 6.36335e-05 +226.819 6.26912e-05 +230.915 6.17808e-05 +235.011 6.09007e-05 +239.107 6.00493e-05 +243.203 5.92248e-05 +247.299 5.84257e-05 +251.395 5.76503e-05 +255.491 5.68968e-05 +259.587 5.61637e-05 +263.683 5.54492e-05 +267.779 5.47518e-05 +271.875 5.40787e-05 +275.971 5.34307e-05 +280.067 5.27969e-05 +284.163 5.21769e-05 +288.259 5.15705e-05 +292.355 5.09774e-05 +296.451 5.03975e-05 +300.547 4.98304e-05 +304.643 4.92759e-05 +308.739 4.87337e-05 +312.835 4.82035e-05 +316.931 4.76852e-05 +321.027 4.71785e-05 +325.123 4.66831e-05 +329.219 4.61987e-05 +333.315 4.57251e-05 +337.411 4.52621e-05 +341.507 4.48094e-05 +345.603 4.43667e-05 +353.795 4.35105e-05 +361.987 4.26903e-05 +370.179 4.19016e-05 +378.371 4.11462e-05 +386.563 4.04226e-05 +394.755 3.97288e-05 +402.947 3.90631e-05 +411.139 3.84239e-05 +419.331 3.78094e-05 +427.523 3.72179e-05 +435.715 3.66475e-05 +443.907 3.60967e-05 +452.099 3.55636e-05 +460.291 3.50467e-05 +468.483 3.45457e-05 +476.675 3.40599e-05 +484.867 3.35888e-05 +493.059 3.31318e-05 +501.251 3.26885e-05 +509.443 3.22582e-05 +517.635 3.18403e-05 +525.827 3.14344e-05 +534.019 3.10399e-05 +542.211 3.0656e-05 +550.403 3.02818e-05 +558.595 2.99177e-05 +566.787 2.95634e-05 +574.979 2.92186e-05 +583.171 2.8883e-05 +591.363 2.85563e-05 +599.555 2.82382e-05 +607.747 2.79285e-05 +615.939 2.76269e-05 +624.131 2.7333e-05 +632.323 2.70466e-05 +640.515 2.67674e-05 +648.707 2.6495e-05 +656.899 2.62293e-05 +665.091 2.59699e-05 +681.475 2.54688e-05 +697.859 2.49896e-05 +714.243 2.45299e-05 +730.627 2.40902e-05 +747.011 2.36679e-05 +763.395 2.3261e-05 +779.779 2.28691e-05 +796.163 2.24914e-05 +812.547 2.21274e-05 +828.931 2.17766e-05 +845.315 2.14384e-05 +861.699 2.11122e-05 +878.083 2.07974e-05 +894.467 2.04935e-05 +910.851 2.01994e-05 +927.235 1.9915e-05 +943.619 1.964e-05 +960.003 1.93741e-05 +976.387 1.91167e-05 +992.771 1.88676e-05 +1009.16 1.86264e-05 +1025.54 1.83925e-05 +1041.92 1.81657e-05 +1058.31 1.79454e-05 +1074.69 1.77313e-05 +1091.08 1.75231e-05 +1107.46 1.73203e-05 +1123.84 1.71229e-05 +1140.23 1.69307e-05 +1156.61 1.67358e-05 +1173 1.65536e-05 +1189.38 1.6376e-05 +1205.76 1.62029e-05 +1222.15 1.60342e-05 +1238.53 1.58695e-05 +1254.92 1.57088e-05 +1271.3 1.5552e-05 +1304.07 1.5249e-05 +1336.84 1.496e-05 +1369.6 1.4684e-05 +1402.37 1.44203e-05 +1435.14 1.41681e-05 +1467.91 1.39266e-05 +1500.68 1.36952e-05 +1533.44 1.34732e-05 +1566.21 1.326e-05 +1598.98 1.3055e-05 +1631.75 1.28576e-05 +1664.52 1.26673e-05 +1697.28 1.24836e-05 +1730.05 1.23063e-05 +1762.82 1.21349e-05 +1795.59 1.1969e-05 +1828.36 1.18081e-05 +1861.12 1.16522e-05 +1893.89 1.15011e-05 +1926.66 1.13548e-05 +1959.43 1.12131e-05 +1992.2 1.10759e-05 +2024.96 1.0943e-05 +2057.73 1.08143e-05 +2090.5 1.06896e-05 +2123.27 1.05688e-05 +2156.04 1.04518e-05 +2188.8 1.03384e-05 +2221.57 1.02285e-05 +2254.34 1.01219e-05 +2287.11 1.00185e-05 +2319.88 9.91814e-06 +2352.64 9.82071e-06 +2418.18 9.63401e-06 +2483.72 9.45727e-06 +2549.25 9.28935e-06 +2614.79 9.12911e-06 +2680.32 8.97543e-06 +2745.86 8.83067e-06 +2811.4 8.69239e-06 +2876.93 8.55896e-06 +2942.47 8.43027e-06 +3008 8.30616e-06 +3073.54 8.18652e-06 +3139.08 8.07121e-06 +3204.61 7.9601e-06 +3270.15 7.85304e-06 +3335.68 7.74992e-06 +3401.22 7.65059e-06 +3466.76 7.55493e-06 +3532.29 7.4628e-06 +3597.83 7.37407e-06 +3663.36 7.28808e-06 +3728.9 7.20521e-06 +3794.44 7.12533e-06 +3859.97 7.04832e-06 +3925.51 6.97405e-06 +3991.04 6.90239e-06 +4056.58 6.83319e-06 +4122.12 6.76633e-06 +4253.19 6.6391e-06 +4384.26 6.51963e-06 +4515.33 6.40686e-06 +4646.4 6.29986e-06 +4777.48 6.19829e-06 +4908.55 6.10185e-06 +5039.62 6.01022e-06 +5170.69 5.92311e-06 +5301.76 5.8402e-06 +5432.84 5.76115e-06 +5563.91 5.68561e-06 +5694.98 5.61354e-06 +5826.05 5.54478e-06 +5957.12 5.47915e-06 +6088.2 5.4165e-06 +6219.27 5.35666e-06 +6350.34 5.29946e-06 +6481.41 5.24475e-06 +6612.48 5.19235e-06 +6874.63 5.09385e-06 +7136.77 5.00264e-06 +7398.92 4.91816e-06 +7661.06 4.83929e-06 +7923.2 4.76551e-06 +8185.35 4.69648e-06 +8447.49 4.63188e-06 +8709.64 4.57137e-06 +8971.78 4.51462e-06 +9233.92 4.4612e-06 +9496.07 4.41096e-06 +9758.21 4.36372e-06 +10020.4 4.31924e-06 +10282.5 4.27732e-06 +10806.8 4.20023e-06 +11331.1 4.13086e-06 +11855.4 4.06827e-06 +12379.7 4.01166e-06 +12903.9 3.96024e-06 +13428.2 3.91341e-06 +13952.5 3.87069e-06 +14476.8 3.83161e-06 +15001.1 3.79575e-06 +16049.7 3.73252e-06 +17098.2 3.67878e-06 +18146.8 3.63276e-06 +19195.4 3.59541e-06 +20244 3.56327e-06 +22341.1 3.51161e-06 +24438.3 3.47296e-06 +26535.4 3.44405e-06 +30729.7 3.40679e-06 +34924 3.38785e-06 +43312.6 3.38077e-06 +60089.9 3.41885e-06 +76867.1 3.4776e-06 +93644.3 3.53896e-06 +110422 3.59791e-06 +127199 3.65312e-06 +143976 3.70442e-06 +160753 3.75203e-06 +177530 3.7963e-06 +194308 3.83757e-06 +211085 3.87616e-06 +227862 3.91236e-06 +261416 3.97858e-06 +294971 4.03789e-06 +328525 4.09152e-06 +362080 4.14044e-06 +395634 4.18537e-06 +429189 4.22691e-06 +496297 4.30158e-06 +563406 4.36724e-06 +630515 4.42578e-06 +697624 4.47859e-06 +764733 4.52667e-06 +831842 4.5708e-06 +966060 4.64941e-06 diff --git a/Examples/Example4/EnergyLossTable/proton_iC4H10_6.24151e+07_295.G4table b/Examples/Example4/EnergyLossTable/proton_iC4H10_6.24151e+07_295.G4table new file mode 100644 index 0000000000000000000000000000000000000000..61c33adbfc1ccb9567243ff43da13f80642489fe --- /dev/null +++ b/Examples/Example4/EnergyLossTable/proton_iC4H10_6.24151e+07_295.G4table @@ -0,0 +1,512 @@ +Table from Geant4 generate using NPSimulation Particle: proton Material: NPS_iC4H10_6.24151e+07_295 +0 0 +0.001 6.44831e-06 +0.002 8.02227e-06 +0.003 9.39063e-06 +0.004 1.06081e-05 +0.005 1.17011e-05 +0.006 1.27095e-05 +0.007 1.36536e-05 +0.008 1.45322e-05 +0.009 1.53551e-05 +0.01 1.61394e-05 +0.011 1.68072e-05 +0.012 1.74365e-05 +0.013 1.80351e-05 +0.014 1.86043e-05 +0.015 1.91464e-05 +0.016 1.96639e-05 +0.017 2.01579e-05 +0.018 2.063e-05 +0.019 2.10847e-05 +0.02 2.15221e-05 +0.021 2.19417e-05 +0.022 2.23451e-05 +0.023 2.27336e-05 +0.024 2.31073e-05 +0.025 2.34677e-05 +0.026 2.38156e-05 +0.027 2.41509e-05 +0.028 2.44743e-05 +0.029 2.47862e-05 +0.03 2.5088e-05 +0.031 2.53796e-05 +0.032 2.56618e-05 +0.033 2.59344e-05 +0.034 2.61979e-05 +0.035 2.64527e-05 +0.037 2.69378e-05 +0.039 2.73937e-05 +0.041 2.77786e-05 +0.043 2.8056e-05 +0.047 2.85223e-05 +0.051 2.88835e-05 +0.055 2.9153e-05 +0.063 2.94607e-05 +0.071 2.95185e-05 +0.087 2.91063e-05 +0.103 2.82542e-05 +0.119 2.71758e-05 +0.135 2.60038e-05 +0.151 2.48174e-05 +0.167 2.36632e-05 +0.183 2.25662e-05 +0.199 2.15396e-05 +0.215 2.05865e-05 +0.231 1.97064e-05 +0.247 1.88958e-05 +0.263 1.81501e-05 +0.279 1.74639e-05 +0.295 1.68318e-05 +0.311 1.6249e-05 +0.327 1.57105e-05 +0.343 1.52119e-05 +0.359 1.47491e-05 +0.375 1.43188e-05 +0.391 1.39178e-05 +0.407 1.35431e-05 +0.423 1.31923e-05 +0.439 1.2863e-05 +0.455 1.25533e-05 +0.471 1.22615e-05 +0.487 1.19859e-05 +0.503 1.17253e-05 +0.519 1.14784e-05 +0.535 1.1244e-05 +0.551 1.10211e-05 +0.567 1.0809e-05 +0.583 1.06067e-05 +0.599 1.04136e-05 +0.615 1.02289e-05 +0.631 1.00521e-05 +0.647 9.88269e-06 +0.663 9.72011e-06 +0.679 9.56392e-06 +0.695 9.41374e-06 +0.711 9.26917e-06 +0.727 9.12989e-06 +0.743 8.99564e-06 +0.759 8.86606e-06 +0.775 8.74091e-06 +0.791 8.61993e-06 +0.807 8.5029e-06 +0.823 8.38961e-06 +0.839 8.27987e-06 +0.855 8.17349e-06 +0.871 8.07032e-06 +0.887 7.97019e-06 +0.903 7.87296e-06 +0.919 7.77849e-06 +0.935 7.68669e-06 +0.951 7.59741e-06 +0.967 7.51054e-06 +0.983 7.42597e-06 +0.999 7.3436e-06 +1.015 7.25704e-06 +1.031 7.1789e-06 +1.047 7.1027e-06 +1.063 7.02837e-06 +1.079 6.95582e-06 +1.095 6.88499e-06 +1.111 6.81582e-06 +1.127 6.74825e-06 +1.159 6.61764e-06 +1.191 6.49274e-06 +1.223 6.37315e-06 +1.255 6.25852e-06 +1.287 6.14852e-06 +1.319 6.04286e-06 +1.351 5.94126e-06 +1.383 5.84349e-06 +1.415 5.74932e-06 +1.447 5.65853e-06 +1.479 5.57095e-06 +1.511 5.48638e-06 +1.543 5.40467e-06 +1.575 5.32567e-06 +1.607 5.24924e-06 +1.639 5.17525e-06 +1.671 5.10356e-06 +1.703 5.03409e-06 +1.735 4.96671e-06 +1.767 4.90132e-06 +1.799 4.83784e-06 +1.831 4.77619e-06 +1.863 4.71627e-06 +1.895 4.65801e-06 +1.927 4.60134e-06 +1.959 4.54619e-06 +1.991 4.4925e-06 +2.023 4.43778e-06 +2.055 4.38359e-06 +2.087 4.33083e-06 +2.119 4.27945e-06 +2.151 4.22939e-06 +2.183 4.18061e-06 +2.215 4.13304e-06 +2.247 4.08665e-06 +2.279 4.04139e-06 +2.311 3.99722e-06 +2.343 3.95409e-06 +2.375 3.91198e-06 +2.407 3.87084e-06 +2.439 3.83065e-06 +2.471 3.7959e-06 +2.535 3.71968e-06 +2.599 3.64675e-06 +2.663 3.57689e-06 +2.727 3.50991e-06 +2.791 3.44563e-06 +2.855 3.38389e-06 +2.919 3.32453e-06 +2.983 3.26741e-06 +3.047 3.21241e-06 +3.111 3.15941e-06 +3.175 3.1083e-06 +3.239 3.05897e-06 +3.303 3.01134e-06 +3.367 2.96531e-06 +3.431 2.92081e-06 +3.495 2.87775e-06 +3.559 2.83607e-06 +3.623 2.7957e-06 +3.687 2.75657e-06 +3.751 2.71864e-06 +3.815 2.68183e-06 +3.879 2.64611e-06 +3.943 2.61142e-06 +4.007 2.57772e-06 +4.071 2.54496e-06 +4.135 2.51452e-06 +4.199 2.48346e-06 +4.263 2.45324e-06 +4.327 2.42382e-06 +4.391 2.39516e-06 +4.455 2.36724e-06 +4.519 2.34002e-06 +4.583 2.31349e-06 +4.647 2.28761e-06 +4.711 2.26236e-06 +4.775 2.23771e-06 +4.839 2.21365e-06 +4.903 2.19015e-06 +4.967 2.1672e-06 +5.031 2.14476e-06 +5.095 2.12284e-06 +5.159 2.1014e-06 +5.223 2.08043e-06 +5.351 2.03984e-06 +5.479 2.00096e-06 +5.607 1.96367e-06 +5.735 1.92874e-06 +5.863 1.8943e-06 +5.991 1.86119e-06 +6.119 1.82932e-06 +6.247 1.79862e-06 +6.375 1.76904e-06 +6.503 1.74051e-06 +6.631 1.71297e-06 +6.759 1.68636e-06 +6.887 1.66066e-06 +7.015 1.63579e-06 +7.143 1.61173e-06 +7.271 1.58844e-06 +7.399 1.56587e-06 +7.527 1.544e-06 +7.655 1.52279e-06 +7.783 1.5022e-06 +7.911 1.48222e-06 +8.039 1.46282e-06 +8.167 1.44397e-06 +8.295 1.42564e-06 +8.423 1.40783e-06 +8.551 1.39049e-06 +8.679 1.37362e-06 +8.807 1.35719e-06 +8.935 1.34119e-06 +9.063 1.3256e-06 +9.191 1.3104e-06 +9.319 1.29557e-06 +9.447 1.28111e-06 +9.575 1.267e-06 +9.703 1.25323e-06 +9.831 1.23978e-06 +9.959 1.22665e-06 +10.087 1.21382e-06 +10.215 1.20128e-06 +10.343 1.18902e-06 +10.471 1.17703e-06 +10.599 1.1653e-06 +10.855 1.14261e-06 +11.111 1.12086e-06 +11.367 1.1e-06 +11.623 1.07998e-06 +11.879 1.06075e-06 +12.135 1.04225e-06 +12.391 1.02445e-06 +12.647 1.0073e-06 +12.903 9.90775e-07 +13.159 9.74835e-07 +13.415 9.5945e-07 +13.671 9.4459e-07 +13.927 9.30228e-07 +14.183 9.1634e-07 +14.439 9.02901e-07 +14.695 8.8989e-07 +14.951 8.77285e-07 +15.207 8.65068e-07 +15.463 8.53221e-07 +15.719 8.41727e-07 +15.975 8.30569e-07 +16.231 8.19733e-07 +16.487 8.09205e-07 +16.743 7.98972e-07 +16.999 7.89021e-07 +17.255 7.7934e-07 +17.511 7.69918e-07 +17.767 7.60745e-07 +18.023 7.51811e-07 +18.279 7.43106e-07 +18.535 7.34621e-07 +18.791 7.26348e-07 +19.047 7.18279e-07 +19.303 7.10407e-07 +19.559 7.02723e-07 +19.815 6.95222e-07 +20.071 6.87896e-07 +20.327 6.8074e-07 +20.583 6.73746e-07 +20.839 6.66911e-07 +21.095 6.60228e-07 +21.351 6.53693e-07 +21.863 6.41043e-07 +22.375 6.28927e-07 +22.887 6.17309e-07 +23.399 6.06159e-07 +23.911 5.95449e-07 +24.423 5.85152e-07 +24.935 5.75246e-07 +25.447 5.65707e-07 +25.959 5.56514e-07 +26.471 5.4765e-07 +26.983 5.39096e-07 +27.495 5.30836e-07 +28.007 5.22855e-07 +28.519 5.15139e-07 +29.031 5.07674e-07 +29.543 5.00448e-07 +30.055 4.9345e-07 +30.567 4.86668e-07 +31.079 4.80093e-07 +31.591 4.73715e-07 +32.103 4.67525e-07 +32.615 4.61516e-07 +33.127 4.55678e-07 +33.639 4.50005e-07 +34.151 4.44489e-07 +34.663 4.39124e-07 +35.175 4.33904e-07 +35.687 4.28823e-07 +36.199 4.23875e-07 +36.711 4.19055e-07 +37.223 4.14358e-07 +37.735 4.09779e-07 +38.247 4.05314e-07 +38.759 4.00958e-07 +39.271 3.96708e-07 +39.783 3.92559e-07 +40.295 3.88509e-07 +40.807 3.84552e-07 +41.319 3.80687e-07 +41.831 3.7691e-07 +42.855 3.69607e-07 +43.879 3.62621e-07 +44.903 3.55932e-07 +45.927 3.49521e-07 +46.951 3.4337e-07 +47.975 3.37464e-07 +48.999 3.31788e-07 +50.023 3.26329e-07 +51.047 3.21074e-07 +52.071 3.16012e-07 +53.095 3.11133e-07 +54.119 3.06425e-07 +55.143 3.01881e-07 +56.167 2.97492e-07 +57.191 2.9325e-07 +58.215 2.89147e-07 +59.239 2.85177e-07 +60.263 2.81334e-07 +61.287 2.7761e-07 +62.311 2.74001e-07 +63.335 2.70502e-07 +64.359 2.67106e-07 +65.383 2.63811e-07 +66.407 2.6061e-07 +67.431 2.57501e-07 +68.455 2.54479e-07 +69.479 2.51541e-07 +70.503 2.48682e-07 +71.527 2.45901e-07 +72.551 2.43193e-07 +73.575 2.40556e-07 +74.599 2.37987e-07 +75.623 2.35484e-07 +76.647 2.33043e-07 +77.671 2.30663e-07 +78.695 2.28341e-07 +79.719 2.26075e-07 +81.767 2.21704e-07 +83.815 2.17535e-07 +85.863 2.13552e-07 +87.911 2.09745e-07 +89.959 2.06102e-07 +92.007 2.02612e-07 +94.055 1.99265e-07 +96.103 1.96053e-07 +98.151 1.92968e-07 +100.199 1.90002e-07 +102.247 1.87149e-07 +104.295 1.84402e-07 +106.343 1.81755e-07 +108.391 1.79203e-07 +110.439 1.76741e-07 +112.487 1.74364e-07 +114.535 1.72068e-07 +116.583 1.69849e-07 +118.631 1.67702e-07 +120.679 1.65625e-07 +122.727 1.63613e-07 +124.775 1.61665e-07 +126.823 1.59776e-07 +128.871 1.57945e-07 +130.919 1.56168e-07 +132.967 1.54443e-07 +135.015 1.52769e-07 +137.063 1.51142e-07 +139.111 1.49561e-07 +141.159 1.48024e-07 +143.207 1.46529e-07 +145.255 1.45074e-07 +149.351 1.4228e-07 +153.447 1.39628e-07 +157.543 1.37109e-07 +161.639 1.34712e-07 +165.735 1.3243e-07 +169.831 1.30253e-07 +173.927 1.28175e-07 +178.023 1.2619e-07 +182.119 1.24291e-07 +186.215 1.22472e-07 +190.311 1.20729e-07 +194.407 1.19058e-07 +198.503 1.17453e-07 +202.599 1.15912e-07 +206.695 1.14429e-07 +210.791 1.13003e-07 +214.887 1.1163e-07 +218.983 1.10307e-07 +223.079 1.09031e-07 +227.175 1.078e-07 +231.271 1.06612e-07 +235.367 1.05464e-07 +239.463 1.04355e-07 +243.559 1.03283e-07 +247.655 1.02245e-07 +251.751 1.01241e-07 +259.943 9.93253e-08 +268.135 9.75254e-08 +276.327 9.58311e-08 +284.519 9.42336e-08 +292.711 9.27249e-08 +300.903 9.1298e-08 +309.095 8.99466e-08 +317.287 8.8665e-08 +325.479 8.74482e-08 +333.671 8.62914e-08 +341.863 8.51905e-08 +350.055 8.41416e-08 +358.247 8.31413e-08 +366.439 8.21864e-08 +374.631 8.1274e-08 +382.823 8.04014e-08 +391.015 7.95663e-08 +399.207 7.87662e-08 +407.399 7.79993e-08 +423.783 7.65571e-08 +440.167 7.52261e-08 +456.551 7.39944e-08 +472.935 7.28521e-08 +489.319 7.17902e-08 +505.703 7.08011e-08 +522.087 6.9878e-08 +538.471 6.90149e-08 +554.855 6.82067e-08 +571.239 6.74487e-08 +587.623 6.67366e-08 +604.007 6.60668e-08 +620.391 6.5436e-08 +653.159 6.42795e-08 +685.927 6.32466e-08 +718.695 6.23203e-08 +751.463 6.14867e-08 +784.231 6.07341e-08 +816.999 6.00526e-08 +849.767 5.94338e-08 +882.535 5.88708e-08 +948.071 5.78882e-08 +1013.61 5.70652e-08 +1079.14 5.63718e-08 +1144.68 5.57849e-08 +1210.22 5.52863e-08 +1341.29 5.44994e-08 +1472.36 5.39264e-08 +1603.43 5.35105e-08 +1865.58 5.30041e-08 +2389.86 5.2733e-08 +3438.44 5.3332e-08 +4487.02 5.43349e-08 +5535.59 5.53758e-08 +6584.17 5.63654e-08 +7632.74 5.72845e-08 +8681.32 5.81315e-08 +9729.9 5.89129e-08 +10778.5 5.96357e-08 +11827 6.03067e-08 +12875.6 6.09321e-08 +13924.2 6.1517e-08 +16021.4 6.25832e-08 +18118.5 6.35345e-08 +20215.7 6.43923e-08 +22312.8 6.5173e-08 +24410 6.58889e-08 +26507.1 6.65498e-08 +28604.3 6.71635e-08 +32798.6 6.82727e-08 +36992.9 6.92546e-08 +41187.2 7.01349e-08 +45381.5 7.09327e-08 +49575.8 7.16619e-08 +53770.1 7.23335e-08 +62158.7 7.35357e-08 +70547.3 7.45887e-08 +78935.9 7.55255e-08 +87324.5 7.63692e-08 +95713.1 7.71369e-08 +104102 7.78413e-08 +120879 7.90968e-08 +137656 8.01921e-08 +154433 8.11641e-08 +171211 8.20383e-08 +187988 8.28331e-08 +221542 8.41355e-08 +255097 8.52011e-08 +288651 8.61212e-08 +322206 8.69308e-08 +389314 8.83083e-08 +456423 8.94571e-08 +523532 9.04467e-08 +590641 9.132e-08 +724859 9.28211e-08 +859076 9.40983e-08 +993294 9.5225e-08 diff --git a/Examples/Example4/PhysicsListOption.txt b/Examples/Example4/PhysicsListOption.txt new file mode 100644 index 0000000000000000000000000000000000000000..52f3c3bb719e211c28f53a364d2669909dae0b1b --- /dev/null +++ b/Examples/Example4/PhysicsListOption.txt @@ -0,0 +1,12 @@ +EmPhysicsList Option4 +DefaultCutOff 1 +DriftElectronPhysics 1 +IonBinaryCascadePhysics 0 +NPIonInelasticPhysics 0 +EmExtraPhysics 0 +HadronElasticPhysics 0 +StoppingPhysics 0 +OpticalPhysics 0 +HadronPhysicsINCLXX 0 +HadronPhysicsQGSP_BIC_HP 0 +Decay 0 diff --git a/Examples/Example4/README b/Examples/Example4/README new file mode 100644 index 0000000000000000000000000000000000000000..356303d052346d18225bebdc9b27dafaf7ca9838 --- /dev/null +++ b/Examples/Example4/README @@ -0,0 +1,74 @@ +======================================================================== +NPTool - Nuclear Physics Tool for low energy nuclear physics experiments +======================================================================== + + --- Example 4 - ACTAR TPC --- + +Example to simulate and analyse experiment using the ACTAR TPC detector + +1. SIMULATION +The simulation is using the special physics list in order to transport +the drift electron in the drift cage volume of ACTAR. +The PhysicsListOption.txt file option should be set as follows: + + EmPhysicsList Option4 + DefaultCutOff 1 + DriftElectronPhysics 1 + + +Other options should be set to 0. + +To run the simualtion, do es follow in the NPSimulation folder: +> npsimulation -D Example4.detector -E Example4.reaction -O Example4 + +A gui will launch and type +/run/beamOn 10000 (for example) +The simulation is slow due to the transport of the drift electrons and is +about 3 to 4 evt/sec + +One can use the Run.mac file in batch mode in order to speed up the Simulation +> npsimulation -D Example4.detector -E Example4.reaction -O Example4 -B Run.mac + + +Example4.detector is loacted in Inputs/DetectorConfiguration and enable to +choose the gas composition and the pressure for example. In this example +we run with iC4H10 gas at 100 mbar. +It also allows us to add ancilary detector such as silicon detector at +forward angle. This is the case is this example. + +Example4.reaction is located in Inputs/Event generator and specify the +event we want to simulate. In this example we simulate the elastic scattering +of a 18O entering in ACTAR a 59.4 MeV on a proton target. + +The output root file is called Example4.root and will be located in Outputs/Simualtion + +2. ANALYSIS +To analyse the simulated root tree compile the Example4 folder byt running +> cmake ./ +then +>make + +To run the analysis type in the Example4 folder: +> npanalysis -R RunToTreat.txt -O Example4 +Or: +> npanalysis --last-sim -O Example4 + +And output root file will be generated and located in Outputs/Analysis. +If one wants to see the fitted tracks will runnign the analysis, please make sure +that the token in configs/ConfigActar.dat called RecoVisu is set to 1: +RecoVisu= 1 +If this is the case run the hclient.C macro in another terminal's window. +A canvas should appear with the found tracks and their 3D fit. + +3. MACRO +Sevaral root macro are located in Example4/macro to check the result of the analysis +and the obtained vertex, angular and energy resolution. + + + + + + + + + diff --git a/Examples/Example4/RunToTreat.txt b/Examples/Example4/RunToTreat.txt new file mode 100644 index 0000000000000000000000000000000000000000..215f7fa266c30ca306a7988493cc088ff810a116 --- /dev/null +++ b/Examples/Example4/RunToTreat.txt @@ -0,0 +1,4 @@ +TTreeName + SimulatedTree +RootFileName + ../../Outputs/Simulation/Example4.root diff --git a/Examples/Example4/configs/ACTION_Si_config.dat b/Examples/Example4/configs/ACTION_Si_config.dat new file mode 100644 index 0000000000000000000000000000000000000000..6d785a0503b8d3f31a0395267a07b27a80f52c73 --- /dev/null +++ b/Examples/Example4/configs/ACTION_Si_config.dat @@ -0,0 +1,25 @@ +Si_0 31 0 +Si_1 33 1 +Si_2 35 2 +Si_3 8 3 +Si_4 9 4 +Si_5 10 5 +Si_6 34 6 +Si_7 12 7 +Si_8 13 8 +Si_9 32 9 +Si_10 29 10 +Si_11 16 11 +Si_12 17 12 +Si_13 18 13 +Si_14 19 14 +Si_15 27 15 +Si_16 22 16 +Si_17 23 17 +Si_18 24 18 +Si_19 14 19 + + + + + diff --git a/Examples/Example4/configs/ConfigActar.dat b/Examples/Example4/configs/ConfigActar.dat new file mode 100644 index 0000000000000000000000000000000000000000..e02d7cd310365f382188fb69d93bebaf20968da5 --- /dev/null +++ b/Examples/Example4/configs/ConfigActar.dat @@ -0,0 +1,15 @@ +ConfigActar +RecoRansac= 1 +RecoVisu= 1 +HIT_THRESHOLD= 2 +Q_THRESHOLD= 0 +T_THRESHOLD= 0 +NumberOfPadsX= 128 +NumberOfPadsY= 128 +PadSizeX= 2 +PadSizeY= 2 +Gas= iC4H10 +%Gas= D2 +%Pressure in mbar +Pressure= 100 +DriftVelocity= 2.66 diff --git a/Examples/Example4/configs/LT.dat b/Examples/Example4/configs/LT.dat new file mode 100644 index 0000000000000000000000000000000000000000..113841f3bf7fdac195df67d39c3fd71af9689bc7 --- /dev/null +++ b/Examples/Example4/configs/LT.dat @@ -0,0 +1,17408 @@ +0 0 0 0 0 32 +0 0 0 1 1 32 +0 0 0 2 0 33 +0 0 0 3 1 33 +0 0 0 4 0 34 +0 0 0 5 1 34 +0 0 0 6 0 35 +0 0 0 7 1 35 +0 0 0 8 0 36 +0 0 0 9 1 36 +0 0 0 10 0 37 +0 0 0 11 -1 -1 +0 0 0 12 1 37 +0 0 0 13 0 38 +0 0 0 14 1 38 +0 0 0 15 0 39 +0 0 0 16 1 39 +0 0 0 17 0 40 +0 0 0 18 1 40 +0 0 0 19 0 41 +0 0 0 20 1 41 +0 0 0 21 0 42 +0 0 0 22 -1 -1 +0 0 0 23 1 42 +0 0 0 24 0 43 +0 0 0 25 1 43 +0 0 0 26 0 44 +0 0 0 27 1 44 +0 0 0 28 0 45 +0 0 0 29 1 45 +0 0 0 30 0 46 +0 0 0 31 1 46 +0 0 0 32 0 47 +0 0 0 33 1 47 +0 0 0 34 0 48 +0 0 0 35 1 48 +0 0 0 36 0 49 +0 0 0 37 1 49 +0 0 0 38 0 50 +0 0 0 39 1 50 +0 0 0 40 0 51 +0 0 0 41 1 51 +0 0 0 42 0 52 +0 0 0 43 1 52 +0 0 0 44 0 53 +0 0 0 45 -1 -1 +0 0 0 46 1 53 +0 0 0 47 0 54 +0 0 0 48 1 54 +0 0 0 49 0 55 +0 0 0 50 1 55 +0 0 0 51 0 56 +0 0 0 52 1 56 +0 0 0 53 0 57 +0 0 0 54 1 57 +0 0 0 55 0 58 +0 0 0 56 -1 -1 +0 0 0 57 1 58 +0 0 0 58 0 59 +0 0 0 59 1 59 +0 0 0 60 0 60 +0 0 0 61 1 60 +0 0 0 62 0 61 +0 0 0 63 1 61 +0 0 0 64 0 62 +0 0 0 65 1 62 +0 0 0 66 0 63 +0 0 0 67 1 63 +0 0 1 0 0 0 +0 0 1 1 1 0 +0 0 1 2 0 1 +0 0 1 3 1 1 +0 0 1 4 0 2 +0 0 1 5 1 2 +0 0 1 6 0 3 +0 0 1 7 1 3 +0 0 1 8 0 4 +0 0 1 9 1 4 +0 0 1 10 0 5 +0 0 1 11 -1 -1 +0 0 1 12 1 5 +0 0 1 13 0 6 +0 0 1 14 1 6 +0 0 1 15 0 7 +0 0 1 16 1 7 +0 0 1 17 0 8 +0 0 1 18 1 8 +0 0 1 19 0 9 +0 0 1 20 1 9 +0 0 1 21 0 10 +0 0 1 22 -1 -1 +0 0 1 23 1 10 +0 0 1 24 0 11 +0 0 1 25 1 11 +0 0 1 26 0 12 +0 0 1 27 1 12 +0 0 1 28 0 13 +0 0 1 29 1 13 +0 0 1 30 0 14 +0 0 1 31 1 14 +0 0 1 32 0 15 +0 0 1 33 1 15 +0 0 1 34 0 16 +0 0 1 35 1 16 +0 0 1 36 0 17 +0 0 1 37 1 17 +0 0 1 38 0 18 +0 0 1 39 1 18 +0 0 1 40 0 19 +0 0 1 41 1 19 +0 0 1 42 0 20 +0 0 1 43 1 20 +0 0 1 44 0 21 +0 0 1 45 -1 -1 +0 0 1 46 1 21 +0 0 1 47 0 22 +0 0 1 48 1 22 +0 0 1 49 0 23 +0 0 1 50 1 23 +0 0 1 51 0 24 +0 0 1 52 1 24 +0 0 1 53 0 25 +0 0 1 54 1 25 +0 0 1 55 0 26 +0 0 1 56 -1 -1 +0 0 1 57 1 26 +0 0 1 58 0 27 +0 0 1 59 1 27 +0 0 1 60 0 28 +0 0 1 61 1 28 +0 0 1 62 0 29 +0 0 1 63 1 29 +0 0 1 64 0 30 +0 0 1 65 1 30 +0 0 1 66 0 31 +0 0 1 67 1 31 +0 0 2 0 2 32 +0 0 2 1 3 32 +0 0 2 2 2 33 +0 0 2 3 3 33 +0 0 2 4 2 34 +0 0 2 5 3 34 +0 0 2 6 2 35 +0 0 2 7 3 35 +0 0 2 8 2 36 +0 0 2 9 3 36 +0 0 2 10 2 37 +0 0 2 11 -1 -1 +0 0 2 12 3 37 +0 0 2 13 2 38 +0 0 2 14 3 38 +0 0 2 15 2 39 +0 0 2 16 3 39 +0 0 2 17 2 40 +0 0 2 18 3 40 +0 0 2 19 2 41 +0 0 2 20 3 41 +0 0 2 21 2 42 +0 0 2 22 -1 -1 +0 0 2 23 3 42 +0 0 2 24 2 43 +0 0 2 25 3 43 +0 0 2 26 2 44 +0 0 2 27 3 44 +0 0 2 28 2 45 +0 0 2 29 3 45 +0 0 2 30 2 46 +0 0 2 31 3 46 +0 0 2 32 2 47 +0 0 2 33 3 47 +0 0 2 34 2 48 +0 0 2 35 3 48 +0 0 2 36 2 49 +0 0 2 37 3 49 +0 0 2 38 2 50 +0 0 2 39 3 50 +0 0 2 40 2 51 +0 0 2 41 3 51 +0 0 2 42 2 52 +0 0 2 43 3 52 +0 0 2 44 2 53 +0 0 2 45 -1 -1 +0 0 2 46 3 53 +0 0 2 47 2 54 +0 0 2 48 3 54 +0 0 2 49 2 55 +0 0 2 50 3 55 +0 0 2 51 2 56 +0 0 2 52 3 56 +0 0 2 53 2 57 +0 0 2 54 3 57 +0 0 2 55 2 58 +0 0 2 56 -1 -1 +0 0 2 57 3 58 +0 0 2 58 2 59 +0 0 2 59 3 59 +0 0 2 60 2 60 +0 0 2 61 3 60 +0 0 2 62 2 61 +0 0 2 63 3 61 +0 0 2 64 2 62 +0 0 2 65 3 62 +0 0 2 66 2 63 +0 0 2 67 3 63 +0 0 3 0 2 0 +0 0 3 1 3 0 +0 0 3 2 2 1 +0 0 3 3 3 1 +0 0 3 4 2 2 +0 0 3 5 3 2 +0 0 3 6 2 3 +0 0 3 7 3 3 +0 0 3 8 2 4 +0 0 3 9 3 4 +0 0 3 10 2 5 +0 0 3 11 -1 -1 +0 0 3 12 3 5 +0 0 3 13 2 6 +0 0 3 14 3 6 +0 0 3 15 2 7 +0 0 3 16 3 7 +0 0 3 17 2 8 +0 0 3 18 3 8 +0 0 3 19 2 9 +0 0 3 20 3 9 +0 0 3 21 2 10 +0 0 3 22 -1 -1 +0 0 3 23 3 10 +0 0 3 24 2 11 +0 0 3 25 3 11 +0 0 3 26 2 12 +0 0 3 27 3 12 +0 0 3 28 2 13 +0 0 3 29 3 13 +0 0 3 30 2 14 +0 0 3 31 3 14 +0 0 3 32 2 15 +0 0 3 33 3 15 +0 0 3 34 2 16 +0 0 3 35 3 16 +0 0 3 36 2 17 +0 0 3 37 3 17 +0 0 3 38 2 18 +0 0 3 39 3 18 +0 0 3 40 2 19 +0 0 3 41 3 19 +0 0 3 42 2 20 +0 0 3 43 3 20 +0 0 3 44 2 21 +0 0 3 45 -1 -1 +0 0 3 46 3 21 +0 0 3 47 2 22 +0 0 3 48 3 22 +0 0 3 49 2 23 +0 0 3 50 3 23 +0 0 3 51 2 24 +0 0 3 52 3 24 +0 0 3 53 2 25 +0 0 3 54 3 25 +0 0 3 55 2 26 +0 0 3 56 -1 -1 +0 0 3 57 3 26 +0 0 3 58 2 27 +0 0 3 59 3 27 +0 0 3 60 2 28 +0 0 3 61 3 28 +0 0 3 62 2 29 +0 0 3 63 3 29 +0 0 3 64 2 30 +0 0 3 65 3 30 +0 0 3 66 2 31 +0 0 3 67 3 31 +0 1 0 0 3 95 +0 1 0 1 2 95 +0 1 0 2 3 94 +0 1 0 3 2 94 +0 1 0 4 3 93 +0 1 0 5 2 93 +0 1 0 6 3 92 +0 1 0 7 2 92 +0 1 0 8 3 91 +0 1 0 9 2 91 +0 1 0 10 3 90 +0 1 0 11 -1 -1 +0 1 0 12 2 90 +0 1 0 13 3 89 +0 1 0 14 2 89 +0 1 0 15 3 88 +0 1 0 16 2 88 +0 1 0 17 3 87 +0 1 0 18 2 87 +0 1 0 19 3 86 +0 1 0 20 2 86 +0 1 0 21 3 85 +0 1 0 22 -1 -1 +0 1 0 23 2 85 +0 1 0 24 3 84 +0 1 0 25 2 84 +0 1 0 26 3 83 +0 1 0 27 2 83 +0 1 0 28 3 82 +0 1 0 29 2 82 +0 1 0 30 3 81 +0 1 0 31 2 81 +0 1 0 32 3 80 +0 1 0 33 2 80 +0 1 0 34 3 79 +0 1 0 35 2 79 +0 1 0 36 3 78 +0 1 0 37 2 78 +0 1 0 38 3 77 +0 1 0 39 2 77 +0 1 0 40 3 76 +0 1 0 41 2 76 +0 1 0 42 3 75 +0 1 0 43 2 75 +0 1 0 44 3 74 +0 1 0 45 -1 -1 +0 1 0 46 2 74 +0 1 0 47 3 73 +0 1 0 48 2 73 +0 1 0 49 3 72 +0 1 0 50 2 72 +0 1 0 51 3 71 +0 1 0 52 2 71 +0 1 0 53 3 70 +0 1 0 54 2 70 +0 1 0 55 3 69 +0 1 0 56 -1 -1 +0 1 0 57 2 69 +0 1 0 58 3 68 +0 1 0 59 2 68 +0 1 0 60 3 67 +0 1 0 61 2 67 +0 1 0 62 3 66 +0 1 0 63 2 66 +0 1 0 64 3 65 +0 1 0 65 2 65 +0 1 0 66 3 64 +0 1 0 67 2 64 +0 1 1 0 3 127 +0 1 1 1 2 127 +0 1 1 2 3 126 +0 1 1 3 2 126 +0 1 1 4 3 125 +0 1 1 5 2 125 +0 1 1 6 3 124 +0 1 1 7 2 124 +0 1 1 8 3 123 +0 1 1 9 2 123 +0 1 1 10 3 122 +0 1 1 11 -1 -1 +0 1 1 12 2 122 +0 1 1 13 3 121 +0 1 1 14 2 121 +0 1 1 15 3 120 +0 1 1 16 2 120 +0 1 1 17 3 119 +0 1 1 18 2 119 +0 1 1 19 3 118 +0 1 1 20 2 118 +0 1 1 21 3 117 +0 1 1 22 -1 -1 +0 1 1 23 2 117 +0 1 1 24 3 116 +0 1 1 25 2 116 +0 1 1 26 3 115 +0 1 1 27 2 115 +0 1 1 28 3 114 +0 1 1 29 2 114 +0 1 1 30 3 113 +0 1 1 31 2 113 +0 1 1 32 3 112 +0 1 1 33 2 112 +0 1 1 34 3 111 +0 1 1 35 2 111 +0 1 1 36 3 110 +0 1 1 37 2 110 +0 1 1 38 3 109 +0 1 1 39 2 109 +0 1 1 40 3 108 +0 1 1 41 2 108 +0 1 1 42 3 107 +0 1 1 43 2 107 +0 1 1 44 3 106 +0 1 1 45 -1 -1 +0 1 1 46 2 106 +0 1 1 47 3 105 +0 1 1 48 2 105 +0 1 1 49 3 104 +0 1 1 50 2 104 +0 1 1 51 3 103 +0 1 1 52 2 103 +0 1 1 53 3 102 +0 1 1 54 2 102 +0 1 1 55 3 101 +0 1 1 56 -1 -1 +0 1 1 57 2 101 +0 1 1 58 3 100 +0 1 1 59 2 100 +0 1 1 60 3 99 +0 1 1 61 2 99 +0 1 1 62 3 98 +0 1 1 63 2 98 +0 1 1 64 3 97 +0 1 1 65 2 97 +0 1 1 66 3 96 +0 1 1 67 2 96 +0 1 2 0 1 95 +0 1 2 1 0 95 +0 1 2 2 1 94 +0 1 2 3 0 94 +0 1 2 4 1 93 +0 1 2 5 0 93 +0 1 2 6 1 92 +0 1 2 7 0 92 +0 1 2 8 1 91 +0 1 2 9 0 91 +0 1 2 10 1 90 +0 1 2 11 -1 -1 +0 1 2 12 0 90 +0 1 2 13 1 89 +0 1 2 14 0 89 +0 1 2 15 1 88 +0 1 2 16 0 88 +0 1 2 17 1 87 +0 1 2 18 0 87 +0 1 2 19 1 86 +0 1 2 20 0 86 +0 1 2 21 1 85 +0 1 2 22 -1 -1 +0 1 2 23 0 85 +0 1 2 24 1 84 +0 1 2 25 0 84 +0 1 2 26 1 83 +0 1 2 27 0 83 +0 1 2 28 1 82 +0 1 2 29 0 82 +0 1 2 30 1 81 +0 1 2 31 0 81 +0 1 2 32 1 80 +0 1 2 33 0 80 +0 1 2 34 1 79 +0 1 2 35 0 79 +0 1 2 36 1 78 +0 1 2 37 0 78 +0 1 2 38 1 77 +0 1 2 39 0 77 +0 1 2 40 1 76 +0 1 2 41 0 76 +0 1 2 42 1 75 +0 1 2 43 0 75 +0 1 2 44 1 74 +0 1 2 45 -1 -1 +0 1 2 46 0 74 +0 1 2 47 1 73 +0 1 2 48 0 73 +0 1 2 49 1 72 +0 1 2 50 0 72 +0 1 2 51 1 71 +0 1 2 52 0 71 +0 1 2 53 1 70 +0 1 2 54 0 70 +0 1 2 55 1 69 +0 1 2 56 -1 -1 +0 1 2 57 0 69 +0 1 2 58 1 68 +0 1 2 59 0 68 +0 1 2 60 1 67 +0 1 2 61 0 67 +0 1 2 62 1 66 +0 1 2 63 0 66 +0 1 2 64 1 65 +0 1 2 65 0 65 +0 1 2 66 1 64 +0 1 2 67 0 64 +0 1 3 0 1 127 +0 1 3 1 0 127 +0 1 3 2 1 126 +0 1 3 3 0 126 +0 1 3 4 1 125 +0 1 3 5 0 125 +0 1 3 6 1 124 +0 1 3 7 0 124 +0 1 3 8 1 123 +0 1 3 9 0 123 +0 1 3 10 1 122 +0 1 3 11 -1 -1 +0 1 3 12 0 122 +0 1 3 13 1 121 +0 1 3 14 0 121 +0 1 3 15 1 120 +0 1 3 16 0 120 +0 1 3 17 1 119 +0 1 3 18 0 119 +0 1 3 19 1 118 +0 1 3 20 0 118 +0 1 3 21 1 117 +0 1 3 22 -1 -1 +0 1 3 23 0 117 +0 1 3 24 1 116 +0 1 3 25 0 116 +0 1 3 26 1 115 +0 1 3 27 0 115 +0 1 3 28 1 114 +0 1 3 29 0 114 +0 1 3 30 1 113 +0 1 3 31 0 113 +0 1 3 32 1 112 +0 1 3 33 0 112 +0 1 3 34 1 111 +0 1 3 35 0 111 +0 1 3 36 1 110 +0 1 3 37 0 110 +0 1 3 38 1 109 +0 1 3 39 0 109 +0 1 3 40 1 108 +0 1 3 41 0 108 +0 1 3 42 1 107 +0 1 3 43 0 107 +0 1 3 44 1 106 +0 1 3 45 -1 -1 +0 1 3 46 0 106 +0 1 3 47 1 105 +0 1 3 48 0 105 +0 1 3 49 1 104 +0 1 3 50 0 104 +0 1 3 51 1 103 +0 1 3 52 0 103 +0 1 3 53 1 102 +0 1 3 54 0 102 +0 1 3 55 1 101 +0 1 3 56 -1 -1 +0 1 3 57 0 101 +0 1 3 58 1 100 +0 1 3 59 0 100 +0 1 3 60 1 99 +0 1 3 61 0 99 +0 1 3 62 1 98 +0 1 3 63 0 98 +0 1 3 64 1 97 +0 1 3 65 0 97 +0 1 3 66 1 96 +0 1 3 67 0 96 +0 2 0 0 4 32 +0 2 0 1 5 32 +0 2 0 2 4 33 +0 2 0 3 5 33 +0 2 0 4 4 34 +0 2 0 5 5 34 +0 2 0 6 4 35 +0 2 0 7 5 35 +0 2 0 8 4 36 +0 2 0 9 5 36 +0 2 0 10 4 37 +0 2 0 11 -1 -1 +0 2 0 12 5 37 +0 2 0 13 4 38 +0 2 0 14 5 38 +0 2 0 15 4 39 +0 2 0 16 5 39 +0 2 0 17 4 40 +0 2 0 18 5 40 +0 2 0 19 4 41 +0 2 0 20 5 41 +0 2 0 21 4 42 +0 2 0 22 -1 -1 +0 2 0 23 5 42 +0 2 0 24 4 43 +0 2 0 25 5 43 +0 2 0 26 4 44 +0 2 0 27 5 44 +0 2 0 28 4 45 +0 2 0 29 5 45 +0 2 0 30 4 46 +0 2 0 31 5 46 +0 2 0 32 4 47 +0 2 0 33 5 47 +0 2 0 34 4 48 +0 2 0 35 5 48 +0 2 0 36 4 49 +0 2 0 37 5 49 +0 2 0 38 4 50 +0 2 0 39 5 50 +0 2 0 40 4 51 +0 2 0 41 5 51 +0 2 0 42 4 52 +0 2 0 43 5 52 +0 2 0 44 4 53 +0 2 0 45 -1 -1 +0 2 0 46 5 53 +0 2 0 47 4 54 +0 2 0 48 5 54 +0 2 0 49 4 55 +0 2 0 50 5 55 +0 2 0 51 4 56 +0 2 0 52 5 56 +0 2 0 53 4 57 +0 2 0 54 5 57 +0 2 0 55 4 58 +0 2 0 56 -1 -1 +0 2 0 57 5 58 +0 2 0 58 4 59 +0 2 0 59 5 59 +0 2 0 60 4 60 +0 2 0 61 5 60 +0 2 0 62 4 61 +0 2 0 63 5 61 +0 2 0 64 4 62 +0 2 0 65 5 62 +0 2 0 66 4 63 +0 2 0 67 5 63 +0 2 1 0 4 0 +0 2 1 1 5 0 +0 2 1 2 4 1 +0 2 1 3 5 1 +0 2 1 4 4 2 +0 2 1 5 5 2 +0 2 1 6 4 3 +0 2 1 7 5 3 +0 2 1 8 4 4 +0 2 1 9 5 4 +0 2 1 10 4 5 +0 2 1 11 -1 -1 +0 2 1 12 5 5 +0 2 1 13 4 6 +0 2 1 14 5 6 +0 2 1 15 4 7 +0 2 1 16 5 7 +0 2 1 17 4 8 +0 2 1 18 5 8 +0 2 1 19 4 9 +0 2 1 20 5 9 +0 2 1 21 4 10 +0 2 1 22 -1 -1 +0 2 1 23 5 10 +0 2 1 24 4 11 +0 2 1 25 5 11 +0 2 1 26 4 12 +0 2 1 27 5 12 +0 2 1 28 4 13 +0 2 1 29 5 13 +0 2 1 30 4 14 +0 2 1 31 5 14 +0 2 1 32 4 15 +0 2 1 33 5 15 +0 2 1 34 4 16 +0 2 1 35 5 16 +0 2 1 36 4 17 +0 2 1 37 5 17 +0 2 1 38 4 18 +0 2 1 39 5 18 +0 2 1 40 4 19 +0 2 1 41 5 19 +0 2 1 42 4 20 +0 2 1 43 5 20 +0 2 1 44 4 21 +0 2 1 45 -1 -1 +0 2 1 46 5 21 +0 2 1 47 4 22 +0 2 1 48 5 22 +0 2 1 49 4 23 +0 2 1 50 5 23 +0 2 1 51 4 24 +0 2 1 52 5 24 +0 2 1 53 4 25 +0 2 1 54 5 25 +0 2 1 55 4 26 +0 2 1 56 -1 -1 +0 2 1 57 5 26 +0 2 1 58 4 27 +0 2 1 59 5 27 +0 2 1 60 4 28 +0 2 1 61 5 28 +0 2 1 62 4 29 +0 2 1 63 5 29 +0 2 1 64 4 30 +0 2 1 65 5 30 +0 2 1 66 4 31 +0 2 1 67 5 31 +0 2 2 0 6 32 +0 2 2 1 7 32 +0 2 2 2 6 33 +0 2 2 3 7 33 +0 2 2 4 6 34 +0 2 2 5 7 34 +0 2 2 6 6 35 +0 2 2 7 7 35 +0 2 2 8 6 36 +0 2 2 9 7 36 +0 2 2 10 6 37 +0 2 2 11 -1 -1 +0 2 2 12 7 37 +0 2 2 13 6 38 +0 2 2 14 7 38 +0 2 2 15 6 39 +0 2 2 16 7 39 +0 2 2 17 6 40 +0 2 2 18 7 40 +0 2 2 19 6 41 +0 2 2 20 7 41 +0 2 2 21 6 42 +0 2 2 22 -1 -1 +0 2 2 23 7 42 +0 2 2 24 6 43 +0 2 2 25 7 43 +0 2 2 26 6 44 +0 2 2 27 7 44 +0 2 2 28 6 45 +0 2 2 29 7 45 +0 2 2 30 6 46 +0 2 2 31 7 46 +0 2 2 32 6 47 +0 2 2 33 7 47 +0 2 2 34 6 48 +0 2 2 35 7 48 +0 2 2 36 6 49 +0 2 2 37 7 49 +0 2 2 38 6 50 +0 2 2 39 7 50 +0 2 2 40 6 51 +0 2 2 41 7 51 +0 2 2 42 6 52 +0 2 2 43 7 52 +0 2 2 44 6 53 +0 2 2 45 -1 -1 +0 2 2 46 7 53 +0 2 2 47 6 54 +0 2 2 48 7 54 +0 2 2 49 6 55 +0 2 2 50 7 55 +0 2 2 51 6 56 +0 2 2 52 7 56 +0 2 2 53 6 57 +0 2 2 54 7 57 +0 2 2 55 6 58 +0 2 2 56 -1 -1 +0 2 2 57 7 58 +0 2 2 58 6 59 +0 2 2 59 7 59 +0 2 2 60 6 60 +0 2 2 61 7 60 +0 2 2 62 6 61 +0 2 2 63 7 61 +0 2 2 64 6 62 +0 2 2 65 7 62 +0 2 2 66 6 63 +0 2 2 67 7 63 +0 2 3 0 6 0 +0 2 3 1 7 0 +0 2 3 2 6 1 +0 2 3 3 7 1 +0 2 3 4 6 2 +0 2 3 5 7 2 +0 2 3 6 6 3 +0 2 3 7 7 3 +0 2 3 8 6 4 +0 2 3 9 7 4 +0 2 3 10 6 5 +0 2 3 11 -1 -1 +0 2 3 12 7 5 +0 2 3 13 6 6 +0 2 3 14 7 6 +0 2 3 15 6 7 +0 2 3 16 7 7 +0 2 3 17 6 8 +0 2 3 18 7 8 +0 2 3 19 6 9 +0 2 3 20 7 9 +0 2 3 21 6 10 +0 2 3 22 -1 -1 +0 2 3 23 7 10 +0 2 3 24 6 11 +0 2 3 25 7 11 +0 2 3 26 6 12 +0 2 3 27 7 12 +0 2 3 28 6 13 +0 2 3 29 7 13 +0 2 3 30 6 14 +0 2 3 31 7 14 +0 2 3 32 6 15 +0 2 3 33 7 15 +0 2 3 34 6 16 +0 2 3 35 7 16 +0 2 3 36 6 17 +0 2 3 37 7 17 +0 2 3 38 6 18 +0 2 3 39 7 18 +0 2 3 40 6 19 +0 2 3 41 7 19 +0 2 3 42 6 20 +0 2 3 43 7 20 +0 2 3 44 6 21 +0 2 3 45 -1 -1 +0 2 3 46 7 21 +0 2 3 47 6 22 +0 2 3 48 7 22 +0 2 3 49 6 23 +0 2 3 50 7 23 +0 2 3 51 6 24 +0 2 3 52 7 24 +0 2 3 53 6 25 +0 2 3 54 7 25 +0 2 3 55 6 26 +0 2 3 56 -1 -1 +0 2 3 57 7 26 +0 2 3 58 6 27 +0 2 3 59 7 27 +0 2 3 60 6 28 +0 2 3 61 7 28 +0 2 3 62 6 29 +0 2 3 63 7 29 +0 2 3 64 6 30 +0 2 3 65 7 30 +0 2 3 66 6 31 +0 2 3 67 7 31 +0 3 0 0 7 95 +0 3 0 1 6 95 +0 3 0 2 7 94 +0 3 0 3 6 94 +0 3 0 4 7 93 +0 3 0 5 6 93 +0 3 0 6 7 92 +0 3 0 7 6 92 +0 3 0 8 7 91 +0 3 0 9 6 91 +0 3 0 10 7 90 +0 3 0 11 -1 -1 +0 3 0 12 6 90 +0 3 0 13 7 89 +0 3 0 14 6 89 +0 3 0 15 7 88 +0 3 0 16 6 88 +0 3 0 17 7 87 +0 3 0 18 6 87 +0 3 0 19 7 86 +0 3 0 20 6 86 +0 3 0 21 7 85 +0 3 0 22 -1 -1 +0 3 0 23 6 85 +0 3 0 24 7 84 +0 3 0 25 6 84 +0 3 0 26 7 83 +0 3 0 27 6 83 +0 3 0 28 7 82 +0 3 0 29 6 82 +0 3 0 30 7 81 +0 3 0 31 6 81 +0 3 0 32 7 80 +0 3 0 33 6 80 +0 3 0 34 7 79 +0 3 0 35 6 79 +0 3 0 36 7 78 +0 3 0 37 6 78 +0 3 0 38 7 77 +0 3 0 39 6 77 +0 3 0 40 7 76 +0 3 0 41 6 76 +0 3 0 42 7 75 +0 3 0 43 6 75 +0 3 0 44 7 74 +0 3 0 45 -1 -1 +0 3 0 46 6 74 +0 3 0 47 7 73 +0 3 0 48 6 73 +0 3 0 49 7 72 +0 3 0 50 6 72 +0 3 0 51 7 71 +0 3 0 52 6 71 +0 3 0 53 7 70 +0 3 0 54 6 70 +0 3 0 55 7 69 +0 3 0 56 -1 -1 +0 3 0 57 6 69 +0 3 0 58 7 68 +0 3 0 59 6 68 +0 3 0 60 7 67 +0 3 0 61 6 67 +0 3 0 62 7 66 +0 3 0 63 6 66 +0 3 0 64 7 65 +0 3 0 65 6 65 +0 3 0 66 7 64 +0 3 0 67 6 64 +0 3 1 0 7 127 +0 3 1 1 6 127 +0 3 1 2 7 126 +0 3 1 3 6 126 +0 3 1 4 7 125 +0 3 1 5 6 125 +0 3 1 6 7 124 +0 3 1 7 6 124 +0 3 1 8 7 123 +0 3 1 9 6 123 +0 3 1 10 7 122 +0 3 1 11 -1 -1 +0 3 1 12 6 122 +0 3 1 13 7 121 +0 3 1 14 6 121 +0 3 1 15 7 120 +0 3 1 16 6 120 +0 3 1 17 7 119 +0 3 1 18 6 119 +0 3 1 19 7 118 +0 3 1 20 6 118 +0 3 1 21 7 117 +0 3 1 22 -1 -1 +0 3 1 23 6 117 +0 3 1 24 7 116 +0 3 1 25 6 116 +0 3 1 26 7 115 +0 3 1 27 6 115 +0 3 1 28 7 114 +0 3 1 29 6 114 +0 3 1 30 7 113 +0 3 1 31 6 113 +0 3 1 32 7 112 +0 3 1 33 6 112 +0 3 1 34 7 111 +0 3 1 35 6 111 +0 3 1 36 7 110 +0 3 1 37 6 110 +0 3 1 38 7 109 +0 3 1 39 6 109 +0 3 1 40 7 108 +0 3 1 41 6 108 +0 3 1 42 7 107 +0 3 1 43 6 107 +0 3 1 44 7 106 +0 3 1 45 -1 -1 +0 3 1 46 6 106 +0 3 1 47 7 105 +0 3 1 48 6 105 +0 3 1 49 7 104 +0 3 1 50 6 104 +0 3 1 51 7 103 +0 3 1 52 6 103 +0 3 1 53 7 102 +0 3 1 54 6 102 +0 3 1 55 7 101 +0 3 1 56 -1 -1 +0 3 1 57 6 101 +0 3 1 58 7 100 +0 3 1 59 6 100 +0 3 1 60 7 99 +0 3 1 61 6 99 +0 3 1 62 7 98 +0 3 1 63 6 98 +0 3 1 64 7 97 +0 3 1 65 6 97 +0 3 1 66 7 96 +0 3 1 67 6 96 +0 3 2 0 5 95 +0 3 2 1 4 95 +0 3 2 2 5 94 +0 3 2 3 4 94 +0 3 2 4 5 93 +0 3 2 5 4 93 +0 3 2 6 5 92 +0 3 2 7 4 92 +0 3 2 8 5 91 +0 3 2 9 4 91 +0 3 2 10 5 90 +0 3 2 11 -1 -1 +0 3 2 12 4 90 +0 3 2 13 5 89 +0 3 2 14 4 89 +0 3 2 15 5 88 +0 3 2 16 4 88 +0 3 2 17 5 87 +0 3 2 18 4 87 +0 3 2 19 5 86 +0 3 2 20 4 86 +0 3 2 21 5 85 +0 3 2 22 -1 -1 +0 3 2 23 4 85 +0 3 2 24 5 84 +0 3 2 25 4 84 +0 3 2 26 5 83 +0 3 2 27 4 83 +0 3 2 28 5 82 +0 3 2 29 4 82 +0 3 2 30 5 81 +0 3 2 31 4 81 +0 3 2 32 5 80 +0 3 2 33 4 80 +0 3 2 34 5 79 +0 3 2 35 4 79 +0 3 2 36 5 78 +0 3 2 37 4 78 +0 3 2 38 5 77 +0 3 2 39 4 77 +0 3 2 40 5 76 +0 3 2 41 4 76 +0 3 2 42 5 75 +0 3 2 43 4 75 +0 3 2 44 5 74 +0 3 2 45 -1 -1 +0 3 2 46 4 74 +0 3 2 47 5 73 +0 3 2 48 4 73 +0 3 2 49 5 72 +0 3 2 50 4 72 +0 3 2 51 5 71 +0 3 2 52 4 71 +0 3 2 53 5 70 +0 3 2 54 4 70 +0 3 2 55 5 69 +0 3 2 56 -1 -1 +0 3 2 57 4 69 +0 3 2 58 5 68 +0 3 2 59 4 68 +0 3 2 60 5 67 +0 3 2 61 4 67 +0 3 2 62 5 66 +0 3 2 63 4 66 +0 3 2 64 5 65 +0 3 2 65 4 65 +0 3 2 66 5 64 +0 3 2 67 4 64 +0 3 3 0 5 127 +0 3 3 1 4 127 +0 3 3 2 5 126 +0 3 3 3 4 126 +0 3 3 4 5 125 +0 3 3 5 4 125 +0 3 3 6 5 124 +0 3 3 7 4 124 +0 3 3 8 5 123 +0 3 3 9 4 123 +0 3 3 10 5 122 +0 3 3 11 -1 -1 +0 3 3 12 4 122 +0 3 3 13 5 121 +0 3 3 14 4 121 +0 3 3 15 5 120 +0 3 3 16 4 120 +0 3 3 17 5 119 +0 3 3 18 4 119 +0 3 3 19 5 118 +0 3 3 20 4 118 +0 3 3 21 5 117 +0 3 3 22 -1 -1 +0 3 3 23 4 117 +0 3 3 24 5 116 +0 3 3 25 4 116 +0 3 3 26 5 115 +0 3 3 27 4 115 +0 3 3 28 5 114 +0 3 3 29 4 114 +0 3 3 30 5 113 +0 3 3 31 4 113 +0 3 3 32 5 112 +0 3 3 33 4 112 +0 3 3 34 5 111 +0 3 3 35 4 111 +0 3 3 36 5 110 +0 3 3 37 4 110 +0 3 3 38 5 109 +0 3 3 39 4 109 +0 3 3 40 5 108 +0 3 3 41 4 108 +0 3 3 42 5 107 +0 3 3 43 4 107 +0 3 3 44 5 106 +0 3 3 45 -1 -1 +0 3 3 46 4 106 +0 3 3 47 5 105 +0 3 3 48 4 105 +0 3 3 49 5 104 +0 3 3 50 4 104 +0 3 3 51 5 103 +0 3 3 52 4 103 +0 3 3 53 5 102 +0 3 3 54 4 102 +0 3 3 55 5 101 +0 3 3 56 -1 -1 +0 3 3 57 4 101 +0 3 3 58 5 100 +0 3 3 59 4 100 +0 3 3 60 5 99 +0 3 3 61 4 99 +0 3 3 62 5 98 +0 3 3 63 4 98 +0 3 3 64 5 97 +0 3 3 65 4 97 +0 3 3 66 5 96 +0 3 3 67 4 96 +1 0 0 0 8 32 +1 0 0 1 9 32 +1 0 0 2 8 33 +1 0 0 3 9 33 +1 0 0 4 8 34 +1 0 0 5 9 34 +1 0 0 6 8 35 +1 0 0 7 9 35 +1 0 0 8 8 36 +1 0 0 9 9 36 +1 0 0 10 8 37 +1 0 0 11 -1 -1 +1 0 0 12 9 37 +1 0 0 13 8 38 +1 0 0 14 9 38 +1 0 0 15 8 39 +1 0 0 16 9 39 +1 0 0 17 8 40 +1 0 0 18 9 40 +1 0 0 19 8 41 +1 0 0 20 9 41 +1 0 0 21 8 42 +1 0 0 22 -1 -1 +1 0 0 23 9 42 +1 0 0 24 8 43 +1 0 0 25 9 43 +1 0 0 26 8 44 +1 0 0 27 9 44 +1 0 0 28 8 45 +1 0 0 29 9 45 +1 0 0 30 8 46 +1 0 0 31 9 46 +1 0 0 32 8 47 +1 0 0 33 9 47 +1 0 0 34 8 48 +1 0 0 35 9 48 +1 0 0 36 8 49 +1 0 0 37 9 49 +1 0 0 38 8 50 +1 0 0 39 9 50 +1 0 0 40 8 51 +1 0 0 41 9 51 +1 0 0 42 8 52 +1 0 0 43 9 52 +1 0 0 44 8 53 +1 0 0 45 -1 -1 +1 0 0 46 9 53 +1 0 0 47 8 54 +1 0 0 48 9 54 +1 0 0 49 8 55 +1 0 0 50 9 55 +1 0 0 51 8 56 +1 0 0 52 9 56 +1 0 0 53 8 57 +1 0 0 54 9 57 +1 0 0 55 8 58 +1 0 0 56 -1 -1 +1 0 0 57 9 58 +1 0 0 58 8 59 +1 0 0 59 9 59 +1 0 0 60 8 60 +1 0 0 61 9 60 +1 0 0 62 8 61 +1 0 0 63 9 61 +1 0 0 64 8 62 +1 0 0 65 9 62 +1 0 0 66 8 63 +1 0 0 67 9 63 +1 0 1 0 8 0 +1 0 1 1 9 0 +1 0 1 2 8 1 +1 0 1 3 9 1 +1 0 1 4 8 2 +1 0 1 5 9 2 +1 0 1 6 8 3 +1 0 1 7 9 3 +1 0 1 8 8 4 +1 0 1 9 9 4 +1 0 1 10 8 5 +1 0 1 11 -1 -1 +1 0 1 12 9 5 +1 0 1 13 8 6 +1 0 1 14 9 6 +1 0 1 15 8 7 +1 0 1 16 9 7 +1 0 1 17 8 8 +1 0 1 18 9 8 +1 0 1 19 8 9 +1 0 1 20 9 9 +1 0 1 21 8 10 +1 0 1 22 -1 -1 +1 0 1 23 9 10 +1 0 1 24 8 11 +1 0 1 25 9 11 +1 0 1 26 8 12 +1 0 1 27 9 12 +1 0 1 28 8 13 +1 0 1 29 9 13 +1 0 1 30 8 14 +1 0 1 31 9 14 +1 0 1 32 8 15 +1 0 1 33 9 15 +1 0 1 34 8 16 +1 0 1 35 9 16 +1 0 1 36 8 17 +1 0 1 37 9 17 +1 0 1 38 8 18 +1 0 1 39 9 18 +1 0 1 40 8 19 +1 0 1 41 9 19 +1 0 1 42 8 20 +1 0 1 43 9 20 +1 0 1 44 8 21 +1 0 1 45 -1 -1 +1 0 1 46 9 21 +1 0 1 47 8 22 +1 0 1 48 9 22 +1 0 1 49 8 23 +1 0 1 50 9 23 +1 0 1 51 8 24 +1 0 1 52 9 24 +1 0 1 53 8 25 +1 0 1 54 9 25 +1 0 1 55 8 26 +1 0 1 56 -1 -1 +1 0 1 57 9 26 +1 0 1 58 8 27 +1 0 1 59 9 27 +1 0 1 60 8 28 +1 0 1 61 9 28 +1 0 1 62 8 29 +1 0 1 63 9 29 +1 0 1 64 8 30 +1 0 1 65 9 30 +1 0 1 66 8 31 +1 0 1 67 9 31 +1 0 2 0 10 32 +1 0 2 1 11 32 +1 0 2 2 10 33 +1 0 2 3 11 33 +1 0 2 4 10 34 +1 0 2 5 11 34 +1 0 2 6 10 35 +1 0 2 7 11 35 +1 0 2 8 10 36 +1 0 2 9 11 36 +1 0 2 10 10 37 +1 0 2 11 -1 -1 +1 0 2 12 11 37 +1 0 2 13 10 38 +1 0 2 14 11 38 +1 0 2 15 10 39 +1 0 2 16 11 39 +1 0 2 17 10 40 +1 0 2 18 11 40 +1 0 2 19 10 41 +1 0 2 20 11 41 +1 0 2 21 10 42 +1 0 2 22 -1 -1 +1 0 2 23 11 42 +1 0 2 24 10 43 +1 0 2 25 11 43 +1 0 2 26 10 44 +1 0 2 27 11 44 +1 0 2 28 10 45 +1 0 2 29 11 45 +1 0 2 30 10 46 +1 0 2 31 11 46 +1 0 2 32 10 47 +1 0 2 33 11 47 +1 0 2 34 10 48 +1 0 2 35 11 48 +1 0 2 36 10 49 +1 0 2 37 11 49 +1 0 2 38 10 50 +1 0 2 39 11 50 +1 0 2 40 10 51 +1 0 2 41 11 51 +1 0 2 42 10 52 +1 0 2 43 11 52 +1 0 2 44 10 53 +1 0 2 45 -1 -1 +1 0 2 46 11 53 +1 0 2 47 10 54 +1 0 2 48 11 54 +1 0 2 49 10 55 +1 0 2 50 11 55 +1 0 2 51 10 56 +1 0 2 52 11 56 +1 0 2 53 10 57 +1 0 2 54 11 57 +1 0 2 55 10 58 +1 0 2 56 -1 -1 +1 0 2 57 11 58 +1 0 2 58 10 59 +1 0 2 59 11 59 +1 0 2 60 10 60 +1 0 2 61 11 60 +1 0 2 62 10 61 +1 0 2 63 11 61 +1 0 2 64 10 62 +1 0 2 65 11 62 +1 0 2 66 10 63 +1 0 2 67 11 63 +1 0 3 0 10 0 +1 0 3 1 11 0 +1 0 3 2 10 1 +1 0 3 3 11 1 +1 0 3 4 10 2 +1 0 3 5 11 2 +1 0 3 6 10 3 +1 0 3 7 11 3 +1 0 3 8 10 4 +1 0 3 9 11 4 +1 0 3 10 10 5 +1 0 3 11 -1 -1 +1 0 3 12 11 5 +1 0 3 13 10 6 +1 0 3 14 11 6 +1 0 3 15 10 7 +1 0 3 16 11 7 +1 0 3 17 10 8 +1 0 3 18 11 8 +1 0 3 19 10 9 +1 0 3 20 11 9 +1 0 3 21 10 10 +1 0 3 22 -1 -1 +1 0 3 23 11 10 +1 0 3 24 10 11 +1 0 3 25 11 11 +1 0 3 26 10 12 +1 0 3 27 11 12 +1 0 3 28 10 13 +1 0 3 29 11 13 +1 0 3 30 10 14 +1 0 3 31 11 14 +1 0 3 32 10 15 +1 0 3 33 11 15 +1 0 3 34 10 16 +1 0 3 35 11 16 +1 0 3 36 10 17 +1 0 3 37 11 17 +1 0 3 38 10 18 +1 0 3 39 11 18 +1 0 3 40 10 19 +1 0 3 41 11 19 +1 0 3 42 10 20 +1 0 3 43 11 20 +1 0 3 44 10 21 +1 0 3 45 -1 -1 +1 0 3 46 11 21 +1 0 3 47 10 22 +1 0 3 48 11 22 +1 0 3 49 10 23 +1 0 3 50 11 23 +1 0 3 51 10 24 +1 0 3 52 11 24 +1 0 3 53 10 25 +1 0 3 54 11 25 +1 0 3 55 10 26 +1 0 3 56 -1 -1 +1 0 3 57 11 26 +1 0 3 58 10 27 +1 0 3 59 11 27 +1 0 3 60 10 28 +1 0 3 61 11 28 +1 0 3 62 10 29 +1 0 3 63 11 29 +1 0 3 64 10 30 +1 0 3 65 11 30 +1 0 3 66 10 31 +1 0 3 67 11 31 +1 1 0 0 11 95 +1 1 0 1 10 95 +1 1 0 2 11 94 +1 1 0 3 10 94 +1 1 0 4 11 93 +1 1 0 5 10 93 +1 1 0 6 11 92 +1 1 0 7 10 92 +1 1 0 8 11 91 +1 1 0 9 10 91 +1 1 0 10 11 90 +1 1 0 11 -1 -1 +1 1 0 12 10 90 +1 1 0 13 11 89 +1 1 0 14 10 89 +1 1 0 15 11 88 +1 1 0 16 10 88 +1 1 0 17 11 87 +1 1 0 18 10 87 +1 1 0 19 11 86 +1 1 0 20 10 86 +1 1 0 21 11 85 +1 1 0 22 -1 -1 +1 1 0 23 10 85 +1 1 0 24 11 84 +1 1 0 25 10 84 +1 1 0 26 11 83 +1 1 0 27 10 83 +1 1 0 28 11 82 +1 1 0 29 10 82 +1 1 0 30 11 81 +1 1 0 31 10 81 +1 1 0 32 11 80 +1 1 0 33 10 80 +1 1 0 34 11 79 +1 1 0 35 10 79 +1 1 0 36 11 78 +1 1 0 37 10 78 +1 1 0 38 11 77 +1 1 0 39 10 77 +1 1 0 40 11 76 +1 1 0 41 10 76 +1 1 0 42 11 75 +1 1 0 43 10 75 +1 1 0 44 11 74 +1 1 0 45 -1 -1 +1 1 0 46 10 74 +1 1 0 47 11 73 +1 1 0 48 10 73 +1 1 0 49 11 72 +1 1 0 50 10 72 +1 1 0 51 11 71 +1 1 0 52 10 71 +1 1 0 53 11 70 +1 1 0 54 10 70 +1 1 0 55 11 69 +1 1 0 56 -1 -1 +1 1 0 57 10 69 +1 1 0 58 11 68 +1 1 0 59 10 68 +1 1 0 60 11 67 +1 1 0 61 10 67 +1 1 0 62 11 66 +1 1 0 63 10 66 +1 1 0 64 11 65 +1 1 0 65 10 65 +1 1 0 66 11 64 +1 1 0 67 10 64 +1 1 1 0 11 127 +1 1 1 1 10 127 +1 1 1 2 11 126 +1 1 1 3 10 126 +1 1 1 4 11 125 +1 1 1 5 10 125 +1 1 1 6 11 124 +1 1 1 7 10 124 +1 1 1 8 11 123 +1 1 1 9 10 123 +1 1 1 10 11 122 +1 1 1 11 -1 -1 +1 1 1 12 10 122 +1 1 1 13 11 121 +1 1 1 14 10 121 +1 1 1 15 11 120 +1 1 1 16 10 120 +1 1 1 17 11 119 +1 1 1 18 10 119 +1 1 1 19 11 118 +1 1 1 20 10 118 +1 1 1 21 11 117 +1 1 1 22 -1 -1 +1 1 1 23 10 117 +1 1 1 24 11 116 +1 1 1 25 10 116 +1 1 1 26 11 115 +1 1 1 27 10 115 +1 1 1 28 11 114 +1 1 1 29 10 114 +1 1 1 30 11 113 +1 1 1 31 10 113 +1 1 1 32 11 112 +1 1 1 33 10 112 +1 1 1 34 11 111 +1 1 1 35 10 111 +1 1 1 36 11 110 +1 1 1 37 10 110 +1 1 1 38 11 109 +1 1 1 39 10 109 +1 1 1 40 11 108 +1 1 1 41 10 108 +1 1 1 42 11 107 +1 1 1 43 10 107 +1 1 1 44 11 106 +1 1 1 45 -1 -1 +1 1 1 46 10 106 +1 1 1 47 11 105 +1 1 1 48 10 105 +1 1 1 49 11 104 +1 1 1 50 10 104 +1 1 1 51 11 103 +1 1 1 52 10 103 +1 1 1 53 11 102 +1 1 1 54 10 102 +1 1 1 55 11 101 +1 1 1 56 -1 -1 +1 1 1 57 10 101 +1 1 1 58 11 100 +1 1 1 59 10 100 +1 1 1 60 11 99 +1 1 1 61 10 99 +1 1 1 62 11 98 +1 1 1 63 10 98 +1 1 1 64 11 97 +1 1 1 65 10 97 +1 1 1 66 11 96 +1 1 1 67 10 96 +1 1 2 0 9 95 +1 1 2 1 8 95 +1 1 2 2 9 94 +1 1 2 3 8 94 +1 1 2 4 9 93 +1 1 2 5 8 93 +1 1 2 6 9 92 +1 1 2 7 8 92 +1 1 2 8 9 91 +1 1 2 9 8 91 +1 1 2 10 9 90 +1 1 2 11 -1 -1 +1 1 2 12 8 90 +1 1 2 13 9 89 +1 1 2 14 8 89 +1 1 2 15 9 88 +1 1 2 16 8 88 +1 1 2 17 9 87 +1 1 2 18 8 87 +1 1 2 19 9 86 +1 1 2 20 8 86 +1 1 2 21 9 85 +1 1 2 22 -1 -1 +1 1 2 23 8 85 +1 1 2 24 9 84 +1 1 2 25 8 84 +1 1 2 26 9 83 +1 1 2 27 8 83 +1 1 2 28 9 82 +1 1 2 29 8 82 +1 1 2 30 9 81 +1 1 2 31 8 81 +1 1 2 32 9 80 +1 1 2 33 8 80 +1 1 2 34 9 79 +1 1 2 35 8 79 +1 1 2 36 9 78 +1 1 2 37 8 78 +1 1 2 38 9 77 +1 1 2 39 8 77 +1 1 2 40 9 76 +1 1 2 41 8 76 +1 1 2 42 9 75 +1 1 2 43 8 75 +1 1 2 44 9 74 +1 1 2 45 -1 -1 +1 1 2 46 8 74 +1 1 2 47 9 73 +1 1 2 48 8 73 +1 1 2 49 9 72 +1 1 2 50 8 72 +1 1 2 51 9 71 +1 1 2 52 8 71 +1 1 2 53 9 70 +1 1 2 54 8 70 +1 1 2 55 9 69 +1 1 2 56 -1 -1 +1 1 2 57 8 69 +1 1 2 58 9 68 +1 1 2 59 8 68 +1 1 2 60 9 67 +1 1 2 61 8 67 +1 1 2 62 9 66 +1 1 2 63 8 66 +1 1 2 64 9 65 +1 1 2 65 8 65 +1 1 2 66 9 64 +1 1 2 67 8 64 +1 1 3 0 9 127 +1 1 3 1 8 127 +1 1 3 2 9 126 +1 1 3 3 8 126 +1 1 3 4 9 125 +1 1 3 5 8 125 +1 1 3 6 9 124 +1 1 3 7 8 124 +1 1 3 8 9 123 +1 1 3 9 8 123 +1 1 3 10 9 122 +1 1 3 11 -1 -1 +1 1 3 12 8 122 +1 1 3 13 9 121 +1 1 3 14 8 121 +1 1 3 15 9 120 +1 1 3 16 8 120 +1 1 3 17 9 119 +1 1 3 18 8 119 +1 1 3 19 9 118 +1 1 3 20 8 118 +1 1 3 21 9 117 +1 1 3 22 -1 -1 +1 1 3 23 8 117 +1 1 3 24 9 116 +1 1 3 25 8 116 +1 1 3 26 9 115 +1 1 3 27 8 115 +1 1 3 28 9 114 +1 1 3 29 8 114 +1 1 3 30 9 113 +1 1 3 31 8 113 +1 1 3 32 9 112 +1 1 3 33 8 112 +1 1 3 34 9 111 +1 1 3 35 8 111 +1 1 3 36 9 110 +1 1 3 37 8 110 +1 1 3 38 9 109 +1 1 3 39 8 109 +1 1 3 40 9 108 +1 1 3 41 8 108 +1 1 3 42 9 107 +1 1 3 43 8 107 +1 1 3 44 9 106 +1 1 3 45 -1 -1 +1 1 3 46 8 106 +1 1 3 47 9 105 +1 1 3 48 8 105 +1 1 3 49 9 104 +1 1 3 50 8 104 +1 1 3 51 9 103 +1 1 3 52 8 103 +1 1 3 53 9 102 +1 1 3 54 8 102 +1 1 3 55 9 101 +1 1 3 56 -1 -1 +1 1 3 57 8 101 +1 1 3 58 9 100 +1 1 3 59 8 100 +1 1 3 60 9 99 +1 1 3 61 8 99 +1 1 3 62 9 98 +1 1 3 63 8 98 +1 1 3 64 9 97 +1 1 3 65 8 97 +1 1 3 66 9 96 +1 1 3 67 8 96 +1 2 0 0 12 32 +1 2 0 1 13 32 +1 2 0 2 12 33 +1 2 0 3 13 33 +1 2 0 4 12 34 +1 2 0 5 13 34 +1 2 0 6 12 35 +1 2 0 7 13 35 +1 2 0 8 12 36 +1 2 0 9 13 36 +1 2 0 10 12 37 +1 2 0 11 -1 -1 +1 2 0 12 13 37 +1 2 0 13 12 38 +1 2 0 14 13 38 +1 2 0 15 12 39 +1 2 0 16 13 39 +1 2 0 17 12 40 +1 2 0 18 13 40 +1 2 0 19 12 41 +1 2 0 20 13 41 +1 2 0 21 12 42 +1 2 0 22 -1 -1 +1 2 0 23 13 42 +1 2 0 24 12 43 +1 2 0 25 13 43 +1 2 0 26 12 44 +1 2 0 27 13 44 +1 2 0 28 12 45 +1 2 0 29 13 45 +1 2 0 30 12 46 +1 2 0 31 13 46 +1 2 0 32 12 47 +1 2 0 33 13 47 +1 2 0 34 12 48 +1 2 0 35 13 48 +1 2 0 36 12 49 +1 2 0 37 13 49 +1 2 0 38 12 50 +1 2 0 39 13 50 +1 2 0 40 12 51 +1 2 0 41 13 51 +1 2 0 42 12 52 +1 2 0 43 13 52 +1 2 0 44 12 53 +1 2 0 45 -1 -1 +1 2 0 46 13 53 +1 2 0 47 12 54 +1 2 0 48 13 54 +1 2 0 49 12 55 +1 2 0 50 13 55 +1 2 0 51 12 56 +1 2 0 52 13 56 +1 2 0 53 12 57 +1 2 0 54 13 57 +1 2 0 55 12 58 +1 2 0 56 -1 -1 +1 2 0 57 13 58 +1 2 0 58 12 59 +1 2 0 59 13 59 +1 2 0 60 12 60 +1 2 0 61 13 60 +1 2 0 62 12 61 +1 2 0 63 13 61 +1 2 0 64 12 62 +1 2 0 65 13 62 +1 2 0 66 12 63 +1 2 0 67 13 63 +1 2 1 0 12 0 +1 2 1 1 13 0 +1 2 1 2 12 1 +1 2 1 3 13 1 +1 2 1 4 12 2 +1 2 1 5 13 2 +1 2 1 6 12 3 +1 2 1 7 13 3 +1 2 1 8 12 4 +1 2 1 9 13 4 +1 2 1 10 12 5 +1 2 1 11 -1 -1 +1 2 1 12 13 5 +1 2 1 13 12 6 +1 2 1 14 13 6 +1 2 1 15 12 7 +1 2 1 16 13 7 +1 2 1 17 12 8 +1 2 1 18 13 8 +1 2 1 19 12 9 +1 2 1 20 13 9 +1 2 1 21 12 10 +1 2 1 22 -1 -1 +1 2 1 23 13 10 +1 2 1 24 12 11 +1 2 1 25 13 11 +1 2 1 26 12 12 +1 2 1 27 13 12 +1 2 1 28 12 13 +1 2 1 29 13 13 +1 2 1 30 12 14 +1 2 1 31 13 14 +1 2 1 32 12 15 +1 2 1 33 13 15 +1 2 1 34 12 16 +1 2 1 35 13 16 +1 2 1 36 12 17 +1 2 1 37 13 17 +1 2 1 38 12 18 +1 2 1 39 13 18 +1 2 1 40 12 19 +1 2 1 41 13 19 +1 2 1 42 12 20 +1 2 1 43 13 20 +1 2 1 44 12 21 +1 2 1 45 -1 -1 +1 2 1 46 13 21 +1 2 1 47 12 22 +1 2 1 48 13 22 +1 2 1 49 12 23 +1 2 1 50 13 23 +1 2 1 51 12 24 +1 2 1 52 13 24 +1 2 1 53 12 25 +1 2 1 54 13 25 +1 2 1 55 12 26 +1 2 1 56 -1 -1 +1 2 1 57 13 26 +1 2 1 58 12 27 +1 2 1 59 13 27 +1 2 1 60 12 28 +1 2 1 61 13 28 +1 2 1 62 12 29 +1 2 1 63 13 29 +1 2 1 64 12 30 +1 2 1 65 13 30 +1 2 1 66 12 31 +1 2 1 67 13 31 +1 2 2 0 14 32 +1 2 2 1 15 32 +1 2 2 2 14 33 +1 2 2 3 15 33 +1 2 2 4 14 34 +1 2 2 5 15 34 +1 2 2 6 14 35 +1 2 2 7 15 35 +1 2 2 8 14 36 +1 2 2 9 15 36 +1 2 2 10 14 37 +1 2 2 11 -1 -1 +1 2 2 12 15 37 +1 2 2 13 14 38 +1 2 2 14 15 38 +1 2 2 15 14 39 +1 2 2 16 15 39 +1 2 2 17 14 40 +1 2 2 18 15 40 +1 2 2 19 14 41 +1 2 2 20 15 41 +1 2 2 21 14 42 +1 2 2 22 -1 -1 +1 2 2 23 15 42 +1 2 2 24 14 43 +1 2 2 25 15 43 +1 2 2 26 14 44 +1 2 2 27 15 44 +1 2 2 28 14 45 +1 2 2 29 15 45 +1 2 2 30 14 46 +1 2 2 31 15 46 +1 2 2 32 14 47 +1 2 2 33 15 47 +1 2 2 34 14 48 +1 2 2 35 15 48 +1 2 2 36 14 49 +1 2 2 37 15 49 +1 2 2 38 14 50 +1 2 2 39 15 50 +1 2 2 40 14 51 +1 2 2 41 15 51 +1 2 2 42 14 52 +1 2 2 43 15 52 +1 2 2 44 14 53 +1 2 2 45 -1 -1 +1 2 2 46 15 53 +1 2 2 47 14 54 +1 2 2 48 15 54 +1 2 2 49 14 55 +1 2 2 50 15 55 +1 2 2 51 14 56 +1 2 2 52 15 56 +1 2 2 53 14 57 +1 2 2 54 15 57 +1 2 2 55 14 58 +1 2 2 56 -1 -1 +1 2 2 57 15 58 +1 2 2 58 14 59 +1 2 2 59 15 59 +1 2 2 60 14 60 +1 2 2 61 15 60 +1 2 2 62 14 61 +1 2 2 63 15 61 +1 2 2 64 14 62 +1 2 2 65 15 62 +1 2 2 66 14 63 +1 2 2 67 15 63 +1 2 3 0 14 0 +1 2 3 1 15 0 +1 2 3 2 14 1 +1 2 3 3 15 1 +1 2 3 4 14 2 +1 2 3 5 15 2 +1 2 3 6 14 3 +1 2 3 7 15 3 +1 2 3 8 14 4 +1 2 3 9 15 4 +1 2 3 10 14 5 +1 2 3 11 -1 -1 +1 2 3 12 15 5 +1 2 3 13 14 6 +1 2 3 14 15 6 +1 2 3 15 14 7 +1 2 3 16 15 7 +1 2 3 17 14 8 +1 2 3 18 15 8 +1 2 3 19 14 9 +1 2 3 20 15 9 +1 2 3 21 14 10 +1 2 3 22 -1 -1 +1 2 3 23 15 10 +1 2 3 24 14 11 +1 2 3 25 15 11 +1 2 3 26 14 12 +1 2 3 27 15 12 +1 2 3 28 14 13 +1 2 3 29 15 13 +1 2 3 30 14 14 +1 2 3 31 15 14 +1 2 3 32 14 15 +1 2 3 33 15 15 +1 2 3 34 14 16 +1 2 3 35 15 16 +1 2 3 36 14 17 +1 2 3 37 15 17 +1 2 3 38 14 18 +1 2 3 39 15 18 +1 2 3 40 14 19 +1 2 3 41 15 19 +1 2 3 42 14 20 +1 2 3 43 15 20 +1 2 3 44 14 21 +1 2 3 45 -1 -1 +1 2 3 46 15 21 +1 2 3 47 14 22 +1 2 3 48 15 22 +1 2 3 49 14 23 +1 2 3 50 15 23 +1 2 3 51 14 24 +1 2 3 52 15 24 +1 2 3 53 14 25 +1 2 3 54 15 25 +1 2 3 55 14 26 +1 2 3 56 -1 -1 +1 2 3 57 15 26 +1 2 3 58 14 27 +1 2 3 59 15 27 +1 2 3 60 14 28 +1 2 3 61 15 28 +1 2 3 62 14 29 +1 2 3 63 15 29 +1 2 3 64 14 30 +1 2 3 65 15 30 +1 2 3 66 14 31 +1 2 3 67 15 31 +1 3 0 0 15 95 +1 3 0 1 14 95 +1 3 0 2 15 94 +1 3 0 3 14 94 +1 3 0 4 15 93 +1 3 0 5 14 93 +1 3 0 6 15 92 +1 3 0 7 14 92 +1 3 0 8 15 91 +1 3 0 9 14 91 +1 3 0 10 15 90 +1 3 0 11 -1 -1 +1 3 0 12 14 90 +1 3 0 13 15 89 +1 3 0 14 14 89 +1 3 0 15 15 88 +1 3 0 16 14 88 +1 3 0 17 15 87 +1 3 0 18 14 87 +1 3 0 19 15 86 +1 3 0 20 14 86 +1 3 0 21 15 85 +1 3 0 22 -1 -1 +1 3 0 23 14 85 +1 3 0 24 15 84 +1 3 0 25 14 84 +1 3 0 26 15 83 +1 3 0 27 14 83 +1 3 0 28 15 82 +1 3 0 29 14 82 +1 3 0 30 15 81 +1 3 0 31 14 81 +1 3 0 32 15 80 +1 3 0 33 14 80 +1 3 0 34 15 79 +1 3 0 35 14 79 +1 3 0 36 15 78 +1 3 0 37 14 78 +1 3 0 38 15 77 +1 3 0 39 14 77 +1 3 0 40 15 76 +1 3 0 41 14 76 +1 3 0 42 15 75 +1 3 0 43 14 75 +1 3 0 44 15 74 +1 3 0 45 -1 -1 +1 3 0 46 14 74 +1 3 0 47 15 73 +1 3 0 48 14 73 +1 3 0 49 15 72 +1 3 0 50 14 72 +1 3 0 51 15 71 +1 3 0 52 14 71 +1 3 0 53 15 70 +1 3 0 54 14 70 +1 3 0 55 15 69 +1 3 0 56 -1 -1 +1 3 0 57 14 69 +1 3 0 58 15 68 +1 3 0 59 14 68 +1 3 0 60 15 67 +1 3 0 61 14 67 +1 3 0 62 15 66 +1 3 0 63 14 66 +1 3 0 64 15 65 +1 3 0 65 14 65 +1 3 0 66 15 64 +1 3 0 67 14 64 +1 3 1 0 15 127 +1 3 1 1 14 127 +1 3 1 2 15 126 +1 3 1 3 14 126 +1 3 1 4 15 125 +1 3 1 5 14 125 +1 3 1 6 15 124 +1 3 1 7 14 124 +1 3 1 8 15 123 +1 3 1 9 14 123 +1 3 1 10 15 122 +1 3 1 11 -1 -1 +1 3 1 12 14 122 +1 3 1 13 15 121 +1 3 1 14 14 121 +1 3 1 15 15 120 +1 3 1 16 14 120 +1 3 1 17 15 119 +1 3 1 18 14 119 +1 3 1 19 15 118 +1 3 1 20 14 118 +1 3 1 21 15 117 +1 3 1 22 -1 -1 +1 3 1 23 14 117 +1 3 1 24 15 116 +1 3 1 25 14 116 +1 3 1 26 15 115 +1 3 1 27 14 115 +1 3 1 28 15 114 +1 3 1 29 14 114 +1 3 1 30 15 113 +1 3 1 31 14 113 +1 3 1 32 15 112 +1 3 1 33 14 112 +1 3 1 34 15 111 +1 3 1 35 14 111 +1 3 1 36 15 110 +1 3 1 37 14 110 +1 3 1 38 15 109 +1 3 1 39 14 109 +1 3 1 40 15 108 +1 3 1 41 14 108 +1 3 1 42 15 107 +1 3 1 43 14 107 +1 3 1 44 15 106 +1 3 1 45 -1 -1 +1 3 1 46 14 106 +1 3 1 47 15 105 +1 3 1 48 14 105 +1 3 1 49 15 104 +1 3 1 50 14 104 +1 3 1 51 15 103 +1 3 1 52 14 103 +1 3 1 53 15 102 +1 3 1 54 14 102 +1 3 1 55 15 101 +1 3 1 56 -1 -1 +1 3 1 57 14 101 +1 3 1 58 15 100 +1 3 1 59 14 100 +1 3 1 60 15 99 +1 3 1 61 14 99 +1 3 1 62 15 98 +1 3 1 63 14 98 +1 3 1 64 15 97 +1 3 1 65 14 97 +1 3 1 66 15 96 +1 3 1 67 14 96 +1 3 2 0 13 95 +1 3 2 1 12 95 +1 3 2 2 13 94 +1 3 2 3 12 94 +1 3 2 4 13 93 +1 3 2 5 12 93 +1 3 2 6 13 92 +1 3 2 7 12 92 +1 3 2 8 13 91 +1 3 2 9 12 91 +1 3 2 10 13 90 +1 3 2 11 -1 -1 +1 3 2 12 12 90 +1 3 2 13 13 89 +1 3 2 14 12 89 +1 3 2 15 13 88 +1 3 2 16 12 88 +1 3 2 17 13 87 +1 3 2 18 12 87 +1 3 2 19 13 86 +1 3 2 20 12 86 +1 3 2 21 13 85 +1 3 2 22 -1 -1 +1 3 2 23 12 85 +1 3 2 24 13 84 +1 3 2 25 12 84 +1 3 2 26 13 83 +1 3 2 27 12 83 +1 3 2 28 13 82 +1 3 2 29 12 82 +1 3 2 30 13 81 +1 3 2 31 12 81 +1 3 2 32 13 80 +1 3 2 33 12 80 +1 3 2 34 13 79 +1 3 2 35 12 79 +1 3 2 36 13 78 +1 3 2 37 12 78 +1 3 2 38 13 77 +1 3 2 39 12 77 +1 3 2 40 13 76 +1 3 2 41 12 76 +1 3 2 42 13 75 +1 3 2 43 12 75 +1 3 2 44 13 74 +1 3 2 45 -1 -1 +1 3 2 46 12 74 +1 3 2 47 13 73 +1 3 2 48 12 73 +1 3 2 49 13 72 +1 3 2 50 12 72 +1 3 2 51 13 71 +1 3 2 52 12 71 +1 3 2 53 13 70 +1 3 2 54 12 70 +1 3 2 55 13 69 +1 3 2 56 -1 -1 +1 3 2 57 12 69 +1 3 2 58 13 68 +1 3 2 59 12 68 +1 3 2 60 13 67 +1 3 2 61 12 67 +1 3 2 62 13 66 +1 3 2 63 12 66 +1 3 2 64 13 65 +1 3 2 65 12 65 +1 3 2 66 13 64 +1 3 2 67 12 64 +1 3 3 0 13 127 +1 3 3 1 12 127 +1 3 3 2 13 126 +1 3 3 3 12 126 +1 3 3 4 13 125 +1 3 3 5 12 125 +1 3 3 6 13 124 +1 3 3 7 12 124 +1 3 3 8 13 123 +1 3 3 9 12 123 +1 3 3 10 13 122 +1 3 3 11 -1 -1 +1 3 3 12 12 122 +1 3 3 13 13 121 +1 3 3 14 12 121 +1 3 3 15 13 120 +1 3 3 16 12 120 +1 3 3 17 13 119 +1 3 3 18 12 119 +1 3 3 19 13 118 +1 3 3 20 12 118 +1 3 3 21 13 117 +1 3 3 22 -1 -1 +1 3 3 23 12 117 +1 3 3 24 13 116 +1 3 3 25 12 116 +1 3 3 26 13 115 +1 3 3 27 12 115 +1 3 3 28 13 114 +1 3 3 29 12 114 +1 3 3 30 13 113 +1 3 3 31 12 113 +1 3 3 32 13 112 +1 3 3 33 12 112 +1 3 3 34 13 111 +1 3 3 35 12 111 +1 3 3 36 13 110 +1 3 3 37 12 110 +1 3 3 38 13 109 +1 3 3 39 12 109 +1 3 3 40 13 108 +1 3 3 41 12 108 +1 3 3 42 13 107 +1 3 3 43 12 107 +1 3 3 44 13 106 +1 3 3 45 -1 -1 +1 3 3 46 12 106 +1 3 3 47 13 105 +1 3 3 48 12 105 +1 3 3 49 13 104 +1 3 3 50 12 104 +1 3 3 51 13 103 +1 3 3 52 12 103 +1 3 3 53 13 102 +1 3 3 54 12 102 +1 3 3 55 13 101 +1 3 3 56 -1 -1 +1 3 3 57 12 101 +1 3 3 58 13 100 +1 3 3 59 12 100 +1 3 3 60 13 99 +1 3 3 61 12 99 +1 3 3 62 13 98 +1 3 3 63 12 98 +1 3 3 64 13 97 +1 3 3 65 12 97 +1 3 3 66 13 96 +1 3 3 67 12 96 +2 0 0 0 16 32 +2 0 0 1 17 32 +2 0 0 2 16 33 +2 0 0 3 17 33 +2 0 0 4 16 34 +2 0 0 5 17 34 +2 0 0 6 16 35 +2 0 0 7 17 35 +2 0 0 8 16 36 +2 0 0 9 17 36 +2 0 0 10 16 37 +2 0 0 11 -1 -1 +2 0 0 12 17 37 +2 0 0 13 16 38 +2 0 0 14 17 38 +2 0 0 15 16 39 +2 0 0 16 17 39 +2 0 0 17 16 40 +2 0 0 18 17 40 +2 0 0 19 16 41 +2 0 0 20 17 41 +2 0 0 21 16 42 +2 0 0 22 -1 -1 +2 0 0 23 17 42 +2 0 0 24 16 43 +2 0 0 25 17 43 +2 0 0 26 16 44 +2 0 0 27 17 44 +2 0 0 28 16 45 +2 0 0 29 17 45 +2 0 0 30 16 46 +2 0 0 31 17 46 +2 0 0 32 16 47 +2 0 0 33 17 47 +2 0 0 34 16 48 +2 0 0 35 17 48 +2 0 0 36 16 49 +2 0 0 37 17 49 +2 0 0 38 16 50 +2 0 0 39 17 50 +2 0 0 40 16 51 +2 0 0 41 17 51 +2 0 0 42 16 52 +2 0 0 43 17 52 +2 0 0 44 16 53 +2 0 0 45 -1 -1 +2 0 0 46 17 53 +2 0 0 47 16 54 +2 0 0 48 17 54 +2 0 0 49 16 55 +2 0 0 50 17 55 +2 0 0 51 16 56 +2 0 0 52 17 56 +2 0 0 53 16 57 +2 0 0 54 17 57 +2 0 0 55 16 58 +2 0 0 56 -1 -1 +2 0 0 57 17 58 +2 0 0 58 16 59 +2 0 0 59 17 59 +2 0 0 60 16 60 +2 0 0 61 17 60 +2 0 0 62 16 61 +2 0 0 63 17 61 +2 0 0 64 16 62 +2 0 0 65 17 62 +2 0 0 66 16 63 +2 0 0 67 17 63 +2 0 1 0 16 0 +2 0 1 1 17 0 +2 0 1 2 16 1 +2 0 1 3 17 1 +2 0 1 4 16 2 +2 0 1 5 17 2 +2 0 1 6 16 3 +2 0 1 7 17 3 +2 0 1 8 16 4 +2 0 1 9 17 4 +2 0 1 10 16 5 +2 0 1 11 -1 -1 +2 0 1 12 17 5 +2 0 1 13 16 6 +2 0 1 14 17 6 +2 0 1 15 16 7 +2 0 1 16 17 7 +2 0 1 17 16 8 +2 0 1 18 17 8 +2 0 1 19 16 9 +2 0 1 20 17 9 +2 0 1 21 16 10 +2 0 1 22 -1 -1 +2 0 1 23 17 10 +2 0 1 24 16 11 +2 0 1 25 17 11 +2 0 1 26 16 12 +2 0 1 27 17 12 +2 0 1 28 16 13 +2 0 1 29 17 13 +2 0 1 30 16 14 +2 0 1 31 17 14 +2 0 1 32 16 15 +2 0 1 33 17 15 +2 0 1 34 16 16 +2 0 1 35 17 16 +2 0 1 36 16 17 +2 0 1 37 17 17 +2 0 1 38 16 18 +2 0 1 39 17 18 +2 0 1 40 16 19 +2 0 1 41 17 19 +2 0 1 42 16 20 +2 0 1 43 17 20 +2 0 1 44 16 21 +2 0 1 45 -1 -1 +2 0 1 46 17 21 +2 0 1 47 16 22 +2 0 1 48 17 22 +2 0 1 49 16 23 +2 0 1 50 17 23 +2 0 1 51 16 24 +2 0 1 52 17 24 +2 0 1 53 16 25 +2 0 1 54 17 25 +2 0 1 55 16 26 +2 0 1 56 -1 -1 +2 0 1 57 17 26 +2 0 1 58 16 27 +2 0 1 59 17 27 +2 0 1 60 16 28 +2 0 1 61 17 28 +2 0 1 62 16 29 +2 0 1 63 17 29 +2 0 1 64 16 30 +2 0 1 65 17 30 +2 0 1 66 16 31 +2 0 1 67 17 31 +2 0 2 0 18 32 +2 0 2 1 19 32 +2 0 2 2 18 33 +2 0 2 3 19 33 +2 0 2 4 18 34 +2 0 2 5 19 34 +2 0 2 6 18 35 +2 0 2 7 19 35 +2 0 2 8 18 36 +2 0 2 9 19 36 +2 0 2 10 18 37 +2 0 2 11 -1 -1 +2 0 2 12 19 37 +2 0 2 13 18 38 +2 0 2 14 19 38 +2 0 2 15 18 39 +2 0 2 16 19 39 +2 0 2 17 18 40 +2 0 2 18 19 40 +2 0 2 19 18 41 +2 0 2 20 19 41 +2 0 2 21 18 42 +2 0 2 22 -1 -1 +2 0 2 23 19 42 +2 0 2 24 18 43 +2 0 2 25 19 43 +2 0 2 26 18 44 +2 0 2 27 19 44 +2 0 2 28 18 45 +2 0 2 29 19 45 +2 0 2 30 18 46 +2 0 2 31 19 46 +2 0 2 32 18 47 +2 0 2 33 19 47 +2 0 2 34 18 48 +2 0 2 35 19 48 +2 0 2 36 18 49 +2 0 2 37 19 49 +2 0 2 38 18 50 +2 0 2 39 19 50 +2 0 2 40 18 51 +2 0 2 41 19 51 +2 0 2 42 18 52 +2 0 2 43 19 52 +2 0 2 44 18 53 +2 0 2 45 -1 -1 +2 0 2 46 19 53 +2 0 2 47 18 54 +2 0 2 48 19 54 +2 0 2 49 18 55 +2 0 2 50 19 55 +2 0 2 51 18 56 +2 0 2 52 19 56 +2 0 2 53 18 57 +2 0 2 54 19 57 +2 0 2 55 18 58 +2 0 2 56 -1 -1 +2 0 2 57 19 58 +2 0 2 58 18 59 +2 0 2 59 19 59 +2 0 2 60 18 60 +2 0 2 61 19 60 +2 0 2 62 18 61 +2 0 2 63 19 61 +2 0 2 64 18 62 +2 0 2 65 19 62 +2 0 2 66 18 63 +2 0 2 67 19 63 +2 0 3 0 18 0 +2 0 3 1 19 0 +2 0 3 2 18 1 +2 0 3 3 19 1 +2 0 3 4 18 2 +2 0 3 5 19 2 +2 0 3 6 18 3 +2 0 3 7 19 3 +2 0 3 8 18 4 +2 0 3 9 19 4 +2 0 3 10 18 5 +2 0 3 11 -1 -1 +2 0 3 12 19 5 +2 0 3 13 18 6 +2 0 3 14 19 6 +2 0 3 15 18 7 +2 0 3 16 19 7 +2 0 3 17 18 8 +2 0 3 18 19 8 +2 0 3 19 18 9 +2 0 3 20 19 9 +2 0 3 21 18 10 +2 0 3 22 -1 -1 +2 0 3 23 19 10 +2 0 3 24 18 11 +2 0 3 25 19 11 +2 0 3 26 18 12 +2 0 3 27 19 12 +2 0 3 28 18 13 +2 0 3 29 19 13 +2 0 3 30 18 14 +2 0 3 31 19 14 +2 0 3 32 18 15 +2 0 3 33 19 15 +2 0 3 34 18 16 +2 0 3 35 19 16 +2 0 3 36 18 17 +2 0 3 37 19 17 +2 0 3 38 18 18 +2 0 3 39 19 18 +2 0 3 40 18 19 +2 0 3 41 19 19 +2 0 3 42 18 20 +2 0 3 43 19 20 +2 0 3 44 18 21 +2 0 3 45 -1 -1 +2 0 3 46 19 21 +2 0 3 47 18 22 +2 0 3 48 19 22 +2 0 3 49 18 23 +2 0 3 50 19 23 +2 0 3 51 18 24 +2 0 3 52 19 24 +2 0 3 53 18 25 +2 0 3 54 19 25 +2 0 3 55 18 26 +2 0 3 56 -1 -1 +2 0 3 57 19 26 +2 0 3 58 18 27 +2 0 3 59 19 27 +2 0 3 60 18 28 +2 0 3 61 19 28 +2 0 3 62 18 29 +2 0 3 63 19 29 +2 0 3 64 18 30 +2 0 3 65 19 30 +2 0 3 66 18 31 +2 0 3 67 19 31 +2 1 0 0 19 95 +2 1 0 1 18 95 +2 1 0 2 19 94 +2 1 0 3 18 94 +2 1 0 4 19 93 +2 1 0 5 18 93 +2 1 0 6 19 92 +2 1 0 7 18 92 +2 1 0 8 19 91 +2 1 0 9 18 91 +2 1 0 10 19 90 +2 1 0 11 -1 -1 +2 1 0 12 18 90 +2 1 0 13 19 89 +2 1 0 14 18 89 +2 1 0 15 19 88 +2 1 0 16 18 88 +2 1 0 17 19 87 +2 1 0 18 18 87 +2 1 0 19 19 86 +2 1 0 20 18 86 +2 1 0 21 19 85 +2 1 0 22 -1 -1 +2 1 0 23 18 85 +2 1 0 24 19 84 +2 1 0 25 18 84 +2 1 0 26 19 83 +2 1 0 27 18 83 +2 1 0 28 19 82 +2 1 0 29 18 82 +2 1 0 30 19 81 +2 1 0 31 18 81 +2 1 0 32 19 80 +2 1 0 33 18 80 +2 1 0 34 19 79 +2 1 0 35 18 79 +2 1 0 36 19 78 +2 1 0 37 18 78 +2 1 0 38 19 77 +2 1 0 39 18 77 +2 1 0 40 19 76 +2 1 0 41 18 76 +2 1 0 42 19 75 +2 1 0 43 18 75 +2 1 0 44 19 74 +2 1 0 45 -1 -1 +2 1 0 46 18 74 +2 1 0 47 19 73 +2 1 0 48 18 73 +2 1 0 49 19 72 +2 1 0 50 18 72 +2 1 0 51 19 71 +2 1 0 52 18 71 +2 1 0 53 19 70 +2 1 0 54 18 70 +2 1 0 55 19 69 +2 1 0 56 -1 -1 +2 1 0 57 18 69 +2 1 0 58 19 68 +2 1 0 59 18 68 +2 1 0 60 19 67 +2 1 0 61 18 67 +2 1 0 62 19 66 +2 1 0 63 18 66 +2 1 0 64 19 65 +2 1 0 65 18 65 +2 1 0 66 19 64 +2 1 0 67 18 64 +2 1 1 0 19 127 +2 1 1 1 18 127 +2 1 1 2 19 126 +2 1 1 3 18 126 +2 1 1 4 19 125 +2 1 1 5 18 125 +2 1 1 6 19 124 +2 1 1 7 18 124 +2 1 1 8 19 123 +2 1 1 9 18 123 +2 1 1 10 19 122 +2 1 1 11 -1 -1 +2 1 1 12 18 122 +2 1 1 13 19 121 +2 1 1 14 18 121 +2 1 1 15 19 120 +2 1 1 16 18 120 +2 1 1 17 19 119 +2 1 1 18 18 119 +2 1 1 19 19 118 +2 1 1 20 18 118 +2 1 1 21 19 117 +2 1 1 22 -1 -1 +2 1 1 23 18 117 +2 1 1 24 19 116 +2 1 1 25 18 116 +2 1 1 26 19 115 +2 1 1 27 18 115 +2 1 1 28 19 114 +2 1 1 29 18 114 +2 1 1 30 19 113 +2 1 1 31 18 113 +2 1 1 32 19 112 +2 1 1 33 18 112 +2 1 1 34 19 111 +2 1 1 35 18 111 +2 1 1 36 19 110 +2 1 1 37 18 110 +2 1 1 38 19 109 +2 1 1 39 18 109 +2 1 1 40 19 108 +2 1 1 41 18 108 +2 1 1 42 19 107 +2 1 1 43 18 107 +2 1 1 44 19 106 +2 1 1 45 -1 -1 +2 1 1 46 18 106 +2 1 1 47 19 105 +2 1 1 48 18 105 +2 1 1 49 19 104 +2 1 1 50 18 104 +2 1 1 51 19 103 +2 1 1 52 18 103 +2 1 1 53 19 102 +2 1 1 54 18 102 +2 1 1 55 19 101 +2 1 1 56 -1 -1 +2 1 1 57 18 101 +2 1 1 58 19 100 +2 1 1 59 18 100 +2 1 1 60 19 99 +2 1 1 61 18 99 +2 1 1 62 19 98 +2 1 1 63 18 98 +2 1 1 64 19 97 +2 1 1 65 18 97 +2 1 1 66 19 96 +2 1 1 67 18 96 +2 1 2 0 17 95 +2 1 2 1 16 95 +2 1 2 2 17 94 +2 1 2 3 16 94 +2 1 2 4 17 93 +2 1 2 5 16 93 +2 1 2 6 17 92 +2 1 2 7 16 92 +2 1 2 8 17 91 +2 1 2 9 16 91 +2 1 2 10 17 90 +2 1 2 11 -1 -1 +2 1 2 12 16 90 +2 1 2 13 17 89 +2 1 2 14 16 89 +2 1 2 15 17 88 +2 1 2 16 16 88 +2 1 2 17 17 87 +2 1 2 18 16 87 +2 1 2 19 17 86 +2 1 2 20 16 86 +2 1 2 21 17 85 +2 1 2 22 -1 -1 +2 1 2 23 16 85 +2 1 2 24 17 84 +2 1 2 25 16 84 +2 1 2 26 17 83 +2 1 2 27 16 83 +2 1 2 28 17 82 +2 1 2 29 16 82 +2 1 2 30 17 81 +2 1 2 31 16 81 +2 1 2 32 17 80 +2 1 2 33 16 80 +2 1 2 34 17 79 +2 1 2 35 16 79 +2 1 2 36 17 78 +2 1 2 37 16 78 +2 1 2 38 17 77 +2 1 2 39 16 77 +2 1 2 40 17 76 +2 1 2 41 16 76 +2 1 2 42 17 75 +2 1 2 43 16 75 +2 1 2 44 17 74 +2 1 2 45 -1 -1 +2 1 2 46 16 74 +2 1 2 47 17 73 +2 1 2 48 16 73 +2 1 2 49 17 72 +2 1 2 50 16 72 +2 1 2 51 17 71 +2 1 2 52 16 71 +2 1 2 53 17 70 +2 1 2 54 16 70 +2 1 2 55 17 69 +2 1 2 56 -1 -1 +2 1 2 57 16 69 +2 1 2 58 17 68 +2 1 2 59 16 68 +2 1 2 60 17 67 +2 1 2 61 16 67 +2 1 2 62 17 66 +2 1 2 63 16 66 +2 1 2 64 17 65 +2 1 2 65 16 65 +2 1 2 66 17 64 +2 1 2 67 16 64 +2 1 3 0 17 127 +2 1 3 1 16 127 +2 1 3 2 17 126 +2 1 3 3 16 126 +2 1 3 4 17 125 +2 1 3 5 16 125 +2 1 3 6 17 124 +2 1 3 7 16 124 +2 1 3 8 17 123 +2 1 3 9 16 123 +2 1 3 10 17 122 +2 1 3 11 -1 -1 +2 1 3 12 16 122 +2 1 3 13 17 121 +2 1 3 14 16 121 +2 1 3 15 17 120 +2 1 3 16 16 120 +2 1 3 17 17 119 +2 1 3 18 16 119 +2 1 3 19 17 118 +2 1 3 20 16 118 +2 1 3 21 17 117 +2 1 3 22 -1 -1 +2 1 3 23 16 117 +2 1 3 24 17 116 +2 1 3 25 16 116 +2 1 3 26 17 115 +2 1 3 27 16 115 +2 1 3 28 17 114 +2 1 3 29 16 114 +2 1 3 30 17 113 +2 1 3 31 16 113 +2 1 3 32 17 112 +2 1 3 33 16 112 +2 1 3 34 17 111 +2 1 3 35 16 111 +2 1 3 36 17 110 +2 1 3 37 16 110 +2 1 3 38 17 109 +2 1 3 39 16 109 +2 1 3 40 17 108 +2 1 3 41 16 108 +2 1 3 42 17 107 +2 1 3 43 16 107 +2 1 3 44 17 106 +2 1 3 45 -1 -1 +2 1 3 46 16 106 +2 1 3 47 17 105 +2 1 3 48 16 105 +2 1 3 49 17 104 +2 1 3 50 16 104 +2 1 3 51 17 103 +2 1 3 52 16 103 +2 1 3 53 17 102 +2 1 3 54 16 102 +2 1 3 55 17 101 +2 1 3 56 -1 -1 +2 1 3 57 16 101 +2 1 3 58 17 100 +2 1 3 59 16 100 +2 1 3 60 17 99 +2 1 3 61 16 99 +2 1 3 62 17 98 +2 1 3 63 16 98 +2 1 3 64 17 97 +2 1 3 65 16 97 +2 1 3 66 17 96 +2 1 3 67 16 96 +2 2 0 0 20 32 +2 2 0 1 21 32 +2 2 0 2 20 33 +2 2 0 3 21 33 +2 2 0 4 20 34 +2 2 0 5 21 34 +2 2 0 6 20 35 +2 2 0 7 21 35 +2 2 0 8 20 36 +2 2 0 9 21 36 +2 2 0 10 20 37 +2 2 0 11 -1 -1 +2 2 0 12 21 37 +2 2 0 13 20 38 +2 2 0 14 21 38 +2 2 0 15 20 39 +2 2 0 16 21 39 +2 2 0 17 20 40 +2 2 0 18 21 40 +2 2 0 19 20 41 +2 2 0 20 21 41 +2 2 0 21 20 42 +2 2 0 22 -1 -1 +2 2 0 23 21 42 +2 2 0 24 20 43 +2 2 0 25 21 43 +2 2 0 26 20 44 +2 2 0 27 21 44 +2 2 0 28 20 45 +2 2 0 29 21 45 +2 2 0 30 20 46 +2 2 0 31 21 46 +2 2 0 32 20 47 +2 2 0 33 21 47 +2 2 0 34 20 48 +2 2 0 35 21 48 +2 2 0 36 20 49 +2 2 0 37 21 49 +2 2 0 38 20 50 +2 2 0 39 21 50 +2 2 0 40 20 51 +2 2 0 41 21 51 +2 2 0 42 20 52 +2 2 0 43 21 52 +2 2 0 44 20 53 +2 2 0 45 -1 -1 +2 2 0 46 21 53 +2 2 0 47 20 54 +2 2 0 48 21 54 +2 2 0 49 20 55 +2 2 0 50 21 55 +2 2 0 51 20 56 +2 2 0 52 21 56 +2 2 0 53 20 57 +2 2 0 54 21 57 +2 2 0 55 20 58 +2 2 0 56 -1 -1 +2 2 0 57 21 58 +2 2 0 58 20 59 +2 2 0 59 21 59 +2 2 0 60 20 60 +2 2 0 61 21 60 +2 2 0 62 20 61 +2 2 0 63 21 61 +2 2 0 64 20 62 +2 2 0 65 21 62 +2 2 0 66 20 63 +2 2 0 67 21 63 +2 2 1 0 20 0 +2 2 1 1 21 0 +2 2 1 2 20 1 +2 2 1 3 21 1 +2 2 1 4 20 2 +2 2 1 5 21 2 +2 2 1 6 20 3 +2 2 1 7 21 3 +2 2 1 8 20 4 +2 2 1 9 21 4 +2 2 1 10 20 5 +2 2 1 11 -1 -1 +2 2 1 12 21 5 +2 2 1 13 20 6 +2 2 1 14 21 6 +2 2 1 15 20 7 +2 2 1 16 21 7 +2 2 1 17 20 8 +2 2 1 18 21 8 +2 2 1 19 20 9 +2 2 1 20 21 9 +2 2 1 21 20 10 +2 2 1 22 -1 -1 +2 2 1 23 21 10 +2 2 1 24 20 11 +2 2 1 25 21 11 +2 2 1 26 20 12 +2 2 1 27 21 12 +2 2 1 28 20 13 +2 2 1 29 21 13 +2 2 1 30 20 14 +2 2 1 31 21 14 +2 2 1 32 20 15 +2 2 1 33 21 15 +2 2 1 34 20 16 +2 2 1 35 21 16 +2 2 1 36 20 17 +2 2 1 37 21 17 +2 2 1 38 20 18 +2 2 1 39 21 18 +2 2 1 40 20 19 +2 2 1 41 21 19 +2 2 1 42 20 20 +2 2 1 43 21 20 +2 2 1 44 20 21 +2 2 1 45 -1 -1 +2 2 1 46 21 21 +2 2 1 47 20 22 +2 2 1 48 21 22 +2 2 1 49 20 23 +2 2 1 50 21 23 +2 2 1 51 20 24 +2 2 1 52 21 24 +2 2 1 53 20 25 +2 2 1 54 21 25 +2 2 1 55 20 26 +2 2 1 56 -1 -1 +2 2 1 57 21 26 +2 2 1 58 20 27 +2 2 1 59 21 27 +2 2 1 60 20 28 +2 2 1 61 21 28 +2 2 1 62 20 29 +2 2 1 63 21 29 +2 2 1 64 20 30 +2 2 1 65 21 30 +2 2 1 66 20 31 +2 2 1 67 21 31 +2 2 2 0 22 32 +2 2 2 1 23 32 +2 2 2 2 22 33 +2 2 2 3 23 33 +2 2 2 4 22 34 +2 2 2 5 23 34 +2 2 2 6 22 35 +2 2 2 7 23 35 +2 2 2 8 22 36 +2 2 2 9 23 36 +2 2 2 10 22 37 +2 2 2 11 -1 -1 +2 2 2 12 23 37 +2 2 2 13 22 38 +2 2 2 14 23 38 +2 2 2 15 22 39 +2 2 2 16 23 39 +2 2 2 17 22 40 +2 2 2 18 23 40 +2 2 2 19 22 41 +2 2 2 20 23 41 +2 2 2 21 22 42 +2 2 2 22 -1 -1 +2 2 2 23 23 42 +2 2 2 24 22 43 +2 2 2 25 23 43 +2 2 2 26 22 44 +2 2 2 27 23 44 +2 2 2 28 22 45 +2 2 2 29 23 45 +2 2 2 30 22 46 +2 2 2 31 23 46 +2 2 2 32 22 47 +2 2 2 33 23 47 +2 2 2 34 22 48 +2 2 2 35 23 48 +2 2 2 36 22 49 +2 2 2 37 23 49 +2 2 2 38 22 50 +2 2 2 39 23 50 +2 2 2 40 22 51 +2 2 2 41 23 51 +2 2 2 42 22 52 +2 2 2 43 23 52 +2 2 2 44 22 53 +2 2 2 45 -1 -1 +2 2 2 46 23 53 +2 2 2 47 22 54 +2 2 2 48 23 54 +2 2 2 49 22 55 +2 2 2 50 23 55 +2 2 2 51 22 56 +2 2 2 52 23 56 +2 2 2 53 22 57 +2 2 2 54 23 57 +2 2 2 55 22 58 +2 2 2 56 -1 -1 +2 2 2 57 23 58 +2 2 2 58 22 59 +2 2 2 59 23 59 +2 2 2 60 22 60 +2 2 2 61 23 60 +2 2 2 62 22 61 +2 2 2 63 23 61 +2 2 2 64 22 62 +2 2 2 65 23 62 +2 2 2 66 22 63 +2 2 2 67 23 63 +2 2 3 0 22 0 +2 2 3 1 23 0 +2 2 3 2 22 1 +2 2 3 3 23 1 +2 2 3 4 22 2 +2 2 3 5 23 2 +2 2 3 6 22 3 +2 2 3 7 23 3 +2 2 3 8 22 4 +2 2 3 9 23 4 +2 2 3 10 22 5 +2 2 3 11 -1 -1 +2 2 3 12 23 5 +2 2 3 13 22 6 +2 2 3 14 23 6 +2 2 3 15 22 7 +2 2 3 16 23 7 +2 2 3 17 22 8 +2 2 3 18 23 8 +2 2 3 19 22 9 +2 2 3 20 23 9 +2 2 3 21 22 10 +2 2 3 22 -1 -1 +2 2 3 23 23 10 +2 2 3 24 22 11 +2 2 3 25 23 11 +2 2 3 26 22 12 +2 2 3 27 23 12 +2 2 3 28 22 13 +2 2 3 29 23 13 +2 2 3 30 22 14 +2 2 3 31 23 14 +2 2 3 32 22 15 +2 2 3 33 23 15 +2 2 3 34 22 16 +2 2 3 35 23 16 +2 2 3 36 22 17 +2 2 3 37 23 17 +2 2 3 38 22 18 +2 2 3 39 23 18 +2 2 3 40 22 19 +2 2 3 41 23 19 +2 2 3 42 22 20 +2 2 3 43 23 20 +2 2 3 44 22 21 +2 2 3 45 -1 -1 +2 2 3 46 23 21 +2 2 3 47 22 22 +2 2 3 48 23 22 +2 2 3 49 22 23 +2 2 3 50 23 23 +2 2 3 51 22 24 +2 2 3 52 23 24 +2 2 3 53 22 25 +2 2 3 54 23 25 +2 2 3 55 22 26 +2 2 3 56 -1 -1 +2 2 3 57 23 26 +2 2 3 58 22 27 +2 2 3 59 23 27 +2 2 3 60 22 28 +2 2 3 61 23 28 +2 2 3 62 22 29 +2 2 3 63 23 29 +2 2 3 64 22 30 +2 2 3 65 23 30 +2 2 3 66 22 31 +2 2 3 67 23 31 +2 3 0 0 23 95 +2 3 0 1 22 95 +2 3 0 2 23 94 +2 3 0 3 22 94 +2 3 0 4 23 93 +2 3 0 5 22 93 +2 3 0 6 23 92 +2 3 0 7 22 92 +2 3 0 8 23 91 +2 3 0 9 22 91 +2 3 0 10 23 90 +2 3 0 11 -1 -1 +2 3 0 12 22 90 +2 3 0 13 23 89 +2 3 0 14 22 89 +2 3 0 15 23 88 +2 3 0 16 22 88 +2 3 0 17 23 87 +2 3 0 18 22 87 +2 3 0 19 23 86 +2 3 0 20 22 86 +2 3 0 21 23 85 +2 3 0 22 -1 -1 +2 3 0 23 22 85 +2 3 0 24 23 84 +2 3 0 25 22 84 +2 3 0 26 23 83 +2 3 0 27 22 83 +2 3 0 28 23 82 +2 3 0 29 22 82 +2 3 0 30 23 81 +2 3 0 31 22 81 +2 3 0 32 23 80 +2 3 0 33 22 80 +2 3 0 34 23 79 +2 3 0 35 22 79 +2 3 0 36 23 78 +2 3 0 37 22 78 +2 3 0 38 23 77 +2 3 0 39 22 77 +2 3 0 40 23 76 +2 3 0 41 22 76 +2 3 0 42 23 75 +2 3 0 43 22 75 +2 3 0 44 23 74 +2 3 0 45 -1 -1 +2 3 0 46 22 74 +2 3 0 47 23 73 +2 3 0 48 22 73 +2 3 0 49 23 72 +2 3 0 50 22 72 +2 3 0 51 23 71 +2 3 0 52 22 71 +2 3 0 53 23 70 +2 3 0 54 22 70 +2 3 0 55 23 69 +2 3 0 56 -1 -1 +2 3 0 57 22 69 +2 3 0 58 23 68 +2 3 0 59 22 68 +2 3 0 60 23 67 +2 3 0 61 22 67 +2 3 0 62 23 66 +2 3 0 63 22 66 +2 3 0 64 23 65 +2 3 0 65 22 65 +2 3 0 66 23 64 +2 3 0 67 22 64 +2 3 1 0 23 127 +2 3 1 1 22 127 +2 3 1 2 23 126 +2 3 1 3 22 126 +2 3 1 4 23 125 +2 3 1 5 22 125 +2 3 1 6 23 124 +2 3 1 7 22 124 +2 3 1 8 23 123 +2 3 1 9 22 123 +2 3 1 10 23 122 +2 3 1 11 -1 -1 +2 3 1 12 22 122 +2 3 1 13 23 121 +2 3 1 14 22 121 +2 3 1 15 23 120 +2 3 1 16 22 120 +2 3 1 17 23 119 +2 3 1 18 22 119 +2 3 1 19 23 118 +2 3 1 20 22 118 +2 3 1 21 23 117 +2 3 1 22 -1 -1 +2 3 1 23 22 117 +2 3 1 24 23 116 +2 3 1 25 22 116 +2 3 1 26 23 115 +2 3 1 27 22 115 +2 3 1 28 23 114 +2 3 1 29 22 114 +2 3 1 30 23 113 +2 3 1 31 22 113 +2 3 1 32 23 112 +2 3 1 33 22 112 +2 3 1 34 23 111 +2 3 1 35 22 111 +2 3 1 36 23 110 +2 3 1 37 22 110 +2 3 1 38 23 109 +2 3 1 39 22 109 +2 3 1 40 23 108 +2 3 1 41 22 108 +2 3 1 42 23 107 +2 3 1 43 22 107 +2 3 1 44 23 106 +2 3 1 45 -1 -1 +2 3 1 46 22 106 +2 3 1 47 23 105 +2 3 1 48 22 105 +2 3 1 49 23 104 +2 3 1 50 22 104 +2 3 1 51 23 103 +2 3 1 52 22 103 +2 3 1 53 23 102 +2 3 1 54 22 102 +2 3 1 55 23 101 +2 3 1 56 -1 -1 +2 3 1 57 22 101 +2 3 1 58 23 100 +2 3 1 59 22 100 +2 3 1 60 23 99 +2 3 1 61 22 99 +2 3 1 62 23 98 +2 3 1 63 22 98 +2 3 1 64 23 97 +2 3 1 65 22 97 +2 3 1 66 23 96 +2 3 1 67 22 96 +2 3 2 0 21 95 +2 3 2 1 20 95 +2 3 2 2 21 94 +2 3 2 3 20 94 +2 3 2 4 21 93 +2 3 2 5 20 93 +2 3 2 6 21 92 +2 3 2 7 20 92 +2 3 2 8 21 91 +2 3 2 9 20 91 +2 3 2 10 21 90 +2 3 2 11 -1 -1 +2 3 2 12 20 90 +2 3 2 13 21 89 +2 3 2 14 20 89 +2 3 2 15 21 88 +2 3 2 16 20 88 +2 3 2 17 21 87 +2 3 2 18 20 87 +2 3 2 19 21 86 +2 3 2 20 20 86 +2 3 2 21 21 85 +2 3 2 22 -1 -1 +2 3 2 23 20 85 +2 3 2 24 21 84 +2 3 2 25 20 84 +2 3 2 26 21 83 +2 3 2 27 20 83 +2 3 2 28 21 82 +2 3 2 29 20 82 +2 3 2 30 21 81 +2 3 2 31 20 81 +2 3 2 32 21 80 +2 3 2 33 20 80 +2 3 2 34 21 79 +2 3 2 35 20 79 +2 3 2 36 21 78 +2 3 2 37 20 78 +2 3 2 38 21 77 +2 3 2 39 20 77 +2 3 2 40 21 76 +2 3 2 41 20 76 +2 3 2 42 21 75 +2 3 2 43 20 75 +2 3 2 44 21 74 +2 3 2 45 -1 -1 +2 3 2 46 20 74 +2 3 2 47 21 73 +2 3 2 48 20 73 +2 3 2 49 21 72 +2 3 2 50 20 72 +2 3 2 51 21 71 +2 3 2 52 20 71 +2 3 2 53 21 70 +2 3 2 54 20 70 +2 3 2 55 21 69 +2 3 2 56 -1 -1 +2 3 2 57 20 69 +2 3 2 58 21 68 +2 3 2 59 20 68 +2 3 2 60 21 67 +2 3 2 61 20 67 +2 3 2 62 21 66 +2 3 2 63 20 66 +2 3 2 64 21 65 +2 3 2 65 20 65 +2 3 2 66 21 64 +2 3 2 67 20 64 +2 3 3 0 21 127 +2 3 3 1 20 127 +2 3 3 2 21 126 +2 3 3 3 20 126 +2 3 3 4 21 125 +2 3 3 5 20 125 +2 3 3 6 21 124 +2 3 3 7 20 124 +2 3 3 8 21 123 +2 3 3 9 20 123 +2 3 3 10 21 122 +2 3 3 11 -1 -1 +2 3 3 12 20 122 +2 3 3 13 21 121 +2 3 3 14 20 121 +2 3 3 15 21 120 +2 3 3 16 20 120 +2 3 3 17 21 119 +2 3 3 18 20 119 +2 3 3 19 21 118 +2 3 3 20 20 118 +2 3 3 21 21 117 +2 3 3 22 -1 -1 +2 3 3 23 20 117 +2 3 3 24 21 116 +2 3 3 25 20 116 +2 3 3 26 21 115 +2 3 3 27 20 115 +2 3 3 28 21 114 +2 3 3 29 20 114 +2 3 3 30 21 113 +2 3 3 31 20 113 +2 3 3 32 21 112 +2 3 3 33 20 112 +2 3 3 34 21 111 +2 3 3 35 20 111 +2 3 3 36 21 110 +2 3 3 37 20 110 +2 3 3 38 21 109 +2 3 3 39 20 109 +2 3 3 40 21 108 +2 3 3 41 20 108 +2 3 3 42 21 107 +2 3 3 43 20 107 +2 3 3 44 21 106 +2 3 3 45 -1 -1 +2 3 3 46 20 106 +2 3 3 47 21 105 +2 3 3 48 20 105 +2 3 3 49 21 104 +2 3 3 50 20 104 +2 3 3 51 21 103 +2 3 3 52 20 103 +2 3 3 53 21 102 +2 3 3 54 20 102 +2 3 3 55 21 101 +2 3 3 56 -1 -1 +2 3 3 57 20 101 +2 3 3 58 21 100 +2 3 3 59 20 100 +2 3 3 60 21 99 +2 3 3 61 20 99 +2 3 3 62 21 98 +2 3 3 63 20 98 +2 3 3 64 21 97 +2 3 3 65 20 97 +2 3 3 66 21 96 +2 3 3 67 20 96 +3 0 0 0 24 32 +3 0 0 1 25 32 +3 0 0 2 24 33 +3 0 0 3 25 33 +3 0 0 4 24 34 +3 0 0 5 25 34 +3 0 0 6 24 35 +3 0 0 7 25 35 +3 0 0 8 24 36 +3 0 0 9 25 36 +3 0 0 10 24 37 +3 0 0 11 -1 -1 +3 0 0 12 25 37 +3 0 0 13 24 38 +3 0 0 14 25 38 +3 0 0 15 24 39 +3 0 0 16 25 39 +3 0 0 17 24 40 +3 0 0 18 25 40 +3 0 0 19 24 41 +3 0 0 20 25 41 +3 0 0 21 24 42 +3 0 0 22 -1 -1 +3 0 0 23 25 42 +3 0 0 24 24 43 +3 0 0 25 25 43 +3 0 0 26 24 44 +3 0 0 27 25 44 +3 0 0 28 24 45 +3 0 0 29 25 45 +3 0 0 30 24 46 +3 0 0 31 25 46 +3 0 0 32 24 47 +3 0 0 33 25 47 +3 0 0 34 24 48 +3 0 0 35 25 48 +3 0 0 36 24 49 +3 0 0 37 25 49 +3 0 0 38 24 50 +3 0 0 39 25 50 +3 0 0 40 24 51 +3 0 0 41 25 51 +3 0 0 42 24 52 +3 0 0 43 25 52 +3 0 0 44 24 53 +3 0 0 45 -1 -1 +3 0 0 46 25 53 +3 0 0 47 24 54 +3 0 0 48 25 54 +3 0 0 49 24 55 +3 0 0 50 25 55 +3 0 0 51 24 56 +3 0 0 52 25 56 +3 0 0 53 24 57 +3 0 0 54 25 57 +3 0 0 55 24 58 +3 0 0 56 -1 -1 +3 0 0 57 25 58 +3 0 0 58 24 59 +3 0 0 59 25 59 +3 0 0 60 24 60 +3 0 0 61 25 60 +3 0 0 62 24 61 +3 0 0 63 25 61 +3 0 0 64 24 62 +3 0 0 65 25 62 +3 0 0 66 24 63 +3 0 0 67 25 63 +3 0 1 0 24 0 +3 0 1 1 25 0 +3 0 1 2 24 1 +3 0 1 3 25 1 +3 0 1 4 24 2 +3 0 1 5 25 2 +3 0 1 6 24 3 +3 0 1 7 25 3 +3 0 1 8 24 4 +3 0 1 9 25 4 +3 0 1 10 24 5 +3 0 1 11 -1 -1 +3 0 1 12 25 5 +3 0 1 13 24 6 +3 0 1 14 25 6 +3 0 1 15 24 7 +3 0 1 16 25 7 +3 0 1 17 24 8 +3 0 1 18 25 8 +3 0 1 19 24 9 +3 0 1 20 25 9 +3 0 1 21 24 10 +3 0 1 22 -1 -1 +3 0 1 23 25 10 +3 0 1 24 24 11 +3 0 1 25 25 11 +3 0 1 26 24 12 +3 0 1 27 25 12 +3 0 1 28 24 13 +3 0 1 29 25 13 +3 0 1 30 24 14 +3 0 1 31 25 14 +3 0 1 32 24 15 +3 0 1 33 25 15 +3 0 1 34 24 16 +3 0 1 35 25 16 +3 0 1 36 24 17 +3 0 1 37 25 17 +3 0 1 38 24 18 +3 0 1 39 25 18 +3 0 1 40 24 19 +3 0 1 41 25 19 +3 0 1 42 24 20 +3 0 1 43 25 20 +3 0 1 44 24 21 +3 0 1 45 -1 -1 +3 0 1 46 25 21 +3 0 1 47 24 22 +3 0 1 48 25 22 +3 0 1 49 24 23 +3 0 1 50 25 23 +3 0 1 51 24 24 +3 0 1 52 25 24 +3 0 1 53 24 25 +3 0 1 54 25 25 +3 0 1 55 24 26 +3 0 1 56 -1 -1 +3 0 1 57 25 26 +3 0 1 58 24 27 +3 0 1 59 25 27 +3 0 1 60 24 28 +3 0 1 61 25 28 +3 0 1 62 24 29 +3 0 1 63 25 29 +3 0 1 64 24 30 +3 0 1 65 25 30 +3 0 1 66 24 31 +3 0 1 67 25 31 +3 0 2 0 26 32 +3 0 2 1 27 32 +3 0 2 2 26 33 +3 0 2 3 27 33 +3 0 2 4 26 34 +3 0 2 5 27 34 +3 0 2 6 26 35 +3 0 2 7 27 35 +3 0 2 8 26 36 +3 0 2 9 27 36 +3 0 2 10 26 37 +3 0 2 11 -1 -1 +3 0 2 12 27 37 +3 0 2 13 26 38 +3 0 2 14 27 38 +3 0 2 15 26 39 +3 0 2 16 27 39 +3 0 2 17 26 40 +3 0 2 18 27 40 +3 0 2 19 26 41 +3 0 2 20 27 41 +3 0 2 21 26 42 +3 0 2 22 -1 -1 +3 0 2 23 27 42 +3 0 2 24 26 43 +3 0 2 25 27 43 +3 0 2 26 26 44 +3 0 2 27 27 44 +3 0 2 28 26 45 +3 0 2 29 27 45 +3 0 2 30 26 46 +3 0 2 31 27 46 +3 0 2 32 26 47 +3 0 2 33 27 47 +3 0 2 34 26 48 +3 0 2 35 27 48 +3 0 2 36 26 49 +3 0 2 37 27 49 +3 0 2 38 26 50 +3 0 2 39 27 50 +3 0 2 40 26 51 +3 0 2 41 27 51 +3 0 2 42 26 52 +3 0 2 43 27 52 +3 0 2 44 26 53 +3 0 2 45 -1 -1 +3 0 2 46 27 53 +3 0 2 47 26 54 +3 0 2 48 27 54 +3 0 2 49 26 55 +3 0 2 50 27 55 +3 0 2 51 26 56 +3 0 2 52 27 56 +3 0 2 53 26 57 +3 0 2 54 27 57 +3 0 2 55 26 58 +3 0 2 56 -1 -1 +3 0 2 57 27 58 +3 0 2 58 26 59 +3 0 2 59 27 59 +3 0 2 60 26 60 +3 0 2 61 27 60 +3 0 2 62 26 61 +3 0 2 63 27 61 +3 0 2 64 26 62 +3 0 2 65 27 62 +3 0 2 66 26 63 +3 0 2 67 27 63 +3 0 3 0 26 0 +3 0 3 1 27 0 +3 0 3 2 26 1 +3 0 3 3 27 1 +3 0 3 4 26 2 +3 0 3 5 27 2 +3 0 3 6 26 3 +3 0 3 7 27 3 +3 0 3 8 26 4 +3 0 3 9 27 4 +3 0 3 10 26 5 +3 0 3 11 -1 -1 +3 0 3 12 27 5 +3 0 3 13 26 6 +3 0 3 14 27 6 +3 0 3 15 26 7 +3 0 3 16 27 7 +3 0 3 17 26 8 +3 0 3 18 27 8 +3 0 3 19 26 9 +3 0 3 20 27 9 +3 0 3 21 26 10 +3 0 3 22 -1 -1 +3 0 3 23 27 10 +3 0 3 24 26 11 +3 0 3 25 27 11 +3 0 3 26 26 12 +3 0 3 27 27 12 +3 0 3 28 26 13 +3 0 3 29 27 13 +3 0 3 30 26 14 +3 0 3 31 27 14 +3 0 3 32 26 15 +3 0 3 33 27 15 +3 0 3 34 26 16 +3 0 3 35 27 16 +3 0 3 36 26 17 +3 0 3 37 27 17 +3 0 3 38 26 18 +3 0 3 39 27 18 +3 0 3 40 26 19 +3 0 3 41 27 19 +3 0 3 42 26 20 +3 0 3 43 27 20 +3 0 3 44 26 21 +3 0 3 45 -1 -1 +3 0 3 46 27 21 +3 0 3 47 26 22 +3 0 3 48 27 22 +3 0 3 49 26 23 +3 0 3 50 27 23 +3 0 3 51 26 24 +3 0 3 52 27 24 +3 0 3 53 26 25 +3 0 3 54 27 25 +3 0 3 55 26 26 +3 0 3 56 -1 -1 +3 0 3 57 27 26 +3 0 3 58 26 27 +3 0 3 59 27 27 +3 0 3 60 26 28 +3 0 3 61 27 28 +3 0 3 62 26 29 +3 0 3 63 27 29 +3 0 3 64 26 30 +3 0 3 65 27 30 +3 0 3 66 26 31 +3 0 3 67 27 31 +3 1 0 0 27 95 +3 1 0 1 26 95 +3 1 0 2 27 94 +3 1 0 3 26 94 +3 1 0 4 27 93 +3 1 0 5 26 93 +3 1 0 6 27 92 +3 1 0 7 26 92 +3 1 0 8 27 91 +3 1 0 9 26 91 +3 1 0 10 27 90 +3 1 0 11 -1 -1 +3 1 0 12 26 90 +3 1 0 13 27 89 +3 1 0 14 26 89 +3 1 0 15 27 88 +3 1 0 16 26 88 +3 1 0 17 27 87 +3 1 0 18 26 87 +3 1 0 19 27 86 +3 1 0 20 26 86 +3 1 0 21 27 85 +3 1 0 22 -1 -1 +3 1 0 23 26 85 +3 1 0 24 27 84 +3 1 0 25 26 84 +3 1 0 26 27 83 +3 1 0 27 26 83 +3 1 0 28 27 82 +3 1 0 29 26 82 +3 1 0 30 27 81 +3 1 0 31 26 81 +3 1 0 32 27 80 +3 1 0 33 26 80 +3 1 0 34 27 79 +3 1 0 35 26 79 +3 1 0 36 27 78 +3 1 0 37 26 78 +3 1 0 38 27 77 +3 1 0 39 26 77 +3 1 0 40 27 76 +3 1 0 41 26 76 +3 1 0 42 27 75 +3 1 0 43 26 75 +3 1 0 44 27 74 +3 1 0 45 -1 -1 +3 1 0 46 26 74 +3 1 0 47 27 73 +3 1 0 48 26 73 +3 1 0 49 27 72 +3 1 0 50 26 72 +3 1 0 51 27 71 +3 1 0 52 26 71 +3 1 0 53 27 70 +3 1 0 54 26 70 +3 1 0 55 27 69 +3 1 0 56 -1 -1 +3 1 0 57 26 69 +3 1 0 58 27 68 +3 1 0 59 26 68 +3 1 0 60 27 67 +3 1 0 61 26 67 +3 1 0 62 27 66 +3 1 0 63 26 66 +3 1 0 64 27 65 +3 1 0 65 26 65 +3 1 0 66 27 64 +3 1 0 67 26 64 +3 1 1 0 27 127 +3 1 1 1 26 127 +3 1 1 2 27 126 +3 1 1 3 26 126 +3 1 1 4 27 125 +3 1 1 5 26 125 +3 1 1 6 27 124 +3 1 1 7 26 124 +3 1 1 8 27 123 +3 1 1 9 26 123 +3 1 1 10 27 122 +3 1 1 11 -1 -1 +3 1 1 12 26 122 +3 1 1 13 27 121 +3 1 1 14 26 121 +3 1 1 15 27 120 +3 1 1 16 26 120 +3 1 1 17 27 119 +3 1 1 18 26 119 +3 1 1 19 27 118 +3 1 1 20 26 118 +3 1 1 21 27 117 +3 1 1 22 -1 -1 +3 1 1 23 26 117 +3 1 1 24 27 116 +3 1 1 25 26 116 +3 1 1 26 27 115 +3 1 1 27 26 115 +3 1 1 28 27 114 +3 1 1 29 26 114 +3 1 1 30 27 113 +3 1 1 31 26 113 +3 1 1 32 27 112 +3 1 1 33 26 112 +3 1 1 34 27 111 +3 1 1 35 26 111 +3 1 1 36 27 110 +3 1 1 37 26 110 +3 1 1 38 27 109 +3 1 1 39 26 109 +3 1 1 40 27 108 +3 1 1 41 26 108 +3 1 1 42 27 107 +3 1 1 43 26 107 +3 1 1 44 27 106 +3 1 1 45 -1 -1 +3 1 1 46 26 106 +3 1 1 47 27 105 +3 1 1 48 26 105 +3 1 1 49 27 104 +3 1 1 50 26 104 +3 1 1 51 27 103 +3 1 1 52 26 103 +3 1 1 53 27 102 +3 1 1 54 26 102 +3 1 1 55 27 101 +3 1 1 56 -1 -1 +3 1 1 57 26 101 +3 1 1 58 27 100 +3 1 1 59 26 100 +3 1 1 60 27 99 +3 1 1 61 26 99 +3 1 1 62 27 98 +3 1 1 63 26 98 +3 1 1 64 27 97 +3 1 1 65 26 97 +3 1 1 66 27 96 +3 1 1 67 26 96 +3 1 2 0 25 95 +3 1 2 1 24 95 +3 1 2 2 25 94 +3 1 2 3 24 94 +3 1 2 4 25 93 +3 1 2 5 24 93 +3 1 2 6 25 92 +3 1 2 7 24 92 +3 1 2 8 25 91 +3 1 2 9 24 91 +3 1 2 10 25 90 +3 1 2 11 -1 -1 +3 1 2 12 24 90 +3 1 2 13 25 89 +3 1 2 14 24 89 +3 1 2 15 25 88 +3 1 2 16 24 88 +3 1 2 17 25 87 +3 1 2 18 24 87 +3 1 2 19 25 86 +3 1 2 20 24 86 +3 1 2 21 25 85 +3 1 2 22 -1 -1 +3 1 2 23 24 85 +3 1 2 24 25 84 +3 1 2 25 24 84 +3 1 2 26 25 83 +3 1 2 27 24 83 +3 1 2 28 25 82 +3 1 2 29 24 82 +3 1 2 30 25 81 +3 1 2 31 24 81 +3 1 2 32 25 80 +3 1 2 33 24 80 +3 1 2 34 25 79 +3 1 2 35 24 79 +3 1 2 36 25 78 +3 1 2 37 24 78 +3 1 2 38 25 77 +3 1 2 39 24 77 +3 1 2 40 25 76 +3 1 2 41 24 76 +3 1 2 42 25 75 +3 1 2 43 24 75 +3 1 2 44 25 74 +3 1 2 45 -1 -1 +3 1 2 46 24 74 +3 1 2 47 25 73 +3 1 2 48 24 73 +3 1 2 49 25 72 +3 1 2 50 24 72 +3 1 2 51 25 71 +3 1 2 52 24 71 +3 1 2 53 25 70 +3 1 2 54 24 70 +3 1 2 55 25 69 +3 1 2 56 -1 -1 +3 1 2 57 24 69 +3 1 2 58 25 68 +3 1 2 59 24 68 +3 1 2 60 25 67 +3 1 2 61 24 67 +3 1 2 62 25 66 +3 1 2 63 24 66 +3 1 2 64 25 65 +3 1 2 65 24 65 +3 1 2 66 25 64 +3 1 2 67 24 64 +3 1 3 0 25 127 +3 1 3 1 24 127 +3 1 3 2 25 126 +3 1 3 3 24 126 +3 1 3 4 25 125 +3 1 3 5 24 125 +3 1 3 6 25 124 +3 1 3 7 24 124 +3 1 3 8 25 123 +3 1 3 9 24 123 +3 1 3 10 25 122 +3 1 3 11 -1 -1 +3 1 3 12 24 122 +3 1 3 13 25 121 +3 1 3 14 24 121 +3 1 3 15 25 120 +3 1 3 16 24 120 +3 1 3 17 25 119 +3 1 3 18 24 119 +3 1 3 19 25 118 +3 1 3 20 24 118 +3 1 3 21 25 117 +3 1 3 22 -1 -1 +3 1 3 23 24 117 +3 1 3 24 25 116 +3 1 3 25 24 116 +3 1 3 26 25 115 +3 1 3 27 24 115 +3 1 3 28 25 114 +3 1 3 29 24 114 +3 1 3 30 25 113 +3 1 3 31 24 113 +3 1 3 32 25 112 +3 1 3 33 24 112 +3 1 3 34 25 111 +3 1 3 35 24 111 +3 1 3 36 25 110 +3 1 3 37 24 110 +3 1 3 38 25 109 +3 1 3 39 24 109 +3 1 3 40 25 108 +3 1 3 41 24 108 +3 1 3 42 25 107 +3 1 3 43 24 107 +3 1 3 44 25 106 +3 1 3 45 -1 -1 +3 1 3 46 24 106 +3 1 3 47 25 105 +3 1 3 48 24 105 +3 1 3 49 25 104 +3 1 3 50 24 104 +3 1 3 51 25 103 +3 1 3 52 24 103 +3 1 3 53 25 102 +3 1 3 54 24 102 +3 1 3 55 25 101 +3 1 3 56 -1 -1 +3 1 3 57 24 101 +3 1 3 58 25 100 +3 1 3 59 24 100 +3 1 3 60 25 99 +3 1 3 61 24 99 +3 1 3 62 25 98 +3 1 3 63 24 98 +3 1 3 64 25 97 +3 1 3 65 24 97 +3 1 3 66 25 96 +3 1 3 67 24 96 +3 2 0 0 28 32 +3 2 0 1 29 32 +3 2 0 2 28 33 +3 2 0 3 29 33 +3 2 0 4 28 34 +3 2 0 5 29 34 +3 2 0 6 28 35 +3 2 0 7 29 35 +3 2 0 8 28 36 +3 2 0 9 29 36 +3 2 0 10 28 37 +3 2 0 11 -1 -1 +3 2 0 12 29 37 +3 2 0 13 28 38 +3 2 0 14 29 38 +3 2 0 15 28 39 +3 2 0 16 29 39 +3 2 0 17 28 40 +3 2 0 18 29 40 +3 2 0 19 28 41 +3 2 0 20 29 41 +3 2 0 21 28 42 +3 2 0 22 -1 -1 +3 2 0 23 29 42 +3 2 0 24 28 43 +3 2 0 25 29 43 +3 2 0 26 28 44 +3 2 0 27 29 44 +3 2 0 28 28 45 +3 2 0 29 29 45 +3 2 0 30 28 46 +3 2 0 31 29 46 +3 2 0 32 28 47 +3 2 0 33 29 47 +3 2 0 34 28 48 +3 2 0 35 29 48 +3 2 0 36 28 49 +3 2 0 37 29 49 +3 2 0 38 28 50 +3 2 0 39 29 50 +3 2 0 40 28 51 +3 2 0 41 29 51 +3 2 0 42 28 52 +3 2 0 43 29 52 +3 2 0 44 28 53 +3 2 0 45 -1 -1 +3 2 0 46 29 53 +3 2 0 47 28 54 +3 2 0 48 29 54 +3 2 0 49 28 55 +3 2 0 50 29 55 +3 2 0 51 28 56 +3 2 0 52 29 56 +3 2 0 53 28 57 +3 2 0 54 29 57 +3 2 0 55 28 58 +3 2 0 56 -1 -1 +3 2 0 57 29 58 +3 2 0 58 28 59 +3 2 0 59 29 59 +3 2 0 60 28 60 +3 2 0 61 29 60 +3 2 0 62 28 61 +3 2 0 63 29 61 +3 2 0 64 28 62 +3 2 0 65 29 62 +3 2 0 66 28 63 +3 2 0 67 29 63 +3 2 1 0 28 0 +3 2 1 1 29 0 +3 2 1 2 28 1 +3 2 1 3 29 1 +3 2 1 4 28 2 +3 2 1 5 29 2 +3 2 1 6 28 3 +3 2 1 7 29 3 +3 2 1 8 28 4 +3 2 1 9 29 4 +3 2 1 10 28 5 +3 2 1 11 -1 -1 +3 2 1 12 29 5 +3 2 1 13 28 6 +3 2 1 14 29 6 +3 2 1 15 28 7 +3 2 1 16 29 7 +3 2 1 17 28 8 +3 2 1 18 29 8 +3 2 1 19 28 9 +3 2 1 20 29 9 +3 2 1 21 28 10 +3 2 1 22 -1 -1 +3 2 1 23 29 10 +3 2 1 24 28 11 +3 2 1 25 29 11 +3 2 1 26 28 12 +3 2 1 27 29 12 +3 2 1 28 28 13 +3 2 1 29 29 13 +3 2 1 30 28 14 +3 2 1 31 29 14 +3 2 1 32 28 15 +3 2 1 33 29 15 +3 2 1 34 28 16 +3 2 1 35 29 16 +3 2 1 36 28 17 +3 2 1 37 29 17 +3 2 1 38 28 18 +3 2 1 39 29 18 +3 2 1 40 28 19 +3 2 1 41 29 19 +3 2 1 42 28 20 +3 2 1 43 29 20 +3 2 1 44 28 21 +3 2 1 45 -1 -1 +3 2 1 46 29 21 +3 2 1 47 28 22 +3 2 1 48 29 22 +3 2 1 49 28 23 +3 2 1 50 29 23 +3 2 1 51 28 24 +3 2 1 52 29 24 +3 2 1 53 28 25 +3 2 1 54 29 25 +3 2 1 55 28 26 +3 2 1 56 -1 -1 +3 2 1 57 29 26 +3 2 1 58 28 27 +3 2 1 59 29 27 +3 2 1 60 28 28 +3 2 1 61 29 28 +3 2 1 62 28 29 +3 2 1 63 29 29 +3 2 1 64 28 30 +3 2 1 65 29 30 +3 2 1 66 28 31 +3 2 1 67 29 31 +3 2 2 0 30 32 +3 2 2 1 31 32 +3 2 2 2 30 33 +3 2 2 3 31 33 +3 2 2 4 30 34 +3 2 2 5 31 34 +3 2 2 6 30 35 +3 2 2 7 31 35 +3 2 2 8 30 36 +3 2 2 9 31 36 +3 2 2 10 30 37 +3 2 2 11 -1 -1 +3 2 2 12 31 37 +3 2 2 13 30 38 +3 2 2 14 31 38 +3 2 2 15 30 39 +3 2 2 16 31 39 +3 2 2 17 30 40 +3 2 2 18 31 40 +3 2 2 19 30 41 +3 2 2 20 31 41 +3 2 2 21 30 42 +3 2 2 22 -1 -1 +3 2 2 23 31 42 +3 2 2 24 30 43 +3 2 2 25 31 43 +3 2 2 26 30 44 +3 2 2 27 31 44 +3 2 2 28 30 45 +3 2 2 29 31 45 +3 2 2 30 30 46 +3 2 2 31 31 46 +3 2 2 32 30 47 +3 2 2 33 31 47 +3 2 2 34 30 48 +3 2 2 35 31 48 +3 2 2 36 30 49 +3 2 2 37 31 49 +3 2 2 38 30 50 +3 2 2 39 31 50 +3 2 2 40 30 51 +3 2 2 41 31 51 +3 2 2 42 30 52 +3 2 2 43 31 52 +3 2 2 44 30 53 +3 2 2 45 -1 -1 +3 2 2 46 31 53 +3 2 2 47 30 54 +3 2 2 48 31 54 +3 2 2 49 30 55 +3 2 2 50 31 55 +3 2 2 51 30 56 +3 2 2 52 31 56 +3 2 2 53 30 57 +3 2 2 54 31 57 +3 2 2 55 30 58 +3 2 2 56 -1 -1 +3 2 2 57 31 58 +3 2 2 58 30 59 +3 2 2 59 31 59 +3 2 2 60 30 60 +3 2 2 61 31 60 +3 2 2 62 30 61 +3 2 2 63 31 61 +3 2 2 64 30 62 +3 2 2 65 31 62 +3 2 2 66 30 63 +3 2 2 67 31 63 +3 2 3 0 30 0 +3 2 3 1 31 0 +3 2 3 2 30 1 +3 2 3 3 31 1 +3 2 3 4 30 2 +3 2 3 5 31 2 +3 2 3 6 30 3 +3 2 3 7 31 3 +3 2 3 8 30 4 +3 2 3 9 31 4 +3 2 3 10 30 5 +3 2 3 11 -1 -1 +3 2 3 12 31 5 +3 2 3 13 30 6 +3 2 3 14 31 6 +3 2 3 15 30 7 +3 2 3 16 31 7 +3 2 3 17 30 8 +3 2 3 18 31 8 +3 2 3 19 30 9 +3 2 3 20 31 9 +3 2 3 21 30 10 +3 2 3 22 -1 -1 +3 2 3 23 31 10 +3 2 3 24 30 11 +3 2 3 25 31 11 +3 2 3 26 30 12 +3 2 3 27 31 12 +3 2 3 28 30 13 +3 2 3 29 31 13 +3 2 3 30 30 14 +3 2 3 31 31 14 +3 2 3 32 30 15 +3 2 3 33 31 15 +3 2 3 34 30 16 +3 2 3 35 31 16 +3 2 3 36 30 17 +3 2 3 37 31 17 +3 2 3 38 30 18 +3 2 3 39 31 18 +3 2 3 40 30 19 +3 2 3 41 31 19 +3 2 3 42 30 20 +3 2 3 43 31 20 +3 2 3 44 30 21 +3 2 3 45 -1 -1 +3 2 3 46 31 21 +3 2 3 47 30 22 +3 2 3 48 31 22 +3 2 3 49 30 23 +3 2 3 50 31 23 +3 2 3 51 30 24 +3 2 3 52 31 24 +3 2 3 53 30 25 +3 2 3 54 31 25 +3 2 3 55 30 26 +3 2 3 56 -1 -1 +3 2 3 57 31 26 +3 2 3 58 30 27 +3 2 3 59 31 27 +3 2 3 60 30 28 +3 2 3 61 31 28 +3 2 3 62 30 29 +3 2 3 63 31 29 +3 2 3 64 30 30 +3 2 3 65 31 30 +3 2 3 66 30 31 +3 2 3 67 31 31 +3 3 0 0 31 95 +3 3 0 1 30 95 +3 3 0 2 31 94 +3 3 0 3 30 94 +3 3 0 4 31 93 +3 3 0 5 30 93 +3 3 0 6 31 92 +3 3 0 7 30 92 +3 3 0 8 31 91 +3 3 0 9 30 91 +3 3 0 10 31 90 +3 3 0 11 -1 -1 +3 3 0 12 30 90 +3 3 0 13 31 89 +3 3 0 14 30 89 +3 3 0 15 31 88 +3 3 0 16 30 88 +3 3 0 17 31 87 +3 3 0 18 30 87 +3 3 0 19 31 86 +3 3 0 20 30 86 +3 3 0 21 31 85 +3 3 0 22 -1 -1 +3 3 0 23 30 85 +3 3 0 24 31 84 +3 3 0 25 30 84 +3 3 0 26 31 83 +3 3 0 27 30 83 +3 3 0 28 31 82 +3 3 0 29 30 82 +3 3 0 30 31 81 +3 3 0 31 30 81 +3 3 0 32 31 80 +3 3 0 33 30 80 +3 3 0 34 31 79 +3 3 0 35 30 79 +3 3 0 36 31 78 +3 3 0 37 30 78 +3 3 0 38 31 77 +3 3 0 39 30 77 +3 3 0 40 31 76 +3 3 0 41 30 76 +3 3 0 42 31 75 +3 3 0 43 30 75 +3 3 0 44 31 74 +3 3 0 45 -1 -1 +3 3 0 46 30 74 +3 3 0 47 31 73 +3 3 0 48 30 73 +3 3 0 49 31 72 +3 3 0 50 30 72 +3 3 0 51 31 71 +3 3 0 52 30 71 +3 3 0 53 31 70 +3 3 0 54 30 70 +3 3 0 55 31 69 +3 3 0 56 -1 -1 +3 3 0 57 30 69 +3 3 0 58 31 68 +3 3 0 59 30 68 +3 3 0 60 31 67 +3 3 0 61 30 67 +3 3 0 62 31 66 +3 3 0 63 30 66 +3 3 0 64 31 65 +3 3 0 65 30 65 +3 3 0 66 31 64 +3 3 0 67 30 64 +3 3 1 0 31 127 +3 3 1 1 30 127 +3 3 1 2 31 126 +3 3 1 3 30 126 +3 3 1 4 31 125 +3 3 1 5 30 125 +3 3 1 6 31 124 +3 3 1 7 30 124 +3 3 1 8 31 123 +3 3 1 9 30 123 +3 3 1 10 31 122 +3 3 1 11 -1 -1 +3 3 1 12 30 122 +3 3 1 13 31 121 +3 3 1 14 30 121 +3 3 1 15 31 120 +3 3 1 16 30 120 +3 3 1 17 31 119 +3 3 1 18 30 119 +3 3 1 19 31 118 +3 3 1 20 30 118 +3 3 1 21 31 117 +3 3 1 22 -1 -1 +3 3 1 23 30 117 +3 3 1 24 31 116 +3 3 1 25 30 116 +3 3 1 26 31 115 +3 3 1 27 30 115 +3 3 1 28 31 114 +3 3 1 29 30 114 +3 3 1 30 31 113 +3 3 1 31 30 113 +3 3 1 32 31 112 +3 3 1 33 30 112 +3 3 1 34 31 111 +3 3 1 35 30 111 +3 3 1 36 31 110 +3 3 1 37 30 110 +3 3 1 38 31 109 +3 3 1 39 30 109 +3 3 1 40 31 108 +3 3 1 41 30 108 +3 3 1 42 31 107 +3 3 1 43 30 107 +3 3 1 44 31 106 +3 3 1 45 -1 -1 +3 3 1 46 30 106 +3 3 1 47 31 105 +3 3 1 48 30 105 +3 3 1 49 31 104 +3 3 1 50 30 104 +3 3 1 51 31 103 +3 3 1 52 30 103 +3 3 1 53 31 102 +3 3 1 54 30 102 +3 3 1 55 31 101 +3 3 1 56 -1 -1 +3 3 1 57 30 101 +3 3 1 58 31 100 +3 3 1 59 30 100 +3 3 1 60 31 99 +3 3 1 61 30 99 +3 3 1 62 31 98 +3 3 1 63 30 98 +3 3 1 64 31 97 +3 3 1 65 30 97 +3 3 1 66 31 96 +3 3 1 67 30 96 +3 3 2 0 29 95 +3 3 2 1 28 95 +3 3 2 2 29 94 +3 3 2 3 28 94 +3 3 2 4 29 93 +3 3 2 5 28 93 +3 3 2 6 29 92 +3 3 2 7 28 92 +3 3 2 8 29 91 +3 3 2 9 28 91 +3 3 2 10 29 90 +3 3 2 11 -1 -1 +3 3 2 12 28 90 +3 3 2 13 29 89 +3 3 2 14 28 89 +3 3 2 15 29 88 +3 3 2 16 28 88 +3 3 2 17 29 87 +3 3 2 18 28 87 +3 3 2 19 29 86 +3 3 2 20 28 86 +3 3 2 21 29 85 +3 3 2 22 -1 -1 +3 3 2 23 28 85 +3 3 2 24 29 84 +3 3 2 25 28 84 +3 3 2 26 29 83 +3 3 2 27 28 83 +3 3 2 28 29 82 +3 3 2 29 28 82 +3 3 2 30 29 81 +3 3 2 31 28 81 +3 3 2 32 29 80 +3 3 2 33 28 80 +3 3 2 34 29 79 +3 3 2 35 28 79 +3 3 2 36 29 78 +3 3 2 37 28 78 +3 3 2 38 29 77 +3 3 2 39 28 77 +3 3 2 40 29 76 +3 3 2 41 28 76 +3 3 2 42 29 75 +3 3 2 43 28 75 +3 3 2 44 29 74 +3 3 2 45 -1 -1 +3 3 2 46 28 74 +3 3 2 47 29 73 +3 3 2 48 28 73 +3 3 2 49 29 72 +3 3 2 50 28 72 +3 3 2 51 29 71 +3 3 2 52 28 71 +3 3 2 53 29 70 +3 3 2 54 28 70 +3 3 2 55 29 69 +3 3 2 56 -1 -1 +3 3 2 57 28 69 +3 3 2 58 29 68 +3 3 2 59 28 68 +3 3 2 60 29 67 +3 3 2 61 28 67 +3 3 2 62 29 66 +3 3 2 63 28 66 +3 3 2 64 29 65 +3 3 2 65 28 65 +3 3 2 66 29 64 +3 3 2 67 28 64 +3 3 3 0 29 127 +3 3 3 1 28 127 +3 3 3 2 29 126 +3 3 3 3 28 126 +3 3 3 4 29 125 +3 3 3 5 28 125 +3 3 3 6 29 124 +3 3 3 7 28 124 +3 3 3 8 29 123 +3 3 3 9 28 123 +3 3 3 10 29 122 +3 3 3 11 -1 -1 +3 3 3 12 28 122 +3 3 3 13 29 121 +3 3 3 14 28 121 +3 3 3 15 29 120 +3 3 3 16 28 120 +3 3 3 17 29 119 +3 3 3 18 28 119 +3 3 3 19 29 118 +3 3 3 20 28 118 +3 3 3 21 29 117 +3 3 3 22 -1 -1 +3 3 3 23 28 117 +3 3 3 24 29 116 +3 3 3 25 28 116 +3 3 3 26 29 115 +3 3 3 27 28 115 +3 3 3 28 29 114 +3 3 3 29 28 114 +3 3 3 30 29 113 +3 3 3 31 28 113 +3 3 3 32 29 112 +3 3 3 33 28 112 +3 3 3 34 29 111 +3 3 3 35 28 111 +3 3 3 36 29 110 +3 3 3 37 28 110 +3 3 3 38 29 109 +3 3 3 39 28 109 +3 3 3 40 29 108 +3 3 3 41 28 108 +3 3 3 42 29 107 +3 3 3 43 28 107 +3 3 3 44 29 106 +3 3 3 45 -1 -1 +3 3 3 46 28 106 +3 3 3 47 29 105 +3 3 3 48 28 105 +3 3 3 49 29 104 +3 3 3 50 28 104 +3 3 3 51 29 103 +3 3 3 52 28 103 +3 3 3 53 29 102 +3 3 3 54 28 102 +3 3 3 55 29 101 +3 3 3 56 -1 -1 +3 3 3 57 28 101 +3 3 3 58 29 100 +3 3 3 59 28 100 +3 3 3 60 29 99 +3 3 3 61 28 99 +3 3 3 62 29 98 +3 3 3 63 28 98 +3 3 3 64 29 97 +3 3 3 65 28 97 +3 3 3 66 29 96 +3 3 3 67 28 96 +4 0 0 0 32 32 +4 0 0 1 33 32 +4 0 0 2 32 33 +4 0 0 3 33 33 +4 0 0 4 32 34 +4 0 0 5 33 34 +4 0 0 6 32 35 +4 0 0 7 33 35 +4 0 0 8 32 36 +4 0 0 9 33 36 +4 0 0 10 32 37 +4 0 0 11 -1 -1 +4 0 0 12 33 37 +4 0 0 13 32 38 +4 0 0 14 33 38 +4 0 0 15 32 39 +4 0 0 16 33 39 +4 0 0 17 32 40 +4 0 0 18 33 40 +4 0 0 19 32 41 +4 0 0 20 33 41 +4 0 0 21 32 42 +4 0 0 22 -1 -1 +4 0 0 23 33 42 +4 0 0 24 32 43 +4 0 0 25 33 43 +4 0 0 26 32 44 +4 0 0 27 33 44 +4 0 0 28 32 45 +4 0 0 29 33 45 +4 0 0 30 32 46 +4 0 0 31 33 46 +4 0 0 32 32 47 +4 0 0 33 33 47 +4 0 0 34 32 48 +4 0 0 35 33 48 +4 0 0 36 32 49 +4 0 0 37 33 49 +4 0 0 38 32 50 +4 0 0 39 33 50 +4 0 0 40 32 51 +4 0 0 41 33 51 +4 0 0 42 32 52 +4 0 0 43 33 52 +4 0 0 44 32 53 +4 0 0 45 -1 -1 +4 0 0 46 33 53 +4 0 0 47 32 54 +4 0 0 48 33 54 +4 0 0 49 32 55 +4 0 0 50 33 55 +4 0 0 51 32 56 +4 0 0 52 33 56 +4 0 0 53 32 57 +4 0 0 54 33 57 +4 0 0 55 32 58 +4 0 0 56 -1 -1 +4 0 0 57 33 58 +4 0 0 58 32 59 +4 0 0 59 33 59 +4 0 0 60 32 60 +4 0 0 61 33 60 +4 0 0 62 32 61 +4 0 0 63 33 61 +4 0 0 64 32 62 +4 0 0 65 33 62 +4 0 0 66 32 63 +4 0 0 67 33 63 +4 0 1 0 32 0 +4 0 1 1 33 0 +4 0 1 2 32 1 +4 0 1 3 33 1 +4 0 1 4 32 2 +4 0 1 5 33 2 +4 0 1 6 32 3 +4 0 1 7 33 3 +4 0 1 8 32 4 +4 0 1 9 33 4 +4 0 1 10 32 5 +4 0 1 11 -1 -1 +4 0 1 12 33 5 +4 0 1 13 32 6 +4 0 1 14 33 6 +4 0 1 15 32 7 +4 0 1 16 33 7 +4 0 1 17 32 8 +4 0 1 18 33 8 +4 0 1 19 32 9 +4 0 1 20 33 9 +4 0 1 21 32 10 +4 0 1 22 -1 -1 +4 0 1 23 33 10 +4 0 1 24 32 11 +4 0 1 25 33 11 +4 0 1 26 32 12 +4 0 1 27 33 12 +4 0 1 28 32 13 +4 0 1 29 33 13 +4 0 1 30 32 14 +4 0 1 31 33 14 +4 0 1 32 32 15 +4 0 1 33 33 15 +4 0 1 34 32 16 +4 0 1 35 33 16 +4 0 1 36 32 17 +4 0 1 37 33 17 +4 0 1 38 32 18 +4 0 1 39 33 18 +4 0 1 40 32 19 +4 0 1 41 33 19 +4 0 1 42 32 20 +4 0 1 43 33 20 +4 0 1 44 32 21 +4 0 1 45 -1 -1 +4 0 1 46 33 21 +4 0 1 47 32 22 +4 0 1 48 33 22 +4 0 1 49 32 23 +4 0 1 50 33 23 +4 0 1 51 32 24 +4 0 1 52 33 24 +4 0 1 53 32 25 +4 0 1 54 33 25 +4 0 1 55 32 26 +4 0 1 56 -1 -1 +4 0 1 57 33 26 +4 0 1 58 32 27 +4 0 1 59 33 27 +4 0 1 60 32 28 +4 0 1 61 33 28 +4 0 1 62 32 29 +4 0 1 63 33 29 +4 0 1 64 32 30 +4 0 1 65 33 30 +4 0 1 66 32 31 +4 0 1 67 33 31 +4 0 2 0 34 32 +4 0 2 1 35 32 +4 0 2 2 34 33 +4 0 2 3 35 33 +4 0 2 4 34 34 +4 0 2 5 35 34 +4 0 2 6 34 35 +4 0 2 7 35 35 +4 0 2 8 34 36 +4 0 2 9 35 36 +4 0 2 10 34 37 +4 0 2 11 -1 -1 +4 0 2 12 35 37 +4 0 2 13 34 38 +4 0 2 14 35 38 +4 0 2 15 34 39 +4 0 2 16 35 39 +4 0 2 17 34 40 +4 0 2 18 35 40 +4 0 2 19 34 41 +4 0 2 20 35 41 +4 0 2 21 34 42 +4 0 2 22 -1 -1 +4 0 2 23 35 42 +4 0 2 24 34 43 +4 0 2 25 35 43 +4 0 2 26 34 44 +4 0 2 27 35 44 +4 0 2 28 34 45 +4 0 2 29 35 45 +4 0 2 30 34 46 +4 0 2 31 35 46 +4 0 2 32 34 47 +4 0 2 33 35 47 +4 0 2 34 34 48 +4 0 2 35 35 48 +4 0 2 36 34 49 +4 0 2 37 35 49 +4 0 2 38 34 50 +4 0 2 39 35 50 +4 0 2 40 34 51 +4 0 2 41 35 51 +4 0 2 42 34 52 +4 0 2 43 35 52 +4 0 2 44 34 53 +4 0 2 45 -1 -1 +4 0 2 46 35 53 +4 0 2 47 34 54 +4 0 2 48 35 54 +4 0 2 49 34 55 +4 0 2 50 35 55 +4 0 2 51 34 56 +4 0 2 52 35 56 +4 0 2 53 34 57 +4 0 2 54 35 57 +4 0 2 55 34 58 +4 0 2 56 -1 -1 +4 0 2 57 35 58 +4 0 2 58 34 59 +4 0 2 59 35 59 +4 0 2 60 34 60 +4 0 2 61 35 60 +4 0 2 62 34 61 +4 0 2 63 35 61 +4 0 2 64 34 62 +4 0 2 65 35 62 +4 0 2 66 34 63 +4 0 2 67 35 63 +4 0 3 0 34 0 +4 0 3 1 35 0 +4 0 3 2 34 1 +4 0 3 3 35 1 +4 0 3 4 34 2 +4 0 3 5 35 2 +4 0 3 6 34 3 +4 0 3 7 35 3 +4 0 3 8 34 4 +4 0 3 9 35 4 +4 0 3 10 34 5 +4 0 3 11 -1 -1 +4 0 3 12 35 5 +4 0 3 13 34 6 +4 0 3 14 35 6 +4 0 3 15 34 7 +4 0 3 16 35 7 +4 0 3 17 34 8 +4 0 3 18 35 8 +4 0 3 19 34 9 +4 0 3 20 35 9 +4 0 3 21 34 10 +4 0 3 22 -1 -1 +4 0 3 23 35 10 +4 0 3 24 34 11 +4 0 3 25 35 11 +4 0 3 26 34 12 +4 0 3 27 35 12 +4 0 3 28 34 13 +4 0 3 29 35 13 +4 0 3 30 34 14 +4 0 3 31 35 14 +4 0 3 32 34 15 +4 0 3 33 35 15 +4 0 3 34 34 16 +4 0 3 35 35 16 +4 0 3 36 34 17 +4 0 3 37 35 17 +4 0 3 38 34 18 +4 0 3 39 35 18 +4 0 3 40 34 19 +4 0 3 41 35 19 +4 0 3 42 34 20 +4 0 3 43 35 20 +4 0 3 44 34 21 +4 0 3 45 -1 -1 +4 0 3 46 35 21 +4 0 3 47 34 22 +4 0 3 48 35 22 +4 0 3 49 34 23 +4 0 3 50 35 23 +4 0 3 51 34 24 +4 0 3 52 35 24 +4 0 3 53 34 25 +4 0 3 54 35 25 +4 0 3 55 34 26 +4 0 3 56 -1 -1 +4 0 3 57 35 26 +4 0 3 58 34 27 +4 0 3 59 35 27 +4 0 3 60 34 28 +4 0 3 61 35 28 +4 0 3 62 34 29 +4 0 3 63 35 29 +4 0 3 64 34 30 +4 0 3 65 35 30 +4 0 3 66 34 31 +4 0 3 67 35 31 +4 1 0 0 35 95 +4 1 0 1 34 95 +4 1 0 2 35 94 +4 1 0 3 34 94 +4 1 0 4 35 93 +4 1 0 5 34 93 +4 1 0 6 35 92 +4 1 0 7 34 92 +4 1 0 8 35 91 +4 1 0 9 34 91 +4 1 0 10 35 90 +4 1 0 11 -1 -1 +4 1 0 12 34 90 +4 1 0 13 35 89 +4 1 0 14 34 89 +4 1 0 15 35 88 +4 1 0 16 34 88 +4 1 0 17 35 87 +4 1 0 18 34 87 +4 1 0 19 35 86 +4 1 0 20 34 86 +4 1 0 21 35 85 +4 1 0 22 -1 -1 +4 1 0 23 34 85 +4 1 0 24 35 84 +4 1 0 25 34 84 +4 1 0 26 35 83 +4 1 0 27 34 83 +4 1 0 28 35 82 +4 1 0 29 34 82 +4 1 0 30 35 81 +4 1 0 31 34 81 +4 1 0 32 35 80 +4 1 0 33 34 80 +4 1 0 34 35 79 +4 1 0 35 34 79 +4 1 0 36 35 78 +4 1 0 37 34 78 +4 1 0 38 35 77 +4 1 0 39 34 77 +4 1 0 40 35 76 +4 1 0 41 34 76 +4 1 0 42 35 75 +4 1 0 43 34 75 +4 1 0 44 35 74 +4 1 0 45 -1 -1 +4 1 0 46 34 74 +4 1 0 47 35 73 +4 1 0 48 34 73 +4 1 0 49 35 72 +4 1 0 50 34 72 +4 1 0 51 35 71 +4 1 0 52 34 71 +4 1 0 53 35 70 +4 1 0 54 34 70 +4 1 0 55 35 69 +4 1 0 56 -1 -1 +4 1 0 57 34 69 +4 1 0 58 35 68 +4 1 0 59 34 68 +4 1 0 60 35 67 +4 1 0 61 34 67 +4 1 0 62 35 66 +4 1 0 63 34 66 +4 1 0 64 35 65 +4 1 0 65 34 65 +4 1 0 66 35 64 +4 1 0 67 34 64 +4 1 1 0 35 127 +4 1 1 1 34 127 +4 1 1 2 35 126 +4 1 1 3 34 126 +4 1 1 4 35 125 +4 1 1 5 34 125 +4 1 1 6 35 124 +4 1 1 7 34 124 +4 1 1 8 35 123 +4 1 1 9 34 123 +4 1 1 10 35 122 +4 1 1 11 -1 -1 +4 1 1 12 34 122 +4 1 1 13 35 121 +4 1 1 14 34 121 +4 1 1 15 35 120 +4 1 1 16 34 120 +4 1 1 17 35 119 +4 1 1 18 34 119 +4 1 1 19 35 118 +4 1 1 20 34 118 +4 1 1 21 35 117 +4 1 1 22 -1 -1 +4 1 1 23 34 117 +4 1 1 24 35 116 +4 1 1 25 34 116 +4 1 1 26 35 115 +4 1 1 27 34 115 +4 1 1 28 35 114 +4 1 1 29 34 114 +4 1 1 30 35 113 +4 1 1 31 34 113 +4 1 1 32 35 112 +4 1 1 33 34 112 +4 1 1 34 35 111 +4 1 1 35 34 111 +4 1 1 36 35 110 +4 1 1 37 34 110 +4 1 1 38 35 109 +4 1 1 39 34 109 +4 1 1 40 35 108 +4 1 1 41 34 108 +4 1 1 42 35 107 +4 1 1 43 34 107 +4 1 1 44 35 106 +4 1 1 45 -1 -1 +4 1 1 46 34 106 +4 1 1 47 35 105 +4 1 1 48 34 105 +4 1 1 49 35 104 +4 1 1 50 34 104 +4 1 1 51 35 103 +4 1 1 52 34 103 +4 1 1 53 35 102 +4 1 1 54 34 102 +4 1 1 55 35 101 +4 1 1 56 -1 -1 +4 1 1 57 34 101 +4 1 1 58 35 100 +4 1 1 59 34 100 +4 1 1 60 35 99 +4 1 1 61 34 99 +4 1 1 62 35 98 +4 1 1 63 34 98 +4 1 1 64 35 97 +4 1 1 65 34 97 +4 1 1 66 35 96 +4 1 1 67 34 96 +4 1 2 0 33 95 +4 1 2 1 32 95 +4 1 2 2 33 94 +4 1 2 3 32 94 +4 1 2 4 33 93 +4 1 2 5 32 93 +4 1 2 6 33 92 +4 1 2 7 32 92 +4 1 2 8 33 91 +4 1 2 9 32 91 +4 1 2 10 33 90 +4 1 2 11 -1 -1 +4 1 2 12 32 90 +4 1 2 13 33 89 +4 1 2 14 32 89 +4 1 2 15 33 88 +4 1 2 16 32 88 +4 1 2 17 33 87 +4 1 2 18 32 87 +4 1 2 19 33 86 +4 1 2 20 32 86 +4 1 2 21 33 85 +4 1 2 22 -1 -1 +4 1 2 23 32 85 +4 1 2 24 33 84 +4 1 2 25 32 84 +4 1 2 26 33 83 +4 1 2 27 32 83 +4 1 2 28 33 82 +4 1 2 29 32 82 +4 1 2 30 33 81 +4 1 2 31 32 81 +4 1 2 32 33 80 +4 1 2 33 32 80 +4 1 2 34 33 79 +4 1 2 35 32 79 +4 1 2 36 33 78 +4 1 2 37 32 78 +4 1 2 38 33 77 +4 1 2 39 32 77 +4 1 2 40 33 76 +4 1 2 41 32 76 +4 1 2 42 33 75 +4 1 2 43 32 75 +4 1 2 44 33 74 +4 1 2 45 -1 -1 +4 1 2 46 32 74 +4 1 2 47 33 73 +4 1 2 48 32 73 +4 1 2 49 33 72 +4 1 2 50 32 72 +4 1 2 51 33 71 +4 1 2 52 32 71 +4 1 2 53 33 70 +4 1 2 54 32 70 +4 1 2 55 33 69 +4 1 2 56 -1 -1 +4 1 2 57 32 69 +4 1 2 58 33 68 +4 1 2 59 32 68 +4 1 2 60 33 67 +4 1 2 61 32 67 +4 1 2 62 33 66 +4 1 2 63 32 66 +4 1 2 64 33 65 +4 1 2 65 32 65 +4 1 2 66 33 64 +4 1 2 67 32 64 +4 1 3 0 33 127 +4 1 3 1 32 127 +4 1 3 2 33 126 +4 1 3 3 32 126 +4 1 3 4 33 125 +4 1 3 5 32 125 +4 1 3 6 33 124 +4 1 3 7 32 124 +4 1 3 8 33 123 +4 1 3 9 32 123 +4 1 3 10 33 122 +4 1 3 11 -1 -1 +4 1 3 12 32 122 +4 1 3 13 33 121 +4 1 3 14 32 121 +4 1 3 15 33 120 +4 1 3 16 32 120 +4 1 3 17 33 119 +4 1 3 18 32 119 +4 1 3 19 33 118 +4 1 3 20 32 118 +4 1 3 21 33 117 +4 1 3 22 -1 -1 +4 1 3 23 32 117 +4 1 3 24 33 116 +4 1 3 25 32 116 +4 1 3 26 33 115 +4 1 3 27 32 115 +4 1 3 28 33 114 +4 1 3 29 32 114 +4 1 3 30 33 113 +4 1 3 31 32 113 +4 1 3 32 33 112 +4 1 3 33 32 112 +4 1 3 34 33 111 +4 1 3 35 32 111 +4 1 3 36 33 110 +4 1 3 37 32 110 +4 1 3 38 33 109 +4 1 3 39 32 109 +4 1 3 40 33 108 +4 1 3 41 32 108 +4 1 3 42 33 107 +4 1 3 43 32 107 +4 1 3 44 33 106 +4 1 3 45 -1 -1 +4 1 3 46 32 106 +4 1 3 47 33 105 +4 1 3 48 32 105 +4 1 3 49 33 104 +4 1 3 50 32 104 +4 1 3 51 33 103 +4 1 3 52 32 103 +4 1 3 53 33 102 +4 1 3 54 32 102 +4 1 3 55 33 101 +4 1 3 56 -1 -1 +4 1 3 57 32 101 +4 1 3 58 33 100 +4 1 3 59 32 100 +4 1 3 60 33 99 +4 1 3 61 32 99 +4 1 3 62 33 98 +4 1 3 63 32 98 +4 1 3 64 33 97 +4 1 3 65 32 97 +4 1 3 66 33 96 +4 1 3 67 32 96 +4 2 0 0 36 32 +4 2 0 1 37 32 +4 2 0 2 36 33 +4 2 0 3 37 33 +4 2 0 4 36 34 +4 2 0 5 37 34 +4 2 0 6 36 35 +4 2 0 7 37 35 +4 2 0 8 36 36 +4 2 0 9 37 36 +4 2 0 10 36 37 +4 2 0 11 -1 -1 +4 2 0 12 37 37 +4 2 0 13 36 38 +4 2 0 14 37 38 +4 2 0 15 36 39 +4 2 0 16 37 39 +4 2 0 17 36 40 +4 2 0 18 37 40 +4 2 0 19 36 41 +4 2 0 20 37 41 +4 2 0 21 36 42 +4 2 0 22 -1 -1 +4 2 0 23 37 42 +4 2 0 24 36 43 +4 2 0 25 37 43 +4 2 0 26 36 44 +4 2 0 27 37 44 +4 2 0 28 36 45 +4 2 0 29 37 45 +4 2 0 30 36 46 +4 2 0 31 37 46 +4 2 0 32 36 47 +4 2 0 33 37 47 +4 2 0 34 36 48 +4 2 0 35 37 48 +4 2 0 36 36 49 +4 2 0 37 37 49 +4 2 0 38 36 50 +4 2 0 39 37 50 +4 2 0 40 36 51 +4 2 0 41 37 51 +4 2 0 42 36 52 +4 2 0 43 37 52 +4 2 0 44 36 53 +4 2 0 45 -1 -1 +4 2 0 46 37 53 +4 2 0 47 36 54 +4 2 0 48 37 54 +4 2 0 49 36 55 +4 2 0 50 37 55 +4 2 0 51 36 56 +4 2 0 52 37 56 +4 2 0 53 36 57 +4 2 0 54 37 57 +4 2 0 55 36 58 +4 2 0 56 -1 -1 +4 2 0 57 37 58 +4 2 0 58 36 59 +4 2 0 59 37 59 +4 2 0 60 36 60 +4 2 0 61 37 60 +4 2 0 62 36 61 +4 2 0 63 37 61 +4 2 0 64 36 62 +4 2 0 65 37 62 +4 2 0 66 36 63 +4 2 0 67 37 63 +4 2 1 0 36 0 +4 2 1 1 37 0 +4 2 1 2 36 1 +4 2 1 3 37 1 +4 2 1 4 36 2 +4 2 1 5 37 2 +4 2 1 6 36 3 +4 2 1 7 37 3 +4 2 1 8 36 4 +4 2 1 9 37 4 +4 2 1 10 36 5 +4 2 1 11 -1 -1 +4 2 1 12 37 5 +4 2 1 13 36 6 +4 2 1 14 37 6 +4 2 1 15 36 7 +4 2 1 16 37 7 +4 2 1 17 36 8 +4 2 1 18 37 8 +4 2 1 19 36 9 +4 2 1 20 37 9 +4 2 1 21 36 10 +4 2 1 22 -1 -1 +4 2 1 23 37 10 +4 2 1 24 36 11 +4 2 1 25 37 11 +4 2 1 26 36 12 +4 2 1 27 37 12 +4 2 1 28 36 13 +4 2 1 29 37 13 +4 2 1 30 36 14 +4 2 1 31 37 14 +4 2 1 32 36 15 +4 2 1 33 37 15 +4 2 1 34 36 16 +4 2 1 35 37 16 +4 2 1 36 36 17 +4 2 1 37 37 17 +4 2 1 38 36 18 +4 2 1 39 37 18 +4 2 1 40 36 19 +4 2 1 41 37 19 +4 2 1 42 36 20 +4 2 1 43 37 20 +4 2 1 44 36 21 +4 2 1 45 -1 -1 +4 2 1 46 37 21 +4 2 1 47 36 22 +4 2 1 48 37 22 +4 2 1 49 36 23 +4 2 1 50 37 23 +4 2 1 51 36 24 +4 2 1 52 37 24 +4 2 1 53 36 25 +4 2 1 54 37 25 +4 2 1 55 36 26 +4 2 1 56 -1 -1 +4 2 1 57 37 26 +4 2 1 58 36 27 +4 2 1 59 37 27 +4 2 1 60 36 28 +4 2 1 61 37 28 +4 2 1 62 36 29 +4 2 1 63 37 29 +4 2 1 64 36 30 +4 2 1 65 37 30 +4 2 1 66 36 31 +4 2 1 67 37 31 +4 2 2 0 38 32 +4 2 2 1 39 32 +4 2 2 2 38 33 +4 2 2 3 39 33 +4 2 2 4 38 34 +4 2 2 5 39 34 +4 2 2 6 38 35 +4 2 2 7 39 35 +4 2 2 8 38 36 +4 2 2 9 39 36 +4 2 2 10 38 37 +4 2 2 11 -1 -1 +4 2 2 12 39 37 +4 2 2 13 38 38 +4 2 2 14 39 38 +4 2 2 15 38 39 +4 2 2 16 39 39 +4 2 2 17 38 40 +4 2 2 18 39 40 +4 2 2 19 38 41 +4 2 2 20 39 41 +4 2 2 21 38 42 +4 2 2 22 -1 -1 +4 2 2 23 39 42 +4 2 2 24 38 43 +4 2 2 25 39 43 +4 2 2 26 38 44 +4 2 2 27 39 44 +4 2 2 28 38 45 +4 2 2 29 39 45 +4 2 2 30 38 46 +4 2 2 31 39 46 +4 2 2 32 38 47 +4 2 2 33 39 47 +4 2 2 34 38 48 +4 2 2 35 39 48 +4 2 2 36 38 49 +4 2 2 37 39 49 +4 2 2 38 38 50 +4 2 2 39 39 50 +4 2 2 40 38 51 +4 2 2 41 39 51 +4 2 2 42 38 52 +4 2 2 43 39 52 +4 2 2 44 38 53 +4 2 2 45 -1 -1 +4 2 2 46 39 53 +4 2 2 47 38 54 +4 2 2 48 39 54 +4 2 2 49 38 55 +4 2 2 50 39 55 +4 2 2 51 38 56 +4 2 2 52 39 56 +4 2 2 53 38 57 +4 2 2 54 39 57 +4 2 2 55 38 58 +4 2 2 56 -1 -1 +4 2 2 57 39 58 +4 2 2 58 38 59 +4 2 2 59 39 59 +4 2 2 60 38 60 +4 2 2 61 39 60 +4 2 2 62 38 61 +4 2 2 63 39 61 +4 2 2 64 38 62 +4 2 2 65 39 62 +4 2 2 66 38 63 +4 2 2 67 39 63 +4 2 3 0 38 0 +4 2 3 1 39 0 +4 2 3 2 38 1 +4 2 3 3 39 1 +4 2 3 4 38 2 +4 2 3 5 39 2 +4 2 3 6 38 3 +4 2 3 7 39 3 +4 2 3 8 38 4 +4 2 3 9 39 4 +4 2 3 10 38 5 +4 2 3 11 -1 -1 +4 2 3 12 39 5 +4 2 3 13 38 6 +4 2 3 14 39 6 +4 2 3 15 38 7 +4 2 3 16 39 7 +4 2 3 17 38 8 +4 2 3 18 39 8 +4 2 3 19 38 9 +4 2 3 20 39 9 +4 2 3 21 38 10 +4 2 3 22 -1 -1 +4 2 3 23 39 10 +4 2 3 24 38 11 +4 2 3 25 39 11 +4 2 3 26 38 12 +4 2 3 27 39 12 +4 2 3 28 38 13 +4 2 3 29 39 13 +4 2 3 30 38 14 +4 2 3 31 39 14 +4 2 3 32 38 15 +4 2 3 33 39 15 +4 2 3 34 38 16 +4 2 3 35 39 16 +4 2 3 36 38 17 +4 2 3 37 39 17 +4 2 3 38 38 18 +4 2 3 39 39 18 +4 2 3 40 38 19 +4 2 3 41 39 19 +4 2 3 42 38 20 +4 2 3 43 39 20 +4 2 3 44 38 21 +4 2 3 45 -1 -1 +4 2 3 46 39 21 +4 2 3 47 38 22 +4 2 3 48 39 22 +4 2 3 49 38 23 +4 2 3 50 39 23 +4 2 3 51 38 24 +4 2 3 52 39 24 +4 2 3 53 38 25 +4 2 3 54 39 25 +4 2 3 55 38 26 +4 2 3 56 -1 -1 +4 2 3 57 39 26 +4 2 3 58 38 27 +4 2 3 59 39 27 +4 2 3 60 38 28 +4 2 3 61 39 28 +4 2 3 62 38 29 +4 2 3 63 39 29 +4 2 3 64 38 30 +4 2 3 65 39 30 +4 2 3 66 38 31 +4 2 3 67 39 31 +4 3 0 0 39 95 +4 3 0 1 38 95 +4 3 0 2 39 94 +4 3 0 3 38 94 +4 3 0 4 39 93 +4 3 0 5 38 93 +4 3 0 6 39 92 +4 3 0 7 38 92 +4 3 0 8 39 91 +4 3 0 9 38 91 +4 3 0 10 39 90 +4 3 0 11 -1 -1 +4 3 0 12 38 90 +4 3 0 13 39 89 +4 3 0 14 38 89 +4 3 0 15 39 88 +4 3 0 16 38 88 +4 3 0 17 39 87 +4 3 0 18 38 87 +4 3 0 19 39 86 +4 3 0 20 38 86 +4 3 0 21 39 85 +4 3 0 22 -1 -1 +4 3 0 23 38 85 +4 3 0 24 39 84 +4 3 0 25 38 84 +4 3 0 26 39 83 +4 3 0 27 38 83 +4 3 0 28 39 82 +4 3 0 29 38 82 +4 3 0 30 39 81 +4 3 0 31 38 81 +4 3 0 32 39 80 +4 3 0 33 38 80 +4 3 0 34 39 79 +4 3 0 35 38 79 +4 3 0 36 39 78 +4 3 0 37 38 78 +4 3 0 38 39 77 +4 3 0 39 38 77 +4 3 0 40 39 76 +4 3 0 41 38 76 +4 3 0 42 39 75 +4 3 0 43 38 75 +4 3 0 44 39 74 +4 3 0 45 -1 -1 +4 3 0 46 38 74 +4 3 0 47 39 73 +4 3 0 48 38 73 +4 3 0 49 39 72 +4 3 0 50 38 72 +4 3 0 51 39 71 +4 3 0 52 38 71 +4 3 0 53 39 70 +4 3 0 54 38 70 +4 3 0 55 39 69 +4 3 0 56 -1 -1 +4 3 0 57 38 69 +4 3 0 58 39 68 +4 3 0 59 38 68 +4 3 0 60 39 67 +4 3 0 61 38 67 +4 3 0 62 39 66 +4 3 0 63 38 66 +4 3 0 64 39 65 +4 3 0 65 38 65 +4 3 0 66 39 64 +4 3 0 67 38 64 +4 3 1 0 39 127 +4 3 1 1 38 127 +4 3 1 2 39 126 +4 3 1 3 38 126 +4 3 1 4 39 125 +4 3 1 5 38 125 +4 3 1 6 39 124 +4 3 1 7 38 124 +4 3 1 8 39 123 +4 3 1 9 38 123 +4 3 1 10 39 122 +4 3 1 11 -1 -1 +4 3 1 12 38 122 +4 3 1 13 39 121 +4 3 1 14 38 121 +4 3 1 15 39 120 +4 3 1 16 38 120 +4 3 1 17 39 119 +4 3 1 18 38 119 +4 3 1 19 39 118 +4 3 1 20 38 118 +4 3 1 21 39 117 +4 3 1 22 -1 -1 +4 3 1 23 38 117 +4 3 1 24 39 116 +4 3 1 25 38 116 +4 3 1 26 39 115 +4 3 1 27 38 115 +4 3 1 28 39 114 +4 3 1 29 38 114 +4 3 1 30 39 113 +4 3 1 31 38 113 +4 3 1 32 39 112 +4 3 1 33 38 112 +4 3 1 34 39 111 +4 3 1 35 38 111 +4 3 1 36 39 110 +4 3 1 37 38 110 +4 3 1 38 39 109 +4 3 1 39 38 109 +4 3 1 40 39 108 +4 3 1 41 38 108 +4 3 1 42 39 107 +4 3 1 43 38 107 +4 3 1 44 39 106 +4 3 1 45 -1 -1 +4 3 1 46 38 106 +4 3 1 47 39 105 +4 3 1 48 38 105 +4 3 1 49 39 104 +4 3 1 50 38 104 +4 3 1 51 39 103 +4 3 1 52 38 103 +4 3 1 53 39 102 +4 3 1 54 38 102 +4 3 1 55 39 101 +4 3 1 56 -1 -1 +4 3 1 57 38 101 +4 3 1 58 39 100 +4 3 1 59 38 100 +4 3 1 60 39 99 +4 3 1 61 38 99 +4 3 1 62 39 98 +4 3 1 63 38 98 +4 3 1 64 39 97 +4 3 1 65 38 97 +4 3 1 66 39 96 +4 3 1 67 38 96 +4 3 2 0 37 95 +4 3 2 1 36 95 +4 3 2 2 37 94 +4 3 2 3 36 94 +4 3 2 4 37 93 +4 3 2 5 36 93 +4 3 2 6 37 92 +4 3 2 7 36 92 +4 3 2 8 37 91 +4 3 2 9 36 91 +4 3 2 10 37 90 +4 3 2 11 -1 -1 +4 3 2 12 36 90 +4 3 2 13 37 89 +4 3 2 14 36 89 +4 3 2 15 37 88 +4 3 2 16 36 88 +4 3 2 17 37 87 +4 3 2 18 36 87 +4 3 2 19 37 86 +4 3 2 20 36 86 +4 3 2 21 37 85 +4 3 2 22 -1 -1 +4 3 2 23 36 85 +4 3 2 24 37 84 +4 3 2 25 36 84 +4 3 2 26 37 83 +4 3 2 27 36 83 +4 3 2 28 37 82 +4 3 2 29 36 82 +4 3 2 30 37 81 +4 3 2 31 36 81 +4 3 2 32 37 80 +4 3 2 33 36 80 +4 3 2 34 37 79 +4 3 2 35 36 79 +4 3 2 36 37 78 +4 3 2 37 36 78 +4 3 2 38 37 77 +4 3 2 39 36 77 +4 3 2 40 37 76 +4 3 2 41 36 76 +4 3 2 42 37 75 +4 3 2 43 36 75 +4 3 2 44 37 74 +4 3 2 45 -1 -1 +4 3 2 46 36 74 +4 3 2 47 37 73 +4 3 2 48 36 73 +4 3 2 49 37 72 +4 3 2 50 36 72 +4 3 2 51 37 71 +4 3 2 52 36 71 +4 3 2 53 37 70 +4 3 2 54 36 70 +4 3 2 55 37 69 +4 3 2 56 -1 -1 +4 3 2 57 36 69 +4 3 2 58 37 68 +4 3 2 59 36 68 +4 3 2 60 37 67 +4 3 2 61 36 67 +4 3 2 62 37 66 +4 3 2 63 36 66 +4 3 2 64 37 65 +4 3 2 65 36 65 +4 3 2 66 37 64 +4 3 2 67 36 64 +4 3 3 0 37 127 +4 3 3 1 36 127 +4 3 3 2 37 126 +4 3 3 3 36 126 +4 3 3 4 37 125 +4 3 3 5 36 125 +4 3 3 6 37 124 +4 3 3 7 36 124 +4 3 3 8 37 123 +4 3 3 9 36 123 +4 3 3 10 37 122 +4 3 3 11 -1 -1 +4 3 3 12 36 122 +4 3 3 13 37 121 +4 3 3 14 36 121 +4 3 3 15 37 120 +4 3 3 16 36 120 +4 3 3 17 37 119 +4 3 3 18 36 119 +4 3 3 19 37 118 +4 3 3 20 36 118 +4 3 3 21 37 117 +4 3 3 22 -1 -1 +4 3 3 23 36 117 +4 3 3 24 37 116 +4 3 3 25 36 116 +4 3 3 26 37 115 +4 3 3 27 36 115 +4 3 3 28 37 114 +4 3 3 29 36 114 +4 3 3 30 37 113 +4 3 3 31 36 113 +4 3 3 32 37 112 +4 3 3 33 36 112 +4 3 3 34 37 111 +4 3 3 35 36 111 +4 3 3 36 37 110 +4 3 3 37 36 110 +4 3 3 38 37 109 +4 3 3 39 36 109 +4 3 3 40 37 108 +4 3 3 41 36 108 +4 3 3 42 37 107 +4 3 3 43 36 107 +4 3 3 44 37 106 +4 3 3 45 -1 -1 +4 3 3 46 36 106 +4 3 3 47 37 105 +4 3 3 48 36 105 +4 3 3 49 37 104 +4 3 3 50 36 104 +4 3 3 51 37 103 +4 3 3 52 36 103 +4 3 3 53 37 102 +4 3 3 54 36 102 +4 3 3 55 37 101 +4 3 3 56 -1 -1 +4 3 3 57 36 101 +4 3 3 58 37 100 +4 3 3 59 36 100 +4 3 3 60 37 99 +4 3 3 61 36 99 +4 3 3 62 37 98 +4 3 3 63 36 98 +4 3 3 64 37 97 +4 3 3 65 36 97 +4 3 3 66 37 96 +4 3 3 67 36 96 +5 0 0 0 40 32 +5 0 0 1 41 32 +5 0 0 2 40 33 +5 0 0 3 41 33 +5 0 0 4 40 34 +5 0 0 5 41 34 +5 0 0 6 40 35 +5 0 0 7 41 35 +5 0 0 8 40 36 +5 0 0 9 41 36 +5 0 0 10 40 37 +5 0 0 11 -1 -1 +5 0 0 12 41 37 +5 0 0 13 40 38 +5 0 0 14 41 38 +5 0 0 15 40 39 +5 0 0 16 41 39 +5 0 0 17 40 40 +5 0 0 18 41 40 +5 0 0 19 40 41 +5 0 0 20 41 41 +5 0 0 21 40 42 +5 0 0 22 -1 -1 +5 0 0 23 41 42 +5 0 0 24 40 43 +5 0 0 25 41 43 +5 0 0 26 40 44 +5 0 0 27 41 44 +5 0 0 28 40 45 +5 0 0 29 41 45 +5 0 0 30 40 46 +5 0 0 31 41 46 +5 0 0 32 40 47 +5 0 0 33 41 47 +5 0 0 34 40 48 +5 0 0 35 41 48 +5 0 0 36 40 49 +5 0 0 37 41 49 +5 0 0 38 40 50 +5 0 0 39 41 50 +5 0 0 40 40 51 +5 0 0 41 41 51 +5 0 0 42 40 52 +5 0 0 43 41 52 +5 0 0 44 40 53 +5 0 0 45 -1 -1 +5 0 0 46 41 53 +5 0 0 47 40 54 +5 0 0 48 41 54 +5 0 0 49 40 55 +5 0 0 50 41 55 +5 0 0 51 40 56 +5 0 0 52 41 56 +5 0 0 53 40 57 +5 0 0 54 41 57 +5 0 0 55 40 58 +5 0 0 56 -1 -1 +5 0 0 57 41 58 +5 0 0 58 40 59 +5 0 0 59 41 59 +5 0 0 60 40 60 +5 0 0 61 41 60 +5 0 0 62 40 61 +5 0 0 63 41 61 +5 0 0 64 40 62 +5 0 0 65 41 62 +5 0 0 66 40 63 +5 0 0 67 41 63 +5 0 1 0 40 0 +5 0 1 1 41 0 +5 0 1 2 40 1 +5 0 1 3 41 1 +5 0 1 4 40 2 +5 0 1 5 41 2 +5 0 1 6 40 3 +5 0 1 7 41 3 +5 0 1 8 40 4 +5 0 1 9 41 4 +5 0 1 10 40 5 +5 0 1 11 -1 -1 +5 0 1 12 41 5 +5 0 1 13 40 6 +5 0 1 14 41 6 +5 0 1 15 40 7 +5 0 1 16 41 7 +5 0 1 17 40 8 +5 0 1 18 41 8 +5 0 1 19 40 9 +5 0 1 20 41 9 +5 0 1 21 40 10 +5 0 1 22 -1 -1 +5 0 1 23 41 10 +5 0 1 24 40 11 +5 0 1 25 41 11 +5 0 1 26 40 12 +5 0 1 27 41 12 +5 0 1 28 40 13 +5 0 1 29 41 13 +5 0 1 30 40 14 +5 0 1 31 41 14 +5 0 1 32 40 15 +5 0 1 33 41 15 +5 0 1 34 40 16 +5 0 1 35 41 16 +5 0 1 36 40 17 +5 0 1 37 41 17 +5 0 1 38 40 18 +5 0 1 39 41 18 +5 0 1 40 40 19 +5 0 1 41 41 19 +5 0 1 42 40 20 +5 0 1 43 41 20 +5 0 1 44 40 21 +5 0 1 45 -1 -1 +5 0 1 46 41 21 +5 0 1 47 40 22 +5 0 1 48 41 22 +5 0 1 49 40 23 +5 0 1 50 41 23 +5 0 1 51 40 24 +5 0 1 52 41 24 +5 0 1 53 40 25 +5 0 1 54 41 25 +5 0 1 55 40 26 +5 0 1 56 -1 -1 +5 0 1 57 41 26 +5 0 1 58 40 27 +5 0 1 59 41 27 +5 0 1 60 40 28 +5 0 1 61 41 28 +5 0 1 62 40 29 +5 0 1 63 41 29 +5 0 1 64 40 30 +5 0 1 65 41 30 +5 0 1 66 40 31 +5 0 1 67 41 31 +5 0 2 0 42 32 +5 0 2 1 43 32 +5 0 2 2 42 33 +5 0 2 3 43 33 +5 0 2 4 42 34 +5 0 2 5 43 34 +5 0 2 6 42 35 +5 0 2 7 43 35 +5 0 2 8 42 36 +5 0 2 9 43 36 +5 0 2 10 42 37 +5 0 2 11 -1 -1 +5 0 2 12 43 37 +5 0 2 13 42 38 +5 0 2 14 43 38 +5 0 2 15 42 39 +5 0 2 16 43 39 +5 0 2 17 42 40 +5 0 2 18 43 40 +5 0 2 19 42 41 +5 0 2 20 43 41 +5 0 2 21 42 42 +5 0 2 22 -1 -1 +5 0 2 23 43 42 +5 0 2 24 42 43 +5 0 2 25 43 43 +5 0 2 26 42 44 +5 0 2 27 43 44 +5 0 2 28 42 45 +5 0 2 29 43 45 +5 0 2 30 42 46 +5 0 2 31 43 46 +5 0 2 32 42 47 +5 0 2 33 43 47 +5 0 2 34 42 48 +5 0 2 35 43 48 +5 0 2 36 42 49 +5 0 2 37 43 49 +5 0 2 38 42 50 +5 0 2 39 43 50 +5 0 2 40 42 51 +5 0 2 41 43 51 +5 0 2 42 42 52 +5 0 2 43 43 52 +5 0 2 44 42 53 +5 0 2 45 -1 -1 +5 0 2 46 43 53 +5 0 2 47 42 54 +5 0 2 48 43 54 +5 0 2 49 42 55 +5 0 2 50 43 55 +5 0 2 51 42 56 +5 0 2 52 43 56 +5 0 2 53 42 57 +5 0 2 54 43 57 +5 0 2 55 42 58 +5 0 2 56 -1 -1 +5 0 2 57 43 58 +5 0 2 58 42 59 +5 0 2 59 43 59 +5 0 2 60 42 60 +5 0 2 61 43 60 +5 0 2 62 42 61 +5 0 2 63 43 61 +5 0 2 64 42 62 +5 0 2 65 43 62 +5 0 2 66 42 63 +5 0 2 67 43 63 +5 0 3 0 42 0 +5 0 3 1 43 0 +5 0 3 2 42 1 +5 0 3 3 43 1 +5 0 3 4 42 2 +5 0 3 5 43 2 +5 0 3 6 42 3 +5 0 3 7 43 3 +5 0 3 8 42 4 +5 0 3 9 43 4 +5 0 3 10 42 5 +5 0 3 11 -1 -1 +5 0 3 12 43 5 +5 0 3 13 42 6 +5 0 3 14 43 6 +5 0 3 15 42 7 +5 0 3 16 43 7 +5 0 3 17 42 8 +5 0 3 18 43 8 +5 0 3 19 42 9 +5 0 3 20 43 9 +5 0 3 21 42 10 +5 0 3 22 -1 -1 +5 0 3 23 43 10 +5 0 3 24 42 11 +5 0 3 25 43 11 +5 0 3 26 42 12 +5 0 3 27 43 12 +5 0 3 28 42 13 +5 0 3 29 43 13 +5 0 3 30 42 14 +5 0 3 31 43 14 +5 0 3 32 42 15 +5 0 3 33 43 15 +5 0 3 34 42 16 +5 0 3 35 43 16 +5 0 3 36 42 17 +5 0 3 37 43 17 +5 0 3 38 42 18 +5 0 3 39 43 18 +5 0 3 40 42 19 +5 0 3 41 43 19 +5 0 3 42 42 20 +5 0 3 43 43 20 +5 0 3 44 42 21 +5 0 3 45 -1 -1 +5 0 3 46 43 21 +5 0 3 47 42 22 +5 0 3 48 43 22 +5 0 3 49 42 23 +5 0 3 50 43 23 +5 0 3 51 42 24 +5 0 3 52 43 24 +5 0 3 53 42 25 +5 0 3 54 43 25 +5 0 3 55 42 26 +5 0 3 56 -1 -1 +5 0 3 57 43 26 +5 0 3 58 42 27 +5 0 3 59 43 27 +5 0 3 60 42 28 +5 0 3 61 43 28 +5 0 3 62 42 29 +5 0 3 63 43 29 +5 0 3 64 42 30 +5 0 3 65 43 30 +5 0 3 66 42 31 +5 0 3 67 43 31 +5 1 0 0 43 95 +5 1 0 1 42 95 +5 1 0 2 43 94 +5 1 0 3 42 94 +5 1 0 4 43 93 +5 1 0 5 42 93 +5 1 0 6 43 92 +5 1 0 7 42 92 +5 1 0 8 43 91 +5 1 0 9 42 91 +5 1 0 10 43 90 +5 1 0 11 -1 -1 +5 1 0 12 42 90 +5 1 0 13 43 89 +5 1 0 14 42 89 +5 1 0 15 43 88 +5 1 0 16 42 88 +5 1 0 17 43 87 +5 1 0 18 42 87 +5 1 0 19 43 86 +5 1 0 20 42 86 +5 1 0 21 43 85 +5 1 0 22 -1 -1 +5 1 0 23 42 85 +5 1 0 24 43 84 +5 1 0 25 42 84 +5 1 0 26 43 83 +5 1 0 27 42 83 +5 1 0 28 43 82 +5 1 0 29 42 82 +5 1 0 30 43 81 +5 1 0 31 42 81 +5 1 0 32 43 80 +5 1 0 33 42 80 +5 1 0 34 43 79 +5 1 0 35 42 79 +5 1 0 36 43 78 +5 1 0 37 42 78 +5 1 0 38 43 77 +5 1 0 39 42 77 +5 1 0 40 43 76 +5 1 0 41 42 76 +5 1 0 42 43 75 +5 1 0 43 42 75 +5 1 0 44 43 74 +5 1 0 45 -1 -1 +5 1 0 46 42 74 +5 1 0 47 43 73 +5 1 0 48 42 73 +5 1 0 49 43 72 +5 1 0 50 42 72 +5 1 0 51 43 71 +5 1 0 52 42 71 +5 1 0 53 43 70 +5 1 0 54 42 70 +5 1 0 55 43 69 +5 1 0 56 -1 -1 +5 1 0 57 42 69 +5 1 0 58 43 68 +5 1 0 59 42 68 +5 1 0 60 43 67 +5 1 0 61 42 67 +5 1 0 62 43 66 +5 1 0 63 42 66 +5 1 0 64 43 65 +5 1 0 65 42 65 +5 1 0 66 43 64 +5 1 0 67 42 64 +5 1 1 0 43 127 +5 1 1 1 42 127 +5 1 1 2 43 126 +5 1 1 3 42 126 +5 1 1 4 43 125 +5 1 1 5 42 125 +5 1 1 6 43 124 +5 1 1 7 42 124 +5 1 1 8 43 123 +5 1 1 9 42 123 +5 1 1 10 43 122 +5 1 1 11 -1 -1 +5 1 1 12 42 122 +5 1 1 13 43 121 +5 1 1 14 42 121 +5 1 1 15 43 120 +5 1 1 16 42 120 +5 1 1 17 43 119 +5 1 1 18 42 119 +5 1 1 19 43 118 +5 1 1 20 42 118 +5 1 1 21 43 117 +5 1 1 22 -1 -1 +5 1 1 23 42 117 +5 1 1 24 43 116 +5 1 1 25 42 116 +5 1 1 26 43 115 +5 1 1 27 42 115 +5 1 1 28 43 114 +5 1 1 29 42 114 +5 1 1 30 43 113 +5 1 1 31 42 113 +5 1 1 32 43 112 +5 1 1 33 42 112 +5 1 1 34 43 111 +5 1 1 35 42 111 +5 1 1 36 43 110 +5 1 1 37 42 110 +5 1 1 38 43 109 +5 1 1 39 42 109 +5 1 1 40 43 108 +5 1 1 41 42 108 +5 1 1 42 43 107 +5 1 1 43 42 107 +5 1 1 44 43 106 +5 1 1 45 -1 -1 +5 1 1 46 42 106 +5 1 1 47 43 105 +5 1 1 48 42 105 +5 1 1 49 43 104 +5 1 1 50 42 104 +5 1 1 51 43 103 +5 1 1 52 42 103 +5 1 1 53 43 102 +5 1 1 54 42 102 +5 1 1 55 43 101 +5 1 1 56 -1 -1 +5 1 1 57 42 101 +5 1 1 58 43 100 +5 1 1 59 42 100 +5 1 1 60 43 99 +5 1 1 61 42 99 +5 1 1 62 43 98 +5 1 1 63 42 98 +5 1 1 64 43 97 +5 1 1 65 42 97 +5 1 1 66 43 96 +5 1 1 67 42 96 +5 1 2 0 41 95 +5 1 2 1 40 95 +5 1 2 2 41 94 +5 1 2 3 40 94 +5 1 2 4 41 93 +5 1 2 5 40 93 +5 1 2 6 41 92 +5 1 2 7 40 92 +5 1 2 8 41 91 +5 1 2 9 40 91 +5 1 2 10 41 90 +5 1 2 11 -1 -1 +5 1 2 12 40 90 +5 1 2 13 41 89 +5 1 2 14 40 89 +5 1 2 15 41 88 +5 1 2 16 40 88 +5 1 2 17 41 87 +5 1 2 18 40 87 +5 1 2 19 41 86 +5 1 2 20 40 86 +5 1 2 21 41 85 +5 1 2 22 -1 -1 +5 1 2 23 40 85 +5 1 2 24 41 84 +5 1 2 25 40 84 +5 1 2 26 41 83 +5 1 2 27 40 83 +5 1 2 28 41 82 +5 1 2 29 40 82 +5 1 2 30 41 81 +5 1 2 31 40 81 +5 1 2 32 41 80 +5 1 2 33 40 80 +5 1 2 34 41 79 +5 1 2 35 40 79 +5 1 2 36 41 78 +5 1 2 37 40 78 +5 1 2 38 41 77 +5 1 2 39 40 77 +5 1 2 40 41 76 +5 1 2 41 40 76 +5 1 2 42 41 75 +5 1 2 43 40 75 +5 1 2 44 41 74 +5 1 2 45 -1 -1 +5 1 2 46 40 74 +5 1 2 47 41 73 +5 1 2 48 40 73 +5 1 2 49 41 72 +5 1 2 50 40 72 +5 1 2 51 41 71 +5 1 2 52 40 71 +5 1 2 53 41 70 +5 1 2 54 40 70 +5 1 2 55 41 69 +5 1 2 56 -1 -1 +5 1 2 57 40 69 +5 1 2 58 41 68 +5 1 2 59 40 68 +5 1 2 60 41 67 +5 1 2 61 40 67 +5 1 2 62 41 66 +5 1 2 63 40 66 +5 1 2 64 41 65 +5 1 2 65 40 65 +5 1 2 66 41 64 +5 1 2 67 40 64 +5 1 3 0 41 127 +5 1 3 1 40 127 +5 1 3 2 41 126 +5 1 3 3 40 126 +5 1 3 4 41 125 +5 1 3 5 40 125 +5 1 3 6 41 124 +5 1 3 7 40 124 +5 1 3 8 41 123 +5 1 3 9 40 123 +5 1 3 10 41 122 +5 1 3 11 -1 -1 +5 1 3 12 40 122 +5 1 3 13 41 121 +5 1 3 14 40 121 +5 1 3 15 41 120 +5 1 3 16 40 120 +5 1 3 17 41 119 +5 1 3 18 40 119 +5 1 3 19 41 118 +5 1 3 20 40 118 +5 1 3 21 41 117 +5 1 3 22 -1 -1 +5 1 3 23 40 117 +5 1 3 24 41 116 +5 1 3 25 40 116 +5 1 3 26 41 115 +5 1 3 27 40 115 +5 1 3 28 41 114 +5 1 3 29 40 114 +5 1 3 30 41 113 +5 1 3 31 40 113 +5 1 3 32 41 112 +5 1 3 33 40 112 +5 1 3 34 41 111 +5 1 3 35 40 111 +5 1 3 36 41 110 +5 1 3 37 40 110 +5 1 3 38 41 109 +5 1 3 39 40 109 +5 1 3 40 41 108 +5 1 3 41 40 108 +5 1 3 42 41 107 +5 1 3 43 40 107 +5 1 3 44 41 106 +5 1 3 45 -1 -1 +5 1 3 46 40 106 +5 1 3 47 41 105 +5 1 3 48 40 105 +5 1 3 49 41 104 +5 1 3 50 40 104 +5 1 3 51 41 103 +5 1 3 52 40 103 +5 1 3 53 41 102 +5 1 3 54 40 102 +5 1 3 55 41 101 +5 1 3 56 -1 -1 +5 1 3 57 40 101 +5 1 3 58 41 100 +5 1 3 59 40 100 +5 1 3 60 41 99 +5 1 3 61 40 99 +5 1 3 62 41 98 +5 1 3 63 40 98 +5 1 3 64 41 97 +5 1 3 65 40 97 +5 1 3 66 41 96 +5 1 3 67 40 96 +5 2 0 0 44 32 +5 2 0 1 45 32 +5 2 0 2 44 33 +5 2 0 3 45 33 +5 2 0 4 44 34 +5 2 0 5 45 34 +5 2 0 6 44 35 +5 2 0 7 45 35 +5 2 0 8 44 36 +5 2 0 9 45 36 +5 2 0 10 44 37 +5 2 0 11 -1 -1 +5 2 0 12 45 37 +5 2 0 13 44 38 +5 2 0 14 45 38 +5 2 0 15 44 39 +5 2 0 16 45 39 +5 2 0 17 44 40 +5 2 0 18 45 40 +5 2 0 19 44 41 +5 2 0 20 45 41 +5 2 0 21 44 42 +5 2 0 22 -1 -1 +5 2 0 23 45 42 +5 2 0 24 44 43 +5 2 0 25 45 43 +5 2 0 26 44 44 +5 2 0 27 45 44 +5 2 0 28 44 45 +5 2 0 29 45 45 +5 2 0 30 44 46 +5 2 0 31 45 46 +5 2 0 32 44 47 +5 2 0 33 45 47 +5 2 0 34 44 48 +5 2 0 35 45 48 +5 2 0 36 44 49 +5 2 0 37 45 49 +5 2 0 38 44 50 +5 2 0 39 45 50 +5 2 0 40 44 51 +5 2 0 41 45 51 +5 2 0 42 44 52 +5 2 0 43 45 52 +5 2 0 44 44 53 +5 2 0 45 -1 -1 +5 2 0 46 45 53 +5 2 0 47 44 54 +5 2 0 48 45 54 +5 2 0 49 44 55 +5 2 0 50 45 55 +5 2 0 51 44 56 +5 2 0 52 45 56 +5 2 0 53 44 57 +5 2 0 54 45 57 +5 2 0 55 44 58 +5 2 0 56 -1 -1 +5 2 0 57 45 58 +5 2 0 58 44 59 +5 2 0 59 45 59 +5 2 0 60 44 60 +5 2 0 61 45 60 +5 2 0 62 44 61 +5 2 0 63 45 61 +5 2 0 64 44 62 +5 2 0 65 45 62 +5 2 0 66 44 63 +5 2 0 67 45 63 +5 2 1 0 44 0 +5 2 1 1 45 0 +5 2 1 2 44 1 +5 2 1 3 45 1 +5 2 1 4 44 2 +5 2 1 5 45 2 +5 2 1 6 44 3 +5 2 1 7 45 3 +5 2 1 8 44 4 +5 2 1 9 45 4 +5 2 1 10 44 5 +5 2 1 11 -1 -1 +5 2 1 12 45 5 +5 2 1 13 44 6 +5 2 1 14 45 6 +5 2 1 15 44 7 +5 2 1 16 45 7 +5 2 1 17 44 8 +5 2 1 18 45 8 +5 2 1 19 44 9 +5 2 1 20 45 9 +5 2 1 21 44 10 +5 2 1 22 -1 -1 +5 2 1 23 45 10 +5 2 1 24 44 11 +5 2 1 25 45 11 +5 2 1 26 44 12 +5 2 1 27 45 12 +5 2 1 28 44 13 +5 2 1 29 45 13 +5 2 1 30 44 14 +5 2 1 31 45 14 +5 2 1 32 44 15 +5 2 1 33 45 15 +5 2 1 34 44 16 +5 2 1 35 45 16 +5 2 1 36 44 17 +5 2 1 37 45 17 +5 2 1 38 44 18 +5 2 1 39 45 18 +5 2 1 40 44 19 +5 2 1 41 45 19 +5 2 1 42 44 20 +5 2 1 43 45 20 +5 2 1 44 44 21 +5 2 1 45 -1 -1 +5 2 1 46 45 21 +5 2 1 47 44 22 +5 2 1 48 45 22 +5 2 1 49 44 23 +5 2 1 50 45 23 +5 2 1 51 44 24 +5 2 1 52 45 24 +5 2 1 53 44 25 +5 2 1 54 45 25 +5 2 1 55 44 26 +5 2 1 56 -1 -1 +5 2 1 57 45 26 +5 2 1 58 44 27 +5 2 1 59 45 27 +5 2 1 60 44 28 +5 2 1 61 45 28 +5 2 1 62 44 29 +5 2 1 63 45 29 +5 2 1 64 44 30 +5 2 1 65 45 30 +5 2 1 66 44 31 +5 2 1 67 45 31 +5 2 2 0 46 32 +5 2 2 1 47 32 +5 2 2 2 46 33 +5 2 2 3 47 33 +5 2 2 4 46 34 +5 2 2 5 47 34 +5 2 2 6 46 35 +5 2 2 7 47 35 +5 2 2 8 46 36 +5 2 2 9 47 36 +5 2 2 10 46 37 +5 2 2 11 -1 -1 +5 2 2 12 47 37 +5 2 2 13 46 38 +5 2 2 14 47 38 +5 2 2 15 46 39 +5 2 2 16 47 39 +5 2 2 17 46 40 +5 2 2 18 47 40 +5 2 2 19 46 41 +5 2 2 20 47 41 +5 2 2 21 46 42 +5 2 2 22 -1 -1 +5 2 2 23 47 42 +5 2 2 24 46 43 +5 2 2 25 47 43 +5 2 2 26 46 44 +5 2 2 27 47 44 +5 2 2 28 46 45 +5 2 2 29 47 45 +5 2 2 30 46 46 +5 2 2 31 47 46 +5 2 2 32 46 47 +5 2 2 33 47 47 +5 2 2 34 46 48 +5 2 2 35 47 48 +5 2 2 36 46 49 +5 2 2 37 47 49 +5 2 2 38 46 50 +5 2 2 39 47 50 +5 2 2 40 46 51 +5 2 2 41 47 51 +5 2 2 42 46 52 +5 2 2 43 47 52 +5 2 2 44 46 53 +5 2 2 45 -1 -1 +5 2 2 46 47 53 +5 2 2 47 46 54 +5 2 2 48 47 54 +5 2 2 49 46 55 +5 2 2 50 47 55 +5 2 2 51 46 56 +5 2 2 52 47 56 +5 2 2 53 46 57 +5 2 2 54 47 57 +5 2 2 55 46 58 +5 2 2 56 -1 -1 +5 2 2 57 47 58 +5 2 2 58 46 59 +5 2 2 59 47 59 +5 2 2 60 46 60 +5 2 2 61 47 60 +5 2 2 62 46 61 +5 2 2 63 47 61 +5 2 2 64 46 62 +5 2 2 65 47 62 +5 2 2 66 46 63 +5 2 2 67 47 63 +5 2 3 0 46 0 +5 2 3 1 47 0 +5 2 3 2 46 1 +5 2 3 3 47 1 +5 2 3 4 46 2 +5 2 3 5 47 2 +5 2 3 6 46 3 +5 2 3 7 47 3 +5 2 3 8 46 4 +5 2 3 9 47 4 +5 2 3 10 46 5 +5 2 3 11 -1 -1 +5 2 3 12 47 5 +5 2 3 13 46 6 +5 2 3 14 47 6 +5 2 3 15 46 7 +5 2 3 16 47 7 +5 2 3 17 46 8 +5 2 3 18 47 8 +5 2 3 19 46 9 +5 2 3 20 47 9 +5 2 3 21 46 10 +5 2 3 22 -1 -1 +5 2 3 23 47 10 +5 2 3 24 46 11 +5 2 3 25 47 11 +5 2 3 26 46 12 +5 2 3 27 47 12 +5 2 3 28 46 13 +5 2 3 29 47 13 +5 2 3 30 46 14 +5 2 3 31 47 14 +5 2 3 32 46 15 +5 2 3 33 47 15 +5 2 3 34 46 16 +5 2 3 35 47 16 +5 2 3 36 46 17 +5 2 3 37 47 17 +5 2 3 38 46 18 +5 2 3 39 47 18 +5 2 3 40 46 19 +5 2 3 41 47 19 +5 2 3 42 46 20 +5 2 3 43 47 20 +5 2 3 44 46 21 +5 2 3 45 -1 -1 +5 2 3 46 47 21 +5 2 3 47 46 22 +5 2 3 48 47 22 +5 2 3 49 46 23 +5 2 3 50 47 23 +5 2 3 51 46 24 +5 2 3 52 47 24 +5 2 3 53 46 25 +5 2 3 54 47 25 +5 2 3 55 46 26 +5 2 3 56 -1 -1 +5 2 3 57 47 26 +5 2 3 58 46 27 +5 2 3 59 47 27 +5 2 3 60 46 28 +5 2 3 61 47 28 +5 2 3 62 46 29 +5 2 3 63 47 29 +5 2 3 64 46 30 +5 2 3 65 47 30 +5 2 3 66 46 31 +5 2 3 67 47 31 +5 3 0 0 47 95 +5 3 0 1 46 95 +5 3 0 2 47 94 +5 3 0 3 46 94 +5 3 0 4 47 93 +5 3 0 5 46 93 +5 3 0 6 47 92 +5 3 0 7 46 92 +5 3 0 8 47 91 +5 3 0 9 46 91 +5 3 0 10 47 90 +5 3 0 11 -1 -1 +5 3 0 12 46 90 +5 3 0 13 47 89 +5 3 0 14 46 89 +5 3 0 15 47 88 +5 3 0 16 46 88 +5 3 0 17 47 87 +5 3 0 18 46 87 +5 3 0 19 47 86 +5 3 0 20 46 86 +5 3 0 21 47 85 +5 3 0 22 -1 -1 +5 3 0 23 46 85 +5 3 0 24 47 84 +5 3 0 25 46 84 +5 3 0 26 47 83 +5 3 0 27 46 83 +5 3 0 28 47 82 +5 3 0 29 46 82 +5 3 0 30 47 81 +5 3 0 31 46 81 +5 3 0 32 47 80 +5 3 0 33 46 80 +5 3 0 34 47 79 +5 3 0 35 46 79 +5 3 0 36 47 78 +5 3 0 37 46 78 +5 3 0 38 47 77 +5 3 0 39 46 77 +5 3 0 40 47 76 +5 3 0 41 46 76 +5 3 0 42 47 75 +5 3 0 43 46 75 +5 3 0 44 47 74 +5 3 0 45 -1 -1 +5 3 0 46 46 74 +5 3 0 47 47 73 +5 3 0 48 46 73 +5 3 0 49 47 72 +5 3 0 50 46 72 +5 3 0 51 47 71 +5 3 0 52 46 71 +5 3 0 53 47 70 +5 3 0 54 46 70 +5 3 0 55 47 69 +5 3 0 56 -1 -1 +5 3 0 57 46 69 +5 3 0 58 47 68 +5 3 0 59 46 68 +5 3 0 60 47 67 +5 3 0 61 46 67 +5 3 0 62 47 66 +5 3 0 63 46 66 +5 3 0 64 47 65 +5 3 0 65 46 65 +5 3 0 66 47 64 +5 3 0 67 46 64 +5 3 1 0 47 127 +5 3 1 1 46 127 +5 3 1 2 47 126 +5 3 1 3 46 126 +5 3 1 4 47 125 +5 3 1 5 46 125 +5 3 1 6 47 124 +5 3 1 7 46 124 +5 3 1 8 47 123 +5 3 1 9 46 123 +5 3 1 10 47 122 +5 3 1 11 -1 -1 +5 3 1 12 46 122 +5 3 1 13 47 121 +5 3 1 14 46 121 +5 3 1 15 47 120 +5 3 1 16 46 120 +5 3 1 17 47 119 +5 3 1 18 46 119 +5 3 1 19 47 118 +5 3 1 20 46 118 +5 3 1 21 47 117 +5 3 1 22 -1 -1 +5 3 1 23 46 117 +5 3 1 24 47 116 +5 3 1 25 46 116 +5 3 1 26 47 115 +5 3 1 27 46 115 +5 3 1 28 47 114 +5 3 1 29 46 114 +5 3 1 30 47 113 +5 3 1 31 46 113 +5 3 1 32 47 112 +5 3 1 33 46 112 +5 3 1 34 47 111 +5 3 1 35 46 111 +5 3 1 36 47 110 +5 3 1 37 46 110 +5 3 1 38 47 109 +5 3 1 39 46 109 +5 3 1 40 47 108 +5 3 1 41 46 108 +5 3 1 42 47 107 +5 3 1 43 46 107 +5 3 1 44 47 106 +5 3 1 45 -1 -1 +5 3 1 46 46 106 +5 3 1 47 47 105 +5 3 1 48 46 105 +5 3 1 49 47 104 +5 3 1 50 46 104 +5 3 1 51 47 103 +5 3 1 52 46 103 +5 3 1 53 47 102 +5 3 1 54 46 102 +5 3 1 55 47 101 +5 3 1 56 -1 -1 +5 3 1 57 46 101 +5 3 1 58 47 100 +5 3 1 59 46 100 +5 3 1 60 47 99 +5 3 1 61 46 99 +5 3 1 62 47 98 +5 3 1 63 46 98 +5 3 1 64 47 97 +5 3 1 65 46 97 +5 3 1 66 47 96 +5 3 1 67 46 96 +5 3 2 0 45 95 +5 3 2 1 44 95 +5 3 2 2 45 94 +5 3 2 3 44 94 +5 3 2 4 45 93 +5 3 2 5 44 93 +5 3 2 6 45 92 +5 3 2 7 44 92 +5 3 2 8 45 91 +5 3 2 9 44 91 +5 3 2 10 45 90 +5 3 2 11 -1 -1 +5 3 2 12 44 90 +5 3 2 13 45 89 +5 3 2 14 44 89 +5 3 2 15 45 88 +5 3 2 16 44 88 +5 3 2 17 45 87 +5 3 2 18 44 87 +5 3 2 19 45 86 +5 3 2 20 44 86 +5 3 2 21 45 85 +5 3 2 22 -1 -1 +5 3 2 23 44 85 +5 3 2 24 45 84 +5 3 2 25 44 84 +5 3 2 26 45 83 +5 3 2 27 44 83 +5 3 2 28 45 82 +5 3 2 29 44 82 +5 3 2 30 45 81 +5 3 2 31 44 81 +5 3 2 32 45 80 +5 3 2 33 44 80 +5 3 2 34 45 79 +5 3 2 35 44 79 +5 3 2 36 45 78 +5 3 2 37 44 78 +5 3 2 38 45 77 +5 3 2 39 44 77 +5 3 2 40 45 76 +5 3 2 41 44 76 +5 3 2 42 45 75 +5 3 2 43 44 75 +5 3 2 44 45 74 +5 3 2 45 -1 -1 +5 3 2 46 44 74 +5 3 2 47 45 73 +5 3 2 48 44 73 +5 3 2 49 45 72 +5 3 2 50 44 72 +5 3 2 51 45 71 +5 3 2 52 44 71 +5 3 2 53 45 70 +5 3 2 54 44 70 +5 3 2 55 45 69 +5 3 2 56 -1 -1 +5 3 2 57 44 69 +5 3 2 58 45 68 +5 3 2 59 44 68 +5 3 2 60 45 67 +5 3 2 61 44 67 +5 3 2 62 45 66 +5 3 2 63 44 66 +5 3 2 64 45 65 +5 3 2 65 44 65 +5 3 2 66 45 64 +5 3 2 67 44 64 +5 3 3 0 45 127 +5 3 3 1 44 127 +5 3 3 2 45 126 +5 3 3 3 44 126 +5 3 3 4 45 125 +5 3 3 5 44 125 +5 3 3 6 45 124 +5 3 3 7 44 124 +5 3 3 8 45 123 +5 3 3 9 44 123 +5 3 3 10 45 122 +5 3 3 11 -1 -1 +5 3 3 12 44 122 +5 3 3 13 45 121 +5 3 3 14 44 121 +5 3 3 15 45 120 +5 3 3 16 44 120 +5 3 3 17 45 119 +5 3 3 18 44 119 +5 3 3 19 45 118 +5 3 3 20 44 118 +5 3 3 21 45 117 +5 3 3 22 -1 -1 +5 3 3 23 44 117 +5 3 3 24 45 116 +5 3 3 25 44 116 +5 3 3 26 45 115 +5 3 3 27 44 115 +5 3 3 28 45 114 +5 3 3 29 44 114 +5 3 3 30 45 113 +5 3 3 31 44 113 +5 3 3 32 45 112 +5 3 3 33 44 112 +5 3 3 34 45 111 +5 3 3 35 44 111 +5 3 3 36 45 110 +5 3 3 37 44 110 +5 3 3 38 45 109 +5 3 3 39 44 109 +5 3 3 40 45 108 +5 3 3 41 44 108 +5 3 3 42 45 107 +5 3 3 43 44 107 +5 3 3 44 45 106 +5 3 3 45 -1 -1 +5 3 3 46 44 106 +5 3 3 47 45 105 +5 3 3 48 44 105 +5 3 3 49 45 104 +5 3 3 50 44 104 +5 3 3 51 45 103 +5 3 3 52 44 103 +5 3 3 53 45 102 +5 3 3 54 44 102 +5 3 3 55 45 101 +5 3 3 56 -1 -1 +5 3 3 57 44 101 +5 3 3 58 45 100 +5 3 3 59 44 100 +5 3 3 60 45 99 +5 3 3 61 44 99 +5 3 3 62 45 98 +5 3 3 63 44 98 +5 3 3 64 45 97 +5 3 3 65 44 97 +5 3 3 66 45 96 +5 3 3 67 44 96 +6 0 0 0 48 32 +6 0 0 1 49 32 +6 0 0 2 48 33 +6 0 0 3 49 33 +6 0 0 4 48 34 +6 0 0 5 49 34 +6 0 0 6 48 35 +6 0 0 7 49 35 +6 0 0 8 48 36 +6 0 0 9 49 36 +6 0 0 10 48 37 +6 0 0 11 -1 -1 +6 0 0 12 49 37 +6 0 0 13 48 38 +6 0 0 14 49 38 +6 0 0 15 48 39 +6 0 0 16 49 39 +6 0 0 17 48 40 +6 0 0 18 49 40 +6 0 0 19 48 41 +6 0 0 20 49 41 +6 0 0 21 48 42 +6 0 0 22 -1 -1 +6 0 0 23 49 42 +6 0 0 24 48 43 +6 0 0 25 49 43 +6 0 0 26 48 44 +6 0 0 27 49 44 +6 0 0 28 48 45 +6 0 0 29 49 45 +6 0 0 30 48 46 +6 0 0 31 49 46 +6 0 0 32 48 47 +6 0 0 33 49 47 +6 0 0 34 48 48 +6 0 0 35 49 48 +6 0 0 36 48 49 +6 0 0 37 49 49 +6 0 0 38 48 50 +6 0 0 39 49 50 +6 0 0 40 48 51 +6 0 0 41 49 51 +6 0 0 42 48 52 +6 0 0 43 49 52 +6 0 0 44 48 53 +6 0 0 45 -1 -1 +6 0 0 46 49 53 +6 0 0 47 48 54 +6 0 0 48 49 54 +6 0 0 49 48 55 +6 0 0 50 49 55 +6 0 0 51 48 56 +6 0 0 52 49 56 +6 0 0 53 48 57 +6 0 0 54 49 57 +6 0 0 55 48 58 +6 0 0 56 -1 -1 +6 0 0 57 49 58 +6 0 0 58 48 59 +6 0 0 59 49 59 +6 0 0 60 48 60 +6 0 0 61 49 60 +6 0 0 62 48 61 +6 0 0 63 49 61 +6 0 0 64 48 62 +6 0 0 65 49 62 +6 0 0 66 48 63 +6 0 0 67 49 63 +6 0 1 0 48 0 +6 0 1 1 49 0 +6 0 1 2 48 1 +6 0 1 3 49 1 +6 0 1 4 48 2 +6 0 1 5 49 2 +6 0 1 6 48 3 +6 0 1 7 49 3 +6 0 1 8 48 4 +6 0 1 9 49 4 +6 0 1 10 48 5 +6 0 1 11 -1 -1 +6 0 1 12 49 5 +6 0 1 13 48 6 +6 0 1 14 49 6 +6 0 1 15 48 7 +6 0 1 16 49 7 +6 0 1 17 48 8 +6 0 1 18 49 8 +6 0 1 19 48 9 +6 0 1 20 49 9 +6 0 1 21 48 10 +6 0 1 22 -1 -1 +6 0 1 23 49 10 +6 0 1 24 48 11 +6 0 1 25 49 11 +6 0 1 26 48 12 +6 0 1 27 49 12 +6 0 1 28 48 13 +6 0 1 29 49 13 +6 0 1 30 48 14 +6 0 1 31 49 14 +6 0 1 32 48 15 +6 0 1 33 49 15 +6 0 1 34 48 16 +6 0 1 35 49 16 +6 0 1 36 48 17 +6 0 1 37 49 17 +6 0 1 38 48 18 +6 0 1 39 49 18 +6 0 1 40 48 19 +6 0 1 41 49 19 +6 0 1 42 48 20 +6 0 1 43 49 20 +6 0 1 44 48 21 +6 0 1 45 -1 -1 +6 0 1 46 49 21 +6 0 1 47 48 22 +6 0 1 48 49 22 +6 0 1 49 48 23 +6 0 1 50 49 23 +6 0 1 51 48 24 +6 0 1 52 49 24 +6 0 1 53 48 25 +6 0 1 54 49 25 +6 0 1 55 48 26 +6 0 1 56 -1 -1 +6 0 1 57 49 26 +6 0 1 58 48 27 +6 0 1 59 49 27 +6 0 1 60 48 28 +6 0 1 61 49 28 +6 0 1 62 48 29 +6 0 1 63 49 29 +6 0 1 64 48 30 +6 0 1 65 49 30 +6 0 1 66 48 31 +6 0 1 67 49 31 +6 0 2 0 50 32 +6 0 2 1 51 32 +6 0 2 2 50 33 +6 0 2 3 51 33 +6 0 2 4 50 34 +6 0 2 5 51 34 +6 0 2 6 50 35 +6 0 2 7 51 35 +6 0 2 8 50 36 +6 0 2 9 51 36 +6 0 2 10 50 37 +6 0 2 11 -1 -1 +6 0 2 12 51 37 +6 0 2 13 50 38 +6 0 2 14 51 38 +6 0 2 15 50 39 +6 0 2 16 51 39 +6 0 2 17 50 40 +6 0 2 18 51 40 +6 0 2 19 50 41 +6 0 2 20 51 41 +6 0 2 21 50 42 +6 0 2 22 -1 -1 +6 0 2 23 51 42 +6 0 2 24 50 43 +6 0 2 25 51 43 +6 0 2 26 50 44 +6 0 2 27 51 44 +6 0 2 28 50 45 +6 0 2 29 51 45 +6 0 2 30 50 46 +6 0 2 31 51 46 +6 0 2 32 50 47 +6 0 2 33 51 47 +6 0 2 34 50 48 +6 0 2 35 51 48 +6 0 2 36 50 49 +6 0 2 37 51 49 +6 0 2 38 50 50 +6 0 2 39 51 50 +6 0 2 40 50 51 +6 0 2 41 51 51 +6 0 2 42 50 52 +6 0 2 43 51 52 +6 0 2 44 50 53 +6 0 2 45 -1 -1 +6 0 2 46 51 53 +6 0 2 47 50 54 +6 0 2 48 51 54 +6 0 2 49 50 55 +6 0 2 50 51 55 +6 0 2 51 50 56 +6 0 2 52 51 56 +6 0 2 53 50 57 +6 0 2 54 51 57 +6 0 2 55 50 58 +6 0 2 56 -1 -1 +6 0 2 57 51 58 +6 0 2 58 50 59 +6 0 2 59 51 59 +6 0 2 60 50 60 +6 0 2 61 51 60 +6 0 2 62 50 61 +6 0 2 63 51 61 +6 0 2 64 50 62 +6 0 2 65 51 62 +6 0 2 66 50 63 +6 0 2 67 51 63 +6 0 3 0 50 0 +6 0 3 1 51 0 +6 0 3 2 50 1 +6 0 3 3 51 1 +6 0 3 4 50 2 +6 0 3 5 51 2 +6 0 3 6 50 3 +6 0 3 7 51 3 +6 0 3 8 50 4 +6 0 3 9 51 4 +6 0 3 10 50 5 +6 0 3 11 -1 -1 +6 0 3 12 51 5 +6 0 3 13 50 6 +6 0 3 14 51 6 +6 0 3 15 50 7 +6 0 3 16 51 7 +6 0 3 17 50 8 +6 0 3 18 51 8 +6 0 3 19 50 9 +6 0 3 20 51 9 +6 0 3 21 50 10 +6 0 3 22 -1 -1 +6 0 3 23 51 10 +6 0 3 24 50 11 +6 0 3 25 51 11 +6 0 3 26 50 12 +6 0 3 27 51 12 +6 0 3 28 50 13 +6 0 3 29 51 13 +6 0 3 30 50 14 +6 0 3 31 51 14 +6 0 3 32 50 15 +6 0 3 33 51 15 +6 0 3 34 50 16 +6 0 3 35 51 16 +6 0 3 36 50 17 +6 0 3 37 51 17 +6 0 3 38 50 18 +6 0 3 39 51 18 +6 0 3 40 50 19 +6 0 3 41 51 19 +6 0 3 42 50 20 +6 0 3 43 51 20 +6 0 3 44 50 21 +6 0 3 45 -1 -1 +6 0 3 46 51 21 +6 0 3 47 50 22 +6 0 3 48 51 22 +6 0 3 49 50 23 +6 0 3 50 51 23 +6 0 3 51 50 24 +6 0 3 52 51 24 +6 0 3 53 50 25 +6 0 3 54 51 25 +6 0 3 55 50 26 +6 0 3 56 -1 -1 +6 0 3 57 51 26 +6 0 3 58 50 27 +6 0 3 59 51 27 +6 0 3 60 50 28 +6 0 3 61 51 28 +6 0 3 62 50 29 +6 0 3 63 51 29 +6 0 3 64 50 30 +6 0 3 65 51 30 +6 0 3 66 50 31 +6 0 3 67 51 31 +6 1 0 0 51 95 +6 1 0 1 50 95 +6 1 0 2 51 94 +6 1 0 3 50 94 +6 1 0 4 51 93 +6 1 0 5 50 93 +6 1 0 6 51 92 +6 1 0 7 50 92 +6 1 0 8 51 91 +6 1 0 9 50 91 +6 1 0 10 51 90 +6 1 0 11 -1 -1 +6 1 0 12 50 90 +6 1 0 13 51 89 +6 1 0 14 50 89 +6 1 0 15 51 88 +6 1 0 16 50 88 +6 1 0 17 51 87 +6 1 0 18 50 87 +6 1 0 19 51 86 +6 1 0 20 50 86 +6 1 0 21 51 85 +6 1 0 22 -1 -1 +6 1 0 23 50 85 +6 1 0 24 51 84 +6 1 0 25 50 84 +6 1 0 26 51 83 +6 1 0 27 50 83 +6 1 0 28 51 82 +6 1 0 29 50 82 +6 1 0 30 51 81 +6 1 0 31 50 81 +6 1 0 32 51 80 +6 1 0 33 50 80 +6 1 0 34 51 79 +6 1 0 35 50 79 +6 1 0 36 51 78 +6 1 0 37 50 78 +6 1 0 38 51 77 +6 1 0 39 50 77 +6 1 0 40 51 76 +6 1 0 41 50 76 +6 1 0 42 51 75 +6 1 0 43 50 75 +6 1 0 44 51 74 +6 1 0 45 -1 -1 +6 1 0 46 50 74 +6 1 0 47 51 73 +6 1 0 48 50 73 +6 1 0 49 51 72 +6 1 0 50 50 72 +6 1 0 51 51 71 +6 1 0 52 50 71 +6 1 0 53 51 70 +6 1 0 54 50 70 +6 1 0 55 51 69 +6 1 0 56 -1 -1 +6 1 0 57 50 69 +6 1 0 58 51 68 +6 1 0 59 50 68 +6 1 0 60 51 67 +6 1 0 61 50 67 +6 1 0 62 51 66 +6 1 0 63 50 66 +6 1 0 64 51 65 +6 1 0 65 50 65 +6 1 0 66 51 64 +6 1 0 67 50 64 +6 1 1 0 51 127 +6 1 1 1 50 127 +6 1 1 2 51 126 +6 1 1 3 50 126 +6 1 1 4 51 125 +6 1 1 5 50 125 +6 1 1 6 51 124 +6 1 1 7 50 124 +6 1 1 8 51 123 +6 1 1 9 50 123 +6 1 1 10 51 122 +6 1 1 11 -1 -1 +6 1 1 12 50 122 +6 1 1 13 51 121 +6 1 1 14 50 121 +6 1 1 15 51 120 +6 1 1 16 50 120 +6 1 1 17 51 119 +6 1 1 18 50 119 +6 1 1 19 51 118 +6 1 1 20 50 118 +6 1 1 21 51 117 +6 1 1 22 -1 -1 +6 1 1 23 50 117 +6 1 1 24 51 116 +6 1 1 25 50 116 +6 1 1 26 51 115 +6 1 1 27 50 115 +6 1 1 28 51 114 +6 1 1 29 50 114 +6 1 1 30 51 113 +6 1 1 31 50 113 +6 1 1 32 51 112 +6 1 1 33 50 112 +6 1 1 34 51 111 +6 1 1 35 50 111 +6 1 1 36 51 110 +6 1 1 37 50 110 +6 1 1 38 51 109 +6 1 1 39 50 109 +6 1 1 40 51 108 +6 1 1 41 50 108 +6 1 1 42 51 107 +6 1 1 43 50 107 +6 1 1 44 51 106 +6 1 1 45 -1 -1 +6 1 1 46 50 106 +6 1 1 47 51 105 +6 1 1 48 50 105 +6 1 1 49 51 104 +6 1 1 50 50 104 +6 1 1 51 51 103 +6 1 1 52 50 103 +6 1 1 53 51 102 +6 1 1 54 50 102 +6 1 1 55 51 101 +6 1 1 56 -1 -1 +6 1 1 57 50 101 +6 1 1 58 51 100 +6 1 1 59 50 100 +6 1 1 60 51 99 +6 1 1 61 50 99 +6 1 1 62 51 98 +6 1 1 63 50 98 +6 1 1 64 51 97 +6 1 1 65 50 97 +6 1 1 66 51 96 +6 1 1 67 50 96 +6 1 2 0 49 95 +6 1 2 1 48 95 +6 1 2 2 49 94 +6 1 2 3 48 94 +6 1 2 4 49 93 +6 1 2 5 48 93 +6 1 2 6 49 92 +6 1 2 7 48 92 +6 1 2 8 49 91 +6 1 2 9 48 91 +6 1 2 10 49 90 +6 1 2 11 -1 -1 +6 1 2 12 48 90 +6 1 2 13 49 89 +6 1 2 14 48 89 +6 1 2 15 49 88 +6 1 2 16 48 88 +6 1 2 17 49 87 +6 1 2 18 48 87 +6 1 2 19 49 86 +6 1 2 20 48 86 +6 1 2 21 49 85 +6 1 2 22 -1 -1 +6 1 2 23 48 85 +6 1 2 24 49 84 +6 1 2 25 48 84 +6 1 2 26 49 83 +6 1 2 27 48 83 +6 1 2 28 49 82 +6 1 2 29 48 82 +6 1 2 30 49 81 +6 1 2 31 48 81 +6 1 2 32 49 80 +6 1 2 33 48 80 +6 1 2 34 49 79 +6 1 2 35 48 79 +6 1 2 36 49 78 +6 1 2 37 48 78 +6 1 2 38 49 77 +6 1 2 39 48 77 +6 1 2 40 49 76 +6 1 2 41 48 76 +6 1 2 42 49 75 +6 1 2 43 48 75 +6 1 2 44 49 74 +6 1 2 45 -1 -1 +6 1 2 46 48 74 +6 1 2 47 49 73 +6 1 2 48 48 73 +6 1 2 49 49 72 +6 1 2 50 48 72 +6 1 2 51 49 71 +6 1 2 52 48 71 +6 1 2 53 49 70 +6 1 2 54 48 70 +6 1 2 55 49 69 +6 1 2 56 -1 -1 +6 1 2 57 48 69 +6 1 2 58 49 68 +6 1 2 59 48 68 +6 1 2 60 49 67 +6 1 2 61 48 67 +6 1 2 62 49 66 +6 1 2 63 48 66 +6 1 2 64 49 65 +6 1 2 65 48 65 +6 1 2 66 49 64 +6 1 2 67 48 64 +6 1 3 0 49 127 +6 1 3 1 48 127 +6 1 3 2 49 126 +6 1 3 3 48 126 +6 1 3 4 49 125 +6 1 3 5 48 125 +6 1 3 6 49 124 +6 1 3 7 48 124 +6 1 3 8 49 123 +6 1 3 9 48 123 +6 1 3 10 49 122 +6 1 3 11 -1 -1 +6 1 3 12 48 122 +6 1 3 13 49 121 +6 1 3 14 48 121 +6 1 3 15 49 120 +6 1 3 16 48 120 +6 1 3 17 49 119 +6 1 3 18 48 119 +6 1 3 19 49 118 +6 1 3 20 48 118 +6 1 3 21 49 117 +6 1 3 22 -1 -1 +6 1 3 23 48 117 +6 1 3 24 49 116 +6 1 3 25 48 116 +6 1 3 26 49 115 +6 1 3 27 48 115 +6 1 3 28 49 114 +6 1 3 29 48 114 +6 1 3 30 49 113 +6 1 3 31 48 113 +6 1 3 32 49 112 +6 1 3 33 48 112 +6 1 3 34 49 111 +6 1 3 35 48 111 +6 1 3 36 49 110 +6 1 3 37 48 110 +6 1 3 38 49 109 +6 1 3 39 48 109 +6 1 3 40 49 108 +6 1 3 41 48 108 +6 1 3 42 49 107 +6 1 3 43 48 107 +6 1 3 44 49 106 +6 1 3 45 -1 -1 +6 1 3 46 48 106 +6 1 3 47 49 105 +6 1 3 48 48 105 +6 1 3 49 49 104 +6 1 3 50 48 104 +6 1 3 51 49 103 +6 1 3 52 48 103 +6 1 3 53 49 102 +6 1 3 54 48 102 +6 1 3 55 49 101 +6 1 3 56 -1 -1 +6 1 3 57 48 101 +6 1 3 58 49 100 +6 1 3 59 48 100 +6 1 3 60 49 99 +6 1 3 61 48 99 +6 1 3 62 49 98 +6 1 3 63 48 98 +6 1 3 64 49 97 +6 1 3 65 48 97 +6 1 3 66 49 96 +6 1 3 67 48 96 +6 2 0 0 52 32 +6 2 0 1 53 32 +6 2 0 2 52 33 +6 2 0 3 53 33 +6 2 0 4 52 34 +6 2 0 5 53 34 +6 2 0 6 52 35 +6 2 0 7 53 35 +6 2 0 8 52 36 +6 2 0 9 53 36 +6 2 0 10 52 37 +6 2 0 11 -1 -1 +6 2 0 12 53 37 +6 2 0 13 52 38 +6 2 0 14 53 38 +6 2 0 15 52 39 +6 2 0 16 53 39 +6 2 0 17 52 40 +6 2 0 18 53 40 +6 2 0 19 52 41 +6 2 0 20 53 41 +6 2 0 21 52 42 +6 2 0 22 -1 -1 +6 2 0 23 53 42 +6 2 0 24 52 43 +6 2 0 25 53 43 +6 2 0 26 52 44 +6 2 0 27 53 44 +6 2 0 28 52 45 +6 2 0 29 53 45 +6 2 0 30 52 46 +6 2 0 31 53 46 +6 2 0 32 52 47 +6 2 0 33 53 47 +6 2 0 34 52 48 +6 2 0 35 53 48 +6 2 0 36 52 49 +6 2 0 37 53 49 +6 2 0 38 52 50 +6 2 0 39 53 50 +6 2 0 40 52 51 +6 2 0 41 53 51 +6 2 0 42 52 52 +6 2 0 43 53 52 +6 2 0 44 52 53 +6 2 0 45 -1 -1 +6 2 0 46 53 53 +6 2 0 47 52 54 +6 2 0 48 53 54 +6 2 0 49 52 55 +6 2 0 50 53 55 +6 2 0 51 52 56 +6 2 0 52 53 56 +6 2 0 53 52 57 +6 2 0 54 53 57 +6 2 0 55 52 58 +6 2 0 56 -1 -1 +6 2 0 57 53 58 +6 2 0 58 52 59 +6 2 0 59 53 59 +6 2 0 60 52 60 +6 2 0 61 53 60 +6 2 0 62 52 61 +6 2 0 63 53 61 +6 2 0 64 52 62 +6 2 0 65 53 62 +6 2 0 66 52 63 +6 2 0 67 53 63 +6 2 1 0 52 0 +6 2 1 1 53 0 +6 2 1 2 52 1 +6 2 1 3 53 1 +6 2 1 4 52 2 +6 2 1 5 53 2 +6 2 1 6 52 3 +6 2 1 7 53 3 +6 2 1 8 52 4 +6 2 1 9 53 4 +6 2 1 10 52 5 +6 2 1 11 -1 -1 +6 2 1 12 53 5 +6 2 1 13 52 6 +6 2 1 14 53 6 +6 2 1 15 52 7 +6 2 1 16 53 7 +6 2 1 17 52 8 +6 2 1 18 53 8 +6 2 1 19 52 9 +6 2 1 20 53 9 +6 2 1 21 52 10 +6 2 1 22 -1 -1 +6 2 1 23 53 10 +6 2 1 24 52 11 +6 2 1 25 53 11 +6 2 1 26 52 12 +6 2 1 27 53 12 +6 2 1 28 52 13 +6 2 1 29 53 13 +6 2 1 30 52 14 +6 2 1 31 53 14 +6 2 1 32 52 15 +6 2 1 33 53 15 +6 2 1 34 52 16 +6 2 1 35 53 16 +6 2 1 36 52 17 +6 2 1 37 53 17 +6 2 1 38 52 18 +6 2 1 39 53 18 +6 2 1 40 52 19 +6 2 1 41 53 19 +6 2 1 42 52 20 +6 2 1 43 53 20 +6 2 1 44 52 21 +6 2 1 45 -1 -1 +6 2 1 46 53 21 +6 2 1 47 52 22 +6 2 1 48 53 22 +6 2 1 49 52 23 +6 2 1 50 53 23 +6 2 1 51 52 24 +6 2 1 52 53 24 +6 2 1 53 52 25 +6 2 1 54 53 25 +6 2 1 55 52 26 +6 2 1 56 -1 -1 +6 2 1 57 53 26 +6 2 1 58 52 27 +6 2 1 59 53 27 +6 2 1 60 52 28 +6 2 1 61 53 28 +6 2 1 62 52 29 +6 2 1 63 53 29 +6 2 1 64 52 30 +6 2 1 65 53 30 +6 2 1 66 52 31 +6 2 1 67 53 31 +6 2 2 0 54 32 +6 2 2 1 55 32 +6 2 2 2 54 33 +6 2 2 3 55 33 +6 2 2 4 54 34 +6 2 2 5 55 34 +6 2 2 6 54 35 +6 2 2 7 55 35 +6 2 2 8 54 36 +6 2 2 9 55 36 +6 2 2 10 54 37 +6 2 2 11 -1 -1 +6 2 2 12 55 37 +6 2 2 13 54 38 +6 2 2 14 55 38 +6 2 2 15 54 39 +6 2 2 16 55 39 +6 2 2 17 54 40 +6 2 2 18 55 40 +6 2 2 19 54 41 +6 2 2 20 55 41 +6 2 2 21 54 42 +6 2 2 22 -1 -1 +6 2 2 23 55 42 +6 2 2 24 54 43 +6 2 2 25 55 43 +6 2 2 26 54 44 +6 2 2 27 55 44 +6 2 2 28 54 45 +6 2 2 29 55 45 +6 2 2 30 54 46 +6 2 2 31 55 46 +6 2 2 32 54 47 +6 2 2 33 55 47 +6 2 2 34 54 48 +6 2 2 35 55 48 +6 2 2 36 54 49 +6 2 2 37 55 49 +6 2 2 38 54 50 +6 2 2 39 55 50 +6 2 2 40 54 51 +6 2 2 41 55 51 +6 2 2 42 54 52 +6 2 2 43 55 52 +6 2 2 44 54 53 +6 2 2 45 -1 -1 +6 2 2 46 55 53 +6 2 2 47 54 54 +6 2 2 48 55 54 +6 2 2 49 54 55 +6 2 2 50 55 55 +6 2 2 51 54 56 +6 2 2 52 55 56 +6 2 2 53 54 57 +6 2 2 54 55 57 +6 2 2 55 54 58 +6 2 2 56 -1 -1 +6 2 2 57 55 58 +6 2 2 58 54 59 +6 2 2 59 55 59 +6 2 2 60 54 60 +6 2 2 61 55 60 +6 2 2 62 54 61 +6 2 2 63 55 61 +6 2 2 64 54 62 +6 2 2 65 55 62 +6 2 2 66 54 63 +6 2 2 67 55 63 +6 2 3 0 54 0 +6 2 3 1 55 0 +6 2 3 2 54 1 +6 2 3 3 55 1 +6 2 3 4 54 2 +6 2 3 5 55 2 +6 2 3 6 54 3 +6 2 3 7 55 3 +6 2 3 8 54 4 +6 2 3 9 55 4 +6 2 3 10 54 5 +6 2 3 11 -1 -1 +6 2 3 12 55 5 +6 2 3 13 54 6 +6 2 3 14 55 6 +6 2 3 15 54 7 +6 2 3 16 55 7 +6 2 3 17 54 8 +6 2 3 18 55 8 +6 2 3 19 54 9 +6 2 3 20 55 9 +6 2 3 21 54 10 +6 2 3 22 -1 -1 +6 2 3 23 55 10 +6 2 3 24 54 11 +6 2 3 25 55 11 +6 2 3 26 54 12 +6 2 3 27 55 12 +6 2 3 28 54 13 +6 2 3 29 55 13 +6 2 3 30 54 14 +6 2 3 31 55 14 +6 2 3 32 54 15 +6 2 3 33 55 15 +6 2 3 34 54 16 +6 2 3 35 55 16 +6 2 3 36 54 17 +6 2 3 37 55 17 +6 2 3 38 54 18 +6 2 3 39 55 18 +6 2 3 40 54 19 +6 2 3 41 55 19 +6 2 3 42 54 20 +6 2 3 43 55 20 +6 2 3 44 54 21 +6 2 3 45 -1 -1 +6 2 3 46 55 21 +6 2 3 47 54 22 +6 2 3 48 55 22 +6 2 3 49 54 23 +6 2 3 50 55 23 +6 2 3 51 54 24 +6 2 3 52 55 24 +6 2 3 53 54 25 +6 2 3 54 55 25 +6 2 3 55 54 26 +6 2 3 56 -1 -1 +6 2 3 57 55 26 +6 2 3 58 54 27 +6 2 3 59 55 27 +6 2 3 60 54 28 +6 2 3 61 55 28 +6 2 3 62 54 29 +6 2 3 63 55 29 +6 2 3 64 54 30 +6 2 3 65 55 30 +6 2 3 66 54 31 +6 2 3 67 55 31 +6 3 0 0 55 95 +6 3 0 1 54 95 +6 3 0 2 55 94 +6 3 0 3 54 94 +6 3 0 4 55 93 +6 3 0 5 54 93 +6 3 0 6 55 92 +6 3 0 7 54 92 +6 3 0 8 55 91 +6 3 0 9 54 91 +6 3 0 10 55 90 +6 3 0 11 -1 -1 +6 3 0 12 54 90 +6 3 0 13 55 89 +6 3 0 14 54 89 +6 3 0 15 55 88 +6 3 0 16 54 88 +6 3 0 17 55 87 +6 3 0 18 54 87 +6 3 0 19 55 86 +6 3 0 20 54 86 +6 3 0 21 55 85 +6 3 0 22 -1 -1 +6 3 0 23 54 85 +6 3 0 24 55 84 +6 3 0 25 54 84 +6 3 0 26 55 83 +6 3 0 27 54 83 +6 3 0 28 55 82 +6 3 0 29 54 82 +6 3 0 30 55 81 +6 3 0 31 54 81 +6 3 0 32 55 80 +6 3 0 33 54 80 +6 3 0 34 55 79 +6 3 0 35 54 79 +6 3 0 36 55 78 +6 3 0 37 54 78 +6 3 0 38 55 77 +6 3 0 39 54 77 +6 3 0 40 55 76 +6 3 0 41 54 76 +6 3 0 42 55 75 +6 3 0 43 54 75 +6 3 0 44 55 74 +6 3 0 45 -1 -1 +6 3 0 46 54 74 +6 3 0 47 55 73 +6 3 0 48 54 73 +6 3 0 49 55 72 +6 3 0 50 54 72 +6 3 0 51 55 71 +6 3 0 52 54 71 +6 3 0 53 55 70 +6 3 0 54 54 70 +6 3 0 55 55 69 +6 3 0 56 -1 -1 +6 3 0 57 54 69 +6 3 0 58 55 68 +6 3 0 59 54 68 +6 3 0 60 55 67 +6 3 0 61 54 67 +6 3 0 62 55 66 +6 3 0 63 54 66 +6 3 0 64 55 65 +6 3 0 65 54 65 +6 3 0 66 55 64 +6 3 0 67 54 64 +6 3 1 0 55 127 +6 3 1 1 54 127 +6 3 1 2 55 126 +6 3 1 3 54 126 +6 3 1 4 55 125 +6 3 1 5 54 125 +6 3 1 6 55 124 +6 3 1 7 54 124 +6 3 1 8 55 123 +6 3 1 9 54 123 +6 3 1 10 55 122 +6 3 1 11 -1 -1 +6 3 1 12 54 122 +6 3 1 13 55 121 +6 3 1 14 54 121 +6 3 1 15 55 120 +6 3 1 16 54 120 +6 3 1 17 55 119 +6 3 1 18 54 119 +6 3 1 19 55 118 +6 3 1 20 54 118 +6 3 1 21 55 117 +6 3 1 22 -1 -1 +6 3 1 23 54 117 +6 3 1 24 55 116 +6 3 1 25 54 116 +6 3 1 26 55 115 +6 3 1 27 54 115 +6 3 1 28 55 114 +6 3 1 29 54 114 +6 3 1 30 55 113 +6 3 1 31 54 113 +6 3 1 32 55 112 +6 3 1 33 54 112 +6 3 1 34 55 111 +6 3 1 35 54 111 +6 3 1 36 55 110 +6 3 1 37 54 110 +6 3 1 38 55 109 +6 3 1 39 54 109 +6 3 1 40 55 108 +6 3 1 41 54 108 +6 3 1 42 55 107 +6 3 1 43 54 107 +6 3 1 44 55 106 +6 3 1 45 -1 -1 +6 3 1 46 54 106 +6 3 1 47 55 105 +6 3 1 48 54 105 +6 3 1 49 55 104 +6 3 1 50 54 104 +6 3 1 51 55 103 +6 3 1 52 54 103 +6 3 1 53 55 102 +6 3 1 54 54 102 +6 3 1 55 55 101 +6 3 1 56 -1 -1 +6 3 1 57 54 101 +6 3 1 58 55 100 +6 3 1 59 54 100 +6 3 1 60 55 99 +6 3 1 61 54 99 +6 3 1 62 55 98 +6 3 1 63 54 98 +6 3 1 64 55 97 +6 3 1 65 54 97 +6 3 1 66 55 96 +6 3 1 67 54 96 +6 3 2 0 53 95 +6 3 2 1 52 95 +6 3 2 2 53 94 +6 3 2 3 52 94 +6 3 2 4 53 93 +6 3 2 5 52 93 +6 3 2 6 53 92 +6 3 2 7 52 92 +6 3 2 8 53 91 +6 3 2 9 52 91 +6 3 2 10 53 90 +6 3 2 11 -1 -1 +6 3 2 12 52 90 +6 3 2 13 53 89 +6 3 2 14 52 89 +6 3 2 15 53 88 +6 3 2 16 52 88 +6 3 2 17 53 87 +6 3 2 18 52 87 +6 3 2 19 53 86 +6 3 2 20 52 86 +6 3 2 21 53 85 +6 3 2 22 -1 -1 +6 3 2 23 52 85 +6 3 2 24 53 84 +6 3 2 25 52 84 +6 3 2 26 53 83 +6 3 2 27 52 83 +6 3 2 28 53 82 +6 3 2 29 52 82 +6 3 2 30 53 81 +6 3 2 31 52 81 +6 3 2 32 53 80 +6 3 2 33 52 80 +6 3 2 34 53 79 +6 3 2 35 52 79 +6 3 2 36 53 78 +6 3 2 37 52 78 +6 3 2 38 53 77 +6 3 2 39 52 77 +6 3 2 40 53 76 +6 3 2 41 52 76 +6 3 2 42 53 75 +6 3 2 43 52 75 +6 3 2 44 53 74 +6 3 2 45 -1 -1 +6 3 2 46 52 74 +6 3 2 47 53 73 +6 3 2 48 52 73 +6 3 2 49 53 72 +6 3 2 50 52 72 +6 3 2 51 53 71 +6 3 2 52 52 71 +6 3 2 53 53 70 +6 3 2 54 52 70 +6 3 2 55 53 69 +6 3 2 56 -1 -1 +6 3 2 57 52 69 +6 3 2 58 53 68 +6 3 2 59 52 68 +6 3 2 60 53 67 +6 3 2 61 52 67 +6 3 2 62 53 66 +6 3 2 63 52 66 +6 3 2 64 53 65 +6 3 2 65 52 65 +6 3 2 66 53 64 +6 3 2 67 52 64 +6 3 3 0 53 127 +6 3 3 1 52 127 +6 3 3 2 53 126 +6 3 3 3 52 126 +6 3 3 4 53 125 +6 3 3 5 52 125 +6 3 3 6 53 124 +6 3 3 7 52 124 +6 3 3 8 53 123 +6 3 3 9 52 123 +6 3 3 10 53 122 +6 3 3 11 -1 -1 +6 3 3 12 52 122 +6 3 3 13 53 121 +6 3 3 14 52 121 +6 3 3 15 53 120 +6 3 3 16 52 120 +6 3 3 17 53 119 +6 3 3 18 52 119 +6 3 3 19 53 118 +6 3 3 20 52 118 +6 3 3 21 53 117 +6 3 3 22 -1 -1 +6 3 3 23 52 117 +6 3 3 24 53 116 +6 3 3 25 52 116 +6 3 3 26 53 115 +6 3 3 27 52 115 +6 3 3 28 53 114 +6 3 3 29 52 114 +6 3 3 30 53 113 +6 3 3 31 52 113 +6 3 3 32 53 112 +6 3 3 33 52 112 +6 3 3 34 53 111 +6 3 3 35 52 111 +6 3 3 36 53 110 +6 3 3 37 52 110 +6 3 3 38 53 109 +6 3 3 39 52 109 +6 3 3 40 53 108 +6 3 3 41 52 108 +6 3 3 42 53 107 +6 3 3 43 52 107 +6 3 3 44 53 106 +6 3 3 45 -1 -1 +6 3 3 46 52 106 +6 3 3 47 53 105 +6 3 3 48 52 105 +6 3 3 49 53 104 +6 3 3 50 52 104 +6 3 3 51 53 103 +6 3 3 52 52 103 +6 3 3 53 53 102 +6 3 3 54 52 102 +6 3 3 55 53 101 +6 3 3 56 -1 -1 +6 3 3 57 52 101 +6 3 3 58 53 100 +6 3 3 59 52 100 +6 3 3 60 53 99 +6 3 3 61 52 99 +6 3 3 62 53 98 +6 3 3 63 52 98 +6 3 3 64 53 97 +6 3 3 65 52 97 +6 3 3 66 53 96 +6 3 3 67 52 96 +7 0 0 0 56 32 +7 0 0 1 57 32 +7 0 0 2 56 33 +7 0 0 3 57 33 +7 0 0 4 56 34 +7 0 0 5 57 34 +7 0 0 6 56 35 +7 0 0 7 57 35 +7 0 0 8 56 36 +7 0 0 9 57 36 +7 0 0 10 56 37 +7 0 0 11 -1 -1 +7 0 0 12 57 37 +7 0 0 13 56 38 +7 0 0 14 57 38 +7 0 0 15 56 39 +7 0 0 16 57 39 +7 0 0 17 56 40 +7 0 0 18 57 40 +7 0 0 19 56 41 +7 0 0 20 57 41 +7 0 0 21 56 42 +7 0 0 22 -1 -1 +7 0 0 23 57 42 +7 0 0 24 56 43 +7 0 0 25 57 43 +7 0 0 26 56 44 +7 0 0 27 57 44 +7 0 0 28 56 45 +7 0 0 29 57 45 +7 0 0 30 56 46 +7 0 0 31 57 46 +7 0 0 32 56 47 +7 0 0 33 57 47 +7 0 0 34 56 48 +7 0 0 35 57 48 +7 0 0 36 56 49 +7 0 0 37 57 49 +7 0 0 38 56 50 +7 0 0 39 57 50 +7 0 0 40 56 51 +7 0 0 41 57 51 +7 0 0 42 56 52 +7 0 0 43 57 52 +7 0 0 44 56 53 +7 0 0 45 -1 -1 +7 0 0 46 57 53 +7 0 0 47 56 54 +7 0 0 48 57 54 +7 0 0 49 56 55 +7 0 0 50 57 55 +7 0 0 51 56 56 +7 0 0 52 57 56 +7 0 0 53 56 57 +7 0 0 54 57 57 +7 0 0 55 56 58 +7 0 0 56 -1 -1 +7 0 0 57 57 58 +7 0 0 58 56 59 +7 0 0 59 57 59 +7 0 0 60 56 60 +7 0 0 61 57 60 +7 0 0 62 56 61 +7 0 0 63 57 61 +7 0 0 64 56 62 +7 0 0 65 57 62 +7 0 0 66 56 63 +7 0 0 67 57 63 +7 0 1 0 56 0 +7 0 1 1 57 0 +7 0 1 2 56 1 +7 0 1 3 57 1 +7 0 1 4 56 2 +7 0 1 5 57 2 +7 0 1 6 56 3 +7 0 1 7 57 3 +7 0 1 8 56 4 +7 0 1 9 57 4 +7 0 1 10 56 5 +7 0 1 11 -1 -1 +7 0 1 12 57 5 +7 0 1 13 56 6 +7 0 1 14 57 6 +7 0 1 15 56 7 +7 0 1 16 57 7 +7 0 1 17 56 8 +7 0 1 18 57 8 +7 0 1 19 56 9 +7 0 1 20 57 9 +7 0 1 21 56 10 +7 0 1 22 -1 -1 +7 0 1 23 57 10 +7 0 1 24 56 11 +7 0 1 25 57 11 +7 0 1 26 56 12 +7 0 1 27 57 12 +7 0 1 28 56 13 +7 0 1 29 57 13 +7 0 1 30 56 14 +7 0 1 31 57 14 +7 0 1 32 56 15 +7 0 1 33 57 15 +7 0 1 34 56 16 +7 0 1 35 57 16 +7 0 1 36 56 17 +7 0 1 37 57 17 +7 0 1 38 56 18 +7 0 1 39 57 18 +7 0 1 40 56 19 +7 0 1 41 57 19 +7 0 1 42 56 20 +7 0 1 43 57 20 +7 0 1 44 56 21 +7 0 1 45 -1 -1 +7 0 1 46 57 21 +7 0 1 47 56 22 +7 0 1 48 57 22 +7 0 1 49 56 23 +7 0 1 50 57 23 +7 0 1 51 56 24 +7 0 1 52 57 24 +7 0 1 53 56 25 +7 0 1 54 57 25 +7 0 1 55 56 26 +7 0 1 56 -1 -1 +7 0 1 57 57 26 +7 0 1 58 56 27 +7 0 1 59 57 27 +7 0 1 60 56 28 +7 0 1 61 57 28 +7 0 1 62 56 29 +7 0 1 63 57 29 +7 0 1 64 56 30 +7 0 1 65 57 30 +7 0 1 66 56 31 +7 0 1 67 57 31 +7 0 2 0 58 32 +7 0 2 1 59 32 +7 0 2 2 58 33 +7 0 2 3 59 33 +7 0 2 4 58 34 +7 0 2 5 59 34 +7 0 2 6 58 35 +7 0 2 7 59 35 +7 0 2 8 58 36 +7 0 2 9 59 36 +7 0 2 10 58 37 +7 0 2 11 -1 -1 +7 0 2 12 59 37 +7 0 2 13 58 38 +7 0 2 14 59 38 +7 0 2 15 58 39 +7 0 2 16 59 39 +7 0 2 17 58 40 +7 0 2 18 59 40 +7 0 2 19 58 41 +7 0 2 20 59 41 +7 0 2 21 58 42 +7 0 2 22 -1 -1 +7 0 2 23 59 42 +7 0 2 24 58 43 +7 0 2 25 59 43 +7 0 2 26 58 44 +7 0 2 27 59 44 +7 0 2 28 58 45 +7 0 2 29 59 45 +7 0 2 30 58 46 +7 0 2 31 59 46 +7 0 2 32 58 47 +7 0 2 33 59 47 +7 0 2 34 58 48 +7 0 2 35 59 48 +7 0 2 36 58 49 +7 0 2 37 59 49 +7 0 2 38 58 50 +7 0 2 39 59 50 +7 0 2 40 58 51 +7 0 2 41 59 51 +7 0 2 42 58 52 +7 0 2 43 59 52 +7 0 2 44 58 53 +7 0 2 45 -1 -1 +7 0 2 46 59 53 +7 0 2 47 58 54 +7 0 2 48 59 54 +7 0 2 49 58 55 +7 0 2 50 59 55 +7 0 2 51 58 56 +7 0 2 52 59 56 +7 0 2 53 58 57 +7 0 2 54 59 57 +7 0 2 55 58 58 +7 0 2 56 -1 -1 +7 0 2 57 59 58 +7 0 2 58 58 59 +7 0 2 59 59 59 +7 0 2 60 58 60 +7 0 2 61 59 60 +7 0 2 62 58 61 +7 0 2 63 59 61 +7 0 2 64 58 62 +7 0 2 65 59 62 +7 0 2 66 58 63 +7 0 2 67 59 63 +7 0 3 0 58 0 +7 0 3 1 59 0 +7 0 3 2 58 1 +7 0 3 3 59 1 +7 0 3 4 58 2 +7 0 3 5 59 2 +7 0 3 6 58 3 +7 0 3 7 59 3 +7 0 3 8 58 4 +7 0 3 9 59 4 +7 0 3 10 58 5 +7 0 3 11 -1 -1 +7 0 3 12 59 5 +7 0 3 13 58 6 +7 0 3 14 59 6 +7 0 3 15 58 7 +7 0 3 16 59 7 +7 0 3 17 58 8 +7 0 3 18 59 8 +7 0 3 19 58 9 +7 0 3 20 59 9 +7 0 3 21 58 10 +7 0 3 22 -1 -1 +7 0 3 23 59 10 +7 0 3 24 58 11 +7 0 3 25 59 11 +7 0 3 26 58 12 +7 0 3 27 59 12 +7 0 3 28 58 13 +7 0 3 29 59 13 +7 0 3 30 58 14 +7 0 3 31 59 14 +7 0 3 32 58 15 +7 0 3 33 59 15 +7 0 3 34 58 16 +7 0 3 35 59 16 +7 0 3 36 58 17 +7 0 3 37 59 17 +7 0 3 38 58 18 +7 0 3 39 59 18 +7 0 3 40 58 19 +7 0 3 41 59 19 +7 0 3 42 58 20 +7 0 3 43 59 20 +7 0 3 44 58 21 +7 0 3 45 -1 -1 +7 0 3 46 59 21 +7 0 3 47 58 22 +7 0 3 48 59 22 +7 0 3 49 58 23 +7 0 3 50 59 23 +7 0 3 51 58 24 +7 0 3 52 59 24 +7 0 3 53 58 25 +7 0 3 54 59 25 +7 0 3 55 58 26 +7 0 3 56 -1 -1 +7 0 3 57 59 26 +7 0 3 58 58 27 +7 0 3 59 59 27 +7 0 3 60 58 28 +7 0 3 61 59 28 +7 0 3 62 58 29 +7 0 3 63 59 29 +7 0 3 64 58 30 +7 0 3 65 59 30 +7 0 3 66 58 31 +7 0 3 67 59 31 +7 1 0 0 59 95 +7 1 0 1 58 95 +7 1 0 2 59 94 +7 1 0 3 58 94 +7 1 0 4 59 93 +7 1 0 5 58 93 +7 1 0 6 59 92 +7 1 0 7 58 92 +7 1 0 8 59 91 +7 1 0 9 58 91 +7 1 0 10 59 90 +7 1 0 11 -1 -1 +7 1 0 12 58 90 +7 1 0 13 59 89 +7 1 0 14 58 89 +7 1 0 15 59 88 +7 1 0 16 58 88 +7 1 0 17 59 87 +7 1 0 18 58 87 +7 1 0 19 59 86 +7 1 0 20 58 86 +7 1 0 21 59 85 +7 1 0 22 -1 -1 +7 1 0 23 58 85 +7 1 0 24 59 84 +7 1 0 25 58 84 +7 1 0 26 59 83 +7 1 0 27 58 83 +7 1 0 28 59 82 +7 1 0 29 58 82 +7 1 0 30 59 81 +7 1 0 31 58 81 +7 1 0 32 59 80 +7 1 0 33 58 80 +7 1 0 34 59 79 +7 1 0 35 58 79 +7 1 0 36 59 78 +7 1 0 37 58 78 +7 1 0 38 59 77 +7 1 0 39 58 77 +7 1 0 40 59 76 +7 1 0 41 58 76 +7 1 0 42 59 75 +7 1 0 43 58 75 +7 1 0 44 59 74 +7 1 0 45 -1 -1 +7 1 0 46 58 74 +7 1 0 47 59 73 +7 1 0 48 58 73 +7 1 0 49 59 72 +7 1 0 50 58 72 +7 1 0 51 59 71 +7 1 0 52 58 71 +7 1 0 53 59 70 +7 1 0 54 58 70 +7 1 0 55 59 69 +7 1 0 56 -1 -1 +7 1 0 57 58 69 +7 1 0 58 59 68 +7 1 0 59 58 68 +7 1 0 60 59 67 +7 1 0 61 58 67 +7 1 0 62 59 66 +7 1 0 63 58 66 +7 1 0 64 59 65 +7 1 0 65 58 65 +7 1 0 66 59 64 +7 1 0 67 58 64 +7 1 1 0 59 127 +7 1 1 1 58 127 +7 1 1 2 59 126 +7 1 1 3 58 126 +7 1 1 4 59 125 +7 1 1 5 58 125 +7 1 1 6 59 124 +7 1 1 7 58 124 +7 1 1 8 59 123 +7 1 1 9 58 123 +7 1 1 10 59 122 +7 1 1 11 -1 -1 +7 1 1 12 58 122 +7 1 1 13 59 121 +7 1 1 14 58 121 +7 1 1 15 59 120 +7 1 1 16 58 120 +7 1 1 17 59 119 +7 1 1 18 58 119 +7 1 1 19 59 118 +7 1 1 20 58 118 +7 1 1 21 59 117 +7 1 1 22 -1 -1 +7 1 1 23 58 117 +7 1 1 24 59 116 +7 1 1 25 58 116 +7 1 1 26 59 115 +7 1 1 27 58 115 +7 1 1 28 59 114 +7 1 1 29 58 114 +7 1 1 30 59 113 +7 1 1 31 58 113 +7 1 1 32 59 112 +7 1 1 33 58 112 +7 1 1 34 59 111 +7 1 1 35 58 111 +7 1 1 36 59 110 +7 1 1 37 58 110 +7 1 1 38 59 109 +7 1 1 39 58 109 +7 1 1 40 59 108 +7 1 1 41 58 108 +7 1 1 42 59 107 +7 1 1 43 58 107 +7 1 1 44 59 106 +7 1 1 45 -1 -1 +7 1 1 46 58 106 +7 1 1 47 59 105 +7 1 1 48 58 105 +7 1 1 49 59 104 +7 1 1 50 58 104 +7 1 1 51 59 103 +7 1 1 52 58 103 +7 1 1 53 59 102 +7 1 1 54 58 102 +7 1 1 55 59 101 +7 1 1 56 -1 -1 +7 1 1 57 58 101 +7 1 1 58 59 100 +7 1 1 59 58 100 +7 1 1 60 59 99 +7 1 1 61 58 99 +7 1 1 62 59 98 +7 1 1 63 58 98 +7 1 1 64 59 97 +7 1 1 65 58 97 +7 1 1 66 59 96 +7 1 1 67 58 96 +7 1 2 0 57 95 +7 1 2 1 56 95 +7 1 2 2 57 94 +7 1 2 3 56 94 +7 1 2 4 57 93 +7 1 2 5 56 93 +7 1 2 6 57 92 +7 1 2 7 56 92 +7 1 2 8 57 91 +7 1 2 9 56 91 +7 1 2 10 57 90 +7 1 2 11 -1 -1 +7 1 2 12 56 90 +7 1 2 13 57 89 +7 1 2 14 56 89 +7 1 2 15 57 88 +7 1 2 16 56 88 +7 1 2 17 57 87 +7 1 2 18 56 87 +7 1 2 19 57 86 +7 1 2 20 56 86 +7 1 2 21 57 85 +7 1 2 22 -1 -1 +7 1 2 23 56 85 +7 1 2 24 57 84 +7 1 2 25 56 84 +7 1 2 26 57 83 +7 1 2 27 56 83 +7 1 2 28 57 82 +7 1 2 29 56 82 +7 1 2 30 57 81 +7 1 2 31 56 81 +7 1 2 32 57 80 +7 1 2 33 56 80 +7 1 2 34 57 79 +7 1 2 35 56 79 +7 1 2 36 57 78 +7 1 2 37 56 78 +7 1 2 38 57 77 +7 1 2 39 56 77 +7 1 2 40 57 76 +7 1 2 41 56 76 +7 1 2 42 57 75 +7 1 2 43 56 75 +7 1 2 44 57 74 +7 1 2 45 -1 -1 +7 1 2 46 56 74 +7 1 2 47 57 73 +7 1 2 48 56 73 +7 1 2 49 57 72 +7 1 2 50 56 72 +7 1 2 51 57 71 +7 1 2 52 56 71 +7 1 2 53 57 70 +7 1 2 54 56 70 +7 1 2 55 57 69 +7 1 2 56 -1 -1 +7 1 2 57 56 69 +7 1 2 58 57 68 +7 1 2 59 56 68 +7 1 2 60 57 67 +7 1 2 61 56 67 +7 1 2 62 57 66 +7 1 2 63 56 66 +7 1 2 64 57 65 +7 1 2 65 56 65 +7 1 2 66 57 64 +7 1 2 67 56 64 +7 1 3 0 57 127 +7 1 3 1 56 127 +7 1 3 2 57 126 +7 1 3 3 56 126 +7 1 3 4 57 125 +7 1 3 5 56 125 +7 1 3 6 57 124 +7 1 3 7 56 124 +7 1 3 8 57 123 +7 1 3 9 56 123 +7 1 3 10 57 122 +7 1 3 11 -1 -1 +7 1 3 12 56 122 +7 1 3 13 57 121 +7 1 3 14 56 121 +7 1 3 15 57 120 +7 1 3 16 56 120 +7 1 3 17 57 119 +7 1 3 18 56 119 +7 1 3 19 57 118 +7 1 3 20 56 118 +7 1 3 21 57 117 +7 1 3 22 -1 -1 +7 1 3 23 56 117 +7 1 3 24 57 116 +7 1 3 25 56 116 +7 1 3 26 57 115 +7 1 3 27 56 115 +7 1 3 28 57 114 +7 1 3 29 56 114 +7 1 3 30 57 113 +7 1 3 31 56 113 +7 1 3 32 57 112 +7 1 3 33 56 112 +7 1 3 34 57 111 +7 1 3 35 56 111 +7 1 3 36 57 110 +7 1 3 37 56 110 +7 1 3 38 57 109 +7 1 3 39 56 109 +7 1 3 40 57 108 +7 1 3 41 56 108 +7 1 3 42 57 107 +7 1 3 43 56 107 +7 1 3 44 57 106 +7 1 3 45 -1 -1 +7 1 3 46 56 106 +7 1 3 47 57 105 +7 1 3 48 56 105 +7 1 3 49 57 104 +7 1 3 50 56 104 +7 1 3 51 57 103 +7 1 3 52 56 103 +7 1 3 53 57 102 +7 1 3 54 56 102 +7 1 3 55 57 101 +7 1 3 56 -1 -1 +7 1 3 57 56 101 +7 1 3 58 57 100 +7 1 3 59 56 100 +7 1 3 60 57 99 +7 1 3 61 56 99 +7 1 3 62 57 98 +7 1 3 63 56 98 +7 1 3 64 57 97 +7 1 3 65 56 97 +7 1 3 66 57 96 +7 1 3 67 56 96 +7 2 0 0 60 32 +7 2 0 1 61 32 +7 2 0 2 60 33 +7 2 0 3 61 33 +7 2 0 4 60 34 +7 2 0 5 61 34 +7 2 0 6 60 35 +7 2 0 7 61 35 +7 2 0 8 60 36 +7 2 0 9 61 36 +7 2 0 10 60 37 +7 2 0 11 -1 -1 +7 2 0 12 61 37 +7 2 0 13 60 38 +7 2 0 14 61 38 +7 2 0 15 60 39 +7 2 0 16 61 39 +7 2 0 17 60 40 +7 2 0 18 61 40 +7 2 0 19 60 41 +7 2 0 20 61 41 +7 2 0 21 60 42 +7 2 0 22 -1 -1 +7 2 0 23 61 42 +7 2 0 24 60 43 +7 2 0 25 61 43 +7 2 0 26 60 44 +7 2 0 27 61 44 +7 2 0 28 60 45 +7 2 0 29 61 45 +7 2 0 30 60 46 +7 2 0 31 61 46 +7 2 0 32 60 47 +7 2 0 33 61 47 +7 2 0 34 60 48 +7 2 0 35 61 48 +7 2 0 36 60 49 +7 2 0 37 61 49 +7 2 0 38 60 50 +7 2 0 39 61 50 +7 2 0 40 60 51 +7 2 0 41 61 51 +7 2 0 42 60 52 +7 2 0 43 61 52 +7 2 0 44 60 53 +7 2 0 45 -1 -1 +7 2 0 46 61 53 +7 2 0 47 60 54 +7 2 0 48 61 54 +7 2 0 49 60 55 +7 2 0 50 61 55 +7 2 0 51 60 56 +7 2 0 52 61 56 +7 2 0 53 60 57 +7 2 0 54 61 57 +7 2 0 55 60 58 +7 2 0 56 -1 -1 +7 2 0 57 61 58 +7 2 0 58 60 59 +7 2 0 59 61 59 +7 2 0 60 60 60 +7 2 0 61 61 60 +7 2 0 62 60 61 +7 2 0 63 61 61 +7 2 0 64 60 62 +7 2 0 65 61 62 +7 2 0 66 60 63 +7 2 0 67 61 63 +7 2 1 0 60 0 +7 2 1 1 61 0 +7 2 1 2 60 1 +7 2 1 3 61 1 +7 2 1 4 60 2 +7 2 1 5 61 2 +7 2 1 6 60 3 +7 2 1 7 61 3 +7 2 1 8 60 4 +7 2 1 9 61 4 +7 2 1 10 60 5 +7 2 1 11 -1 -1 +7 2 1 12 61 5 +7 2 1 13 60 6 +7 2 1 14 61 6 +7 2 1 15 60 7 +7 2 1 16 61 7 +7 2 1 17 60 8 +7 2 1 18 61 8 +7 2 1 19 60 9 +7 2 1 20 61 9 +7 2 1 21 60 10 +7 2 1 22 -1 -1 +7 2 1 23 61 10 +7 2 1 24 60 11 +7 2 1 25 61 11 +7 2 1 26 60 12 +7 2 1 27 61 12 +7 2 1 28 60 13 +7 2 1 29 61 13 +7 2 1 30 60 14 +7 2 1 31 61 14 +7 2 1 32 60 15 +7 2 1 33 61 15 +7 2 1 34 60 16 +7 2 1 35 61 16 +7 2 1 36 60 17 +7 2 1 37 61 17 +7 2 1 38 60 18 +7 2 1 39 61 18 +7 2 1 40 60 19 +7 2 1 41 61 19 +7 2 1 42 60 20 +7 2 1 43 61 20 +7 2 1 44 60 21 +7 2 1 45 -1 -1 +7 2 1 46 61 21 +7 2 1 47 60 22 +7 2 1 48 61 22 +7 2 1 49 60 23 +7 2 1 50 61 23 +7 2 1 51 60 24 +7 2 1 52 61 24 +7 2 1 53 60 25 +7 2 1 54 61 25 +7 2 1 55 60 26 +7 2 1 56 -1 -1 +7 2 1 57 61 26 +7 2 1 58 60 27 +7 2 1 59 61 27 +7 2 1 60 60 28 +7 2 1 61 61 28 +7 2 1 62 60 29 +7 2 1 63 61 29 +7 2 1 64 60 30 +7 2 1 65 61 30 +7 2 1 66 60 31 +7 2 1 67 61 31 +7 2 2 0 62 32 +7 2 2 1 63 32 +7 2 2 2 62 33 +7 2 2 3 63 33 +7 2 2 4 62 34 +7 2 2 5 63 34 +7 2 2 6 62 35 +7 2 2 7 63 35 +7 2 2 8 62 36 +7 2 2 9 63 36 +7 2 2 10 62 37 +7 2 2 11 -1 -1 +7 2 2 12 63 37 +7 2 2 13 62 38 +7 2 2 14 63 38 +7 2 2 15 62 39 +7 2 2 16 63 39 +7 2 2 17 62 40 +7 2 2 18 63 40 +7 2 2 19 62 41 +7 2 2 20 63 41 +7 2 2 21 62 42 +7 2 2 22 -1 -1 +7 2 2 23 63 42 +7 2 2 24 62 43 +7 2 2 25 63 43 +7 2 2 26 62 44 +7 2 2 27 63 44 +7 2 2 28 62 45 +7 2 2 29 63 45 +7 2 2 30 62 46 +7 2 2 31 63 46 +7 2 2 32 62 47 +7 2 2 33 63 47 +7 2 2 34 62 48 +7 2 2 35 63 48 +7 2 2 36 62 49 +7 2 2 37 63 49 +7 2 2 38 62 50 +7 2 2 39 63 50 +7 2 2 40 62 51 +7 2 2 41 63 51 +7 2 2 42 62 52 +7 2 2 43 63 52 +7 2 2 44 62 53 +7 2 2 45 -1 -1 +7 2 2 46 63 53 +7 2 2 47 62 54 +7 2 2 48 63 54 +7 2 2 49 62 55 +7 2 2 50 63 55 +7 2 2 51 62 56 +7 2 2 52 63 56 +7 2 2 53 62 57 +7 2 2 54 63 57 +7 2 2 55 62 58 +7 2 2 56 -1 -1 +7 2 2 57 63 58 +7 2 2 58 62 59 +7 2 2 59 63 59 +7 2 2 60 62 60 +7 2 2 61 63 60 +7 2 2 62 62 61 +7 2 2 63 63 61 +7 2 2 64 62 62 +7 2 2 65 63 62 +7 2 2 66 62 63 +7 2 2 67 63 63 +7 2 3 0 62 0 +7 2 3 1 63 0 +7 2 3 2 62 1 +7 2 3 3 63 1 +7 2 3 4 62 2 +7 2 3 5 63 2 +7 2 3 6 62 3 +7 2 3 7 63 3 +7 2 3 8 62 4 +7 2 3 9 63 4 +7 2 3 10 62 5 +7 2 3 11 -1 -1 +7 2 3 12 63 5 +7 2 3 13 62 6 +7 2 3 14 63 6 +7 2 3 15 62 7 +7 2 3 16 63 7 +7 2 3 17 62 8 +7 2 3 18 63 8 +7 2 3 19 62 9 +7 2 3 20 63 9 +7 2 3 21 62 10 +7 2 3 22 -1 -1 +7 2 3 23 63 10 +7 2 3 24 62 11 +7 2 3 25 63 11 +7 2 3 26 62 12 +7 2 3 27 63 12 +7 2 3 28 62 13 +7 2 3 29 63 13 +7 2 3 30 62 14 +7 2 3 31 63 14 +7 2 3 32 62 15 +7 2 3 33 63 15 +7 2 3 34 62 16 +7 2 3 35 63 16 +7 2 3 36 62 17 +7 2 3 37 63 17 +7 2 3 38 62 18 +7 2 3 39 63 18 +7 2 3 40 62 19 +7 2 3 41 63 19 +7 2 3 42 62 20 +7 2 3 43 63 20 +7 2 3 44 62 21 +7 2 3 45 -1 -1 +7 2 3 46 63 21 +7 2 3 47 62 22 +7 2 3 48 63 22 +7 2 3 49 62 23 +7 2 3 50 63 23 +7 2 3 51 62 24 +7 2 3 52 63 24 +7 2 3 53 62 25 +7 2 3 54 63 25 +7 2 3 55 62 26 +7 2 3 56 -1 -1 +7 2 3 57 63 26 +7 2 3 58 62 27 +7 2 3 59 63 27 +7 2 3 60 62 28 +7 2 3 61 63 28 +7 2 3 62 62 29 +7 2 3 63 63 29 +7 2 3 64 62 30 +7 2 3 65 63 30 +7 2 3 66 62 31 +7 2 3 67 63 31 +7 3 0 0 63 95 +7 3 0 1 62 95 +7 3 0 2 63 94 +7 3 0 3 62 94 +7 3 0 4 63 93 +7 3 0 5 62 93 +7 3 0 6 63 92 +7 3 0 7 62 92 +7 3 0 8 63 91 +7 3 0 9 62 91 +7 3 0 10 63 90 +7 3 0 11 -1 -1 +7 3 0 12 62 90 +7 3 0 13 63 89 +7 3 0 14 62 89 +7 3 0 15 63 88 +7 3 0 16 62 88 +7 3 0 17 63 87 +7 3 0 18 62 87 +7 3 0 19 63 86 +7 3 0 20 62 86 +7 3 0 21 63 85 +7 3 0 22 -1 -1 +7 3 0 23 62 85 +7 3 0 24 63 84 +7 3 0 25 62 84 +7 3 0 26 63 83 +7 3 0 27 62 83 +7 3 0 28 63 82 +7 3 0 29 62 82 +7 3 0 30 63 81 +7 3 0 31 62 81 +7 3 0 32 63 80 +7 3 0 33 62 80 +7 3 0 34 63 79 +7 3 0 35 62 79 +7 3 0 36 63 78 +7 3 0 37 62 78 +7 3 0 38 63 77 +7 3 0 39 62 77 +7 3 0 40 63 76 +7 3 0 41 62 76 +7 3 0 42 63 75 +7 3 0 43 62 75 +7 3 0 44 63 74 +7 3 0 45 -1 -1 +7 3 0 46 62 74 +7 3 0 47 63 73 +7 3 0 48 62 73 +7 3 0 49 63 72 +7 3 0 50 62 72 +7 3 0 51 63 71 +7 3 0 52 62 71 +7 3 0 53 63 70 +7 3 0 54 62 70 +7 3 0 55 63 69 +7 3 0 56 -1 -1 +7 3 0 57 62 69 +7 3 0 58 63 68 +7 3 0 59 62 68 +7 3 0 60 63 67 +7 3 0 61 62 67 +7 3 0 62 63 66 +7 3 0 63 62 66 +7 3 0 64 63 65 +7 3 0 65 62 65 +7 3 0 66 63 64 +7 3 0 67 62 64 +7 3 1 0 63 127 +7 3 1 1 62 127 +7 3 1 2 63 126 +7 3 1 3 62 126 +7 3 1 4 63 125 +7 3 1 5 62 125 +7 3 1 6 63 124 +7 3 1 7 62 124 +7 3 1 8 63 123 +7 3 1 9 62 123 +7 3 1 10 63 122 +7 3 1 11 -1 -1 +7 3 1 12 62 122 +7 3 1 13 63 121 +7 3 1 14 62 121 +7 3 1 15 63 120 +7 3 1 16 62 120 +7 3 1 17 63 119 +7 3 1 18 62 119 +7 3 1 19 63 118 +7 3 1 20 62 118 +7 3 1 21 63 117 +7 3 1 22 -1 -1 +7 3 1 23 62 117 +7 3 1 24 63 116 +7 3 1 25 62 116 +7 3 1 26 63 115 +7 3 1 27 62 115 +7 3 1 28 63 114 +7 3 1 29 62 114 +7 3 1 30 63 113 +7 3 1 31 62 113 +7 3 1 32 63 112 +7 3 1 33 62 112 +7 3 1 34 63 111 +7 3 1 35 62 111 +7 3 1 36 63 110 +7 3 1 37 62 110 +7 3 1 38 63 109 +7 3 1 39 62 109 +7 3 1 40 63 108 +7 3 1 41 62 108 +7 3 1 42 63 107 +7 3 1 43 62 107 +7 3 1 44 63 106 +7 3 1 45 -1 -1 +7 3 1 46 62 106 +7 3 1 47 63 105 +7 3 1 48 62 105 +7 3 1 49 63 104 +7 3 1 50 62 104 +7 3 1 51 63 103 +7 3 1 52 62 103 +7 3 1 53 63 102 +7 3 1 54 62 102 +7 3 1 55 63 101 +7 3 1 56 -1 -1 +7 3 1 57 62 101 +7 3 1 58 63 100 +7 3 1 59 62 100 +7 3 1 60 63 99 +7 3 1 61 62 99 +7 3 1 62 63 98 +7 3 1 63 62 98 +7 3 1 64 63 97 +7 3 1 65 62 97 +7 3 1 66 63 96 +7 3 1 67 62 96 +7 3 2 0 61 95 +7 3 2 1 60 95 +7 3 2 2 61 94 +7 3 2 3 60 94 +7 3 2 4 61 93 +7 3 2 5 60 93 +7 3 2 6 61 92 +7 3 2 7 60 92 +7 3 2 8 61 91 +7 3 2 9 60 91 +7 3 2 10 61 90 +7 3 2 11 -1 -1 +7 3 2 12 60 90 +7 3 2 13 61 89 +7 3 2 14 60 89 +7 3 2 15 61 88 +7 3 2 16 60 88 +7 3 2 17 61 87 +7 3 2 18 60 87 +7 3 2 19 61 86 +7 3 2 20 60 86 +7 3 2 21 61 85 +7 3 2 22 -1 -1 +7 3 2 23 60 85 +7 3 2 24 61 84 +7 3 2 25 60 84 +7 3 2 26 61 83 +7 3 2 27 60 83 +7 3 2 28 61 82 +7 3 2 29 60 82 +7 3 2 30 61 81 +7 3 2 31 60 81 +7 3 2 32 61 80 +7 3 2 33 60 80 +7 3 2 34 61 79 +7 3 2 35 60 79 +7 3 2 36 61 78 +7 3 2 37 60 78 +7 3 2 38 61 77 +7 3 2 39 60 77 +7 3 2 40 61 76 +7 3 2 41 60 76 +7 3 2 42 61 75 +7 3 2 43 60 75 +7 3 2 44 61 74 +7 3 2 45 -1 -1 +7 3 2 46 60 74 +7 3 2 47 61 73 +7 3 2 48 60 73 +7 3 2 49 61 72 +7 3 2 50 60 72 +7 3 2 51 61 71 +7 3 2 52 60 71 +7 3 2 53 61 70 +7 3 2 54 60 70 +7 3 2 55 61 69 +7 3 2 56 -1 -1 +7 3 2 57 60 69 +7 3 2 58 61 68 +7 3 2 59 60 68 +7 3 2 60 61 67 +7 3 2 61 60 67 +7 3 2 62 61 66 +7 3 2 63 60 66 +7 3 2 64 61 65 +7 3 2 65 60 65 +7 3 2 66 61 64 +7 3 2 67 60 64 +7 3 3 0 61 127 +7 3 3 1 60 127 +7 3 3 2 61 126 +7 3 3 3 60 126 +7 3 3 4 61 125 +7 3 3 5 60 125 +7 3 3 6 61 124 +7 3 3 7 60 124 +7 3 3 8 61 123 +7 3 3 9 60 123 +7 3 3 10 61 122 +7 3 3 11 -1 -1 +7 3 3 12 60 122 +7 3 3 13 61 121 +7 3 3 14 60 121 +7 3 3 15 61 120 +7 3 3 16 60 120 +7 3 3 17 61 119 +7 3 3 18 60 119 +7 3 3 19 61 118 +7 3 3 20 60 118 +7 3 3 21 61 117 +7 3 3 22 -1 -1 +7 3 3 23 60 117 +7 3 3 24 61 116 +7 3 3 25 60 116 +7 3 3 26 61 115 +7 3 3 27 60 115 +7 3 3 28 61 114 +7 3 3 29 60 114 +7 3 3 30 61 113 +7 3 3 31 60 113 +7 3 3 32 61 112 +7 3 3 33 60 112 +7 3 3 34 61 111 +7 3 3 35 60 111 +7 3 3 36 61 110 +7 3 3 37 60 110 +7 3 3 38 61 109 +7 3 3 39 60 109 +7 3 3 40 61 108 +7 3 3 41 60 108 +7 3 3 42 61 107 +7 3 3 43 60 107 +7 3 3 44 61 106 +7 3 3 45 -1 -1 +7 3 3 46 60 106 +7 3 3 47 61 105 +7 3 3 48 60 105 +7 3 3 49 61 104 +7 3 3 50 60 104 +7 3 3 51 61 103 +7 3 3 52 60 103 +7 3 3 53 61 102 +7 3 3 54 60 102 +7 3 3 55 61 101 +7 3 3 56 -1 -1 +7 3 3 57 60 101 +7 3 3 58 61 100 +7 3 3 59 60 100 +7 3 3 60 61 99 +7 3 3 61 60 99 +7 3 3 62 61 98 +7 3 3 63 60 98 +7 3 3 64 61 97 +7 3 3 65 60 97 +7 3 3 66 61 96 +7 3 3 67 60 96 +8 0 0 0 64 32 +8 0 0 1 65 32 +8 0 0 2 64 33 +8 0 0 3 65 33 +8 0 0 4 64 34 +8 0 0 5 65 34 +8 0 0 6 64 35 +8 0 0 7 65 35 +8 0 0 8 64 36 +8 0 0 9 65 36 +8 0 0 10 64 37 +8 0 0 11 -1 -1 +8 0 0 12 65 37 +8 0 0 13 64 38 +8 0 0 14 65 38 +8 0 0 15 64 39 +8 0 0 16 65 39 +8 0 0 17 64 40 +8 0 0 18 65 40 +8 0 0 19 64 41 +8 0 0 20 65 41 +8 0 0 21 64 42 +8 0 0 22 -1 -1 +8 0 0 23 65 42 +8 0 0 24 64 43 +8 0 0 25 65 43 +8 0 0 26 64 44 +8 0 0 27 65 44 +8 0 0 28 64 45 +8 0 0 29 65 45 +8 0 0 30 64 46 +8 0 0 31 65 46 +8 0 0 32 64 47 +8 0 0 33 65 47 +8 0 0 34 64 48 +8 0 0 35 65 48 +8 0 0 36 64 49 +8 0 0 37 65 49 +8 0 0 38 64 50 +8 0 0 39 65 50 +8 0 0 40 64 51 +8 0 0 41 65 51 +8 0 0 42 64 52 +8 0 0 43 65 52 +8 0 0 44 64 53 +8 0 0 45 -1 -1 +8 0 0 46 65 53 +8 0 0 47 64 54 +8 0 0 48 65 54 +8 0 0 49 64 55 +8 0 0 50 65 55 +8 0 0 51 64 56 +8 0 0 52 65 56 +8 0 0 53 64 57 +8 0 0 54 65 57 +8 0 0 55 64 58 +8 0 0 56 -1 -1 +8 0 0 57 65 58 +8 0 0 58 64 59 +8 0 0 59 65 59 +8 0 0 60 64 60 +8 0 0 61 65 60 +8 0 0 62 64 61 +8 0 0 63 65 61 +8 0 0 64 64 62 +8 0 0 65 65 62 +8 0 0 66 64 63 +8 0 0 67 65 63 +8 0 1 0 64 0 +8 0 1 1 65 0 +8 0 1 2 64 1 +8 0 1 3 65 1 +8 0 1 4 64 2 +8 0 1 5 65 2 +8 0 1 6 64 3 +8 0 1 7 65 3 +8 0 1 8 64 4 +8 0 1 9 65 4 +8 0 1 10 64 5 +8 0 1 11 -1 -1 +8 0 1 12 65 5 +8 0 1 13 64 6 +8 0 1 14 65 6 +8 0 1 15 64 7 +8 0 1 16 65 7 +8 0 1 17 64 8 +8 0 1 18 65 8 +8 0 1 19 64 9 +8 0 1 20 65 9 +8 0 1 21 64 10 +8 0 1 22 -1 -1 +8 0 1 23 65 10 +8 0 1 24 64 11 +8 0 1 25 65 11 +8 0 1 26 64 12 +8 0 1 27 65 12 +8 0 1 28 64 13 +8 0 1 29 65 13 +8 0 1 30 64 14 +8 0 1 31 65 14 +8 0 1 32 64 15 +8 0 1 33 65 15 +8 0 1 34 64 16 +8 0 1 35 65 16 +8 0 1 36 64 17 +8 0 1 37 65 17 +8 0 1 38 64 18 +8 0 1 39 65 18 +8 0 1 40 64 19 +8 0 1 41 65 19 +8 0 1 42 64 20 +8 0 1 43 65 20 +8 0 1 44 64 21 +8 0 1 45 -1 -1 +8 0 1 46 65 21 +8 0 1 47 64 22 +8 0 1 48 65 22 +8 0 1 49 64 23 +8 0 1 50 65 23 +8 0 1 51 64 24 +8 0 1 52 65 24 +8 0 1 53 64 25 +8 0 1 54 65 25 +8 0 1 55 64 26 +8 0 1 56 -1 -1 +8 0 1 57 65 26 +8 0 1 58 64 27 +8 0 1 59 65 27 +8 0 1 60 64 28 +8 0 1 61 65 28 +8 0 1 62 64 29 +8 0 1 63 65 29 +8 0 1 64 64 30 +8 0 1 65 65 30 +8 0 1 66 64 31 +8 0 1 67 65 31 +8 0 2 0 66 32 +8 0 2 1 67 32 +8 0 2 2 66 33 +8 0 2 3 67 33 +8 0 2 4 66 34 +8 0 2 5 67 34 +8 0 2 6 66 35 +8 0 2 7 67 35 +8 0 2 8 66 36 +8 0 2 9 67 36 +8 0 2 10 66 37 +8 0 2 11 -1 -1 +8 0 2 12 67 37 +8 0 2 13 66 38 +8 0 2 14 67 38 +8 0 2 15 66 39 +8 0 2 16 67 39 +8 0 2 17 66 40 +8 0 2 18 67 40 +8 0 2 19 66 41 +8 0 2 20 67 41 +8 0 2 21 66 42 +8 0 2 22 -1 -1 +8 0 2 23 67 42 +8 0 2 24 66 43 +8 0 2 25 67 43 +8 0 2 26 66 44 +8 0 2 27 67 44 +8 0 2 28 66 45 +8 0 2 29 67 45 +8 0 2 30 66 46 +8 0 2 31 67 46 +8 0 2 32 66 47 +8 0 2 33 67 47 +8 0 2 34 66 48 +8 0 2 35 67 48 +8 0 2 36 66 49 +8 0 2 37 67 49 +8 0 2 38 66 50 +8 0 2 39 67 50 +8 0 2 40 66 51 +8 0 2 41 67 51 +8 0 2 42 66 52 +8 0 2 43 67 52 +8 0 2 44 66 53 +8 0 2 45 -1 -1 +8 0 2 46 67 53 +8 0 2 47 66 54 +8 0 2 48 67 54 +8 0 2 49 66 55 +8 0 2 50 67 55 +8 0 2 51 66 56 +8 0 2 52 67 56 +8 0 2 53 66 57 +8 0 2 54 67 57 +8 0 2 55 66 58 +8 0 2 56 -1 -1 +8 0 2 57 67 58 +8 0 2 58 66 59 +8 0 2 59 67 59 +8 0 2 60 66 60 +8 0 2 61 67 60 +8 0 2 62 66 61 +8 0 2 63 67 61 +8 0 2 64 66 62 +8 0 2 65 67 62 +8 0 2 66 66 63 +8 0 2 67 67 63 +8 0 3 0 66 0 +8 0 3 1 67 0 +8 0 3 2 66 1 +8 0 3 3 67 1 +8 0 3 4 66 2 +8 0 3 5 67 2 +8 0 3 6 66 3 +8 0 3 7 67 3 +8 0 3 8 66 4 +8 0 3 9 67 4 +8 0 3 10 66 5 +8 0 3 11 -1 -1 +8 0 3 12 67 5 +8 0 3 13 66 6 +8 0 3 14 67 6 +8 0 3 15 66 7 +8 0 3 16 67 7 +8 0 3 17 66 8 +8 0 3 18 67 8 +8 0 3 19 66 9 +8 0 3 20 67 9 +8 0 3 21 66 10 +8 0 3 22 -1 -1 +8 0 3 23 67 10 +8 0 3 24 66 11 +8 0 3 25 67 11 +8 0 3 26 66 12 +8 0 3 27 67 12 +8 0 3 28 66 13 +8 0 3 29 67 13 +8 0 3 30 66 14 +8 0 3 31 67 14 +8 0 3 32 66 15 +8 0 3 33 67 15 +8 0 3 34 66 16 +8 0 3 35 67 16 +8 0 3 36 66 17 +8 0 3 37 67 17 +8 0 3 38 66 18 +8 0 3 39 67 18 +8 0 3 40 66 19 +8 0 3 41 67 19 +8 0 3 42 66 20 +8 0 3 43 67 20 +8 0 3 44 66 21 +8 0 3 45 -1 -1 +8 0 3 46 67 21 +8 0 3 47 66 22 +8 0 3 48 67 22 +8 0 3 49 66 23 +8 0 3 50 67 23 +8 0 3 51 66 24 +8 0 3 52 67 24 +8 0 3 53 66 25 +8 0 3 54 67 25 +8 0 3 55 66 26 +8 0 3 56 -1 -1 +8 0 3 57 67 26 +8 0 3 58 66 27 +8 0 3 59 67 27 +8 0 3 60 66 28 +8 0 3 61 67 28 +8 0 3 62 66 29 +8 0 3 63 67 29 +8 0 3 64 66 30 +8 0 3 65 67 30 +8 0 3 66 66 31 +8 0 3 67 67 31 +8 1 0 0 67 95 +8 1 0 1 66 95 +8 1 0 2 67 94 +8 1 0 3 66 94 +8 1 0 4 67 93 +8 1 0 5 66 93 +8 1 0 6 67 92 +8 1 0 7 66 92 +8 1 0 8 67 91 +8 1 0 9 66 91 +8 1 0 10 67 90 +8 1 0 11 -1 -1 +8 1 0 12 66 90 +8 1 0 13 67 89 +8 1 0 14 66 89 +8 1 0 15 67 88 +8 1 0 16 66 88 +8 1 0 17 67 87 +8 1 0 18 66 87 +8 1 0 19 67 86 +8 1 0 20 66 86 +8 1 0 21 67 85 +8 1 0 22 -1 -1 +8 1 0 23 66 85 +8 1 0 24 67 84 +8 1 0 25 66 84 +8 1 0 26 67 83 +8 1 0 27 66 83 +8 1 0 28 67 82 +8 1 0 29 66 82 +8 1 0 30 67 81 +8 1 0 31 66 81 +8 1 0 32 67 80 +8 1 0 33 66 80 +8 1 0 34 67 79 +8 1 0 35 66 79 +8 1 0 36 67 78 +8 1 0 37 66 78 +8 1 0 38 67 77 +8 1 0 39 66 77 +8 1 0 40 67 76 +8 1 0 41 66 76 +8 1 0 42 67 75 +8 1 0 43 66 75 +8 1 0 44 67 74 +8 1 0 45 -1 -1 +8 1 0 46 66 74 +8 1 0 47 67 73 +8 1 0 48 66 73 +8 1 0 49 67 72 +8 1 0 50 66 72 +8 1 0 51 67 71 +8 1 0 52 66 71 +8 1 0 53 67 70 +8 1 0 54 66 70 +8 1 0 55 67 69 +8 1 0 56 -1 -1 +8 1 0 57 66 69 +8 1 0 58 67 68 +8 1 0 59 66 68 +8 1 0 60 67 67 +8 1 0 61 66 67 +8 1 0 62 67 66 +8 1 0 63 66 66 +8 1 0 64 67 65 +8 1 0 65 66 65 +8 1 0 66 67 64 +8 1 0 67 66 64 +8 1 1 0 67 127 +8 1 1 1 66 127 +8 1 1 2 67 126 +8 1 1 3 66 126 +8 1 1 4 67 125 +8 1 1 5 66 125 +8 1 1 6 67 124 +8 1 1 7 66 124 +8 1 1 8 67 123 +8 1 1 9 66 123 +8 1 1 10 67 122 +8 1 1 11 -1 -1 +8 1 1 12 66 122 +8 1 1 13 67 121 +8 1 1 14 66 121 +8 1 1 15 67 120 +8 1 1 16 66 120 +8 1 1 17 67 119 +8 1 1 18 66 119 +8 1 1 19 67 118 +8 1 1 20 66 118 +8 1 1 21 67 117 +8 1 1 22 -1 -1 +8 1 1 23 66 117 +8 1 1 24 67 116 +8 1 1 25 66 116 +8 1 1 26 67 115 +8 1 1 27 66 115 +8 1 1 28 67 114 +8 1 1 29 66 114 +8 1 1 30 67 113 +8 1 1 31 66 113 +8 1 1 32 67 112 +8 1 1 33 66 112 +8 1 1 34 67 111 +8 1 1 35 66 111 +8 1 1 36 67 110 +8 1 1 37 66 110 +8 1 1 38 67 109 +8 1 1 39 66 109 +8 1 1 40 67 108 +8 1 1 41 66 108 +8 1 1 42 67 107 +8 1 1 43 66 107 +8 1 1 44 67 106 +8 1 1 45 -1 -1 +8 1 1 46 66 106 +8 1 1 47 67 105 +8 1 1 48 66 105 +8 1 1 49 67 104 +8 1 1 50 66 104 +8 1 1 51 67 103 +8 1 1 52 66 103 +8 1 1 53 67 102 +8 1 1 54 66 102 +8 1 1 55 67 101 +8 1 1 56 -1 -1 +8 1 1 57 66 101 +8 1 1 58 67 100 +8 1 1 59 66 100 +8 1 1 60 67 99 +8 1 1 61 66 99 +8 1 1 62 67 98 +8 1 1 63 66 98 +8 1 1 64 67 97 +8 1 1 65 66 97 +8 1 1 66 67 96 +8 1 1 67 66 96 +8 1 2 0 65 95 +8 1 2 1 64 95 +8 1 2 2 65 94 +8 1 2 3 64 94 +8 1 2 4 65 93 +8 1 2 5 64 93 +8 1 2 6 65 92 +8 1 2 7 64 92 +8 1 2 8 65 91 +8 1 2 9 64 91 +8 1 2 10 65 90 +8 1 2 11 -1 -1 +8 1 2 12 64 90 +8 1 2 13 65 89 +8 1 2 14 64 89 +8 1 2 15 65 88 +8 1 2 16 64 88 +8 1 2 17 65 87 +8 1 2 18 64 87 +8 1 2 19 65 86 +8 1 2 20 64 86 +8 1 2 21 65 85 +8 1 2 22 -1 -1 +8 1 2 23 64 85 +8 1 2 24 65 84 +8 1 2 25 64 84 +8 1 2 26 65 83 +8 1 2 27 64 83 +8 1 2 28 65 82 +8 1 2 29 64 82 +8 1 2 30 65 81 +8 1 2 31 64 81 +8 1 2 32 65 80 +8 1 2 33 64 80 +8 1 2 34 65 79 +8 1 2 35 64 79 +8 1 2 36 65 78 +8 1 2 37 64 78 +8 1 2 38 65 77 +8 1 2 39 64 77 +8 1 2 40 65 76 +8 1 2 41 64 76 +8 1 2 42 65 75 +8 1 2 43 64 75 +8 1 2 44 65 74 +8 1 2 45 -1 -1 +8 1 2 46 64 74 +8 1 2 47 65 73 +8 1 2 48 64 73 +8 1 2 49 65 72 +8 1 2 50 64 72 +8 1 2 51 65 71 +8 1 2 52 64 71 +8 1 2 53 65 70 +8 1 2 54 64 70 +8 1 2 55 65 69 +8 1 2 56 -1 -1 +8 1 2 57 64 69 +8 1 2 58 65 68 +8 1 2 59 64 68 +8 1 2 60 65 67 +8 1 2 61 64 67 +8 1 2 62 65 66 +8 1 2 63 64 66 +8 1 2 64 65 65 +8 1 2 65 64 65 +8 1 2 66 65 64 +8 1 2 67 64 64 +8 1 3 0 65 127 +8 1 3 1 64 127 +8 1 3 2 65 126 +8 1 3 3 64 126 +8 1 3 4 65 125 +8 1 3 5 64 125 +8 1 3 6 65 124 +8 1 3 7 64 124 +8 1 3 8 65 123 +8 1 3 9 64 123 +8 1 3 10 65 122 +8 1 3 11 -1 -1 +8 1 3 12 64 122 +8 1 3 13 65 121 +8 1 3 14 64 121 +8 1 3 15 65 120 +8 1 3 16 64 120 +8 1 3 17 65 119 +8 1 3 18 64 119 +8 1 3 19 65 118 +8 1 3 20 64 118 +8 1 3 21 65 117 +8 1 3 22 -1 -1 +8 1 3 23 64 117 +8 1 3 24 65 116 +8 1 3 25 64 116 +8 1 3 26 65 115 +8 1 3 27 64 115 +8 1 3 28 65 114 +8 1 3 29 64 114 +8 1 3 30 65 113 +8 1 3 31 64 113 +8 1 3 32 65 112 +8 1 3 33 64 112 +8 1 3 34 65 111 +8 1 3 35 64 111 +8 1 3 36 65 110 +8 1 3 37 64 110 +8 1 3 38 65 109 +8 1 3 39 64 109 +8 1 3 40 65 108 +8 1 3 41 64 108 +8 1 3 42 65 107 +8 1 3 43 64 107 +8 1 3 44 65 106 +8 1 3 45 -1 -1 +8 1 3 46 64 106 +8 1 3 47 65 105 +8 1 3 48 64 105 +8 1 3 49 65 104 +8 1 3 50 64 104 +8 1 3 51 65 103 +8 1 3 52 64 103 +8 1 3 53 65 102 +8 1 3 54 64 102 +8 1 3 55 65 101 +8 1 3 56 -1 -1 +8 1 3 57 64 101 +8 1 3 58 65 100 +8 1 3 59 64 100 +8 1 3 60 65 99 +8 1 3 61 64 99 +8 1 3 62 65 98 +8 1 3 63 64 98 +8 1 3 64 65 97 +8 1 3 65 64 97 +8 1 3 66 65 96 +8 1 3 67 64 96 +8 2 0 0 68 32 +8 2 0 1 69 32 +8 2 0 2 68 33 +8 2 0 3 69 33 +8 2 0 4 68 34 +8 2 0 5 69 34 +8 2 0 6 68 35 +8 2 0 7 69 35 +8 2 0 8 68 36 +8 2 0 9 69 36 +8 2 0 10 68 37 +8 2 0 11 -1 -1 +8 2 0 12 69 37 +8 2 0 13 68 38 +8 2 0 14 69 38 +8 2 0 15 68 39 +8 2 0 16 69 39 +8 2 0 17 68 40 +8 2 0 18 69 40 +8 2 0 19 68 41 +8 2 0 20 69 41 +8 2 0 21 68 42 +8 2 0 22 -1 -1 +8 2 0 23 69 42 +8 2 0 24 68 43 +8 2 0 25 69 43 +8 2 0 26 68 44 +8 2 0 27 69 44 +8 2 0 28 68 45 +8 2 0 29 69 45 +8 2 0 30 68 46 +8 2 0 31 69 46 +8 2 0 32 68 47 +8 2 0 33 69 47 +8 2 0 34 68 48 +8 2 0 35 69 48 +8 2 0 36 68 49 +8 2 0 37 69 49 +8 2 0 38 68 50 +8 2 0 39 69 50 +8 2 0 40 68 51 +8 2 0 41 69 51 +8 2 0 42 68 52 +8 2 0 43 69 52 +8 2 0 44 68 53 +8 2 0 45 -1 -1 +8 2 0 46 69 53 +8 2 0 47 68 54 +8 2 0 48 69 54 +8 2 0 49 68 55 +8 2 0 50 69 55 +8 2 0 51 68 56 +8 2 0 52 69 56 +8 2 0 53 68 57 +8 2 0 54 69 57 +8 2 0 55 68 58 +8 2 0 56 -1 -1 +8 2 0 57 69 58 +8 2 0 58 68 59 +8 2 0 59 69 59 +8 2 0 60 68 60 +8 2 0 61 69 60 +8 2 0 62 68 61 +8 2 0 63 69 61 +8 2 0 64 68 62 +8 2 0 65 69 62 +8 2 0 66 68 63 +8 2 0 67 69 63 +8 2 1 0 68 0 +8 2 1 1 69 0 +8 2 1 2 68 1 +8 2 1 3 69 1 +8 2 1 4 68 2 +8 2 1 5 69 2 +8 2 1 6 68 3 +8 2 1 7 69 3 +8 2 1 8 68 4 +8 2 1 9 69 4 +8 2 1 10 68 5 +8 2 1 11 -1 -1 +8 2 1 12 69 5 +8 2 1 13 68 6 +8 2 1 14 69 6 +8 2 1 15 68 7 +8 2 1 16 69 7 +8 2 1 17 68 8 +8 2 1 18 69 8 +8 2 1 19 68 9 +8 2 1 20 69 9 +8 2 1 21 68 10 +8 2 1 22 -1 -1 +8 2 1 23 69 10 +8 2 1 24 68 11 +8 2 1 25 69 11 +8 2 1 26 68 12 +8 2 1 27 69 12 +8 2 1 28 68 13 +8 2 1 29 69 13 +8 2 1 30 68 14 +8 2 1 31 69 14 +8 2 1 32 68 15 +8 2 1 33 69 15 +8 2 1 34 68 16 +8 2 1 35 69 16 +8 2 1 36 68 17 +8 2 1 37 69 17 +8 2 1 38 68 18 +8 2 1 39 69 18 +8 2 1 40 68 19 +8 2 1 41 69 19 +8 2 1 42 68 20 +8 2 1 43 69 20 +8 2 1 44 68 21 +8 2 1 45 -1 -1 +8 2 1 46 69 21 +8 2 1 47 68 22 +8 2 1 48 69 22 +8 2 1 49 68 23 +8 2 1 50 69 23 +8 2 1 51 68 24 +8 2 1 52 69 24 +8 2 1 53 68 25 +8 2 1 54 69 25 +8 2 1 55 68 26 +8 2 1 56 -1 -1 +8 2 1 57 69 26 +8 2 1 58 68 27 +8 2 1 59 69 27 +8 2 1 60 68 28 +8 2 1 61 69 28 +8 2 1 62 68 29 +8 2 1 63 69 29 +8 2 1 64 68 30 +8 2 1 65 69 30 +8 2 1 66 68 31 +8 2 1 67 69 31 +8 2 2 0 70 32 +8 2 2 1 71 32 +8 2 2 2 70 33 +8 2 2 3 71 33 +8 2 2 4 70 34 +8 2 2 5 71 34 +8 2 2 6 70 35 +8 2 2 7 71 35 +8 2 2 8 70 36 +8 2 2 9 71 36 +8 2 2 10 70 37 +8 2 2 11 -1 -1 +8 2 2 12 71 37 +8 2 2 13 70 38 +8 2 2 14 71 38 +8 2 2 15 70 39 +8 2 2 16 71 39 +8 2 2 17 70 40 +8 2 2 18 71 40 +8 2 2 19 70 41 +8 2 2 20 71 41 +8 2 2 21 70 42 +8 2 2 22 -1 -1 +8 2 2 23 71 42 +8 2 2 24 70 43 +8 2 2 25 71 43 +8 2 2 26 70 44 +8 2 2 27 71 44 +8 2 2 28 70 45 +8 2 2 29 71 45 +8 2 2 30 70 46 +8 2 2 31 71 46 +8 2 2 32 70 47 +8 2 2 33 71 47 +8 2 2 34 70 48 +8 2 2 35 71 48 +8 2 2 36 70 49 +8 2 2 37 71 49 +8 2 2 38 70 50 +8 2 2 39 71 50 +8 2 2 40 70 51 +8 2 2 41 71 51 +8 2 2 42 70 52 +8 2 2 43 71 52 +8 2 2 44 70 53 +8 2 2 45 -1 -1 +8 2 2 46 71 53 +8 2 2 47 70 54 +8 2 2 48 71 54 +8 2 2 49 70 55 +8 2 2 50 71 55 +8 2 2 51 70 56 +8 2 2 52 71 56 +8 2 2 53 70 57 +8 2 2 54 71 57 +8 2 2 55 70 58 +8 2 2 56 -1 -1 +8 2 2 57 71 58 +8 2 2 58 70 59 +8 2 2 59 71 59 +8 2 2 60 70 60 +8 2 2 61 71 60 +8 2 2 62 70 61 +8 2 2 63 71 61 +8 2 2 64 70 62 +8 2 2 65 71 62 +8 2 2 66 70 63 +8 2 2 67 71 63 +8 2 3 0 70 0 +8 2 3 1 71 0 +8 2 3 2 70 1 +8 2 3 3 71 1 +8 2 3 4 70 2 +8 2 3 5 71 2 +8 2 3 6 70 3 +8 2 3 7 71 3 +8 2 3 8 70 4 +8 2 3 9 71 4 +8 2 3 10 70 5 +8 2 3 11 -1 -1 +8 2 3 12 71 5 +8 2 3 13 70 6 +8 2 3 14 71 6 +8 2 3 15 70 7 +8 2 3 16 71 7 +8 2 3 17 70 8 +8 2 3 18 71 8 +8 2 3 19 70 9 +8 2 3 20 71 9 +8 2 3 21 70 10 +8 2 3 22 -1 -1 +8 2 3 23 71 10 +8 2 3 24 70 11 +8 2 3 25 71 11 +8 2 3 26 70 12 +8 2 3 27 71 12 +8 2 3 28 70 13 +8 2 3 29 71 13 +8 2 3 30 70 14 +8 2 3 31 71 14 +8 2 3 32 70 15 +8 2 3 33 71 15 +8 2 3 34 70 16 +8 2 3 35 71 16 +8 2 3 36 70 17 +8 2 3 37 71 17 +8 2 3 38 70 18 +8 2 3 39 71 18 +8 2 3 40 70 19 +8 2 3 41 71 19 +8 2 3 42 70 20 +8 2 3 43 71 20 +8 2 3 44 70 21 +8 2 3 45 -1 -1 +8 2 3 46 71 21 +8 2 3 47 70 22 +8 2 3 48 71 22 +8 2 3 49 70 23 +8 2 3 50 71 23 +8 2 3 51 70 24 +8 2 3 52 71 24 +8 2 3 53 70 25 +8 2 3 54 71 25 +8 2 3 55 70 26 +8 2 3 56 -1 -1 +8 2 3 57 71 26 +8 2 3 58 70 27 +8 2 3 59 71 27 +8 2 3 60 70 28 +8 2 3 61 71 28 +8 2 3 62 70 29 +8 2 3 63 71 29 +8 2 3 64 70 30 +8 2 3 65 71 30 +8 2 3 66 70 31 +8 2 3 67 71 31 +8 3 0 0 71 95 +8 3 0 1 70 95 +8 3 0 2 71 94 +8 3 0 3 70 94 +8 3 0 4 71 93 +8 3 0 5 70 93 +8 3 0 6 71 92 +8 3 0 7 70 92 +8 3 0 8 71 91 +8 3 0 9 70 91 +8 3 0 10 71 90 +8 3 0 11 -1 -1 +8 3 0 12 70 90 +8 3 0 13 71 89 +8 3 0 14 70 89 +8 3 0 15 71 88 +8 3 0 16 70 88 +8 3 0 17 71 87 +8 3 0 18 70 87 +8 3 0 19 71 86 +8 3 0 20 70 86 +8 3 0 21 71 85 +8 3 0 22 -1 -1 +8 3 0 23 70 85 +8 3 0 24 71 84 +8 3 0 25 70 84 +8 3 0 26 71 83 +8 3 0 27 70 83 +8 3 0 28 71 82 +8 3 0 29 70 82 +8 3 0 30 71 81 +8 3 0 31 70 81 +8 3 0 32 71 80 +8 3 0 33 70 80 +8 3 0 34 71 79 +8 3 0 35 70 79 +8 3 0 36 71 78 +8 3 0 37 70 78 +8 3 0 38 71 77 +8 3 0 39 70 77 +8 3 0 40 71 76 +8 3 0 41 70 76 +8 3 0 42 71 75 +8 3 0 43 70 75 +8 3 0 44 71 74 +8 3 0 45 -1 -1 +8 3 0 46 70 74 +8 3 0 47 71 73 +8 3 0 48 70 73 +8 3 0 49 71 72 +8 3 0 50 70 72 +8 3 0 51 71 71 +8 3 0 52 70 71 +8 3 0 53 71 70 +8 3 0 54 70 70 +8 3 0 55 71 69 +8 3 0 56 -1 -1 +8 3 0 57 70 69 +8 3 0 58 71 68 +8 3 0 59 70 68 +8 3 0 60 71 67 +8 3 0 61 70 67 +8 3 0 62 71 66 +8 3 0 63 70 66 +8 3 0 64 71 65 +8 3 0 65 70 65 +8 3 0 66 71 64 +8 3 0 67 70 64 +8 3 1 0 71 127 +8 3 1 1 70 127 +8 3 1 2 71 126 +8 3 1 3 70 126 +8 3 1 4 71 125 +8 3 1 5 70 125 +8 3 1 6 71 124 +8 3 1 7 70 124 +8 3 1 8 71 123 +8 3 1 9 70 123 +8 3 1 10 71 122 +8 3 1 11 -1 -1 +8 3 1 12 70 122 +8 3 1 13 71 121 +8 3 1 14 70 121 +8 3 1 15 71 120 +8 3 1 16 70 120 +8 3 1 17 71 119 +8 3 1 18 70 119 +8 3 1 19 71 118 +8 3 1 20 70 118 +8 3 1 21 71 117 +8 3 1 22 -1 -1 +8 3 1 23 70 117 +8 3 1 24 71 116 +8 3 1 25 70 116 +8 3 1 26 71 115 +8 3 1 27 70 115 +8 3 1 28 71 114 +8 3 1 29 70 114 +8 3 1 30 71 113 +8 3 1 31 70 113 +8 3 1 32 71 112 +8 3 1 33 70 112 +8 3 1 34 71 111 +8 3 1 35 70 111 +8 3 1 36 71 110 +8 3 1 37 70 110 +8 3 1 38 71 109 +8 3 1 39 70 109 +8 3 1 40 71 108 +8 3 1 41 70 108 +8 3 1 42 71 107 +8 3 1 43 70 107 +8 3 1 44 71 106 +8 3 1 45 -1 -1 +8 3 1 46 70 106 +8 3 1 47 71 105 +8 3 1 48 70 105 +8 3 1 49 71 104 +8 3 1 50 70 104 +8 3 1 51 71 103 +8 3 1 52 70 103 +8 3 1 53 71 102 +8 3 1 54 70 102 +8 3 1 55 71 101 +8 3 1 56 -1 -1 +8 3 1 57 70 101 +8 3 1 58 71 100 +8 3 1 59 70 100 +8 3 1 60 71 99 +8 3 1 61 70 99 +8 3 1 62 71 98 +8 3 1 63 70 98 +8 3 1 64 71 97 +8 3 1 65 70 97 +8 3 1 66 71 96 +8 3 1 67 70 96 +8 3 2 0 69 95 +8 3 2 1 68 95 +8 3 2 2 69 94 +8 3 2 3 68 94 +8 3 2 4 69 93 +8 3 2 5 68 93 +8 3 2 6 69 92 +8 3 2 7 68 92 +8 3 2 8 69 91 +8 3 2 9 68 91 +8 3 2 10 69 90 +8 3 2 11 -1 -1 +8 3 2 12 68 90 +8 3 2 13 69 89 +8 3 2 14 68 89 +8 3 2 15 69 88 +8 3 2 16 68 88 +8 3 2 17 69 87 +8 3 2 18 68 87 +8 3 2 19 69 86 +8 3 2 20 68 86 +8 3 2 21 69 85 +8 3 2 22 -1 -1 +8 3 2 23 68 85 +8 3 2 24 69 84 +8 3 2 25 68 84 +8 3 2 26 69 83 +8 3 2 27 68 83 +8 3 2 28 69 82 +8 3 2 29 68 82 +8 3 2 30 69 81 +8 3 2 31 68 81 +8 3 2 32 69 80 +8 3 2 33 68 80 +8 3 2 34 69 79 +8 3 2 35 68 79 +8 3 2 36 69 78 +8 3 2 37 68 78 +8 3 2 38 69 77 +8 3 2 39 68 77 +8 3 2 40 69 76 +8 3 2 41 68 76 +8 3 2 42 69 75 +8 3 2 43 68 75 +8 3 2 44 69 74 +8 3 2 45 -1 -1 +8 3 2 46 68 74 +8 3 2 47 69 73 +8 3 2 48 68 73 +8 3 2 49 69 72 +8 3 2 50 68 72 +8 3 2 51 69 71 +8 3 2 52 68 71 +8 3 2 53 69 70 +8 3 2 54 68 70 +8 3 2 55 69 69 +8 3 2 56 -1 -1 +8 3 2 57 68 69 +8 3 2 58 69 68 +8 3 2 59 68 68 +8 3 2 60 69 67 +8 3 2 61 68 67 +8 3 2 62 69 66 +8 3 2 63 68 66 +8 3 2 64 69 65 +8 3 2 65 68 65 +8 3 2 66 69 64 +8 3 2 67 68 64 +8 3 3 0 69 127 +8 3 3 1 68 127 +8 3 3 2 69 126 +8 3 3 3 68 126 +8 3 3 4 69 125 +8 3 3 5 68 125 +8 3 3 6 69 124 +8 3 3 7 68 124 +8 3 3 8 69 123 +8 3 3 9 68 123 +8 3 3 10 69 122 +8 3 3 11 -1 -1 +8 3 3 12 68 122 +8 3 3 13 69 121 +8 3 3 14 68 121 +8 3 3 15 69 120 +8 3 3 16 68 120 +8 3 3 17 69 119 +8 3 3 18 68 119 +8 3 3 19 69 118 +8 3 3 20 68 118 +8 3 3 21 69 117 +8 3 3 22 -1 -1 +8 3 3 23 68 117 +8 3 3 24 69 116 +8 3 3 25 68 116 +8 3 3 26 69 115 +8 3 3 27 68 115 +8 3 3 28 69 114 +8 3 3 29 68 114 +8 3 3 30 69 113 +8 3 3 31 68 113 +8 3 3 32 69 112 +8 3 3 33 68 112 +8 3 3 34 69 111 +8 3 3 35 68 111 +8 3 3 36 69 110 +8 3 3 37 68 110 +8 3 3 38 69 109 +8 3 3 39 68 109 +8 3 3 40 69 108 +8 3 3 41 68 108 +8 3 3 42 69 107 +8 3 3 43 68 107 +8 3 3 44 69 106 +8 3 3 45 -1 -1 +8 3 3 46 68 106 +8 3 3 47 69 105 +8 3 3 48 68 105 +8 3 3 49 69 104 +8 3 3 50 68 104 +8 3 3 51 69 103 +8 3 3 52 68 103 +8 3 3 53 69 102 +8 3 3 54 68 102 +8 3 3 55 69 101 +8 3 3 56 -1 -1 +8 3 3 57 68 101 +8 3 3 58 69 100 +8 3 3 59 68 100 +8 3 3 60 69 99 +8 3 3 61 68 99 +8 3 3 62 69 98 +8 3 3 63 68 98 +8 3 3 64 69 97 +8 3 3 65 68 97 +8 3 3 66 69 96 +8 3 3 67 68 96 +9 0 0 0 72 32 +9 0 0 1 73 32 +9 0 0 2 72 33 +9 0 0 3 73 33 +9 0 0 4 72 34 +9 0 0 5 73 34 +9 0 0 6 72 35 +9 0 0 7 73 35 +9 0 0 8 72 36 +9 0 0 9 73 36 +9 0 0 10 72 37 +9 0 0 11 -1 -1 +9 0 0 12 73 37 +9 0 0 13 72 38 +9 0 0 14 73 38 +9 0 0 15 72 39 +9 0 0 16 73 39 +9 0 0 17 72 40 +9 0 0 18 73 40 +9 0 0 19 72 41 +9 0 0 20 73 41 +9 0 0 21 72 42 +9 0 0 22 -1 -1 +9 0 0 23 73 42 +9 0 0 24 72 43 +9 0 0 25 73 43 +9 0 0 26 72 44 +9 0 0 27 73 44 +9 0 0 28 72 45 +9 0 0 29 73 45 +9 0 0 30 72 46 +9 0 0 31 73 46 +9 0 0 32 72 47 +9 0 0 33 73 47 +9 0 0 34 72 48 +9 0 0 35 73 48 +9 0 0 36 72 49 +9 0 0 37 73 49 +9 0 0 38 72 50 +9 0 0 39 73 50 +9 0 0 40 72 51 +9 0 0 41 73 51 +9 0 0 42 72 52 +9 0 0 43 73 52 +9 0 0 44 72 53 +9 0 0 45 -1 -1 +9 0 0 46 73 53 +9 0 0 47 72 54 +9 0 0 48 73 54 +9 0 0 49 72 55 +9 0 0 50 73 55 +9 0 0 51 72 56 +9 0 0 52 73 56 +9 0 0 53 72 57 +9 0 0 54 73 57 +9 0 0 55 72 58 +9 0 0 56 -1 -1 +9 0 0 57 73 58 +9 0 0 58 72 59 +9 0 0 59 73 59 +9 0 0 60 72 60 +9 0 0 61 73 60 +9 0 0 62 72 61 +9 0 0 63 73 61 +9 0 0 64 72 62 +9 0 0 65 73 62 +9 0 0 66 72 63 +9 0 0 67 73 63 +9 0 1 0 72 0 +9 0 1 1 73 0 +9 0 1 2 72 1 +9 0 1 3 73 1 +9 0 1 4 72 2 +9 0 1 5 73 2 +9 0 1 6 72 3 +9 0 1 7 73 3 +9 0 1 8 72 4 +9 0 1 9 73 4 +9 0 1 10 72 5 +9 0 1 11 -1 -1 +9 0 1 12 73 5 +9 0 1 13 72 6 +9 0 1 14 73 6 +9 0 1 15 72 7 +9 0 1 16 73 7 +9 0 1 17 72 8 +9 0 1 18 73 8 +9 0 1 19 72 9 +9 0 1 20 73 9 +9 0 1 21 72 10 +9 0 1 22 -1 -1 +9 0 1 23 73 10 +9 0 1 24 72 11 +9 0 1 25 73 11 +9 0 1 26 72 12 +9 0 1 27 73 12 +9 0 1 28 72 13 +9 0 1 29 73 13 +9 0 1 30 72 14 +9 0 1 31 73 14 +9 0 1 32 72 15 +9 0 1 33 73 15 +9 0 1 34 72 16 +9 0 1 35 73 16 +9 0 1 36 72 17 +9 0 1 37 73 17 +9 0 1 38 72 18 +9 0 1 39 73 18 +9 0 1 40 72 19 +9 0 1 41 73 19 +9 0 1 42 72 20 +9 0 1 43 73 20 +9 0 1 44 72 21 +9 0 1 45 -1 -1 +9 0 1 46 73 21 +9 0 1 47 72 22 +9 0 1 48 73 22 +9 0 1 49 72 23 +9 0 1 50 73 23 +9 0 1 51 72 24 +9 0 1 52 73 24 +9 0 1 53 72 25 +9 0 1 54 73 25 +9 0 1 55 72 26 +9 0 1 56 -1 -1 +9 0 1 57 73 26 +9 0 1 58 72 27 +9 0 1 59 73 27 +9 0 1 60 72 28 +9 0 1 61 73 28 +9 0 1 62 72 29 +9 0 1 63 73 29 +9 0 1 64 72 30 +9 0 1 65 73 30 +9 0 1 66 72 31 +9 0 1 67 73 31 +9 0 2 0 74 32 +9 0 2 1 75 32 +9 0 2 2 74 33 +9 0 2 3 75 33 +9 0 2 4 74 34 +9 0 2 5 75 34 +9 0 2 6 74 35 +9 0 2 7 75 35 +9 0 2 8 74 36 +9 0 2 9 75 36 +9 0 2 10 74 37 +9 0 2 11 -1 -1 +9 0 2 12 75 37 +9 0 2 13 74 38 +9 0 2 14 75 38 +9 0 2 15 74 39 +9 0 2 16 75 39 +9 0 2 17 74 40 +9 0 2 18 75 40 +9 0 2 19 74 41 +9 0 2 20 75 41 +9 0 2 21 74 42 +9 0 2 22 -1 -1 +9 0 2 23 75 42 +9 0 2 24 74 43 +9 0 2 25 75 43 +9 0 2 26 74 44 +9 0 2 27 75 44 +9 0 2 28 74 45 +9 0 2 29 75 45 +9 0 2 30 74 46 +9 0 2 31 75 46 +9 0 2 32 74 47 +9 0 2 33 75 47 +9 0 2 34 74 48 +9 0 2 35 75 48 +9 0 2 36 74 49 +9 0 2 37 75 49 +9 0 2 38 74 50 +9 0 2 39 75 50 +9 0 2 40 74 51 +9 0 2 41 75 51 +9 0 2 42 74 52 +9 0 2 43 75 52 +9 0 2 44 74 53 +9 0 2 45 -1 -1 +9 0 2 46 75 53 +9 0 2 47 74 54 +9 0 2 48 75 54 +9 0 2 49 74 55 +9 0 2 50 75 55 +9 0 2 51 74 56 +9 0 2 52 75 56 +9 0 2 53 74 57 +9 0 2 54 75 57 +9 0 2 55 74 58 +9 0 2 56 -1 -1 +9 0 2 57 75 58 +9 0 2 58 74 59 +9 0 2 59 75 59 +9 0 2 60 74 60 +9 0 2 61 75 60 +9 0 2 62 74 61 +9 0 2 63 75 61 +9 0 2 64 74 62 +9 0 2 65 75 62 +9 0 2 66 74 63 +9 0 2 67 75 63 +9 0 3 0 74 0 +9 0 3 1 75 0 +9 0 3 2 74 1 +9 0 3 3 75 1 +9 0 3 4 74 2 +9 0 3 5 75 2 +9 0 3 6 74 3 +9 0 3 7 75 3 +9 0 3 8 74 4 +9 0 3 9 75 4 +9 0 3 10 74 5 +9 0 3 11 -1 -1 +9 0 3 12 75 5 +9 0 3 13 74 6 +9 0 3 14 75 6 +9 0 3 15 74 7 +9 0 3 16 75 7 +9 0 3 17 74 8 +9 0 3 18 75 8 +9 0 3 19 74 9 +9 0 3 20 75 9 +9 0 3 21 74 10 +9 0 3 22 -1 -1 +9 0 3 23 75 10 +9 0 3 24 74 11 +9 0 3 25 75 11 +9 0 3 26 74 12 +9 0 3 27 75 12 +9 0 3 28 74 13 +9 0 3 29 75 13 +9 0 3 30 74 14 +9 0 3 31 75 14 +9 0 3 32 74 15 +9 0 3 33 75 15 +9 0 3 34 74 16 +9 0 3 35 75 16 +9 0 3 36 74 17 +9 0 3 37 75 17 +9 0 3 38 74 18 +9 0 3 39 75 18 +9 0 3 40 74 19 +9 0 3 41 75 19 +9 0 3 42 74 20 +9 0 3 43 75 20 +9 0 3 44 74 21 +9 0 3 45 -1 -1 +9 0 3 46 75 21 +9 0 3 47 74 22 +9 0 3 48 75 22 +9 0 3 49 74 23 +9 0 3 50 75 23 +9 0 3 51 74 24 +9 0 3 52 75 24 +9 0 3 53 74 25 +9 0 3 54 75 25 +9 0 3 55 74 26 +9 0 3 56 -1 -1 +9 0 3 57 75 26 +9 0 3 58 74 27 +9 0 3 59 75 27 +9 0 3 60 74 28 +9 0 3 61 75 28 +9 0 3 62 74 29 +9 0 3 63 75 29 +9 0 3 64 74 30 +9 0 3 65 75 30 +9 0 3 66 74 31 +9 0 3 67 75 31 +9 1 0 0 75 95 +9 1 0 1 74 95 +9 1 0 2 75 94 +9 1 0 3 74 94 +9 1 0 4 75 93 +9 1 0 5 74 93 +9 1 0 6 75 92 +9 1 0 7 74 92 +9 1 0 8 75 91 +9 1 0 9 74 91 +9 1 0 10 75 90 +9 1 0 11 -1 -1 +9 1 0 12 74 90 +9 1 0 13 75 89 +9 1 0 14 74 89 +9 1 0 15 75 88 +9 1 0 16 74 88 +9 1 0 17 75 87 +9 1 0 18 74 87 +9 1 0 19 75 86 +9 1 0 20 74 86 +9 1 0 21 75 85 +9 1 0 22 -1 -1 +9 1 0 23 74 85 +9 1 0 24 75 84 +9 1 0 25 74 84 +9 1 0 26 75 83 +9 1 0 27 74 83 +9 1 0 28 75 82 +9 1 0 29 74 82 +9 1 0 30 75 81 +9 1 0 31 74 81 +9 1 0 32 75 80 +9 1 0 33 74 80 +9 1 0 34 75 79 +9 1 0 35 74 79 +9 1 0 36 75 78 +9 1 0 37 74 78 +9 1 0 38 75 77 +9 1 0 39 74 77 +9 1 0 40 75 76 +9 1 0 41 74 76 +9 1 0 42 75 75 +9 1 0 43 74 75 +9 1 0 44 75 74 +9 1 0 45 -1 -1 +9 1 0 46 74 74 +9 1 0 47 75 73 +9 1 0 48 74 73 +9 1 0 49 75 72 +9 1 0 50 74 72 +9 1 0 51 75 71 +9 1 0 52 74 71 +9 1 0 53 75 70 +9 1 0 54 74 70 +9 1 0 55 75 69 +9 1 0 56 -1 -1 +9 1 0 57 74 69 +9 1 0 58 75 68 +9 1 0 59 74 68 +9 1 0 60 75 67 +9 1 0 61 74 67 +9 1 0 62 75 66 +9 1 0 63 74 66 +9 1 0 64 75 65 +9 1 0 65 74 65 +9 1 0 66 75 64 +9 1 0 67 74 64 +9 1 1 0 75 127 +9 1 1 1 74 127 +9 1 1 2 75 126 +9 1 1 3 74 126 +9 1 1 4 75 125 +9 1 1 5 74 125 +9 1 1 6 75 124 +9 1 1 7 74 124 +9 1 1 8 75 123 +9 1 1 9 74 123 +9 1 1 10 75 122 +9 1 1 11 -1 -1 +9 1 1 12 74 122 +9 1 1 13 75 121 +9 1 1 14 74 121 +9 1 1 15 75 120 +9 1 1 16 74 120 +9 1 1 17 75 119 +9 1 1 18 74 119 +9 1 1 19 75 118 +9 1 1 20 74 118 +9 1 1 21 75 117 +9 1 1 22 -1 -1 +9 1 1 23 74 117 +9 1 1 24 75 116 +9 1 1 25 74 116 +9 1 1 26 75 115 +9 1 1 27 74 115 +9 1 1 28 75 114 +9 1 1 29 74 114 +9 1 1 30 75 113 +9 1 1 31 74 113 +9 1 1 32 75 112 +9 1 1 33 74 112 +9 1 1 34 75 111 +9 1 1 35 74 111 +9 1 1 36 75 110 +9 1 1 37 74 110 +9 1 1 38 75 109 +9 1 1 39 74 109 +9 1 1 40 75 108 +9 1 1 41 74 108 +9 1 1 42 75 107 +9 1 1 43 74 107 +9 1 1 44 75 106 +9 1 1 45 -1 -1 +9 1 1 46 74 106 +9 1 1 47 75 105 +9 1 1 48 74 105 +9 1 1 49 75 104 +9 1 1 50 74 104 +9 1 1 51 75 103 +9 1 1 52 74 103 +9 1 1 53 75 102 +9 1 1 54 74 102 +9 1 1 55 75 101 +9 1 1 56 -1 -1 +9 1 1 57 74 101 +9 1 1 58 75 100 +9 1 1 59 74 100 +9 1 1 60 75 99 +9 1 1 61 74 99 +9 1 1 62 75 98 +9 1 1 63 74 98 +9 1 1 64 75 97 +9 1 1 65 74 97 +9 1 1 66 75 96 +9 1 1 67 74 96 +9 1 2 0 73 95 +9 1 2 1 72 95 +9 1 2 2 73 94 +9 1 2 3 72 94 +9 1 2 4 73 93 +9 1 2 5 72 93 +9 1 2 6 73 92 +9 1 2 7 72 92 +9 1 2 8 73 91 +9 1 2 9 72 91 +9 1 2 10 73 90 +9 1 2 11 -1 -1 +9 1 2 12 72 90 +9 1 2 13 73 89 +9 1 2 14 72 89 +9 1 2 15 73 88 +9 1 2 16 72 88 +9 1 2 17 73 87 +9 1 2 18 72 87 +9 1 2 19 73 86 +9 1 2 20 72 86 +9 1 2 21 73 85 +9 1 2 22 -1 -1 +9 1 2 23 72 85 +9 1 2 24 73 84 +9 1 2 25 72 84 +9 1 2 26 73 83 +9 1 2 27 72 83 +9 1 2 28 73 82 +9 1 2 29 72 82 +9 1 2 30 73 81 +9 1 2 31 72 81 +9 1 2 32 73 80 +9 1 2 33 72 80 +9 1 2 34 73 79 +9 1 2 35 72 79 +9 1 2 36 73 78 +9 1 2 37 72 78 +9 1 2 38 73 77 +9 1 2 39 72 77 +9 1 2 40 73 76 +9 1 2 41 72 76 +9 1 2 42 73 75 +9 1 2 43 72 75 +9 1 2 44 73 74 +9 1 2 45 -1 -1 +9 1 2 46 72 74 +9 1 2 47 73 73 +9 1 2 48 72 73 +9 1 2 49 73 72 +9 1 2 50 72 72 +9 1 2 51 73 71 +9 1 2 52 72 71 +9 1 2 53 73 70 +9 1 2 54 72 70 +9 1 2 55 73 69 +9 1 2 56 -1 -1 +9 1 2 57 72 69 +9 1 2 58 73 68 +9 1 2 59 72 68 +9 1 2 60 73 67 +9 1 2 61 72 67 +9 1 2 62 73 66 +9 1 2 63 72 66 +9 1 2 64 73 65 +9 1 2 65 72 65 +9 1 2 66 73 64 +9 1 2 67 72 64 +9 1 3 0 73 127 +9 1 3 1 72 127 +9 1 3 2 73 126 +9 1 3 3 72 126 +9 1 3 4 73 125 +9 1 3 5 72 125 +9 1 3 6 73 124 +9 1 3 7 72 124 +9 1 3 8 73 123 +9 1 3 9 72 123 +9 1 3 10 73 122 +9 1 3 11 -1 -1 +9 1 3 12 72 122 +9 1 3 13 73 121 +9 1 3 14 72 121 +9 1 3 15 73 120 +9 1 3 16 72 120 +9 1 3 17 73 119 +9 1 3 18 72 119 +9 1 3 19 73 118 +9 1 3 20 72 118 +9 1 3 21 73 117 +9 1 3 22 -1 -1 +9 1 3 23 72 117 +9 1 3 24 73 116 +9 1 3 25 72 116 +9 1 3 26 73 115 +9 1 3 27 72 115 +9 1 3 28 73 114 +9 1 3 29 72 114 +9 1 3 30 73 113 +9 1 3 31 72 113 +9 1 3 32 73 112 +9 1 3 33 72 112 +9 1 3 34 73 111 +9 1 3 35 72 111 +9 1 3 36 73 110 +9 1 3 37 72 110 +9 1 3 38 73 109 +9 1 3 39 72 109 +9 1 3 40 73 108 +9 1 3 41 72 108 +9 1 3 42 73 107 +9 1 3 43 72 107 +9 1 3 44 73 106 +9 1 3 45 -1 -1 +9 1 3 46 72 106 +9 1 3 47 73 105 +9 1 3 48 72 105 +9 1 3 49 73 104 +9 1 3 50 72 104 +9 1 3 51 73 103 +9 1 3 52 72 103 +9 1 3 53 73 102 +9 1 3 54 72 102 +9 1 3 55 73 101 +9 1 3 56 -1 -1 +9 1 3 57 72 101 +9 1 3 58 73 100 +9 1 3 59 72 100 +9 1 3 60 73 99 +9 1 3 61 72 99 +9 1 3 62 73 98 +9 1 3 63 72 98 +9 1 3 64 73 97 +9 1 3 65 72 97 +9 1 3 66 73 96 +9 1 3 67 72 96 +9 2 0 0 76 32 +9 2 0 1 77 32 +9 2 0 2 76 33 +9 2 0 3 77 33 +9 2 0 4 76 34 +9 2 0 5 77 34 +9 2 0 6 76 35 +9 2 0 7 77 35 +9 2 0 8 76 36 +9 2 0 9 77 36 +9 2 0 10 76 37 +9 2 0 11 -1 -1 +9 2 0 12 77 37 +9 2 0 13 76 38 +9 2 0 14 77 38 +9 2 0 15 76 39 +9 2 0 16 77 39 +9 2 0 17 76 40 +9 2 0 18 77 40 +9 2 0 19 76 41 +9 2 0 20 77 41 +9 2 0 21 76 42 +9 2 0 22 -1 -1 +9 2 0 23 77 42 +9 2 0 24 76 43 +9 2 0 25 77 43 +9 2 0 26 76 44 +9 2 0 27 77 44 +9 2 0 28 76 45 +9 2 0 29 77 45 +9 2 0 30 76 46 +9 2 0 31 77 46 +9 2 0 32 76 47 +9 2 0 33 77 47 +9 2 0 34 76 48 +9 2 0 35 77 48 +9 2 0 36 76 49 +9 2 0 37 77 49 +9 2 0 38 76 50 +9 2 0 39 77 50 +9 2 0 40 76 51 +9 2 0 41 77 51 +9 2 0 42 76 52 +9 2 0 43 77 52 +9 2 0 44 76 53 +9 2 0 45 -1 -1 +9 2 0 46 77 53 +9 2 0 47 76 54 +9 2 0 48 77 54 +9 2 0 49 76 55 +9 2 0 50 77 55 +9 2 0 51 76 56 +9 2 0 52 77 56 +9 2 0 53 76 57 +9 2 0 54 77 57 +9 2 0 55 76 58 +9 2 0 56 -1 -1 +9 2 0 57 77 58 +9 2 0 58 76 59 +9 2 0 59 77 59 +9 2 0 60 76 60 +9 2 0 61 77 60 +9 2 0 62 76 61 +9 2 0 63 77 61 +9 2 0 64 76 62 +9 2 0 65 77 62 +9 2 0 66 76 63 +9 2 0 67 77 63 +9 2 1 0 76 0 +9 2 1 1 77 0 +9 2 1 2 76 1 +9 2 1 3 77 1 +9 2 1 4 76 2 +9 2 1 5 77 2 +9 2 1 6 76 3 +9 2 1 7 77 3 +9 2 1 8 76 4 +9 2 1 9 77 4 +9 2 1 10 76 5 +9 2 1 11 -1 -1 +9 2 1 12 77 5 +9 2 1 13 76 6 +9 2 1 14 77 6 +9 2 1 15 76 7 +9 2 1 16 77 7 +9 2 1 17 76 8 +9 2 1 18 77 8 +9 2 1 19 76 9 +9 2 1 20 77 9 +9 2 1 21 76 10 +9 2 1 22 -1 -1 +9 2 1 23 77 10 +9 2 1 24 76 11 +9 2 1 25 77 11 +9 2 1 26 76 12 +9 2 1 27 77 12 +9 2 1 28 76 13 +9 2 1 29 77 13 +9 2 1 30 76 14 +9 2 1 31 77 14 +9 2 1 32 76 15 +9 2 1 33 77 15 +9 2 1 34 76 16 +9 2 1 35 77 16 +9 2 1 36 76 17 +9 2 1 37 77 17 +9 2 1 38 76 18 +9 2 1 39 77 18 +9 2 1 40 76 19 +9 2 1 41 77 19 +9 2 1 42 76 20 +9 2 1 43 77 20 +9 2 1 44 76 21 +9 2 1 45 -1 -1 +9 2 1 46 77 21 +9 2 1 47 76 22 +9 2 1 48 77 22 +9 2 1 49 76 23 +9 2 1 50 77 23 +9 2 1 51 76 24 +9 2 1 52 77 24 +9 2 1 53 76 25 +9 2 1 54 77 25 +9 2 1 55 76 26 +9 2 1 56 -1 -1 +9 2 1 57 77 26 +9 2 1 58 76 27 +9 2 1 59 77 27 +9 2 1 60 76 28 +9 2 1 61 77 28 +9 2 1 62 76 29 +9 2 1 63 77 29 +9 2 1 64 76 30 +9 2 1 65 77 30 +9 2 1 66 76 31 +9 2 1 67 77 31 +9 2 2 0 78 32 +9 2 2 1 79 32 +9 2 2 2 78 33 +9 2 2 3 79 33 +9 2 2 4 78 34 +9 2 2 5 79 34 +9 2 2 6 78 35 +9 2 2 7 79 35 +9 2 2 8 78 36 +9 2 2 9 79 36 +9 2 2 10 78 37 +9 2 2 11 -1 -1 +9 2 2 12 79 37 +9 2 2 13 78 38 +9 2 2 14 79 38 +9 2 2 15 78 39 +9 2 2 16 79 39 +9 2 2 17 78 40 +9 2 2 18 79 40 +9 2 2 19 78 41 +9 2 2 20 79 41 +9 2 2 21 78 42 +9 2 2 22 -1 -1 +9 2 2 23 79 42 +9 2 2 24 78 43 +9 2 2 25 79 43 +9 2 2 26 78 44 +9 2 2 27 79 44 +9 2 2 28 78 45 +9 2 2 29 79 45 +9 2 2 30 78 46 +9 2 2 31 79 46 +9 2 2 32 78 47 +9 2 2 33 79 47 +9 2 2 34 78 48 +9 2 2 35 79 48 +9 2 2 36 78 49 +9 2 2 37 79 49 +9 2 2 38 78 50 +9 2 2 39 79 50 +9 2 2 40 78 51 +9 2 2 41 79 51 +9 2 2 42 78 52 +9 2 2 43 79 52 +9 2 2 44 78 53 +9 2 2 45 -1 -1 +9 2 2 46 79 53 +9 2 2 47 78 54 +9 2 2 48 79 54 +9 2 2 49 78 55 +9 2 2 50 79 55 +9 2 2 51 78 56 +9 2 2 52 79 56 +9 2 2 53 78 57 +9 2 2 54 79 57 +9 2 2 55 78 58 +9 2 2 56 -1 -1 +9 2 2 57 79 58 +9 2 2 58 78 59 +9 2 2 59 79 59 +9 2 2 60 78 60 +9 2 2 61 79 60 +9 2 2 62 78 61 +9 2 2 63 79 61 +9 2 2 64 78 62 +9 2 2 65 79 62 +9 2 2 66 78 63 +9 2 2 67 79 63 +9 2 3 0 78 0 +9 2 3 1 79 0 +9 2 3 2 78 1 +9 2 3 3 79 1 +9 2 3 4 78 2 +9 2 3 5 79 2 +9 2 3 6 78 3 +9 2 3 7 79 3 +9 2 3 8 78 4 +9 2 3 9 79 4 +9 2 3 10 78 5 +9 2 3 11 -1 -1 +9 2 3 12 79 5 +9 2 3 13 78 6 +9 2 3 14 79 6 +9 2 3 15 78 7 +9 2 3 16 79 7 +9 2 3 17 78 8 +9 2 3 18 79 8 +9 2 3 19 78 9 +9 2 3 20 79 9 +9 2 3 21 78 10 +9 2 3 22 -1 -1 +9 2 3 23 79 10 +9 2 3 24 78 11 +9 2 3 25 79 11 +9 2 3 26 78 12 +9 2 3 27 79 12 +9 2 3 28 78 13 +9 2 3 29 79 13 +9 2 3 30 78 14 +9 2 3 31 79 14 +9 2 3 32 78 15 +9 2 3 33 79 15 +9 2 3 34 78 16 +9 2 3 35 79 16 +9 2 3 36 78 17 +9 2 3 37 79 17 +9 2 3 38 78 18 +9 2 3 39 79 18 +9 2 3 40 78 19 +9 2 3 41 79 19 +9 2 3 42 78 20 +9 2 3 43 79 20 +9 2 3 44 78 21 +9 2 3 45 -1 -1 +9 2 3 46 79 21 +9 2 3 47 78 22 +9 2 3 48 79 22 +9 2 3 49 78 23 +9 2 3 50 79 23 +9 2 3 51 78 24 +9 2 3 52 79 24 +9 2 3 53 78 25 +9 2 3 54 79 25 +9 2 3 55 78 26 +9 2 3 56 -1 -1 +9 2 3 57 79 26 +9 2 3 58 78 27 +9 2 3 59 79 27 +9 2 3 60 78 28 +9 2 3 61 79 28 +9 2 3 62 78 29 +9 2 3 63 79 29 +9 2 3 64 78 30 +9 2 3 65 79 30 +9 2 3 66 78 31 +9 2 3 67 79 31 +9 3 0 0 79 95 +9 3 0 1 78 95 +9 3 0 2 79 94 +9 3 0 3 78 94 +9 3 0 4 79 93 +9 3 0 5 78 93 +9 3 0 6 79 92 +9 3 0 7 78 92 +9 3 0 8 79 91 +9 3 0 9 78 91 +9 3 0 10 79 90 +9 3 0 11 -1 -1 +9 3 0 12 78 90 +9 3 0 13 79 89 +9 3 0 14 78 89 +9 3 0 15 79 88 +9 3 0 16 78 88 +9 3 0 17 79 87 +9 3 0 18 78 87 +9 3 0 19 79 86 +9 3 0 20 78 86 +9 3 0 21 79 85 +9 3 0 22 -1 -1 +9 3 0 23 78 85 +9 3 0 24 79 84 +9 3 0 25 78 84 +9 3 0 26 79 83 +9 3 0 27 78 83 +9 3 0 28 79 82 +9 3 0 29 78 82 +9 3 0 30 79 81 +9 3 0 31 78 81 +9 3 0 32 79 80 +9 3 0 33 78 80 +9 3 0 34 79 79 +9 3 0 35 78 79 +9 3 0 36 79 78 +9 3 0 37 78 78 +9 3 0 38 79 77 +9 3 0 39 78 77 +9 3 0 40 79 76 +9 3 0 41 78 76 +9 3 0 42 79 75 +9 3 0 43 78 75 +9 3 0 44 79 74 +9 3 0 45 -1 -1 +9 3 0 46 78 74 +9 3 0 47 79 73 +9 3 0 48 78 73 +9 3 0 49 79 72 +9 3 0 50 78 72 +9 3 0 51 79 71 +9 3 0 52 78 71 +9 3 0 53 79 70 +9 3 0 54 78 70 +9 3 0 55 79 69 +9 3 0 56 -1 -1 +9 3 0 57 78 69 +9 3 0 58 79 68 +9 3 0 59 78 68 +9 3 0 60 79 67 +9 3 0 61 78 67 +9 3 0 62 79 66 +9 3 0 63 78 66 +9 3 0 64 79 65 +9 3 0 65 78 65 +9 3 0 66 79 64 +9 3 0 67 78 64 +9 3 1 0 79 127 +9 3 1 1 78 127 +9 3 1 2 79 126 +9 3 1 3 78 126 +9 3 1 4 79 125 +9 3 1 5 78 125 +9 3 1 6 79 124 +9 3 1 7 78 124 +9 3 1 8 79 123 +9 3 1 9 78 123 +9 3 1 10 79 122 +9 3 1 11 -1 -1 +9 3 1 12 78 122 +9 3 1 13 79 121 +9 3 1 14 78 121 +9 3 1 15 79 120 +9 3 1 16 78 120 +9 3 1 17 79 119 +9 3 1 18 78 119 +9 3 1 19 79 118 +9 3 1 20 78 118 +9 3 1 21 79 117 +9 3 1 22 -1 -1 +9 3 1 23 78 117 +9 3 1 24 79 116 +9 3 1 25 78 116 +9 3 1 26 79 115 +9 3 1 27 78 115 +9 3 1 28 79 114 +9 3 1 29 78 114 +9 3 1 30 79 113 +9 3 1 31 78 113 +9 3 1 32 79 112 +9 3 1 33 78 112 +9 3 1 34 79 111 +9 3 1 35 78 111 +9 3 1 36 79 110 +9 3 1 37 78 110 +9 3 1 38 79 109 +9 3 1 39 78 109 +9 3 1 40 79 108 +9 3 1 41 78 108 +9 3 1 42 79 107 +9 3 1 43 78 107 +9 3 1 44 79 106 +9 3 1 45 -1 -1 +9 3 1 46 78 106 +9 3 1 47 79 105 +9 3 1 48 78 105 +9 3 1 49 79 104 +9 3 1 50 78 104 +9 3 1 51 79 103 +9 3 1 52 78 103 +9 3 1 53 79 102 +9 3 1 54 78 102 +9 3 1 55 79 101 +9 3 1 56 -1 -1 +9 3 1 57 78 101 +9 3 1 58 79 100 +9 3 1 59 78 100 +9 3 1 60 79 99 +9 3 1 61 78 99 +9 3 1 62 79 98 +9 3 1 63 78 98 +9 3 1 64 79 97 +9 3 1 65 78 97 +9 3 1 66 79 96 +9 3 1 67 78 96 +9 3 2 0 77 95 +9 3 2 1 76 95 +9 3 2 2 77 94 +9 3 2 3 76 94 +9 3 2 4 77 93 +9 3 2 5 76 93 +9 3 2 6 77 92 +9 3 2 7 76 92 +9 3 2 8 77 91 +9 3 2 9 76 91 +9 3 2 10 77 90 +9 3 2 11 -1 -1 +9 3 2 12 76 90 +9 3 2 13 77 89 +9 3 2 14 76 89 +9 3 2 15 77 88 +9 3 2 16 76 88 +9 3 2 17 77 87 +9 3 2 18 76 87 +9 3 2 19 77 86 +9 3 2 20 76 86 +9 3 2 21 77 85 +9 3 2 22 -1 -1 +9 3 2 23 76 85 +9 3 2 24 77 84 +9 3 2 25 76 84 +9 3 2 26 77 83 +9 3 2 27 76 83 +9 3 2 28 77 82 +9 3 2 29 76 82 +9 3 2 30 77 81 +9 3 2 31 76 81 +9 3 2 32 77 80 +9 3 2 33 76 80 +9 3 2 34 77 79 +9 3 2 35 76 79 +9 3 2 36 77 78 +9 3 2 37 76 78 +9 3 2 38 77 77 +9 3 2 39 76 77 +9 3 2 40 77 76 +9 3 2 41 76 76 +9 3 2 42 77 75 +9 3 2 43 76 75 +9 3 2 44 77 74 +9 3 2 45 -1 -1 +9 3 2 46 76 74 +9 3 2 47 77 73 +9 3 2 48 76 73 +9 3 2 49 77 72 +9 3 2 50 76 72 +9 3 2 51 77 71 +9 3 2 52 76 71 +9 3 2 53 77 70 +9 3 2 54 76 70 +9 3 2 55 77 69 +9 3 2 56 -1 -1 +9 3 2 57 76 69 +9 3 2 58 77 68 +9 3 2 59 76 68 +9 3 2 60 77 67 +9 3 2 61 76 67 +9 3 2 62 77 66 +9 3 2 63 76 66 +9 3 2 64 77 65 +9 3 2 65 76 65 +9 3 2 66 77 64 +9 3 2 67 76 64 +9 3 3 0 77 127 +9 3 3 1 76 127 +9 3 3 2 77 126 +9 3 3 3 76 126 +9 3 3 4 77 125 +9 3 3 5 76 125 +9 3 3 6 77 124 +9 3 3 7 76 124 +9 3 3 8 77 123 +9 3 3 9 76 123 +9 3 3 10 77 122 +9 3 3 11 -1 -1 +9 3 3 12 76 122 +9 3 3 13 77 121 +9 3 3 14 76 121 +9 3 3 15 77 120 +9 3 3 16 76 120 +9 3 3 17 77 119 +9 3 3 18 76 119 +9 3 3 19 77 118 +9 3 3 20 76 118 +9 3 3 21 77 117 +9 3 3 22 -1 -1 +9 3 3 23 76 117 +9 3 3 24 77 116 +9 3 3 25 76 116 +9 3 3 26 77 115 +9 3 3 27 76 115 +9 3 3 28 77 114 +9 3 3 29 76 114 +9 3 3 30 77 113 +9 3 3 31 76 113 +9 3 3 32 77 112 +9 3 3 33 76 112 +9 3 3 34 77 111 +9 3 3 35 76 111 +9 3 3 36 77 110 +9 3 3 37 76 110 +9 3 3 38 77 109 +9 3 3 39 76 109 +9 3 3 40 77 108 +9 3 3 41 76 108 +9 3 3 42 77 107 +9 3 3 43 76 107 +9 3 3 44 77 106 +9 3 3 45 -1 -1 +9 3 3 46 76 106 +9 3 3 47 77 105 +9 3 3 48 76 105 +9 3 3 49 77 104 +9 3 3 50 76 104 +9 3 3 51 77 103 +9 3 3 52 76 103 +9 3 3 53 77 102 +9 3 3 54 76 102 +9 3 3 55 77 101 +9 3 3 56 -1 -1 +9 3 3 57 76 101 +9 3 3 58 77 100 +9 3 3 59 76 100 +9 3 3 60 77 99 +9 3 3 61 76 99 +9 3 3 62 77 98 +9 3 3 63 76 98 +9 3 3 64 77 97 +9 3 3 65 76 97 +9 3 3 66 77 96 +9 3 3 67 76 96 +10 0 0 0 80 32 +10 0 0 1 81 32 +10 0 0 2 80 33 +10 0 0 3 81 33 +10 0 0 4 80 34 +10 0 0 5 81 34 +10 0 0 6 80 35 +10 0 0 7 81 35 +10 0 0 8 80 36 +10 0 0 9 81 36 +10 0 0 10 80 37 +10 0 0 11 -1 -1 +10 0 0 12 81 37 +10 0 0 13 80 38 +10 0 0 14 81 38 +10 0 0 15 80 39 +10 0 0 16 81 39 +10 0 0 17 80 40 +10 0 0 18 81 40 +10 0 0 19 80 41 +10 0 0 20 81 41 +10 0 0 21 80 42 +10 0 0 22 -1 -1 +10 0 0 23 81 42 +10 0 0 24 80 43 +10 0 0 25 81 43 +10 0 0 26 80 44 +10 0 0 27 81 44 +10 0 0 28 80 45 +10 0 0 29 81 45 +10 0 0 30 80 46 +10 0 0 31 81 46 +10 0 0 32 80 47 +10 0 0 33 81 47 +10 0 0 34 80 48 +10 0 0 35 81 48 +10 0 0 36 80 49 +10 0 0 37 81 49 +10 0 0 38 80 50 +10 0 0 39 81 50 +10 0 0 40 80 51 +10 0 0 41 81 51 +10 0 0 42 80 52 +10 0 0 43 81 52 +10 0 0 44 80 53 +10 0 0 45 -1 -1 +10 0 0 46 81 53 +10 0 0 47 80 54 +10 0 0 48 81 54 +10 0 0 49 80 55 +10 0 0 50 81 55 +10 0 0 51 80 56 +10 0 0 52 81 56 +10 0 0 53 80 57 +10 0 0 54 81 57 +10 0 0 55 80 58 +10 0 0 56 -1 -1 +10 0 0 57 81 58 +10 0 0 58 80 59 +10 0 0 59 81 59 +10 0 0 60 80 60 +10 0 0 61 81 60 +10 0 0 62 80 61 +10 0 0 63 81 61 +10 0 0 64 80 62 +10 0 0 65 81 62 +10 0 0 66 80 63 +10 0 0 67 81 63 +10 0 1 0 80 0 +10 0 1 1 81 0 +10 0 1 2 80 1 +10 0 1 3 81 1 +10 0 1 4 80 2 +10 0 1 5 81 2 +10 0 1 6 80 3 +10 0 1 7 81 3 +10 0 1 8 80 4 +10 0 1 9 81 4 +10 0 1 10 80 5 +10 0 1 11 -1 -1 +10 0 1 12 81 5 +10 0 1 13 80 6 +10 0 1 14 81 6 +10 0 1 15 80 7 +10 0 1 16 81 7 +10 0 1 17 80 8 +10 0 1 18 81 8 +10 0 1 19 80 9 +10 0 1 20 81 9 +10 0 1 21 80 10 +10 0 1 22 -1 -1 +10 0 1 23 81 10 +10 0 1 24 80 11 +10 0 1 25 81 11 +10 0 1 26 80 12 +10 0 1 27 81 12 +10 0 1 28 80 13 +10 0 1 29 81 13 +10 0 1 30 80 14 +10 0 1 31 81 14 +10 0 1 32 80 15 +10 0 1 33 81 15 +10 0 1 34 80 16 +10 0 1 35 81 16 +10 0 1 36 80 17 +10 0 1 37 81 17 +10 0 1 38 80 18 +10 0 1 39 81 18 +10 0 1 40 80 19 +10 0 1 41 81 19 +10 0 1 42 80 20 +10 0 1 43 81 20 +10 0 1 44 80 21 +10 0 1 45 -1 -1 +10 0 1 46 81 21 +10 0 1 47 80 22 +10 0 1 48 81 22 +10 0 1 49 80 23 +10 0 1 50 81 23 +10 0 1 51 80 24 +10 0 1 52 81 24 +10 0 1 53 80 25 +10 0 1 54 81 25 +10 0 1 55 80 26 +10 0 1 56 -1 -1 +10 0 1 57 81 26 +10 0 1 58 80 27 +10 0 1 59 81 27 +10 0 1 60 80 28 +10 0 1 61 81 28 +10 0 1 62 80 29 +10 0 1 63 81 29 +10 0 1 64 80 30 +10 0 1 65 81 30 +10 0 1 66 80 31 +10 0 1 67 81 31 +10 0 2 0 82 32 +10 0 2 1 83 32 +10 0 2 2 82 33 +10 0 2 3 83 33 +10 0 2 4 82 34 +10 0 2 5 83 34 +10 0 2 6 82 35 +10 0 2 7 83 35 +10 0 2 8 82 36 +10 0 2 9 83 36 +10 0 2 10 82 37 +10 0 2 11 -1 -1 +10 0 2 12 83 37 +10 0 2 13 82 38 +10 0 2 14 83 38 +10 0 2 15 82 39 +10 0 2 16 83 39 +10 0 2 17 82 40 +10 0 2 18 83 40 +10 0 2 19 82 41 +10 0 2 20 83 41 +10 0 2 21 82 42 +10 0 2 22 -1 -1 +10 0 2 23 83 42 +10 0 2 24 82 43 +10 0 2 25 83 43 +10 0 2 26 82 44 +10 0 2 27 83 44 +10 0 2 28 82 45 +10 0 2 29 83 45 +10 0 2 30 82 46 +10 0 2 31 83 46 +10 0 2 32 82 47 +10 0 2 33 83 47 +10 0 2 34 82 48 +10 0 2 35 83 48 +10 0 2 36 82 49 +10 0 2 37 83 49 +10 0 2 38 82 50 +10 0 2 39 83 50 +10 0 2 40 82 51 +10 0 2 41 83 51 +10 0 2 42 82 52 +10 0 2 43 83 52 +10 0 2 44 82 53 +10 0 2 45 -1 -1 +10 0 2 46 83 53 +10 0 2 47 82 54 +10 0 2 48 83 54 +10 0 2 49 82 55 +10 0 2 50 83 55 +10 0 2 51 82 56 +10 0 2 52 83 56 +10 0 2 53 82 57 +10 0 2 54 83 57 +10 0 2 55 82 58 +10 0 2 56 -1 -1 +10 0 2 57 83 58 +10 0 2 58 82 59 +10 0 2 59 83 59 +10 0 2 60 82 60 +10 0 2 61 83 60 +10 0 2 62 82 61 +10 0 2 63 83 61 +10 0 2 64 82 62 +10 0 2 65 83 62 +10 0 2 66 82 63 +10 0 2 67 83 63 +10 0 3 0 82 0 +10 0 3 1 83 0 +10 0 3 2 82 1 +10 0 3 3 83 1 +10 0 3 4 82 2 +10 0 3 5 83 2 +10 0 3 6 82 3 +10 0 3 7 83 3 +10 0 3 8 82 4 +10 0 3 9 83 4 +10 0 3 10 82 5 +10 0 3 11 -1 -1 +10 0 3 12 83 5 +10 0 3 13 82 6 +10 0 3 14 83 6 +10 0 3 15 82 7 +10 0 3 16 83 7 +10 0 3 17 82 8 +10 0 3 18 83 8 +10 0 3 19 82 9 +10 0 3 20 83 9 +10 0 3 21 82 10 +10 0 3 22 -1 -1 +10 0 3 23 83 10 +10 0 3 24 82 11 +10 0 3 25 83 11 +10 0 3 26 82 12 +10 0 3 27 83 12 +10 0 3 28 82 13 +10 0 3 29 83 13 +10 0 3 30 82 14 +10 0 3 31 83 14 +10 0 3 32 82 15 +10 0 3 33 83 15 +10 0 3 34 82 16 +10 0 3 35 83 16 +10 0 3 36 82 17 +10 0 3 37 83 17 +10 0 3 38 82 18 +10 0 3 39 83 18 +10 0 3 40 82 19 +10 0 3 41 83 19 +10 0 3 42 82 20 +10 0 3 43 83 20 +10 0 3 44 82 21 +10 0 3 45 -1 -1 +10 0 3 46 83 21 +10 0 3 47 82 22 +10 0 3 48 83 22 +10 0 3 49 82 23 +10 0 3 50 83 23 +10 0 3 51 82 24 +10 0 3 52 83 24 +10 0 3 53 82 25 +10 0 3 54 83 25 +10 0 3 55 82 26 +10 0 3 56 -1 -1 +10 0 3 57 83 26 +10 0 3 58 82 27 +10 0 3 59 83 27 +10 0 3 60 82 28 +10 0 3 61 83 28 +10 0 3 62 82 29 +10 0 3 63 83 29 +10 0 3 64 82 30 +10 0 3 65 83 30 +10 0 3 66 82 31 +10 0 3 67 83 31 +10 1 0 0 83 95 +10 1 0 1 82 95 +10 1 0 2 83 94 +10 1 0 3 82 94 +10 1 0 4 83 93 +10 1 0 5 82 93 +10 1 0 6 83 92 +10 1 0 7 82 92 +10 1 0 8 83 91 +10 1 0 9 82 91 +10 1 0 10 83 90 +10 1 0 11 -1 -1 +10 1 0 12 82 90 +10 1 0 13 83 89 +10 1 0 14 82 89 +10 1 0 15 83 88 +10 1 0 16 82 88 +10 1 0 17 83 87 +10 1 0 18 82 87 +10 1 0 19 83 86 +10 1 0 20 82 86 +10 1 0 21 83 85 +10 1 0 22 -1 -1 +10 1 0 23 82 85 +10 1 0 24 83 84 +10 1 0 25 82 84 +10 1 0 26 83 83 +10 1 0 27 82 83 +10 1 0 28 83 82 +10 1 0 29 82 82 +10 1 0 30 83 81 +10 1 0 31 82 81 +10 1 0 32 83 80 +10 1 0 33 82 80 +10 1 0 34 83 79 +10 1 0 35 82 79 +10 1 0 36 83 78 +10 1 0 37 82 78 +10 1 0 38 83 77 +10 1 0 39 82 77 +10 1 0 40 83 76 +10 1 0 41 82 76 +10 1 0 42 83 75 +10 1 0 43 82 75 +10 1 0 44 83 74 +10 1 0 45 -1 -1 +10 1 0 46 82 74 +10 1 0 47 83 73 +10 1 0 48 82 73 +10 1 0 49 83 72 +10 1 0 50 82 72 +10 1 0 51 83 71 +10 1 0 52 82 71 +10 1 0 53 83 70 +10 1 0 54 82 70 +10 1 0 55 83 69 +10 1 0 56 -1 -1 +10 1 0 57 82 69 +10 1 0 58 83 68 +10 1 0 59 82 68 +10 1 0 60 83 67 +10 1 0 61 82 67 +10 1 0 62 83 66 +10 1 0 63 82 66 +10 1 0 64 83 65 +10 1 0 65 82 65 +10 1 0 66 83 64 +10 1 0 67 82 64 +10 1 1 0 83 127 +10 1 1 1 82 127 +10 1 1 2 83 126 +10 1 1 3 82 126 +10 1 1 4 83 125 +10 1 1 5 82 125 +10 1 1 6 83 124 +10 1 1 7 82 124 +10 1 1 8 83 123 +10 1 1 9 82 123 +10 1 1 10 83 122 +10 1 1 11 -1 -1 +10 1 1 12 82 122 +10 1 1 13 83 121 +10 1 1 14 82 121 +10 1 1 15 83 120 +10 1 1 16 82 120 +10 1 1 17 83 119 +10 1 1 18 82 119 +10 1 1 19 83 118 +10 1 1 20 82 118 +10 1 1 21 83 117 +10 1 1 22 -1 -1 +10 1 1 23 82 117 +10 1 1 24 83 116 +10 1 1 25 82 116 +10 1 1 26 83 115 +10 1 1 27 82 115 +10 1 1 28 83 114 +10 1 1 29 82 114 +10 1 1 30 83 113 +10 1 1 31 82 113 +10 1 1 32 83 112 +10 1 1 33 82 112 +10 1 1 34 83 111 +10 1 1 35 82 111 +10 1 1 36 83 110 +10 1 1 37 82 110 +10 1 1 38 83 109 +10 1 1 39 82 109 +10 1 1 40 83 108 +10 1 1 41 82 108 +10 1 1 42 83 107 +10 1 1 43 82 107 +10 1 1 44 83 106 +10 1 1 45 -1 -1 +10 1 1 46 82 106 +10 1 1 47 83 105 +10 1 1 48 82 105 +10 1 1 49 83 104 +10 1 1 50 82 104 +10 1 1 51 83 103 +10 1 1 52 82 103 +10 1 1 53 83 102 +10 1 1 54 82 102 +10 1 1 55 83 101 +10 1 1 56 -1 -1 +10 1 1 57 82 101 +10 1 1 58 83 100 +10 1 1 59 82 100 +10 1 1 60 83 99 +10 1 1 61 82 99 +10 1 1 62 83 98 +10 1 1 63 82 98 +10 1 1 64 83 97 +10 1 1 65 82 97 +10 1 1 66 83 96 +10 1 1 67 82 96 +10 1 2 0 81 95 +10 1 2 1 80 95 +10 1 2 2 81 94 +10 1 2 3 80 94 +10 1 2 4 81 93 +10 1 2 5 80 93 +10 1 2 6 81 92 +10 1 2 7 80 92 +10 1 2 8 81 91 +10 1 2 9 80 91 +10 1 2 10 81 90 +10 1 2 11 -1 -1 +10 1 2 12 80 90 +10 1 2 13 81 89 +10 1 2 14 80 89 +10 1 2 15 81 88 +10 1 2 16 80 88 +10 1 2 17 81 87 +10 1 2 18 80 87 +10 1 2 19 81 86 +10 1 2 20 80 86 +10 1 2 21 81 85 +10 1 2 22 -1 -1 +10 1 2 23 80 85 +10 1 2 24 81 84 +10 1 2 25 80 84 +10 1 2 26 81 83 +10 1 2 27 80 83 +10 1 2 28 81 82 +10 1 2 29 80 82 +10 1 2 30 81 81 +10 1 2 31 80 81 +10 1 2 32 81 80 +10 1 2 33 80 80 +10 1 2 34 81 79 +10 1 2 35 80 79 +10 1 2 36 81 78 +10 1 2 37 80 78 +10 1 2 38 81 77 +10 1 2 39 80 77 +10 1 2 40 81 76 +10 1 2 41 80 76 +10 1 2 42 81 75 +10 1 2 43 80 75 +10 1 2 44 81 74 +10 1 2 45 -1 -1 +10 1 2 46 80 74 +10 1 2 47 81 73 +10 1 2 48 80 73 +10 1 2 49 81 72 +10 1 2 50 80 72 +10 1 2 51 81 71 +10 1 2 52 80 71 +10 1 2 53 81 70 +10 1 2 54 80 70 +10 1 2 55 81 69 +10 1 2 56 -1 -1 +10 1 2 57 80 69 +10 1 2 58 81 68 +10 1 2 59 80 68 +10 1 2 60 81 67 +10 1 2 61 80 67 +10 1 2 62 81 66 +10 1 2 63 80 66 +10 1 2 64 81 65 +10 1 2 65 80 65 +10 1 2 66 81 64 +10 1 2 67 80 64 +10 1 3 0 81 127 +10 1 3 1 80 127 +10 1 3 2 81 126 +10 1 3 3 80 126 +10 1 3 4 81 125 +10 1 3 5 80 125 +10 1 3 6 81 124 +10 1 3 7 80 124 +10 1 3 8 81 123 +10 1 3 9 80 123 +10 1 3 10 81 122 +10 1 3 11 -1 -1 +10 1 3 12 80 122 +10 1 3 13 81 121 +10 1 3 14 80 121 +10 1 3 15 81 120 +10 1 3 16 80 120 +10 1 3 17 81 119 +10 1 3 18 80 119 +10 1 3 19 81 118 +10 1 3 20 80 118 +10 1 3 21 81 117 +10 1 3 22 -1 -1 +10 1 3 23 80 117 +10 1 3 24 81 116 +10 1 3 25 80 116 +10 1 3 26 81 115 +10 1 3 27 80 115 +10 1 3 28 81 114 +10 1 3 29 80 114 +10 1 3 30 81 113 +10 1 3 31 80 113 +10 1 3 32 81 112 +10 1 3 33 80 112 +10 1 3 34 81 111 +10 1 3 35 80 111 +10 1 3 36 81 110 +10 1 3 37 80 110 +10 1 3 38 81 109 +10 1 3 39 80 109 +10 1 3 40 81 108 +10 1 3 41 80 108 +10 1 3 42 81 107 +10 1 3 43 80 107 +10 1 3 44 81 106 +10 1 3 45 -1 -1 +10 1 3 46 80 106 +10 1 3 47 81 105 +10 1 3 48 80 105 +10 1 3 49 81 104 +10 1 3 50 80 104 +10 1 3 51 81 103 +10 1 3 52 80 103 +10 1 3 53 81 102 +10 1 3 54 80 102 +10 1 3 55 81 101 +10 1 3 56 -1 -1 +10 1 3 57 80 101 +10 1 3 58 81 100 +10 1 3 59 80 100 +10 1 3 60 81 99 +10 1 3 61 80 99 +10 1 3 62 81 98 +10 1 3 63 80 98 +10 1 3 64 81 97 +10 1 3 65 80 97 +10 1 3 66 81 96 +10 1 3 67 80 96 +10 2 0 0 84 32 +10 2 0 1 85 32 +10 2 0 2 84 33 +10 2 0 3 85 33 +10 2 0 4 84 34 +10 2 0 5 85 34 +10 2 0 6 84 35 +10 2 0 7 85 35 +10 2 0 8 84 36 +10 2 0 9 85 36 +10 2 0 10 84 37 +10 2 0 11 -1 -1 +10 2 0 12 85 37 +10 2 0 13 84 38 +10 2 0 14 85 38 +10 2 0 15 84 39 +10 2 0 16 85 39 +10 2 0 17 84 40 +10 2 0 18 85 40 +10 2 0 19 84 41 +10 2 0 20 85 41 +10 2 0 21 84 42 +10 2 0 22 -1 -1 +10 2 0 23 85 42 +10 2 0 24 84 43 +10 2 0 25 85 43 +10 2 0 26 84 44 +10 2 0 27 85 44 +10 2 0 28 84 45 +10 2 0 29 85 45 +10 2 0 30 84 46 +10 2 0 31 85 46 +10 2 0 32 84 47 +10 2 0 33 85 47 +10 2 0 34 84 48 +10 2 0 35 85 48 +10 2 0 36 84 49 +10 2 0 37 85 49 +10 2 0 38 84 50 +10 2 0 39 85 50 +10 2 0 40 84 51 +10 2 0 41 85 51 +10 2 0 42 84 52 +10 2 0 43 85 52 +10 2 0 44 84 53 +10 2 0 45 -1 -1 +10 2 0 46 85 53 +10 2 0 47 84 54 +10 2 0 48 85 54 +10 2 0 49 84 55 +10 2 0 50 85 55 +10 2 0 51 84 56 +10 2 0 52 85 56 +10 2 0 53 84 57 +10 2 0 54 85 57 +10 2 0 55 84 58 +10 2 0 56 -1 -1 +10 2 0 57 85 58 +10 2 0 58 84 59 +10 2 0 59 85 59 +10 2 0 60 84 60 +10 2 0 61 85 60 +10 2 0 62 84 61 +10 2 0 63 85 61 +10 2 0 64 84 62 +10 2 0 65 85 62 +10 2 0 66 84 63 +10 2 0 67 85 63 +10 2 1 0 84 0 +10 2 1 1 85 0 +10 2 1 2 84 1 +10 2 1 3 85 1 +10 2 1 4 84 2 +10 2 1 5 85 2 +10 2 1 6 84 3 +10 2 1 7 85 3 +10 2 1 8 84 4 +10 2 1 9 85 4 +10 2 1 10 84 5 +10 2 1 11 -1 -1 +10 2 1 12 85 5 +10 2 1 13 84 6 +10 2 1 14 85 6 +10 2 1 15 84 7 +10 2 1 16 85 7 +10 2 1 17 84 8 +10 2 1 18 85 8 +10 2 1 19 84 9 +10 2 1 20 85 9 +10 2 1 21 84 10 +10 2 1 22 -1 -1 +10 2 1 23 85 10 +10 2 1 24 84 11 +10 2 1 25 85 11 +10 2 1 26 84 12 +10 2 1 27 85 12 +10 2 1 28 84 13 +10 2 1 29 85 13 +10 2 1 30 84 14 +10 2 1 31 85 14 +10 2 1 32 84 15 +10 2 1 33 85 15 +10 2 1 34 84 16 +10 2 1 35 85 16 +10 2 1 36 84 17 +10 2 1 37 85 17 +10 2 1 38 84 18 +10 2 1 39 85 18 +10 2 1 40 84 19 +10 2 1 41 85 19 +10 2 1 42 84 20 +10 2 1 43 85 20 +10 2 1 44 84 21 +10 2 1 45 -1 -1 +10 2 1 46 85 21 +10 2 1 47 84 22 +10 2 1 48 85 22 +10 2 1 49 84 23 +10 2 1 50 85 23 +10 2 1 51 84 24 +10 2 1 52 85 24 +10 2 1 53 84 25 +10 2 1 54 85 25 +10 2 1 55 84 26 +10 2 1 56 -1 -1 +10 2 1 57 85 26 +10 2 1 58 84 27 +10 2 1 59 85 27 +10 2 1 60 84 28 +10 2 1 61 85 28 +10 2 1 62 84 29 +10 2 1 63 85 29 +10 2 1 64 84 30 +10 2 1 65 85 30 +10 2 1 66 84 31 +10 2 1 67 85 31 +10 2 2 0 86 32 +10 2 2 1 87 32 +10 2 2 2 86 33 +10 2 2 3 87 33 +10 2 2 4 86 34 +10 2 2 5 87 34 +10 2 2 6 86 35 +10 2 2 7 87 35 +10 2 2 8 86 36 +10 2 2 9 87 36 +10 2 2 10 86 37 +10 2 2 11 -1 -1 +10 2 2 12 87 37 +10 2 2 13 86 38 +10 2 2 14 87 38 +10 2 2 15 86 39 +10 2 2 16 87 39 +10 2 2 17 86 40 +10 2 2 18 87 40 +10 2 2 19 86 41 +10 2 2 20 87 41 +10 2 2 21 86 42 +10 2 2 22 -1 -1 +10 2 2 23 87 42 +10 2 2 24 86 43 +10 2 2 25 87 43 +10 2 2 26 86 44 +10 2 2 27 87 44 +10 2 2 28 86 45 +10 2 2 29 87 45 +10 2 2 30 86 46 +10 2 2 31 87 46 +10 2 2 32 86 47 +10 2 2 33 87 47 +10 2 2 34 86 48 +10 2 2 35 87 48 +10 2 2 36 86 49 +10 2 2 37 87 49 +10 2 2 38 86 50 +10 2 2 39 87 50 +10 2 2 40 86 51 +10 2 2 41 87 51 +10 2 2 42 86 52 +10 2 2 43 87 52 +10 2 2 44 86 53 +10 2 2 45 -1 -1 +10 2 2 46 87 53 +10 2 2 47 86 54 +10 2 2 48 87 54 +10 2 2 49 86 55 +10 2 2 50 87 55 +10 2 2 51 86 56 +10 2 2 52 87 56 +10 2 2 53 86 57 +10 2 2 54 87 57 +10 2 2 55 86 58 +10 2 2 56 -1 -1 +10 2 2 57 87 58 +10 2 2 58 86 59 +10 2 2 59 87 59 +10 2 2 60 86 60 +10 2 2 61 87 60 +10 2 2 62 86 61 +10 2 2 63 87 61 +10 2 2 64 86 62 +10 2 2 65 87 62 +10 2 2 66 86 63 +10 2 2 67 87 63 +10 2 3 0 86 0 +10 2 3 1 87 0 +10 2 3 2 86 1 +10 2 3 3 87 1 +10 2 3 4 86 2 +10 2 3 5 87 2 +10 2 3 6 86 3 +10 2 3 7 87 3 +10 2 3 8 86 4 +10 2 3 9 87 4 +10 2 3 10 86 5 +10 2 3 11 -1 -1 +10 2 3 12 87 5 +10 2 3 13 86 6 +10 2 3 14 87 6 +10 2 3 15 86 7 +10 2 3 16 87 7 +10 2 3 17 86 8 +10 2 3 18 87 8 +10 2 3 19 86 9 +10 2 3 20 87 9 +10 2 3 21 86 10 +10 2 3 22 -1 -1 +10 2 3 23 87 10 +10 2 3 24 86 11 +10 2 3 25 87 11 +10 2 3 26 86 12 +10 2 3 27 87 12 +10 2 3 28 86 13 +10 2 3 29 87 13 +10 2 3 30 86 14 +10 2 3 31 87 14 +10 2 3 32 86 15 +10 2 3 33 87 15 +10 2 3 34 86 16 +10 2 3 35 87 16 +10 2 3 36 86 17 +10 2 3 37 87 17 +10 2 3 38 86 18 +10 2 3 39 87 18 +10 2 3 40 86 19 +10 2 3 41 87 19 +10 2 3 42 86 20 +10 2 3 43 87 20 +10 2 3 44 86 21 +10 2 3 45 -1 -1 +10 2 3 46 87 21 +10 2 3 47 86 22 +10 2 3 48 87 22 +10 2 3 49 86 23 +10 2 3 50 87 23 +10 2 3 51 86 24 +10 2 3 52 87 24 +10 2 3 53 86 25 +10 2 3 54 87 25 +10 2 3 55 86 26 +10 2 3 56 -1 -1 +10 2 3 57 87 26 +10 2 3 58 86 27 +10 2 3 59 87 27 +10 2 3 60 86 28 +10 2 3 61 87 28 +10 2 3 62 86 29 +10 2 3 63 87 29 +10 2 3 64 86 30 +10 2 3 65 87 30 +10 2 3 66 86 31 +10 2 3 67 87 31 +10 3 0 0 87 95 +10 3 0 1 86 95 +10 3 0 2 87 94 +10 3 0 3 86 94 +10 3 0 4 87 93 +10 3 0 5 86 93 +10 3 0 6 87 92 +10 3 0 7 86 92 +10 3 0 8 87 91 +10 3 0 9 86 91 +10 3 0 10 87 90 +10 3 0 11 -1 -1 +10 3 0 12 86 90 +10 3 0 13 87 89 +10 3 0 14 86 89 +10 3 0 15 87 88 +10 3 0 16 86 88 +10 3 0 17 87 87 +10 3 0 18 86 87 +10 3 0 19 87 86 +10 3 0 20 86 86 +10 3 0 21 87 85 +10 3 0 22 -1 -1 +10 3 0 23 86 85 +10 3 0 24 87 84 +10 3 0 25 86 84 +10 3 0 26 87 83 +10 3 0 27 86 83 +10 3 0 28 87 82 +10 3 0 29 86 82 +10 3 0 30 87 81 +10 3 0 31 86 81 +10 3 0 32 87 80 +10 3 0 33 86 80 +10 3 0 34 87 79 +10 3 0 35 86 79 +10 3 0 36 87 78 +10 3 0 37 86 78 +10 3 0 38 87 77 +10 3 0 39 86 77 +10 3 0 40 87 76 +10 3 0 41 86 76 +10 3 0 42 87 75 +10 3 0 43 86 75 +10 3 0 44 87 74 +10 3 0 45 -1 -1 +10 3 0 46 86 74 +10 3 0 47 87 73 +10 3 0 48 86 73 +10 3 0 49 87 72 +10 3 0 50 86 72 +10 3 0 51 87 71 +10 3 0 52 86 71 +10 3 0 53 87 70 +10 3 0 54 86 70 +10 3 0 55 87 69 +10 3 0 56 -1 -1 +10 3 0 57 86 69 +10 3 0 58 87 68 +10 3 0 59 86 68 +10 3 0 60 87 67 +10 3 0 61 86 67 +10 3 0 62 87 66 +10 3 0 63 86 66 +10 3 0 64 87 65 +10 3 0 65 86 65 +10 3 0 66 87 64 +10 3 0 67 86 64 +10 3 1 0 87 127 +10 3 1 1 86 127 +10 3 1 2 87 126 +10 3 1 3 86 126 +10 3 1 4 87 125 +10 3 1 5 86 125 +10 3 1 6 87 124 +10 3 1 7 86 124 +10 3 1 8 87 123 +10 3 1 9 86 123 +10 3 1 10 87 122 +10 3 1 11 -1 -1 +10 3 1 12 86 122 +10 3 1 13 87 121 +10 3 1 14 86 121 +10 3 1 15 87 120 +10 3 1 16 86 120 +10 3 1 17 87 119 +10 3 1 18 86 119 +10 3 1 19 87 118 +10 3 1 20 86 118 +10 3 1 21 87 117 +10 3 1 22 -1 -1 +10 3 1 23 86 117 +10 3 1 24 87 116 +10 3 1 25 86 116 +10 3 1 26 87 115 +10 3 1 27 86 115 +10 3 1 28 87 114 +10 3 1 29 86 114 +10 3 1 30 87 113 +10 3 1 31 86 113 +10 3 1 32 87 112 +10 3 1 33 86 112 +10 3 1 34 87 111 +10 3 1 35 86 111 +10 3 1 36 87 110 +10 3 1 37 86 110 +10 3 1 38 87 109 +10 3 1 39 86 109 +10 3 1 40 87 108 +10 3 1 41 86 108 +10 3 1 42 87 107 +10 3 1 43 86 107 +10 3 1 44 87 106 +10 3 1 45 -1 -1 +10 3 1 46 86 106 +10 3 1 47 87 105 +10 3 1 48 86 105 +10 3 1 49 87 104 +10 3 1 50 86 104 +10 3 1 51 87 103 +10 3 1 52 86 103 +10 3 1 53 87 102 +10 3 1 54 86 102 +10 3 1 55 87 101 +10 3 1 56 -1 -1 +10 3 1 57 86 101 +10 3 1 58 87 100 +10 3 1 59 86 100 +10 3 1 60 87 99 +10 3 1 61 86 99 +10 3 1 62 87 98 +10 3 1 63 86 98 +10 3 1 64 87 97 +10 3 1 65 86 97 +10 3 1 66 87 96 +10 3 1 67 86 96 +10 3 2 0 85 95 +10 3 2 1 84 95 +10 3 2 2 85 94 +10 3 2 3 84 94 +10 3 2 4 85 93 +10 3 2 5 84 93 +10 3 2 6 85 92 +10 3 2 7 84 92 +10 3 2 8 85 91 +10 3 2 9 84 91 +10 3 2 10 85 90 +10 3 2 11 -1 -1 +10 3 2 12 84 90 +10 3 2 13 85 89 +10 3 2 14 84 89 +10 3 2 15 85 88 +10 3 2 16 84 88 +10 3 2 17 85 87 +10 3 2 18 84 87 +10 3 2 19 85 86 +10 3 2 20 84 86 +10 3 2 21 85 85 +10 3 2 22 -1 -1 +10 3 2 23 84 85 +10 3 2 24 85 84 +10 3 2 25 84 84 +10 3 2 26 85 83 +10 3 2 27 84 83 +10 3 2 28 85 82 +10 3 2 29 84 82 +10 3 2 30 85 81 +10 3 2 31 84 81 +10 3 2 32 85 80 +10 3 2 33 84 80 +10 3 2 34 85 79 +10 3 2 35 84 79 +10 3 2 36 85 78 +10 3 2 37 84 78 +10 3 2 38 85 77 +10 3 2 39 84 77 +10 3 2 40 85 76 +10 3 2 41 84 76 +10 3 2 42 85 75 +10 3 2 43 84 75 +10 3 2 44 85 74 +10 3 2 45 -1 -1 +10 3 2 46 84 74 +10 3 2 47 85 73 +10 3 2 48 84 73 +10 3 2 49 85 72 +10 3 2 50 84 72 +10 3 2 51 85 71 +10 3 2 52 84 71 +10 3 2 53 85 70 +10 3 2 54 84 70 +10 3 2 55 85 69 +10 3 2 56 -1 -1 +10 3 2 57 84 69 +10 3 2 58 85 68 +10 3 2 59 84 68 +10 3 2 60 85 67 +10 3 2 61 84 67 +10 3 2 62 85 66 +10 3 2 63 84 66 +10 3 2 64 85 65 +10 3 2 65 84 65 +10 3 2 66 85 64 +10 3 2 67 84 64 +10 3 3 0 85 127 +10 3 3 1 84 127 +10 3 3 2 85 126 +10 3 3 3 84 126 +10 3 3 4 85 125 +10 3 3 5 84 125 +10 3 3 6 85 124 +10 3 3 7 84 124 +10 3 3 8 85 123 +10 3 3 9 84 123 +10 3 3 10 85 122 +10 3 3 11 -1 -1 +10 3 3 12 84 122 +10 3 3 13 85 121 +10 3 3 14 84 121 +10 3 3 15 85 120 +10 3 3 16 84 120 +10 3 3 17 85 119 +10 3 3 18 84 119 +10 3 3 19 85 118 +10 3 3 20 84 118 +10 3 3 21 85 117 +10 3 3 22 -1 -1 +10 3 3 23 84 117 +10 3 3 24 85 116 +10 3 3 25 84 116 +10 3 3 26 85 115 +10 3 3 27 84 115 +10 3 3 28 85 114 +10 3 3 29 84 114 +10 3 3 30 85 113 +10 3 3 31 84 113 +10 3 3 32 85 112 +10 3 3 33 84 112 +10 3 3 34 85 111 +10 3 3 35 84 111 +10 3 3 36 85 110 +10 3 3 37 84 110 +10 3 3 38 85 109 +10 3 3 39 84 109 +10 3 3 40 85 108 +10 3 3 41 84 108 +10 3 3 42 85 107 +10 3 3 43 84 107 +10 3 3 44 85 106 +10 3 3 45 -1 -1 +10 3 3 46 84 106 +10 3 3 47 85 105 +10 3 3 48 84 105 +10 3 3 49 85 104 +10 3 3 50 84 104 +10 3 3 51 85 103 +10 3 3 52 84 103 +10 3 3 53 85 102 +10 3 3 54 84 102 +10 3 3 55 85 101 +10 3 3 56 -1 -1 +10 3 3 57 84 101 +10 3 3 58 85 100 +10 3 3 59 84 100 +10 3 3 60 85 99 +10 3 3 61 84 99 +10 3 3 62 85 98 +10 3 3 63 84 98 +10 3 3 64 85 97 +10 3 3 65 84 97 +10 3 3 66 85 96 +10 3 3 67 84 96 +11 0 0 0 88 32 +11 0 0 1 89 32 +11 0 0 2 88 33 +11 0 0 3 89 33 +11 0 0 4 88 34 +11 0 0 5 89 34 +11 0 0 6 88 35 +11 0 0 7 89 35 +11 0 0 8 88 36 +11 0 0 9 89 36 +11 0 0 10 88 37 +11 0 0 11 -1 -1 +11 0 0 12 89 37 +11 0 0 13 88 38 +11 0 0 14 89 38 +11 0 0 15 88 39 +11 0 0 16 89 39 +11 0 0 17 88 40 +11 0 0 18 89 40 +11 0 0 19 88 41 +11 0 0 20 89 41 +11 0 0 21 88 42 +11 0 0 22 -1 -1 +11 0 0 23 89 42 +11 0 0 24 88 43 +11 0 0 25 89 43 +11 0 0 26 88 44 +11 0 0 27 89 44 +11 0 0 28 88 45 +11 0 0 29 89 45 +11 0 0 30 88 46 +11 0 0 31 89 46 +11 0 0 32 88 47 +11 0 0 33 89 47 +11 0 0 34 88 48 +11 0 0 35 89 48 +11 0 0 36 88 49 +11 0 0 37 89 49 +11 0 0 38 88 50 +11 0 0 39 89 50 +11 0 0 40 88 51 +11 0 0 41 89 51 +11 0 0 42 88 52 +11 0 0 43 89 52 +11 0 0 44 88 53 +11 0 0 45 -1 -1 +11 0 0 46 89 53 +11 0 0 47 88 54 +11 0 0 48 89 54 +11 0 0 49 88 55 +11 0 0 50 89 55 +11 0 0 51 88 56 +11 0 0 52 89 56 +11 0 0 53 88 57 +11 0 0 54 89 57 +11 0 0 55 88 58 +11 0 0 56 -1 -1 +11 0 0 57 89 58 +11 0 0 58 88 59 +11 0 0 59 89 59 +11 0 0 60 88 60 +11 0 0 61 89 60 +11 0 0 62 88 61 +11 0 0 63 89 61 +11 0 0 64 88 62 +11 0 0 65 89 62 +11 0 0 66 88 63 +11 0 0 67 89 63 +11 0 1 0 88 0 +11 0 1 1 89 0 +11 0 1 2 88 1 +11 0 1 3 89 1 +11 0 1 4 88 2 +11 0 1 5 89 2 +11 0 1 6 88 3 +11 0 1 7 89 3 +11 0 1 8 88 4 +11 0 1 9 89 4 +11 0 1 10 88 5 +11 0 1 11 -1 -1 +11 0 1 12 89 5 +11 0 1 13 88 6 +11 0 1 14 89 6 +11 0 1 15 88 7 +11 0 1 16 89 7 +11 0 1 17 88 8 +11 0 1 18 89 8 +11 0 1 19 88 9 +11 0 1 20 89 9 +11 0 1 21 88 10 +11 0 1 22 -1 -1 +11 0 1 23 89 10 +11 0 1 24 88 11 +11 0 1 25 89 11 +11 0 1 26 88 12 +11 0 1 27 89 12 +11 0 1 28 88 13 +11 0 1 29 89 13 +11 0 1 30 88 14 +11 0 1 31 89 14 +11 0 1 32 88 15 +11 0 1 33 89 15 +11 0 1 34 88 16 +11 0 1 35 89 16 +11 0 1 36 88 17 +11 0 1 37 89 17 +11 0 1 38 88 18 +11 0 1 39 89 18 +11 0 1 40 88 19 +11 0 1 41 89 19 +11 0 1 42 88 20 +11 0 1 43 89 20 +11 0 1 44 88 21 +11 0 1 45 -1 -1 +11 0 1 46 89 21 +11 0 1 47 88 22 +11 0 1 48 89 22 +11 0 1 49 88 23 +11 0 1 50 89 23 +11 0 1 51 88 24 +11 0 1 52 89 24 +11 0 1 53 88 25 +11 0 1 54 89 25 +11 0 1 55 88 26 +11 0 1 56 -1 -1 +11 0 1 57 89 26 +11 0 1 58 88 27 +11 0 1 59 89 27 +11 0 1 60 88 28 +11 0 1 61 89 28 +11 0 1 62 88 29 +11 0 1 63 89 29 +11 0 1 64 88 30 +11 0 1 65 89 30 +11 0 1 66 88 31 +11 0 1 67 89 31 +11 0 2 0 90 32 +11 0 2 1 91 32 +11 0 2 2 90 33 +11 0 2 3 91 33 +11 0 2 4 90 34 +11 0 2 5 91 34 +11 0 2 6 90 35 +11 0 2 7 91 35 +11 0 2 8 90 36 +11 0 2 9 91 36 +11 0 2 10 90 37 +11 0 2 11 -1 -1 +11 0 2 12 91 37 +11 0 2 13 90 38 +11 0 2 14 91 38 +11 0 2 15 90 39 +11 0 2 16 91 39 +11 0 2 17 90 40 +11 0 2 18 91 40 +11 0 2 19 90 41 +11 0 2 20 91 41 +11 0 2 21 90 42 +11 0 2 22 -1 -1 +11 0 2 23 91 42 +11 0 2 24 90 43 +11 0 2 25 91 43 +11 0 2 26 90 44 +11 0 2 27 91 44 +11 0 2 28 90 45 +11 0 2 29 91 45 +11 0 2 30 90 46 +11 0 2 31 91 46 +11 0 2 32 90 47 +11 0 2 33 91 47 +11 0 2 34 90 48 +11 0 2 35 91 48 +11 0 2 36 90 49 +11 0 2 37 91 49 +11 0 2 38 90 50 +11 0 2 39 91 50 +11 0 2 40 90 51 +11 0 2 41 91 51 +11 0 2 42 90 52 +11 0 2 43 91 52 +11 0 2 44 90 53 +11 0 2 45 -1 -1 +11 0 2 46 91 53 +11 0 2 47 90 54 +11 0 2 48 91 54 +11 0 2 49 90 55 +11 0 2 50 91 55 +11 0 2 51 90 56 +11 0 2 52 91 56 +11 0 2 53 90 57 +11 0 2 54 91 57 +11 0 2 55 90 58 +11 0 2 56 -1 -1 +11 0 2 57 91 58 +11 0 2 58 90 59 +11 0 2 59 91 59 +11 0 2 60 90 60 +11 0 2 61 91 60 +11 0 2 62 90 61 +11 0 2 63 91 61 +11 0 2 64 90 62 +11 0 2 65 91 62 +11 0 2 66 90 63 +11 0 2 67 91 63 +11 0 3 0 90 0 +11 0 3 1 91 0 +11 0 3 2 90 1 +11 0 3 3 91 1 +11 0 3 4 90 2 +11 0 3 5 91 2 +11 0 3 6 90 3 +11 0 3 7 91 3 +11 0 3 8 90 4 +11 0 3 9 91 4 +11 0 3 10 90 5 +11 0 3 11 -1 -1 +11 0 3 12 91 5 +11 0 3 13 90 6 +11 0 3 14 91 6 +11 0 3 15 90 7 +11 0 3 16 91 7 +11 0 3 17 90 8 +11 0 3 18 91 8 +11 0 3 19 90 9 +11 0 3 20 91 9 +11 0 3 21 90 10 +11 0 3 22 -1 -1 +11 0 3 23 91 10 +11 0 3 24 90 11 +11 0 3 25 91 11 +11 0 3 26 90 12 +11 0 3 27 91 12 +11 0 3 28 90 13 +11 0 3 29 91 13 +11 0 3 30 90 14 +11 0 3 31 91 14 +11 0 3 32 90 15 +11 0 3 33 91 15 +11 0 3 34 90 16 +11 0 3 35 91 16 +11 0 3 36 90 17 +11 0 3 37 91 17 +11 0 3 38 90 18 +11 0 3 39 91 18 +11 0 3 40 90 19 +11 0 3 41 91 19 +11 0 3 42 90 20 +11 0 3 43 91 20 +11 0 3 44 90 21 +11 0 3 45 -1 -1 +11 0 3 46 91 21 +11 0 3 47 90 22 +11 0 3 48 91 22 +11 0 3 49 90 23 +11 0 3 50 91 23 +11 0 3 51 90 24 +11 0 3 52 91 24 +11 0 3 53 90 25 +11 0 3 54 91 25 +11 0 3 55 90 26 +11 0 3 56 -1 -1 +11 0 3 57 91 26 +11 0 3 58 90 27 +11 0 3 59 91 27 +11 0 3 60 90 28 +11 0 3 61 91 28 +11 0 3 62 90 29 +11 0 3 63 91 29 +11 0 3 64 90 30 +11 0 3 65 91 30 +11 0 3 66 90 31 +11 0 3 67 91 31 +11 1 0 0 91 95 +11 1 0 1 90 95 +11 1 0 2 91 94 +11 1 0 3 90 94 +11 1 0 4 91 93 +11 1 0 5 90 93 +11 1 0 6 91 92 +11 1 0 7 90 92 +11 1 0 8 91 91 +11 1 0 9 90 91 +11 1 0 10 91 90 +11 1 0 11 -1 -1 +11 1 0 12 90 90 +11 1 0 13 91 89 +11 1 0 14 90 89 +11 1 0 15 91 88 +11 1 0 16 90 88 +11 1 0 17 91 87 +11 1 0 18 90 87 +11 1 0 19 91 86 +11 1 0 20 90 86 +11 1 0 21 91 85 +11 1 0 22 -1 -1 +11 1 0 23 90 85 +11 1 0 24 91 84 +11 1 0 25 90 84 +11 1 0 26 91 83 +11 1 0 27 90 83 +11 1 0 28 91 82 +11 1 0 29 90 82 +11 1 0 30 91 81 +11 1 0 31 90 81 +11 1 0 32 91 80 +11 1 0 33 90 80 +11 1 0 34 91 79 +11 1 0 35 90 79 +11 1 0 36 91 78 +11 1 0 37 90 78 +11 1 0 38 91 77 +11 1 0 39 90 77 +11 1 0 40 91 76 +11 1 0 41 90 76 +11 1 0 42 91 75 +11 1 0 43 90 75 +11 1 0 44 91 74 +11 1 0 45 -1 -1 +11 1 0 46 90 74 +11 1 0 47 91 73 +11 1 0 48 90 73 +11 1 0 49 91 72 +11 1 0 50 90 72 +11 1 0 51 91 71 +11 1 0 52 90 71 +11 1 0 53 91 70 +11 1 0 54 90 70 +11 1 0 55 91 69 +11 1 0 56 -1 -1 +11 1 0 57 90 69 +11 1 0 58 91 68 +11 1 0 59 90 68 +11 1 0 60 91 67 +11 1 0 61 90 67 +11 1 0 62 91 66 +11 1 0 63 90 66 +11 1 0 64 91 65 +11 1 0 65 90 65 +11 1 0 66 91 64 +11 1 0 67 90 64 +11 1 1 0 91 127 +11 1 1 1 90 127 +11 1 1 2 91 126 +11 1 1 3 90 126 +11 1 1 4 91 125 +11 1 1 5 90 125 +11 1 1 6 91 124 +11 1 1 7 90 124 +11 1 1 8 91 123 +11 1 1 9 90 123 +11 1 1 10 91 122 +11 1 1 11 -1 -1 +11 1 1 12 90 122 +11 1 1 13 91 121 +11 1 1 14 90 121 +11 1 1 15 91 120 +11 1 1 16 90 120 +11 1 1 17 91 119 +11 1 1 18 90 119 +11 1 1 19 91 118 +11 1 1 20 90 118 +11 1 1 21 91 117 +11 1 1 22 -1 -1 +11 1 1 23 90 117 +11 1 1 24 91 116 +11 1 1 25 90 116 +11 1 1 26 91 115 +11 1 1 27 90 115 +11 1 1 28 91 114 +11 1 1 29 90 114 +11 1 1 30 91 113 +11 1 1 31 90 113 +11 1 1 32 91 112 +11 1 1 33 90 112 +11 1 1 34 91 111 +11 1 1 35 90 111 +11 1 1 36 91 110 +11 1 1 37 90 110 +11 1 1 38 91 109 +11 1 1 39 90 109 +11 1 1 40 91 108 +11 1 1 41 90 108 +11 1 1 42 91 107 +11 1 1 43 90 107 +11 1 1 44 91 106 +11 1 1 45 -1 -1 +11 1 1 46 90 106 +11 1 1 47 91 105 +11 1 1 48 90 105 +11 1 1 49 91 104 +11 1 1 50 90 104 +11 1 1 51 91 103 +11 1 1 52 90 103 +11 1 1 53 91 102 +11 1 1 54 90 102 +11 1 1 55 91 101 +11 1 1 56 -1 -1 +11 1 1 57 90 101 +11 1 1 58 91 100 +11 1 1 59 90 100 +11 1 1 60 91 99 +11 1 1 61 90 99 +11 1 1 62 91 98 +11 1 1 63 90 98 +11 1 1 64 91 97 +11 1 1 65 90 97 +11 1 1 66 91 96 +11 1 1 67 90 96 +11 1 2 0 89 95 +11 1 2 1 88 95 +11 1 2 2 89 94 +11 1 2 3 88 94 +11 1 2 4 89 93 +11 1 2 5 88 93 +11 1 2 6 89 92 +11 1 2 7 88 92 +11 1 2 8 89 91 +11 1 2 9 88 91 +11 1 2 10 89 90 +11 1 2 11 -1 -1 +11 1 2 12 88 90 +11 1 2 13 89 89 +11 1 2 14 88 89 +11 1 2 15 89 88 +11 1 2 16 88 88 +11 1 2 17 89 87 +11 1 2 18 88 87 +11 1 2 19 89 86 +11 1 2 20 88 86 +11 1 2 21 89 85 +11 1 2 22 -1 -1 +11 1 2 23 88 85 +11 1 2 24 89 84 +11 1 2 25 88 84 +11 1 2 26 89 83 +11 1 2 27 88 83 +11 1 2 28 89 82 +11 1 2 29 88 82 +11 1 2 30 89 81 +11 1 2 31 88 81 +11 1 2 32 89 80 +11 1 2 33 88 80 +11 1 2 34 89 79 +11 1 2 35 88 79 +11 1 2 36 89 78 +11 1 2 37 88 78 +11 1 2 38 89 77 +11 1 2 39 88 77 +11 1 2 40 89 76 +11 1 2 41 88 76 +11 1 2 42 89 75 +11 1 2 43 88 75 +11 1 2 44 89 74 +11 1 2 45 -1 -1 +11 1 2 46 88 74 +11 1 2 47 89 73 +11 1 2 48 88 73 +11 1 2 49 89 72 +11 1 2 50 88 72 +11 1 2 51 89 71 +11 1 2 52 88 71 +11 1 2 53 89 70 +11 1 2 54 88 70 +11 1 2 55 89 69 +11 1 2 56 -1 -1 +11 1 2 57 88 69 +11 1 2 58 89 68 +11 1 2 59 88 68 +11 1 2 60 89 67 +11 1 2 61 88 67 +11 1 2 62 89 66 +11 1 2 63 88 66 +11 1 2 64 89 65 +11 1 2 65 88 65 +11 1 2 66 89 64 +11 1 2 67 88 64 +11 1 3 0 89 127 +11 1 3 1 88 127 +11 1 3 2 89 126 +11 1 3 3 88 126 +11 1 3 4 89 125 +11 1 3 5 88 125 +11 1 3 6 89 124 +11 1 3 7 88 124 +11 1 3 8 89 123 +11 1 3 9 88 123 +11 1 3 10 89 122 +11 1 3 11 -1 -1 +11 1 3 12 88 122 +11 1 3 13 89 121 +11 1 3 14 88 121 +11 1 3 15 89 120 +11 1 3 16 88 120 +11 1 3 17 89 119 +11 1 3 18 88 119 +11 1 3 19 89 118 +11 1 3 20 88 118 +11 1 3 21 89 117 +11 1 3 22 -1 -1 +11 1 3 23 88 117 +11 1 3 24 89 116 +11 1 3 25 88 116 +11 1 3 26 89 115 +11 1 3 27 88 115 +11 1 3 28 89 114 +11 1 3 29 88 114 +11 1 3 30 89 113 +11 1 3 31 88 113 +11 1 3 32 89 112 +11 1 3 33 88 112 +11 1 3 34 89 111 +11 1 3 35 88 111 +11 1 3 36 89 110 +11 1 3 37 88 110 +11 1 3 38 89 109 +11 1 3 39 88 109 +11 1 3 40 89 108 +11 1 3 41 88 108 +11 1 3 42 89 107 +11 1 3 43 88 107 +11 1 3 44 89 106 +11 1 3 45 -1 -1 +11 1 3 46 88 106 +11 1 3 47 89 105 +11 1 3 48 88 105 +11 1 3 49 89 104 +11 1 3 50 88 104 +11 1 3 51 89 103 +11 1 3 52 88 103 +11 1 3 53 89 102 +11 1 3 54 88 102 +11 1 3 55 89 101 +11 1 3 56 -1 -1 +11 1 3 57 88 101 +11 1 3 58 89 100 +11 1 3 59 88 100 +11 1 3 60 89 99 +11 1 3 61 88 99 +11 1 3 62 89 98 +11 1 3 63 88 98 +11 1 3 64 89 97 +11 1 3 65 88 97 +11 1 3 66 89 96 +11 1 3 67 88 96 +11 2 0 0 92 32 +11 2 0 1 93 32 +11 2 0 2 92 33 +11 2 0 3 93 33 +11 2 0 4 92 34 +11 2 0 5 93 34 +11 2 0 6 92 35 +11 2 0 7 93 35 +11 2 0 8 92 36 +11 2 0 9 93 36 +11 2 0 10 92 37 +11 2 0 11 -1 -1 +11 2 0 12 93 37 +11 2 0 13 92 38 +11 2 0 14 93 38 +11 2 0 15 92 39 +11 2 0 16 93 39 +11 2 0 17 92 40 +11 2 0 18 93 40 +11 2 0 19 92 41 +11 2 0 20 93 41 +11 2 0 21 92 42 +11 2 0 22 -1 -1 +11 2 0 23 93 42 +11 2 0 24 92 43 +11 2 0 25 93 43 +11 2 0 26 92 44 +11 2 0 27 93 44 +11 2 0 28 92 45 +11 2 0 29 93 45 +11 2 0 30 92 46 +11 2 0 31 93 46 +11 2 0 32 92 47 +11 2 0 33 93 47 +11 2 0 34 92 48 +11 2 0 35 93 48 +11 2 0 36 92 49 +11 2 0 37 93 49 +11 2 0 38 92 50 +11 2 0 39 93 50 +11 2 0 40 92 51 +11 2 0 41 93 51 +11 2 0 42 92 52 +11 2 0 43 93 52 +11 2 0 44 92 53 +11 2 0 45 -1 -1 +11 2 0 46 93 53 +11 2 0 47 92 54 +11 2 0 48 93 54 +11 2 0 49 92 55 +11 2 0 50 93 55 +11 2 0 51 92 56 +11 2 0 52 93 56 +11 2 0 53 92 57 +11 2 0 54 93 57 +11 2 0 55 92 58 +11 2 0 56 -1 -1 +11 2 0 57 93 58 +11 2 0 58 92 59 +11 2 0 59 93 59 +11 2 0 60 92 60 +11 2 0 61 93 60 +11 2 0 62 92 61 +11 2 0 63 93 61 +11 2 0 64 92 62 +11 2 0 65 93 62 +11 2 0 66 92 63 +11 2 0 67 93 63 +11 2 1 0 92 0 +11 2 1 1 93 0 +11 2 1 2 92 1 +11 2 1 3 93 1 +11 2 1 4 92 2 +11 2 1 5 93 2 +11 2 1 6 92 3 +11 2 1 7 93 3 +11 2 1 8 92 4 +11 2 1 9 93 4 +11 2 1 10 92 5 +11 2 1 11 -1 -1 +11 2 1 12 93 5 +11 2 1 13 92 6 +11 2 1 14 93 6 +11 2 1 15 92 7 +11 2 1 16 93 7 +11 2 1 17 92 8 +11 2 1 18 93 8 +11 2 1 19 92 9 +11 2 1 20 93 9 +11 2 1 21 92 10 +11 2 1 22 -1 -1 +11 2 1 23 93 10 +11 2 1 24 92 11 +11 2 1 25 93 11 +11 2 1 26 92 12 +11 2 1 27 93 12 +11 2 1 28 92 13 +11 2 1 29 93 13 +11 2 1 30 92 14 +11 2 1 31 93 14 +11 2 1 32 92 15 +11 2 1 33 93 15 +11 2 1 34 92 16 +11 2 1 35 93 16 +11 2 1 36 92 17 +11 2 1 37 93 17 +11 2 1 38 92 18 +11 2 1 39 93 18 +11 2 1 40 92 19 +11 2 1 41 93 19 +11 2 1 42 92 20 +11 2 1 43 93 20 +11 2 1 44 92 21 +11 2 1 45 -1 -1 +11 2 1 46 93 21 +11 2 1 47 92 22 +11 2 1 48 93 22 +11 2 1 49 92 23 +11 2 1 50 93 23 +11 2 1 51 92 24 +11 2 1 52 93 24 +11 2 1 53 92 25 +11 2 1 54 93 25 +11 2 1 55 92 26 +11 2 1 56 -1 -1 +11 2 1 57 93 26 +11 2 1 58 92 27 +11 2 1 59 93 27 +11 2 1 60 92 28 +11 2 1 61 93 28 +11 2 1 62 92 29 +11 2 1 63 93 29 +11 2 1 64 92 30 +11 2 1 65 93 30 +11 2 1 66 92 31 +11 2 1 67 93 31 +11 2 2 0 94 32 +11 2 2 1 95 32 +11 2 2 2 94 33 +11 2 2 3 95 33 +11 2 2 4 94 34 +11 2 2 5 95 34 +11 2 2 6 94 35 +11 2 2 7 95 35 +11 2 2 8 94 36 +11 2 2 9 95 36 +11 2 2 10 94 37 +11 2 2 11 -1 -1 +11 2 2 12 95 37 +11 2 2 13 94 38 +11 2 2 14 95 38 +11 2 2 15 94 39 +11 2 2 16 95 39 +11 2 2 17 94 40 +11 2 2 18 95 40 +11 2 2 19 94 41 +11 2 2 20 95 41 +11 2 2 21 94 42 +11 2 2 22 -1 -1 +11 2 2 23 95 42 +11 2 2 24 94 43 +11 2 2 25 95 43 +11 2 2 26 94 44 +11 2 2 27 95 44 +11 2 2 28 94 45 +11 2 2 29 95 45 +11 2 2 30 94 46 +11 2 2 31 95 46 +11 2 2 32 94 47 +11 2 2 33 95 47 +11 2 2 34 94 48 +11 2 2 35 95 48 +11 2 2 36 94 49 +11 2 2 37 95 49 +11 2 2 38 94 50 +11 2 2 39 95 50 +11 2 2 40 94 51 +11 2 2 41 95 51 +11 2 2 42 94 52 +11 2 2 43 95 52 +11 2 2 44 94 53 +11 2 2 45 -1 -1 +11 2 2 46 95 53 +11 2 2 47 94 54 +11 2 2 48 95 54 +11 2 2 49 94 55 +11 2 2 50 95 55 +11 2 2 51 94 56 +11 2 2 52 95 56 +11 2 2 53 94 57 +11 2 2 54 95 57 +11 2 2 55 94 58 +11 2 2 56 -1 -1 +11 2 2 57 95 58 +11 2 2 58 94 59 +11 2 2 59 95 59 +11 2 2 60 94 60 +11 2 2 61 95 60 +11 2 2 62 94 61 +11 2 2 63 95 61 +11 2 2 64 94 62 +11 2 2 65 95 62 +11 2 2 66 94 63 +11 2 2 67 95 63 +11 2 3 0 94 0 +11 2 3 1 95 0 +11 2 3 2 94 1 +11 2 3 3 95 1 +11 2 3 4 94 2 +11 2 3 5 95 2 +11 2 3 6 94 3 +11 2 3 7 95 3 +11 2 3 8 94 4 +11 2 3 9 95 4 +11 2 3 10 94 5 +11 2 3 11 -1 -1 +11 2 3 12 95 5 +11 2 3 13 94 6 +11 2 3 14 95 6 +11 2 3 15 94 7 +11 2 3 16 95 7 +11 2 3 17 94 8 +11 2 3 18 95 8 +11 2 3 19 94 9 +11 2 3 20 95 9 +11 2 3 21 94 10 +11 2 3 22 -1 -1 +11 2 3 23 95 10 +11 2 3 24 94 11 +11 2 3 25 95 11 +11 2 3 26 94 12 +11 2 3 27 95 12 +11 2 3 28 94 13 +11 2 3 29 95 13 +11 2 3 30 94 14 +11 2 3 31 95 14 +11 2 3 32 94 15 +11 2 3 33 95 15 +11 2 3 34 94 16 +11 2 3 35 95 16 +11 2 3 36 94 17 +11 2 3 37 95 17 +11 2 3 38 94 18 +11 2 3 39 95 18 +11 2 3 40 94 19 +11 2 3 41 95 19 +11 2 3 42 94 20 +11 2 3 43 95 20 +11 2 3 44 94 21 +11 2 3 45 -1 -1 +11 2 3 46 95 21 +11 2 3 47 94 22 +11 2 3 48 95 22 +11 2 3 49 94 23 +11 2 3 50 95 23 +11 2 3 51 94 24 +11 2 3 52 95 24 +11 2 3 53 94 25 +11 2 3 54 95 25 +11 2 3 55 94 26 +11 2 3 56 -1 -1 +11 2 3 57 95 26 +11 2 3 58 94 27 +11 2 3 59 95 27 +11 2 3 60 94 28 +11 2 3 61 95 28 +11 2 3 62 94 29 +11 2 3 63 95 29 +11 2 3 64 94 30 +11 2 3 65 95 30 +11 2 3 66 94 31 +11 2 3 67 95 31 +11 3 0 0 95 95 +11 3 0 1 94 95 +11 3 0 2 95 94 +11 3 0 3 94 94 +11 3 0 4 95 93 +11 3 0 5 94 93 +11 3 0 6 95 92 +11 3 0 7 94 92 +11 3 0 8 95 91 +11 3 0 9 94 91 +11 3 0 10 95 90 +11 3 0 11 -1 -1 +11 3 0 12 94 90 +11 3 0 13 95 89 +11 3 0 14 94 89 +11 3 0 15 95 88 +11 3 0 16 94 88 +11 3 0 17 95 87 +11 3 0 18 94 87 +11 3 0 19 95 86 +11 3 0 20 94 86 +11 3 0 21 95 85 +11 3 0 22 -1 -1 +11 3 0 23 94 85 +11 3 0 24 95 84 +11 3 0 25 94 84 +11 3 0 26 95 83 +11 3 0 27 94 83 +11 3 0 28 95 82 +11 3 0 29 94 82 +11 3 0 30 95 81 +11 3 0 31 94 81 +11 3 0 32 95 80 +11 3 0 33 94 80 +11 3 0 34 95 79 +11 3 0 35 94 79 +11 3 0 36 95 78 +11 3 0 37 94 78 +11 3 0 38 95 77 +11 3 0 39 94 77 +11 3 0 40 95 76 +11 3 0 41 94 76 +11 3 0 42 95 75 +11 3 0 43 94 75 +11 3 0 44 95 74 +11 3 0 45 -1 -1 +11 3 0 46 94 74 +11 3 0 47 95 73 +11 3 0 48 94 73 +11 3 0 49 95 72 +11 3 0 50 94 72 +11 3 0 51 95 71 +11 3 0 52 94 71 +11 3 0 53 95 70 +11 3 0 54 94 70 +11 3 0 55 95 69 +11 3 0 56 -1 -1 +11 3 0 57 94 69 +11 3 0 58 95 68 +11 3 0 59 94 68 +11 3 0 60 95 67 +11 3 0 61 94 67 +11 3 0 62 95 66 +11 3 0 63 94 66 +11 3 0 64 95 65 +11 3 0 65 94 65 +11 3 0 66 95 64 +11 3 0 67 94 64 +11 3 1 0 95 127 +11 3 1 1 94 127 +11 3 1 2 95 126 +11 3 1 3 94 126 +11 3 1 4 95 125 +11 3 1 5 94 125 +11 3 1 6 95 124 +11 3 1 7 94 124 +11 3 1 8 95 123 +11 3 1 9 94 123 +11 3 1 10 95 122 +11 3 1 11 -1 -1 +11 3 1 12 94 122 +11 3 1 13 95 121 +11 3 1 14 94 121 +11 3 1 15 95 120 +11 3 1 16 94 120 +11 3 1 17 95 119 +11 3 1 18 94 119 +11 3 1 19 95 118 +11 3 1 20 94 118 +11 3 1 21 95 117 +11 3 1 22 -1 -1 +11 3 1 23 94 117 +11 3 1 24 95 116 +11 3 1 25 94 116 +11 3 1 26 95 115 +11 3 1 27 94 115 +11 3 1 28 95 114 +11 3 1 29 94 114 +11 3 1 30 95 113 +11 3 1 31 94 113 +11 3 1 32 95 112 +11 3 1 33 94 112 +11 3 1 34 95 111 +11 3 1 35 94 111 +11 3 1 36 95 110 +11 3 1 37 94 110 +11 3 1 38 95 109 +11 3 1 39 94 109 +11 3 1 40 95 108 +11 3 1 41 94 108 +11 3 1 42 95 107 +11 3 1 43 94 107 +11 3 1 44 95 106 +11 3 1 45 -1 -1 +11 3 1 46 94 106 +11 3 1 47 95 105 +11 3 1 48 94 105 +11 3 1 49 95 104 +11 3 1 50 94 104 +11 3 1 51 95 103 +11 3 1 52 94 103 +11 3 1 53 95 102 +11 3 1 54 94 102 +11 3 1 55 95 101 +11 3 1 56 -1 -1 +11 3 1 57 94 101 +11 3 1 58 95 100 +11 3 1 59 94 100 +11 3 1 60 95 99 +11 3 1 61 94 99 +11 3 1 62 95 98 +11 3 1 63 94 98 +11 3 1 64 95 97 +11 3 1 65 94 97 +11 3 1 66 95 96 +11 3 1 67 94 96 +11 3 2 0 93 95 +11 3 2 1 92 95 +11 3 2 2 93 94 +11 3 2 3 92 94 +11 3 2 4 93 93 +11 3 2 5 92 93 +11 3 2 6 93 92 +11 3 2 7 92 92 +11 3 2 8 93 91 +11 3 2 9 92 91 +11 3 2 10 93 90 +11 3 2 11 -1 -1 +11 3 2 12 92 90 +11 3 2 13 93 89 +11 3 2 14 92 89 +11 3 2 15 93 88 +11 3 2 16 92 88 +11 3 2 17 93 87 +11 3 2 18 92 87 +11 3 2 19 93 86 +11 3 2 20 92 86 +11 3 2 21 93 85 +11 3 2 22 -1 -1 +11 3 2 23 92 85 +11 3 2 24 93 84 +11 3 2 25 92 84 +11 3 2 26 93 83 +11 3 2 27 92 83 +11 3 2 28 93 82 +11 3 2 29 92 82 +11 3 2 30 93 81 +11 3 2 31 92 81 +11 3 2 32 93 80 +11 3 2 33 92 80 +11 3 2 34 93 79 +11 3 2 35 92 79 +11 3 2 36 93 78 +11 3 2 37 92 78 +11 3 2 38 93 77 +11 3 2 39 92 77 +11 3 2 40 93 76 +11 3 2 41 92 76 +11 3 2 42 93 75 +11 3 2 43 92 75 +11 3 2 44 93 74 +11 3 2 45 -1 -1 +11 3 2 46 92 74 +11 3 2 47 93 73 +11 3 2 48 92 73 +11 3 2 49 93 72 +11 3 2 50 92 72 +11 3 2 51 93 71 +11 3 2 52 92 71 +11 3 2 53 93 70 +11 3 2 54 92 70 +11 3 2 55 93 69 +11 3 2 56 -1 -1 +11 3 2 57 92 69 +11 3 2 58 93 68 +11 3 2 59 92 68 +11 3 2 60 93 67 +11 3 2 61 92 67 +11 3 2 62 93 66 +11 3 2 63 92 66 +11 3 2 64 93 65 +11 3 2 65 92 65 +11 3 2 66 93 64 +11 3 2 67 92 64 +11 3 3 0 93 127 +11 3 3 1 92 127 +11 3 3 2 93 126 +11 3 3 3 92 126 +11 3 3 4 93 125 +11 3 3 5 92 125 +11 3 3 6 93 124 +11 3 3 7 92 124 +11 3 3 8 93 123 +11 3 3 9 92 123 +11 3 3 10 93 122 +11 3 3 11 -1 -1 +11 3 3 12 92 122 +11 3 3 13 93 121 +11 3 3 14 92 121 +11 3 3 15 93 120 +11 3 3 16 92 120 +11 3 3 17 93 119 +11 3 3 18 92 119 +11 3 3 19 93 118 +11 3 3 20 92 118 +11 3 3 21 93 117 +11 3 3 22 -1 -1 +11 3 3 23 92 117 +11 3 3 24 93 116 +11 3 3 25 92 116 +11 3 3 26 93 115 +11 3 3 27 92 115 +11 3 3 28 93 114 +11 3 3 29 92 114 +11 3 3 30 93 113 +11 3 3 31 92 113 +11 3 3 32 93 112 +11 3 3 33 92 112 +11 3 3 34 93 111 +11 3 3 35 92 111 +11 3 3 36 93 110 +11 3 3 37 92 110 +11 3 3 38 93 109 +11 3 3 39 92 109 +11 3 3 40 93 108 +11 3 3 41 92 108 +11 3 3 42 93 107 +11 3 3 43 92 107 +11 3 3 44 93 106 +11 3 3 45 -1 -1 +11 3 3 46 92 106 +11 3 3 47 93 105 +11 3 3 48 92 105 +11 3 3 49 93 104 +11 3 3 50 92 104 +11 3 3 51 93 103 +11 3 3 52 92 103 +11 3 3 53 93 102 +11 3 3 54 92 102 +11 3 3 55 93 101 +11 3 3 56 -1 -1 +11 3 3 57 92 101 +11 3 3 58 93 100 +11 3 3 59 92 100 +11 3 3 60 93 99 +11 3 3 61 92 99 +11 3 3 62 93 98 +11 3 3 63 92 98 +11 3 3 64 93 97 +11 3 3 65 92 97 +11 3 3 66 93 96 +11 3 3 67 92 96 +12 0 0 0 96 32 +12 0 0 1 97 32 +12 0 0 2 96 33 +12 0 0 3 97 33 +12 0 0 4 96 34 +12 0 0 5 97 34 +12 0 0 6 96 35 +12 0 0 7 97 35 +12 0 0 8 96 36 +12 0 0 9 97 36 +12 0 0 10 96 37 +12 0 0 11 -1 -1 +12 0 0 12 97 37 +12 0 0 13 96 38 +12 0 0 14 97 38 +12 0 0 15 96 39 +12 0 0 16 97 39 +12 0 0 17 96 40 +12 0 0 18 97 40 +12 0 0 19 96 41 +12 0 0 20 97 41 +12 0 0 21 96 42 +12 0 0 22 -1 -1 +12 0 0 23 97 42 +12 0 0 24 96 43 +12 0 0 25 97 43 +12 0 0 26 96 44 +12 0 0 27 97 44 +12 0 0 28 96 45 +12 0 0 29 97 45 +12 0 0 30 96 46 +12 0 0 31 97 46 +12 0 0 32 96 47 +12 0 0 33 97 47 +12 0 0 34 96 48 +12 0 0 35 97 48 +12 0 0 36 96 49 +12 0 0 37 97 49 +12 0 0 38 96 50 +12 0 0 39 97 50 +12 0 0 40 96 51 +12 0 0 41 97 51 +12 0 0 42 96 52 +12 0 0 43 97 52 +12 0 0 44 96 53 +12 0 0 45 -1 -1 +12 0 0 46 97 53 +12 0 0 47 96 54 +12 0 0 48 97 54 +12 0 0 49 96 55 +12 0 0 50 97 55 +12 0 0 51 96 56 +12 0 0 52 97 56 +12 0 0 53 96 57 +12 0 0 54 97 57 +12 0 0 55 96 58 +12 0 0 56 -1 -1 +12 0 0 57 97 58 +12 0 0 58 96 59 +12 0 0 59 97 59 +12 0 0 60 96 60 +12 0 0 61 97 60 +12 0 0 62 96 61 +12 0 0 63 97 61 +12 0 0 64 96 62 +12 0 0 65 97 62 +12 0 0 66 96 63 +12 0 0 67 97 63 +12 0 1 0 96 0 +12 0 1 1 97 0 +12 0 1 2 96 1 +12 0 1 3 97 1 +12 0 1 4 96 2 +12 0 1 5 97 2 +12 0 1 6 96 3 +12 0 1 7 97 3 +12 0 1 8 96 4 +12 0 1 9 97 4 +12 0 1 10 96 5 +12 0 1 11 -1 -1 +12 0 1 12 97 5 +12 0 1 13 96 6 +12 0 1 14 97 6 +12 0 1 15 96 7 +12 0 1 16 97 7 +12 0 1 17 96 8 +12 0 1 18 97 8 +12 0 1 19 96 9 +12 0 1 20 97 9 +12 0 1 21 96 10 +12 0 1 22 -1 -1 +12 0 1 23 97 10 +12 0 1 24 96 11 +12 0 1 25 97 11 +12 0 1 26 96 12 +12 0 1 27 97 12 +12 0 1 28 96 13 +12 0 1 29 97 13 +12 0 1 30 96 14 +12 0 1 31 97 14 +12 0 1 32 96 15 +12 0 1 33 97 15 +12 0 1 34 96 16 +12 0 1 35 97 16 +12 0 1 36 96 17 +12 0 1 37 97 17 +12 0 1 38 96 18 +12 0 1 39 97 18 +12 0 1 40 96 19 +12 0 1 41 97 19 +12 0 1 42 96 20 +12 0 1 43 97 20 +12 0 1 44 96 21 +12 0 1 45 -1 -1 +12 0 1 46 97 21 +12 0 1 47 96 22 +12 0 1 48 97 22 +12 0 1 49 96 23 +12 0 1 50 97 23 +12 0 1 51 96 24 +12 0 1 52 97 24 +12 0 1 53 96 25 +12 0 1 54 97 25 +12 0 1 55 96 26 +12 0 1 56 -1 -1 +12 0 1 57 97 26 +12 0 1 58 96 27 +12 0 1 59 97 27 +12 0 1 60 96 28 +12 0 1 61 97 28 +12 0 1 62 96 29 +12 0 1 63 97 29 +12 0 1 64 96 30 +12 0 1 65 97 30 +12 0 1 66 96 31 +12 0 1 67 97 31 +12 0 2 0 98 32 +12 0 2 1 99 32 +12 0 2 2 98 33 +12 0 2 3 99 33 +12 0 2 4 98 34 +12 0 2 5 99 34 +12 0 2 6 98 35 +12 0 2 7 99 35 +12 0 2 8 98 36 +12 0 2 9 99 36 +12 0 2 10 98 37 +12 0 2 11 -1 -1 +12 0 2 12 99 37 +12 0 2 13 98 38 +12 0 2 14 99 38 +12 0 2 15 98 39 +12 0 2 16 99 39 +12 0 2 17 98 40 +12 0 2 18 99 40 +12 0 2 19 98 41 +12 0 2 20 99 41 +12 0 2 21 98 42 +12 0 2 22 -1 -1 +12 0 2 23 99 42 +12 0 2 24 98 43 +12 0 2 25 99 43 +12 0 2 26 98 44 +12 0 2 27 99 44 +12 0 2 28 98 45 +12 0 2 29 99 45 +12 0 2 30 98 46 +12 0 2 31 99 46 +12 0 2 32 98 47 +12 0 2 33 99 47 +12 0 2 34 98 48 +12 0 2 35 99 48 +12 0 2 36 98 49 +12 0 2 37 99 49 +12 0 2 38 98 50 +12 0 2 39 99 50 +12 0 2 40 98 51 +12 0 2 41 99 51 +12 0 2 42 98 52 +12 0 2 43 99 52 +12 0 2 44 98 53 +12 0 2 45 -1 -1 +12 0 2 46 99 53 +12 0 2 47 98 54 +12 0 2 48 99 54 +12 0 2 49 98 55 +12 0 2 50 99 55 +12 0 2 51 98 56 +12 0 2 52 99 56 +12 0 2 53 98 57 +12 0 2 54 99 57 +12 0 2 55 98 58 +12 0 2 56 -1 -1 +12 0 2 57 99 58 +12 0 2 58 98 59 +12 0 2 59 99 59 +12 0 2 60 98 60 +12 0 2 61 99 60 +12 0 2 62 98 61 +12 0 2 63 99 61 +12 0 2 64 98 62 +12 0 2 65 99 62 +12 0 2 66 98 63 +12 0 2 67 99 63 +12 0 3 0 98 0 +12 0 3 1 99 0 +12 0 3 2 98 1 +12 0 3 3 99 1 +12 0 3 4 98 2 +12 0 3 5 99 2 +12 0 3 6 98 3 +12 0 3 7 99 3 +12 0 3 8 98 4 +12 0 3 9 99 4 +12 0 3 10 98 5 +12 0 3 11 -1 -1 +12 0 3 12 99 5 +12 0 3 13 98 6 +12 0 3 14 99 6 +12 0 3 15 98 7 +12 0 3 16 99 7 +12 0 3 17 98 8 +12 0 3 18 99 8 +12 0 3 19 98 9 +12 0 3 20 99 9 +12 0 3 21 98 10 +12 0 3 22 -1 -1 +12 0 3 23 99 10 +12 0 3 24 98 11 +12 0 3 25 99 11 +12 0 3 26 98 12 +12 0 3 27 99 12 +12 0 3 28 98 13 +12 0 3 29 99 13 +12 0 3 30 98 14 +12 0 3 31 99 14 +12 0 3 32 98 15 +12 0 3 33 99 15 +12 0 3 34 98 16 +12 0 3 35 99 16 +12 0 3 36 98 17 +12 0 3 37 99 17 +12 0 3 38 98 18 +12 0 3 39 99 18 +12 0 3 40 98 19 +12 0 3 41 99 19 +12 0 3 42 98 20 +12 0 3 43 99 20 +12 0 3 44 98 21 +12 0 3 45 -1 -1 +12 0 3 46 99 21 +12 0 3 47 98 22 +12 0 3 48 99 22 +12 0 3 49 98 23 +12 0 3 50 99 23 +12 0 3 51 98 24 +12 0 3 52 99 24 +12 0 3 53 98 25 +12 0 3 54 99 25 +12 0 3 55 98 26 +12 0 3 56 -1 -1 +12 0 3 57 99 26 +12 0 3 58 98 27 +12 0 3 59 99 27 +12 0 3 60 98 28 +12 0 3 61 99 28 +12 0 3 62 98 29 +12 0 3 63 99 29 +12 0 3 64 98 30 +12 0 3 65 99 30 +12 0 3 66 98 31 +12 0 3 67 99 31 +12 1 0 0 99 95 +12 1 0 1 98 95 +12 1 0 2 99 94 +12 1 0 3 98 94 +12 1 0 4 99 93 +12 1 0 5 98 93 +12 1 0 6 99 92 +12 1 0 7 98 92 +12 1 0 8 99 91 +12 1 0 9 98 91 +12 1 0 10 99 90 +12 1 0 11 -1 -1 +12 1 0 12 98 90 +12 1 0 13 99 89 +12 1 0 14 98 89 +12 1 0 15 99 88 +12 1 0 16 98 88 +12 1 0 17 99 87 +12 1 0 18 98 87 +12 1 0 19 99 86 +12 1 0 20 98 86 +12 1 0 21 99 85 +12 1 0 22 -1 -1 +12 1 0 23 98 85 +12 1 0 24 99 84 +12 1 0 25 98 84 +12 1 0 26 99 83 +12 1 0 27 98 83 +12 1 0 28 99 82 +12 1 0 29 98 82 +12 1 0 30 99 81 +12 1 0 31 98 81 +12 1 0 32 99 80 +12 1 0 33 98 80 +12 1 0 34 99 79 +12 1 0 35 98 79 +12 1 0 36 99 78 +12 1 0 37 98 78 +12 1 0 38 99 77 +12 1 0 39 98 77 +12 1 0 40 99 76 +12 1 0 41 98 76 +12 1 0 42 99 75 +12 1 0 43 98 75 +12 1 0 44 99 74 +12 1 0 45 -1 -1 +12 1 0 46 98 74 +12 1 0 47 99 73 +12 1 0 48 98 73 +12 1 0 49 99 72 +12 1 0 50 98 72 +12 1 0 51 99 71 +12 1 0 52 98 71 +12 1 0 53 99 70 +12 1 0 54 98 70 +12 1 0 55 99 69 +12 1 0 56 -1 -1 +12 1 0 57 98 69 +12 1 0 58 99 68 +12 1 0 59 98 68 +12 1 0 60 99 67 +12 1 0 61 98 67 +12 1 0 62 99 66 +12 1 0 63 98 66 +12 1 0 64 99 65 +12 1 0 65 98 65 +12 1 0 66 99 64 +12 1 0 67 98 64 +12 1 1 0 99 127 +12 1 1 1 98 127 +12 1 1 2 99 126 +12 1 1 3 98 126 +12 1 1 4 99 125 +12 1 1 5 98 125 +12 1 1 6 99 124 +12 1 1 7 98 124 +12 1 1 8 99 123 +12 1 1 9 98 123 +12 1 1 10 99 122 +12 1 1 11 -1 -1 +12 1 1 12 98 122 +12 1 1 13 99 121 +12 1 1 14 98 121 +12 1 1 15 99 120 +12 1 1 16 98 120 +12 1 1 17 99 119 +12 1 1 18 98 119 +12 1 1 19 99 118 +12 1 1 20 98 118 +12 1 1 21 99 117 +12 1 1 22 -1 -1 +12 1 1 23 98 117 +12 1 1 24 99 116 +12 1 1 25 98 116 +12 1 1 26 99 115 +12 1 1 27 98 115 +12 1 1 28 99 114 +12 1 1 29 98 114 +12 1 1 30 99 113 +12 1 1 31 98 113 +12 1 1 32 99 112 +12 1 1 33 98 112 +12 1 1 34 99 111 +12 1 1 35 98 111 +12 1 1 36 99 110 +12 1 1 37 98 110 +12 1 1 38 99 109 +12 1 1 39 98 109 +12 1 1 40 99 108 +12 1 1 41 98 108 +12 1 1 42 99 107 +12 1 1 43 98 107 +12 1 1 44 99 106 +12 1 1 45 -1 -1 +12 1 1 46 98 106 +12 1 1 47 99 105 +12 1 1 48 98 105 +12 1 1 49 99 104 +12 1 1 50 98 104 +12 1 1 51 99 103 +12 1 1 52 98 103 +12 1 1 53 99 102 +12 1 1 54 98 102 +12 1 1 55 99 101 +12 1 1 56 -1 -1 +12 1 1 57 98 101 +12 1 1 58 99 100 +12 1 1 59 98 100 +12 1 1 60 99 99 +12 1 1 61 98 99 +12 1 1 62 99 98 +12 1 1 63 98 98 +12 1 1 64 99 97 +12 1 1 65 98 97 +12 1 1 66 99 96 +12 1 1 67 98 96 +12 1 2 0 97 95 +12 1 2 1 96 95 +12 1 2 2 97 94 +12 1 2 3 96 94 +12 1 2 4 97 93 +12 1 2 5 96 93 +12 1 2 6 97 92 +12 1 2 7 96 92 +12 1 2 8 97 91 +12 1 2 9 96 91 +12 1 2 10 97 90 +12 1 2 11 -1 -1 +12 1 2 12 96 90 +12 1 2 13 97 89 +12 1 2 14 96 89 +12 1 2 15 97 88 +12 1 2 16 96 88 +12 1 2 17 97 87 +12 1 2 18 96 87 +12 1 2 19 97 86 +12 1 2 20 96 86 +12 1 2 21 97 85 +12 1 2 22 -1 -1 +12 1 2 23 96 85 +12 1 2 24 97 84 +12 1 2 25 96 84 +12 1 2 26 97 83 +12 1 2 27 96 83 +12 1 2 28 97 82 +12 1 2 29 96 82 +12 1 2 30 97 81 +12 1 2 31 96 81 +12 1 2 32 97 80 +12 1 2 33 96 80 +12 1 2 34 97 79 +12 1 2 35 96 79 +12 1 2 36 97 78 +12 1 2 37 96 78 +12 1 2 38 97 77 +12 1 2 39 96 77 +12 1 2 40 97 76 +12 1 2 41 96 76 +12 1 2 42 97 75 +12 1 2 43 96 75 +12 1 2 44 97 74 +12 1 2 45 -1 -1 +12 1 2 46 96 74 +12 1 2 47 97 73 +12 1 2 48 96 73 +12 1 2 49 97 72 +12 1 2 50 96 72 +12 1 2 51 97 71 +12 1 2 52 96 71 +12 1 2 53 97 70 +12 1 2 54 96 70 +12 1 2 55 97 69 +12 1 2 56 -1 -1 +12 1 2 57 96 69 +12 1 2 58 97 68 +12 1 2 59 96 68 +12 1 2 60 97 67 +12 1 2 61 96 67 +12 1 2 62 97 66 +12 1 2 63 96 66 +12 1 2 64 97 65 +12 1 2 65 96 65 +12 1 2 66 97 64 +12 1 2 67 96 64 +12 1 3 0 97 127 +12 1 3 1 96 127 +12 1 3 2 97 126 +12 1 3 3 96 126 +12 1 3 4 97 125 +12 1 3 5 96 125 +12 1 3 6 97 124 +12 1 3 7 96 124 +12 1 3 8 97 123 +12 1 3 9 96 123 +12 1 3 10 97 122 +12 1 3 11 -1 -1 +12 1 3 12 96 122 +12 1 3 13 97 121 +12 1 3 14 96 121 +12 1 3 15 97 120 +12 1 3 16 96 120 +12 1 3 17 97 119 +12 1 3 18 96 119 +12 1 3 19 97 118 +12 1 3 20 96 118 +12 1 3 21 97 117 +12 1 3 22 -1 -1 +12 1 3 23 96 117 +12 1 3 24 97 116 +12 1 3 25 96 116 +12 1 3 26 97 115 +12 1 3 27 96 115 +12 1 3 28 97 114 +12 1 3 29 96 114 +12 1 3 30 97 113 +12 1 3 31 96 113 +12 1 3 32 97 112 +12 1 3 33 96 112 +12 1 3 34 97 111 +12 1 3 35 96 111 +12 1 3 36 97 110 +12 1 3 37 96 110 +12 1 3 38 97 109 +12 1 3 39 96 109 +12 1 3 40 97 108 +12 1 3 41 96 108 +12 1 3 42 97 107 +12 1 3 43 96 107 +12 1 3 44 97 106 +12 1 3 45 -1 -1 +12 1 3 46 96 106 +12 1 3 47 97 105 +12 1 3 48 96 105 +12 1 3 49 97 104 +12 1 3 50 96 104 +12 1 3 51 97 103 +12 1 3 52 96 103 +12 1 3 53 97 102 +12 1 3 54 96 102 +12 1 3 55 97 101 +12 1 3 56 -1 -1 +12 1 3 57 96 101 +12 1 3 58 97 100 +12 1 3 59 96 100 +12 1 3 60 97 99 +12 1 3 61 96 99 +12 1 3 62 97 98 +12 1 3 63 96 98 +12 1 3 64 97 97 +12 1 3 65 96 97 +12 1 3 66 97 96 +12 1 3 67 96 96 +12 2 0 0 100 32 +12 2 0 1 101 32 +12 2 0 2 100 33 +12 2 0 3 101 33 +12 2 0 4 100 34 +12 2 0 5 101 34 +12 2 0 6 100 35 +12 2 0 7 101 35 +12 2 0 8 100 36 +12 2 0 9 101 36 +12 2 0 10 100 37 +12 2 0 11 -1 -1 +12 2 0 12 101 37 +12 2 0 13 100 38 +12 2 0 14 101 38 +12 2 0 15 100 39 +12 2 0 16 101 39 +12 2 0 17 100 40 +12 2 0 18 101 40 +12 2 0 19 100 41 +12 2 0 20 101 41 +12 2 0 21 100 42 +12 2 0 22 -1 -1 +12 2 0 23 101 42 +12 2 0 24 100 43 +12 2 0 25 101 43 +12 2 0 26 100 44 +12 2 0 27 101 44 +12 2 0 28 100 45 +12 2 0 29 101 45 +12 2 0 30 100 46 +12 2 0 31 101 46 +12 2 0 32 100 47 +12 2 0 33 101 47 +12 2 0 34 100 48 +12 2 0 35 101 48 +12 2 0 36 100 49 +12 2 0 37 101 49 +12 2 0 38 100 50 +12 2 0 39 101 50 +12 2 0 40 100 51 +12 2 0 41 101 51 +12 2 0 42 100 52 +12 2 0 43 101 52 +12 2 0 44 100 53 +12 2 0 45 -1 -1 +12 2 0 46 101 53 +12 2 0 47 100 54 +12 2 0 48 101 54 +12 2 0 49 100 55 +12 2 0 50 101 55 +12 2 0 51 100 56 +12 2 0 52 101 56 +12 2 0 53 100 57 +12 2 0 54 101 57 +12 2 0 55 100 58 +12 2 0 56 -1 -1 +12 2 0 57 101 58 +12 2 0 58 100 59 +12 2 0 59 101 59 +12 2 0 60 100 60 +12 2 0 61 101 60 +12 2 0 62 100 61 +12 2 0 63 101 61 +12 2 0 64 100 62 +12 2 0 65 101 62 +12 2 0 66 100 63 +12 2 0 67 101 63 +12 2 1 0 100 0 +12 2 1 1 101 0 +12 2 1 2 100 1 +12 2 1 3 101 1 +12 2 1 4 100 2 +12 2 1 5 101 2 +12 2 1 6 100 3 +12 2 1 7 101 3 +12 2 1 8 100 4 +12 2 1 9 101 4 +12 2 1 10 100 5 +12 2 1 11 -1 -1 +12 2 1 12 101 5 +12 2 1 13 100 6 +12 2 1 14 101 6 +12 2 1 15 100 7 +12 2 1 16 101 7 +12 2 1 17 100 8 +12 2 1 18 101 8 +12 2 1 19 100 9 +12 2 1 20 101 9 +12 2 1 21 100 10 +12 2 1 22 -1 -1 +12 2 1 23 101 10 +12 2 1 24 100 11 +12 2 1 25 101 11 +12 2 1 26 100 12 +12 2 1 27 101 12 +12 2 1 28 100 13 +12 2 1 29 101 13 +12 2 1 30 100 14 +12 2 1 31 101 14 +12 2 1 32 100 15 +12 2 1 33 101 15 +12 2 1 34 100 16 +12 2 1 35 101 16 +12 2 1 36 100 17 +12 2 1 37 101 17 +12 2 1 38 100 18 +12 2 1 39 101 18 +12 2 1 40 100 19 +12 2 1 41 101 19 +12 2 1 42 100 20 +12 2 1 43 101 20 +12 2 1 44 100 21 +12 2 1 45 -1 -1 +12 2 1 46 101 21 +12 2 1 47 100 22 +12 2 1 48 101 22 +12 2 1 49 100 23 +12 2 1 50 101 23 +12 2 1 51 100 24 +12 2 1 52 101 24 +12 2 1 53 100 25 +12 2 1 54 101 25 +12 2 1 55 100 26 +12 2 1 56 -1 -1 +12 2 1 57 101 26 +12 2 1 58 100 27 +12 2 1 59 101 27 +12 2 1 60 100 28 +12 2 1 61 101 28 +12 2 1 62 100 29 +12 2 1 63 101 29 +12 2 1 64 100 30 +12 2 1 65 101 30 +12 2 1 66 100 31 +12 2 1 67 101 31 +12 2 2 0 102 32 +12 2 2 1 103 32 +12 2 2 2 102 33 +12 2 2 3 103 33 +12 2 2 4 102 34 +12 2 2 5 103 34 +12 2 2 6 102 35 +12 2 2 7 103 35 +12 2 2 8 102 36 +12 2 2 9 103 36 +12 2 2 10 102 37 +12 2 2 11 -1 -1 +12 2 2 12 103 37 +12 2 2 13 102 38 +12 2 2 14 103 38 +12 2 2 15 102 39 +12 2 2 16 103 39 +12 2 2 17 102 40 +12 2 2 18 103 40 +12 2 2 19 102 41 +12 2 2 20 103 41 +12 2 2 21 102 42 +12 2 2 22 -1 -1 +12 2 2 23 103 42 +12 2 2 24 102 43 +12 2 2 25 103 43 +12 2 2 26 102 44 +12 2 2 27 103 44 +12 2 2 28 102 45 +12 2 2 29 103 45 +12 2 2 30 102 46 +12 2 2 31 103 46 +12 2 2 32 102 47 +12 2 2 33 103 47 +12 2 2 34 102 48 +12 2 2 35 103 48 +12 2 2 36 102 49 +12 2 2 37 103 49 +12 2 2 38 102 50 +12 2 2 39 103 50 +12 2 2 40 102 51 +12 2 2 41 103 51 +12 2 2 42 102 52 +12 2 2 43 103 52 +12 2 2 44 102 53 +12 2 2 45 -1 -1 +12 2 2 46 103 53 +12 2 2 47 102 54 +12 2 2 48 103 54 +12 2 2 49 102 55 +12 2 2 50 103 55 +12 2 2 51 102 56 +12 2 2 52 103 56 +12 2 2 53 102 57 +12 2 2 54 103 57 +12 2 2 55 102 58 +12 2 2 56 -1 -1 +12 2 2 57 103 58 +12 2 2 58 102 59 +12 2 2 59 103 59 +12 2 2 60 102 60 +12 2 2 61 103 60 +12 2 2 62 102 61 +12 2 2 63 103 61 +12 2 2 64 102 62 +12 2 2 65 103 62 +12 2 2 66 102 63 +12 2 2 67 103 63 +12 2 3 0 102 0 +12 2 3 1 103 0 +12 2 3 2 102 1 +12 2 3 3 103 1 +12 2 3 4 102 2 +12 2 3 5 103 2 +12 2 3 6 102 3 +12 2 3 7 103 3 +12 2 3 8 102 4 +12 2 3 9 103 4 +12 2 3 10 102 5 +12 2 3 11 -1 -1 +12 2 3 12 103 5 +12 2 3 13 102 6 +12 2 3 14 103 6 +12 2 3 15 102 7 +12 2 3 16 103 7 +12 2 3 17 102 8 +12 2 3 18 103 8 +12 2 3 19 102 9 +12 2 3 20 103 9 +12 2 3 21 102 10 +12 2 3 22 -1 -1 +12 2 3 23 103 10 +12 2 3 24 102 11 +12 2 3 25 103 11 +12 2 3 26 102 12 +12 2 3 27 103 12 +12 2 3 28 102 13 +12 2 3 29 103 13 +12 2 3 30 102 14 +12 2 3 31 103 14 +12 2 3 32 102 15 +12 2 3 33 103 15 +12 2 3 34 102 16 +12 2 3 35 103 16 +12 2 3 36 102 17 +12 2 3 37 103 17 +12 2 3 38 102 18 +12 2 3 39 103 18 +12 2 3 40 102 19 +12 2 3 41 103 19 +12 2 3 42 102 20 +12 2 3 43 103 20 +12 2 3 44 102 21 +12 2 3 45 -1 -1 +12 2 3 46 103 21 +12 2 3 47 102 22 +12 2 3 48 103 22 +12 2 3 49 102 23 +12 2 3 50 103 23 +12 2 3 51 102 24 +12 2 3 52 103 24 +12 2 3 53 102 25 +12 2 3 54 103 25 +12 2 3 55 102 26 +12 2 3 56 -1 -1 +12 2 3 57 103 26 +12 2 3 58 102 27 +12 2 3 59 103 27 +12 2 3 60 102 28 +12 2 3 61 103 28 +12 2 3 62 102 29 +12 2 3 63 103 29 +12 2 3 64 102 30 +12 2 3 65 103 30 +12 2 3 66 102 31 +12 2 3 67 103 31 +12 3 0 0 103 95 +12 3 0 1 102 95 +12 3 0 2 103 94 +12 3 0 3 102 94 +12 3 0 4 103 93 +12 3 0 5 102 93 +12 3 0 6 103 92 +12 3 0 7 102 92 +12 3 0 8 103 91 +12 3 0 9 102 91 +12 3 0 10 103 90 +12 3 0 11 -1 -1 +12 3 0 12 102 90 +12 3 0 13 103 89 +12 3 0 14 102 89 +12 3 0 15 103 88 +12 3 0 16 102 88 +12 3 0 17 103 87 +12 3 0 18 102 87 +12 3 0 19 103 86 +12 3 0 20 102 86 +12 3 0 21 103 85 +12 3 0 22 -1 -1 +12 3 0 23 102 85 +12 3 0 24 103 84 +12 3 0 25 102 84 +12 3 0 26 103 83 +12 3 0 27 102 83 +12 3 0 28 103 82 +12 3 0 29 102 82 +12 3 0 30 103 81 +12 3 0 31 102 81 +12 3 0 32 103 80 +12 3 0 33 102 80 +12 3 0 34 103 79 +12 3 0 35 102 79 +12 3 0 36 103 78 +12 3 0 37 102 78 +12 3 0 38 103 77 +12 3 0 39 102 77 +12 3 0 40 103 76 +12 3 0 41 102 76 +12 3 0 42 103 75 +12 3 0 43 102 75 +12 3 0 44 103 74 +12 3 0 45 -1 -1 +12 3 0 46 102 74 +12 3 0 47 103 73 +12 3 0 48 102 73 +12 3 0 49 103 72 +12 3 0 50 102 72 +12 3 0 51 103 71 +12 3 0 52 102 71 +12 3 0 53 103 70 +12 3 0 54 102 70 +12 3 0 55 103 69 +12 3 0 56 -1 -1 +12 3 0 57 102 69 +12 3 0 58 103 68 +12 3 0 59 102 68 +12 3 0 60 103 67 +12 3 0 61 102 67 +12 3 0 62 103 66 +12 3 0 63 102 66 +12 3 0 64 103 65 +12 3 0 65 102 65 +12 3 0 66 103 64 +12 3 0 67 102 64 +12 3 1 0 103 127 +12 3 1 1 102 127 +12 3 1 2 103 126 +12 3 1 3 102 126 +12 3 1 4 103 125 +12 3 1 5 102 125 +12 3 1 6 103 124 +12 3 1 7 102 124 +12 3 1 8 103 123 +12 3 1 9 102 123 +12 3 1 10 103 122 +12 3 1 11 -1 -1 +12 3 1 12 102 122 +12 3 1 13 103 121 +12 3 1 14 102 121 +12 3 1 15 103 120 +12 3 1 16 102 120 +12 3 1 17 103 119 +12 3 1 18 102 119 +12 3 1 19 103 118 +12 3 1 20 102 118 +12 3 1 21 103 117 +12 3 1 22 -1 -1 +12 3 1 23 102 117 +12 3 1 24 103 116 +12 3 1 25 102 116 +12 3 1 26 103 115 +12 3 1 27 102 115 +12 3 1 28 103 114 +12 3 1 29 102 114 +12 3 1 30 103 113 +12 3 1 31 102 113 +12 3 1 32 103 112 +12 3 1 33 102 112 +12 3 1 34 103 111 +12 3 1 35 102 111 +12 3 1 36 103 110 +12 3 1 37 102 110 +12 3 1 38 103 109 +12 3 1 39 102 109 +12 3 1 40 103 108 +12 3 1 41 102 108 +12 3 1 42 103 107 +12 3 1 43 102 107 +12 3 1 44 103 106 +12 3 1 45 -1 -1 +12 3 1 46 102 106 +12 3 1 47 103 105 +12 3 1 48 102 105 +12 3 1 49 103 104 +12 3 1 50 102 104 +12 3 1 51 103 103 +12 3 1 52 102 103 +12 3 1 53 103 102 +12 3 1 54 102 102 +12 3 1 55 103 101 +12 3 1 56 -1 -1 +12 3 1 57 102 101 +12 3 1 58 103 100 +12 3 1 59 102 100 +12 3 1 60 103 99 +12 3 1 61 102 99 +12 3 1 62 103 98 +12 3 1 63 102 98 +12 3 1 64 103 97 +12 3 1 65 102 97 +12 3 1 66 103 96 +12 3 1 67 102 96 +12 3 2 0 101 95 +12 3 2 1 100 95 +12 3 2 2 101 94 +12 3 2 3 100 94 +12 3 2 4 101 93 +12 3 2 5 100 93 +12 3 2 6 101 92 +12 3 2 7 100 92 +12 3 2 8 101 91 +12 3 2 9 100 91 +12 3 2 10 101 90 +12 3 2 11 -1 -1 +12 3 2 12 100 90 +12 3 2 13 101 89 +12 3 2 14 100 89 +12 3 2 15 101 88 +12 3 2 16 100 88 +12 3 2 17 101 87 +12 3 2 18 100 87 +12 3 2 19 101 86 +12 3 2 20 100 86 +12 3 2 21 101 85 +12 3 2 22 -1 -1 +12 3 2 23 100 85 +12 3 2 24 101 84 +12 3 2 25 100 84 +12 3 2 26 101 83 +12 3 2 27 100 83 +12 3 2 28 101 82 +12 3 2 29 100 82 +12 3 2 30 101 81 +12 3 2 31 100 81 +12 3 2 32 101 80 +12 3 2 33 100 80 +12 3 2 34 101 79 +12 3 2 35 100 79 +12 3 2 36 101 78 +12 3 2 37 100 78 +12 3 2 38 101 77 +12 3 2 39 100 77 +12 3 2 40 101 76 +12 3 2 41 100 76 +12 3 2 42 101 75 +12 3 2 43 100 75 +12 3 2 44 101 74 +12 3 2 45 -1 -1 +12 3 2 46 100 74 +12 3 2 47 101 73 +12 3 2 48 100 73 +12 3 2 49 101 72 +12 3 2 50 100 72 +12 3 2 51 101 71 +12 3 2 52 100 71 +12 3 2 53 101 70 +12 3 2 54 100 70 +12 3 2 55 101 69 +12 3 2 56 -1 -1 +12 3 2 57 100 69 +12 3 2 58 101 68 +12 3 2 59 100 68 +12 3 2 60 101 67 +12 3 2 61 100 67 +12 3 2 62 101 66 +12 3 2 63 100 66 +12 3 2 64 101 65 +12 3 2 65 100 65 +12 3 2 66 101 64 +12 3 2 67 100 64 +12 3 3 0 101 127 +12 3 3 1 100 127 +12 3 3 2 101 126 +12 3 3 3 100 126 +12 3 3 4 101 125 +12 3 3 5 100 125 +12 3 3 6 101 124 +12 3 3 7 100 124 +12 3 3 8 101 123 +12 3 3 9 100 123 +12 3 3 10 101 122 +12 3 3 11 -1 -1 +12 3 3 12 100 122 +12 3 3 13 101 121 +12 3 3 14 100 121 +12 3 3 15 101 120 +12 3 3 16 100 120 +12 3 3 17 101 119 +12 3 3 18 100 119 +12 3 3 19 101 118 +12 3 3 20 100 118 +12 3 3 21 101 117 +12 3 3 22 -1 -1 +12 3 3 23 100 117 +12 3 3 24 101 116 +12 3 3 25 100 116 +12 3 3 26 101 115 +12 3 3 27 100 115 +12 3 3 28 101 114 +12 3 3 29 100 114 +12 3 3 30 101 113 +12 3 3 31 100 113 +12 3 3 32 101 112 +12 3 3 33 100 112 +12 3 3 34 101 111 +12 3 3 35 100 111 +12 3 3 36 101 110 +12 3 3 37 100 110 +12 3 3 38 101 109 +12 3 3 39 100 109 +12 3 3 40 101 108 +12 3 3 41 100 108 +12 3 3 42 101 107 +12 3 3 43 100 107 +12 3 3 44 101 106 +12 3 3 45 -1 -1 +12 3 3 46 100 106 +12 3 3 47 101 105 +12 3 3 48 100 105 +12 3 3 49 101 104 +12 3 3 50 100 104 +12 3 3 51 101 103 +12 3 3 52 100 103 +12 3 3 53 101 102 +12 3 3 54 100 102 +12 3 3 55 101 101 +12 3 3 56 -1 -1 +12 3 3 57 100 101 +12 3 3 58 101 100 +12 3 3 59 100 100 +12 3 3 60 101 99 +12 3 3 61 100 99 +12 3 3 62 101 98 +12 3 3 63 100 98 +12 3 3 64 101 97 +12 3 3 65 100 97 +12 3 3 66 101 96 +12 3 3 67 100 96 +13 0 0 0 104 32 +13 0 0 1 105 32 +13 0 0 2 104 33 +13 0 0 3 105 33 +13 0 0 4 104 34 +13 0 0 5 105 34 +13 0 0 6 104 35 +13 0 0 7 105 35 +13 0 0 8 104 36 +13 0 0 9 105 36 +13 0 0 10 104 37 +13 0 0 11 -1 -1 +13 0 0 12 105 37 +13 0 0 13 104 38 +13 0 0 14 105 38 +13 0 0 15 104 39 +13 0 0 16 105 39 +13 0 0 17 104 40 +13 0 0 18 105 40 +13 0 0 19 104 41 +13 0 0 20 105 41 +13 0 0 21 104 42 +13 0 0 22 -1 -1 +13 0 0 23 105 42 +13 0 0 24 104 43 +13 0 0 25 105 43 +13 0 0 26 104 44 +13 0 0 27 105 44 +13 0 0 28 104 45 +13 0 0 29 105 45 +13 0 0 30 104 46 +13 0 0 31 105 46 +13 0 0 32 104 47 +13 0 0 33 105 47 +13 0 0 34 104 48 +13 0 0 35 105 48 +13 0 0 36 104 49 +13 0 0 37 105 49 +13 0 0 38 104 50 +13 0 0 39 105 50 +13 0 0 40 104 51 +13 0 0 41 105 51 +13 0 0 42 104 52 +13 0 0 43 105 52 +13 0 0 44 104 53 +13 0 0 45 -1 -1 +13 0 0 46 105 53 +13 0 0 47 104 54 +13 0 0 48 105 54 +13 0 0 49 104 55 +13 0 0 50 105 55 +13 0 0 51 104 56 +13 0 0 52 105 56 +13 0 0 53 104 57 +13 0 0 54 105 57 +13 0 0 55 104 58 +13 0 0 56 -1 -1 +13 0 0 57 105 58 +13 0 0 58 104 59 +13 0 0 59 105 59 +13 0 0 60 104 60 +13 0 0 61 105 60 +13 0 0 62 104 61 +13 0 0 63 105 61 +13 0 0 64 104 62 +13 0 0 65 105 62 +13 0 0 66 104 63 +13 0 0 67 105 63 +13 0 1 0 104 0 +13 0 1 1 105 0 +13 0 1 2 104 1 +13 0 1 3 105 1 +13 0 1 4 104 2 +13 0 1 5 105 2 +13 0 1 6 104 3 +13 0 1 7 105 3 +13 0 1 8 104 4 +13 0 1 9 105 4 +13 0 1 10 104 5 +13 0 1 11 -1 -1 +13 0 1 12 105 5 +13 0 1 13 104 6 +13 0 1 14 105 6 +13 0 1 15 104 7 +13 0 1 16 105 7 +13 0 1 17 104 8 +13 0 1 18 105 8 +13 0 1 19 104 9 +13 0 1 20 105 9 +13 0 1 21 104 10 +13 0 1 22 -1 -1 +13 0 1 23 105 10 +13 0 1 24 104 11 +13 0 1 25 105 11 +13 0 1 26 104 12 +13 0 1 27 105 12 +13 0 1 28 104 13 +13 0 1 29 105 13 +13 0 1 30 104 14 +13 0 1 31 105 14 +13 0 1 32 104 15 +13 0 1 33 105 15 +13 0 1 34 104 16 +13 0 1 35 105 16 +13 0 1 36 104 17 +13 0 1 37 105 17 +13 0 1 38 104 18 +13 0 1 39 105 18 +13 0 1 40 104 19 +13 0 1 41 105 19 +13 0 1 42 104 20 +13 0 1 43 105 20 +13 0 1 44 104 21 +13 0 1 45 -1 -1 +13 0 1 46 105 21 +13 0 1 47 104 22 +13 0 1 48 105 22 +13 0 1 49 104 23 +13 0 1 50 105 23 +13 0 1 51 104 24 +13 0 1 52 105 24 +13 0 1 53 104 25 +13 0 1 54 105 25 +13 0 1 55 104 26 +13 0 1 56 -1 -1 +13 0 1 57 105 26 +13 0 1 58 104 27 +13 0 1 59 105 27 +13 0 1 60 104 28 +13 0 1 61 105 28 +13 0 1 62 104 29 +13 0 1 63 105 29 +13 0 1 64 104 30 +13 0 1 65 105 30 +13 0 1 66 104 31 +13 0 1 67 105 31 +13 0 2 0 106 32 +13 0 2 1 107 32 +13 0 2 2 106 33 +13 0 2 3 107 33 +13 0 2 4 106 34 +13 0 2 5 107 34 +13 0 2 6 106 35 +13 0 2 7 107 35 +13 0 2 8 106 36 +13 0 2 9 107 36 +13 0 2 10 106 37 +13 0 2 11 -1 -1 +13 0 2 12 107 37 +13 0 2 13 106 38 +13 0 2 14 107 38 +13 0 2 15 106 39 +13 0 2 16 107 39 +13 0 2 17 106 40 +13 0 2 18 107 40 +13 0 2 19 106 41 +13 0 2 20 107 41 +13 0 2 21 106 42 +13 0 2 22 -1 -1 +13 0 2 23 107 42 +13 0 2 24 106 43 +13 0 2 25 107 43 +13 0 2 26 106 44 +13 0 2 27 107 44 +13 0 2 28 106 45 +13 0 2 29 107 45 +13 0 2 30 106 46 +13 0 2 31 107 46 +13 0 2 32 106 47 +13 0 2 33 107 47 +13 0 2 34 106 48 +13 0 2 35 107 48 +13 0 2 36 106 49 +13 0 2 37 107 49 +13 0 2 38 106 50 +13 0 2 39 107 50 +13 0 2 40 106 51 +13 0 2 41 107 51 +13 0 2 42 106 52 +13 0 2 43 107 52 +13 0 2 44 106 53 +13 0 2 45 -1 -1 +13 0 2 46 107 53 +13 0 2 47 106 54 +13 0 2 48 107 54 +13 0 2 49 106 55 +13 0 2 50 107 55 +13 0 2 51 106 56 +13 0 2 52 107 56 +13 0 2 53 106 57 +13 0 2 54 107 57 +13 0 2 55 106 58 +13 0 2 56 -1 -1 +13 0 2 57 107 58 +13 0 2 58 106 59 +13 0 2 59 107 59 +13 0 2 60 106 60 +13 0 2 61 107 60 +13 0 2 62 106 61 +13 0 2 63 107 61 +13 0 2 64 106 62 +13 0 2 65 107 62 +13 0 2 66 106 63 +13 0 2 67 107 63 +13 0 3 0 106 0 +13 0 3 1 107 0 +13 0 3 2 106 1 +13 0 3 3 107 1 +13 0 3 4 106 2 +13 0 3 5 107 2 +13 0 3 6 106 3 +13 0 3 7 107 3 +13 0 3 8 106 4 +13 0 3 9 107 4 +13 0 3 10 106 5 +13 0 3 11 -1 -1 +13 0 3 12 107 5 +13 0 3 13 106 6 +13 0 3 14 107 6 +13 0 3 15 106 7 +13 0 3 16 107 7 +13 0 3 17 106 8 +13 0 3 18 107 8 +13 0 3 19 106 9 +13 0 3 20 107 9 +13 0 3 21 106 10 +13 0 3 22 -1 -1 +13 0 3 23 107 10 +13 0 3 24 106 11 +13 0 3 25 107 11 +13 0 3 26 106 12 +13 0 3 27 107 12 +13 0 3 28 106 13 +13 0 3 29 107 13 +13 0 3 30 106 14 +13 0 3 31 107 14 +13 0 3 32 106 15 +13 0 3 33 107 15 +13 0 3 34 106 16 +13 0 3 35 107 16 +13 0 3 36 106 17 +13 0 3 37 107 17 +13 0 3 38 106 18 +13 0 3 39 107 18 +13 0 3 40 106 19 +13 0 3 41 107 19 +13 0 3 42 106 20 +13 0 3 43 107 20 +13 0 3 44 106 21 +13 0 3 45 -1 -1 +13 0 3 46 107 21 +13 0 3 47 106 22 +13 0 3 48 107 22 +13 0 3 49 106 23 +13 0 3 50 107 23 +13 0 3 51 106 24 +13 0 3 52 107 24 +13 0 3 53 106 25 +13 0 3 54 107 25 +13 0 3 55 106 26 +13 0 3 56 -1 -1 +13 0 3 57 107 26 +13 0 3 58 106 27 +13 0 3 59 107 27 +13 0 3 60 106 28 +13 0 3 61 107 28 +13 0 3 62 106 29 +13 0 3 63 107 29 +13 0 3 64 106 30 +13 0 3 65 107 30 +13 0 3 66 106 31 +13 0 3 67 107 31 +13 1 0 0 107 95 +13 1 0 1 106 95 +13 1 0 2 107 94 +13 1 0 3 106 94 +13 1 0 4 107 93 +13 1 0 5 106 93 +13 1 0 6 107 92 +13 1 0 7 106 92 +13 1 0 8 107 91 +13 1 0 9 106 91 +13 1 0 10 107 90 +13 1 0 11 -1 -1 +13 1 0 12 106 90 +13 1 0 13 107 89 +13 1 0 14 106 89 +13 1 0 15 107 88 +13 1 0 16 106 88 +13 1 0 17 107 87 +13 1 0 18 106 87 +13 1 0 19 107 86 +13 1 0 20 106 86 +13 1 0 21 107 85 +13 1 0 22 -1 -1 +13 1 0 23 106 85 +13 1 0 24 107 84 +13 1 0 25 106 84 +13 1 0 26 107 83 +13 1 0 27 106 83 +13 1 0 28 107 82 +13 1 0 29 106 82 +13 1 0 30 107 81 +13 1 0 31 106 81 +13 1 0 32 107 80 +13 1 0 33 106 80 +13 1 0 34 107 79 +13 1 0 35 106 79 +13 1 0 36 107 78 +13 1 0 37 106 78 +13 1 0 38 107 77 +13 1 0 39 106 77 +13 1 0 40 107 76 +13 1 0 41 106 76 +13 1 0 42 107 75 +13 1 0 43 106 75 +13 1 0 44 107 74 +13 1 0 45 -1 -1 +13 1 0 46 106 74 +13 1 0 47 107 73 +13 1 0 48 106 73 +13 1 0 49 107 72 +13 1 0 50 106 72 +13 1 0 51 107 71 +13 1 0 52 106 71 +13 1 0 53 107 70 +13 1 0 54 106 70 +13 1 0 55 107 69 +13 1 0 56 -1 -1 +13 1 0 57 106 69 +13 1 0 58 107 68 +13 1 0 59 106 68 +13 1 0 60 107 67 +13 1 0 61 106 67 +13 1 0 62 107 66 +13 1 0 63 106 66 +13 1 0 64 107 65 +13 1 0 65 106 65 +13 1 0 66 107 64 +13 1 0 67 106 64 +13 1 1 0 107 127 +13 1 1 1 106 127 +13 1 1 2 107 126 +13 1 1 3 106 126 +13 1 1 4 107 125 +13 1 1 5 106 125 +13 1 1 6 107 124 +13 1 1 7 106 124 +13 1 1 8 107 123 +13 1 1 9 106 123 +13 1 1 10 107 122 +13 1 1 11 -1 -1 +13 1 1 12 106 122 +13 1 1 13 107 121 +13 1 1 14 106 121 +13 1 1 15 107 120 +13 1 1 16 106 120 +13 1 1 17 107 119 +13 1 1 18 106 119 +13 1 1 19 107 118 +13 1 1 20 106 118 +13 1 1 21 107 117 +13 1 1 22 -1 -1 +13 1 1 23 106 117 +13 1 1 24 107 116 +13 1 1 25 106 116 +13 1 1 26 107 115 +13 1 1 27 106 115 +13 1 1 28 107 114 +13 1 1 29 106 114 +13 1 1 30 107 113 +13 1 1 31 106 113 +13 1 1 32 107 112 +13 1 1 33 106 112 +13 1 1 34 107 111 +13 1 1 35 106 111 +13 1 1 36 107 110 +13 1 1 37 106 110 +13 1 1 38 107 109 +13 1 1 39 106 109 +13 1 1 40 107 108 +13 1 1 41 106 108 +13 1 1 42 107 107 +13 1 1 43 106 107 +13 1 1 44 107 106 +13 1 1 45 -1 -1 +13 1 1 46 106 106 +13 1 1 47 107 105 +13 1 1 48 106 105 +13 1 1 49 107 104 +13 1 1 50 106 104 +13 1 1 51 107 103 +13 1 1 52 106 103 +13 1 1 53 107 102 +13 1 1 54 106 102 +13 1 1 55 107 101 +13 1 1 56 -1 -1 +13 1 1 57 106 101 +13 1 1 58 107 100 +13 1 1 59 106 100 +13 1 1 60 107 99 +13 1 1 61 106 99 +13 1 1 62 107 98 +13 1 1 63 106 98 +13 1 1 64 107 97 +13 1 1 65 106 97 +13 1 1 66 107 96 +13 1 1 67 106 96 +13 1 2 0 105 95 +13 1 2 1 104 95 +13 1 2 2 105 94 +13 1 2 3 104 94 +13 1 2 4 105 93 +13 1 2 5 104 93 +13 1 2 6 105 92 +13 1 2 7 104 92 +13 1 2 8 105 91 +13 1 2 9 104 91 +13 1 2 10 105 90 +13 1 2 11 -1 -1 +13 1 2 12 104 90 +13 1 2 13 105 89 +13 1 2 14 104 89 +13 1 2 15 105 88 +13 1 2 16 104 88 +13 1 2 17 105 87 +13 1 2 18 104 87 +13 1 2 19 105 86 +13 1 2 20 104 86 +13 1 2 21 105 85 +13 1 2 22 -1 -1 +13 1 2 23 104 85 +13 1 2 24 105 84 +13 1 2 25 104 84 +13 1 2 26 105 83 +13 1 2 27 104 83 +13 1 2 28 105 82 +13 1 2 29 104 82 +13 1 2 30 105 81 +13 1 2 31 104 81 +13 1 2 32 105 80 +13 1 2 33 104 80 +13 1 2 34 105 79 +13 1 2 35 104 79 +13 1 2 36 105 78 +13 1 2 37 104 78 +13 1 2 38 105 77 +13 1 2 39 104 77 +13 1 2 40 105 76 +13 1 2 41 104 76 +13 1 2 42 105 75 +13 1 2 43 104 75 +13 1 2 44 105 74 +13 1 2 45 -1 -1 +13 1 2 46 104 74 +13 1 2 47 105 73 +13 1 2 48 104 73 +13 1 2 49 105 72 +13 1 2 50 104 72 +13 1 2 51 105 71 +13 1 2 52 104 71 +13 1 2 53 105 70 +13 1 2 54 104 70 +13 1 2 55 105 69 +13 1 2 56 -1 -1 +13 1 2 57 104 69 +13 1 2 58 105 68 +13 1 2 59 104 68 +13 1 2 60 105 67 +13 1 2 61 104 67 +13 1 2 62 105 66 +13 1 2 63 104 66 +13 1 2 64 105 65 +13 1 2 65 104 65 +13 1 2 66 105 64 +13 1 2 67 104 64 +13 1 3 0 105 127 +13 1 3 1 104 127 +13 1 3 2 105 126 +13 1 3 3 104 126 +13 1 3 4 105 125 +13 1 3 5 104 125 +13 1 3 6 105 124 +13 1 3 7 104 124 +13 1 3 8 105 123 +13 1 3 9 104 123 +13 1 3 10 105 122 +13 1 3 11 -1 -1 +13 1 3 12 104 122 +13 1 3 13 105 121 +13 1 3 14 104 121 +13 1 3 15 105 120 +13 1 3 16 104 120 +13 1 3 17 105 119 +13 1 3 18 104 119 +13 1 3 19 105 118 +13 1 3 20 104 118 +13 1 3 21 105 117 +13 1 3 22 -1 -1 +13 1 3 23 104 117 +13 1 3 24 105 116 +13 1 3 25 104 116 +13 1 3 26 105 115 +13 1 3 27 104 115 +13 1 3 28 105 114 +13 1 3 29 104 114 +13 1 3 30 105 113 +13 1 3 31 104 113 +13 1 3 32 105 112 +13 1 3 33 104 112 +13 1 3 34 105 111 +13 1 3 35 104 111 +13 1 3 36 105 110 +13 1 3 37 104 110 +13 1 3 38 105 109 +13 1 3 39 104 109 +13 1 3 40 105 108 +13 1 3 41 104 108 +13 1 3 42 105 107 +13 1 3 43 104 107 +13 1 3 44 105 106 +13 1 3 45 -1 -1 +13 1 3 46 104 106 +13 1 3 47 105 105 +13 1 3 48 104 105 +13 1 3 49 105 104 +13 1 3 50 104 104 +13 1 3 51 105 103 +13 1 3 52 104 103 +13 1 3 53 105 102 +13 1 3 54 104 102 +13 1 3 55 105 101 +13 1 3 56 -1 -1 +13 1 3 57 104 101 +13 1 3 58 105 100 +13 1 3 59 104 100 +13 1 3 60 105 99 +13 1 3 61 104 99 +13 1 3 62 105 98 +13 1 3 63 104 98 +13 1 3 64 105 97 +13 1 3 65 104 97 +13 1 3 66 105 96 +13 1 3 67 104 96 +13 2 0 0 108 32 +13 2 0 1 109 32 +13 2 0 2 108 33 +13 2 0 3 109 33 +13 2 0 4 108 34 +13 2 0 5 109 34 +13 2 0 6 108 35 +13 2 0 7 109 35 +13 2 0 8 108 36 +13 2 0 9 109 36 +13 2 0 10 108 37 +13 2 0 11 -1 -1 +13 2 0 12 109 37 +13 2 0 13 108 38 +13 2 0 14 109 38 +13 2 0 15 108 39 +13 2 0 16 109 39 +13 2 0 17 108 40 +13 2 0 18 109 40 +13 2 0 19 108 41 +13 2 0 20 109 41 +13 2 0 21 108 42 +13 2 0 22 -1 -1 +13 2 0 23 109 42 +13 2 0 24 108 43 +13 2 0 25 109 43 +13 2 0 26 108 44 +13 2 0 27 109 44 +13 2 0 28 108 45 +13 2 0 29 109 45 +13 2 0 30 108 46 +13 2 0 31 109 46 +13 2 0 32 108 47 +13 2 0 33 109 47 +13 2 0 34 108 48 +13 2 0 35 109 48 +13 2 0 36 108 49 +13 2 0 37 109 49 +13 2 0 38 108 50 +13 2 0 39 109 50 +13 2 0 40 108 51 +13 2 0 41 109 51 +13 2 0 42 108 52 +13 2 0 43 109 52 +13 2 0 44 108 53 +13 2 0 45 -1 -1 +13 2 0 46 109 53 +13 2 0 47 108 54 +13 2 0 48 109 54 +13 2 0 49 108 55 +13 2 0 50 109 55 +13 2 0 51 108 56 +13 2 0 52 109 56 +13 2 0 53 108 57 +13 2 0 54 109 57 +13 2 0 55 108 58 +13 2 0 56 -1 -1 +13 2 0 57 109 58 +13 2 0 58 108 59 +13 2 0 59 109 59 +13 2 0 60 108 60 +13 2 0 61 109 60 +13 2 0 62 108 61 +13 2 0 63 109 61 +13 2 0 64 108 62 +13 2 0 65 109 62 +13 2 0 66 108 63 +13 2 0 67 109 63 +13 2 1 0 108 0 +13 2 1 1 109 0 +13 2 1 2 108 1 +13 2 1 3 109 1 +13 2 1 4 108 2 +13 2 1 5 109 2 +13 2 1 6 108 3 +13 2 1 7 109 3 +13 2 1 8 108 4 +13 2 1 9 109 4 +13 2 1 10 108 5 +13 2 1 11 -1 -1 +13 2 1 12 109 5 +13 2 1 13 108 6 +13 2 1 14 109 6 +13 2 1 15 108 7 +13 2 1 16 109 7 +13 2 1 17 108 8 +13 2 1 18 109 8 +13 2 1 19 108 9 +13 2 1 20 109 9 +13 2 1 21 108 10 +13 2 1 22 -1 -1 +13 2 1 23 109 10 +13 2 1 24 108 11 +13 2 1 25 109 11 +13 2 1 26 108 12 +13 2 1 27 109 12 +13 2 1 28 108 13 +13 2 1 29 109 13 +13 2 1 30 108 14 +13 2 1 31 109 14 +13 2 1 32 108 15 +13 2 1 33 109 15 +13 2 1 34 108 16 +13 2 1 35 109 16 +13 2 1 36 108 17 +13 2 1 37 109 17 +13 2 1 38 108 18 +13 2 1 39 109 18 +13 2 1 40 108 19 +13 2 1 41 109 19 +13 2 1 42 108 20 +13 2 1 43 109 20 +13 2 1 44 108 21 +13 2 1 45 -1 -1 +13 2 1 46 109 21 +13 2 1 47 108 22 +13 2 1 48 109 22 +13 2 1 49 108 23 +13 2 1 50 109 23 +13 2 1 51 108 24 +13 2 1 52 109 24 +13 2 1 53 108 25 +13 2 1 54 109 25 +13 2 1 55 108 26 +13 2 1 56 -1 -1 +13 2 1 57 109 26 +13 2 1 58 108 27 +13 2 1 59 109 27 +13 2 1 60 108 28 +13 2 1 61 109 28 +13 2 1 62 108 29 +13 2 1 63 109 29 +13 2 1 64 108 30 +13 2 1 65 109 30 +13 2 1 66 108 31 +13 2 1 67 109 31 +13 2 2 0 110 32 +13 2 2 1 111 32 +13 2 2 2 110 33 +13 2 2 3 111 33 +13 2 2 4 110 34 +13 2 2 5 111 34 +13 2 2 6 110 35 +13 2 2 7 111 35 +13 2 2 8 110 36 +13 2 2 9 111 36 +13 2 2 10 110 37 +13 2 2 11 -1 -1 +13 2 2 12 111 37 +13 2 2 13 110 38 +13 2 2 14 111 38 +13 2 2 15 110 39 +13 2 2 16 111 39 +13 2 2 17 110 40 +13 2 2 18 111 40 +13 2 2 19 110 41 +13 2 2 20 111 41 +13 2 2 21 110 42 +13 2 2 22 -1 -1 +13 2 2 23 111 42 +13 2 2 24 110 43 +13 2 2 25 111 43 +13 2 2 26 110 44 +13 2 2 27 111 44 +13 2 2 28 110 45 +13 2 2 29 111 45 +13 2 2 30 110 46 +13 2 2 31 111 46 +13 2 2 32 110 47 +13 2 2 33 111 47 +13 2 2 34 110 48 +13 2 2 35 111 48 +13 2 2 36 110 49 +13 2 2 37 111 49 +13 2 2 38 110 50 +13 2 2 39 111 50 +13 2 2 40 110 51 +13 2 2 41 111 51 +13 2 2 42 110 52 +13 2 2 43 111 52 +13 2 2 44 110 53 +13 2 2 45 -1 -1 +13 2 2 46 111 53 +13 2 2 47 110 54 +13 2 2 48 111 54 +13 2 2 49 110 55 +13 2 2 50 111 55 +13 2 2 51 110 56 +13 2 2 52 111 56 +13 2 2 53 110 57 +13 2 2 54 111 57 +13 2 2 55 110 58 +13 2 2 56 -1 -1 +13 2 2 57 111 58 +13 2 2 58 110 59 +13 2 2 59 111 59 +13 2 2 60 110 60 +13 2 2 61 111 60 +13 2 2 62 110 61 +13 2 2 63 111 61 +13 2 2 64 110 62 +13 2 2 65 111 62 +13 2 2 66 110 63 +13 2 2 67 111 63 +13 2 3 0 110 0 +13 2 3 1 111 0 +13 2 3 2 110 1 +13 2 3 3 111 1 +13 2 3 4 110 2 +13 2 3 5 111 2 +13 2 3 6 110 3 +13 2 3 7 111 3 +13 2 3 8 110 4 +13 2 3 9 111 4 +13 2 3 10 110 5 +13 2 3 11 -1 -1 +13 2 3 12 111 5 +13 2 3 13 110 6 +13 2 3 14 111 6 +13 2 3 15 110 7 +13 2 3 16 111 7 +13 2 3 17 110 8 +13 2 3 18 111 8 +13 2 3 19 110 9 +13 2 3 20 111 9 +13 2 3 21 110 10 +13 2 3 22 -1 -1 +13 2 3 23 111 10 +13 2 3 24 110 11 +13 2 3 25 111 11 +13 2 3 26 110 12 +13 2 3 27 111 12 +13 2 3 28 110 13 +13 2 3 29 111 13 +13 2 3 30 110 14 +13 2 3 31 111 14 +13 2 3 32 110 15 +13 2 3 33 111 15 +13 2 3 34 110 16 +13 2 3 35 111 16 +13 2 3 36 110 17 +13 2 3 37 111 17 +13 2 3 38 110 18 +13 2 3 39 111 18 +13 2 3 40 110 19 +13 2 3 41 111 19 +13 2 3 42 110 20 +13 2 3 43 111 20 +13 2 3 44 110 21 +13 2 3 45 -1 -1 +13 2 3 46 111 21 +13 2 3 47 110 22 +13 2 3 48 111 22 +13 2 3 49 110 23 +13 2 3 50 111 23 +13 2 3 51 110 24 +13 2 3 52 111 24 +13 2 3 53 110 25 +13 2 3 54 111 25 +13 2 3 55 110 26 +13 2 3 56 -1 -1 +13 2 3 57 111 26 +13 2 3 58 110 27 +13 2 3 59 111 27 +13 2 3 60 110 28 +13 2 3 61 111 28 +13 2 3 62 110 29 +13 2 3 63 111 29 +13 2 3 64 110 30 +13 2 3 65 111 30 +13 2 3 66 110 31 +13 2 3 67 111 31 +13 3 0 0 111 95 +13 3 0 1 110 95 +13 3 0 2 111 94 +13 3 0 3 110 94 +13 3 0 4 111 93 +13 3 0 5 110 93 +13 3 0 6 111 92 +13 3 0 7 110 92 +13 3 0 8 111 91 +13 3 0 9 110 91 +13 3 0 10 111 90 +13 3 0 11 -1 -1 +13 3 0 12 110 90 +13 3 0 13 111 89 +13 3 0 14 110 89 +13 3 0 15 111 88 +13 3 0 16 110 88 +13 3 0 17 111 87 +13 3 0 18 110 87 +13 3 0 19 111 86 +13 3 0 20 110 86 +13 3 0 21 111 85 +13 3 0 22 -1 -1 +13 3 0 23 110 85 +13 3 0 24 111 84 +13 3 0 25 110 84 +13 3 0 26 111 83 +13 3 0 27 110 83 +13 3 0 28 111 82 +13 3 0 29 110 82 +13 3 0 30 111 81 +13 3 0 31 110 81 +13 3 0 32 111 80 +13 3 0 33 110 80 +13 3 0 34 111 79 +13 3 0 35 110 79 +13 3 0 36 111 78 +13 3 0 37 110 78 +13 3 0 38 111 77 +13 3 0 39 110 77 +13 3 0 40 111 76 +13 3 0 41 110 76 +13 3 0 42 111 75 +13 3 0 43 110 75 +13 3 0 44 111 74 +13 3 0 45 -1 -1 +13 3 0 46 110 74 +13 3 0 47 111 73 +13 3 0 48 110 73 +13 3 0 49 111 72 +13 3 0 50 110 72 +13 3 0 51 111 71 +13 3 0 52 110 71 +13 3 0 53 111 70 +13 3 0 54 110 70 +13 3 0 55 111 69 +13 3 0 56 -1 -1 +13 3 0 57 110 69 +13 3 0 58 111 68 +13 3 0 59 110 68 +13 3 0 60 111 67 +13 3 0 61 110 67 +13 3 0 62 111 66 +13 3 0 63 110 66 +13 3 0 64 111 65 +13 3 0 65 110 65 +13 3 0 66 111 64 +13 3 0 67 110 64 +13 3 1 0 111 127 +13 3 1 1 110 127 +13 3 1 2 111 126 +13 3 1 3 110 126 +13 3 1 4 111 125 +13 3 1 5 110 125 +13 3 1 6 111 124 +13 3 1 7 110 124 +13 3 1 8 111 123 +13 3 1 9 110 123 +13 3 1 10 111 122 +13 3 1 11 -1 -1 +13 3 1 12 110 122 +13 3 1 13 111 121 +13 3 1 14 110 121 +13 3 1 15 111 120 +13 3 1 16 110 120 +13 3 1 17 111 119 +13 3 1 18 110 119 +13 3 1 19 111 118 +13 3 1 20 110 118 +13 3 1 21 111 117 +13 3 1 22 -1 -1 +13 3 1 23 110 117 +13 3 1 24 111 116 +13 3 1 25 110 116 +13 3 1 26 111 115 +13 3 1 27 110 115 +13 3 1 28 111 114 +13 3 1 29 110 114 +13 3 1 30 111 113 +13 3 1 31 110 113 +13 3 1 32 111 112 +13 3 1 33 110 112 +13 3 1 34 111 111 +13 3 1 35 110 111 +13 3 1 36 111 110 +13 3 1 37 110 110 +13 3 1 38 111 109 +13 3 1 39 110 109 +13 3 1 40 111 108 +13 3 1 41 110 108 +13 3 1 42 111 107 +13 3 1 43 110 107 +13 3 1 44 111 106 +13 3 1 45 -1 -1 +13 3 1 46 110 106 +13 3 1 47 111 105 +13 3 1 48 110 105 +13 3 1 49 111 104 +13 3 1 50 110 104 +13 3 1 51 111 103 +13 3 1 52 110 103 +13 3 1 53 111 102 +13 3 1 54 110 102 +13 3 1 55 111 101 +13 3 1 56 -1 -1 +13 3 1 57 110 101 +13 3 1 58 111 100 +13 3 1 59 110 100 +13 3 1 60 111 99 +13 3 1 61 110 99 +13 3 1 62 111 98 +13 3 1 63 110 98 +13 3 1 64 111 97 +13 3 1 65 110 97 +13 3 1 66 111 96 +13 3 1 67 110 96 +13 3 2 0 109 95 +13 3 2 1 108 95 +13 3 2 2 109 94 +13 3 2 3 108 94 +13 3 2 4 109 93 +13 3 2 5 108 93 +13 3 2 6 109 92 +13 3 2 7 108 92 +13 3 2 8 109 91 +13 3 2 9 108 91 +13 3 2 10 109 90 +13 3 2 11 -1 -1 +13 3 2 12 108 90 +13 3 2 13 109 89 +13 3 2 14 108 89 +13 3 2 15 109 88 +13 3 2 16 108 88 +13 3 2 17 109 87 +13 3 2 18 108 87 +13 3 2 19 109 86 +13 3 2 20 108 86 +13 3 2 21 109 85 +13 3 2 22 -1 -1 +13 3 2 23 108 85 +13 3 2 24 109 84 +13 3 2 25 108 84 +13 3 2 26 109 83 +13 3 2 27 108 83 +13 3 2 28 109 82 +13 3 2 29 108 82 +13 3 2 30 109 81 +13 3 2 31 108 81 +13 3 2 32 109 80 +13 3 2 33 108 80 +13 3 2 34 109 79 +13 3 2 35 108 79 +13 3 2 36 109 78 +13 3 2 37 108 78 +13 3 2 38 109 77 +13 3 2 39 108 77 +13 3 2 40 109 76 +13 3 2 41 108 76 +13 3 2 42 109 75 +13 3 2 43 108 75 +13 3 2 44 109 74 +13 3 2 45 -1 -1 +13 3 2 46 108 74 +13 3 2 47 109 73 +13 3 2 48 108 73 +13 3 2 49 109 72 +13 3 2 50 108 72 +13 3 2 51 109 71 +13 3 2 52 108 71 +13 3 2 53 109 70 +13 3 2 54 108 70 +13 3 2 55 109 69 +13 3 2 56 -1 -1 +13 3 2 57 108 69 +13 3 2 58 109 68 +13 3 2 59 108 68 +13 3 2 60 109 67 +13 3 2 61 108 67 +13 3 2 62 109 66 +13 3 2 63 108 66 +13 3 2 64 109 65 +13 3 2 65 108 65 +13 3 2 66 109 64 +13 3 2 67 108 64 +13 3 3 0 109 127 +13 3 3 1 108 127 +13 3 3 2 109 126 +13 3 3 3 108 126 +13 3 3 4 109 125 +13 3 3 5 108 125 +13 3 3 6 109 124 +13 3 3 7 108 124 +13 3 3 8 109 123 +13 3 3 9 108 123 +13 3 3 10 109 122 +13 3 3 11 -1 -1 +13 3 3 12 108 122 +13 3 3 13 109 121 +13 3 3 14 108 121 +13 3 3 15 109 120 +13 3 3 16 108 120 +13 3 3 17 109 119 +13 3 3 18 108 119 +13 3 3 19 109 118 +13 3 3 20 108 118 +13 3 3 21 109 117 +13 3 3 22 -1 -1 +13 3 3 23 108 117 +13 3 3 24 109 116 +13 3 3 25 108 116 +13 3 3 26 109 115 +13 3 3 27 108 115 +13 3 3 28 109 114 +13 3 3 29 108 114 +13 3 3 30 109 113 +13 3 3 31 108 113 +13 3 3 32 109 112 +13 3 3 33 108 112 +13 3 3 34 109 111 +13 3 3 35 108 111 +13 3 3 36 109 110 +13 3 3 37 108 110 +13 3 3 38 109 109 +13 3 3 39 108 109 +13 3 3 40 109 108 +13 3 3 41 108 108 +13 3 3 42 109 107 +13 3 3 43 108 107 +13 3 3 44 109 106 +13 3 3 45 -1 -1 +13 3 3 46 108 106 +13 3 3 47 109 105 +13 3 3 48 108 105 +13 3 3 49 109 104 +13 3 3 50 108 104 +13 3 3 51 109 103 +13 3 3 52 108 103 +13 3 3 53 109 102 +13 3 3 54 108 102 +13 3 3 55 109 101 +13 3 3 56 -1 -1 +13 3 3 57 108 101 +13 3 3 58 109 100 +13 3 3 59 108 100 +13 3 3 60 109 99 +13 3 3 61 108 99 +13 3 3 62 109 98 +13 3 3 63 108 98 +13 3 3 64 109 97 +13 3 3 65 108 97 +13 3 3 66 109 96 +13 3 3 67 108 96 +14 0 0 0 112 32 +14 0 0 1 113 32 +14 0 0 2 112 33 +14 0 0 3 113 33 +14 0 0 4 112 34 +14 0 0 5 113 34 +14 0 0 6 112 35 +14 0 0 7 113 35 +14 0 0 8 112 36 +14 0 0 9 113 36 +14 0 0 10 112 37 +14 0 0 11 -1 -1 +14 0 0 12 113 37 +14 0 0 13 112 38 +14 0 0 14 113 38 +14 0 0 15 112 39 +14 0 0 16 113 39 +14 0 0 17 112 40 +14 0 0 18 113 40 +14 0 0 19 112 41 +14 0 0 20 113 41 +14 0 0 21 112 42 +14 0 0 22 -1 -1 +14 0 0 23 113 42 +14 0 0 24 112 43 +14 0 0 25 113 43 +14 0 0 26 112 44 +14 0 0 27 113 44 +14 0 0 28 112 45 +14 0 0 29 113 45 +14 0 0 30 112 46 +14 0 0 31 113 46 +14 0 0 32 112 47 +14 0 0 33 113 47 +14 0 0 34 112 48 +14 0 0 35 113 48 +14 0 0 36 112 49 +14 0 0 37 113 49 +14 0 0 38 112 50 +14 0 0 39 113 50 +14 0 0 40 112 51 +14 0 0 41 113 51 +14 0 0 42 112 52 +14 0 0 43 113 52 +14 0 0 44 112 53 +14 0 0 45 -1 -1 +14 0 0 46 113 53 +14 0 0 47 112 54 +14 0 0 48 113 54 +14 0 0 49 112 55 +14 0 0 50 113 55 +14 0 0 51 112 56 +14 0 0 52 113 56 +14 0 0 53 112 57 +14 0 0 54 113 57 +14 0 0 55 112 58 +14 0 0 56 -1 -1 +14 0 0 57 113 58 +14 0 0 58 112 59 +14 0 0 59 113 59 +14 0 0 60 112 60 +14 0 0 61 113 60 +14 0 0 62 112 61 +14 0 0 63 113 61 +14 0 0 64 112 62 +14 0 0 65 113 62 +14 0 0 66 112 63 +14 0 0 67 113 63 +14 0 1 0 112 0 +14 0 1 1 113 0 +14 0 1 2 112 1 +14 0 1 3 113 1 +14 0 1 4 112 2 +14 0 1 5 113 2 +14 0 1 6 112 3 +14 0 1 7 113 3 +14 0 1 8 112 4 +14 0 1 9 113 4 +14 0 1 10 112 5 +14 0 1 11 -1 -1 +14 0 1 12 113 5 +14 0 1 13 112 6 +14 0 1 14 113 6 +14 0 1 15 112 7 +14 0 1 16 113 7 +14 0 1 17 112 8 +14 0 1 18 113 8 +14 0 1 19 112 9 +14 0 1 20 113 9 +14 0 1 21 112 10 +14 0 1 22 -1 -1 +14 0 1 23 113 10 +14 0 1 24 112 11 +14 0 1 25 113 11 +14 0 1 26 112 12 +14 0 1 27 113 12 +14 0 1 28 112 13 +14 0 1 29 113 13 +14 0 1 30 112 14 +14 0 1 31 113 14 +14 0 1 32 112 15 +14 0 1 33 113 15 +14 0 1 34 112 16 +14 0 1 35 113 16 +14 0 1 36 112 17 +14 0 1 37 113 17 +14 0 1 38 112 18 +14 0 1 39 113 18 +14 0 1 40 112 19 +14 0 1 41 113 19 +14 0 1 42 112 20 +14 0 1 43 113 20 +14 0 1 44 112 21 +14 0 1 45 -1 -1 +14 0 1 46 113 21 +14 0 1 47 112 22 +14 0 1 48 113 22 +14 0 1 49 112 23 +14 0 1 50 113 23 +14 0 1 51 112 24 +14 0 1 52 113 24 +14 0 1 53 112 25 +14 0 1 54 113 25 +14 0 1 55 112 26 +14 0 1 56 -1 -1 +14 0 1 57 113 26 +14 0 1 58 112 27 +14 0 1 59 113 27 +14 0 1 60 112 28 +14 0 1 61 113 28 +14 0 1 62 112 29 +14 0 1 63 113 29 +14 0 1 64 112 30 +14 0 1 65 113 30 +14 0 1 66 112 31 +14 0 1 67 113 31 +14 0 2 0 114 32 +14 0 2 1 115 32 +14 0 2 2 114 33 +14 0 2 3 115 33 +14 0 2 4 114 34 +14 0 2 5 115 34 +14 0 2 6 114 35 +14 0 2 7 115 35 +14 0 2 8 114 36 +14 0 2 9 115 36 +14 0 2 10 114 37 +14 0 2 11 -1 -1 +14 0 2 12 115 37 +14 0 2 13 114 38 +14 0 2 14 115 38 +14 0 2 15 114 39 +14 0 2 16 115 39 +14 0 2 17 114 40 +14 0 2 18 115 40 +14 0 2 19 114 41 +14 0 2 20 115 41 +14 0 2 21 114 42 +14 0 2 22 -1 -1 +14 0 2 23 115 42 +14 0 2 24 114 43 +14 0 2 25 115 43 +14 0 2 26 114 44 +14 0 2 27 115 44 +14 0 2 28 114 45 +14 0 2 29 115 45 +14 0 2 30 114 46 +14 0 2 31 115 46 +14 0 2 32 114 47 +14 0 2 33 115 47 +14 0 2 34 114 48 +14 0 2 35 115 48 +14 0 2 36 114 49 +14 0 2 37 115 49 +14 0 2 38 114 50 +14 0 2 39 115 50 +14 0 2 40 114 51 +14 0 2 41 115 51 +14 0 2 42 114 52 +14 0 2 43 115 52 +14 0 2 44 114 53 +14 0 2 45 -1 -1 +14 0 2 46 115 53 +14 0 2 47 114 54 +14 0 2 48 115 54 +14 0 2 49 114 55 +14 0 2 50 115 55 +14 0 2 51 114 56 +14 0 2 52 115 56 +14 0 2 53 114 57 +14 0 2 54 115 57 +14 0 2 55 114 58 +14 0 2 56 -1 -1 +14 0 2 57 115 58 +14 0 2 58 114 59 +14 0 2 59 115 59 +14 0 2 60 114 60 +14 0 2 61 115 60 +14 0 2 62 114 61 +14 0 2 63 115 61 +14 0 2 64 114 62 +14 0 2 65 115 62 +14 0 2 66 114 63 +14 0 2 67 115 63 +14 0 3 0 114 0 +14 0 3 1 115 0 +14 0 3 2 114 1 +14 0 3 3 115 1 +14 0 3 4 114 2 +14 0 3 5 115 2 +14 0 3 6 114 3 +14 0 3 7 115 3 +14 0 3 8 114 4 +14 0 3 9 115 4 +14 0 3 10 114 5 +14 0 3 11 -1 -1 +14 0 3 12 115 5 +14 0 3 13 114 6 +14 0 3 14 115 6 +14 0 3 15 114 7 +14 0 3 16 115 7 +14 0 3 17 114 8 +14 0 3 18 115 8 +14 0 3 19 114 9 +14 0 3 20 115 9 +14 0 3 21 114 10 +14 0 3 22 -1 -1 +14 0 3 23 115 10 +14 0 3 24 114 11 +14 0 3 25 115 11 +14 0 3 26 114 12 +14 0 3 27 115 12 +14 0 3 28 114 13 +14 0 3 29 115 13 +14 0 3 30 114 14 +14 0 3 31 115 14 +14 0 3 32 114 15 +14 0 3 33 115 15 +14 0 3 34 114 16 +14 0 3 35 115 16 +14 0 3 36 114 17 +14 0 3 37 115 17 +14 0 3 38 114 18 +14 0 3 39 115 18 +14 0 3 40 114 19 +14 0 3 41 115 19 +14 0 3 42 114 20 +14 0 3 43 115 20 +14 0 3 44 114 21 +14 0 3 45 -1 -1 +14 0 3 46 115 21 +14 0 3 47 114 22 +14 0 3 48 115 22 +14 0 3 49 114 23 +14 0 3 50 115 23 +14 0 3 51 114 24 +14 0 3 52 115 24 +14 0 3 53 114 25 +14 0 3 54 115 25 +14 0 3 55 114 26 +14 0 3 56 -1 -1 +14 0 3 57 115 26 +14 0 3 58 114 27 +14 0 3 59 115 27 +14 0 3 60 114 28 +14 0 3 61 115 28 +14 0 3 62 114 29 +14 0 3 63 115 29 +14 0 3 64 114 30 +14 0 3 65 115 30 +14 0 3 66 114 31 +14 0 3 67 115 31 +14 1 0 0 115 95 +14 1 0 1 114 95 +14 1 0 2 115 94 +14 1 0 3 114 94 +14 1 0 4 115 93 +14 1 0 5 114 93 +14 1 0 6 115 92 +14 1 0 7 114 92 +14 1 0 8 115 91 +14 1 0 9 114 91 +14 1 0 10 115 90 +14 1 0 11 -1 -1 +14 1 0 12 114 90 +14 1 0 13 115 89 +14 1 0 14 114 89 +14 1 0 15 115 88 +14 1 0 16 114 88 +14 1 0 17 115 87 +14 1 0 18 114 87 +14 1 0 19 115 86 +14 1 0 20 114 86 +14 1 0 21 115 85 +14 1 0 22 -1 -1 +14 1 0 23 114 85 +14 1 0 24 115 84 +14 1 0 25 114 84 +14 1 0 26 115 83 +14 1 0 27 114 83 +14 1 0 28 115 82 +14 1 0 29 114 82 +14 1 0 30 115 81 +14 1 0 31 114 81 +14 1 0 32 115 80 +14 1 0 33 114 80 +14 1 0 34 115 79 +14 1 0 35 114 79 +14 1 0 36 115 78 +14 1 0 37 114 78 +14 1 0 38 115 77 +14 1 0 39 114 77 +14 1 0 40 115 76 +14 1 0 41 114 76 +14 1 0 42 115 75 +14 1 0 43 114 75 +14 1 0 44 115 74 +14 1 0 45 -1 -1 +14 1 0 46 114 74 +14 1 0 47 115 73 +14 1 0 48 114 73 +14 1 0 49 115 72 +14 1 0 50 114 72 +14 1 0 51 115 71 +14 1 0 52 114 71 +14 1 0 53 115 70 +14 1 0 54 114 70 +14 1 0 55 115 69 +14 1 0 56 -1 -1 +14 1 0 57 114 69 +14 1 0 58 115 68 +14 1 0 59 114 68 +14 1 0 60 115 67 +14 1 0 61 114 67 +14 1 0 62 115 66 +14 1 0 63 114 66 +14 1 0 64 115 65 +14 1 0 65 114 65 +14 1 0 66 115 64 +14 1 0 67 114 64 +14 1 1 0 115 127 +14 1 1 1 114 127 +14 1 1 2 115 126 +14 1 1 3 114 126 +14 1 1 4 115 125 +14 1 1 5 114 125 +14 1 1 6 115 124 +14 1 1 7 114 124 +14 1 1 8 115 123 +14 1 1 9 114 123 +14 1 1 10 115 122 +14 1 1 11 -1 -1 +14 1 1 12 114 122 +14 1 1 13 115 121 +14 1 1 14 114 121 +14 1 1 15 115 120 +14 1 1 16 114 120 +14 1 1 17 115 119 +14 1 1 18 114 119 +14 1 1 19 115 118 +14 1 1 20 114 118 +14 1 1 21 115 117 +14 1 1 22 -1 -1 +14 1 1 23 114 117 +14 1 1 24 115 116 +14 1 1 25 114 116 +14 1 1 26 115 115 +14 1 1 27 114 115 +14 1 1 28 115 114 +14 1 1 29 114 114 +14 1 1 30 115 113 +14 1 1 31 114 113 +14 1 1 32 115 112 +14 1 1 33 114 112 +14 1 1 34 115 111 +14 1 1 35 114 111 +14 1 1 36 115 110 +14 1 1 37 114 110 +14 1 1 38 115 109 +14 1 1 39 114 109 +14 1 1 40 115 108 +14 1 1 41 114 108 +14 1 1 42 115 107 +14 1 1 43 114 107 +14 1 1 44 115 106 +14 1 1 45 -1 -1 +14 1 1 46 114 106 +14 1 1 47 115 105 +14 1 1 48 114 105 +14 1 1 49 115 104 +14 1 1 50 114 104 +14 1 1 51 115 103 +14 1 1 52 114 103 +14 1 1 53 115 102 +14 1 1 54 114 102 +14 1 1 55 115 101 +14 1 1 56 -1 -1 +14 1 1 57 114 101 +14 1 1 58 115 100 +14 1 1 59 114 100 +14 1 1 60 115 99 +14 1 1 61 114 99 +14 1 1 62 115 98 +14 1 1 63 114 98 +14 1 1 64 115 97 +14 1 1 65 114 97 +14 1 1 66 115 96 +14 1 1 67 114 96 +14 1 2 0 113 95 +14 1 2 1 112 95 +14 1 2 2 113 94 +14 1 2 3 112 94 +14 1 2 4 113 93 +14 1 2 5 112 93 +14 1 2 6 113 92 +14 1 2 7 112 92 +14 1 2 8 113 91 +14 1 2 9 112 91 +14 1 2 10 113 90 +14 1 2 11 -1 -1 +14 1 2 12 112 90 +14 1 2 13 113 89 +14 1 2 14 112 89 +14 1 2 15 113 88 +14 1 2 16 112 88 +14 1 2 17 113 87 +14 1 2 18 112 87 +14 1 2 19 113 86 +14 1 2 20 112 86 +14 1 2 21 113 85 +14 1 2 22 -1 -1 +14 1 2 23 112 85 +14 1 2 24 113 84 +14 1 2 25 112 84 +14 1 2 26 113 83 +14 1 2 27 112 83 +14 1 2 28 113 82 +14 1 2 29 112 82 +14 1 2 30 113 81 +14 1 2 31 112 81 +14 1 2 32 113 80 +14 1 2 33 112 80 +14 1 2 34 113 79 +14 1 2 35 112 79 +14 1 2 36 113 78 +14 1 2 37 112 78 +14 1 2 38 113 77 +14 1 2 39 112 77 +14 1 2 40 113 76 +14 1 2 41 112 76 +14 1 2 42 113 75 +14 1 2 43 112 75 +14 1 2 44 113 74 +14 1 2 45 -1 -1 +14 1 2 46 112 74 +14 1 2 47 113 73 +14 1 2 48 112 73 +14 1 2 49 113 72 +14 1 2 50 112 72 +14 1 2 51 113 71 +14 1 2 52 112 71 +14 1 2 53 113 70 +14 1 2 54 112 70 +14 1 2 55 113 69 +14 1 2 56 -1 -1 +14 1 2 57 112 69 +14 1 2 58 113 68 +14 1 2 59 112 68 +14 1 2 60 113 67 +14 1 2 61 112 67 +14 1 2 62 113 66 +14 1 2 63 112 66 +14 1 2 64 113 65 +14 1 2 65 112 65 +14 1 2 66 113 64 +14 1 2 67 112 64 +14 1 3 0 113 127 +14 1 3 1 112 127 +14 1 3 2 113 126 +14 1 3 3 112 126 +14 1 3 4 113 125 +14 1 3 5 112 125 +14 1 3 6 113 124 +14 1 3 7 112 124 +14 1 3 8 113 123 +14 1 3 9 112 123 +14 1 3 10 113 122 +14 1 3 11 -1 -1 +14 1 3 12 112 122 +14 1 3 13 113 121 +14 1 3 14 112 121 +14 1 3 15 113 120 +14 1 3 16 112 120 +14 1 3 17 113 119 +14 1 3 18 112 119 +14 1 3 19 113 118 +14 1 3 20 112 118 +14 1 3 21 113 117 +14 1 3 22 -1 -1 +14 1 3 23 112 117 +14 1 3 24 113 116 +14 1 3 25 112 116 +14 1 3 26 113 115 +14 1 3 27 112 115 +14 1 3 28 113 114 +14 1 3 29 112 114 +14 1 3 30 113 113 +14 1 3 31 112 113 +14 1 3 32 113 112 +14 1 3 33 112 112 +14 1 3 34 113 111 +14 1 3 35 112 111 +14 1 3 36 113 110 +14 1 3 37 112 110 +14 1 3 38 113 109 +14 1 3 39 112 109 +14 1 3 40 113 108 +14 1 3 41 112 108 +14 1 3 42 113 107 +14 1 3 43 112 107 +14 1 3 44 113 106 +14 1 3 45 -1 -1 +14 1 3 46 112 106 +14 1 3 47 113 105 +14 1 3 48 112 105 +14 1 3 49 113 104 +14 1 3 50 112 104 +14 1 3 51 113 103 +14 1 3 52 112 103 +14 1 3 53 113 102 +14 1 3 54 112 102 +14 1 3 55 113 101 +14 1 3 56 -1 -1 +14 1 3 57 112 101 +14 1 3 58 113 100 +14 1 3 59 112 100 +14 1 3 60 113 99 +14 1 3 61 112 99 +14 1 3 62 113 98 +14 1 3 63 112 98 +14 1 3 64 113 97 +14 1 3 65 112 97 +14 1 3 66 113 96 +14 1 3 67 112 96 +14 2 0 0 116 32 +14 2 0 1 117 32 +14 2 0 2 116 33 +14 2 0 3 117 33 +14 2 0 4 116 34 +14 2 0 5 117 34 +14 2 0 6 116 35 +14 2 0 7 117 35 +14 2 0 8 116 36 +14 2 0 9 117 36 +14 2 0 10 116 37 +14 2 0 11 -1 -1 +14 2 0 12 117 37 +14 2 0 13 116 38 +14 2 0 14 117 38 +14 2 0 15 116 39 +14 2 0 16 117 39 +14 2 0 17 116 40 +14 2 0 18 117 40 +14 2 0 19 116 41 +14 2 0 20 117 41 +14 2 0 21 116 42 +14 2 0 22 -1 -1 +14 2 0 23 117 42 +14 2 0 24 116 43 +14 2 0 25 117 43 +14 2 0 26 116 44 +14 2 0 27 117 44 +14 2 0 28 116 45 +14 2 0 29 117 45 +14 2 0 30 116 46 +14 2 0 31 117 46 +14 2 0 32 116 47 +14 2 0 33 117 47 +14 2 0 34 116 48 +14 2 0 35 117 48 +14 2 0 36 116 49 +14 2 0 37 117 49 +14 2 0 38 116 50 +14 2 0 39 117 50 +14 2 0 40 116 51 +14 2 0 41 117 51 +14 2 0 42 116 52 +14 2 0 43 117 52 +14 2 0 44 116 53 +14 2 0 45 -1 -1 +14 2 0 46 117 53 +14 2 0 47 116 54 +14 2 0 48 117 54 +14 2 0 49 116 55 +14 2 0 50 117 55 +14 2 0 51 116 56 +14 2 0 52 117 56 +14 2 0 53 116 57 +14 2 0 54 117 57 +14 2 0 55 116 58 +14 2 0 56 -1 -1 +14 2 0 57 117 58 +14 2 0 58 116 59 +14 2 0 59 117 59 +14 2 0 60 116 60 +14 2 0 61 117 60 +14 2 0 62 116 61 +14 2 0 63 117 61 +14 2 0 64 116 62 +14 2 0 65 117 62 +14 2 0 66 116 63 +14 2 0 67 117 63 +14 2 1 0 116 0 +14 2 1 1 117 0 +14 2 1 2 116 1 +14 2 1 3 117 1 +14 2 1 4 116 2 +14 2 1 5 117 2 +14 2 1 6 116 3 +14 2 1 7 117 3 +14 2 1 8 116 4 +14 2 1 9 117 4 +14 2 1 10 116 5 +14 2 1 11 -1 -1 +14 2 1 12 117 5 +14 2 1 13 116 6 +14 2 1 14 117 6 +14 2 1 15 116 7 +14 2 1 16 117 7 +14 2 1 17 116 8 +14 2 1 18 117 8 +14 2 1 19 116 9 +14 2 1 20 117 9 +14 2 1 21 116 10 +14 2 1 22 -1 -1 +14 2 1 23 117 10 +14 2 1 24 116 11 +14 2 1 25 117 11 +14 2 1 26 116 12 +14 2 1 27 117 12 +14 2 1 28 116 13 +14 2 1 29 117 13 +14 2 1 30 116 14 +14 2 1 31 117 14 +14 2 1 32 116 15 +14 2 1 33 117 15 +14 2 1 34 116 16 +14 2 1 35 117 16 +14 2 1 36 116 17 +14 2 1 37 117 17 +14 2 1 38 116 18 +14 2 1 39 117 18 +14 2 1 40 116 19 +14 2 1 41 117 19 +14 2 1 42 116 20 +14 2 1 43 117 20 +14 2 1 44 116 21 +14 2 1 45 -1 -1 +14 2 1 46 117 21 +14 2 1 47 116 22 +14 2 1 48 117 22 +14 2 1 49 116 23 +14 2 1 50 117 23 +14 2 1 51 116 24 +14 2 1 52 117 24 +14 2 1 53 116 25 +14 2 1 54 117 25 +14 2 1 55 116 26 +14 2 1 56 -1 -1 +14 2 1 57 117 26 +14 2 1 58 116 27 +14 2 1 59 117 27 +14 2 1 60 116 28 +14 2 1 61 117 28 +14 2 1 62 116 29 +14 2 1 63 117 29 +14 2 1 64 116 30 +14 2 1 65 117 30 +14 2 1 66 116 31 +14 2 1 67 117 31 +14 2 2 0 118 32 +14 2 2 1 119 32 +14 2 2 2 118 33 +14 2 2 3 119 33 +14 2 2 4 118 34 +14 2 2 5 119 34 +14 2 2 6 118 35 +14 2 2 7 119 35 +14 2 2 8 118 36 +14 2 2 9 119 36 +14 2 2 10 118 37 +14 2 2 11 -1 -1 +14 2 2 12 119 37 +14 2 2 13 118 38 +14 2 2 14 119 38 +14 2 2 15 118 39 +14 2 2 16 119 39 +14 2 2 17 118 40 +14 2 2 18 119 40 +14 2 2 19 118 41 +14 2 2 20 119 41 +14 2 2 21 118 42 +14 2 2 22 -1 -1 +14 2 2 23 119 42 +14 2 2 24 118 43 +14 2 2 25 119 43 +14 2 2 26 118 44 +14 2 2 27 119 44 +14 2 2 28 118 45 +14 2 2 29 119 45 +14 2 2 30 118 46 +14 2 2 31 119 46 +14 2 2 32 118 47 +14 2 2 33 119 47 +14 2 2 34 118 48 +14 2 2 35 119 48 +14 2 2 36 118 49 +14 2 2 37 119 49 +14 2 2 38 118 50 +14 2 2 39 119 50 +14 2 2 40 118 51 +14 2 2 41 119 51 +14 2 2 42 118 52 +14 2 2 43 119 52 +14 2 2 44 118 53 +14 2 2 45 -1 -1 +14 2 2 46 119 53 +14 2 2 47 118 54 +14 2 2 48 119 54 +14 2 2 49 118 55 +14 2 2 50 119 55 +14 2 2 51 118 56 +14 2 2 52 119 56 +14 2 2 53 118 57 +14 2 2 54 119 57 +14 2 2 55 118 58 +14 2 2 56 -1 -1 +14 2 2 57 119 58 +14 2 2 58 118 59 +14 2 2 59 119 59 +14 2 2 60 118 60 +14 2 2 61 119 60 +14 2 2 62 118 61 +14 2 2 63 119 61 +14 2 2 64 118 62 +14 2 2 65 119 62 +14 2 2 66 118 63 +14 2 2 67 119 63 +14 2 3 0 118 0 +14 2 3 1 119 0 +14 2 3 2 118 1 +14 2 3 3 119 1 +14 2 3 4 118 2 +14 2 3 5 119 2 +14 2 3 6 118 3 +14 2 3 7 119 3 +14 2 3 8 118 4 +14 2 3 9 119 4 +14 2 3 10 118 5 +14 2 3 11 -1 -1 +14 2 3 12 119 5 +14 2 3 13 118 6 +14 2 3 14 119 6 +14 2 3 15 118 7 +14 2 3 16 119 7 +14 2 3 17 118 8 +14 2 3 18 119 8 +14 2 3 19 118 9 +14 2 3 20 119 9 +14 2 3 21 118 10 +14 2 3 22 -1 -1 +14 2 3 23 119 10 +14 2 3 24 118 11 +14 2 3 25 119 11 +14 2 3 26 118 12 +14 2 3 27 119 12 +14 2 3 28 118 13 +14 2 3 29 119 13 +14 2 3 30 118 14 +14 2 3 31 119 14 +14 2 3 32 118 15 +14 2 3 33 119 15 +14 2 3 34 118 16 +14 2 3 35 119 16 +14 2 3 36 118 17 +14 2 3 37 119 17 +14 2 3 38 118 18 +14 2 3 39 119 18 +14 2 3 40 118 19 +14 2 3 41 119 19 +14 2 3 42 118 20 +14 2 3 43 119 20 +14 2 3 44 118 21 +14 2 3 45 -1 -1 +14 2 3 46 119 21 +14 2 3 47 118 22 +14 2 3 48 119 22 +14 2 3 49 118 23 +14 2 3 50 119 23 +14 2 3 51 118 24 +14 2 3 52 119 24 +14 2 3 53 118 25 +14 2 3 54 119 25 +14 2 3 55 118 26 +14 2 3 56 -1 -1 +14 2 3 57 119 26 +14 2 3 58 118 27 +14 2 3 59 119 27 +14 2 3 60 118 28 +14 2 3 61 119 28 +14 2 3 62 118 29 +14 2 3 63 119 29 +14 2 3 64 118 30 +14 2 3 65 119 30 +14 2 3 66 118 31 +14 2 3 67 119 31 +14 3 0 0 119 95 +14 3 0 1 118 95 +14 3 0 2 119 94 +14 3 0 3 118 94 +14 3 0 4 119 93 +14 3 0 5 118 93 +14 3 0 6 119 92 +14 3 0 7 118 92 +14 3 0 8 119 91 +14 3 0 9 118 91 +14 3 0 10 119 90 +14 3 0 11 -1 -1 +14 3 0 12 118 90 +14 3 0 13 119 89 +14 3 0 14 118 89 +14 3 0 15 119 88 +14 3 0 16 118 88 +14 3 0 17 119 87 +14 3 0 18 118 87 +14 3 0 19 119 86 +14 3 0 20 118 86 +14 3 0 21 119 85 +14 3 0 22 -1 -1 +14 3 0 23 118 85 +14 3 0 24 119 84 +14 3 0 25 118 84 +14 3 0 26 119 83 +14 3 0 27 118 83 +14 3 0 28 119 82 +14 3 0 29 118 82 +14 3 0 30 119 81 +14 3 0 31 118 81 +14 3 0 32 119 80 +14 3 0 33 118 80 +14 3 0 34 119 79 +14 3 0 35 118 79 +14 3 0 36 119 78 +14 3 0 37 118 78 +14 3 0 38 119 77 +14 3 0 39 118 77 +14 3 0 40 119 76 +14 3 0 41 118 76 +14 3 0 42 119 75 +14 3 0 43 118 75 +14 3 0 44 119 74 +14 3 0 45 -1 -1 +14 3 0 46 118 74 +14 3 0 47 119 73 +14 3 0 48 118 73 +14 3 0 49 119 72 +14 3 0 50 118 72 +14 3 0 51 119 71 +14 3 0 52 118 71 +14 3 0 53 119 70 +14 3 0 54 118 70 +14 3 0 55 119 69 +14 3 0 56 -1 -1 +14 3 0 57 118 69 +14 3 0 58 119 68 +14 3 0 59 118 68 +14 3 0 60 119 67 +14 3 0 61 118 67 +14 3 0 62 119 66 +14 3 0 63 118 66 +14 3 0 64 119 65 +14 3 0 65 118 65 +14 3 0 66 119 64 +14 3 0 67 118 64 +14 3 1 0 119 127 +14 3 1 1 118 127 +14 3 1 2 119 126 +14 3 1 3 118 126 +14 3 1 4 119 125 +14 3 1 5 118 125 +14 3 1 6 119 124 +14 3 1 7 118 124 +14 3 1 8 119 123 +14 3 1 9 118 123 +14 3 1 10 119 122 +14 3 1 11 -1 -1 +14 3 1 12 118 122 +14 3 1 13 119 121 +14 3 1 14 118 121 +14 3 1 15 119 120 +14 3 1 16 118 120 +14 3 1 17 119 119 +14 3 1 18 118 119 +14 3 1 19 119 118 +14 3 1 20 118 118 +14 3 1 21 119 117 +14 3 1 22 -1 -1 +14 3 1 23 118 117 +14 3 1 24 119 116 +14 3 1 25 118 116 +14 3 1 26 119 115 +14 3 1 27 118 115 +14 3 1 28 119 114 +14 3 1 29 118 114 +14 3 1 30 119 113 +14 3 1 31 118 113 +14 3 1 32 119 112 +14 3 1 33 118 112 +14 3 1 34 119 111 +14 3 1 35 118 111 +14 3 1 36 119 110 +14 3 1 37 118 110 +14 3 1 38 119 109 +14 3 1 39 118 109 +14 3 1 40 119 108 +14 3 1 41 118 108 +14 3 1 42 119 107 +14 3 1 43 118 107 +14 3 1 44 119 106 +14 3 1 45 -1 -1 +14 3 1 46 118 106 +14 3 1 47 119 105 +14 3 1 48 118 105 +14 3 1 49 119 104 +14 3 1 50 118 104 +14 3 1 51 119 103 +14 3 1 52 118 103 +14 3 1 53 119 102 +14 3 1 54 118 102 +14 3 1 55 119 101 +14 3 1 56 -1 -1 +14 3 1 57 118 101 +14 3 1 58 119 100 +14 3 1 59 118 100 +14 3 1 60 119 99 +14 3 1 61 118 99 +14 3 1 62 119 98 +14 3 1 63 118 98 +14 3 1 64 119 97 +14 3 1 65 118 97 +14 3 1 66 119 96 +14 3 1 67 118 96 +14 3 2 0 117 95 +14 3 2 1 116 95 +14 3 2 2 117 94 +14 3 2 3 116 94 +14 3 2 4 117 93 +14 3 2 5 116 93 +14 3 2 6 117 92 +14 3 2 7 116 92 +14 3 2 8 117 91 +14 3 2 9 116 91 +14 3 2 10 117 90 +14 3 2 11 -1 -1 +14 3 2 12 116 90 +14 3 2 13 117 89 +14 3 2 14 116 89 +14 3 2 15 117 88 +14 3 2 16 116 88 +14 3 2 17 117 87 +14 3 2 18 116 87 +14 3 2 19 117 86 +14 3 2 20 116 86 +14 3 2 21 117 85 +14 3 2 22 -1 -1 +14 3 2 23 116 85 +14 3 2 24 117 84 +14 3 2 25 116 84 +14 3 2 26 117 83 +14 3 2 27 116 83 +14 3 2 28 117 82 +14 3 2 29 116 82 +14 3 2 30 117 81 +14 3 2 31 116 81 +14 3 2 32 117 80 +14 3 2 33 116 80 +14 3 2 34 117 79 +14 3 2 35 116 79 +14 3 2 36 117 78 +14 3 2 37 116 78 +14 3 2 38 117 77 +14 3 2 39 116 77 +14 3 2 40 117 76 +14 3 2 41 116 76 +14 3 2 42 117 75 +14 3 2 43 116 75 +14 3 2 44 117 74 +14 3 2 45 -1 -1 +14 3 2 46 116 74 +14 3 2 47 117 73 +14 3 2 48 116 73 +14 3 2 49 117 72 +14 3 2 50 116 72 +14 3 2 51 117 71 +14 3 2 52 116 71 +14 3 2 53 117 70 +14 3 2 54 116 70 +14 3 2 55 117 69 +14 3 2 56 -1 -1 +14 3 2 57 116 69 +14 3 2 58 117 68 +14 3 2 59 116 68 +14 3 2 60 117 67 +14 3 2 61 116 67 +14 3 2 62 117 66 +14 3 2 63 116 66 +14 3 2 64 117 65 +14 3 2 65 116 65 +14 3 2 66 117 64 +14 3 2 67 116 64 +14 3 3 0 117 127 +14 3 3 1 116 127 +14 3 3 2 117 126 +14 3 3 3 116 126 +14 3 3 4 117 125 +14 3 3 5 116 125 +14 3 3 6 117 124 +14 3 3 7 116 124 +14 3 3 8 117 123 +14 3 3 9 116 123 +14 3 3 10 117 122 +14 3 3 11 -1 -1 +14 3 3 12 116 122 +14 3 3 13 117 121 +14 3 3 14 116 121 +14 3 3 15 117 120 +14 3 3 16 116 120 +14 3 3 17 117 119 +14 3 3 18 116 119 +14 3 3 19 117 118 +14 3 3 20 116 118 +14 3 3 21 117 117 +14 3 3 22 -1 -1 +14 3 3 23 116 117 +14 3 3 24 117 116 +14 3 3 25 116 116 +14 3 3 26 117 115 +14 3 3 27 116 115 +14 3 3 28 117 114 +14 3 3 29 116 114 +14 3 3 30 117 113 +14 3 3 31 116 113 +14 3 3 32 117 112 +14 3 3 33 116 112 +14 3 3 34 117 111 +14 3 3 35 116 111 +14 3 3 36 117 110 +14 3 3 37 116 110 +14 3 3 38 117 109 +14 3 3 39 116 109 +14 3 3 40 117 108 +14 3 3 41 116 108 +14 3 3 42 117 107 +14 3 3 43 116 107 +14 3 3 44 117 106 +14 3 3 45 -1 -1 +14 3 3 46 116 106 +14 3 3 47 117 105 +14 3 3 48 116 105 +14 3 3 49 117 104 +14 3 3 50 116 104 +14 3 3 51 117 103 +14 3 3 52 116 103 +14 3 3 53 117 102 +14 3 3 54 116 102 +14 3 3 55 117 101 +14 3 3 56 -1 -1 +14 3 3 57 116 101 +14 3 3 58 117 100 +14 3 3 59 116 100 +14 3 3 60 117 99 +14 3 3 61 116 99 +14 3 3 62 117 98 +14 3 3 63 116 98 +14 3 3 64 117 97 +14 3 3 65 116 97 +14 3 3 66 117 96 +14 3 3 67 116 96 +15 0 0 0 120 32 +15 0 0 1 121 32 +15 0 0 2 120 33 +15 0 0 3 121 33 +15 0 0 4 120 34 +15 0 0 5 121 34 +15 0 0 6 120 35 +15 0 0 7 121 35 +15 0 0 8 120 36 +15 0 0 9 121 36 +15 0 0 10 120 37 +15 0 0 11 -1 -1 +15 0 0 12 121 37 +15 0 0 13 120 38 +15 0 0 14 121 38 +15 0 0 15 120 39 +15 0 0 16 121 39 +15 0 0 17 120 40 +15 0 0 18 121 40 +15 0 0 19 120 41 +15 0 0 20 121 41 +15 0 0 21 120 42 +15 0 0 22 -1 -1 +15 0 0 23 121 42 +15 0 0 24 120 43 +15 0 0 25 121 43 +15 0 0 26 120 44 +15 0 0 27 121 44 +15 0 0 28 120 45 +15 0 0 29 121 45 +15 0 0 30 120 46 +15 0 0 31 121 46 +15 0 0 32 120 47 +15 0 0 33 121 47 +15 0 0 34 120 48 +15 0 0 35 121 48 +15 0 0 36 120 49 +15 0 0 37 121 49 +15 0 0 38 120 50 +15 0 0 39 121 50 +15 0 0 40 120 51 +15 0 0 41 121 51 +15 0 0 42 120 52 +15 0 0 43 121 52 +15 0 0 44 120 53 +15 0 0 45 -1 -1 +15 0 0 46 121 53 +15 0 0 47 120 54 +15 0 0 48 121 54 +15 0 0 49 120 55 +15 0 0 50 121 55 +15 0 0 51 120 56 +15 0 0 52 121 56 +15 0 0 53 120 57 +15 0 0 54 121 57 +15 0 0 55 120 58 +15 0 0 56 -1 -1 +15 0 0 57 121 58 +15 0 0 58 120 59 +15 0 0 59 121 59 +15 0 0 60 120 60 +15 0 0 61 121 60 +15 0 0 62 120 61 +15 0 0 63 121 61 +15 0 0 64 120 62 +15 0 0 65 121 62 +15 0 0 66 120 63 +15 0 0 67 121 63 +15 0 1 0 120 0 +15 0 1 1 121 0 +15 0 1 2 120 1 +15 0 1 3 121 1 +15 0 1 4 120 2 +15 0 1 5 121 2 +15 0 1 6 120 3 +15 0 1 7 121 3 +15 0 1 8 120 4 +15 0 1 9 121 4 +15 0 1 10 120 5 +15 0 1 11 -1 -1 +15 0 1 12 121 5 +15 0 1 13 120 6 +15 0 1 14 121 6 +15 0 1 15 120 7 +15 0 1 16 121 7 +15 0 1 17 120 8 +15 0 1 18 121 8 +15 0 1 19 120 9 +15 0 1 20 121 9 +15 0 1 21 120 10 +15 0 1 22 -1 -1 +15 0 1 23 121 10 +15 0 1 24 120 11 +15 0 1 25 121 11 +15 0 1 26 120 12 +15 0 1 27 121 12 +15 0 1 28 120 13 +15 0 1 29 121 13 +15 0 1 30 120 14 +15 0 1 31 121 14 +15 0 1 32 120 15 +15 0 1 33 121 15 +15 0 1 34 120 16 +15 0 1 35 121 16 +15 0 1 36 120 17 +15 0 1 37 121 17 +15 0 1 38 120 18 +15 0 1 39 121 18 +15 0 1 40 120 19 +15 0 1 41 121 19 +15 0 1 42 120 20 +15 0 1 43 121 20 +15 0 1 44 120 21 +15 0 1 45 -1 -1 +15 0 1 46 121 21 +15 0 1 47 120 22 +15 0 1 48 121 22 +15 0 1 49 120 23 +15 0 1 50 121 23 +15 0 1 51 120 24 +15 0 1 52 121 24 +15 0 1 53 120 25 +15 0 1 54 121 25 +15 0 1 55 120 26 +15 0 1 56 -1 -1 +15 0 1 57 121 26 +15 0 1 58 120 27 +15 0 1 59 121 27 +15 0 1 60 120 28 +15 0 1 61 121 28 +15 0 1 62 120 29 +15 0 1 63 121 29 +15 0 1 64 120 30 +15 0 1 65 121 30 +15 0 1 66 120 31 +15 0 1 67 121 31 +15 0 2 0 122 32 +15 0 2 1 123 32 +15 0 2 2 122 33 +15 0 2 3 123 33 +15 0 2 4 122 34 +15 0 2 5 123 34 +15 0 2 6 122 35 +15 0 2 7 123 35 +15 0 2 8 122 36 +15 0 2 9 123 36 +15 0 2 10 122 37 +15 0 2 11 -1 -1 +15 0 2 12 123 37 +15 0 2 13 122 38 +15 0 2 14 123 38 +15 0 2 15 122 39 +15 0 2 16 123 39 +15 0 2 17 122 40 +15 0 2 18 123 40 +15 0 2 19 122 41 +15 0 2 20 123 41 +15 0 2 21 122 42 +15 0 2 22 -1 -1 +15 0 2 23 123 42 +15 0 2 24 122 43 +15 0 2 25 123 43 +15 0 2 26 122 44 +15 0 2 27 123 44 +15 0 2 28 122 45 +15 0 2 29 123 45 +15 0 2 30 122 46 +15 0 2 31 123 46 +15 0 2 32 122 47 +15 0 2 33 123 47 +15 0 2 34 122 48 +15 0 2 35 123 48 +15 0 2 36 122 49 +15 0 2 37 123 49 +15 0 2 38 122 50 +15 0 2 39 123 50 +15 0 2 40 122 51 +15 0 2 41 123 51 +15 0 2 42 122 52 +15 0 2 43 123 52 +15 0 2 44 122 53 +15 0 2 45 -1 -1 +15 0 2 46 123 53 +15 0 2 47 122 54 +15 0 2 48 123 54 +15 0 2 49 122 55 +15 0 2 50 123 55 +15 0 2 51 122 56 +15 0 2 52 123 56 +15 0 2 53 122 57 +15 0 2 54 123 57 +15 0 2 55 122 58 +15 0 2 56 -1 -1 +15 0 2 57 123 58 +15 0 2 58 122 59 +15 0 2 59 123 59 +15 0 2 60 122 60 +15 0 2 61 123 60 +15 0 2 62 122 61 +15 0 2 63 123 61 +15 0 2 64 122 62 +15 0 2 65 123 62 +15 0 2 66 122 63 +15 0 2 67 123 63 +15 0 3 0 122 0 +15 0 3 1 123 0 +15 0 3 2 122 1 +15 0 3 3 123 1 +15 0 3 4 122 2 +15 0 3 5 123 2 +15 0 3 6 122 3 +15 0 3 7 123 3 +15 0 3 8 122 4 +15 0 3 9 123 4 +15 0 3 10 122 5 +15 0 3 11 -1 -1 +15 0 3 12 123 5 +15 0 3 13 122 6 +15 0 3 14 123 6 +15 0 3 15 122 7 +15 0 3 16 123 7 +15 0 3 17 122 8 +15 0 3 18 123 8 +15 0 3 19 122 9 +15 0 3 20 123 9 +15 0 3 21 122 10 +15 0 3 22 -1 -1 +15 0 3 23 123 10 +15 0 3 24 122 11 +15 0 3 25 123 11 +15 0 3 26 122 12 +15 0 3 27 123 12 +15 0 3 28 122 13 +15 0 3 29 123 13 +15 0 3 30 122 14 +15 0 3 31 123 14 +15 0 3 32 122 15 +15 0 3 33 123 15 +15 0 3 34 122 16 +15 0 3 35 123 16 +15 0 3 36 122 17 +15 0 3 37 123 17 +15 0 3 38 122 18 +15 0 3 39 123 18 +15 0 3 40 122 19 +15 0 3 41 123 19 +15 0 3 42 122 20 +15 0 3 43 123 20 +15 0 3 44 122 21 +15 0 3 45 -1 -1 +15 0 3 46 123 21 +15 0 3 47 122 22 +15 0 3 48 123 22 +15 0 3 49 122 23 +15 0 3 50 123 23 +15 0 3 51 122 24 +15 0 3 52 123 24 +15 0 3 53 122 25 +15 0 3 54 123 25 +15 0 3 55 122 26 +15 0 3 56 -1 -1 +15 0 3 57 123 26 +15 0 3 58 122 27 +15 0 3 59 123 27 +15 0 3 60 122 28 +15 0 3 61 123 28 +15 0 3 62 122 29 +15 0 3 63 123 29 +15 0 3 64 122 30 +15 0 3 65 123 30 +15 0 3 66 122 31 +15 0 3 67 123 31 +15 1 0 0 123 95 +15 1 0 1 122 95 +15 1 0 2 123 94 +15 1 0 3 122 94 +15 1 0 4 123 93 +15 1 0 5 122 93 +15 1 0 6 123 92 +15 1 0 7 122 92 +15 1 0 8 123 91 +15 1 0 9 122 91 +15 1 0 10 123 90 +15 1 0 11 -1 -1 +15 1 0 12 122 90 +15 1 0 13 123 89 +15 1 0 14 122 89 +15 1 0 15 123 88 +15 1 0 16 122 88 +15 1 0 17 123 87 +15 1 0 18 122 87 +15 1 0 19 123 86 +15 1 0 20 122 86 +15 1 0 21 123 85 +15 1 0 22 -1 -1 +15 1 0 23 122 85 +15 1 0 24 123 84 +15 1 0 25 122 84 +15 1 0 26 123 83 +15 1 0 27 122 83 +15 1 0 28 123 82 +15 1 0 29 122 82 +15 1 0 30 123 81 +15 1 0 31 122 81 +15 1 0 32 123 80 +15 1 0 33 122 80 +15 1 0 34 123 79 +15 1 0 35 122 79 +15 1 0 36 123 78 +15 1 0 37 122 78 +15 1 0 38 123 77 +15 1 0 39 122 77 +15 1 0 40 123 76 +15 1 0 41 122 76 +15 1 0 42 123 75 +15 1 0 43 122 75 +15 1 0 44 123 74 +15 1 0 45 -1 -1 +15 1 0 46 122 74 +15 1 0 47 123 73 +15 1 0 48 122 73 +15 1 0 49 123 72 +15 1 0 50 122 72 +15 1 0 51 123 71 +15 1 0 52 122 71 +15 1 0 53 123 70 +15 1 0 54 122 70 +15 1 0 55 123 69 +15 1 0 56 -1 -1 +15 1 0 57 122 69 +15 1 0 58 123 68 +15 1 0 59 122 68 +15 1 0 60 123 67 +15 1 0 61 122 67 +15 1 0 62 123 66 +15 1 0 63 122 66 +15 1 0 64 123 65 +15 1 0 65 122 65 +15 1 0 66 123 64 +15 1 0 67 122 64 +15 1 1 0 123 127 +15 1 1 1 122 127 +15 1 1 2 123 126 +15 1 1 3 122 126 +15 1 1 4 123 125 +15 1 1 5 122 125 +15 1 1 6 123 124 +15 1 1 7 122 124 +15 1 1 8 123 123 +15 1 1 9 122 123 +15 1 1 10 123 122 +15 1 1 11 -1 -1 +15 1 1 12 122 122 +15 1 1 13 123 121 +15 1 1 14 122 121 +15 1 1 15 123 120 +15 1 1 16 122 120 +15 1 1 17 123 119 +15 1 1 18 122 119 +15 1 1 19 123 118 +15 1 1 20 122 118 +15 1 1 21 123 117 +15 1 1 22 -1 -1 +15 1 1 23 122 117 +15 1 1 24 123 116 +15 1 1 25 122 116 +15 1 1 26 123 115 +15 1 1 27 122 115 +15 1 1 28 123 114 +15 1 1 29 122 114 +15 1 1 30 123 113 +15 1 1 31 122 113 +15 1 1 32 123 112 +15 1 1 33 122 112 +15 1 1 34 123 111 +15 1 1 35 122 111 +15 1 1 36 123 110 +15 1 1 37 122 110 +15 1 1 38 123 109 +15 1 1 39 122 109 +15 1 1 40 123 108 +15 1 1 41 122 108 +15 1 1 42 123 107 +15 1 1 43 122 107 +15 1 1 44 123 106 +15 1 1 45 -1 -1 +15 1 1 46 122 106 +15 1 1 47 123 105 +15 1 1 48 122 105 +15 1 1 49 123 104 +15 1 1 50 122 104 +15 1 1 51 123 103 +15 1 1 52 122 103 +15 1 1 53 123 102 +15 1 1 54 122 102 +15 1 1 55 123 101 +15 1 1 56 -1 -1 +15 1 1 57 122 101 +15 1 1 58 123 100 +15 1 1 59 122 100 +15 1 1 60 123 99 +15 1 1 61 122 99 +15 1 1 62 123 98 +15 1 1 63 122 98 +15 1 1 64 123 97 +15 1 1 65 122 97 +15 1 1 66 123 96 +15 1 1 67 122 96 +15 1 2 0 121 95 +15 1 2 1 120 95 +15 1 2 2 121 94 +15 1 2 3 120 94 +15 1 2 4 121 93 +15 1 2 5 120 93 +15 1 2 6 121 92 +15 1 2 7 120 92 +15 1 2 8 121 91 +15 1 2 9 120 91 +15 1 2 10 121 90 +15 1 2 11 -1 -1 +15 1 2 12 120 90 +15 1 2 13 121 89 +15 1 2 14 120 89 +15 1 2 15 121 88 +15 1 2 16 120 88 +15 1 2 17 121 87 +15 1 2 18 120 87 +15 1 2 19 121 86 +15 1 2 20 120 86 +15 1 2 21 121 85 +15 1 2 22 -1 -1 +15 1 2 23 120 85 +15 1 2 24 121 84 +15 1 2 25 120 84 +15 1 2 26 121 83 +15 1 2 27 120 83 +15 1 2 28 121 82 +15 1 2 29 120 82 +15 1 2 30 121 81 +15 1 2 31 120 81 +15 1 2 32 121 80 +15 1 2 33 120 80 +15 1 2 34 121 79 +15 1 2 35 120 79 +15 1 2 36 121 78 +15 1 2 37 120 78 +15 1 2 38 121 77 +15 1 2 39 120 77 +15 1 2 40 121 76 +15 1 2 41 120 76 +15 1 2 42 121 75 +15 1 2 43 120 75 +15 1 2 44 121 74 +15 1 2 45 -1 -1 +15 1 2 46 120 74 +15 1 2 47 121 73 +15 1 2 48 120 73 +15 1 2 49 121 72 +15 1 2 50 120 72 +15 1 2 51 121 71 +15 1 2 52 120 71 +15 1 2 53 121 70 +15 1 2 54 120 70 +15 1 2 55 121 69 +15 1 2 56 -1 -1 +15 1 2 57 120 69 +15 1 2 58 121 68 +15 1 2 59 120 68 +15 1 2 60 121 67 +15 1 2 61 120 67 +15 1 2 62 121 66 +15 1 2 63 120 66 +15 1 2 64 121 65 +15 1 2 65 120 65 +15 1 2 66 121 64 +15 1 2 67 120 64 +15 1 3 0 121 127 +15 1 3 1 120 127 +15 1 3 2 121 126 +15 1 3 3 120 126 +15 1 3 4 121 125 +15 1 3 5 120 125 +15 1 3 6 121 124 +15 1 3 7 120 124 +15 1 3 8 121 123 +15 1 3 9 120 123 +15 1 3 10 121 122 +15 1 3 11 -1 -1 +15 1 3 12 120 122 +15 1 3 13 121 121 +15 1 3 14 120 121 +15 1 3 15 121 120 +15 1 3 16 120 120 +15 1 3 17 121 119 +15 1 3 18 120 119 +15 1 3 19 121 118 +15 1 3 20 120 118 +15 1 3 21 121 117 +15 1 3 22 -1 -1 +15 1 3 23 120 117 +15 1 3 24 121 116 +15 1 3 25 120 116 +15 1 3 26 121 115 +15 1 3 27 120 115 +15 1 3 28 121 114 +15 1 3 29 120 114 +15 1 3 30 121 113 +15 1 3 31 120 113 +15 1 3 32 121 112 +15 1 3 33 120 112 +15 1 3 34 121 111 +15 1 3 35 120 111 +15 1 3 36 121 110 +15 1 3 37 120 110 +15 1 3 38 121 109 +15 1 3 39 120 109 +15 1 3 40 121 108 +15 1 3 41 120 108 +15 1 3 42 121 107 +15 1 3 43 120 107 +15 1 3 44 121 106 +15 1 3 45 -1 -1 +15 1 3 46 120 106 +15 1 3 47 121 105 +15 1 3 48 120 105 +15 1 3 49 121 104 +15 1 3 50 120 104 +15 1 3 51 121 103 +15 1 3 52 120 103 +15 1 3 53 121 102 +15 1 3 54 120 102 +15 1 3 55 121 101 +15 1 3 56 -1 -1 +15 1 3 57 120 101 +15 1 3 58 121 100 +15 1 3 59 120 100 +15 1 3 60 121 99 +15 1 3 61 120 99 +15 1 3 62 121 98 +15 1 3 63 120 98 +15 1 3 64 121 97 +15 1 3 65 120 97 +15 1 3 66 121 96 +15 1 3 67 120 96 +15 2 0 0 124 32 +15 2 0 1 125 32 +15 2 0 2 124 33 +15 2 0 3 125 33 +15 2 0 4 124 34 +15 2 0 5 125 34 +15 2 0 6 124 35 +15 2 0 7 125 35 +15 2 0 8 124 36 +15 2 0 9 125 36 +15 2 0 10 124 37 +15 2 0 11 -1 -1 +15 2 0 12 125 37 +15 2 0 13 124 38 +15 2 0 14 125 38 +15 2 0 15 124 39 +15 2 0 16 125 39 +15 2 0 17 124 40 +15 2 0 18 125 40 +15 2 0 19 124 41 +15 2 0 20 125 41 +15 2 0 21 124 42 +15 2 0 22 -1 -1 +15 2 0 23 125 42 +15 2 0 24 124 43 +15 2 0 25 125 43 +15 2 0 26 124 44 +15 2 0 27 125 44 +15 2 0 28 124 45 +15 2 0 29 125 45 +15 2 0 30 124 46 +15 2 0 31 125 46 +15 2 0 32 124 47 +15 2 0 33 125 47 +15 2 0 34 124 48 +15 2 0 35 125 48 +15 2 0 36 124 49 +15 2 0 37 125 49 +15 2 0 38 124 50 +15 2 0 39 125 50 +15 2 0 40 124 51 +15 2 0 41 125 51 +15 2 0 42 124 52 +15 2 0 43 125 52 +15 2 0 44 124 53 +15 2 0 45 -1 -1 +15 2 0 46 125 53 +15 2 0 47 124 54 +15 2 0 48 125 54 +15 2 0 49 124 55 +15 2 0 50 125 55 +15 2 0 51 124 56 +15 2 0 52 125 56 +15 2 0 53 124 57 +15 2 0 54 125 57 +15 2 0 55 124 58 +15 2 0 56 -1 -1 +15 2 0 57 125 58 +15 2 0 58 124 59 +15 2 0 59 125 59 +15 2 0 60 124 60 +15 2 0 61 125 60 +15 2 0 62 124 61 +15 2 0 63 125 61 +15 2 0 64 124 62 +15 2 0 65 125 62 +15 2 0 66 124 63 +15 2 0 67 125 63 +15 2 1 0 124 0 +15 2 1 1 125 0 +15 2 1 2 124 1 +15 2 1 3 125 1 +15 2 1 4 124 2 +15 2 1 5 125 2 +15 2 1 6 124 3 +15 2 1 7 125 3 +15 2 1 8 124 4 +15 2 1 9 125 4 +15 2 1 10 124 5 +15 2 1 11 -1 -1 +15 2 1 12 125 5 +15 2 1 13 124 6 +15 2 1 14 125 6 +15 2 1 15 124 7 +15 2 1 16 125 7 +15 2 1 17 124 8 +15 2 1 18 125 8 +15 2 1 19 124 9 +15 2 1 20 125 9 +15 2 1 21 124 10 +15 2 1 22 -1 -1 +15 2 1 23 125 10 +15 2 1 24 124 11 +15 2 1 25 125 11 +15 2 1 26 124 12 +15 2 1 27 125 12 +15 2 1 28 124 13 +15 2 1 29 125 13 +15 2 1 30 124 14 +15 2 1 31 125 14 +15 2 1 32 124 15 +15 2 1 33 125 15 +15 2 1 34 124 16 +15 2 1 35 125 16 +15 2 1 36 124 17 +15 2 1 37 125 17 +15 2 1 38 124 18 +15 2 1 39 125 18 +15 2 1 40 124 19 +15 2 1 41 125 19 +15 2 1 42 124 20 +15 2 1 43 125 20 +15 2 1 44 124 21 +15 2 1 45 -1 -1 +15 2 1 46 125 21 +15 2 1 47 124 22 +15 2 1 48 125 22 +15 2 1 49 124 23 +15 2 1 50 125 23 +15 2 1 51 124 24 +15 2 1 52 125 24 +15 2 1 53 124 25 +15 2 1 54 125 25 +15 2 1 55 124 26 +15 2 1 56 -1 -1 +15 2 1 57 125 26 +15 2 1 58 124 27 +15 2 1 59 125 27 +15 2 1 60 124 28 +15 2 1 61 125 28 +15 2 1 62 124 29 +15 2 1 63 125 29 +15 2 1 64 124 30 +15 2 1 65 125 30 +15 2 1 66 124 31 +15 2 1 67 125 31 +15 2 2 0 126 32 +15 2 2 1 127 32 +15 2 2 2 126 33 +15 2 2 3 127 33 +15 2 2 4 126 34 +15 2 2 5 127 34 +15 2 2 6 126 35 +15 2 2 7 127 35 +15 2 2 8 126 36 +15 2 2 9 127 36 +15 2 2 10 126 37 +15 2 2 11 -1 -1 +15 2 2 12 127 37 +15 2 2 13 126 38 +15 2 2 14 127 38 +15 2 2 15 126 39 +15 2 2 16 127 39 +15 2 2 17 126 40 +15 2 2 18 127 40 +15 2 2 19 126 41 +15 2 2 20 127 41 +15 2 2 21 126 42 +15 2 2 22 -1 -1 +15 2 2 23 127 42 +15 2 2 24 126 43 +15 2 2 25 127 43 +15 2 2 26 126 44 +15 2 2 27 127 44 +15 2 2 28 126 45 +15 2 2 29 127 45 +15 2 2 30 126 46 +15 2 2 31 127 46 +15 2 2 32 126 47 +15 2 2 33 127 47 +15 2 2 34 126 48 +15 2 2 35 127 48 +15 2 2 36 126 49 +15 2 2 37 127 49 +15 2 2 38 126 50 +15 2 2 39 127 50 +15 2 2 40 126 51 +15 2 2 41 127 51 +15 2 2 42 126 52 +15 2 2 43 127 52 +15 2 2 44 126 53 +15 2 2 45 -1 -1 +15 2 2 46 127 53 +15 2 2 47 126 54 +15 2 2 48 127 54 +15 2 2 49 126 55 +15 2 2 50 127 55 +15 2 2 51 126 56 +15 2 2 52 127 56 +15 2 2 53 126 57 +15 2 2 54 127 57 +15 2 2 55 126 58 +15 2 2 56 -1 -1 +15 2 2 57 127 58 +15 2 2 58 126 59 +15 2 2 59 127 59 +15 2 2 60 126 60 +15 2 2 61 127 60 +15 2 2 62 126 61 +15 2 2 63 127 61 +15 2 2 64 126 62 +15 2 2 65 127 62 +15 2 2 66 126 63 +15 2 2 67 127 63 +15 2 3 0 126 0 +15 2 3 1 127 0 +15 2 3 2 126 1 +15 2 3 3 127 1 +15 2 3 4 126 2 +15 2 3 5 127 2 +15 2 3 6 126 3 +15 2 3 7 127 3 +15 2 3 8 126 4 +15 2 3 9 127 4 +15 2 3 10 126 5 +15 2 3 11 -1 -1 +15 2 3 12 127 5 +15 2 3 13 126 6 +15 2 3 14 127 6 +15 2 3 15 126 7 +15 2 3 16 127 7 +15 2 3 17 126 8 +15 2 3 18 127 8 +15 2 3 19 126 9 +15 2 3 20 127 9 +15 2 3 21 126 10 +15 2 3 22 -1 -1 +15 2 3 23 127 10 +15 2 3 24 126 11 +15 2 3 25 127 11 +15 2 3 26 126 12 +15 2 3 27 127 12 +15 2 3 28 126 13 +15 2 3 29 127 13 +15 2 3 30 126 14 +15 2 3 31 127 14 +15 2 3 32 126 15 +15 2 3 33 127 15 +15 2 3 34 126 16 +15 2 3 35 127 16 +15 2 3 36 126 17 +15 2 3 37 127 17 +15 2 3 38 126 18 +15 2 3 39 127 18 +15 2 3 40 126 19 +15 2 3 41 127 19 +15 2 3 42 126 20 +15 2 3 43 127 20 +15 2 3 44 126 21 +15 2 3 45 -1 -1 +15 2 3 46 127 21 +15 2 3 47 126 22 +15 2 3 48 127 22 +15 2 3 49 126 23 +15 2 3 50 127 23 +15 2 3 51 126 24 +15 2 3 52 127 24 +15 2 3 53 126 25 +15 2 3 54 127 25 +15 2 3 55 126 26 +15 2 3 56 -1 -1 +15 2 3 57 127 26 +15 2 3 58 126 27 +15 2 3 59 127 27 +15 2 3 60 126 28 +15 2 3 61 127 28 +15 2 3 62 126 29 +15 2 3 63 127 29 +15 2 3 64 126 30 +15 2 3 65 127 30 +15 2 3 66 126 31 +15 2 3 67 127 31 +15 3 0 0 127 95 +15 3 0 1 126 95 +15 3 0 2 127 94 +15 3 0 3 126 94 +15 3 0 4 127 93 +15 3 0 5 126 93 +15 3 0 6 127 92 +15 3 0 7 126 92 +15 3 0 8 127 91 +15 3 0 9 126 91 +15 3 0 10 127 90 +15 3 0 11 -1 -1 +15 3 0 12 126 90 +15 3 0 13 127 89 +15 3 0 14 126 89 +15 3 0 15 127 88 +15 3 0 16 126 88 +15 3 0 17 127 87 +15 3 0 18 126 87 +15 3 0 19 127 86 +15 3 0 20 126 86 +15 3 0 21 127 85 +15 3 0 22 -1 -1 +15 3 0 23 126 85 +15 3 0 24 127 84 +15 3 0 25 126 84 +15 3 0 26 127 83 +15 3 0 27 126 83 +15 3 0 28 127 82 +15 3 0 29 126 82 +15 3 0 30 127 81 +15 3 0 31 126 81 +15 3 0 32 127 80 +15 3 0 33 126 80 +15 3 0 34 127 79 +15 3 0 35 126 79 +15 3 0 36 127 78 +15 3 0 37 126 78 +15 3 0 38 127 77 +15 3 0 39 126 77 +15 3 0 40 127 76 +15 3 0 41 126 76 +15 3 0 42 127 75 +15 3 0 43 126 75 +15 3 0 44 127 74 +15 3 0 45 -1 -1 +15 3 0 46 126 74 +15 3 0 47 127 73 +15 3 0 48 126 73 +15 3 0 49 127 72 +15 3 0 50 126 72 +15 3 0 51 127 71 +15 3 0 52 126 71 +15 3 0 53 127 70 +15 3 0 54 126 70 +15 3 0 55 127 69 +15 3 0 56 -1 -1 +15 3 0 57 126 69 +15 3 0 58 127 68 +15 3 0 59 126 68 +15 3 0 60 127 67 +15 3 0 61 126 67 +15 3 0 62 127 66 +15 3 0 63 126 66 +15 3 0 64 127 65 +15 3 0 65 126 65 +15 3 0 66 127 64 +15 3 0 67 126 64 +15 3 1 0 127 127 +15 3 1 1 126 127 +15 3 1 2 127 126 +15 3 1 3 126 126 +15 3 1 4 127 125 +15 3 1 5 126 125 +15 3 1 6 127 124 +15 3 1 7 126 124 +15 3 1 8 127 123 +15 3 1 9 126 123 +15 3 1 10 127 122 +15 3 1 11 -1 -1 +15 3 1 12 126 122 +15 3 1 13 127 121 +15 3 1 14 126 121 +15 3 1 15 127 120 +15 3 1 16 126 120 +15 3 1 17 127 119 +15 3 1 18 126 119 +15 3 1 19 127 118 +15 3 1 20 126 118 +15 3 1 21 127 117 +15 3 1 22 -1 -1 +15 3 1 23 126 117 +15 3 1 24 127 116 +15 3 1 25 126 116 +15 3 1 26 127 115 +15 3 1 27 126 115 +15 3 1 28 127 114 +15 3 1 29 126 114 +15 3 1 30 127 113 +15 3 1 31 126 113 +15 3 1 32 127 112 +15 3 1 33 126 112 +15 3 1 34 127 111 +15 3 1 35 126 111 +15 3 1 36 127 110 +15 3 1 37 126 110 +15 3 1 38 127 109 +15 3 1 39 126 109 +15 3 1 40 127 108 +15 3 1 41 126 108 +15 3 1 42 127 107 +15 3 1 43 126 107 +15 3 1 44 127 106 +15 3 1 45 -1 -1 +15 3 1 46 126 106 +15 3 1 47 127 105 +15 3 1 48 126 105 +15 3 1 49 127 104 +15 3 1 50 126 104 +15 3 1 51 127 103 +15 3 1 52 126 103 +15 3 1 53 127 102 +15 3 1 54 126 102 +15 3 1 55 127 101 +15 3 1 56 -1 -1 +15 3 1 57 126 101 +15 3 1 58 127 100 +15 3 1 59 126 100 +15 3 1 60 127 99 +15 3 1 61 126 99 +15 3 1 62 127 98 +15 3 1 63 126 98 +15 3 1 64 127 97 +15 3 1 65 126 97 +15 3 1 66 127 96 +15 3 1 67 126 96 +15 3 2 0 125 95 +15 3 2 1 124 95 +15 3 2 2 125 94 +15 3 2 3 124 94 +15 3 2 4 125 93 +15 3 2 5 124 93 +15 3 2 6 125 92 +15 3 2 7 124 92 +15 3 2 8 125 91 +15 3 2 9 124 91 +15 3 2 10 125 90 +15 3 2 11 -1 -1 +15 3 2 12 124 90 +15 3 2 13 125 89 +15 3 2 14 124 89 +15 3 2 15 125 88 +15 3 2 16 124 88 +15 3 2 17 125 87 +15 3 2 18 124 87 +15 3 2 19 125 86 +15 3 2 20 124 86 +15 3 2 21 125 85 +15 3 2 22 -1 -1 +15 3 2 23 124 85 +15 3 2 24 125 84 +15 3 2 25 124 84 +15 3 2 26 125 83 +15 3 2 27 124 83 +15 3 2 28 125 82 +15 3 2 29 124 82 +15 3 2 30 125 81 +15 3 2 31 124 81 +15 3 2 32 125 80 +15 3 2 33 124 80 +15 3 2 34 125 79 +15 3 2 35 124 79 +15 3 2 36 125 78 +15 3 2 37 124 78 +15 3 2 38 125 77 +15 3 2 39 124 77 +15 3 2 40 125 76 +15 3 2 41 124 76 +15 3 2 42 125 75 +15 3 2 43 124 75 +15 3 2 44 125 74 +15 3 2 45 -1 -1 +15 3 2 46 124 74 +15 3 2 47 125 73 +15 3 2 48 124 73 +15 3 2 49 125 72 +15 3 2 50 124 72 +15 3 2 51 125 71 +15 3 2 52 124 71 +15 3 2 53 125 70 +15 3 2 54 124 70 +15 3 2 55 125 69 +15 3 2 56 -1 -1 +15 3 2 57 124 69 +15 3 2 58 125 68 +15 3 2 59 124 68 +15 3 2 60 125 67 +15 3 2 61 124 67 +15 3 2 62 125 66 +15 3 2 63 124 66 +15 3 2 64 125 65 +15 3 2 65 124 65 +15 3 2 66 125 64 +15 3 2 67 124 64 +15 3 3 0 125 127 +15 3 3 1 124 127 +15 3 3 2 125 126 +15 3 3 3 124 126 +15 3 3 4 125 125 +15 3 3 5 124 125 +15 3 3 6 125 124 +15 3 3 7 124 124 +15 3 3 8 125 123 +15 3 3 9 124 123 +15 3 3 10 125 122 +15 3 3 11 -1 -1 +15 3 3 12 124 122 +15 3 3 13 125 121 +15 3 3 14 124 121 +15 3 3 15 125 120 +15 3 3 16 124 120 +15 3 3 17 125 119 +15 3 3 18 124 119 +15 3 3 19 125 118 +15 3 3 20 124 118 +15 3 3 21 125 117 +15 3 3 22 -1 -1 +15 3 3 23 124 117 +15 3 3 24 125 116 +15 3 3 25 124 116 +15 3 3 26 125 115 +15 3 3 27 124 115 +15 3 3 28 125 114 +15 3 3 29 124 114 +15 3 3 30 125 113 +15 3 3 31 124 113 +15 3 3 32 125 112 +15 3 3 33 124 112 +15 3 3 34 125 111 +15 3 3 35 124 111 +15 3 3 36 125 110 +15 3 3 37 124 110 +15 3 3 38 125 109 +15 3 3 39 124 109 +15 3 3 40 125 108 +15 3 3 41 124 108 +15 3 3 42 125 107 +15 3 3 43 124 107 +15 3 3 44 125 106 +15 3 3 45 -1 -1 +15 3 3 46 124 106 +15 3 3 47 125 105 +15 3 3 48 124 105 +15 3 3 49 125 104 +15 3 3 50 124 104 +15 3 3 51 125 103 +15 3 3 52 124 103 +15 3 3 53 125 102 +15 3 3 54 124 102 +15 3 3 55 125 101 +15 3 3 56 -1 -1 +15 3 3 57 124 101 +15 3 3 58 125 100 +15 3 3 59 124 100 +15 3 3 60 125 99 +15 3 3 61 124 99 +15 3 3 62 125 98 +15 3 3 63 124 98 +15 3 3 64 125 97 +15 3 3 65 124 97 +15 3 3 66 125 96 +15 3 3 67 124 96 diff --git a/Examples/Example4/configs/RansacConfig.dat b/Examples/Example4/configs/RansacConfig.dat new file mode 100644 index 0000000000000000000000000000000000000000..e8d2c58bf00bf8b80651599724ac2473f471d651 --- /dev/null +++ b/Examples/Example4/configs/RansacConfig.dat @@ -0,0 +1,10 @@ +ConfigRansac +RANSACMaxIteration= 1200 +RANSACDistance= 5 +RANSACThreshold= 10 +RANSACChargeThreshold= 0.01 +RANSACPointThreshold= 0.1 +MAXBarycenterDistance= 6 +AngleMaxToMerge= 1 +MergeWithBarycenter= 1 +MergeWithScalarProduct= 1 diff --git a/Examples/Example4/cut/cut_p.root b/Examples/Example4/cut/cut_p.root new file mode 100644 index 0000000000000000000000000000000000000000..4ef7728dcc0b259584eb124afb95bb9613cfd0b9 Binary files /dev/null and b/Examples/Example4/cut/cut_p.root differ diff --git a/Examples/Example4/hclient.C b/Examples/Example4/hclient.C new file mode 100644 index 0000000000000000000000000000000000000000..0232426409b6e2de68403e7fc278dabe7a321c79 --- /dev/null +++ b/Examples/Example4/hclient.C @@ -0,0 +1,263 @@ +void Sync(); + +int m_Port = 9092; +TSocket *m_Sock; +TCanvas* c1; +TH3F* hXYZ; +TH3F* h3D; + +TH2F* h2Dxy; +TH2F* h2Dxz; +TH2F* hXY; +TH2F* hXZ; + +TList* m_Histo; + +vector<double> p0xy; +vector<double> p1xy; +vector<double> p0xz; +vector<double> p1xz; + + +vector<TF1*> vfxy; +vector<TF1*> vfxz; + + +int i; + +////////////////////////////////////////////////////// +void hclient() +{ + // Open connection to server + m_Sock = new TSocket("localhost", m_Port); + + //hXYZ = new TH3F("hXYZ","hXYZ",128,0,128,128,0,128,512,0,512); + hXYZ = new TH3F("hXYZ","hXYZ",128,0,128,128,0,128,128,0,128); + hXYZ->SetStats(0); + hXYZ->SetTitle(0); + hXYZ->GetXaxis()->SetTitle("Pad X"); + hXYZ->GetYaxis()->SetTitle("Pad Y"); + hXYZ->GetZaxis()->SetTitle("Time (a.u.)"); + hXYZ->GetXaxis()->CenterTitle(); + hXYZ->GetYaxis()->CenterTitle(); + hXYZ->GetZaxis()->CenterTitle(); + + hXYZ->GetXaxis()->SetTitleOffset(1.3); + hXYZ->GetYaxis()->SetTitleOffset(1.6); + hXYZ->GetZaxis()->SetTitleOffset(1.3); + + h2Dxy = new TH2F("h2Dxy","h2Dxy",128,0,128,128,0,128); + h2Dxy->SetStats(0); + h2Dxy->SetTitle(0); + h2Dxy->GetXaxis()->SetTitle("Pad X"); + h2Dxy->GetXaxis()->CenterTitle(); + h2Dxy->GetYaxis()->SetTitle("Pad Y"); + h2Dxy->GetYaxis()->CenterTitle(); + + h2Dxz = new TH2F("h2Dxz","h2Dxz",128,0,128,128,0,128); + h2Dxz->SetStats(0); + h2Dxz->SetTitle(0); + h2Dxz->GetXaxis()->SetTitle("Pad X"); + h2Dxz->GetXaxis()->CenterTitle(); + h2Dxz->GetYaxis()->SetTitle("Time (a.u.)"); + h2Dxz->GetYaxis()->CenterTitle(); + + //h3D = new TH3F("h3D","h3D",128,0,128,128,0,128,512,0,512); + c1 = new TCanvas("c1","c1",1600,600); + c1->Divide(3,1); + + i=0; + if(m_Sock->IsValid()){ + cout << "/// Successful connection to spectra server ///" << endl; + while(1) + Sync(); + } + + return; +} + +////////////////////////////////////////////////////// +void Sync() +{ + i++; + if(!m_Sock || !(m_Sock->IsValid())){ + if(m_Sock){ + m_Sock->Close("force"); + delete m_Sock; + m_Sock = NULL; + } + cout << "/// Sync failed: Connection lost ///" << endl; + } + + TMessage* message=NULL; + m_Sock->Send("RequestHisto"); + cout << "Sending RequestHisto..." << endl; + if(m_Sock->Recv(message)<=0){ + if(m_Sock){ + m_Sock->Close("force"); + delete m_Sock; + m_Sock = NULL; + } + cout << "/// Sync failed: message return unreadable ///" << endl; + } + + if(message){ + m_Histo = (TList*) message->ReadObject(message->GetClass()); + if(m_Histo){ + cout << "/// Successful sync of histo list ///" << endl; + vector<TGraph2D*> vg2d; + vg2d.clear(); + + vector<TH3F*> vh3; + vector<TH2F*> vhxy; + vector<TH2F*> vhxz; + vector<TGraph2D*> vg3; + vh3.clear(); + vhxy.clear(); + vhxz.clear(); + + + //cout << "+++++++++++++++++++++++++++++" << endl; + for(int i=0; i<m_Histo->GetSize(); i++){ + //cout << i << " / " << i%2 << endl; + + //if((i%2) == 0) vh3.push_back( (TH3F*) m_Histo->At(i)); + if((i%2) == 0) vg3.push_back( (TGraph2D *) m_Histo->At(i)); + + else vg2d.push_back( (TGraph2D *) m_Histo->At(i) ); + + } + + for(int i=0; i<vg3.size(); i++){ + //h3D = new TH3F("h3D","h3D",128,0,128,128,0,128,512,0,512); + h3D = new TH3F("h3D","h3D",128,0,128,128,0,128,128,0,128); + hXY = new TH2F("hXY","hXY",128,0,128,128,0,128); + hXZ = new TH2F("hXZ","hXZ",128,0,128,128,0,128); + + double *X = vg3[i]->GetX(); + double *Y = vg3[i]->GetY(); + double *Z = vg3[i]->GetZ(); + for(int p=0; p<vg3[i]->GetN(); p++){ + //cout << i << " / " << p << " / " << X[p] << " / " << Y[p] << " / " << Z[p] <<endl; + h3D->Fill(X[p],Y[p],Z[p]); + hXY->Fill(X[p],Y[p]); + hXZ->Fill(X[p],Z[p]); + } + vh3.push_back(h3D); + vhxy.push_back(hXY); + vhxz.push_back(hXZ); + } + + + c1->cd(1); + hXYZ->Draw(); + for(int i=0; i<vh3.size(); i++){ + vh3[i]->SetMarkerStyle(8); + vh3[i]->SetMarkerSize(0.7); + vh3[i]->SetMarkerColor(kAzure+i); + vh3[i]->Draw("same"); + } + + + p0xy.clear(); + p1xy.clear(); + p0xz.clear(); + p1xz.clear(); + vfxy.clear(); + vfxz.clear(); + for(int i=0; i<vg2d.size(); i++){ + vg2d[i]->SetLineWidth(4); + vg2d[i]->SetLineColor(kAzure+i); + vg2d[i]->Draw("tri1 same"); + + double axy = (vg2d[i]->GetY()[1] - vg2d[i]->GetY()[0]) / (vg2d[i]->GetX()[1] - vg2d[i]->GetX()[0]); + p1xy.push_back(axy); + p0xy.push_back( vg2d[i]->GetY()[0] - axy*vg2d[i]->GetX()[0] ); + + double axz = (vg2d[i]->GetZ()[1] - vg2d[i]->GetZ()[0]) / (vg2d[i]->GetX()[1] - vg2d[i]->GetX()[0]); + p1xz.push_back(axz); + p0xz.push_back( vg2d[i]->GetZ()[0] - axz*vg2d[i]->GetX()[0] ); + } + + for(unsigned int i=0; i<p0xy.size(); i++){ + TF1* f1xy = new TF1(Form("fxy%d",i+1),"[0]+[1]*x[0]",0,128); + f1xy->SetParameter(0,p0xy[i]); + f1xy->SetParameter(1,p1xy[i]); + f1xy->SetLineColor(2); + f1xy->SetLineWidth(3); + + vfxy.push_back(f1xy); + + TF1* f1xz = new TF1(Form("fxz%d",i+1),"[0]+[1]*x[0]",0,128); + f1xz->SetParameter(0,p0xz[i]); + f1xz->SetParameter(1,p1xz[i]); + f1xz->SetLineColor(2); + f1xz->SetLineWidth(3); + + vfxz.push_back(f1xz); + } + + c1->cd(2); + h2Dxy->Draw(); + for(int i=0; i<vhxy.size(); i++){ + vhxy[i]->Draw("colsame"); + } + + for(int i=0; i<vfxy.size(); i++){ + vfxy[i]->Draw("lsame"); + } + + + + c1->cd(3); + h2Dxz->Draw(); + for(int i=0; i<vhxz.size(); i++){ + vhxz[i]->Draw("colsame"); + } + + for(int i=0; i<vfxz.size(); i++){ + vfxz[i]->Draw("lsame"); + } + + TString SaveCanvas = Form("png/canvas_%d.png",i); + //gPad->SetPhi(110); + gPad->Update(); + //TString MakeGif = Form("gif/canvas_%d.gif+0.1",i); + //c1->SaveAs(SaveCanvas); + c1->Print("gif/canvas.gif+70"); + //c1->Update(); + + } + else cout << "/// Sync return a NULL spectra list ///" << endl; + + /*m_Histo->First()->Draw(); + m_Histo->Last()->Draw("tri1 same"); + gPad->Update();*/ + } + + +} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Example4/macro/CheckReco.C b/Examples/Example4/macro/CheckReco.C new file mode 100644 index 0000000000000000000000000000000000000000..59a59b28bf5e6df82e9764854baca1285089b81a --- /dev/null +++ b/Examples/Example4/macro/CheckReco.C @@ -0,0 +1,54 @@ +TChain* chain=NULL; + +TH1F* hvertex; +TH1F* henergy; +TH1F* hangle; + +TCutG* cut_p=NULL; + +/////////////////////////////////////////////// +void LoadCut() +{ + TFile* File_cutp = new TFile("cut/cut_p.root","READ"); + cut_p = (TCutG*) File_cutp->FindObjectAny("cut_p"); +} + +/////////////////////////////////////////////// +void LoadChain() +{ + chain = new TChain("PhysicsTree"); + chain->Add("../../Outputs/Analysis/Example4.root"); +} + +//////////////////////////////////////////////// +void CheckReco() +{ + LoadCut(); + LoadChain(); + + TCanvas* c1 = new TCanvas("c1","c1",1200,1200); + c1->Divide(2,2); + // Vertex // + c1->cd(1); + chain->Draw("InitXVertex+127-XVertex>>hvertex(200,-100,100)","cut_p"); + hvertex = (TH1F*) gDirectory->FindObjectAny("hvertex"); + hvertex->GetXaxis()->SetTitle("X_{init}-X_{reco} (mm)"); + hvertex->GetXaxis()->CenterTitle(); + + // Angle // + c1->cd(2); + chain->Draw("InitTheta3-ThetaLab>>hangle(200,-10,10)","cut_p"); + hangle = (TH1F*) gDirectory->FindObjectAny("hangle"); + hangle->GetXaxis()->SetTitle("#theta_{init}-#theta_{reco} (deg)"); + hangle->GetXaxis()->CenterTitle(); + + // Energy // + c1->cd(3); + chain->Draw("InitE3-ELab>>henergy(200,-2,2)","cut_p"); + henergy = (TH1F*) gDirectory->FindObjectAny("henergy"); + henergy->GetXaxis()->SetTitle("E_{init}-E_{reco} (MeV)"); + henergy->GetXaxis()->CenterTitle(); + + + +} diff --git a/Examples/Example4/macro/ShowResult.C b/Examples/Example4/macro/ShowResult.C new file mode 100644 index 0000000000000000000000000000000000000000..79904dca34220881593a386cae17111e504015b4 --- /dev/null +++ b/Examples/Example4/macro/ShowResult.C @@ -0,0 +1,74 @@ +TChain* chain=NULL; + +TH2F* hpid; +TH2F* hkine; +TH2F* hev; +TH1F* he; + +TCutG* cut_p=NULL; + +/////////////////////////////////////////////// +void LoadCut() +{ + TFile* File_cutp = new TFile("cut/cut_p.root","READ"); + cut_p = (TCutG*) File_cutp->FindObjectAny("cut_p"); +} + +/////////////////////////////////////////////// +void LoadChain() +{ + chain = new TChain("PhysicsTree"); + chain->Add("../../Outputs/Analysis/Example4.root"); +} + +//////////////////////////////////////////////// +void ShowResult() +{ + LoadCut(); + LoadChain(); + + TCanvas* c1 = new TCanvas("c1","c1",1200,1200); + c1->Divide(2,2); + // PID // + c1->cd(1); + chain->Draw("DE/60.:ESi>>hpid(500,0,15,500,0.2,20)","","colz"); + hpid = (TH2F*) gDirectory->FindObjectAny("hpid"); + hpid->GetXaxis()->SetTitle("E_{Si} (MeV)"); + hpid->GetXaxis()->CenterTitle(); + hpid->GetYaxis()->SetTitle("#DeltaE (a.u.)"); + hpid->GetYaxis()->CenterTitle(); + + cut_p->SetLineWidth(2); + cut_p->SetLineColor(2); + cut_p->Draw("same"); + // Kinematics // + c1->cd(2); + chain->Draw("ELab:ThetaLab>>hkine(100,0,50,200,0,15)","cut_p","colz"); + hkine = (TH2F*) gDirectory->FindObjectAny("hkine"); + hkine->GetXaxis()->SetTitle("#theta_{lab} (deg)"); + hkine->GetXaxis()->CenterTitle(); + hkine->GetYaxis()->SetTitle("E_{lab} (MeV)"); + hkine->GetYaxis()->CenterTitle(); + + NPL::Reaction* r1 = new NPL::Reaction("18O(p,p)18O@50"); + TGraph* g1; + g1=r1->GetKinematicLine3(); + g1->SetLineWidth(2); + g1->SetLineColor(2); + g1->Draw("lsame"); + + // Vertex-Ex // + c1->cd(3); + chain->Draw("Ex:XVertex>>hev(150,0,300,200,-5,5)","cut_p","colz"); + hev = (TH2F*) gDirectory->FindObjectAny("hev"); + hev->GetXaxis()->SetTitle("X_{vertex} (mm)"); + hev->GetXaxis()->CenterTitle(); + hev->GetYaxis()->SetTitle("E*_{18O} (MeV)"); + hev->GetYaxis()->CenterTitle(); + // Ex // + c1->cd(4); + chain->Draw("Ex>>he(200,-5,5)","cut_p"); + he = (TH1F*) gDirectory->FindObjectAny("he"); + he->GetXaxis()->SetTitle("E*_{18O} (MeV)"); + he->GetXaxis()->CenterTitle(); +} diff --git a/Examples/Example4/macro/ShowSiImpact.C b/Examples/Example4/macro/ShowSiImpact.C new file mode 100644 index 0000000000000000000000000000000000000000..14473abba0a6d2326088d80c5fa6132451c0df45 --- /dev/null +++ b/Examples/Example4/macro/ShowSiImpact.C @@ -0,0 +1,44 @@ +TChain* chain=NULL; + +TH2F* h[20]; + +TCutG* cut_p=NULL; + +/////////////////////////////////////////////// +void LoadCut() +{ + TFile* File_cutp = new TFile("cut/cut_p.root","READ"); + cut_p = (TCutG*) File_cutp->FindObjectAny("cut_p"); +} + +/////////////////////////////////////////////// +void LoadChain() +{ + chain = new TChain("PhysicsTree"); + chain->Add("../../Outputs/Analysis/Example4.root"); +} + +//////////////////////////////////////////////// +void ShowSiImpact() +{ + LoadCut(); + LoadChain(); + + for(int i=0; i<20; i++){ + TString token1 = Form("SiPosZ:SiPosY>>h%d(200,-200,200,200,0,300)",i); + TString token2 = Form("SiNumber==%d && cut_p",i); + chain->Draw(token1,token2); + h[i] = (TH2F*)gDirectory->FindObjectAny(Form("h%d",i)); + h[i]->SetMarkerStyle(7); + + h[i]->SetMarkerColor(kAzure+i); + if(i>9)h[i]->SetMarkerColor(kAzure+i-10); + } + + TCanvas* c1 = new TCanvas("c1","c1",600,600); + c1->cd(); + h[0]->Draw(); + for(int i=1; i<20; i++){ + h[i]->Draw("same"); + } +} diff --git a/Inputs/DetectorConfiguration/Example2.detector b/Inputs/DetectorConfiguration/Example2.detector index a2d9678fcda0b98993eac987b4b4121223a86d83..9ba36158b7fa46fde53053c9b299cccfe5ba0277 100644 --- a/Inputs/DetectorConfiguration/Example2.detector +++ b/Inputs/DetectorConfiguration/Example2.detector @@ -1,8 +1,3 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%0.2mg/cm2 Target THICKNESS= 4.5 micrometer RADIUS= 5 mm diff --git a/Inputs/DetectorConfiguration/Example4.detector b/Inputs/DetectorConfiguration/Example4.detector new file mode 100644 index 0000000000000000000000000000000000000000..839b603496abf2ce572f00fdbf107d081d51c74b --- /dev/null +++ b/Inputs/DetectorConfiguration/Example4.detector @@ -0,0 +1,12 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Actar + POS= 0 0 0 mm + Shape= Square + Si= 1 + VamosSi= 0 + CsI= 0 + BeamDump= 0 + GasMaterial= iC4H10 + GasFraction= 100 + Temperature= 295 kelvin + Pressure= 0.1 bar diff --git a/Inputs/EventGenerator/18Opp.reaction b/Inputs/EventGenerator/18Opp.reaction index a41d00e05393926914e3ecdb9713e2923856ec65..fa36088f02ca47936dec66e3a4e4e6057668e658 100644 --- a/Inputs/EventGenerator/18Opp.reaction +++ b/Inputs/EventGenerator/18Opp.reaction @@ -22,7 +22,9 @@ TwoBodyReaction Heavy= 18O ExcitationEnergyLight= 0.0 ExcitationEnergyHeavy= 0.0 - CrossSectionPath= flat_18O.txt CS + CrossSectionPath= flat.txt CS + HalfOpenAngleMin= 140 + HalfOpenAngleMax= 180 ShootLight= 1 ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/Example1.reaction b/Inputs/EventGenerator/Example1.reaction index 3647c8a4b6e08612747745506276d229e0768de5..2461a6e242fd81cbbffbee76be42f21a82f03038 100644 --- a/Inputs/EventGenerator/Example1.reaction +++ b/Inputs/EventGenerator/Example1.reaction @@ -18,6 +18,10 @@ Beam %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +DefineNucleus 10He + SubPart= 8He n n + BindingEnergy= 0 MeV +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction Beam= 11Li Target= 2H diff --git a/Inputs/EventGenerator/Example4.reaction b/Inputs/EventGenerator/Example4.reaction new file mode 100644 index 0000000000000000000000000000000000000000..4da764b74a3111e7f524ada0e19eccab74aba645 --- /dev/null +++ b/Inputs/EventGenerator/Example4.reaction @@ -0,0 +1,30 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%% Reaction file for 11Li(d,3He)10He reaction %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%Beam energy given in MeV ; Excitation in MeV +Beam + Particle= 18O + Energy= 59.4 MeV + SigmaEnergy= 0 MeV + SigmaThetaX= 0 deg + SigmaPhiY= 0 deg + SigmaX= 0 mm + SigmaY= 0 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +TwoBodyReaction + Beam= 18O + Target= 1H + Light= 1H + Heavy= 18O + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 0.0 MeV + CrossSectionPath= flat.txt CS + HalfOpenAngleMin= 100 deg + HalfOpenAngleMax= 180 deg + ShootLight= 1 + ShootHeavy= 1 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/NPLib/Core/CMakeLists.txt b/NPLib/Core/CMakeLists.txt index 4ae28e24d28e2716dca772843161ecb04c86cade..9bf6b2c319ca55a04be36e9627dd3d7038d946b5 100644 --- a/NPLib/Core/CMakeLists.txt +++ b/NPLib/Core/CMakeLists.txt @@ -2,6 +2,6 @@ add_custom_command(OUTPUT TAsciiFileDict.cxx COMMAND ../scripts/build_dict.sh T add_custom_command(OUTPUT NPDeltaSpectraDict.cxx COMMAND ../scripts/build_dict.sh NPDeltaSpectra.h NPDeltaSpectraDict.cxx NPDeltaSpectra.rootmap libNPCore.so NPDeltaSpectraLinkdef.h) add_custom_command(OUTPUT NPVDetectorDict.cxx COMMAND ../scripts/build_dict.sh NPVDetector.h NPVDetectorDict.cxx NPVDetector.rootmap libNPCore.so NPCoreLinkdef.h) -add_library(NPCore SHARED NPCore.cxx NPVAnalysis.cxx NPAnalysisFactory.cxx NPCalibrationManager.cxx NPOptionManager.cxx RootOutput.cxx RootInput.cxx TAsciiFile.cxx TAsciiFileDict.cxx NPDeltaSpectraDict.cxx NPDetectorManager.cxx NPVDetector.cxx NPVDetectorDict.cxx NPVSpectra.cxx NPDetectorFactory.cxx NPSpectraServer.cxx NPInputParser.cxx NPImage.cxx NPElog.cxx NPDeltaSpectra.cxx) +add_library(NPCore SHARED NPCore.cxx NPRandom.cxx NPVAnalysis.cxx NPAnalysisFactory.cxx NPCalibrationManager.cxx NPOptionManager.cxx RootOutput.cxx RootInput.cxx TAsciiFile.cxx TAsciiFileDict.cxx NPDeltaSpectraDict.cxx NPDetectorManager.cxx NPVDetector.cxx NPVDetectorDict.cxx NPVSpectra.cxx NPDetectorFactory.cxx NPSpectraServer.cxx NPInputParser.cxx NPImage.cxx NPElog.cxx NPDeltaSpectra.cxx) target_link_libraries(NPCore ${ROOT_LIBRARIES}) -install(FILES NPCore.h NPVAnalysis.h NPAnalysisFactory.h NPCalibrationManager.h NPOptionManager.h RootInput.h RootOutput.h TAsciiFile.h NPDetectorManager.h NPVDetector.h NPGlobalSystemOfUnits.h NPPhysicalConstants.h NPSystemOfUnits.h NPVSpectra.h NPDetectorFactory.h NPSpectraServer.h NPInputParser.h NPImage.h NPElog.h NPDeltaSpectra.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) +install(FILES NPCore.h NPVAnalysis.h NPAnalysisFactory.h NPRandom.h NPCalibrationManager.h NPOptionManager.h RootInput.h RootOutput.h TAsciiFile.h NPDetectorManager.h NPVDetector.h NPGlobalSystemOfUnits.h NPPhysicalConstants.h NPSystemOfUnits.h NPVSpectra.h NPDetectorFactory.h NPSpectraServer.h NPInputParser.h NPImage.h NPElog.h NPDeltaSpectra.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) diff --git a/NPLib/Core/NPRandom.cxx b/NPLib/Core/NPRandom.cxx new file mode 100644 index 0000000000000000000000000000000000000000..ae10fdad9733a1a26b272ac083e4b72aaeeadf9b --- /dev/null +++ b/NPLib/Core/NPRandom.cxx @@ -0,0 +1,32 @@ +/***************************************************************************** + * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Adrien Matta contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : 4 september 2017 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * A singleton Random generator to be used overrall nptool * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ +#include"NPRandom.h" + +NPL::Random* NPL::Random::m_Instance = 0; +NPL::Random* NPL::Random::getInstance(unsigned int seed){ + if(!m_Instance) + m_Instance = new NPL::Random(seed); + + return m_Instance; + + + } diff --git a/NPLib/Core/NPRandom.h b/NPLib/Core/NPRandom.h new file mode 100644 index 0000000000000000000000000000000000000000..a06234bcc77458391cd163e36c427dae419c6da7 --- /dev/null +++ b/NPLib/Core/NPRandom.h @@ -0,0 +1,68 @@ +#ifndef NPRANDOM +#define NPRANDOM +/***************************************************************************** + * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Adrien Matta contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : 4 september 2017 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * A singleton Random generator to be used overrall nptool * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +//STL +#include<iostream> + +// Root +#include"TRandom1.h" + + +namespace NPL{ + class Random{ + private: + Random(unsigned int seed=1){m_Random.SetSeed(seed);}; + ~Random(){std::cout << "NPL::Random current seed was :" << m_Random.GetSeed() << std::endl;}; + + public: + static Random* getInstance(unsigned int seed=1); + void SetSeed(unsigned int seed){m_Random.SetSeed(seed);}; + inline double Uniform() {return m_Random.Uniform() ;}; + inline double Uniform(const double& x1, const double& x2){return m_Random.Uniform(x1,x2) ;}; + + inline double Gaus(const double& mean,const double& sigma){return m_Random.Gaus(mean,sigma) ;}; + inline int Poisson(const int& mean){return m_Random.Poisson(mean) ;}; + inline double Poisson(const double& mean){return m_Random.Poisson(mean) ;}; + inline double BreitWigner(const double& mean, const double& gamma){return m_Random.BreitWigner(mean,gamma) ;}; + inline int Integer(const unsigned int& max){return m_Random.Integer(max) ;}; + + private: + static Random* m_Instance; + TRandom1 m_Random; + }; + + namespace Rand{ + Random* MainRand= NPL::Random::getInstance(); + double Uniform() {return MainRand->Uniform() ;}; + double Uniform(const double& x1, const double& x2){return MainRand->Uniform(x1,x2) ;}; + + double Gaus(const double& mean,const double& sigma){return MainRand->Gaus(mean,sigma) ;}; + int Poisson(const int& mean){return MainRand->Poisson(mean) ;}; + double Poisson(const double& mean){return MainRand->Poisson(mean) ;}; + double BreitWigner(const double& mean, const double& gamma){return MainRand->BreitWigner(mean,gamma) ;}; + int Integer(const unsigned int& max){return MainRand->Integer(max) ;}; + + } +} +#endif diff --git a/NPLib/Core/RootOutput.cxx b/NPLib/Core/RootOutput.cxx index 27d60c5d924318cf3f248a75b57c12bf42e886fb..e267880a2dbbaaa2e0155bb5129df7d23858116c 100644 --- a/NPLib/Core/RootOutput.cxx +++ b/NPLib/Core/RootOutput.cxx @@ -119,6 +119,7 @@ RootOutput::RootOutput(std::string fileNameBase, std::string treeNameBase){ } pRootTree = new TTree(treeNameBase.c_str(), "Data created / analysed with the NPTool package"); + pRootFile->SetCompressionLevel(1); pRootList = new TList(); // Init TAsciiFile objects diff --git a/NPLib/Detectors/Actar/MEventReduced.h b/NPLib/Detectors/Actar/MEventReduced.h index 0d642c10a882578fe81229f2720e3d336f73bca2..8c2502e09560213ca9e5addfbbc3dac56b8e2968 100644 --- a/NPLib/Detectors/Actar/MEventReduced.h +++ b/NPLib/Detectors/Actar/MEventReduced.h @@ -20,7 +20,7 @@ class ReducedData: public TObject std::vector<float> peakheight; std::vector<float> peaktime; - + void clear(){peakheight.clear();peaktime.clear();}//! ClassDef(ReducedData,1); }; diff --git a/NPLib/Detectors/Sharc/TSharcData.cxx b/NPLib/Detectors/Sharc/TSharcData.cxx index 42623ada4b84b0c92690889143d306bda556802c..e2fa7f3ac3ed8168e6b410dd795ea996c19ddcc4 100644 --- a/NPLib/Detectors/Sharc/TSharcData.cxx +++ b/NPLib/Detectors/Sharc/TSharcData.cxx @@ -44,17 +44,20 @@ void TSharcData::Clear(){ fSharc_StripFront_Energy.clear(); fSharc_StripFront_TimeCFD.clear(); fSharc_StripFront_TimeLED.clear(); + fSharc_StripFront_Time.clear(); fSharc_StripBack_DetectorNbr.clear(); fSharc_StripBack_StripNbr.clear(); fSharc_StripBack_Energy.clear(); fSharc_StripBack_TimeCFD.clear(); fSharc_StripBack_TimeLED.clear(); + fSharc_StripBack_Time.clear(); fSharc_PAD_DetectorNbr.clear(); fSharc_PAD_Energy.clear(); fSharc_PAD_TimeCFD.clear(); fSharc_PAD_TimeLED.clear(); + fSharc_PAD_Time.clear(); } diff --git a/NPLib/Detectors/TNT/TTNTPhysics.cxx b/NPLib/Detectors/TNT/TTNTPhysics.cxx index e3b6649569c02b3089281e9beb505e3332ff033b..9ca89cf6fa9edc7c8a8115925229a380ad9e1931 100644 --- a/NPLib/Detectors/TNT/TTNTPhysics.cxx +++ b/NPLib/Detectors/TNT/TTNTPhysics.cxx @@ -16,7 +16,7 @@ * * *---------------------------------------------------------------------------* * Comment: * - * * + * * * * *****************************************************************************/ @@ -60,12 +60,12 @@ TTNTPhysics::TTNTPhysics() void TTNTPhysics::AddDetector(TVector3 , string){ //cout << "check1" << endl; // In That simple case nothing is done - // Typically for more complex detector one would calculate the relevant + // Typically for more complex detector one would calculate the relevant // positions (stripped silicon) or angles (gamma array) m_NumberOfDetectors++; //cout << "m_NumberofDetectors is: " << m_NumberOfDetectors << endl; //cout <<"test1" << endl; -} +} /////////////////////////////////////////////////////////////////////////// void TTNTPhysics::AddDetector(double R, double Theta, double Phi, string shape){ @@ -74,8 +74,8 @@ void TTNTPhysics::AddDetector(double R, double Theta, double Phi, string shape){ TVector3 Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); // Call the cartesian method AddDetector(Pos,shape); -} - +} + /////////////////////////////////////////////////////////////////////////// void TTNTPhysics::BuildSimplePhysicalEvent() { BuildPhysicalEvent(); @@ -110,15 +110,15 @@ void TTNTPhysics::BuildPhysicalEvent() { << " in position map!\n"; exit(1); } - assert(info->second.size() == 3); // error check that the position vector is correct size + //assert(info->second.size() == 3); // error check that the position vector is correct size double xpos = info->second[0]; double ypos = info->second[1]; double zpos = info->second[2]; - + Xpos.push_back(info->second[0]); Ypos.push_back(info->second[1]); Zpos.push_back(info->second[2]); - + Theta.push_back(atan(info->second[0]/info->second[2])*180/PI); Phi.push_back(atan(info->second[1]/info->second[2])*180/PI); Theta_Lab.push_back(atan((pow(pow(info->second[0],2)+pow(info->second[1],2),0.5))/info->second[2])*180/PI); @@ -149,7 +149,7 @@ void TTNTPhysics::PreTreat() { } } - // Time + // Time mysize = m_EventData->GetMultTime(); for (ULong_t i = 0; i < mysize; ++i) { Double_t Time= m_EventData->Get_Time(i); //Cal->ApplyCalibration("TNT/TIME"+NPL::itoa(m_EventData->GetT_DetectorNbr(i)),m_EventData->Get_Time(i)); @@ -194,7 +194,7 @@ void TTNTPhysics::ReadAnalysisConfig() { cout << "check5" << endl; string name = "ConfigTNT"; cout << "Test5" << endl; - if (LineBuffer.compare(0, name.length(), name) == 0) + if (LineBuffer.compare(0, name.length(), name) == 0) ReadingStatus = true; // loop on tokens and data @@ -247,7 +247,7 @@ void TTNTPhysics::Clear() { void TTNTPhysics::ReadConfiguration(NPL::InputParser parser) { vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("TNT"); if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << "//// " << blocks.size() << " detectors found " << endl; + cout << "//// " << blocks.size() << " detectors found " << endl; cout << "check6" << endl; vector<string> cart = {"POS","VOXNUM","VOXSIZE","Shape"}; vector<string> sphe = {"R","Theta","Phi","Shape"}; @@ -256,7 +256,7 @@ void TTNTPhysics::ReadConfiguration(NPL::InputParser parser) { if(blocks[i]->HasTokenList(cart)){ if(NPOptionManager::getInstance()->GetVerboseLevel()) cout << endl << "//// TNT " << i+1 << endl; - + TVector3 Pos = blocks[i]->GetTVector3("POS","mm"); vector<int> vnumber = blocks[i]->GetVectorInt("VOXNUM"); if((vnumber.size() != 3) || (vnumber[0]+vnumber[1]+vnumber[2] < 3)) { @@ -275,7 +275,7 @@ void TTNTPhysics::ReadConfiguration(NPL::InputParser parser) { double Widthx = VoxWidth[0]; // x-width of individual cell double Widthy = VoxWidth[1]; // y-width double Widthz = VoxWidth[2]; // z-width - + int VoxNumx = VoxNum[0]; // number of voxels placed in x-dim int VoxNumy = VoxNum[1]; // y-dim int VoxNumz = VoxNum[2]; // z-dim @@ -289,7 +289,7 @@ void TTNTPhysics::ReadConfiguration(NPL::InputParser parser) { int dummyy = Pos[1]; int dummyz = Pos[2]; int detnumber = 0; - + // Add WLS spacing if(WLSToggle == false) { wlsSize = 0; @@ -378,7 +378,7 @@ void TTNTPhysics::ClearSpectra() { map< string , TH1*> TTNTPhysics::GetSpectra() { if(m_Spectra) return m_Spectra->GetMapHisto(); - else{ + else{ cout << "check9" << endl; map< string , TH1*> empty; cout << "test9" << endl; @@ -453,4 +453,3 @@ class proxy_TNT{ proxy_TNT p_TNT; } - diff --git a/NPLib/Physics/NPNucleus.cxx b/NPLib/Physics/NPNucleus.cxx index 52b092588e45a21050eb0aeef1babd430a495360..18d04b3c463e09a6e24aabb664e668c82bed1631 100644 --- a/NPLib/Physics/NPNucleus.cxx +++ b/NPLib/Physics/NPNucleus.cxx @@ -23,6 +23,7 @@ // NPTOOL headers #include "NPNucleus.h" +#include "NPCore.h" using namespace NPL; @@ -57,6 +58,31 @@ Nucleus::Nucleus(string isotope){ SetUp(isotope); } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +Nucleus::Nucleus(string name, vector<string> subpart, double binding,double Ex, string SpinParity, double Spin, string Parity, double LifeTime){ + fName= name; + fCharge= 0; + fAtomicWeight= 0; + unsigned int size = subpart.size(); + double Mass = 0; + for(unsigned int i = 0 ; i < size ; i++){ + Nucleus N = Nucleus(subpart[i]); + Mass+= N.Mass(); + fAtomicWeight+= N.GetA(); + fCharge+= N.GetZ(); + } + + Mass-=binding; + SetMassExcess( 1000*(Mass-fAtomicWeight*amu_c2 + fCharge*electron_mass_c2)); + + fExcitationEnergy=Ex; + fSpinParity= SpinParity; + fSpin= Spin; + fParity= Parity; + fLifeTime = LifeTime; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Nucleus::SetUp(string isotope){ //----------- Constructor Using nubtab12.asc by name---------- // open the file to read and check if it is open @@ -377,6 +403,97 @@ double Nucleus::GetThetaCM(double EnergyLab, double ThetaLab, double PhiLab, dou return ThetaCM; } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void Nucleus::DefineMassByThreshold(const vector<string>& v){ + // Define the mass as the sum of the mass of the particle named in v + unsigned int size = v.size(); + vector<NPL::Nucleus> N; + for(unsigned int i = 0 ; i < size ; i++) + N.push_back(NPL::Nucleus(v[i])); + + DefineMassByThreshold(N); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void Nucleus::DefineMassByThreshold(const vector<NPL::Nucleus>& N){ + // Define the mass as the sum of the mass of the particle defined in N + unsigned int size = N.size(); + double Mass = 0; + unsigned int A = 0; + unsigned int Z = 0; + for(unsigned int i = 0 ; i < size ; i++){ + Mass+= N[i].Mass(); + A+= N[i].GetA(); + Z+= N[i].GetZ(); + } + // Check the threshold make any sense (same A, same Z): + if(A!=GetA()|| Z!=GetZ()){ + NPL::SendWarning("NPL::Nucleus","Mass and charge is not conserved in DefineMassByThreshold! Doing no change to nucleus"); + return; + } + + SetExcitationEnergy(0); + SetMassExcess( 1000*(Mass-fAtomicWeight*amu_c2 + fCharge*electron_mass_c2)); +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetSXn(unsigned int X) const { + Nucleus N(GetZ(),GetA()-X); + return N.Mass()+X*neutron_mass_c2-Mass(); + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetSXp(unsigned int X) const { + Nucleus N(GetZ()-X,GetA()-X); + return N.Mass()+X*proton_mass_c2-Mass(); + } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetSn() const { + return GetSXn(1); + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetSp() const { + return GetSXp(1); + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetS2n() const { + return GetSXn(2); + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetS2p() const { + return GetSXp(2); + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetSt() const { + Nucleus N(GetZ()-1,GetA()-3); + Nucleus A(1,3); + return N.Mass()+A.Mass()-Mass(); + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetS3He() const { + Nucleus N(GetZ()-2,GetA()-3); + Nucleus A(2,3); + return N.Mass()+A.Mass()-Mass(); + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double Nucleus::GetSa() const { + Nucleus N(GetZ()-2,GetA()-4); + Nucleus A(2,4); + return N.Mass()+A.Mass()-Mass(); + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void Nucleus::PrintThreshold() const { + cout << GetName() << " thresholds : " << endl; + cout << " Sn : " << GetSn() << " MeV" << endl; + cout << " Sp : " << GetSp() << " MeV" << endl; + cout << " S2n : " << GetS2n() << " MeV" << endl; + cout << " S2p : " << GetS2p() << " MeV" << endl; + cout << " St : " << GetSt() << " MeV" << endl; + cout << " S3He : " << GetS3He() << " MeV" << endl; + cout << " Sa : " << GetSa() << " MeV" << endl; + } + diff --git a/NPLib/Physics/NPNucleus.h b/NPLib/Physics/NPNucleus.h index 58373c56b48923109d4f57a26e8acbe14c2f0bc6..cbb431fe49e7756c284cfb283e1484a6b32b9b6e 100644 --- a/NPLib/Physics/NPNucleus.h +++ b/NPLib/Physics/NPNucleus.h @@ -49,6 +49,7 @@ namespace NPL { Nucleus(); Nucleus(string isotope); Nucleus(int Z, int A); + Nucleus(string name, vector<string> subpart, double binding,double Ex=0, string SpinParity="", double Spin=0, string Parity="", double LifeTime=-1); ~Nucleus(); public: @@ -137,6 +138,23 @@ namespace NPL { double Mass() const {return (fAtomicWeight*amu_c2 + fMassExcess/1000. - fCharge*electron_mass_c2+fExcitationEnergy);} double GetBindingEnergy() const {return (fCharge*proton_mass_c2 + (fAtomicWeight-fCharge)*neutron_mass_c2 + fCharge*electron_mass_c2 - fAtomicWeight*amu_c2 - fMassExcess/1000);} void Print() const ; + + public: + void DefineMassByThreshold(const vector<string>& v); // Define the mass as the sum of the mass of the particle named in v + void DefineMassByThreshold(const vector<NPL::Nucleus>& N); // Define the mass as the sum of the mass of the particle defined in N + + public: + double GetSn() const; + double GetSp() const; + double GetS2n() const; + double GetS2p() const; + double GetSt() const; + double GetS3He() const; + double GetSa() const; + double GetSXn(unsigned int X) const; + double GetSXp(unsigned int X) const; + void PrintThreshold() const; + }; } #endif diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx index 08c7786698bc3ab31e12953803f84ef9f21a4555..8af58373bc4f0f5a5383e98cd8274637f9e1072a 100644 --- a/NPLib/Physics/NPReaction.cxx +++ b/NPLib/Physics/NPReaction.cxx @@ -43,6 +43,7 @@ #include <vector> #include "NPReaction.h" +#include "NPCore.h" #include "NPOptionManager.h" #include "NPFunction.h" @@ -85,7 +86,9 @@ ClassImp(Reaction) fshoot3=true; fshoot4=true; + fUseExInGeant4=true; RandGen=new TRandom3(); + fUseExInGeant4=true; fLabCrossSection=false; // flag if the provided cross-section is in the lab or not @@ -151,7 +154,7 @@ Reaction::Reaction(string reaction){ fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180); fDoubleDifferentialCrossSectionHist = NULL ; - + fshoot3=true; fshoot4=true; RandGen=new TRandom3(); @@ -218,9 +221,9 @@ double Reaction::ShootRandomThetaCM(){ SetThetaCM( theta ); } else{ - // When root perform a Spline interpolation to shoot random number out of + // When root perform a Spline interpolation to shoot random number out of // the distribution, it can over shoot and output a number larger that 180 - // this lead to an additional signal at 0-4 deg Lab, especially when using a + // this lead to an additional signal at 0-4 deg Lab, especially when using a // flat distribution. // This fix it. theta=181; @@ -228,9 +231,9 @@ double Reaction::ShootRandomThetaCM(){ theta=fCrossSectionHist->GetRandom(); SetThetaCM( theta*deg ); - } - - + } + + return theta; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -251,7 +254,7 @@ void Reaction::KineRelativistic(double& ThetaLab3, double& KineticEnergyLab3, if (m1 > m2) theta = M_PI - fThetaCM; fEnergyImpulsionCM_3 = TLorentzVector(pCM_3*sin(theta),0,pCM_3*cos(theta),ECM_3); fEnergyImpulsionCM_4 = fTotalEnergyImpulsionCM - fEnergyImpulsionCM_3; - + fEnergyImpulsionLab_3 = fEnergyImpulsionCM_3; fEnergyImpulsionLab_3.Boost(0,0,BetaCM); fEnergyImpulsionLab_4 = fEnergyImpulsionCM_4; @@ -269,7 +272,7 @@ void Reaction::KineRelativistic(double& ThetaLab3, double& KineticEnergyLab3, // Kinetic Energy in the lab frame KineticEnergyLab3 = fEnergyImpulsionLab_3.E() - m3; KineticEnergyLab4 = fEnergyImpulsionLab_4.E() - m4; - + // test for total energy conversion //if (fabs(fTotalEnergyImpulsionLab.E() - (fEnergyImpulsionLab_3.E()+fEnergyImpulsionLab_4.E())) > 1e-6) // cout << "Problem for energy conservation" << endl; @@ -308,15 +311,15 @@ double Reaction::EnergyLabToThetaCM(double EnergyLab, double ThetaLab){ //Return EnergyLab double Reaction::EnergyLabFromThetaLab(double ThetaLab){ //ThetaLab in rad - + // NB - // Tis member function is in progress + // Tis member function is in progress // Classic treatment need to be changed to relativistic!! // //Treat Exeptions if(fBeamEnergy==0) return m4*fQValue/(m3+m4); - + //Solve the equation double m4e = m4 + fExcitation4; //Possible problem with this calculation, decide on m4e or m4 in the following formula @@ -327,26 +330,26 @@ double Reaction::EnergyLabFromThetaLab(double ThetaLab){ // //Solution: sqrt(T3) = r * (cos +/- sqrt(Delta)) ; //where Delta =cos*cos - s/(r*r) - + //Select solutions according to delta values double Delta = cos(ThetaLab)*cos(ThetaLab)-s/(r*r); double EnergyLab=0; if(Delta<0) return 0; - else + else if(Delta==0) EnergyLab =r*cos(ThetaLab); + else { + double sol1 = r*(cos(ThetaLab) + sqrt(Delta)); + double sol2 = r*(cos(ThetaLab) - sqrt(Delta)); + + if(sol1<0 && sol2<0) return 0; + else if(sol1>0 && sol2<0) EnergyLab =sol1*sol1; + else if(sol1<0 && sol2>0) EnergyLab = sol2*sol2; else { - double sol1 = r*(cos(ThetaLab) + sqrt(Delta)); - double sol2 = r*(cos(ThetaLab) - sqrt(Delta)); - - if(sol1<0 && sol2<0) return 0; - else if(sol1>0 && sol2<0) EnergyLab =sol1*sol1; - else if(sol1<0 && sol2>0) EnergyLab = sol2*sol2; - else { if(RandGen->Rndm()<0.5) EnergyLab = sol1*sol1; // choose either of the solutions - else EnergyLab = sol2*sol2; - } + else EnergyLab = sol2*sol2; } + } return(EnergyLab); } @@ -367,7 +370,7 @@ void Reaction::Print() const{ cout << "Qgg = " << fQValue << " MeV" << endl; } -////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////// void Reaction::ReadConfigurationFile(string Path){ ifstream ReactionFile; string GlobalPath = getenv("NPTOOL"); @@ -383,6 +386,39 @@ void Reaction::ReadConfigurationFile(string Path){ NPL::InputParser parser(Path); ReadConfigurationFile(parser); } +//////////////////////////////////////////////////////////////////////////////// +Nucleus Reaction::GetNucleus(string name, NPL::InputParser parser){ + + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithTokenAndValue("DefineNucleus",name); + unsigned int size = blocks.size(); + if(size==0) + return NPL::Nucleus(name); + else if(size==1){ + cout << " -- User defined nucleus " << name << " -- " << endl; + vector<string> token = {"SubPart","BindingEnergy"}; + if(blocks[0]->HasTokenList(token)){ + NPL::Nucleus N(name,blocks[0]->GetVectorString("SubPart"),blocks[0]->GetDouble("BindingEnergy","MeV")); + if(blocks[0]->HasToken("ExcitationEnergy")) + N.SetExcitationEnergy(blocks[0]->GetDouble("ExcitationEnergy","MeV")); + if(blocks[0]->HasToken("SpinParity")) + N.SetSpinParity(blocks[0]->GetString("SpinParity").c_str()); + if(blocks[0]->HasToken("Spin")) + N.SetSpin(blocks[0]->GetDouble("Spin","")); + if(blocks[0]->HasToken("Parity")) + N.SetParity(blocks[0]->GetString("Parity").c_str()); + if(blocks[0]->HasToken("LifeTime")) + N.SetLifeTime(blocks[0]->GetDouble("LifeTime","s")); + + cout << " -- -- -- -- -- -- -- -- -- -- --" << endl; + return N; + } + } + else{ + NPL::SendErrorAndExit("NPL::Reaction","Too many nuclei define with the same name"); + } +} + ////////////////////////////////////////////////////////////////////////////////////////////////////////// void Reaction::ReadConfigurationFile(NPL::InputParser parser){ @@ -402,19 +438,18 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser){ NPOptionManager::getInstance()->SetVerboseLevel(v); fBeamEnergy= fNuclei1.GetEnergy(); - - fNuclei2 = Nucleus(blocks[i]->GetString("Target")); - fNuclei3 = Nucleus(blocks[i]->GetString("Light")); - fNuclei4 = Nucleus(blocks[i]->GetString("Heavy")); + fNuclei2 = GetNucleus(blocks[i]->GetString("Target"),parser); + fNuclei3 = GetNucleus(blocks[i]->GetString("Light"),parser); + fNuclei4 = GetNucleus(blocks[i]->GetString("Heavy"),parser); } else if(blocks[i]->HasTokenList(token2)){ fNuclei1.SetVerboseLevel(0); fNuclei1.ReadConfigurationFile(parser); fBeamEnergy= fNuclei1.GetEnergy(); - fNuclei2 = Nucleus(blocks[i]->GetString("Target")); - fNuclei3 = Nucleus(blocks[i]->GetString("Nuclei3")); - fNuclei4 = Nucleus(blocks[i]->GetString("Nuclei4")); + fNuclei2 = GetNucleus(blocks[i]->GetString("Target"),parser); + fNuclei3 = GetNucleus(blocks[i]->GetString("Nuclei3"),parser); + fNuclei4 = GetNucleus(blocks[i]->GetString("Nuclei4"),parser); } else{ cout << "ERROR: check your input file formatting \033[0m" << endl; @@ -425,7 +460,7 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser){ fExcitation1 = blocks[i]->GetDouble("ExcitationEnergyBeam","MeV"); } else if(blocks[i]->HasToken("ExcitationEnergy1")){ - fExcitation1 = blocks[i]->GetDouble("ExcitationEnergy1","MeV"); + fExcitation1 = blocks[i]->GetDouble("ExcitationEnergy1","MeV"); } if(blocks[i]->HasToken("ExcitationEnergyLight")) @@ -467,7 +502,7 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser){ SetCrossSectionHist(CStemp); delete fsin; } - + if(blocks[i]->HasToken("DoubleDifferentialCrossSectionPath")){ vector<string> file = blocks[i]->GetVectorString("DoubleDifferentialCrossSectionPath"); @@ -502,8 +537,16 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser){ if(blocks[i]->HasToken("ShootLight")){ fshoot3 = blocks[i]->GetInt("ShootLight"); } + if(blocks[i]->HasToken("UseExInGeant4")){ + // This option will not change the Ex of the produced ion in G4 Tracking + // This is to be set to true when using a Ex distribution without decay + // Otherwise the Ion Table size grew four ech event slowing down the + // simulation + fUseExInGeant4 = blocks[i]->GetInt("UseExInGeant4"); + } + } - SetCSAngle(CSHalfOpenAngleMin,CSHalfOpenAngleMax); + SetCSAngle(CSHalfOpenAngleMin/deg,CSHalfOpenAngleMax/deg); initializePrecomputeVariable(); cout << "\033[0m" ; } @@ -517,7 +560,7 @@ void Reaction::initializePrecomputeVariable(){ if(fExcitation1>=0) fNuclei1.SetExcitationEnergy(fExcitation1); // Write over the beam excitation energy //fNuclei1.GetExcitationEnergy() is a copy of fExcitation1 - m1 = fNuclei1.Mass() + fNuclei1.GetExcitationEnergy();// in case of isomeric state, + m1 = fNuclei1.Mass() + fNuclei1.GetExcitationEnergy();// in case of isomeric state, m2 = fNuclei2.Mass(); m3 = fNuclei3.Mass() + fExcitation3; m4 = fNuclei4.Mass() + fExcitation4; @@ -540,8 +583,8 @@ void Reaction::initializePrecomputeVariable(){ fImpulsionLab_1 = TVector3(0,0,sqrt(fBeamEnergy*fBeamEnergy + 2*fBeamEnergy*m1)); fImpulsionLab_2 = TVector3(0,0,0); - fEnergyImpulsionLab_1 = TLorentzVector(fImpulsionLab_1,m1+fBeamEnergy); - fEnergyImpulsionLab_2 = TLorentzVector(fImpulsionLab_2,m2); + fEnergyImpulsionLab_1= TLorentzVector(fImpulsionLab_1,m1+fBeamEnergy); + fEnergyImpulsionLab_2= TLorentzVector(fImpulsionLab_2,m2); fTotalEnergyImpulsionLab = fEnergyImpulsionLab_1 + fEnergyImpulsionLab_2; @@ -725,9 +768,11 @@ void Reaction::PrintKinematic(){ //////////////////////////////////////////////////////////////////////////////////////////// void Reaction::SetCSAngle(double CSHalfOpenAngleMin,double CSHalfOpenAngleMax){ if(fCrossSectionHist){ - for (int i = 0 ; i< fCrossSectionHist->GetNbinsX(); i++) - if( fCrossSectionHist->GetBinCenter(i) > CSHalfOpenAngleMax && fCrossSectionHist->GetBinCenter(i) < CSHalfOpenAngleMin) + for (int i = 0 ; i< fCrossSectionHist->GetNbinsX(); i++){ + if( fCrossSectionHist->GetBinCenter(i) > CSHalfOpenAngleMax || fCrossSectionHist->GetBinCenter(i) < CSHalfOpenAngleMin){ fCrossSectionHist->SetBinContent(i,0); + } + } } } @@ -740,6 +785,5 @@ bool Reaction::IsAllowed(double Energy){ if(AvailableEnergy>RequiredEnergy) return true; else - return false; - } - + return false; +} diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h index 91663ecce5e2f684eadd7099adc2eb557bf9e5ab..2aec4234d0ed16f1ae9b40355e268f0e4f97e358 100644 --- a/NPLib/Physics/NPReaction.h +++ b/NPLib/Physics/NPReaction.h @@ -60,6 +60,7 @@ namespace NPL{ virtual ~Reaction(); public: // Various Method + Nucleus GetNucleus(string name, NPL::InputParser parser); void ReadConfigurationFile(string Path); void ReadConfigurationFile(NPL::InputParser); @@ -72,6 +73,7 @@ namespace NPL{ private: // use for Monte Carlo simulation bool fshoot3; bool fshoot4; + bool fUseExInGeant4; bool fLabCrossSection; private: // use to display the kinematical line @@ -97,17 +99,17 @@ namespace NPL{ TH1F* fExcitationEnergyHist; // Distribution of Excitation energy public: // Getters and Setters - void SetBeamEnergy(double eBeam) {fBeamEnergy = eBeam; initializePrecomputeVariable();} - void SetEcm(double Ecm) {fEcm= Ecm; s=pow(Ecm+m1+m2,2); fBeamEnergy=(s-m1*m1-m2*m2)/(2*m2)-m1; initializePrecomputeVariable();} - void SetThetaCM(double angle) {fThetaCM = angle; initializePrecomputeVariable();} - void SetExcitation1(double exci) {fExcitation1 = exci; initializePrecomputeVariable();} - void SetExcitation3(double exci) {fExcitation3 = exci; initializePrecomputeVariable();} - void SetExcitation4(double exci) {fExcitation4 = exci; initializePrecomputeVariable();} + void SetBeamEnergy(const double& eBeam) {fBeamEnergy = eBeam; initializePrecomputeVariable();} + void SetEcm(const double& Ecm) {fEcm= Ecm; s=pow(Ecm+m1+m2,2); fBeamEnergy=(s-m1*m1-m2*m2)/(2*m2)-m1; initializePrecomputeVariable();} + void SetThetaCM(const double& angle) {fThetaCM = angle; initializePrecomputeVariable();} + void SetExcitation1(const double& exci) {fExcitation1 = exci; initializePrecomputeVariable();} + void SetExcitation3(const double& exci) {fExcitation3 = exci; initializePrecomputeVariable();} + void SetExcitation4(const double& exci) {fExcitation4 = exci; initializePrecomputeVariable();} // For retro compatibility - void SetExcitationBeam(double exci) {fExcitation1 = exci; initializePrecomputeVariable();} - void SetExcitationLight(double exci) {fExcitation3 = exci; initializePrecomputeVariable();} - void SetExcitationHeavy(double exci) {fExcitation4 = exci; initializePrecomputeVariable();} - void SetVerboseLevel(int verbose) {fVerboseLevel = verbose;} + void SetExcitationBeam(const double& exci) {fExcitation1 = exci; initializePrecomputeVariable();} + void SetExcitationLight(const double& exci) {fExcitation3 = exci; initializePrecomputeVariable();} + void SetExcitationHeavy(const double& exci) {fExcitation4 = exci; initializePrecomputeVariable();} + void SetVerboseLevel(const int& verbose) {fVerboseLevel = verbose;} void SetCrossSectionHist (TH1F* CrossSectionHist) {delete fCrossSectionHist; fCrossSectionHist = CrossSectionHist;} @@ -120,14 +122,15 @@ namespace NPL{ double GetExcitation4() const {return fExcitation4;} double GetQValue() const {return fQValue;} double GetEcm() const {return fEcm;} - Nucleus GetNucleus1() const {return fNuclei1;} - Nucleus GetNucleus2() const {return fNuclei2;} - Nucleus GetNucleus3() const {return fNuclei3;} - Nucleus GetNucleus4() const {return fNuclei4;} + Nucleus* GetNucleus1() {return &fNuclei1;} + Nucleus* GetNucleus2() {return &fNuclei2;} + Nucleus* GetNucleus3() {return &fNuclei3;} + Nucleus* GetNucleus4() {return &fNuclei4;} TH1F* GetCrossSectionHist() const {return fCrossSectionHist;} int GetVerboseLevel() const {return fVerboseLevel;} bool GetShoot3() const {return fshoot3;} bool GetShoot4() const {return fshoot4;} + bool GetUseExInGeant4() const {return fUseExInGeant4;} public: diff --git a/NPLib/Physics/TInitialConditions.cxx b/NPLib/Physics/TInitialConditions.cxx index 04f7f95e822c2212845e1dfb2f3ee1d50df0ae94..4618cca002f5f61161bb7f8feb730c7960ca0a97 100644 --- a/NPLib/Physics/TInitialConditions.cxx +++ b/NPLib/Physics/TInitialConditions.cxx @@ -38,7 +38,7 @@ TInitialConditions::~TInitialConditions(){ //////////////////////////////////////////////////////////////////////////////// void TInitialConditions::Clear(){ // Incident beam parameter - fIC_Incident_Particle_Name.clear(); + fIC_Incident_Particle_Name=""; fIC_Incident_Emittance_ThetaX = -1; fIC_Incident_Emittance_PhiY = -1; fIC_Incident_Emittance_Theta = -1; diff --git a/NPLib/Physics/TInitialConditions.h b/NPLib/Physics/TInitialConditions.h index 3decbf96fa99efe8dc46f23b350310f4df8683fa..010a7920d813fd7919a30548b2abe901a6220df6 100644 --- a/NPLib/Physics/TInitialConditions.h +++ b/NPLib/Physics/TInitialConditions.h @@ -72,7 +72,7 @@ public: virtual ~TInitialConditions(); void Clear(); - void Clear(const Option_t*) {}; + void Clear(const Option_t*) {Clear();}; void Dump() const; ///////////////////// GetTERS //////////////////////// diff --git a/NPLib/Physics/TInteractionCoordinates.cxx b/NPLib/Physics/TInteractionCoordinates.cxx index e4e3b0e69704752dd258eed8f00660858042eab1..f9fafcc1c6b12686bd9dadad00bbfa27b97ab601 100644 --- a/NPLib/Physics/TInteractionCoordinates.cxx +++ b/NPLib/Physics/TInteractionCoordinates.cxx @@ -28,39 +28,43 @@ using namespace std; ClassImp(TInteractionCoordinates) -TInteractionCoordinates::TInteractionCoordinates() -{ - // Default constructor - - Clear(); -} + TInteractionCoordinates::TInteractionCoordinates(){ + } TInteractionCoordinates::~TInteractionCoordinates() {} -void TInteractionCoordinates::Clear() -{ - // Incident particle properties (before interactions in the target) - // Vertex of interaction - fDetected_Position_X.clear(); - fDetected_Position_Y.clear(); - fDetected_Position_Z.clear(); - // Incident particle angles - fDetected_Angle_Theta.clear(); - fDetected_Angle_Phi.clear(); +void TInteractionCoordinates::Clear(){ + // Incident particle properties (before interactions in the target) + // Energy and Time + fDetected_Energy.clear(); + fDetected_Time.clear(); + // Vertex of interaction + fDetected_Position_X.clear(); + fDetected_Position_Y.clear(); + fDetected_Position_Z.clear(); + // Incident particle angles + fDetected_Angle_Theta.clear(); + fDetected_Angle_Phi.clear(); } -void TInteractionCoordinates::Dump() const -{ - cout << "XXXXXXXXXXXXX Interaction coordinates XXXXXXXXXXXXXXXX" << endl; +void TInteractionCoordinates::Dump() const{ + cout << "XXXXXXXXXXXXX Interaction coordinates XXXXXXXXXXXXXXXX" << endl; - cout << "Interaction position : " << endl; - cout << "\tX : " << fDetected_Position_X[0] << endl; - cout << "\tY : " << fDetected_Position_Y[0] << endl; - cout << "\tZ : " << fDetected_Position_Z[0] << endl; - cout << "Incident particle angles : " << endl; - cout << "\tTheta : " << fDetected_Angle_Theta[0] << endl; - cout << "\tPhi : " << fDetected_Angle_Phi[0] << endl; + unsigned int size = fDetected_Energy.size(); + for(unsigned int i = 0 ; i < size ; i++){ + cout << " Interaction " << i << " of " << size << endl; + cout << "Energy And Time : " << endl; + cout << "Energy : " << fDetected_Energy[0] << endl; + cout << "Time : " << fDetected_Time[0] << endl; + cout << "Interaction position : " << endl; + cout << "\tX : " << fDetected_Position_X[0] << endl; + cout << "\tY : " << fDetected_Position_Y[0] << endl; + cout << "\tZ : " << fDetected_Position_Z[0] << endl; + cout << "Incident particle angles : " << endl; + cout << "\tTheta : " << fDetected_Angle_Theta[0] << endl; + cout << "\tPhi : " << fDetected_Angle_Phi[0] << endl; + } } diff --git a/NPLib/Physics/TInteractionCoordinates.h b/NPLib/Physics/TInteractionCoordinates.h index c9627a5c8111849262934fda7b83c55e138f1f3a..1ce1052ccc2a33fd99e676c858bbb9320ce067e1 100644 --- a/NPLib/Physics/TInteractionCoordinates.h +++ b/NPLib/Physics/TInteractionCoordinates.h @@ -27,57 +27,69 @@ #include <vector> #include "TObject.h" - +#include <iostream> using namespace std ; -class TInteractionCoordinates : public TObject -{ -private: - // Detected particle properties (before interactions in the target) - // Vertex of interaction - vector<Double_t> fDetected_Position_X; - vector<Double_t> fDetected_Position_Y; - vector<Double_t> fDetected_Position_Z; - // Particle angles - vector<Double_t> fDetected_Angle_Theta; - vector<Double_t> fDetected_Angle_Phi; +class TInteractionCoordinates : public TObject{ + private: + // Detected particle properties (before interactions in the target) + // Energy and Time + vector<double> fDetected_Energy; + vector<double> fDetected_Time; + // Vertex of interaction + vector<double> fDetected_Position_X; + vector<double> fDetected_Position_Y; + vector<double> fDetected_Position_Z; + // Particle angles + vector<double> fDetected_Angle_Theta; + vector<double> fDetected_Angle_Phi; + + public: + TInteractionCoordinates(); + virtual ~TInteractionCoordinates(); + + void Clear(); + void Clear(const Option_t*) {}; + void Dump() const; + + void SetInteraction(const double& Energy, const double&Time, const double& PositionX, const double& PositionY, const double& PositionZ,const double& Theta, const double& Phi){ + fDetected_Energy.push_back(Energy); + fDetected_Time.push_back(Time); + fDetected_Position_X.push_back(PositionX); + fDetected_Position_Y.push_back(PositionY); + fDetected_Position_Z.push_back(PositionZ); + fDetected_Angle_Theta.push_back(Theta); + fDetected_Angle_Phi.push_back(Phi); + } -public: - TInteractionCoordinates(); - virtual ~TInteractionCoordinates(); -/* - void Clear(); - void Dump(); -*/ - void Clear(); - void Clear(const Option_t*) {}; - void Dump() const; + ///////////////////// SETTERS //////////////////////// + // Incident particle properties (before interactions in the target) + // Vertex of interaction + void SetDetectedPositionX(const double& PositionX) {fDetected_Position_X.push_back(PositionX);}//! + void SetDetectedPositionY(const double& PositionY) {fDetected_Position_Y.push_back(PositionY);}//! + void SetDetectedPositionZ(const double& PositionZ) {fDetected_Position_Z.push_back(PositionZ);}//! + // Incident particle angles + void SetDetectedAngleTheta(const double& AngleTheta) {fDetected_Angle_Theta.push_back(AngleTheta);}//! + void SetDetectedAnglePhi(const double& AnglePhi) {fDetected_Angle_Phi.push_back(AnglePhi);}//! - ///////////////////// SETTERS //////////////////////// - // Incident particle properties (before interactions in the target) - // Vertex of interaction - void SetDetectedPositionX(Double_t PositionX) {fDetected_Position_X.push_back(PositionX);} - void SetDetectedPositionY(Double_t PositionY) {fDetected_Position_Y.push_back(PositionY);} - void SetDetectedPositionZ(Double_t PositionZ) {fDetected_Position_Z.push_back(PositionZ);} - // Incident particle angles - void SetDetectedAngleTheta(Double_t AngleTheta) {fDetected_Angle_Theta.push_back(AngleTheta);} - void SetDetectedAnglePhi(Double_t AnglePhi) {fDetected_Angle_Phi.push_back(AnglePhi);} + ///////////////////// GETTERS //////////////////////// + // Number of interactions (multiplicity) + int GetDetectedMultiplicity() const {return fDetected_Position_X.size();} + // Incident particle properties (before interactions in the target) + // Enery and Time + double GetEnergy(const int& i) const {return fDetected_Energy[i];}//! + double GetTime(const int& i) const {return fDetected_Time[i];}//! + // Vertex of interaction + double GetDetectedPositionX(const int& i) const {return fDetected_Position_X[i];}//! + double GetDetectedPositionY(const int& i) const {return fDetected_Position_Y[i];}//! + double GetDetectedPositionZ(const int& i) const {return fDetected_Position_Z[i];}//! + // Incident particle angles + double GetDetectedAngleTheta(const int& i) const {return fDetected_Angle_Theta[i];}//! + double GetDetectedAnglePhi(const int& i) const {return fDetected_Angle_Phi[i];}//! - ///////////////////// GETTERS //////////////////////// - // Number of interactions (multiplicity) - Int_t GetDetectedMultiplicity() {return fDetected_Position_X.size();} - // Incident particle properties (before interactions in the target) - // Vertex of interaction - Double_t GetDetectedPositionX(Int_t i) {return fDetected_Position_X[i];} - Double_t GetDetectedPositionY(Int_t i) {return fDetected_Position_Y[i];} - Double_t GetDetectedPositionZ(Int_t i) {return fDetected_Position_Z[i];} - // Incident particle angles - Double_t GetDetectedAngleTheta(Int_t i) {return fDetected_Angle_Theta[i];} - Double_t GetDetectedAnglePhi(Int_t i) {return fDetected_Angle_Phi[i];} - - ClassDef(TInteractionCoordinates, 1) // InteractionCoordinates structure + ClassDef(TInteractionCoordinates, 2) // InteractionCoordinates structure }; #endif diff --git a/NPLib/Physics/TReactionConditions.cxx b/NPLib/Physics/TReactionConditions.cxx index ec1cc69e4066e76b4b306dae5464bd1b577a8a5e..cb6e9d6deade56168fa0b74af29f8093bec42c91 100644 --- a/NPLib/Physics/TReactionConditions.cxx +++ b/NPLib/Physics/TReactionConditions.cxx @@ -57,14 +57,13 @@ void TReactionConditions::Clear(){ fRC_Momentum_Direction_X.clear(); fRC_Momentum_Direction_Y.clear(); fRC_Momentum_Direction_Z.clear(); - } //////////////////////////////////////////////////////////////////////////////// void TReactionConditions::Dump() const{ cout << "--------- Initial Condition Dump ---------" << endl ; // Beam beam parameter - cout << "\t ---- Beam Beam ---- " << endl; + cout << "\t ---- Beam ---- " << endl; cout << "\t Particle Name: " << fRC_Beam_Particle_Name << endl; cout << "\t Reaction Energy: " << fRC_Beam_Reaction_Energy << endl; cout << "\t Theta_X: " << fRC_Beam_Emittance_ThetaX << endl; @@ -86,15 +85,14 @@ void TReactionConditions::Dump() const{ unsigned int size = fRC_Particle_Name.size(); for(unsigned int i = 0 ; i < size; i ++){ cout << "\t ---- Particle " << i << " ---- " << endl; - cout << "\t Particle Name" << fRC_Particle_Name[i] << endl; - cout << "\t Energy" << fRC_Kinetic_Energy[i] << endl; + cout << "\t Particle Name: " << fRC_Particle_Name[i] << endl; + cout << "\t Kinetic Energy: " << fRC_Kinetic_Energy[i] << endl; cout << "\t Momentum Direction: ( " << fRC_Momentum_Direction_X[i] << " ; " << fRC_Momentum_Direction_Y[i] << " ; " << fRC_Momentum_Direction_Z[i] << ")" << endl; } - } //////////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Physics/TReactionConditions.h b/NPLib/Physics/TReactionConditions.h index 2a6769cce08f98cce779071ebe50851f66adf6a8..2a46cb1ca32368f8a6dd2157dc0c2c752a7bba80 100644 --- a/NPLib/Physics/TReactionConditions.h +++ b/NPLib/Physics/TReactionConditions.h @@ -56,7 +56,8 @@ private: double fRC_Vertex_Position_X; double fRC_Vertex_Position_Y; double fRC_Vertex_Position_Z; - + double fRC_ExcitationEnergy3; + double fRC_ExcitationEnergy4; double fRC_ThetaCM; // emmitted particles vector<string> fRC_Particle_Name; @@ -72,31 +73,32 @@ public: virtual ~TReactionConditions(); void Clear(); - void Clear(const Option_t*) {}; + void Clear(const Option_t*) {Clear();}; void Dump() const; ///////////////////// SETTERS //////////////////////// // Beam parameter - void SetBeamParticleName (const string &Beam_Particle_Name) {fRC_Beam_Particle_Name = Beam_Particle_Name;}//! - void SetBeamReactionEnergy (const double &Beam_Reaction_Energy) {fRC_Beam_Reaction_Energy = Beam_Reaction_Energy;}//! - void SetBeamEmittanceTheta (const double &Beam_Emittance_Theta) {fRC_Beam_Emittance_Theta = Beam_Emittance_Theta;}//! - void SetBeamEmittancePhi (const double &Beam_Emittance_Phi) {fRC_Beam_Emittance_Phi = Beam_Emittance_Phi;}//! - void SetBeamEmittanceThetaX (const double &Beam_Emittance_ThetaX) {fRC_Beam_Emittance_ThetaX = Beam_Emittance_ThetaX;}//! - void SetBeamEmittancePhiY (const double &Beam_Emittance_PhiY) {fRC_Beam_Emittance_PhiY = Beam_Emittance_PhiY;}//! + void SetBeamParticleName (const string & Beam_Particle_Name) {fRC_Beam_Particle_Name = Beam_Particle_Name;}//! + void SetBeamReactionEnergy (const double & Beam_Reaction_Energy) {fRC_Beam_Reaction_Energy = Beam_Reaction_Energy;}//! + void SetBeamEmittanceTheta (const double & Beam_Emittance_Theta) {fRC_Beam_Emittance_Theta = Beam_Emittance_Theta;}//! + void SetBeamEmittancePhi (const double & Beam_Emittance_Phi) {fRC_Beam_Emittance_Phi = Beam_Emittance_Phi;}//! + void SetBeamEmittanceThetaX (const double & Beam_Emittance_ThetaX) {fRC_Beam_Emittance_ThetaX = Beam_Emittance_ThetaX;}//! + void SetBeamEmittancePhiY (const double & Beam_Emittance_PhiY) {fRC_Beam_Emittance_PhiY = Beam_Emittance_PhiY;}//! // Beam status at the initial interaction point - void SetVertexPositionX (const double &Vertex_Position_X) {fRC_Vertex_Position_X = Vertex_Position_X;}//! - void SetVertexPositionY (const double &Vertex_Position_Y) {fRC_Vertex_Position_Y = Vertex_Position_Y;}//! - void SetVertexPositionZ (const double &Vertex_Position_Z) {fRC_Vertex_Position_Z = Vertex_Position_Z;}//! - - void SetThetaCM (const double &ThetaCM) {fRC_ThetaCM = ThetaCM;}//! + void SetVertexPositionX (const double & Vertex_Position_X) {fRC_Vertex_Position_X = Vertex_Position_X;}//! + void SetVertexPositionY (const double & Vertex_Position_Y) {fRC_Vertex_Position_Y = Vertex_Position_Y;}//! + void SetVertexPositionZ (const double & Vertex_Position_Z) {fRC_Vertex_Position_Z = Vertex_Position_Z;}//! + void SetExcitationEnergy3 (const double& Ex) {fRC_ExcitationEnergy3=Ex;};//! + void SetExcitationEnergy4 (const double& Ex) {fRC_ExcitationEnergy4=Ex;};//! + void SetThetaCM (const double & ThetaCM) {fRC_ThetaCM = ThetaCM;}//! // emmitted particles - void SetParticleName (const string &Particle_Name) {fRC_Particle_Name.push_back(Particle_Name);}//! - void SetTheta (const double &Angle) {fRC_Theta.push_back(Angle);}//! - void SetKineticEnergy (const double &Kinetic_Energy) {fRC_Kinetic_Energy.push_back(Kinetic_Energy);}//! - void SetMomentumDirectionX (const double &Momentum_Direction_X) {fRC_Momentum_Direction_X.push_back(Momentum_Direction_X);}//! - void SetMomentumDirectionY (const double &Momentum_Direction_Y) {fRC_Momentum_Direction_Y.push_back(Momentum_Direction_Y);}//! - void SetMomentumDirectionZ (const double &Momentum_Direction_Z) {fRC_Momentum_Direction_Z.push_back(Momentum_Direction_Z);}//! + void SetParticleName (const string & Particle_Name) {fRC_Particle_Name.push_back(Particle_Name);}//! + void SetTheta (const double & Angle) {fRC_Theta.push_back(Angle);}//! + void SetKineticEnergy (const double & Kinetic_Energy) {fRC_Kinetic_Energy.push_back(Kinetic_Energy);}//! + void SetMomentumDirectionX (const double & Momentum_Direction_X) {fRC_Momentum_Direction_X.push_back(Momentum_Direction_X);}//! + void SetMomentumDirectionY (const double & Momentum_Direction_Y) {fRC_Momentum_Direction_Y.push_back(Momentum_Direction_Y);}//! + void SetMomentumDirectionZ (const double & Momentum_Direction_Z) {fRC_Momentum_Direction_Z.push_back(Momentum_Direction_Z);}//! ///////////////////// GETTERS //////////////////////// // Beam parameter @@ -111,7 +113,8 @@ public: double GetVertexPositionX () const {return fRC_Vertex_Position_X ;}//! double GetVertexPositionY () const {return fRC_Vertex_Position_Y ;}//! double GetVertexPositionZ () const {return fRC_Vertex_Position_Z ;}//! - + double GetExcitation3 () const {return fRC_ExcitationEnergy3 ;}//! + double GetExcitation4 () const {return fRC_ExcitationEnergy4 ;}//! double GetThetaCM () const {return fRC_ThetaCM;}//! // emmitted particles diff --git a/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.cc b/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.cc index 0127cc08f64de32ca56de6f258ef65867d5a7f1a..eaf177ebbe2e5b10677f3ba2d406f52bbbe3ebf9 100644 --- a/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.cc +++ b/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.cc @@ -41,6 +41,7 @@ // NPTool header #include "DETECTORNAME.hh" #include "CalorimeterScorers.hh" +#include "InteractionScorers.hh" #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" @@ -224,31 +225,24 @@ void DETECTORNAME::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void DETECTORNAME::ReadSensitive(const G4Event* event){ +void DETECTORNAME::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_DETECTORNAMEScorer->GetPrimitive(0); - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("DETECTORNAMEScorer/Calorimeter"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - G4double* Info = *(Calo_itr->second); - double Energy = RandGauss::shoot(Info[0],DETECTORNAME_NS::ResoEnergy); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),DETECTORNAME_NS::ResoEnergy); if(Energy>DETECTORNAME_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],DETECTORNAME_NS::ResoTime); - int DetectorNbr = (int) Info[2]; + double Time = RandGauss::shoot(Scorer->GetTime(i),DETECTORNAME_NS::ResoTime); + int DetectorNbr = level[0]; m_Event->SetEnergy(DetectorNbr,Energy); m_Event->SetTime(DetectorNbr,Time); } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -263,9 +257,11 @@ void DETECTORNAME::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_Calorimeter("Calorimeter",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ; + G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("Interaction",ms_InterCoord, 0) ; //and register it to the multifunctionnal detector m_DETECTORNAMEScorer->RegisterPrimitive(Calorimeter); + m_DETECTORNAMEScorer->RegisterPrimitive(Interaction); G4SDManager::GetSDMpointer()->AddNewDetector(m_DETECTORNAMEScorer) ; } diff --git a/NPSimulation/Core/DetectorConstruction.cc b/NPSimulation/Core/DetectorConstruction.cc index 69aeb655f62b9a9a355240960dcd1f6bea771506..b73c50c7ba49bcd7f2f0f276308fe87013b8d397 100644 --- a/NPSimulation/Core/DetectorConstruction.cc +++ b/NPSimulation/Core/DetectorConstruction.cc @@ -199,14 +199,6 @@ G4VPhysicalVolume* DetectorConstruction::ReadConfigurationFile(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void DetectorConstruction::ReadAllSensitive(const G4Event* event){ - // Before looping on each sub-detector, clear the static variable - // ms_InterCoord - // This is done on the first element of the m_Modules vector. - // This should be done here since this variable (of type TIneractionCoordinates) - // deals with multiplicity of events > 1. - if(m_Detectors.size()>0) - m_Detectors[0]->GetInterCoordPointer()->Clear(); - unsigned int mysize = m_Detectors.size(); for (unsigned short i = 0 ; i < mysize ; i++) { (m_Detectors[i]->*m_ReadSensitivePtr)(event); diff --git a/NPSimulation/Core/DetectorConstruction.hh b/NPSimulation/Core/DetectorConstruction.hh index d273b3a42f486d6eae741a765d2b97f5325d139c..d1a762e181bd9e03570d53585630fd3661396186 100644 --- a/NPSimulation/Core/DetectorConstruction.hh +++ b/NPSimulation/Core/DetectorConstruction.hh @@ -61,7 +61,10 @@ class DetectorConstruction : public G4VUserDetectorConstruction{ G4VPhysicalVolume* ReadConfigurationFile(); void AddDetector(NPS::VDetector*); void ReadAllSensitive(const G4Event*); - + void ClearInteractionCoordinates(){ + if(m_Detectors.size()>0) + m_Detectors[0]->GetInterCoordPointer()->Clear(); + }; private: // Logical volumes diff --git a/NPSimulation/Core/EventAction.cc b/NPSimulation/Core/EventAction.cc index bb88725eab7c91346a8b9823fab8906ac7d9bdd4..17ae4f3124f978c6ae5034aaccca78ebf6353eb0 100644 --- a/NPSimulation/Core/EventAction.cc +++ b/NPSimulation/Core/EventAction.cc @@ -61,10 +61,12 @@ void EventAction::EndOfEventAction(const G4Event* event){ m_detector->ReadAllSensitive(event) ; static TTree* tree = RootOutput::getInstance()->GetTree(); tree->Fill(); - if(treated%10000==0){ - tree->AutoSave(); - RootOutput::getInstance()->GetFile()->SaveSelf(kTRUE); - } + m_detector->ClearInteractionCoordinates(); +// if(treated%10000==0){ +// tree->AutoSave(); +// RootOutput::getInstance()->GetFile()->SaveSelf(kTRUE); +// } + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -104,12 +106,18 @@ void EventAction::ProgressDisplay(){ else sprintf(star,"-------"); - if(treated!=total && mean_rate >=0 && remain>=0 && displayed>1) + if(treated!=total && mean_rate >=1000 && remain>=0 && displayed>1) printf("\r \033[1;31m %s Progress: %.1f%% | Rate: %.1fk evt/s | Remain: %s %s\033[0m ", star,percent,mean_rate/1000.,timer,star); - else if(mean_rate >=0 && remain>=0 && displayed>1){ + else if(mean_rate >=1000 && remain>=0 && displayed>1){ printf("\r \033[1;32m %s Progress: %.1f%% | Rate: %.1fk evt/s | Remain: %s %s\033[0m ", star,percent,mean_rate/1000.,timer,star); } + else if( treated!=total && mean_rate >= 0 && remain>=0 && displayed>1) + printf("\r \033[1;31m %s Progress: %.1f%% | Rate: %.1f evt/s | Remain: %s %s\033[0m ", star,percent,mean_rate,timer,star); + + else if(mean_rate >=0 && remain>=0 && displayed>1){ + printf("\r \033[1;32m %s Progress: %.1f%% | Rate: %.1f evt/s | Remain: %s %s\033[0m ", star,percent,mean_rate,timer,star); + } fflush(stdout); inter=0; begin = clock() ; diff --git a/NPSimulation/Core/PrimaryGeneratorAction.cc b/NPSimulation/Core/PrimaryGeneratorAction.cc index 0d41dabb44387e9181a45882ecfe9e2e515a5c1e..6226326cba41fcb3f50a0f7227781efe5e9d96a0 100644 --- a/NPSimulation/Core/PrimaryGeneratorAction.cc +++ b/NPSimulation/Core/PrimaryGeneratorAction.cc @@ -40,12 +40,9 @@ #include "ParticleStack.hh" // Event Generator Class -#include "EventGeneratorTwoBodyReaction.hh" #include "EventGeneratorIsotropic.hh" #include "EventGeneratorMultipleParticle.hh" #include "EventGeneratorBeam.hh" -#include "EventGeneratorGammaDecay.hh" -#include "EventGeneratorParticleDecay.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PrimaryGeneratorAction::PrimaryGeneratorAction(DetectorConstruction* det): m_detector(det){ @@ -112,34 +109,6 @@ void PrimaryGeneratorAction::ReadEventGeneratorFile(string Path){ if(m_detector->GetTarget()!=NULL)myEventGenerator->SetTarget(m_detector->GetTarget()); m_EventGenerator.push_back(myEventGenerator); } - /* blocks.clear(); - blocks = parser.GetAllBlocksWithToken("TwoBodyReaction"); - if (blocks.size()>0) { - NPS::VEventGenerator* myEventGenerator = new EventGeneratorTwoBodyReaction(); - myEventGenerator->ReadConfiguration(parser); - myEventGenerator->InitializeRootOutput(); - myEventGenerator->SetTarget(m_detector->GetTarget()); - m_EventGenerator.push_back(myEventGenerator); - } - blocks.clear(); - blocks = parser.GetAllBlocksWithToken("GammaCascade"); - if (blocks.size()>0) { - NPS::VEventGenerator* myEventGenerator = new EventGeneratorGammaDecay(); - myEventGenerator->ReadConfiguration(parser); - myEventGenerator->InitializeRootOutput(); - myEventGenerator->SetTarget(m_detector->GetTarget()); - m_EventGenerator.push_back(myEventGenerator); - } - blocks.clear(); - blocks = parser.GetAllBlocksWithToken("ParticleDecay"); - if (blocks.size()>0) { - NPS::VEventGenerator* myEventGenerator = new EventGeneratorParticleDecay(); - myEventGenerator->ReadConfiguration(parser); - myEventGenerator->InitializeRootOutput(); - myEventGenerator->SetTarget(m_detector->GetTarget()); - m_EventGenerator.push_back(myEventGenerator); - } - */ m_Target=m_detector->GetTarget(); if(m_Target!=NULL){ diff --git a/NPSimulation/Detectors/AGATA/AGATA.cc b/NPSimulation/Detectors/AGATA/AGATA.cc index 897e818cd0c507215819ca828b3a695a9fc1169d..2b5d1a717f3b6e9a48c7d64a137538ec8578ad3d 100644 --- a/NPSimulation/Detectors/AGATA/AGATA.cc +++ b/NPSimulation/Detectors/AGATA/AGATA.cc @@ -209,35 +209,23 @@ void AGATA::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void AGATA::ReadSensitive(const G4Event* event){ +void AGATA::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_AGATAScorer->GetPrimitive(0); - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("AGATAScorer/Crystal"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - G4double* Info = *(Calo_itr->second); - //(Info[0]/2.35)*((Info[0]*1.02)*pow((Info[0]*1.8),.5)) - // double Energy = RandGauss::shoot(Info[0],((Info[0]*1000*1.02/2.35)*pow((Info[0]*1000*1.8),.5)) ); - double Energy = RandGauss::shoot(Info[0],AGATA_NS::ResoEnergy); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),AGATA_NS::ResoEnergy); if(Energy>AGATA_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],AGATA_NS::ResoTime); - int DetectorNbr = (int) Info[7]; - double Angle = RandGauss::shoot(Info[5]/deg,AGATA_NS::ResoAngle); + double Time = RandGauss::shoot(Scorer->GetTime(i),AGATA_NS::ResoTime); + int DetectorNbr = Scorer->GetLevel(i)[0]; m_Event->SetEnergy(DetectorNbr,Energy); - m_Event->SetAngle(DetectorNbr,Angle); m_Event->SetTime(DetectorNbr,Time); } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -252,7 +240,7 @@ void AGATA::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(1); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("Crystal",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Crystal",level, 0) ; //and register it to the multifunctionnal detector m_AGATAScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_AGATAScorer) ; diff --git a/NPSimulation/Detectors/Actar/Actar.cc b/NPSimulation/Detectors/Actar/Actar.cc index cc373d3c058be3993aa2c167f7d17dc791834f2a..98592a35e713c7354dfbd8a08a643c91256fce35 100644 --- a/NPSimulation/Detectors/Actar/Actar.cc +++ b/NPSimulation/Detectors/Actar/Actar.cc @@ -1,18 +1,18 @@ /***************************************************************************** - * Copyright (C) 2009-2017 this file is part of the NPTool Project * + * Copyright (C) 2009-2017 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * + * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * * * * Creation Date : September 2017 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe Actar simulation * + * This class describe Actar simulation * * * *---------------------------------------------------------------------------* * Comment: * @@ -52,7 +52,7 @@ // NPTool header #include "Actar.hh" -#include "SiliconScorers.hh" +#include "DSSDScorers.hh" #include "TPCScorers.hh" #include "RootOutput.h" #include "MaterialManager.hh" @@ -86,43 +86,43 @@ namespace Actar_NS{ //const int NumberOfPads = 16384; //const int PadX = 128; //const int PadZ = 128; - + const double Nose_Rmin = 2.5*cm; const double Nose_Rmax = 3.5*cm; const double Nose_Length = 12*cm; - + const double Mylar_Rmax = 3.5*cm; const double Mylar_Thickness = 7*micrometer; - + const double XGazVolume = 256.*mm; const double YGazVolume = 256.*mm; const double ZGazVolume = 256.*mm; - + const double SiliconHeight = 53.*mm; const double SiliconWidth = 53.*mm; const double SiliconThickness = 0.7*mm; const double DistInterSi = 1.*mm; const double Si_PosZ=175.*mm; - const double ResoSilicon = 0.80/2.35; + const double ResoSilicon = 0.60/2.35; const double EnergyThreshold = 0.1; - + const double VamosSiliconHeight = 70*mm; const double VamosSiliconWidth = 50*mm; const double VamosSiliconThickness = 0.5*mm; const double VamosSiliconDistanInterSi = 1*mm; const double VamosSilicon_PosZ = -160*mm; - + const double CsIThickness = 1.*cm; const double CsIHeight = 2.5*cm; const double CsIWidth = 2.5*cm; const double DistInterCsI = 1.*mm; const double CsI_PosZ = 16.*cm; const double ResoCsI = 0.200/2.35; - + const double BeamDumpRadius = 30*mm; const double BeamDumpThickness = 5*mm; const double BeamDump_PosZ = 160*mm; - + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -133,7 +133,7 @@ Actar::Actar(){ m_EventReduced = new MEventReduced(); m_ActarScorer = 0; m_SquareDetector = 0; - + // RGB Color + Transparency m_VisChamber = new G4VisAttributes(G4Colour(0.7, 0.7, 0.7, 0.3)); m_VisWindows = new G4VisAttributes(G4Colour(1, 0, 0, 0.25)); @@ -144,14 +144,14 @@ Actar::Actar(){ m_CsIVisAtt = new G4VisAttributes(G4Colour(0.429412, 0.607843, 0.780392, 0.95)); m_BeamDumpVisAtt = new G4VisAttributes(G4Colour(0.9, 0.5, 0.5)); m_VisPads->SetForceWireframe(true); - + m_build_BeamDump= 0; m_build_Silicon=1; m_build_Vamos_Silicon=0; m_build_CsI=1; - + // Lookup table // - bool ReadingLookupTable = false; + // bool ReadingLookupTable = false; string LT_FileName = "./Detectors/Actar/LT.dat"; ifstream LTConfigFile; LTConfigFile.open(LT_FileName.c_str()); @@ -172,10 +172,10 @@ Actar::Actar(){ m_PadToChannel[pX][pY] = ch; } } - ReadingLookupTable = true; + //ReadingLookupTable = true; } LTConfigFile.close(); - + } Actar::~Actar(){ @@ -200,51 +200,51 @@ void Actar::AddDetector(double R, double Theta, double Phi, string Shape){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Actar::BuildDetector(){ - + G4Material* Cu= MaterialManager::getInstance()->GetMaterialFromLibrary("Cu"); G4Material* Si= MaterialManager::getInstance()->GetMaterialFromLibrary("Si"); G4Material* Al= MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); G4Material* Mylar= MaterialManager::getInstance()->GetMaterialFromLibrary("Mylar"); G4Material* MaterialCsI = MaterialManager::getInstance()->GetMaterialFromLibrary("CsI"); - + if(!m_SquareDetector){ // Main volume G4Box* sChamber = new G4Box("Actar_Box",Actar_NS::ChamberWidth*0.5, Actar_NS::ChamberHeight*0.5,Actar_NS::ChamberThickness*0.5); - + //Nose volume G4Tubs* sNose = new G4Tubs("Actar_Nose",Actar_NS::Nose_Rmin, Actar_NS::Nose_Rmax,Actar_NS::Nose_Length*0.5, 0*deg, 360*deg); - + //Mylar volume G4Tubs* sWindows = new G4Tubs("Actar_Windows",0, Actar_NS::Mylar_Rmax,Actar_NS::Mylar_Thickness*0.5, 0*deg, 360*deg); - + // Cage volume G4Box* sCage = new G4Box("Actar_Gas",Actar_NS::XGazVolume*0.5, Actar_NS::YGazVolume*0.5,Actar_NS::ZGazVolume*0.5); - + // Pad G4Box* sPad = new G4Box("Actar_Pad",256*mm*0.5, 2*mm*0.5,256*mm*0.5); - + // Micromegas G4Box* sMicromegas = new G4Box("Actar_Micromegas",256*mm*0.5, 220*micrometer*0.5,256*mm*0.5); - + // Cathode G4Box* sCathode = new G4Box("Actar_Cathode",26.5*cm*0.5, 1*um*0.5,25.6*cm*0.5); - - - + + + unsigned const int NumberOfGasMix = m_GasMaterial.size(); - + double density=0; double density_sum=0; vector<G4Material*> GasComponent; vector<double> FractionMass; - + for(unsigned int i=0; i<NumberOfGasMix; i++){ GasComponent.push_back(MaterialManager::getInstance()->GetGasFromLibrary(m_GasMaterial[i],m_Pressure,m_Temperature) ); } @@ -253,20 +253,20 @@ G4LogicalVolume* Actar::BuildDetector(){ density_sum += GasComponent[i]->GetDensity(); } //cout << "density = " << density*cm3/g << endl; - + for(unsigned int i=0; i<NumberOfGasMix; i++){ FractionMass.push_back(GasComponent[i]->GetDensity()/density_sum); } - + G4Material* GasMaterial = new G4Material("GasMix", density, NumberOfGasMix, kStateGas, m_Temperature, m_Pressure); G4Material* DriftGasMaterial = new G4Material("DriftGasMix", density, NumberOfGasMix, kStateGas, m_Temperature, m_Pressure); - + for(unsigned int i=0; i<NumberOfGasMix; i++){ GasMaterial->AddMaterial(GasComponent[i], FractionMass[i]); DriftGasMaterial->AddMaterial(GasComponent[i], FractionMass[i]); cout << GasComponent[i] << endl; } - + G4MaterialPropertiesTable* MPT = new G4MaterialPropertiesTable(); MPT->AddConstProperty("DE_PAIRENERGY",20*eV); MPT->AddConstProperty("DE_YIELD",3e-1); @@ -275,45 +275,45 @@ G4LogicalVolume* Actar::BuildDetector(){ MPT->AddConstProperty("DE_DRIFTSPEED",0.8*cm/microsecond); MPT->AddConstProperty("DE_TRANSVERSALSPREAD",2e-5*mm2/ns); MPT->AddConstProperty("DE_LONGITUDINALSPREAD",7e-5*mm2/ns); - + DriftGasMaterial->SetMaterialPropertiesTable(MPT); - + G4MaterialPropertiesTable* MPT2 = new G4MaterialPropertiesTable(); MPT2->AddConstProperty("DE_AMPLIFICATION",1000); MPT2->AddConstProperty("DE_ABSLENGTH",1*pc); - + Al->SetMaterialPropertiesTable(MPT2); - + m_SquareDetector = new G4LogicalVolume(sChamber,GasMaterial,"logic_Actar_Box",0,0,0); m_logicGas = new G4LogicalVolume(sCage,DriftGasMaterial,"logic_Gas",0,0,0); G4LogicalVolume* logicPad = new G4LogicalVolume(sPad,Cu,"logic_Pad",0,0,0); G4LogicalVolume* logicMicromegas = new G4LogicalVolume(sMicromegas,Al,"logic_Micromegas",0,0,0); - + G4LogicalVolume* logicNose = new G4LogicalVolume(sNose,Cu,"logic_Nose",0,0,0); - G4LogicalVolume* logicCathode = new G4LogicalVolume(sCathode,Cu,"logic_Cathode",0,0,0); + /*G4LogicalVolume* logicCathode = */ new G4LogicalVolume(sCathode,Cu,"logic_Cathode",0,0,0); G4LogicalVolume* logicWindows = new G4LogicalVolume(sWindows,Mylar,"logic_Windows",0,0,0); - + G4RotationMatrix* Rot = new G4RotationMatrix(); //new G4PVPlacement(G4Transform3D(*Rot,G4ThreeVector(0,0,-Actar_NS::ChamberThickness*0.5+Actar_NS::Nose_Length*0.5)), // logicNose, // "ActarNose",m_SquareDetector,false,0); - + //new G4PVPlacement(G4Transform3D(*Rot,G4ThreeVector(0,0,-Actar_NS::ChamberThickness*0.5+Actar_NS::Mylar_Thickness*0.5+Actar_NS::Nose_Length)), // logicWindows, // "ActarEntranceWindows",m_SquareDetector,false,0); - + new G4PVPlacement(G4Transform3D(*Rot,G4ThreeVector(0,0,0)), m_logicGas, "ActarGas",m_SquareDetector,false,0); - + //new G4PVPlacement(G4Transform3D(*Rot,G4ThreeVector(0,Actar_NS::YGazVolume*0.5-0.3*cm,0)), // logicMicromegas, // "ActarMicromegas",m_logicGas,false,0); - + new G4PVPlacement(G4Transform3D(*Rot,G4ThreeVector(0,Actar_NS::YGazVolume*0.5,0)), logicPad, "ActarPad",m_logicGas,false,0); - + /*int pad=0; m_PadToXRow.clear(); m_PadToZColumn.clear(); @@ -326,40 +326,40 @@ G4LogicalVolume* Actar::BuildDetector(){ new G4PVPlacement(G4Transform3D(*Rot,G4ThreeVector(X,Actar_NS::YGazVolume*0.5,Z)), logicPad, "ActarPad",m_logicGas,false,pad+1); - + pad++; } }*/ - + /*new G4PVPlacement(G4Transform3D(*Rot,G4ThreeVector(3*cm-0.5*1*um,0,0)), logicCathode, "ActarCathode",m_logicGas,false,0); - - - + + + new G4PVPlacement(G4Transform3D(*Rot,G4ThreeVector(0,0,-6*cm+6*micrometer)), logicWindows, "ActarEntranceWindows",m_SquareDetector,false,0);*/ - + G4ElectricField* field = new G4UniformElectricField(G4ThreeVector(0.0,-400*volt/cm,0.0)); // Create an equation of motion for this field G4EqMagElectricField* Equation = new G4EqMagElectricField(field); G4MagIntegratorStepper* Stepper = new G4ClassicalRK4( Equation, 8 ); - + // Get the global field manager G4FieldManager* FieldManager= new G4FieldManager(); // Set this field to the global field manager FieldManager->SetDetectorField(field); m_logicGas->SetFieldManager(FieldManager,true); - + G4MagInt_Driver* IntgrDriver = new G4MagInt_Driver(0.1*mm, Stepper, Stepper->GetNumberOfVariables() ); - + G4ChordFinder* ChordFinder = new G4ChordFinder(IntgrDriver); FieldManager->SetChordFinder( ChordFinder ); - - + + logicPad->SetSensitiveDetector(m_ActarScorer); logicNose->SetVisAttributes(m_VisChamber); m_SquareDetector->SetVisAttributes(m_VisChamber); @@ -369,8 +369,8 @@ G4LogicalVolume* Actar::BuildDetector(){ logicMicromegas->SetVisAttributes(m_VisMicromegas); //m_SquareDetector->SetSensitiveDetector(m_ActarScorer); } - - + + //////////////////////////////////////////////////// ///////////////////// Beam Dump //////////////////// //////////////////////////////////////////////////// @@ -378,15 +378,15 @@ G4LogicalVolume* Actar::BuildDetector(){ G4Tubs* sBeamDump = new G4Tubs("Actar_BeamDump",0*mm, Actar_NS::BeamDumpRadius,Actar_NS::BeamDumpThickness*0.5, 0*deg, 360*deg); m_LogicBeamDump = new G4LogicalVolume(sBeamDump, Cu, "logicBeamDump",0,0,0); - + G4ThreeVector positionBeamDump = G4ThreeVector(0, 0, Actar_NS::BeamDump_PosZ); new G4PVPlacement(new G4RotationMatrix(0,0,0), positionBeamDump, m_LogicBeamDump,"BeamDump", m_SquareDetector,false,0); - + m_LogicBeamDump->SetVisAttributes(m_BeamDumpVisAtt) ; - + } /////////////////////////////////////////////////// ///////////////////// Thin Si ///////////////////// @@ -395,7 +395,7 @@ G4LogicalVolume* Actar::BuildDetector(){ if(m_build_Silicon){ G4Box* solidSi = new G4Box("Si", 0.5*Actar_NS::SiliconWidth, 0.5*Actar_NS::SiliconHeight, 0.5*Actar_NS::SiliconThickness); ; m_LogicSilicon = new G4LogicalVolume(solidSi, Si, "logicSi", 0, 0, 0); - + for(int k=0;k<4; k++){ for(int p=0; p<5; p++){ double PosX; @@ -409,7 +409,7 @@ G4LogicalVolume* Actar::BuildDetector(){ if(p==2) PosX= 0; if(p==3) PosX= 1*Actar_NS::SiliconWidth+2*Actar_NS::DistInterSi; if(p==4) PosX= 2*Actar_NS::SiliconWidth+1*Actar_NS::DistInterSi; - + G4ThreeVector positionSi = G4ThreeVector(PosX, PosY, Actar_NS::Si_PosZ); new G4PVPlacement(new G4RotationMatrix(0,0,0), positionSi, @@ -418,22 +418,22 @@ G4LogicalVolume* Actar::BuildDetector(){ SiliconNumber++; } } - + // Set Si sensible m_LogicSilicon->SetSensitiveDetector(m_SiliconScorer); - + // Visualisation of ThinSi m_LogicSilicon->SetVisAttributes(m_SiliconVisAtt); } - + //////////////////////////////////////////////////// ///////////////////// Vamos Si ///////////////////// //////////////////////////////////////////////////// if(m_build_Vamos_Silicon){ G4Box* solidSi = new G4Box("Si", 0.5*Actar_NS::VamosSiliconWidth, 0.5*Actar_NS::VamosSiliconHeight, 0.5*Actar_NS::VamosSiliconThickness); ; m_LogicVamosSilicon = new G4LogicalVolume(solidSi, Si, "logicVamosSi", 0, 0, 0); - - + + int VamosSiliconNumber=0; for(int k=0;k<4; k++){ for(int p=0; p<3; p++){ @@ -447,7 +447,7 @@ G4LogicalVolume* Actar::BuildDetector(){ if(p==0) PosY= -Actar_NS::VamosSiliconHeight-Actar_NS::VamosSiliconDistanInterSi; if(p==1) PosY= 0; if(p==2) PosY= Actar_NS::VamosSiliconHeight+Actar_NS::VamosSiliconDistanInterSi; - + G4ThreeVector positionSi = G4ThreeVector(PosX, PosY, Actar_NS::VamosSilicon_PosZ); new G4PVPlacement(new G4RotationMatrix(0,0,0), positionSi, @@ -457,21 +457,21 @@ G4LogicalVolume* Actar::BuildDetector(){ SiliconNumber++; } } - + // Set Si sensible m_LogicVamosSilicon->SetSensitiveDetector(m_SiliconScorer); - + // Visualisation of ThinSi m_LogicVamosSilicon->SetVisAttributes(m_SiliconVisAtt); } - + /////////////////////////////////////////////// ///////////////////// CsI ///////////////////// /////////////////////////////////////////////// if(m_build_CsI){ G4Box* solidCsI = new G4Box("Si", 0.5*Actar_NS::CsIWidth, 0.5*Actar_NS::CsIHeight, 0.5*Actar_NS::CsIThickness); ; m_LogicCsICrystal = new G4LogicalVolume(solidCsI, MaterialCsI, "logicCsI", 0, 0, 0); - + int CsINumber=0; for(int k=0;k<8; k++){ for(int p=0; p<10; p++){ @@ -479,10 +479,10 @@ G4LogicalVolume* Actar::BuildDetector(){ double PosY; if(k<4) PosY= -0.5*Actar_NS::CsIHeight-0.5*Actar_NS::DistInterCsI+(k-3)*(Actar_NS::CsIHeight+Actar_NS::DistInterCsI); if(k>3) PosY= 0.5*Actar_NS::CsIHeight+0.5*Actar_NS::DistInterCsI+(k-4)*(Actar_NS::CsIHeight+Actar_NS::DistInterCsI); - + if(p<5) PosX= 0.5*Actar_NS::CsIWidth+0.5*Actar_NS::DistInterCsI+(4-p)*(Actar_NS::CsIWidth+Actar_NS::DistInterCsI); if(p>4) PosX= -0.5*Actar_NS::CsIWidth-0.5*Actar_NS::DistInterCsI+(5-p)*(Actar_NS::CsIWidth+Actar_NS::DistInterCsI); - + G4ThreeVector positionCsI = G4ThreeVector(PosX, PosY, Actar_NS::CsI_PosZ); new G4PVPlacement(new G4RotationMatrix(0,0,0), positionCsI, @@ -491,14 +491,14 @@ G4LogicalVolume* Actar::BuildDetector(){ CsINumber++; } } - + // Set Si sensible m_LogicCsICrystal->SetSensitiveDetector(m_CsIScorer); - + // Visualisation of ThinSi m_LogicCsICrystal->SetVisAttributes(m_CsIVisAtt) ; } - + return m_SquareDetector; } @@ -514,15 +514,15 @@ void Actar::ReadConfiguration(NPL::InputParser parser){ vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Actar"); if(NPOptionManager::getInstance()->GetVerboseLevel()) cout << "//// " << blocks.size() << " detectors found " << endl; - + vector<string> cart = {"POS","Shape","GasMaterial","GasFraction","Temperature","Pressure","Si","VamosSi","CsI","BeamDump"}; //vector<string> sphe = {"R","Theta","Phi","Shape","GasMaterial","GasFraction","Temperature","Pressure","Si","CsI","BeamDump"}; - + for(unsigned int i = 0 ; i < blocks.size() ; i++){ if(blocks[i]->HasTokenList(cart)){ if(NPOptionManager::getInstance()->GetVerboseLevel()) cout << endl << "//// Actar " << i+1 << endl; - + G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); string Shape = blocks[i]->GetString("Shape"); vector<string> GasName = blocks[i]->GetVectorString("GasMaterial"); @@ -537,7 +537,7 @@ void Actar::ReadConfiguration(NPL::InputParser parser){ m_build_Vamos_Silicon = blocks[i]->GetInt("VamosSi"); m_build_CsI = blocks[i]->GetInt("CsI"); m_build_BeamDump = blocks[i]->GetInt("BeamDump"); - + AddDetector(Pos,Shape); } /*else if(blocks[i]->HasTokenList(sphe)){ @@ -557,7 +557,7 @@ void Actar::ReadConfiguration(NPL::InputParser parser){ m_Pressure = blocks[i]->GetDouble("Pressure","bar"); m_build_Silicon = blocks[i]->GetInt("Si"); m_build_CsI = blocks[i]->GetInt("CsI"); - + AddDetector(R,Theta,Phi,Shape); }*/ else{ @@ -574,7 +574,7 @@ void Actar::ReadConfiguration(NPL::InputParser parser){ // Called After DetecorConstruction::AddDetector Method void Actar::ConstructDetector(G4LogicalVolume* world){ for (unsigned short i = 0 ; i < m_R.size() ; i++) { - + G4double wX = m_R[i] * sin(m_Theta[i] ) * cos(m_Phi[i] ) ; G4double wY = m_R[i] * sin(m_Theta[i] ) * sin(m_Phi[i] ) ; G4double wZ = m_R[i] * cos(m_Theta[i] ) ; @@ -591,42 +591,42 @@ void Actar::ConstructDetector(G4LogicalVolume* world){ G4ThreeVector v = w.cross(u); v = v.unit(); u = u.unit(); - + G4RotationMatrix* Rot = new G4RotationMatrix(u,v,w); - + new G4PVPlacement(G4Transform3D(*Rot,Det_pos), BuildDetector(), "Actar",world,false,i+1); } - + if(!m_ReactionRegion){ G4ProductionCuts* ecut = new G4ProductionCuts(); ecut->SetProductionCut(1000,"e-"); - + m_ReactionRegion= new G4Region("NPSimulationProcess"); m_ReactionRegion->SetProductionCuts(ecut); m_ReactionRegion->AddRootLogicalVolume(m_logicGas); m_ReactionRegion->SetUserLimits(new G4UserLimits(1.2*mm)); - + G4Region* Region_cut = new G4Region("RegionCut"); Region_cut->SetProductionCuts(ecut); Region_cut->AddRootLogicalVolume(m_SquareDetector); } - + G4FastSimulationManager* mng = m_ReactionRegion->GetFastSimulationManager(); - + unsigned int size = m_ReactionModel.size(); for(unsigned int i = 0 ; i < size ; i++){ mng->RemoveFastSimulationModel(m_ReactionModel[i]); } - + m_ReactionModel.clear(); G4VFastSimulationModel* fsm; fsm = new NPS::BeamReaction("BeamReaction",m_ReactionRegion); m_ReactionModel.push_back(fsm); fsm = new NPS::Decay("Decay",m_ReactionRegion); m_ReactionModel.push_back(fsm); - + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Add Detector branch to the EventTree. @@ -645,41 +645,31 @@ void Actar::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void Actar::ReadSensitive(const G4Event* event){ +void Actar::ReadSensitive(const G4Event*){ m_EventReduced->CoboAsad.clear(); - - + static ReducedData DataReduced; + + ////////////// // Pad scorer - NPS::HitsMap<G4double*>* PadHitMap; - std::map<G4int, G4double**>::iterator Pad_itr; - - G4int PadCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(m_ActarCollectionID); - PadHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(PadCollectionID)); + TPCScorers::PS_TPCCathode* PadScorer= (TPCScorers::PS_TPCCathode*) m_ActarScorer->GetPrimitive(0); + unsigned int size = PadScorer->GetMult(); // Loop on the Pad map //TH1D* h = new TH1D("h","h",25000,0,25000); - for (Pad_itr = PadHitMap->GetMap()->begin() ; Pad_itr != PadHitMap->GetMap()->end() ; Pad_itr++){ - ReducedData DataReduced; - G4double* Info = *(Pad_itr->second); - // Interraction Coordinates - ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; - - float Count = RandGauss::shoot(Info[0],Actar_NS::ResoCharge*Info[0]); - float Time = Info[1];//RandGauss::shoot(Info[1],Actar_NS::ResoTime); + for (unsigned int i = 0 ; i < size ; i++){ + DataReduced.clear(); + double Count = RandGauss::shoot(PadScorer->GetCharge(i),Actar_NS::ResoCharge*PadScorer->GetCharge(i)); + double Time = PadScorer->GetTime(i);//RandGauss::shoot(Info[1],Actar_NS::ResoTime); //int iTime = ((int) Time*20/512)+1; - int PadNbr = Info[7]; - int Pad_X = Info[8];//m_PadToXRow[PadNbr]; - int Pad_Y = Info[9];//m_PadToZColumn[PadNbr]; - + //int PadNbr = Info[7]; + int Pad_X = PadScorer->GetPadX(i);//m_PadToXRow[PadNbr]; + int Pad_Y = PadScorer->GetPadY(i);//m_PadToZColumn[PadNbr]; + int co = m_PadToCobo[Pad_X][Pad_Y]; int as = m_PadToAsad[Pad_X][Pad_Y]; int ag = m_PadToAGET[Pad_X][Pad_Y]; int ch = m_PadToChannel[Pad_X][Pad_Y]; - + if(Count>Actar_NS::ChargeThreshold){ DataReduced.globalchannelid = ch+(ag<<7)+(as<<9)+(co<<11); DataReduced.peakheight.push_back(Count); @@ -687,28 +677,35 @@ void Actar::ReadSensitive(const G4Event* event){ } m_EventReduced->CoboAsad.push_back(DataReduced); } - PadHitMap->clear(); - + + /*vector<double> Q, T; + for(int i=0; i<h->GetNbinsX(); i++){ + double count = h->GetBinContent(i); + double time = h->GetBinCenter(i); + if(count){ + Q.push_back(count); + T.push_back(time+500); + + } + } + // clear map for next event + SimulateDigitizer(Q,T,1.40*microsecond,0,8750,25,5); + delete h;*/ + // Silicon // if(m_build_Silicon){ - ReducedData DataReduced; - - NPS::HitsMap<G4double*>* SiHitMap; - std::map<G4int, G4double**>::iterator Si_itr; - - G4int SiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(m_SiliconCollectionID); - SiHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(SiCollectionID)); - - // Loop on the ThinSi map - for (Si_itr = SiHitMap->GetMap()->begin() ; Si_itr != SiHitMap->GetMap()->end() ; Si_itr++){ - G4double* Info = *(Si_itr->second); - double E_Si = RandGauss::shoot(Info[0],Actar_NS::ResoSilicon); - - int co=31; - int as=0; - int ag=0; - int ch=Info[7]; - + DSSDScorers::PS_Rectangle* SiScorer= (DSSDScorers::PS_Rectangle*) m_SiliconScorer->GetPrimitive(0); + unsigned int sizeSi = SiScorer->GetLengthMult(); + // Loop on the ThinSi map + for(unsigned int i = 0 ; i < sizeSi ; i++){ + DataReduced.clear(); + double E_Si = RandGauss::shoot(SiScorer->GetEnergyLength(i),Actar_NS::ResoSilicon); + + int co = 31; + int as = 0; + int ag = 0; + int ch = SiScorer->GetDetectorLength(i); + if(E_Si>Actar_NS::EnergyThreshold){ DataReduced.globalchannelid = ch+(ag<<7)+(as<<9)+(co<<11); DataReduced.peaktime.push_back(ch); @@ -717,44 +714,39 @@ void Actar::ReadSensitive(const G4Event* event){ m_EventReduced->CoboAsad.push_back(DataReduced); } // Clear Map for next event - SiHitMap->clear(); + SiScorer->clear(); } - + // CsI // if(m_build_CsI){ - NPS::HitsMap<G4double*>* CsIHitMap; - std::map<G4int, G4double**>::iterator CsI_itr; - - G4int CsICollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(m_CsICollectionID); - CsIHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CsICollectionID)); - - // Loop on the CsI map - for (CsI_itr = CsIHitMap->GetMap()->begin() ; CsI_itr !=CsIHitMap->GetMap()->end() ; CsI_itr++){ - G4double* Info = *(CsI_itr->second); - double E_CsI = RandGauss::shoot(Info[0],Actar_NS::ResoCsI); - + CalorimeterScorers::PS_Calorimeter* CsIScorer= (CalorimeterScorers::PS_Calorimeter*) m_CsIScorer->GetPrimitive(0); + unsigned int sizeCsI = CsIScorer->GetMult(); + // Loop on the ThinSi map + for(unsigned int i = 0 ; i < sizeCsI ; i++){ + DataReduced.clear(); + vector<unsigned int> level = CsIScorer->GetLevel(i); + //double E_CsI = RandGauss::shoot(CsIScorer->GetEnergy(i),Actar_NS::ResoCsI); + /*if(E_CsI>Actar_NS::EnergyThreshold){ m_Event->SetCsIEnergy(E_CsI); - m_Event->SetCsICrystalNumber(Info[2]); + m_Event->SetCsICrystalNumber(level[0]); } m_EventReduced->CoboAsad.push_back(DataReduced);*/ } - // Clear Map for next event - CsIHitMap->clear(); } - + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... /*void Actar::SimulateDigitizer(vector<double> E, vector<double> T, double fallTime,double start,double stop, double step,double noise){ - + static string formula; formula= ""; static string Es,Ts,var,cond; static string fall; fall=std::to_string(fallTime); - + for(unsigned int i = 0 ; i < E.size() ; i++){ if(E[i]!=0 && T[i]!=0){ Es = std::to_string(E[i]); @@ -772,7 +764,7 @@ void Actar::ReadSensitive(const G4Event* event){ double time = start+i*step; double energy = f->Eval(time)+noise*(1-2*G4UniformRand()); } - + delete f; }*/ @@ -780,32 +772,32 @@ void Actar::ReadSensitive(const G4Event* event){ //////////////////////////////////////////////////////////////// void Actar::InitializeScorers() { // This check is necessary in case the geometry is reloaded - + bool already_exist = false; vector<G4int> NestingLevel; NestingLevel.push_back(0); NestingLevel.push_back(2); - + m_ActarScorer = CheckScorer("ActarScorer",already_exist) ; m_SiliconScorer = CheckScorer("SiliconScorer",already_exist); //m_VamosSiliconScorer = CheckScorer("VamosSiliconScorer",already_exist); m_CsIScorer = CheckScorer("CsIScorer",already_exist); - + if(already_exist) return; - - G4VPrimitiveScorer* SiScorer = new SILICONSCORERS::PS_Silicon_Rectangle("SiliconScorer",0,Actar_NS::SiliconHeight,Actar_NS::SiliconWidth,1,1); + + G4VPrimitiveScorer* SiScorer = new DSSDScorers::PS_Rectangle("SiliconScorer",0,Actar_NS::SiliconHeight,Actar_NS::SiliconWidth,1,1); m_SiliconScorer->RegisterPrimitive(SiScorer); - + /*G4VPrimitiveScorer* VamosSiScorer = new SILICONSCORERS::PS_Silicon_Rectangle("VamosSiliconScorer",0,Actar_NS::VamosSiliconHeight,Actar_NS::VamosSiliconWidth,1,1); m_VamosSiliconScorer->RegisterPrimitive(VamosSiScorer);*/ - - G4VPrimitiveScorer* CsIScorer= new CALORIMETERSCORERS::PS_Calorimeter("CsI",NestingLevel); + + G4VPrimitiveScorer* CsIScorer= new CalorimeterScorers::PS_Calorimeter("CsI",NestingLevel); m_CsIScorer->RegisterPrimitive(CsIScorer); - + vector<int> level; level.push_back(0); - G4VPrimitiveScorer* Actar_dig= new TPCSCORERS::PS_TPCCathode("Actar_dig",0) ; + G4VPrimitiveScorer* Actar_dig= new TPCScorers::PS_TPCCathode("Actar_dig",0) ; m_ActarScorer->RegisterPrimitive(Actar_dig); - + G4SDManager::GetSDMpointer()->AddNewDetector(m_ActarScorer); G4SDManager::GetSDMpointer()->AddNewDetector(m_SiliconScorer); //G4SDManager::GetSDMpointer()->AddNewDetector(m_VamosSiliconScorer); @@ -834,6 +826,6 @@ extern"C" { NPS::DetectorFactory::getInstance()->AddDetector("Actar",Actar::Construct); } }; - + proxy_nps_Actar p_nps_Actar; } diff --git a/NPSimulation/Detectors/AnnularCsI/AnnularCsI.cc b/NPSimulation/Detectors/AnnularCsI/AnnularCsI.cc index 26baedac923be31db81bf33118a59fe32e0ccfd3..8b877d44356575740e89f8afbc8f659119402cdd 100644 --- a/NPSimulation/Detectors/AnnularCsI/AnnularCsI.cc +++ b/NPSimulation/Detectors/AnnularCsI/AnnularCsI.cc @@ -186,32 +186,25 @@ void AnnularCsI::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void AnnularCsI::ReadSensitive(const G4Event* event){ +void AnnularCsI::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_AnnularCsIScorer->GetPrimitive(0); - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("AnnularCsIScorer/Calorimeter"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - G4double* Info = *(Calo_itr->second); - double Eres = AnnularCsI_NS::ResoEnergy*Info[0]; - double Energy = RandGauss::shoot(Info[0],Eres); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); + double Eres = AnnularCsI_NS::ResoEnergy*Scorer->GetEnergy(i); + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),Eres); if(Energy>AnnularCsI_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],AnnularCsI_NS::ResoTime); - int DetectorNbr = (int) Info[2]; + double Time = RandGauss::shoot(Scorer->GetTime(i),AnnularCsI_NS::ResoTime); + int DetectorNbr = level[0]; m_Event->SetEnergy(DetectorNbr,Energy); m_Event->SetTime(DetectorNbr,Time); } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -226,7 +219,7 @@ void AnnularCsI::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_Calorimeter("Calorimeter",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ; //and register it to the multifunctionnal detector m_AnnularCsIScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_AnnularCsIScorer) ; diff --git a/NPSimulation/Detectors/AnnularS1/AnnularS1.cc b/NPSimulation/Detectors/AnnularS1/AnnularS1.cc index 5cbae4e7642fee8b2dcd1e1477a1c9f1a9b98085..fbad5cdbefd6463ae400508b5f716b6c4ccc799b 100644 --- a/NPSimulation/Detectors/AnnularS1/AnnularS1.cc +++ b/NPSimulation/Detectors/AnnularS1/AnnularS1.cc @@ -44,7 +44,8 @@ #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" #include "AnnularS1.hh" -#include "SiliconScorers.hh" +#include "DSSDScorers.hh" +#include "InteractionScorers.hh" #include "TS1Data.h" #include "RootOutput.h" #include "NPOptionManager.h" @@ -299,28 +300,32 @@ void AnnularS1::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void AnnularS1::ReadSensitive(const G4Event* event){ +void AnnularS1::ReadSensitive(const G4Event*){ // Clear ROOT objects m_Event->Clear(); - NPS::HitsMap<G4double*>* SiliconHitMap; - std::map<G4int, G4double**>::iterator Silicon_itr; - - G4int SiliconCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("AnnularS1_Scorer/AnnularS1_Scorer"); - SiliconHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(SiliconCollectionID)); - - // Loop on the Silicon map - for (Silicon_itr = SiliconHitMap->GetMap()->begin() ; Silicon_itr != SiliconHitMap->GetMap()->end() ; Silicon_itr++){ - G4double* Info = *(Silicon_itr->second); - - double Energy = Info[0]; + DSSDScorers::PS_Annular* Scorer= (DSSDScorers::PS_Annular*) m_Scorer->GetPrimitive(0); + + // Loop on Silicon Ring Hit + unsigned int sizeRing = Scorer->GetRingMult(); + for(unsigned int i = 0 ; i < sizeRing ; i++){ + double Energy = Scorer->GetEnergyRing(i); if(Energy>EnergyThreshold){ - double Time = Info[1]; - int DetNbr = (int) Info[7]; - int StripTheta = (int) Info[8]; - int StripPhi = (int) Info[9]; - int StripQuadrant = (int) Info[10] - 1; + double Time = Scorer->GetTimeRing(i); + unsigned int DetNbr = Scorer->GetDetectorRing(i);; + unsigned int StripTheta = Scorer->GetStripRing(i); + + + // Check for associated Quadrant strip + int StripQuadrant = 0; + unsigned int sizeQ = Scorer->GetQuadrantMult(); + for(unsigned int q = 0 ; q < sizeQ ; q++){ + if(Scorer->GetDetectorQuadrant(q)==DetNbr){ + StripQuadrant = Scorer->GetStripQuadrant(q)-1; + break; + } + } m_Event->SetS1ThetaEDetectorNbr(DetNbr); m_Event->SetS1ThetaEStripNbr(StripTheta+StripQuadrant*NbrRingStrips); @@ -330,6 +335,20 @@ void AnnularS1::ReadSensitive(const G4Event* event){ m_Event->SetS1ThetaTStripNbr(StripTheta+StripQuadrant*NbrRingStrips); m_Event->SetS1ThetaTTime(RandGauss::shoot(Time, ResoTime)); + } + + } + + // Loop on Silicon Sector Hit + unsigned int sizeSector = Scorer->GetSectorMult(); + for(unsigned int i = 0 ; i < sizeSector ; i++){ + double Energy = Scorer->GetEnergyRing(i); + + if(Energy>EnergyThreshold){ + double Time = Scorer->GetTimeRing(i); + unsigned int DetNbr = Scorer->GetDetectorRing(i);; + unsigned int StripPhi = Scorer->GetStripSector(i); + m_Event->SetS1PhiEDetectorNbr(DetNbr); m_Event->SetS1PhiEStripNbr(StripPhi); m_Event->SetS1PhiEEnergy(RandGauss::shoot(Energy, ResoEnergy)); @@ -337,18 +356,8 @@ void AnnularS1::ReadSensitive(const G4Event* event){ m_Event->SetS1PhiTDetectorNbr(DetNbr); m_Event->SetS1PhiTStripNbr(StripPhi); m_Event->SetS1PhiTTime(RandGauss::shoot(Time, ResoTime)); - - // Interraction Coordinates - ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; - } } - // clear map for next event - SiliconHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -360,7 +369,7 @@ void AnnularS1::InitializeScorers(){ if(already_exist) return; G4VPrimitiveScorer* AnnularScorer = - new SILICONSCORERS::PS_Silicon_Annular("AnnularS1_Scorer", + new DSSDScorers::PS_Annular("AnnularS1_Scorer", 2, ActiveWaferInnerRadius, ActiveWaferOutterRadius, @@ -371,7 +380,8 @@ void AnnularS1::InitializeScorers(){ NbQuadrant); m_Scorer->RegisterPrimitive(AnnularScorer); - + G4VPrimitiveScorer* InteractionScorer = new InteractionScorers::PS_Interactions("InteractionS1",ms_InterCoord,2); + m_Scorer->RegisterPrimitive(InteractionScorer); // Add All Scorer to the Global Scorer Manager G4SDManager::GetSDMpointer()->AddNewDetector(m_Scorer); } diff --git a/NPSimulation/Detectors/AnnularTelescope/AnnularTelescope.cc b/NPSimulation/Detectors/AnnularTelescope/AnnularTelescope.cc index ca06a0f219e977fb54415a4fa6c867859cc34bb8..eb7200569b995903da0763942da828e83002ea62 100644 --- a/NPSimulation/Detectors/AnnularTelescope/AnnularTelescope.cc +++ b/NPSimulation/Detectors/AnnularTelescope/AnnularTelescope.cc @@ -194,40 +194,22 @@ void AnnularTelescope::InitializeRootOutput(){ // Read scorer // Helper for ReadSensitive() void AnnularTelescope::ReadScorer( - const G4Event* event, const char* scorerName, + const G4Event* , const string& scorerName, std::vector<HitInfo_t>& hits) { - - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; - - G4int CaloCollectionID = - G4SDManager::GetSDMpointer()->GetCollectionID(scorerName); - CaloHitMap = (NPS::HitsMap<G4double*>*)( - event->GetHCofThisEvent()->GetHC(CaloCollectionID) ); - - // Loop on the Calo map - for(const auto& hit : *(CaloHitMap->GetMap()) ) { - // Read Hit Information - // Infos[0] = aStep->GetTotalEnergyDeposit(); - // Infos[1] = aStep->GetPreStepPoint()->GetGlobalTime(); - // Infos[2] = m_Position.x(); - // Infos[3] = m_Position.y(); - // Infos[4] = m_Position.z(); - // Infos[5] = m_Position.theta(); - // Infos[6] = m_Position.phi(); - // Infos[7] = Detector Number + CalorimeterScorers::PS_Calorimeter* Scorer=0; + if(scorerName =="AnnularTelescopeScorer_CsI/Calorimeter_CsI" ) + Scorer= (CalorimeterScorers::PS_Calorimeter*) m_AnnularTelescopeScorer_CsI->GetPrimitive(0); + else if (scorerName == "AnnularTelescopeScorer_Si/Calorimeter_Si") + Scorer= (CalorimeterScorers::PS_Calorimeter*) m_AnnularTelescopeScorer_Si->GetPrimitive(0); + + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); hits.push_back(HitInfo_t()); - G4double* Infos = *(hit.second); - - hits.back().detector = int(Infos[7]); - hits.back().energy = Infos[0]; - hits.back().time = Infos[1]; - hits.back().x = Infos[2]; - hits.back().y = Infos[3]; - hits.back().z = Infos[4]; + hits.back().detector = level[0]; + hits.back().energy = Scorer->GetEnergy(i); + hits.back().time = Scorer->GetTime(i); } - // clear map for next event - CaloHitMap->clear(); } @@ -402,7 +384,7 @@ void AnnularTelescope::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); G4VPrimitiveScorer* Calorimeter_CsI = - new CALORIMETERSCORERS::PS_CalorimeterWithInteraction( + new CalorimeterScorers::PS_Calorimeter( "Calorimeter_CsI",level, 0) ; //and register it to the multifunctionnal detector m_AnnularTelescopeScorer_CsI->RegisterPrimitive(Calorimeter_CsI); @@ -419,7 +401,7 @@ void AnnularTelescope::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); G4VPrimitiveScorer* Calorimeter_Si = - new CALORIMETERSCORERS::PS_CalorimeterWithInteraction( + new CalorimeterScorers::PS_Calorimeter( "Calorimeter_Si",level, 0) ; //and register it to the multifunctionnal detector m_AnnularTelescopeScorer_Si->RegisterPrimitive(Calorimeter_Si); diff --git a/NPSimulation/Detectors/AnnularTelescope/AnnularTelescope.hh b/NPSimulation/Detectors/AnnularTelescope/AnnularTelescope.hh index e240ae049cc5a993629a452c752cc44889d4d816..7c297d1375f0884c783e020bf9583c10e841e1b2 100644 --- a/NPSimulation/Detectors/AnnularTelescope/AnnularTelescope.hh +++ b/NPSimulation/Detectors/AnnularTelescope/AnnularTelescope.hh @@ -14,7 +14,7 @@ * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe AnnularTelescope simulation * + * This class describe AnnularTelescope simulation * * * *---------------------------------------------------------------------------* * Comment: * @@ -84,7 +84,7 @@ public: G4int detector; G4double energy; G4double time; G4double x; G4double y; G4double z; }; - void ReadScorer(const G4Event* event, const char* scorerName, + void ReadScorer(const G4Event* event, const string& scorerName, std::vector<HitInfo_t>& hits); // Fill NPL CsI Data diff --git a/NPSimulation/Detectors/CsI/CsI.cc b/NPSimulation/Detectors/CsI/CsI.cc index 9f776a19e063266915c91a265bc5a1628cf19381..6a7775264a8c41281e4fdf93ca75eeafe8c9d440 100644 --- a/NPSimulation/Detectors/CsI/CsI.cc +++ b/NPSimulation/Detectors/CsI/CsI.cc @@ -6,14 +6,14 @@ *****************************************************************************/ /***************************************************************************** - * Original Author: Pierre Morfouace contact address: morfouac@ipno.in2p3.fr * + * Original Author: Pierre Morfouace contact address: morfouac@ipno.in2p3.fr* * * - * Creation Date : Avril 2015 * + * Creation Date : Avril 2015 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe a Modular cylindrical CsI Scintillator * - * Few Material are instantiate and user can choose position and dimension * + * This class describe a Modular cylindrical CsI Scintillator * + * Few Material are instantiate and user can choose position and dimension * * but also the adding of a lead plate on the rear side of the detector * * * *---------------------------------------------------------------------------* @@ -47,7 +47,7 @@ #include "ObsoleteGeneralScorers.hh" #include "RootOutput.h" #include "MaterialManager.hh" -#include "SiliconScorers.hh" +#include "InteractionScorers.hh" #include "PhotoDiodeScorers.hh" #include "CalorimeterScorers.hh" #include "NPSDetectorFactory.hh" @@ -453,29 +453,15 @@ void CsI::ReadSensitive(const G4Event* event){ m_Event->Clear(); // CsI // - NPS::HitsMap<G4double*>* CsIHitMap; - std::map<G4int, G4double**>::iterator CsI_itr; - G4int CsICollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("CsIScorer/CsI"); - CsIHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CsICollectionID)); - - // Loop on the CsI map - for (CsI_itr = CsIHitMap->GetMap()->begin() ; CsI_itr != CsIHitMap->GetMap()->end() ; CsI_itr++){ - G4double* Info = *(CsI_itr->second); - double E_CsI = RandGauss::shoot(Info[0],Info[0]*ResoCsI/100); - //cout << "Energy CsI " << endl; - //cout << E_CsI << endl; + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_CsIScorer->GetPrimitive(0); + + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); + double E_CsI = RandGauss::shoot(Scorer->GetEnergy(i),Scorer->GetEnergy(i)*ResoCsI/100); m_Event->SetCsIEEnergy(E_CsI); - m_Event->SetENumber(Info[7]); - - - ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; + m_Event->SetENumber(level[i]); } - // Clear Map for next event - CsIHitMap->clear(); // PhotoDiode // NPS::HitsMap<G4double*>* PhotoDiodeHitMap; @@ -517,9 +503,14 @@ void CsI::InitializeScorers() { if(already_exist) return ; - G4VPrimitiveScorer* CsIScorer= new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("CsI",NestingLevel); + G4VPrimitiveScorer* CsIScorer= new CalorimeterScorers::PS_Calorimeter("CsI",NestingLevel); m_CsIScorer->RegisterPrimitive(CsIScorer); + + G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("InteractionCsI",ms_InterCoord,1); + m_CsIScorer->RegisterPrimitive(Interaction); + + G4VPrimitiveScorer* PDScorer = new PHOTODIODESCORERS::PS_PhotoDiode_Rectangle("PhotoDiode",0, PhotoDiodeFace, PhotoDiodeFace, @@ -530,19 +521,6 @@ void CsI::InitializeScorers() { G4SDManager::GetSDMpointer()->AddNewDetector(m_PDScorer) ; G4SDManager::GetSDMpointer()->AddNewDetector(m_CsIScorer) ; - - /*G4VPrimitiveScorer* DetNbr = new PSDetectorNumber("CsINumber","CsI", 0) ; - G4VPrimitiveScorer* Energy = new PSEnergy("Energy","CsI", 0) ; - G4VPrimitiveScorer* Time = new PSTOF("Time","CsI", 0) ; - G4VPrimitiveScorer* InteractionCoordinatesZ = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","CsI", 0); - //and register it to the multifunctionnal detector - m_CsIScorer->RegisterPrimitive(DetNbr) ; - m_CsIScorer->RegisterPrimitive(Energy) ; - m_CsIScorer->RegisterPrimitive(Time) ; - m_CsIScorer->RegisterPrimitive(InteractionCoordinatesZ); - G4SDManager::GetSDMpointer()->AddNewDetector(m_CsIScorer) ; - G4SDManager::GetSDMpointer()->AddNewDetector(m_PDScorer) ;*/ - } //////////////////////////////////////////////////////////////// diff --git a/NPSimulation/Detectors/FPDTamu/FPDTamu.cc b/NPSimulation/Detectors/FPDTamu/FPDTamu.cc index fde2a8b7d45c31c3f6cda1be0209e34be1b818f3..ac21c42c6f558556e94e9dca60e13c2a278f56f0 100644 --- a/NPSimulation/Detectors/FPDTamu/FPDTamu.cc +++ b/NPSimulation/Detectors/FPDTamu/FPDTamu.cc @@ -183,33 +183,21 @@ void FPDTamu::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void FPDTamu::ReadSensitive(const G4Event* event){ +void FPDTamu::ReadSensitive(const G4Event*){ m_Event->Clear(); - /////////// - // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_FPDTamuScorer->GetPrimitive(0); - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("FPDTamuScorer/Calorimeter"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - G4double* Info = *(Calo_itr->second); - //(Info[0]/2.35)*((Info[0]*1.02)*pow((Info[0]*1.8),.5)) - // double Energy = RandGauss::shoot(Info[0],((Info[0]*1000*1.02/2.35)*pow((Info[0]*1000*1.8),.5)) ); - double Energy = RandGauss::shoot(Info[0],FPDTamu_NS::ResoEnergy); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),FPDTamu_NS::ResoEnergy); if(Energy>FPDTamu_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],FPDTamu_NS::ResoTime); - int DetectorNbr = (int) Info[2]; + double Time = RandGauss::shoot(Scorer->GetTime(i),FPDTamu_NS::ResoTime); + int DetectorNbr = Scorer->GetLevel(i)[0]; m_Event->Set_Delta_E(DetectorNbr,Energy); m_Event->Set_Delta_T(DetectorNbr,Time); } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -224,7 +212,7 @@ void FPDTamu::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_Calorimeter("Calorimeter",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ; //and register it to the multifunctionnal detector m_FPDTamuScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_FPDTamuScorer) ; diff --git a/NPSimulation/Detectors/Fatima/Fatima.cc b/NPSimulation/Detectors/Fatima/Fatima.cc index 66ef3a37aba94f0e26790ef419b39aeaf9a0a348..dffd966af2018feb25db7020dafee25ec6f97ef4 100644 --- a/NPSimulation/Detectors/Fatima/Fatima.cc +++ b/NPSimulation/Detectors/Fatima/Fatima.cc @@ -167,7 +167,7 @@ void Fatima::ConstructDetector(G4LogicalVolume* world){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Fatima::ConstructDetector(){ if(!m_LogicalDetector){ - + G4Material* Vacuum = MaterialManager::getInstance()->GetMaterialFromLibrary("Vacuum"); G4Material* Alu = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); G4Material* Lead = MaterialManager::getInstance()->GetMaterialFromLibrary("Pb"); @@ -304,41 +304,32 @@ void Fatima::InitializeRootOutput(){ if(!pTree->FindBranch("Fatima")){ pTree->Branch("Fatima", "TFatimaData", &m_Event) ; } - pTree->SetBranchAddress("Fatima", &m_Event) ; + pTree->SetBranchAddress("Fatima", &m_Event) ; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void Fatima::ReadSensitive(const G4Event* event){ +void Fatima::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // LaBr3 - NPS::HitsMap<G4double*>* LaBr3HitMap; - std::map<G4int, G4double**>::iterator LaBr3_itr; - - G4int LaBr3CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Fatima_LaBr3Scorer/FatimaLaBr3"); - LaBr3HitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(LaBr3CollectionID)); - - // Loop on the LaBr3 map - for (LaBr3_itr = LaBr3HitMap->GetMap()->begin() ; LaBr3_itr != LaBr3HitMap->GetMap()->end() ; LaBr3_itr++){ - - G4double* Info = *(LaBr3_itr->second); - - double Energy = RandGauss::shoot(Info[0], EnergyResolution); + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_LaBr3Scorer->GetPrimitive(0); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); + double Energy = RandGauss::shoot(Scorer->GetEnergy(i), EnergyResolution); if(Energy>EnergyThreshold){ - double Time = Info[1]; - int DetectorNbr = (int) Info[2]; + double Time = Scorer->GetTime(i); + int DetectorNbr = level[0]; m_Event->SetFatimaLaBr3E(DetectorNbr,Energy); m_Event->SetFatimaLaBr3T(DetectorNbr,Time); } } - // clear map for next event - LaBr3HitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -354,7 +345,7 @@ void Fatima::InitializeScorers(){ if(already_exist) return; G4VPrimitiveScorer* LaBr3Scorer = - new CALORIMETERSCORERS::PS_Calorimeter("FatimaLaBr3",NestingLevel); + new CalorimeterScorers::PS_Calorimeter("FatimaLaBr3",NestingLevel); //and register it to the multifunctionnal detector m_LaBr3Scorer->RegisterPrimitive(LaBr3Scorer); @@ -362,24 +353,24 @@ void Fatima::InitializeScorers(){ G4SDManager::GetSDMpointer()->AddNewDetector(m_LaBr3Scorer) ; } - //////////////////////////////////////////////////////////////////////////////// - // Construct Method to be pass to the DetectorFactory // - //////////////////////////////////////////////////////////////////////////////// - NPS::VDetector* Fatima::Construct(){ +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPS::VDetector* Fatima::Construct(){ return (NPS::VDetector*) new Fatima(); - } - - //////////////////////////////////////////////////////////////////////////////// - // Registering the construct method to the factory // - //////////////////////////////////////////////////////////////////////////////// - extern"C" { - class proxy_nps_fatima{ - public: - proxy_nps_fatima(){ - NPS::DetectorFactory::getInstance()->AddToken("Fatima","Fatima"); - NPS::DetectorFactory::getInstance()->AddDetector("Fatima",Fatima::Construct); - } -}; +} - proxy_nps_fatima p_nps_fatima; - } +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern"C" { + class proxy_nps_fatima{ + public: + proxy_nps_fatima(){ + NPS::DetectorFactory::getInstance()->AddToken("Fatima","Fatima"); + NPS::DetectorFactory::getInstance()->AddDetector("Fatima",Fatima::Construct); + } + }; + + proxy_nps_fatima p_nps_fatima; +} diff --git a/NPSimulation/Detectors/Foil/Foil.cc b/NPSimulation/Detectors/Foil/Foil.cc index 85c1126f901c8a3c16798d6cd669db426bb4138e..520e3ce8a66ed3202ec5bb5bab4bb792d714ecb4 100644 --- a/NPSimulation/Detectors/Foil/Foil.cc +++ b/NPSimulation/Detectors/Foil/Foil.cc @@ -269,31 +269,22 @@ void Foil::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void Foil::ReadSensitive(const G4Event* event){ +void Foil::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // Calorimeter scorer - NPS::HitsMap<double*>* CaloHitMap; - std::map<G4int, double**>::iterator Calo_itr; - - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("FoilScorer/Calorimeter"); - CaloHitMap = (NPS::HitsMap<double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - double* Info = *(Calo_itr->second); - double Energy = RandGauss::shoot(Info[0],Foil_NS::ResoEnergy); + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_FoilScorer->GetPrimitive(0); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),Foil_NS::ResoEnergy); if(Energy>Foil_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],Foil_NS::ResoTime); - int DetectorNbr = (int) Info[2]; + double Time = RandGauss::shoot(Scorer->GetTime(i),Foil_NS::ResoTime); + int DetectorNbr = Scorer->GetLevel(i)[0]; m_Event->SetEnergy(DetectorNbr,Energy); m_Event->SetTime(DetectorNbr,Time); } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -308,7 +299,7 @@ void Foil::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_Calorimeter("Calorimeter",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ; //and register it to the multifunctionnal detector m_FoilScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_FoilScorer) ; diff --git a/NPSimulation/Detectors/ForwardArray/ForwardArray.cc b/NPSimulation/Detectors/ForwardArray/ForwardArray.cc index 71385a978517517895c473667e28b38887d53430..350072e606f2de7dbd5db052f8e432ca994af7a2 100644 --- a/NPSimulation/Detectors/ForwardArray/ForwardArray.cc +++ b/NPSimulation/Detectors/ForwardArray/ForwardArray.cc @@ -287,37 +287,22 @@ void ForwardArray::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void ForwardArray::ReadSensitive(const G4Event* event){ +void ForwardArray::ReadSensitive(const G4Event*){ m_Event->Clear(); /////////// - // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; - - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ForwardArrayScorer/Calorimeter"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - G4double* Info = *(Calo_itr->second); - double Energy = RandGauss::shoot(Info[0],ForwardArray_NS::ResoEnergy); + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_ForwardArrayScorer->GetPrimitive(0); + + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),ForwardArray_NS::ResoEnergy); if(Energy>ForwardArray_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],ForwardArray_NS::ResoTime); - int DetectorNbr = (int) Info[7]; + double Time = RandGauss::shoot(Scorer->GetTime(i),ForwardArray_NS::ResoTime); + int DetectorNbr = Scorer->GetLevel(i)[0]; m_Event->SetEnergy(DetectorNbr,Energy); m_Event->SetTime(DetectorNbr,Time); - - ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -332,7 +317,7 @@ void ForwardArray::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("Calorimeter",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ; //and register it to the multifunctionnal detector m_ForwardArrayScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_ForwardArrayScorer) ; diff --git a/NPSimulation/Detectors/Helios2/Helios2.cc b/NPSimulation/Detectors/Helios2/Helios2.cc index c2e5f35b0faadae524726ae11441ed8023506dbe..aa2558c62d355add0ce918604f1ec05448417cc1 100644 --- a/NPSimulation/Detectors/Helios2/Helios2.cc +++ b/NPSimulation/Detectors/Helios2/Helios2.cc @@ -47,7 +47,8 @@ // NPTool header #include "Helios2.hh" -#include "SiliconScorers.hh" +#include "DSSDScorers.hh" +#include "InteractionScorers.hh" #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" @@ -117,9 +118,9 @@ G4LogicalVolume* Helios2::BuildSquareTube(){ Helios2_NS::SquareTubeSide*0.5,0.5*(Helios2_NS::SquareTubeExcess+Helios2_NS::WaferLength)); G4Tubs* tubs = new G4Tubs("Helios2_Box",0,Helios2_NS::SquareTubeRadius, - (Helios2_NS::SquareTubeExcess+Helios2_NS::WaferLength),0,360*deg); - - + (Helios2_NS::SquareTubeExcess+Helios2_NS::WaferLength),0,360*deg); + + G4RotationMatrix* R = new G4RotationMatrix(); G4ThreeVector P(0,0,0); G4SubtractionSolid* sub = new G4SubtractionSolid("Helios2_Sub",box,tubs,R,P); @@ -149,15 +150,15 @@ G4LogicalVolume* Helios2::BuildSiliconWafer(){ G4ThreeVector AWPos(0,0,0); G4RotationMatrix* AWRot = new G4RotationMatrix(); new G4PVPlacement(G4Transform3D(*AWRot,AWPos),m_ActiveWafer, - "Helios2_ActiveWafer",m_SiliconWafer, true, 0); + "Helios2_ActiveWafer",m_SiliconWafer, true, 0); m_ActiveWafer->SetSensitiveDetector(m_Helios2Scorer); m_SiliconWafer->SetVisAttributes(m_VisPassiveSilicon); m_ActiveWafer->SetVisAttributes(m_VisSilicon); - - } - + } + + return m_SiliconWafer; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -165,20 +166,20 @@ G4LogicalVolume* Helios2::BuildMagnet(){ if(!m_Magnet){ G4Tubs* tubs1 = new G4Tubs("Helios2_MainFull",0, Helios2_NS::MagnetOutterRadius,Helios2_NS::MagnetLength*0.5,0,360*deg); - + // Inner part of the Soleinoid minus the Target it self (placed in the world) G4SubtractionSolid* tubs = new G4SubtractionSolid("Helios_Main", - tubs1, Target::GetTarget()->GetTargetSolid(), new G4RotationMatrix() ,Target::GetTarget()->GetTargetPosition()); + tubs1, Target::GetTarget()->GetTargetSolid(), new G4RotationMatrix() ,Target::GetTarget()->GetTargetPosition()); G4Tubs* tubs2 = new G4Tubs("Helios2_Mag",Helios2_NS::MagnetInnerRadius, Helios2_NS::MagnetOutterRadius,Helios2_NS::MagnetLength*0.5,0,360*deg); G4Material* Fe= MaterialManager::getInstance()->GetMaterialFromLibrary("Fe"); G4Material* Vc= MaterialManager::getInstance()->GetMaterialFromLibrary("Vacuum"); - + m_Magnet= new G4LogicalVolume(tubs,Vc,"logic_Helios2_Main",0,0,0); G4LogicalVolume* Mag = new G4LogicalVolume(tubs2,Fe,"logic_Helios2_Magnet",0,0,0); - + Mag->SetVisAttributes(m_VisMagnet); m_Magnet->SetVisAttributes(G4VisAttributes::Invisible); // Place the Solenoid @@ -188,7 +189,7 @@ G4LogicalVolume* Helios2::BuildMagnet(){ new G4PVPlacement(G4Transform3D(*MagRot,MagPos), Mag, "Helios2_Magnet",m_Magnet,false,0); - + } return m_Magnet; } @@ -252,7 +253,7 @@ void Helios2::ConstructDetector(G4LogicalVolume* world){ fieldMgr->SetMinimumEpsilonStep( 1*mm); fieldMgr->SetMaximumEpsilonStep( 10*m ); fieldMgr->SetDeltaOneStep( 1 * mm ); - + // Place detectors and support inside it for (unsigned short i = 0 ; i < m_Z.size() ; i++) { G4ThreeVector DetPos; @@ -316,50 +317,44 @@ void Helios2::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void Helios2::ReadSensitive(const G4Event* event){ - m_Event->Clear(); +void Helios2::ReadSensitive(const G4Event* ){ + m_Event->Clear(); /////////// // Resistiverimeter scorer - NPS::HitsMap<G4double*>* ResistiveHitMap; - std::map<G4int, G4double**>::iterator Resistive_itr; - - G4int ResistiveCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Helios2Scorer/Resistive"); - ResistiveHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(ResistiveCollectionID)); - - // Loop on the Resistive map - for (Resistive_itr = ResistiveHitMap->GetMap()->begin() ; Resistive_itr != ResistiveHitMap->GetMap()->end() ; Resistive_itr++){ - G4double* Info = *(Resistive_itr->second); - double EBack = RandGauss::shoot(Info[0]+Info[1],Helios2_NS::ResoEnergyBack); - double TBack = RandGauss::shoot(Info[2],Helios2_NS::ResoTime); - double EUp = RandGauss::shoot(Info[1],Helios2_NS::ResoEnergyFront); - double TUp = RandGauss::shoot(Info[2],Helios2_NS::ResoTime); - double EDw = RandGauss::shoot(Info[0],Helios2_NS::ResoEnergyFront); - double TDw = RandGauss::shoot(Info[2],Helios2_NS::ResoTime); - - if(EBack>Helios2_NS::EnergyThreshold){ - m_Event->SetEBack(Info[3],EBack); - m_Event->SetTBack(Info[3],TBack); - } - - if(EUp>Helios2_NS::EnergyThreshold){ - m_Event->SetEUp(Info[3],EUp); - m_Event->SetTUp(Info[3],TUp); - } - - if(EUp>Helios2_NS::EnergyThreshold){ - m_Event->SetEUp(Info[3],EUp); - m_Event->SetTUp(Info[3],TUp); + DSSDScorers::PS_Resistive* Scorer= (DSSDScorers::PS_Resistive*) m_Helios2Scorer->GetPrimitive(0); + + // Loop on the Back + unsigned int sizeBack = Scorer->GetBackMult(); + for(unsigned int i = 0 ; i < sizeBack ; i++){ + double EBack = RandGauss::shoot(Scorer->GetEnergyBack(i),Helios2_NS::ResoEnergyBack); + double TBack = RandGauss::shoot(Scorer->GetTimeBack(i),Helios2_NS::ResoTime); + if(EBack>Helios2_NS::EnergyThreshold){ + m_Event->SetEBack(Scorer->GetDetectorBack(i),EBack); + m_Event->SetTBack(Scorer->GetDetectorBack(i),TBack); + } } - - if(EDw>Helios2_NS::EnergyThreshold){ - m_Event->SetEDw(Info[3],EDw); - m_Event->SetTDw(Info[3],TDw); + // Loop on the Up + unsigned int sizeUp = Scorer->GetUpMult(); + for(unsigned int i = 0 ; i < sizeUp ; i++){ + double EUp = RandGauss::shoot(Scorer->GetEnergyUp(i),Helios2_NS::ResoEnergyFront); + double TUp = RandGauss::shoot(Scorer->GetTimeUp(i),Helios2_NS::ResoTime); + if(EUp>Helios2_NS::EnergyThreshold){ + m_Event->SetEUp(Scorer->GetDetectorUp(i),EUp); + m_Event->SetTUp(Scorer->GetDetectorUp(i),TUp); + } } - + + // Loop on the Down + unsigned int sizeDown = Scorer->GetDownMult(); + for(unsigned int i = 0 ; i < sizeDown ; i++){ + double EDw = RandGauss::shoot(Scorer->GetEnergyDown(i),Helios2_NS::ResoEnergyFront); + double TDw = RandGauss::shoot(Scorer->GetTimeDown(i),Helios2_NS::ResoTime); + if(EDw>Helios2_NS::EnergyThreshold){ + m_Event->SetEDw(Scorer->GetDetectorDown(i),EDw); + m_Event->SetTDw(Scorer->GetDetectorDown(i),TDw); + } } - // clear map for next event - ResistiveHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -373,9 +368,12 @@ void Helios2::InitializeScorers() { return ; // Otherwise the scorer is initialised - G4VPrimitiveScorer* Resistive= new SILICONSCORERS::PS_Silicon_Resistive("Resistive",1,Helios2_NS::WaferLength,Helios2_NS::WaferWidth,1) ; + G4VPrimitiveScorer* Resistive= new DSSDScorers::PS_Resistive("Resistive",1,Helios2_NS::WaferLength,Helios2_NS::WaferWidth,1) ; //and register it to the multifunctionnal detector m_Helios2Scorer->RegisterPrimitive(Resistive); + G4VPrimitiveScorer* Inter = new InteractionScorers::PS_Interactions("Resistive",ms_InterCoord,1) ; + m_Helios2Scorer->RegisterPrimitive(Inter); + G4SDManager::GetSDMpointer()->AddNewDetector(m_Helios2Scorer) ; } diff --git a/NPSimulation/Detectors/Hira/Hira.cc b/NPSimulation/Detectors/Hira/Hira.cc index 86646704d35c621f19b4eb0039d5f8e2af37e0c5..b68c39c58e45874bd02e8c5ddf49cae5c70bc41b 100644 --- a/NPSimulation/Detectors/Hira/Hira.cc +++ b/NPSimulation/Detectors/Hira/Hira.cc @@ -229,25 +229,18 @@ void Hira::ReadSensitive(const G4Event* event){ // CsI // if(m_build_CsI){ - NPS::HitsMap<G4double*>* CsIHitMap; - std::map<G4int, G4double**>::iterator CsI_itr; - G4int CsICollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Hira_CsIScorer/CsI"); - CsIHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CsICollectionID)); - - // Loop on the CsI map - for (CsI_itr = CsIHitMap->GetMap()->begin() ; CsI_itr != CsIHitMap->GetMap()->end() ; CsI_itr++){ - G4double* Info = *(CsI_itr->second); - double E_CsI = RandGauss::shoot(Info[0],ResoCsI); + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_CsIScorer->GetPrimitive(0); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); + double E_CsI = RandGauss::shoot(Scorer->GetEnergy(i),ResoCsI); if(E_CsI>EnergyThreshold){ m_EventHira->SetHiraCsIEEnergy(E_CsI); - m_EventHira->SetHiraCsIEDetectorNbr((int)Info[3]-1); - m_EventHira->SetHiraCsIECristalNbr((int)Info[2]-1); + m_EventHira->SetHiraCsIEDetectorNbr(level[0]-1); + m_EventHira->SetHiraCsIECristalNbr(level[1]-1); } } - // Clear Map for next event - CsIHitMap->clear(); } - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -281,7 +274,7 @@ void Hira::InitializeScorers(){ m_ThickSiStripScorer->RegisterPrimitive(ThickSiScorer); - G4VPrimitiveScorer* CsIScorer= new CALORIMETERSCORERS::PS_Calorimeter("CsI",NestingLevel); + G4VPrimitiveScorer* CsIScorer= new CalorimeterScorers::PS_Calorimeter("CsI",NestingLevel); m_CsIScorer->RegisterPrimitive(CsIScorer); diff --git a/NPSimulation/Detectors/Lassa/Lassa.cc b/NPSimulation/Detectors/Lassa/Lassa.cc index 0476de1e1e617ba54796298c6e44d3ff74f879ff..857e4f02fac8937047dae1655e1b5dfb0f0e0621 100644 --- a/NPSimulation/Detectors/Lassa/Lassa.cc +++ b/NPSimulation/Detectors/Lassa/Lassa.cc @@ -181,25 +181,18 @@ void Lassa::ReadSensitive(const G4Event* event){ // Clear Map for next event ThickSiHitMap->clear(); - // CsI // - NPS::HitsMap<G4double*>* CsIHitMap; - std::map<G4int, G4double**>::iterator CsI_itr; - G4int CsICollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Lassa_CsIScorer/CsI"); - CsIHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CsICollectionID)); - - // Loop on the CsI map - for (CsI_itr = CsIHitMap->GetMap()->begin() ; CsI_itr != CsIHitMap->GetMap()->end() ; CsI_itr++){ - G4double* Info = *(CsI_itr->second); - double E_CsI = RandGauss::shoot(Info[0],ResoCsI); - if(E_CsI>EnergyThreshold){ - m_EventLassa->SetLassaCsIEEnergy(E_CsI); - m_EventLassa->SetLassaCsIEDetectorNbr((int)Info[3]-1); - m_EventLassa->SetLassaCsIECristalNbr((int)Info[2]-1); + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_CsIScorer->GetPrimitive(0); + + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); + double E_CsI = RandGauss::shoot(Scorer->GetEnergy(i),ResoCsI); + if(E_CsI>EnergyThreshold){ + m_EventLassa->SetLassaCsIEEnergy(E_CsI); + m_EventLassa->SetLassaCsIEDetectorNbr(level[0]-1); + m_EventLassa->SetLassaCsIECristalNbr(level[1]-1); } } - // Clear Map for next event - CsIHitMap->clear(); - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -224,7 +217,7 @@ void Lassa::InitializeScorers(){ m_ThickSiStripScorer->RegisterPrimitive(ThickSiScorer); - G4VPrimitiveScorer* CsIScorer= new CALORIMETERSCORERS::PS_Calorimeter("CsI",NestingLevel); + G4VPrimitiveScorer* CsIScorer= new CalorimeterScorers::PS_Calorimeter("CsI",NestingLevel); m_CsIScorer->RegisterPrimitive(CsIScorer); diff --git a/NPSimulation/Detectors/LightPipe/LightPipe.cc b/NPSimulation/Detectors/LightPipe/LightPipe.cc index 53095a081604186e4cd2d55bf38e6a9459f4caef..b058407638661d993828feee4cfce10e38fc4aac 100644 --- a/NPSimulation/Detectors/LightPipe/LightPipe.cc +++ b/NPSimulation/Detectors/LightPipe/LightPipe.cc @@ -1,18 +1,18 @@ /***************************************************************************** - * Copyright (C) 2009-2018 this file is part of the NPTool Project * + * Copyright (C) 2009-2018 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Greg Christian contact address: gchristian@tamu.edu * + * Original Author: Greg Christian contact address: gchristian@tamu.edu * * * - * Creation Date : July 2018 * + * Creation Date : July 2018 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe LightPipe simulation * + * This class describe LightPipe simulation * * * *---------------------------------------------------------------------------* * Comment: * @@ -224,31 +224,23 @@ void LightPipe::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void LightPipe::ReadSensitive(const G4Event* event){ +void LightPipe::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_LightPipeScorer->GetPrimitive(0); - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("LightPipeScorer/Calorimeter"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - G4double* Info = *(Calo_itr->second); - double Energy = RandGauss::shoot(Info[0],LightPipe_NS::ResoEnergy); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),LightPipe_NS::ResoEnergy); if(Energy>LightPipe_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],LightPipe_NS::ResoTime); - int DetectorNbr = (int) Info[2]; + double Time = RandGauss::shoot(Scorer->GetTime(i),LightPipe_NS::ResoTime); + int DetectorNbr = Scorer->GetLevel(i)[0]; m_Event->SetEnergy(DetectorNbr,Energy); m_Event->SetTime(DetectorNbr,Time); } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -263,7 +255,7 @@ void LightPipe::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_Calorimeter("Calorimeter",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ; //and register it to the multifunctionnal detector m_LightPipeScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_LightPipeScorer) ; diff --git a/NPSimulation/Detectors/MUST2/MUST2Array.cc b/NPSimulation/Detectors/MUST2/MUST2Array.cc index 950046182d705c9fb0bafc476bf1046bda5d1340..1fd12b6eb100b5c2f43280aefc162da4e5e3aeaa 100644 --- a/NPSimulation/Detectors/MUST2/MUST2Array.cc +++ b/NPSimulation/Detectors/MUST2/MUST2Array.cc @@ -41,7 +41,8 @@ // NPS #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" -#include "SiliconScorers.hh" +#include "InteractionScorers.hh" +#include "DSSDScorers.hh" #include "CalorimeterScorers.hh" #include "NPOptionManager.h" // NPL @@ -717,7 +718,7 @@ void MUST2Array::InitializeRootOutput(){ // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void MUST2Array::ReadSensitive(const G4Event* event){ +void MUST2Array::ReadSensitive(const G4Event*){ G4String DetectorNumber; m_Event->Clear(); @@ -727,33 +728,25 @@ void MUST2Array::ReadSensitive(const G4Event* event){ ///////////////////// // Read the Scorer associate to the Silicon Strip - SILICONSCORERS::PS_Silicon_Images* SiScorer = (SILICONSCORERS::PS_Silicon_Images*) m_StripScorer->GetPrimitive(0); - + DSSDScorers::PS_Images* SiScorer = (DSSDScorers::PS_Images*) m_StripScorer->GetPrimitive(0); + bool SiScoredHit; // flag true if first stage scores a hit above threshold set<int> trig; // list of telescope that got a Si trigger - vector<unsigned int> indexes = SiScorer->GetIndexes(); - unsigned int size = indexes.size(); - - for(unsigned int i = 0 ;i<size;i++){ - SiScoredHit= false; - unsigned int index = indexes[i]; - double energy = SiScorer->GetEnergy(index); + unsigned int sizeFront = SiScorer->GetFrontMult(); + unsigned int sizeBack = SiScorer->GetBackMult(); + + for(unsigned int i = 0 ; i < sizeFront ; i++){ + double energy = SiScorer->GetEnergyFront(i); double energyX = RandGauss::shoot(energy, ResoStrip); - double energyY= RandGauss::shoot(energy, ResoStrip); - int detectorNbr = SiScorer->GetDetectorNbr(index); - double time = SiScorer->GetTime(index); - double InterPos_X = SiScorer->GetX(index) ; - double InterPos_Y = SiScorer->GetY(index) ; - double InterPos_Z = SiScorer->GetZ(index) ; - double InterPos_Theta = SiScorer->GetTheta(index) ; - double InterPos_Phi = SiScorer->GetPhi(index) ; + int detectorNbr = SiScorer->GetDetectorFront(i); + double time = SiScorer->GetTimeFront(i); // X if(energyX>0.1*keV){ // above threshold SiScoredHit=true; // Pixel value at interaction point unsigned int a,r,g,b; // pixel - SiScorer->GetARGBFront(indexes[i],a,r,g,b); + SiScorer->GetARGBFront(i,a,r,g,b); b=b+2; g=g+2; if(r==0){ @@ -786,18 +779,26 @@ void MUST2Array::ReadSensitive(const G4Event* event){ m_Event->SetStripXE(detectorNbr,g+1,NPL::EnergyToADC(energyX,0,63,8192,16384)) ; // Time double timeX = TimeOffset - RandGauss::shoot(time, ResoTimeMust); - m_Event->SetStripXT(detectorNbr,b+1,NPL::EnergyToADC(timeX,0,1000,8192,16384)); - } + m_Event->SetStripXT(detectorNbr,g+1,NPL::EnergyToADC(timeX,0,1000,8192,16384)); + } } } } + }; + + for(unsigned int i = 0 ; i < sizeBack ; i++){ + double energy = SiScorer->GetEnergyBack(i); + double energyY = RandGauss::shoot(energy, ResoStrip); + int detectorNbr = SiScorer->GetDetectorBack(i); + double time = SiScorer->GetTimeBack(i); + // Y if(energyY>0.1*keV){ // above threshold SiScoredHit=true; // Pixel value at interaction point unsigned int a,r,g,b; // pixel - SiScorer->GetARGBBack(indexes[i],a,r,g,b); + SiScorer->GetARGBBack(i,a,r,g,b); b=b+2; g=g+2; if(r==0){ @@ -807,7 +808,7 @@ void MUST2Array::ReadSensitive(const G4Event* event){ // Time double timeY = TimeOffset - RandGauss::shoot(time, ResoTimeMust); m_Event->SetStripYT(detectorNbr,b+1,NPL::EnergyToADC(timeY,0,1000,8192,16384)); - } + } else{ // Interstrip Y, keep both strip with shared energy double rand = G4UniformRand(); double energyY1 = rand*energyY; @@ -829,70 +830,39 @@ void MUST2Array::ReadSensitive(const G4Event* event){ m_Event->SetStripYE(detectorNbr,g+1,NPL::EnergyToADC(energyY2,0,63,8192,0)); // Time double timeY = TimeOffset - RandGauss::shoot(time, ResoTimeMust); - m_Event->SetStripYT(detectorNbr,b+1,NPL::EnergyToADC(timeY,0,1000,8192,16384)); + m_Event->SetStripYT(detectorNbr,g+1,NPL::EnergyToADC(timeY,0,1000,8192,16384)); } } } - - // If event passes through first stage fill the Interaction Coordinates - if (SiScoredHit){ - //Always calculated with respect to (0,0,0) - ms_InterCoord->SetDetectedPositionX(InterPos_X) ; - ms_InterCoord->SetDetectedPositionY(InterPos_Y) ; - ms_InterCoord->SetDetectedPositionZ(InterPos_Z) ; - ms_InterCoord->SetDetectedAngleTheta(InterPos_Theta/deg) ; - ms_InterCoord->SetDetectedAnglePhi(InterPos_Phi/deg) ; - } - - } - - // Si(Li) - NPS::HitsMap<G4double*>* SiLiHitMap; - std::map<G4int, G4double**>::iterator SiLi_itr; - - G4int SiLiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiScorer"); - SiLiHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(SiLiCollectionID)); - - // CsI - NPS::HitsMap<G4double*>* CsIHitMap; - std::map<G4int, G4double**>::iterator CsI_itr; - - G4int CsICollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsIScorer"); - CsIHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CsICollectionID)); - - - // Look for SiLi data in Trigg Telescope - std::set<int>::iterator itr; - for(itr=trig.begin();itr!=trig.end();itr++){ - for(SiLi_itr = SiLiHitMap->GetMap()->begin(); SiLi_itr!=SiLiHitMap->GetMap()->end() ; SiLi_itr++){ - G4double* Info = *(SiLi_itr->second); - if(Info[7]==*itr){//matching telescope number - double ESiLi = RandGauss::shoot(Info[0],ResoSiLi); - m_Event->SetSiLiE(Info[7],Info[8],NPL::EnergyToADC(ESiLi,0,250,8192,16384)); - double timeSiLi = RandGauss::shoot(Info[1],ResoTimeMust); - m_Event->SetSiLiT(Info[7],Info[8],NPL::EnergyToADC(timeSiLi,0,1000,16384,8192)); - } - } } - // Look for CsI data in Trigg Telescope - for(itr=trig.begin();itr!=trig.end();itr++){ - for(CsI_itr = CsIHitMap->GetMap()->begin(); CsI_itr!=CsIHitMap->GetMap()->end() ; CsI_itr++){ - G4double* Info = *(CsI_itr->second); - - if(Info[7]==*itr){//matching telescope number - double ECsI = RandGauss::shoot(Info[0],ResoCsI); - m_Event->SetCsIE(Info[7],Info[8],NPL::EnergyToADC(ECsI,0,250,8192,16384)); - double timeCsI = RandGauss::shoot(Info[1],ResoTimeMust); - m_Event->SetCsIT(Info[7],Info[8],NPL::EnergyToADC(timeCsI,0,1000,16384,8192)); - } - } + // Look for 2nd and 3rd stage only if 1st stage is hit + if(SiScoredHit){ + // SiLi // + CalorimeterScorers::PS_Calorimeter* SiLiScorer= (CalorimeterScorers::PS_Calorimeter*) m_SiLiScorer->GetPrimitive(0); + + unsigned int sizeSiLi = SiLiScorer->GetMult(); + for(unsigned int i = 0 ; i < sizeSiLi ; i++){ + double ESiLi = RandGauss::shoot(SiLiScorer->GetEnergy(i),ResoSiLi); + vector<unsigned int> level = SiLiScorer->GetLevel(i); + m_Event->SetSiLiE(level[0],level[1],NPL::EnergyToADC(ESiLi,0,250,8192,16384)); + double timeSiLi = RandGauss::shoot(SiLiScorer->GetTime(i),ResoTimeMust); + m_Event->SetSiLiT(level[0],level[1],NPL::EnergyToADC(timeSiLi,0,1000,16384,8192)); + + } + + // CsI // + CalorimeterScorers::PS_Calorimeter* CsIScorer= (CalorimeterScorers::PS_Calorimeter*) m_CsIScorer->GetPrimitive(0); + + unsigned int sizeCsI = CsIScorer->GetMult(); + for(unsigned int i = 0 ; i < sizeCsI ; i++){ + double ECsI = RandGauss::shoot(CsIScorer->GetEnergy(i),ResoCsI); + vector<unsigned int> level = CsIScorer->GetLevel(i); + m_Event->SetCsIE(level[0],level[1],NPL::EnergyToADC(ECsI,0,250,8192,16384)); + double timeCsI = RandGauss::shoot(CsIScorer->GetTime(i),ResoTimeMust); + m_Event->SetCsIT(level[0],level[1],NPL::EnergyToADC(timeCsI,0,1000,16384,8192)); + } } - - SiScorer->clear(); - // clear map for next event - SiLiHitMap->clear() ; - CsIHitMap->clear() ; } @@ -909,20 +879,27 @@ void MUST2Array::InitializeScorers() { if(already_exist) return; string nptool = getenv("NPTOOL"); - G4VPrimitiveScorer* SiScorer = new SILICONSCORERS::PS_Silicon_Images("SiScorer",nptool+"/NPLib/Detectors/MUST2/ressources/maskFront.png",nptool+"/NPLib/Detectors/MUST2/ressources/maskBack.png",0.01,0.01,0,0,0xffff0000,0); + G4VPrimitiveScorer* SiScorer = + new DSSDScorers::PS_Images("SiScorer",nptool+"/NPLib/Detectors/MUST2/ressources/maskFront.png",nptool+"/NPLib/Detectors/MUST2/ressources/maskBack.png",0.01,0.01,0,0,0xffff0000,0); + + G4VPrimitiveScorer* InterScorer = new InteractionScorers::PS_Interactions("SiScorer",ms_InterCoord,0); + //and register it to the multifunctionnal detector m_StripScorer->RegisterPrimitive(SiScorer); + m_StripScorer->RegisterPrimitive(InterScorer); + + // SiLi Associate Scorer vector<int> SiLi_nesting={3,0}; G4VPrimitiveScorer* SiLiScorer= - new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("SiLiScorer",SiLi_nesting) ; + new CalorimeterScorers::PS_Calorimeter("SiLiScorer",SiLi_nesting) ; m_SiLiScorer->RegisterPrimitive(SiLiScorer); // CsI Associate Scorer vector<int> CsI_nesting = {2,0}; G4VPrimitiveScorer* CsIScorer= - new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("CsIScorer",CsI_nesting, 0) ; + new CalorimeterScorers::PS_Calorimeter("CsIScorer",CsI_nesting, 0) ; m_CsIScorer->RegisterPrimitive(CsIScorer) ; // Add All Scorer to the Global Scorer Manager diff --git a/NPSimulation/Detectors/Microball/Microball.cc b/NPSimulation/Detectors/Microball/Microball.cc index 8eebc2de8066c877e1d11f42f4ee541cb853d903..1546d848e524c1783e1550f353c4a7395e71b858 100644 --- a/NPSimulation/Detectors/Microball/Microball.cc +++ b/NPSimulation/Detectors/Microball/Microball.cc @@ -3025,39 +3025,24 @@ void Microball::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void Microball::ReadSensitive(const G4Event* event){ +void Microball::ReadSensitive(const G4Event*){ m_Event->Clear(); /////////// // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; - - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MicroballScorer/Calorimeter"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_MicroballScorer->GetPrimitive(0); + + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ - G4double* Info = *(Calo_itr->second); - //(Info[0]/2.35)*((Info[0]*1.02)*pow((Info[0]*1.8),.5)) - // double Energy = RandGauss::shoot(Info[0],((Info[0]*1000*1.02/2.35)*pow((Info[0]*1000*1.8),.5)) ); - double Energy = RandGauss::shoot(Info[0],Microball_NS::ResoEnergy); + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),Microball_NS::ResoEnergy); if(Energy>Microball_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],Microball_NS::ResoTime); - int DetectorNbr = (int) Info[7]; + double Time = RandGauss::shoot(Scorer->GetTime(i),Microball_NS::ResoTime); + int DetectorNbr = Scorer->GetLevel(i)[0]; m_Event->SetEnergy(DetectorNbr,Energy); m_Event->SetTime(DetectorNbr,Time); - - ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -3072,7 +3057,7 @@ void Microball::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(0); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("Calorimeter",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ; //and register it to the multifunctionnal detector m_MicroballScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_MicroballScorer) ; diff --git a/NPSimulation/Detectors/Miniball/Miniball.cc b/NPSimulation/Detectors/Miniball/Miniball.cc index 020cb4fe4bd6d7382686f4331807afea081c5ef2..ac37555485b2cd29a4016be9ad118ea742171c76 100644 --- a/NPSimulation/Detectors/Miniball/Miniball.cc +++ b/NPSimulation/Detectors/Miniball/Miniball.cc @@ -242,31 +242,21 @@ void Miniball::ReadSensitive(const G4Event* event){ m_Event->Clear(); /////////// - // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_MiniballScorer->GetPrimitive(0); - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MiniballScorer/Crystal"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - G4double* Info = *(Calo_itr->second); - //(Info[0]/2.35)*((Info[0]*1.02)*pow((Info[0]*1.8),.5)) - // double Energy = RandGauss::shoot(Info[0],((Info[0]*1000*1.02/2.35)*pow((Info[0]*1000*1.8),.5)) ); - double Energy = RandGauss::shoot(Info[0],Miniball_NS::ResoEnergy); + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),Miniball_NS::ResoEnergy); if(Energy>Miniball_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Info[1],Miniball_NS::ResoTime); - int DetectorNbr = (int) Info[7]; - double Angle = RandGauss::shoot(Info[5]/deg,Miniball_NS::ResoAngle); + double Time = RandGauss::shoot(Scorer->GetTime(i),Miniball_NS::ResoTime); + int DetectorNbr = level[0]; + //double Angle = RandGauss::shoot(Info[5]/deg,Miniball_NS::ResoAngle); m_Event->SetEnergy(DetectorNbr,Energy); - m_Event->SetAngle(DetectorNbr,Angle); + //m_Event->SetAngle(DetectorNbr,Angle); m_Event->SetTime(DetectorNbr,Time); } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -281,7 +271,7 @@ void Miniball::InitializeScorers() { // Otherwise the scorer is initialised vector<int> level; level.push_back(1); - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("Crystal",level, 0) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Crystal",level, 0) ; //and register it to the multifunctionnal detector m_MiniballScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_MiniballScorer) ; diff --git a/NPSimulation/Detectors/Nana/Nana.cc b/NPSimulation/Detectors/Nana/Nana.cc index ab52763d3d56b3f8d8d7e4a757d46a388f364a39..f5058b431e26b49a4fc799f47addd98233d35a55 100644 --- a/NPSimulation/Detectors/Nana/Nana.cc +++ b/NPSimulation/Detectors/Nana/Nana.cc @@ -468,33 +468,22 @@ void Nana::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void Nana::ReadSensitive(const G4Event* event){ +void Nana::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// - // LaBr3 - NPS::HitsMap<G4double*>* LaBr3HitMap; - std::map<G4int, G4double**>::iterator LaBr3_itr; - - G4int LaBr3CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Nana_LaBr3Scorer/NanaLaBr3"); - LaBr3HitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(LaBr3CollectionID)); - - // Loop on the LaBr3 map - for (LaBr3_itr = LaBr3HitMap->GetMap()->begin() ; LaBr3_itr != LaBr3HitMap->GetMap()->end() ; LaBr3_itr++){ - - G4double* Info = *(LaBr3_itr->second); - //(Info[0]/2.35)*((Info[0]*1.02)*pow((Info[0]*1.8),.5)) - // double Energy = RandGauss::shoot(Info[0],((Info[0]*1000*1.02/2.35)*pow((Info[0]*1000*1.8),.5)) ); - double Energy = RandGauss::shoot(Info[0],(Info[0]*0.0325637)/(2.35*pow(Info[0]-0.00975335,0.475759))); - if(Energy>EnergyThreshold){ - double Time = Info[1]; - int DetectorNbr = (int) Info[2]; - + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_LaBr3Scorer->GetPrimitive(0); + + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + double E = Scorer->GetEnergy(i); + double Energy = RandGauss::shoot(E,(E*0.0325637)/(2.35*pow(E-0.00975335,0.475759))); + if(Energy>EnergyThreshold){ + double Time = Scorer->GetTime(i); + int DetectorNbr = Scorer->GetLevel(i)[0]; m_Event->SetNanaLaBr3(DetectorNbr,Energy,Energy,(unsigned short) Time,0,0); } } - // clear map for next event - LaBr3HitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -510,7 +499,7 @@ void Nana::InitializeScorers(){ if(already_exist) return; G4VPrimitiveScorer* LaBr3Scorer = - new CALORIMETERSCORERS::PS_Calorimeter("NanaLaBr3",NestingLevel); + new CalorimeterScorers::PS_Calorimeter("NanaLaBr3",NestingLevel); //and register it to the multifunctionnal detector m_LaBr3Scorer->RegisterPrimitive(LaBr3Scorer); diff --git a/NPSimulation/Detectors/NeutronWall/NeutronWall.cc b/NPSimulation/Detectors/NeutronWall/NeutronWall.cc index a2e5b7c3c5bb5c7ff04e309fc867a381fed1de4c..0014aa595a30cf2b63ca7ce8bc560b05f6783bca 100644 --- a/NPSimulation/Detectors/NeutronWall/NeutronWall.cc +++ b/NPSimulation/Detectors/NeutronWall/NeutronWall.cc @@ -379,90 +379,50 @@ void NeutronWall::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAction -void NeutronWall::ReadSensitive(const G4Event* event){ +void NeutronWall::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // Calorimeter scorer - NPS::HitsMap<G4double*>* CaloHitMap; - std::map<G4int, G4double**>::iterator Calo_itr; - - G4int CaloCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("NeutronWallScorer/Calorimeter"); - CaloHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CaloCollectionID)); - - // Loop on the Calo map - for (Calo_itr = CaloHitMap->GetMap()->begin() ; Calo_itr != CaloHitMap->GetMap()->end() ; Calo_itr++){ - - G4double* Info = *(Calo_itr->second); - //double Energy = RandGauss::shoot(Info[0],NeutronWall_NS::ResoEnergy); - double Energy = Info[0]; + CalorimeterScorers::PS_Calorimeter* ScorerWall= (CalorimeterScorers::PS_Calorimeter*) m_NeutronWallScorer->GetPrimitive(0); + + unsigned int sizeWall = ScorerWall->GetMult(); + for(unsigned int i = 0 ; i < sizeWall ; i++){ + vector<unsigned int> level = ScorerWall->GetLevel(i); + double Energy = ScorerWall->GetEnergy(i); if(Energy>NeutronWall_NS::EnergyThreshold){ - //double Time = RandGauss::shoot(Info[1],NeutronWall_NS::ResoTime); - double Time = Info[1]; - int DetectorNbr = (int) Info[8]; - int PadNbr = (int) Info[7]; - //cout << Info[2] << " " << Info[3] << endl; + double Time = ScorerWall->GetTime(i); + int DetectorNbr = level[1]; + int PadNbr = level[0]; m_Event->SetEnergy(DetectorNbr,PadNbr,Energy); m_Event->SetTime(DetectorNbr,PadNbr,Time); - - // Interraction Coordinates - //Info[2]=RandGauss::shoot(Info[2],NeutronWall_NS::ResoPosition) ; - //Info[3]=RandGauss::shoot(Info[3],NeutronWall_NS::Py_Youter/10.0) ; - /*ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ;*/ - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; - - m_Event->Set_NeutronWall_PosX(Info[2]); - m_Event->Set_NeutronWall_PosY(Info[3]); - m_Event->Set_NeutronWall_PosZ(Info[4]); - + //m_Event->Set_NeutronWall_PosX(Info[2]); + //m_Event->Set_NeutronWall_PosY(Info[3]); + //m_Event->Set_NeutronWall_PosZ(Info[4]); } } - // clear map for next event - CaloHitMap->clear(); /////////// // Veto wall scorer - NPS::HitsMap<G4double*>* VetoHitMap; - std::map<G4int, G4double**>::iterator Veto_itr; - - G4int VetoCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("VetoWallScorer/VetoCalorimeter"); - VetoHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(VetoCollectionID)); - - - // Loop on the Calo map - for (Veto_itr = VetoHitMap->GetMap()->begin() ; Veto_itr != VetoHitMap->GetMap()->end() ; Veto_itr++){ - - G4double* Info = *(Veto_itr->second); - //double Energy = RandGauss::shoot(Info[0],NeutronWall_NS::ResoEnergy); - double Energy = Info[0]; + CalorimeterScorers::PS_Calorimeter* ScorerVeto= (CalorimeterScorers::PS_Calorimeter*) m_VetoWallScorer->GetPrimitive(0); + + unsigned int sizeVeto = ScorerVeto->GetMult(); + for(unsigned int i = 0 ; i < sizeVeto ; i++){ + vector<unsigned int> level = ScorerVeto->GetLevel(i); + double Energy = ScorerVeto->GetEnergy(i); if(Energy>NeutronWall_NS::EnergyThreshold){ //double Time = RandGauss::shoot(Info[1],NeutronWall_NS::ResoTime); - double Time = Info[1]; - int DetectorNbr = (int) Info[8]; - int PadNbr = (int) Info[7]; + double Time = ScorerVeto->GetTime(i); + int DetectorNbr = level[1]; + int PadNbr = level[0]; m_Event->SetVetoEnergy(DetectorNbr,PadNbr,Energy); m_Event->SetVetoTime(DetectorNbr,PadNbr,Time); - - // Interraction Coordinates - //Info[2]=RandGauss::shoot(Info[2],NeutronWall_NS::PlasticBar_X/10.0) ; - //Info[3]=RandGauss::shoot(Info[3],NeutronWall_NS::ResoPosition) ; - /*ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ;*/ - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; - - m_Event->Set_VetoWall_PosX(Info[2]); - m_Event->Set_VetoWall_PosY(Info[3]); - m_Event->Set_VetoWall_PosZ(Info[4]); + //m_Event->Set_VetoWall_PosX(Info[2]); + //m_Event->Set_VetoWall_PosY(Info[3]); + //m_Event->Set_VetoWall_PosZ(Info[4]); } } - // clear map for next event - VetoHitMap->clear(); } @@ -482,7 +442,7 @@ void NeutronWall::InitializeScorers() { return ; // Neutron Wall Scorer - G4VPrimitiveScorer* Calorimeter= new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("Calorimeter",level,1) ; + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level,1) ; //and register it to the multifunctional detector m_NeutronWallScorer->RegisterPrimitive(Calorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_NeutronWallScorer) ; @@ -494,7 +454,7 @@ void NeutronWall::InitializeScorers() { if(already_exist) return; - G4VPrimitiveScorer* VetoCalorimeter= new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("VetoCalorimeter",level,1) ; + G4VPrimitiveScorer* VetoCalorimeter= new CalorimeterScorers::PS_Calorimeter("VetoCalorimeter",level,1) ; //and register it to the multifunctional detector m_VetoWallScorer->RegisterPrimitive(VetoCalorimeter); G4SDManager::GetSDMpointer()->AddNewDetector(m_VetoWallScorer) ; diff --git a/NPSimulation/Detectors/Paris/Paris.cc b/NPSimulation/Detectors/Paris/Paris.cc index e9f7c968f1e6feeee4c355bc29962b668c9ff0e0..32c15acce4f50a5a53ed18f0a7b6eb45f5c792be 100644 --- a/NPSimulation/Detectors/Paris/Paris.cc +++ b/NPSimulation/Detectors/Paris/Paris.cc @@ -395,63 +395,46 @@ void Paris::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void Paris::ReadSensitive(const G4Event* event){ +void Paris::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // LaBr3 - NPS::HitsMap<G4double*>* LaBr3HitMap; - std::map<G4int, G4double**>::iterator LaBr3_itr; + CalorimeterScorers::PS_Calorimeter* ScorerLaBr= (CalorimeterScorers::PS_Calorimeter*) m_LaBr3Scorer->GetPrimitive(0); - G4int LaBr3CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Paris_LaBr3Scorer/ParisLaBr3"); - LaBr3HitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(LaBr3CollectionID)); - - // Loop on the LaBr3 map - for (LaBr3_itr = LaBr3HitMap->GetMap()->begin() ; LaBr3_itr != LaBr3HitMap->GetMap()->end() ; LaBr3_itr++){ - - G4double* Info = *(LaBr3_itr->second); - - double Energy = RandGauss::shoot(Info[0],ResoFirstStage); + unsigned int sizeLaBr = ScorerLaBr->GetMult(); + for(unsigned int i = 0 ; i < sizeLaBr ; i++){ + vector<unsigned int> level = ScorerLaBr->GetLevel(i); + double Energy = RandGauss::shoot(ScorerLaBr->GetEnergy(i),ResoFirstStage); if(Energy>EnergyThreshold){ - double Time = Info[1]; - int PhoswichNbr = (int) Info[2]; - int ClusterNbr = (int) Info[3]; - + double Time = ScorerLaBr->GetTime(i); + int PhoswichNbr = level[0]; + int ClusterNbr = level[1]; + m_Event->SetParisLaBr3E(ClusterNbr,PhoswichNbr,Energy); m_Event->SetParisLaBr3T(ClusterNbr,PhoswichNbr,Time); } } - // clear map for next event - LaBr3HitMap->clear(); /////////// // NaI - NPS::HitsMap<G4double*>* NaIHitMap; - std::map<G4int, G4double**>::iterator NaI_itr; - - G4int NaICollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Paris_NaIScorer/ParisNaI"); - NaIHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(NaICollectionID)); - - // Loop on the NaI map - for (NaI_itr = NaIHitMap->GetMap()->begin() ; NaI_itr != NaIHitMap->GetMap()->end() ; NaI_itr++){ - - G4double* Info = *(NaI_itr->second); + CalorimeterScorers::PS_Calorimeter* ScorerNaI= (CalorimeterScorers::PS_Calorimeter*) m_NaIScorer->GetPrimitive(0); - double Energy = RandGauss::shoot(Info[0],ResoSecondStage); + unsigned int sizeNaI = ScorerNaI->GetMult(); + for(unsigned int i = 0 ; i < sizeNaI ; i++){ + vector<unsigned int> level = ScorerNaI->GetLevel(i); + double Energy = RandGauss::shoot(ScorerNaI->GetEnergy(i),ResoSecondStage); if(Energy>EnergyThreshold){ - double Time = Info[1]; - int PhoswichNbr = (int) Info[2]; - int ClusterNbr = (int) Info[3]; - - m_Event->SetParisNaIE(ClusterNbr,PhoswichNbr,Energy); + double Time = ScorerNaI->GetTime(i); + int PhoswichNbr = level[0]; + int ClusterNbr = level[1]; + + m_Event->SetParisNaIE(ClusterNbr,PhoswichNbr,Energy); m_Event->SetParisNaIT(ClusterNbr,PhoswichNbr,Time); } } - - // clear map for next event - NaIHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -468,7 +451,7 @@ void Paris::InitializeScorers(){ if(already_exist) return; G4VPrimitiveScorer* LaBr3Scorer = - new CALORIMETERSCORERS::PS_Calorimeter("ParisLaBr3",NestingLevel); + new CalorimeterScorers::PS_Calorimeter("ParisLaBr3",NestingLevel); //and register it to the multifunctionnal detector m_LaBr3Scorer->RegisterPrimitive(LaBr3Scorer); @@ -484,7 +467,7 @@ void Paris::InitializeScorers(){ if(already_exist) return; G4VPrimitiveScorer* NaIScorer = - new CALORIMETERSCORERS::PS_Calorimeter("ParisNaI",NestingLevel); + new CalorimeterScorers::PS_Calorimeter("ParisNaI",NestingLevel); //and register it to the multifunctionnal detector m_NaIScorer->RegisterPrimitive(NaIScorer); @@ -492,24 +475,24 @@ void Paris::InitializeScorers(){ G4SDManager::GetSDMpointer()->AddNewDetector(m_NaIScorer) ; } - //////////////////////////////////////////////////////////////////////////////// - // Construct Method to be pass to the DetectorFactory // - //////////////////////////////////////////////////////////////////////////////// - NPS::VDetector* Paris::Construct(){ +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPS::VDetector* Paris::Construct(){ return (NPS::VDetector*) new Paris(); - } - - //////////////////////////////////////////////////////////////////////////////// - // Registering the construct method to the factory // - //////////////////////////////////////////////////////////////////////////////// - extern"C" { - class proxy_nps_paris{ - public: - proxy_nps_paris(){ - NPS::DetectorFactory::getInstance()->AddToken("Paris","Paris"); - NPS::DetectorFactory::getInstance()->AddDetector("Paris",Paris::Construct); - } -}; +} - proxy_nps_paris p_nps_proxy; - } +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern"C" { + class proxy_nps_paris{ + public: + proxy_nps_paris(){ + NPS::DetectorFactory::getInstance()->AddToken("Paris","Paris"); + NPS::DetectorFactory::getInstance()->AddDetector("Paris",Paris::Construct); + } + }; + + proxy_nps_paris p_nps_proxy; +} diff --git a/NPSimulation/Detectors/Plastic/Plastic.cc b/NPSimulation/Detectors/Plastic/Plastic.cc index 1eeb8c92be4cc0f59a1da55e15a5732586d07ff2..7db84040408e48103f61adda9790e68768c32234 100644 --- a/NPSimulation/Detectors/Plastic/Plastic.cc +++ b/NPSimulation/Detectors/Plastic/Plastic.cc @@ -367,37 +367,45 @@ void Plastic::ReadSensitive(const G4Event* event){ // Read the Scorer associate to the Silicon Strip //Detector Number - G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/PlasticNumber") ; + static string collectionName; + collectionName = "PlasticScorer/PlasticNumber"; + G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName) ; DetectorNumberHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID)) ; DetectorNumber_itr = DetectorNumberHitMap->GetMap()->begin() ; //Energy - G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/Energy") ; + collectionName = "PlasticScorer/Energy"; + G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName) ; EnergyHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)) ; Energy_itr = EnergyHitMap->GetMap()->begin() ; //Time of Flight - G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/Time") ; + collectionName = "PlasticScorer/Time"; + G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName) ; TimeHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID)) ; Time_itr = TimeHitMap->GetMap()->begin() ; //Interaction Coordinate X - G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordX"); + collectionName = "PlasticScorer/InterCoordX"; + G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName); PosXHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID)); Pos_X_itr = PosXHitMap->GetMap()->begin(); //Interaction Coordinate Y - G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordY"); + collectionName = "PlasticScorer/InterCoordY"; + G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName); PosYHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID)); Pos_Y_itr = PosYHitMap->GetMap()->begin(); //Interaction Coordinate Z - G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordZ"); + collectionName = "PlasticScorer/InterCoordZ"; + G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName); PosZHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID)); Pos_Z_itr = PosZHitMap->GetMap()->begin(); //Interaction Coordinate Theta - G4int InterCoordThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordTheta"); + collectionName = "PlasticScorer/InterCoordTheta"; + G4int InterCoordThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName); AngleThetaHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordThetaCollectionID)); Angle_Theta_itr = AngleThetaHitMap->GetMap()->begin(); diff --git a/NPSimulation/Detectors/Sharc/Sharc.cc b/NPSimulation/Detectors/Sharc/Sharc.cc index b4f802e28c388b05bf73f76db1129d89ac62006f..80034e65769841ed571bd7e8304a707596bc0c6e 100644 --- a/NPSimulation/Detectors/Sharc/Sharc.cc +++ b/NPSimulation/Detectors/Sharc/Sharc.cc @@ -42,7 +42,8 @@ #include "G4UnionSolid.hh" // NPS #include "Sharc.hh" -#include "SiliconScorers.hh" +#include "DSSDScorers.hh" +#include "InteractionScorers.hh" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" // NPL @@ -77,7 +78,11 @@ Sharc::Sharc(){ } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... Sharc::~Sharc(){ + delete m_BOXScorer; + delete m_PADScorer; + delete m_QQQScorer; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -118,34 +123,34 @@ void Sharc::ReadConfiguration(NPL::InputParser parser){ if(NPOptionManager::getInstance()->GetVerboseLevel()) cout << "//// " << blocks.size() << " detectors found " << endl; - vector<string> tokenQQQ = {"Z","R","Phi","ThicknessDetector"}; - vector<string> tokenBOX = {"Z","ThicknessDetector1","ThicknessDetector2","ThicknessDetector3","ThicknessDetector4","ThicknessPAD1","ThicknessPAD2","ThicknessPAD3","ThicknessPAD4"}; - + vector<string> tokenQQQ = {"Z","R","Phi","ThicknessDetector"}; + vector<string> tokenBOX = {"Z","ThicknessDetector1","ThicknessDetector2","ThicknessDetector3","ThicknessDetector4","ThicknessPAD1","ThicknessPAD2","ThicknessPAD3","ThicknessPAD4"}; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ if(blocks[i]->GetMainValue()=="QQQ" && blocks[i]->HasTokenList(tokenQQQ)){ if(NPOptionManager::getInstance()->GetVerboseLevel()) cout << endl << "//// Sharc QQQ " << i+1 << endl; - double Z = blocks[i]->GetDouble("Z","mm"); - double R = blocks[i]->GetDouble("R","mm"); - double Phi = blocks[i]->GetDouble("Phi","deg"); - double Thickness= blocks[i]->GetDouble("ThicknessDetector","micrometer"); - AddQQQDetector(G4ThreeVector(R,Phi,Z),Thickness); + double Z = blocks[i]->GetDouble("Z","mm"); + double R = blocks[i]->GetDouble("R","mm"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + double Thickness= blocks[i]->GetDouble("ThicknessDetector","micrometer"); + AddQQQDetector(G4ThreeVector(R,Phi,Z),Thickness); } else if(blocks[i]->GetMainValue()=="BOX" && blocks[i]->HasTokenList(tokenBOX)){ if(NPOptionManager::getInstance()->GetVerboseLevel()) cout << endl << "//// Sharc Box " << i+1 << endl; - double Z = blocks[i]->GetDouble("Z","mm"); - double Thickness1= blocks[i]->GetDouble("ThicknessDetector1","micrometer"); - double Thickness2= blocks[i]->GetDouble("ThicknessDetector2","micrometer"); - double Thickness3= blocks[i]->GetDouble("ThicknessDetector3","micrometer"); - double Thickness4= blocks[i]->GetDouble("ThicknessDetector4","micrometer"); - double ThicknessPAD1 = blocks[i]->GetDouble("ThicknessPAD1","micrometer"); - double ThicknessPAD2 = blocks[i]->GetDouble("ThicknessPAD2","micrometer"); - double ThicknessPAD3 = blocks[i]->GetDouble("ThicknessPAD3","micrometer"); - double ThicknessPAD4 = blocks[i]->GetDouble("ThicknessPAD4","micrometer"); - AddBoxDetector(Z,Thickness1,Thickness2,Thickness3,Thickness4, - ThicknessPAD1,ThicknessPAD2,ThicknessPAD3,ThicknessPAD4); + double Z = blocks[i]->GetDouble("Z","mm"); + double Thickness1= blocks[i]->GetDouble("ThicknessDetector1","micrometer"); + double Thickness2= blocks[i]->GetDouble("ThicknessDetector2","micrometer"); + double Thickness3= blocks[i]->GetDouble("ThicknessDetector3","micrometer"); + double Thickness4= blocks[i]->GetDouble("ThicknessDetector4","micrometer"); + double ThicknessPAD1 = blocks[i]->GetDouble("ThicknessPAD1","micrometer"); + double ThicknessPAD2 = blocks[i]->GetDouble("ThicknessPAD2","micrometer"); + double ThicknessPAD3 = blocks[i]->GetDouble("ThicknessPAD3","micrometer"); + double ThicknessPAD4 = blocks[i]->GetDouble("ThicknessPAD4","micrometer"); + AddBoxDetector(Z,Thickness1,Thickness2,Thickness3,Thickness4, + ThicknessPAD1,ThicknessPAD2,ThicknessPAD3,ThicknessPAD4); } @@ -387,7 +392,7 @@ void Sharc::ConstructBOXDetector(G4LogicalVolume* world){ new G4PVPlacement(new G4RotationMatrix(0,0,0), PAD_Wafer_Offset-G4ThreeVector(0,0,0.5*PAD_PCB_Thickness-0.5*m_ThicknessPAD[i][j]), logicPADWafer,"PAD_Wafer",logicPADDetector,false,DetNbr); - + new G4PVPlacement(new G4RotationMatrix(0,0,0), G4ThreeVector(0,0,0), logicPADActiveWafer,"PAD_ActiveWafer",logicPADWafer,false,DetNbr); @@ -566,127 +571,120 @@ void Sharc::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void Sharc::ReadSensitive(const G4Event* event){ +void Sharc::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // BOX - NPS::HitsMap<G4double*>* BOXHitMap; - std::map<G4int, G4double**>::iterator BOX_itr; + DSSDScorers::PS_Rectangle* BOXScorer = (DSSDScorers::PS_Rectangle*) m_BOXScorer->GetPrimitive(0); - G4int BOXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_BOXScorer/SharcBOX"); - BOXHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(BOXCollectionID)); // Loop on the BOX map - for (BOX_itr = BOXHitMap->GetMap()->begin() ; BOX_itr != BOXHitMap->GetMap()->end() ; BOX_itr++){ + unsigned int sizeFront= BOXScorer->GetLengthMult(); - G4double* Info = *(BOX_itr->second); + for (unsigned int i=0 ; i<sizeFront ; i++){ - double Energy = Info[0]; + double Energy = BOXScorer->GetEnergyLength(i); if(Energy>EnergyThreshold){ - double Time = Info[1]; - int DetNbr = (int) Info[7]; - int StripFront = (int) Info[8]; - int StripBack = (int) Info[9]; - - m_Event->SetFront_DetectorNbr(DetNbr); - m_Event->SetFront_StripNbr(StripFront); - m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime)); - - m_Event->SetBack_DetectorNbr(DetNbr); - m_Event->SetBack_StripNbr(BOX_Wafer_Back_NumberOfStrip-StripBack+1); - - m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime)); - - // Interraction Coordinates - ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; + double Time = BOXScorer->GetTimeLength(i); + int DetNbr = BOXScorer->GetDetectorLength(i); + int StripFront = BOXScorer->GetStripLength(i); + + m_Event->SetFront(DetNbr, + StripFront, + RandGauss::shoot(Energy, ResoEnergy), + RandGauss::shoot(Time, ResoTime), + RandGauss::shoot(Time, ResoTime)); + } + } + + unsigned int sizeBack= BOXScorer->GetWidthMult(); + for (unsigned int i=0 ; i<sizeBack ; i++){ + + double Energy = BOXScorer->GetEnergyWidth(i); + if(Energy>EnergyThreshold){ + double Time = BOXScorer->GetTimeWidth(i); + int DetNbr = BOXScorer->GetDetectorWidth(i); + int StripBack = BOXScorer->GetStripWidth(i); + + m_Event->SetBack(DetNbr, + BOX_Wafer_Back_NumberOfStrip-StripBack+1, + RandGauss::shoot(Energy, ResoEnergy), + RandGauss::shoot(Time, ResoTime), + RandGauss::shoot(Time, ResoTime)); } } // clear map for next event - BOXHitMap->clear(); - + BOXScorer->clear(); /////////// // PAD - NPS::HitsMap<G4double*>* PADHitMap; - std::map<G4int, G4double**>::iterator PAD_itr; + DSSDScorers::PS_Rectangle* PADScorer = (DSSDScorers::PS_Rectangle*) m_PADScorer->GetPrimitive(0); - G4int PADCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_PADScorer/SharcPAD"); - PADHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(PADCollectionID)); - // Loop on the BOX map - for (PAD_itr = PADHitMap->GetMap()->begin() ; PAD_itr != PADHitMap->GetMap()->end() ; PAD_itr++){ + // Loop on the PAD map + unsigned int sizePAD= PADScorer->GetLengthMult(); + for (unsigned int i=0 ; i<sizePAD ; i++){ - G4double* Info = *(PAD_itr->second); + double Energy = PADScorer->GetEnergyLength(i); - double Energy = Info[0]; if(Energy>EnergyThreshold){ - double Time = Info[1]; - int DetNbr = (int) Info[7]; + double Time = PADScorer->GetTimeLength(i); + int DetNbr = PADScorer->GetDetectorLength(i); - m_Event->SetPAD_DetectorNbr(DetNbr); - m_Event->SetPAD_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetPAD_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetPAD_TimeLED(RandGauss::shoot(Time, ResoTime)); + m_Event->SetPAD(DetNbr, + RandGauss::shoot(Energy, ResoEnergy), + RandGauss::shoot(Time, ResoTime), + RandGauss::shoot(Time, ResoTime)); } - } + } // clear map for next event - PADHitMap->clear(); + PADScorer->clear(); /////////// // QQQ - NPS::HitsMap<G4double*>* QQQHitMap; - std::map<G4int, G4double**>::iterator QQQ_itr; + DSSDScorers::PS_Annular* QQQScorer = (DSSDScorers::PS_Annular*) m_QQQScorer->GetPrimitive(0); - G4int QQQCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_QQQScorer/SharcQQQ"); - QQQHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(QQQCollectionID)); + // Loop on the QQQ map + unsigned int sizeRing= QQQScorer->GetRingMult(); - // Loop on the BOX map - for (QQQ_itr = QQQHitMap->GetMap()->begin() ; QQQ_itr != QQQHitMap->GetMap()->end() ; QQQ_itr++){ + for (unsigned int i=0 ; i<sizeRing ; i++){ - G4double* Info = *(QQQ_itr->second); + double Energy = QQQScorer->GetEnergyRing(i); - double Energy = Info[0]; if(Energy>EnergyThreshold){ - double Time = Info[1]; - int DetNbr = (int) Info[7]; - int StripFront = (int) Info[8]; - int StripBack = (int) Info[9]; - - m_Event->SetFront_DetectorNbr(DetNbr); - m_Event->SetFront_StripNbr(QQQ_Wafer_NumberOf_AnnularStrip-StripFront+1); // Order is reverse (1 is outtermost strip) - - m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime)); - - m_Event->SetBack_DetectorNbr(DetNbr); - m_Event->SetBack_StripNbr(StripBack); - m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime)); - - // Interraction Coordinates - ms_InterCoord->SetDetectedPositionX(Info[2]) ; - ms_InterCoord->SetDetectedPositionY(Info[3]) ; - ms_InterCoord->SetDetectedPositionZ(Info[4]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg) ; + double Time = QQQScorer->GetTimeRing(i); + int DetNbr = QQQScorer->GetDetectorRing(i); + int StripRing = QQQScorer->GetStripRing(i); + m_Event->SetFront(DetNbr, + QQQ_Wafer_NumberOf_AnnularStrip-StripRing+1, + RandGauss::shoot(Energy, ResoEnergy), + RandGauss::shoot(Time, ResoTime), + RandGauss::shoot(Time, ResoTime)); } - } + } + unsigned int sizeSector= QQQScorer->GetSectorMult(); + for (unsigned int i=0 ; i<sizeSector ; i++){ + + double Energy = QQQScorer->GetEnergySector(i); + + if(Energy>EnergyThreshold){ + double Time = QQQScorer->GetTimeSector(i); + int DetNbr = QQQScorer->GetDetectorSector(i); + int StripSector = QQQScorer->GetStripSector(i); + + m_Event->SetBack(DetNbr, + StripSector, + RandGauss::shoot(Energy, ResoEnergy), + RandGauss::shoot(Time, ResoTime), + RandGauss::shoot(Time, ResoTime)); + } + } // clear map for next event - QQQHitMap->clear(); + QQQScorer->clear(); } @@ -698,37 +696,44 @@ void Sharc::InitializeScorers(){ m_BOXScorer = CheckScorer("Sharc_BOXScorer",already_exist); m_PADScorer = CheckScorer("Sharc_PADScorer",already_exist); m_QQQScorer = CheckScorer("Sharc_QQQScorer",already_exist); - // if the scorer were created previously nothing else need to be made if(already_exist) return; G4VPrimitiveScorer* BOXScorer = - new SILICONSCORERS::PS_Silicon_Rectangle("SharcBOX",0, + new DSSDScorers::PS_Rectangle("SharcBOX",0, BOX_ActiveWafer_Length, BOX_ActiveWafer_Width, BOX_Wafer_Front_NumberOfStrip , BOX_Wafer_Back_NumberOfStrip); G4VPrimitiveScorer* PADScorer = - new SILICONSCORERS::PS_Silicon_Rectangle("SharcPAD",0, + new DSSDScorers::PS_Rectangle("SharcPAD",0, PAD_Wafer_Length, PAD_Wafer_Width, 1 , 1); G4VPrimitiveScorer* QQQScorer = - new SILICONSCORERS::PS_Silicon_Annular("SharcQQQ",0, + new DSSDScorers::PS_Annular("SharcQQQ",0, QQQ_Wafer_Inner_Radius, QQQ_Wafer_Outer_Radius, QQQ_Wafer_Starting_Phi, QQQ_Wafer_Stopping_Phi, QQQ_Wafer_NumberOf_AnnularStrip, QQQ_Wafer_NumberOf_RadialStrip,1); - + + G4VPrimitiveScorer* InterScorerBOX = + new InteractionScorers::PS_Interactions("SharcBOXInteractionScorer",ms_InterCoord,0); + + G4VPrimitiveScorer* InterScorerQQQ = + new InteractionScorers::PS_Interactions("SharcQQQInteractionScorer",ms_InterCoord,0); + //and register it to the multifunctionnal detector m_BOXScorer->RegisterPrimitive(BOXScorer); + m_BOXScorer->RegisterPrimitive(InterScorerBOX); m_PADScorer->RegisterPrimitive(PADScorer); m_QQQScorer->RegisterPrimitive(QQQScorer); + m_QQQScorer->RegisterPrimitive(InterScorerQQQ); // Add All Scorer to the Global Scorer Manager G4SDManager::GetSDMpointer()->AddNewDetector(m_BOXScorer) ; diff --git a/NPSimulation/Detectors/TNT/TNT.cc b/NPSimulation/Detectors/TNT/TNT.cc index 5da3f990161257be50318f2545ce04f3870d5b38..6c99830f65ac817bc87a3ebd2ef4dd6e63881d35 100644 --- a/NPSimulation/Detectors/TNT/TNT.cc +++ b/NPSimulation/Detectors/TNT/TNT.cc @@ -357,8 +357,6 @@ void TNT::ReadSensitive(const G4Event* event){ // cout << DetectorNbr << " " << Energy << " " << Time << " " << endl; } } - // clear map for next event - CaloHitMap->clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/EventGenerator/CMakeLists.txt b/NPSimulation/EventGenerator/CMakeLists.txt index a06b1154c6deefb2bf13119c77cb5cadbc3d3713..675b443c06a292e419dc3b95e08fbfd2fe4d0fd9 100644 --- a/NPSimulation/EventGenerator/CMakeLists.txt +++ b/NPSimulation/EventGenerator/CMakeLists.txt @@ -1,2 +1,2 @@ -add_library(NPSEventGenerator OBJECT EventGeneratorParticleDecay.cc EventGeneratorBeam.cc EventGeneratorTwoBodyReaction.cc EventGeneratorMultipleParticle.cc EventGeneratorGammaDecay.cc EventGeneratorIsotropic.cc VEventGenerator.cc) +add_library(NPSEventGenerator OBJECT EventGeneratorBeam.cc EventGeneratorMultipleParticle.cc EventGeneratorIsotropic.cc VEventGenerator.cc) #target_link_libraries(NPSEventGenerator ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPInitialConditions -lNPInteractionCoordinates ) diff --git a/NPSimulation/EventGenerator/EventGeneratorGammaDecay.cc b/NPSimulation/EventGenerator/EventGeneratorGammaDecay.cc deleted file mode 100644 index af815fab7e4fc5eded5ac4fa081b5e88b1e457fa..0000000000000000000000000000000000000000 --- a/NPSimulation/EventGenerator/EventGeneratorGammaDecay.cc +++ /dev/null @@ -1,280 +0,0 @@ -/***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * - * * - * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * - * For the list of contributors see $NPTOOL/Licence/Contributors * - *****************************************************************************/ - -/***************************************************************************** - * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * - * * - * Creation Date : May 2012 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This event Generator is used to simulated a gamma decay of nuclei genera-* - * ted by previous event generator. Multiple cases are supported: * - * - Only one gamma is emmited, in this case a Cross section can be given * - * - A cascade decay, in this case the CS is ignore * - * - If more than one cascade are given, Branching Ratio could be given * - * * - *---------------------------------------------------------------------------* - * Comment: * - * * - * * - * * - *****************************************************************************/ - -#include "EventGeneratorGammaDecay.hh" - -// NPS -#include "Particle.hh" - -// NPL -#include "NPOptionManager.h" -#include "NPFunction.h" -#include "NPInputParser.h" -using namespace NPL; - -// G4 headers including CLHEP headers -// for generating random numbers -#include "Randomize.hh" - -// G4 -#include "G4ParticleTable.hh" -#include "G4IonTable.hh" -// ROOT -#include "TLorentzVector.h" -#include "TVector3.h" -#include "TF1.h" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -EventGeneratorGammaDecay::EventGeneratorGammaDecay(){ - m_ParticleStack = ParticleStack::getInstance(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -EventGeneratorGammaDecay::~EventGeneratorGammaDecay(){ - m_CrossSectionHist.clear(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorGammaDecay::ReadConfiguration(NPL::InputParser parser){ - vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GammaCascade"); - vector<string> token = {"BranchingRatio","Energies"}; - - for(unsigned int i = 0 ; i < blocks.size() ; i++){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "\033[1;35m//// Cascade for nuclei " << blocks[i]->GetMainValue() << endl; - if(m_NucleiName=="") - m_NucleiName = blocks[i]->GetMainValue(); - - else if(m_NucleiName!=blocks[i]->GetMainValue()){ - cout << "ERROR: The decay of only one nuclei is presently supported\033[0m" << endl; - exit(1); - } - - vector<double> E = blocks[i]->GetVectorDouble("Energies","MeV"); - double BranchingRatio = blocks[i]->GetDouble("BranchingRatio","void"); - vector<string> CS; - if(blocks[i]->HasToken("DifferentialCrossSection")) - CS = blocks[i]->GetVectorString("DifferentialCrossSection"); - - // Sanity Check - if(E.size()>1 && CS.size()>0){ - cout << "ERROR: Cannot use Cross section with decay of multiple gamma" << endl; - } - - if(CS.size()>0) - AddCascade(E, BranchingRatio, CS[0] , CS[1]); - else - AddCascade(E, BranchingRatio); - } - - PrepareCascade(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorGammaDecay::GenerateEvent(G4Event*){ - - // Choose a Cascade to follow - int ChoosenCascade = -1; - double RandomNumber = RandFlat::shoot(); - - for (unsigned int i = 1; i<m_BranchingRatio.size(); i++) { - if(RandomNumber > m_BranchingRatio[i-1] && RandomNumber< m_BranchingRatio[i]) - ChoosenCascade=i; - } - - if (ChoosenCascade==-1) ChoosenCascade=0; - - // Look for the decaying nucleus - Particle decayingParticle = m_ParticleStack->SearchAndRemoveParticle(m_NucleiName); - - if(decayingParticle.GetParticleDefinition()==NULL){ - G4cout << "Gamma Decay Warning: The decaying particle " << m_NucleiName - << " was not found in the particle stack " << G4endl; - return ; - } - // Check for energies conservation (i.e: Cascade Energies lower than Excitation energie) - string ExcitationString = decayingParticle.GetParticleDefinition()->GetParticleName(); - ExcitationString.erase(0,m_NucleiName.length()+1); - ExcitationString.erase(ExcitationString.length()-1,ExcitationString.length()); - double ExcitationEnergy = atof(ExcitationString.c_str())*keV; - - // Compute the final excitation energy of the decaying nuclei - double FinalExcitationEnergy = ExcitationEnergy-m_CascadeTotalEnergy[ChoosenCascade]; - if(FinalExcitationEnergy<0){ - G4cout << "Gamma Decay Warning: The cascade energy exceed the excitation energy of the decaying nuclei: " - << G4endl << " Excitation Energy : " << ExcitationEnergy - << G4endl << " Cascade Energy : " << m_CascadeTotalEnergy[ChoosenCascade] << G4endl; - FinalExcitationEnergy=0; - } - - // Put back the decaying nucleus with its new excitation energy - G4ParticleDefinition* FinalParticleDefition - = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(decayingParticle.GetParticleDefinition()->GetAtomicNumber(), decayingParticle.GetParticleDefinition()->GetAtomicMass(), FinalExcitationEnergy*MeV); - - Particle FinalParticle = Particle( FinalParticleDefition, - decayingParticle.GetParticleThetaCM(), - decayingParticle.GetParticleKineticEnergy(), - decayingParticle.GetParticleMomentumDirection(), - decayingParticle.GetParticlePosition(), - decayingParticle.GetShootStatus()); - - m_ParticleStack->AddParticleToStack(FinalParticle); - - // Instantiate and add the gamma to the particle stack - for (unsigned int i = 0; i < m_Energies[ChoosenCascade].size(); i++) { - G4ParticleDefinition* gammaDefinition = G4ParticleTable::GetParticleTable()->FindParticle("gamma"); - G4ThreeVector gammaDirection; - double theta=0; - double phi=0; - // If more than one gamma shoot no cross section to follow - if(m_Energies[ChoosenCascade].size()>1){ - - // Shoot flat in cos(theta) and Phi to have isotropic emission - double cos_theta = -1+2*RandFlat::shoot(); - theta = acos(cos_theta); - phi = RandFlat::shoot()*2.*pi; - - gammaDirection= G4ThreeVector( cos(phi)*sin(theta), - sin(phi)*sin(theta), - cos(theta)); - } - - // Only one gamma to shoot, use the given cross section - else{ - theta = m_CrossSectionHist[ChoosenCascade]->GetRandom()*deg; - phi = RandFlat::shoot() * 2. *pi; - gammaDirection= G4ThreeVector( cos(phi)*sin(theta), - sin(phi)*sin(theta), - cos(theta)); - } - - // Doppler shifted gamma emission - decayingParticle.GetParticleMomentumDirection(); - double gammaEnergy = m_Energies[ChoosenCascade][i]; - TLorentzVector GammaLV( gammaEnergy*cos(phi)*sin(theta), - gammaEnergy*sin(phi)*sin(theta), - gammaEnergy*cos(theta), - gammaEnergy); - - double NucleiEnergy= decayingParticle.GetParticleKineticEnergy()+FinalParticleDefition->GetPDGMass(); - double NucleiMomentum= sqrt(NucleiEnergy*NucleiEnergy-FinalParticleDefition->GetPDGMass()*FinalParticleDefition->GetPDGMass()); - TLorentzVector NuvleiLV( NucleiMomentum*decayingParticle.GetParticleMomentumDirection().x(), - NucleiMomentum*decayingParticle.GetParticleMomentumDirection().y(), - NucleiMomentum*decayingParticle.GetParticleMomentumDirection().z(), - NucleiEnergy); - - GammaLV.Boost(NuvleiLV.BoostVector()); - gammaDirection= G4ThreeVector( GammaLV.Px(), - GammaLV.Py(), - GammaLV.Pz()); - // Add the gamma to the stack - Particle gammaParticle(gammaDefinition,theta,GammaLV.E(),gammaDirection, decayingParticle.GetParticlePosition()); - m_ParticleStack->AddParticleToStack(gammaParticle); - } - -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorGammaDecay::SetTarget(Target* Target){ - m_Target = Target; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorGammaDecay::AddCascade(vector<double> Energies, double BranchingRatio, string CrossSectionPath, string CrossSectionName){ - m_BranchingRatio.push_back(BranchingRatio); - m_CrossSectionPath.push_back(CrossSectionPath); - m_CrossSectionName.push_back(CrossSectionName); - m_Energies.push_back(Energies); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorGammaDecay::PrepareCascade(){ - // Change the given branching ratio so total is one (always have a decay during the event) - double TotalRatio=0; - for (unsigned int i = 0; i < m_BranchingRatio.size(); i++) { - TotalRatio+=m_BranchingRatio[i]/100.; - } - - // Check that the total ratio is not over 100% (below is allowed) - if(TotalRatio>1) { - cout << "Gamma Decay Error: Sum of branching ratio is over 100%" << endl; - exit(1); - } - - for (unsigned int i = 0; i < m_BranchingRatio.size(); i++) { - m_BranchingRatio[i]=(m_BranchingRatio[i]/TotalRatio)/100.; - } - - // Shift the Branching ratio for faster shooting during event generation - for (unsigned int i = 1; i < m_BranchingRatio.size(); i++) { - m_BranchingRatio[i]=m_BranchingRatio[i-1]+m_BranchingRatio[i]; - } - - // Compute the total energy of the cascade - double TotalEnergy=0; - for (unsigned int i = 0 ; i < m_Energies.size(); i++) { - TotalEnergy=0; - for (unsigned int j = 0; j < m_Energies[i].size(); j++) { - TotalEnergy+=m_Energies[i][j]; - } - m_CascadeTotalEnergy.push_back(TotalEnergy); - } - - // Transform the particle name to G4 standard: i.e: 10He -> He10 - m_NucleiName = m_ParticleStack->ChangeNameToG4Standard(m_NucleiName); - if (m_NucleiName=="proton" || - m_NucleiName=="deuteron" || - m_NucleiName=="triton" || - m_NucleiName=="3He" || - m_NucleiName=="alpha" ){ - G4cout << "Gamma Decay Error: Gamma Decay not allowed for light particles" << G4endl; - exit(1); - } - - /// Load the differential cross section - for (unsigned int i = 0; i < m_BranchingRatio.size(); i++) { - TH1F* h ; - - if(m_CrossSectionPath[i]!="_void_"){ - h = Read1DProfile(m_CrossSectionPath[i],m_CrossSectionName[i]); - TF1* sinus = new TF1("sinus","1/sin(x*3.141592653589793/180.)",0,180); - h->Divide(sinus,1); - delete sinus; - } - - else{ - int offset = 0; - while(gDirectory->FindObjectAny(Form("_gammavoid_%i",offset))!=0) - ++offset; - - h = new TH1F(Form("_gammavoid_%i",offset),Form("_gammavoid_%i",offset),1,0,1); - } - - m_CrossSectionHist.push_back(h); - } -} - diff --git a/NPSimulation/EventGenerator/EventGeneratorGammaDecay.hh b/NPSimulation/EventGenerator/EventGeneratorGammaDecay.hh deleted file mode 100644 index 26d6806d138726d7cb531a3b5cc3915f46293bd7..0000000000000000000000000000000000000000 --- a/NPSimulation/EventGenerator/EventGeneratorGammaDecay.hh +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef EventGeneratorGammaDecay_H -#define EventGeneratorGammaDecay_H -/***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * - * * - * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * - * For the list of contributors see $NPTOOL/Licence/Contributors * - *****************************************************************************/ - -/***************************************************************************** - * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * - * * - * Creation Date : May 2012 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This event Generator is used to simulated a gamma decay of nuclei genera-* - * ted by previous event generator. Multiple cases are supported: * - * - Only one gamma is emmited, in this case a Cross section can be given * - * - A cascade decay, in this case the CS is ignore * - * - If more than one cascade are given, Branching Ratio could be given * - * * - * Using the "Source Token" the class can be used to simulate gamma ray sou-* - * rce and Doppler shifted gamma rays. * - *---------------------------------------------------------------------------* - * Comment: * - * * - * * - * * - *****************************************************************************/ - -// STL -#include <string> -#include <iostream> -using namespace std; -// NPSimulation -#include "VEventGenerator.hh" -#include "Target.hh" -#include "ParticleStack.hh" -#include "NPInputParser.h" -// ROOT -#include "TH1F.h" - - - -class EventGeneratorGammaDecay : public NPS::VEventGenerator{ -public: // Constructor and destructor - EventGeneratorGammaDecay(); - ~EventGeneratorGammaDecay(); - -public: // Inherit from VEventGenerator class - void ReadConfiguration(NPL::InputParser); - void GenerateEvent(G4Event*); - void SetTarget(Target* Target) ; - -private: // Target Parameter - Target* m_Target; - - -private: // The decaying nuclei - string m_NucleiName; -private: // the gamma rays property - vector<double> m_BranchingRatio; - vector<string> m_CrossSectionPath; - vector<string> m_CrossSectionName; - vector<TH1F*> m_CrossSectionHist; - vector<double> m_CascadeTotalEnergy; - vector< vector<double> > m_Energies; - -private: // Pointer to the Particle stack for faster acces - ParticleStack* m_ParticleStack; -public: // Managing the different cascade - // Add a new cascade - void AddCascade(vector<double> Energies, double BranchingRatio=-1, string CrossSectionPath="_void_" , string CrossSectionName = "_void_"); - // Read all the added cscade en instentiate every thing that is needed - void PrepareCascade(); -}; -#endif diff --git a/NPSimulation/EventGenerator/EventGeneratorParticleDecay.cc b/NPSimulation/EventGenerator/EventGeneratorParticleDecay.cc deleted file mode 100644 index 40e5e8b4637019cc3b76c1ec31c35c7c4165c9d2..0000000000000000000000000000000000000000 --- a/NPSimulation/EventGenerator/EventGeneratorParticleDecay.cc +++ /dev/null @@ -1,322 +0,0 @@ -/***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * - * * - * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * - * For the list of contributors see $NPTOOL/Licence/Contributors * - *****************************************************************************/ - -/***************************************************************************** - * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * - * * - * Creation Date : May 2012 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This event Generator is used to simulated the particle decay of nuclei * - * generated by previous event generator. Multiple cases are supported: * - * - Only one particle is emmited, in this case a Cross section can be given* - * - If Multiple particle are emitted, a Phase Space generator is used * - * * - *---------------------------------------------------------------------------* - * Comment: * - * * - * * - * * - *****************************************************************************/ - -#include "EventGeneratorParticleDecay.hh" - -// NPS -#include "Particle.hh" - -// G4 -#include "G4ParticleTable.hh" -#include "G4IonTable.hh" - -// G4 headers including CLHEP headers -// for generating random numbers -#include "Randomize.hh" - -// NPL -#include "NPNucleus.h" -#include "NPOptionManager.h" -using namespace NPL; - -// ROOT -#include "TLorentzVector.h" -#include "TVector3.h" -#include "TF1.h" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -EventGeneratorParticleDecay::EventGeneratorParticleDecay(){ - m_ParticleStack = ParticleStack::getInstance(); -} - -EventGeneratorParticleDecay::~EventGeneratorParticleDecay(){ -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorParticleDecay::ReadConfiguration(NPL::InputParser parser){ - - vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("ParticleDecay"); - - m_MotherNucleiName = blocks[0]->GetMainValue(); - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "\033[1;35m//// Particle decay found for" << m_MotherNucleiName << endl; - - vector<string> token = {"Daughter","shoot"}; - vector<string> DaughterName; - vector<int> shoot; - vector<double> ExcitationEnergy; - string CSPath = "TGenPhaseSpace"; - string CSName = ""; - for(unsigned int i = 0 ; i < blocks.size() ; i++){ - if(blocks[i]->HasTokenList(token)){ - DaughterName = blocks[i]->GetVectorString("Daughter"); - shoot = blocks[i]->GetVectorInt("shoot"); - - if(blocks[i]->HasToken("ExcitationEnergy")) - ExcitationEnergy = blocks[i]->GetVectorDouble("ExcitationEnergy","MeV"); - - if(blocks[i]->HasToken("DifferentialCrossSection")){ - vector<string> cs = blocks[i]->GetVectorString("DifferentialCrossSection"); - CSPath = cs[0]; CSName=cs[1]; - } - - } - else{ - cout << "ERROR: check your input file formatting \033[0m" << endl; - exit(1); - } - } - - if(ExcitationEnergy.size()==0) - ExcitationEnergy.resize(DaughterName.size(),0); - - SetDecay(DaughterName,shoot,ExcitationEnergy,CSPath,CSName); - cout << "\033[0m" ; - -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorParticleDecay::GenerateEvent(G4Event*){ - // Look for the decaying nucleus - Particle decayingParticle = m_ParticleStack->SearchAndRemoveParticle(m_MotherNucleiName); - if(decayingParticle.GetParticleDefinition()==NULL){ - G4cout << "Particle Decay Warning: The decaying particle " << m_MotherNucleiName - << " was not found in the particle stack " << G4endl; - return ; - } - - G4ParticleDefinition* decayingParticleDefinition = decayingParticle.GetParticleDefinition(); - // Build the decaying particle four momenta vector: - - double NucleiEnergy= decayingParticle.GetParticleKineticEnergy()+decayingParticleDefinition->GetPDGMass(); - - double NucleiMomentum=sqrt(NucleiEnergy*NucleiEnergy - - decayingParticleDefinition->GetPDGMass()*decayingParticleDefinition->GetPDGMass()); - - G4ThreeVector Momentum = decayingParticle.GetParticleMomentumDirection().unit(); - - // Case of one particle decaying with a user given cross section - if(m_DifferentialCrossSection!="TGenPhaseSpace"){ - TLorentzVector NucleiLV( NucleiMomentum*Momentum.x(), - NucleiMomentum*Momentum.y(), - NucleiMomentum*Momentum.z(), - NucleiEnergy); - // Shoot the angle in Center of Mass (CM) frame - G4double ThetaCM = m_CrossSectionHist->GetRandom()* deg; - G4double phi = RandFlat::shoot()*2.*pi; - - // Build daughter particule CM LV - // Pre compute variable for the decay - double M = decayingParticleDefinition->GetPDGMass(); - double m1 = m_DaughterNuclei[0]->GetPDGMass(); - double m2 = m_DaughterNuclei[1]->GetPDGMass(); - - if(M<(m1+m2)) - G4cout << "Warning: Particle Decay forbiden by kinematic, no particle emitted "<<endl; - - else { - double Energy = ( 1./(2.*M) )*( M*M + m1*m1 - m2*m2); - double Momentum1 = sqrt(Energy*Energy - m1*m1); - - TVector3 FirstDaughterMomentum = Momentum1 * TVector3( sin(ThetaCM) * cos(phi), - sin(ThetaCM) * sin(phi), - cos(ThetaCM)); - - TLorentzVector FirstDaughterLV(FirstDaughterMomentum,Energy); - - FirstDaughterLV.Boost( NucleiLV.BoostVector() ); - TLorentzVector SecondDaughterLV = NucleiLV - FirstDaughterLV; - - G4ThreeVector DaughterDirection = G4ThreeVector( FirstDaughterLV.X() , - FirstDaughterLV.Y() , - FirstDaughterLV.Z() ); - - Particle FirstDaughterParticle( m_DaughterNuclei[0], - ThetaCM, - FirstDaughterLV.E()-m_DaughterNuclei[0]->GetPDGMass(), - DaughterDirection.unit(), - decayingParticle.GetParticlePosition(), - m_shoot[0]); - - DaughterDirection = G4ThreeVector( SecondDaughterLV.X() , - SecondDaughterLV.Y() , - SecondDaughterLV.Z() ); - - Particle SecondDaughterParticle( m_DaughterNuclei[1], - ThetaCM+M_PI, - SecondDaughterLV.E()-m_DaughterNuclei[1]->GetPDGMass(), - DaughterDirection.unit(), - decayingParticle.GetParticlePosition(), - m_shoot[1]); - - m_ParticleStack->AddParticleToStack(FirstDaughterParticle); - m_ParticleStack->AddParticleToStack(SecondDaughterParticle); - } - - } - - // Case of a TGenPhaseSpace - else{ - TLorentzVector NucleiLV( NucleiMomentum*Momentum.x()/GeV, - NucleiMomentum*Momentum.y()/GeV, - NucleiMomentum*Momentum.z()/GeV, - NucleiEnergy/GeV); - - if( !m_TPhaseSpace.SetDecay(NucleiLV, m_DaughterNuclei.size(), m_Masses) ) - G4cout << "Warning: Phase Space Decay forbiden by kinematic, or more than 18 particles, no particle emitted "<<endl; - - else{ - m_TPhaseSpace.Generate(); - - TLorentzVector* daughterLV ; - double KineticEnergy; - - for (unsigned int i = 0 ; i < m_DaughterNuclei.size(); i++) { - - daughterLV = m_TPhaseSpace.GetDecay(i); - G4ThreeVector daughterDirection = G4ThreeVector( daughterLV->X() , - daughterLV->Y() , - daughterLV->Z() ); - - KineticEnergy = daughterLV->E()-m_Masses[i] ; - - Particle daughterParticle( m_DaughterNuclei[i], - -1, - KineticEnergy*GeV, - daughterDirection.unit(), - decayingParticle.GetParticlePosition(), - m_shoot[i]); - m_ParticleStack->AddParticleToStack(daughterParticle); - } - } - } -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorParticleDecay::SetTarget(Target* Target){ - m_Target = Target; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorParticleDecay::SetDecay(vector<string> DaughterName, vector<int> shoot, vector<double> ExcitationEnergy, string CSPath, string CSName){ - m_CrossSectionPath=CSPath; - m_CrossSectionName=CSName; - - // Check the validity of the given data: - if (DaughterName.size() != shoot.size() || (DaughterName.size() != ExcitationEnergy.size() && ExcitationEnergy.size()!=0) ) { - cout << "ERROR : Missmatching information: Getting out " << endl ; - exit(1); - } - - if ( DaughterName.size() != 2 && CSPath!="TGenPhaseSpace" ) { - cout << "ERROR : Missmatching information (User CS allowed only for two body decay): Getting out " << endl ; - exit(1); - } - - m_shoot = shoot ; - m_ExcitationEnergy= ExcitationEnergy ; - - // If the Excitation Energy Token was omitted, then it is set to zero - if(m_ExcitationEnergy.size()==0) - for (unsigned int i = 0 ; i < DaughterName.size(); i++) { - m_ExcitationEnergy.push_back(0); - } - - // used check for mass and charge conservation - Nucleus* myNucleus = new Nucleus(m_MotherNucleiName); - int InitialCharge = myNucleus->GetZ() ; int FinalCharge = 0 ; - int InitialMass = myNucleus->GetA() ; int FinalMass = 0 ; - delete myNucleus; - for (unsigned int i = 0 ; i< DaughterName.size(); i++) { - if(DaughterName[i] == "p" || DaughterName[i] == "proton" || DaughterName[i] == "1H"){ - m_DaughterNuclei.push_back(G4ParticleTable::GetParticleTable()->FindParticle("proton")); - FinalMass++;FinalCharge++; - } - - else if (DaughterName[i] == "n" || DaughterName[i] == "neutron"){ - m_DaughterNuclei.push_back(G4ParticleTable::GetParticleTable()->FindParticle("neutron")); - FinalMass++; - } - - else{ - Nucleus* myNucleus1 = new Nucleus(DaughterName[i]); - m_DaughterNuclei.push_back(G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(myNucleus1->GetZ(), - myNucleus1->GetA(), - m_ExcitationEnergy[i]*MeV)); - FinalMass+=myNucleus1->GetA(); - FinalCharge+=myNucleus1->GetZ(); - delete myNucleus1; - } - } - - // Check mass and charge conservation - if (InitialMass!=FinalMass || InitialCharge!=FinalCharge) { - G4cout << "ERROR: Mass and charge are not conserved." << G4endl; - exit(1); - } - - m_DaughterName = DaughterName; - - m_DifferentialCrossSection = CSPath; - if(CSPath!="TGenPhaseSpace") { - if(m_CrossSectionPath!="_void_"){ - m_CrossSectionHist = Read1DProfile(m_CrossSectionPath,m_CrossSectionName); - TF1* sinus = new TF1("sinus","1/sin(x*3.141592653589793/180.)",0,180); - m_CrossSectionHist->Divide(sinus,1); - delete sinus; - } - else{ - int offset = 0; - while(gDirectory->FindObjectAny(Form("_particlevoid_%i",offset))!=0) - ++offset; - - m_CrossSectionHist = new TH1F(Form("_particlevoid_%i",offset),Form("_particlevoid_%i",offset),180,0,180); - for(unsigned int i = 0 ; i < 180 ; i++) - m_CrossSectionHist->Fill(i); - - TF1* sinus = new TF1("sinus","1/sin(x*3.141592653589793/180.)",0,180); - m_CrossSectionHist->Divide(sinus,1); - delete sinus; - } - - } - - - else{ - // Set up the array of masses - m_Masses = new double[m_DaughterNuclei.size()]; - - // Mass of the daugther nuclei are set once - for (unsigned int i = 0 ; i < m_DaughterNuclei.size(); i++) { - m_Masses[i] = m_DaughterNuclei[i]->GetPDGMass()/GeV; - } - - } - - // Change the name of the decaying nucleus to G4 standard - m_MotherNucleiName = m_ParticleStack->ChangeNameToG4Standard(m_MotherNucleiName); -} diff --git a/NPSimulation/EventGenerator/EventGeneratorParticleDecay.hh b/NPSimulation/EventGenerator/EventGeneratorParticleDecay.hh deleted file mode 100644 index dac80080653a6966f5675c2fbd857356862e4d71..0000000000000000000000000000000000000000 --- a/NPSimulation/EventGenerator/EventGeneratorParticleDecay.hh +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef EventGeneratorParticleDecay_H -#define EventGeneratorParticleDecay_H -/***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * - * * - * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * - * For the list of contributors see $NPTOOL/Licence/Contributors * - *****************************************************************************/ - -/***************************************************************************** - * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * - * * - * Creation Date : May 2012 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This event Generator is used to simulated the particle decay of nuclei * - * generated by previous event generator. Multiple cases are supported: * - * - Only one particle is emmited, in this case a Cross section can be given* - * - If Multiple particle are emitted, a Phase Space generator is used * - * * - *---------------------------------------------------------------------------* - * Comment: * - * * - * * - * * - *****************************************************************************/ - -// STL -#include <string> -#include <iostream> -using namespace std; - -// ROOT -#include "TGenPhaseSpace.h" -#include "TH1F.h" - -// NPSimulation -#include "VEventGenerator.hh" -#include "Target.hh" -#include "ParticleStack.hh" - -//NPL -#include "NPFunction.h" -#include "NPInputParser.h" -using namespace NPL; - -// Geant4 -#include "G4ParticleDefinition.hh" - -class EventGeneratorParticleDecay : public NPS::VEventGenerator{ -public: // Constructor and destructor - EventGeneratorParticleDecay(); - ~EventGeneratorParticleDecay(); - -public: // Inherit from VEventGenerator class - void ReadConfiguration(NPL::InputParser); - void GenerateEvent(G4Event*); - void SetTarget(Target* Target) ; - -private: // Target Parameter - Target* m_Target; - -private: // The decaying nuclei - // General used - string m_MotherNucleiName; - vector<G4ParticleDefinition*> m_DaughterNuclei; - vector<string> m_DaughterName; - vector<double> m_ExcitationEnergy; - vector<int> m_shoot; - - // Used for cross section - string m_DifferentialCrossSection; - string m_CrossSectionPath; - string m_CrossSectionName; - TH1F* m_CrossSectionHist; - - // Used for the phase space - TGenPhaseSpace m_TPhaseSpace ; - double* m_Masses; - -private: // Pointer to the Particle stack for faster acces - ParticleStack* m_ParticleStack; -public: // Managing the decay - // Set everything for the decay - void SetDecay(vector<string> DaughterName, vector<int> shoot, vector<double> ExcitationEnergy, string CSPath , string CSName); -}; -#endif diff --git a/NPSimulation/EventGenerator/EventGeneratorTwoBodyReaction.cc b/NPSimulation/EventGenerator/EventGeneratorTwoBodyReaction.cc deleted file mode 100644 index 60b467d9e5bad4bebcfb67a5d018b98ed428982a..0000000000000000000000000000000000000000 --- a/NPSimulation/EventGenerator/EventGeneratorTwoBodyReaction.cc +++ /dev/null @@ -1,195 +0,0 @@ -/***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * - * * - * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * - * For the list of contributors see $NPTOOL/Licence/Contributors * - *****************************************************************************/ - -/***************************************************************************** - * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * - * * - * Creation Date : January 2009 * - * Last update : January 2013 * - *---------------------------------------------------------------------------* - * Decription: * - * This event Generator is used to simulated two body two body reaction. * - * A Relativistic computation is performed to determine angle and energy of * - * the different particle, knowing the ThetaCM angle given by a cross * - * section shoot. Eleastic scattering can also be simulated. * - *---------------------------------------------------------------------------* - * Comment: * - * + 20/01/2011: Add support for excitation energy for light ejectile * - * (N. de Sereville) * - * + 23/01/2013: Class change name (ild name EventGeneratorTransfert) * - * (A. MATTA) * - * * - *****************************************************************************/ -// C++ headers -#include <iostream> -#include <fstream> -#include <limits> - -// G4 header defining G4 types -#include "globals.hh" - -// G4 headers -#include "G4ParticleTable.hh" -#include "G4IonTable.hh" -#include "G4RotationMatrix.hh" - -// G4 headers including CLHEP headers -// for generating random numbers -#include "Randomize.hh" - -// NPTool headers -#include "EventGeneratorTwoBodyReaction.hh" -#include "RootOutput.h" - -using namespace CLHEP; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -EventGeneratorTwoBodyReaction::EventGeneratorTwoBodyReaction() -: m_ShootLight(0), -m_ShootHeavy(0), -m_Target(0), -m_Reaction(new Reaction) -{ - //------------- Default Constructor ------------- - m_ParticleStack= ParticleStack::getInstance(); -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorTwoBodyReaction::SetTarget(Target* Target) { - if (Target != 0) { - m_Target = Target; - } -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -EventGeneratorTwoBodyReaction::~EventGeneratorTwoBodyReaction(){ - //------------- Default Destructor ------------ - delete m_Reaction; -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorTwoBodyReaction::InitializeRootOutput(){ - -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorTwoBodyReaction::Print() const{ - -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Inherit from VEventGenerator - -void EventGeneratorTwoBodyReaction::ReadConfiguration(NPL::InputParser parser){ - m_Reaction->ReadConfigurationFile(parser); - m_ShootLight = m_Reaction->GetShoot3(); - m_ShootHeavy = m_Reaction->GetShoot4();; - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorTwoBodyReaction::GenerateEvent(G4Event*){ - ////////////////////////////////////////////////// - //////Define the kind of particle to shoot//////// - ////////////////////////////////////////////////// - // Nucleus 3 - G4int LightZ = m_Reaction->GetNucleus3().GetZ() ; - G4int LightA = m_Reaction->GetNucleus3().GetA() ; - - G4ParticleDefinition* LightName - = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(LightZ, LightA, m_Reaction->GetExcitation3()*MeV); - - // Nucleus 4 - G4int HeavyZ = m_Reaction->GetNucleus4().GetZ() ; - G4int HeavyA = m_Reaction->GetNucleus4().GetA() ; - - // Generate the excitation energy if a distribution is given - m_Reaction->ShootRandomExcitationEnergy(); - - G4ParticleDefinition* HeavyName - = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(HeavyZ, HeavyA, m_Reaction->GetExcitation4()*MeV); - - // Get the beam particle form the Particle Stack - Particle BeamParticle = m_ParticleStack->SearchAndRemoveParticle(m_BeamName); - m_Reaction->SetBeamEnergy(BeamParticle.GetParticleKineticEnergy()); - - G4double Beam_theta = BeamParticle.GetParticleMomentumDirection().theta(); - G4double Beam_phi = BeamParticle.GetParticleMomentumDirection().phi(); - - ////////////////////////////////////////////////////////// - ///// Build rotation matrix to go from the incident ////// - ///// beam frame to the "world" frame ////// - ////////////////////////////////////////////////////////// - G4ThreeVector col1(cos(Beam_theta) * cos(Beam_phi), - cos(Beam_theta) * sin(Beam_phi), - -sin(Beam_theta)); - G4ThreeVector col2(-sin(Beam_phi), - cos(Beam_phi), - 0); - G4ThreeVector col3(sin(Beam_theta) * cos(Beam_phi), - sin(Beam_theta) * sin(Beam_phi), - cos(Beam_theta)); - G4RotationMatrix BeamToWorld(col1, col2, col3); - - ///////////////////////////////////////////////////////////////// - ///// Angles for emitted particles following Cross Section ////// - ///// Angles are in the beam frame ////// - ///////////////////////////////////////////////////////////////// - - // Angles - // Shoot and Set a Random ThetaCM - G4double ThetaCM = m_Reaction->ShootRandomThetaCM(); - G4double phi = RandFlat::shoot() * 2. * pi; - - ////////////////////////////////////////////////// - ///// Momentum and angles from kinematics ///// - ///// Angles are in the beam frame ///// - ////////////////////////////////////////////////// - // Variable where to store results - G4double ThetaLight, EnergyLight, ThetaHeavy, EnergyHeavy; - - // Compute Kinematic using previously defined ThetaCM - m_Reaction->KineRelativistic(ThetaLight, EnergyLight, ThetaHeavy, EnergyHeavy); - - // Momentum in beam frame for light particle - G4ThreeVector momentum_kineLight_beam(sin(ThetaLight) * cos(phi), - sin(ThetaLight) * sin(phi), - cos(ThetaLight)); - - // Momentum in beam frame for heavy particle - G4ThreeVector momentum_kineHeavy_beam(sin(ThetaHeavy) * cos(phi+pi), - sin(ThetaHeavy) * sin(phi+pi), - cos(ThetaHeavy)); - - ////////////////////////////////////////////////// - ///////// Set up everything for shooting ///////// - ////////////////////////////////////////////////// - // Case of light particle - // Particle direction - // Kinematical angles in the beam frame are transformed - // to the "world" frame - G4ThreeVector momentum_kine_world = BeamToWorld * momentum_kineLight_beam; - //Add the particle to the particle stack - Particle LightParticle(LightName, ThetaCM , EnergyLight,momentum_kine_world, BeamParticle.GetParticlePosition(), m_ShootLight); - m_ParticleStack->AddParticleToStack(LightParticle); - - // Case of heavy particle - // Particle direction - // Kinematical angles in the beam frame are transformed - // to the "world" frame - momentum_kine_world = BeamToWorld * momentum_kineHeavy_beam; - Particle HeavyParticle(HeavyName, ThetaCM + M_PI, EnergyHeavy,momentum_kine_world, BeamParticle.GetParticlePosition(), m_ShootHeavy); - //Add the particle to the particle stack - m_ParticleStack->AddParticleToStack(HeavyParticle); -} diff --git a/NPSimulation/EventGenerator/EventGeneratorTwoBodyReaction.hh b/NPSimulation/EventGenerator/EventGeneratorTwoBodyReaction.hh deleted file mode 100644 index fc0dd9cd32d8e45c82838b69d927be178e5a5a45..0000000000000000000000000000000000000000 --- a/NPSimulation/EventGenerator/EventGeneratorTwoBodyReaction.hh +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef EventGeneratorTwoBodyReaction_H -#define EventGeneratorTwoBodyReaction_H -/***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * - * * - * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * - * For the list of contributors see $NPTOOL/Licence/Contributors * - *****************************************************************************/ - -/***************************************************************************** - * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * - * * - * Creation Date : January 2009 * - * Last update : January 2013 * - *---------------------------------------------------------------------------* - * Decription: * - * This event Generator is used to simulated two body two body reaction. * - * A Relativistic computation is performed to determine angle and energy of * - * the different particle, knowing the ThetaCM angle given by a cross * - * section shoot. Eleastic scattering can also be simulated. * - *---------------------------------------------------------------------------* - * Comment: * - * + 20/01/2011: Add support for excitation energy for light ejectile * - * (N. de Sereville) * - * + 23/01/2013: Class change name (ild name EventGeneratorTransfert) * - * (A. MATTA) * - * * - * * - *****************************************************************************/ -// C++ headers -#include <string> - -// NPSimulation -#include "VEventGenerator.hh" -#include "Target.hh" -#include "Particle.hh" -#include "ParticleStack.hh" - -// NPLib header -#include "NPReaction.h" - -using namespace std; -using namespace CLHEP; -using namespace NPL ; - - -class EventGeneratorTwoBodyReaction : public NPS::VEventGenerator -{ - public: // Constructors and Destructors - // Default constructor used to allocate memory - EventGeneratorTwoBodyReaction(); - - // Default Destructor - virtual ~EventGeneratorTwoBodyReaction(); - - - public: // Inherit from VEventGenerator class - void ReadConfiguration(NPL::InputParser); - void GenerateEvent(G4Event*); - void SetTarget(Target* Target) ; - - - private: // Particle Shoot Option - ParticleStack* m_ParticleStack; - bool m_ShootLight; - bool m_ShootHeavy; - - - private: // Target Parameter - Target* m_Target; - - - private: // Reaction and CrossSection Shoot - Reaction* m_Reaction; - - - private: // Beam Parameters - string m_BeamName; - - // Other methods - void Print() const; - void InitializeRootOutput(); -}; - -#endif diff --git a/NPSimulation/Process/BeamReaction.cc b/NPSimulation/Process/BeamReaction.cc index b7f7c4e521a745b1de717ea86ba4fe710ea048bc..b7cf24e0dad55050812cfa12de1bccc001f2f7d5 100644 --- a/NPSimulation/Process/BeamReaction.cc +++ b/NPSimulation/Process/BeamReaction.cc @@ -38,10 +38,6 @@ G4VFastSimulationModel(modelName, envelope) { ReadConfiguration(); m_PreviousEnergy=0 ; m_PreviousLength=0 ; - m_ReactionConditions = new TReactionConditions(); - AttachReactionConditions(); - if(!RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions")) - RootOutput::getInstance()->GetTree()->Branch("ReactionConditions","TReactionConditions",&m_ReactionConditions); } @@ -64,16 +60,22 @@ void NPS::BeamReaction::AttachReactionConditions(){ //////////////////////////////////////////////////////////////////////////////// void NPS::BeamReaction::ReadConfiguration(){ - NPL::InputParser input(NPOptionManager::getInstance()->GetReactionFile()); - m_Reaction.ReadConfigurationFile(input); - m_BeamName=NPL::ChangeNameToG4Standard(m_Reaction.GetNucleus1().GetName()); - if(m_Reaction.GetNucleus3().GetName()!=""){ - m_active = true; - } - else{ - m_active = false; - - } + NPL::InputParser input(NPOptionManager::getInstance()->GetReactionFile()); + m_Reaction.ReadConfigurationFile(input); + m_BeamName=NPL::ChangeNameToG4Standard(m_Reaction.GetNucleus1()->GetName()); + + if(m_Reaction.GetNucleus3()->GetName()!=""){ + m_active = true; + m_ReactionConditions = new TReactionConditions(); + AttachReactionConditions(); + if(!RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions")) + RootOutput::getInstance()->GetTree()->Branch("ReactionConditions","TReactionConditions",&m_ReactionConditions); + + } + else{ + m_active = false; + + } } //////////////////////////////////////////////////////////////////////////////// @@ -98,15 +100,17 @@ G4bool NPS::BeamReaction::ModelTrigger(const G4FastTrack& fastTrack) { G4ThreeVector P = fastTrack.GetPrimaryTrackLocalPosition(); G4VSolid* solid = fastTrack.GetPrimaryTrack()->GetVolume()->GetLogicalVolume()->GetSolid(); - double in = solid->DistanceToOut(P,V); - double out = solid->DistanceToOut(P,-V); - double ratio = in / (out+in) ; - - if(out == 0){// first step of current event - rand = G4RandFlat::shoot(); - m_PreviousLength = m_StepSize ; - m_PreviousEnergy = PrimaryTrack->GetKineticEnergy() ; - shoot = true; + double in = solid->DistanceToOut(P,V); + double out = solid->DistanceToOut(P,-V); + double ratio = in / (out+in) ; + + if(out == 0){// first step of current event + rand = G4RandFlat::shoot(); + m_PreviousLength = m_StepSize ; + m_PreviousEnergy = PrimaryTrack->GetKineticEnergy() ; + // Clear Previous Event + m_ReactionConditions->Clear(); + shoot = true; } else if(in==0){// last step @@ -140,9 +144,7 @@ G4bool NPS::BeamReaction::ModelTrigger(const G4FastTrack& fastTrack) { //////////////////////////////////////////////////////////////////////////////// void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack,G4FastStep& fastStep) { - // Clear Previous Event - m_ReactionConditions->Clear(); - + // Get the track info const G4Track* PrimaryTrack = fastTrack.GetPrimaryTrack(); G4ThreeVector pdirection = PrimaryTrack->GetMomentum().unit(); @@ -171,28 +173,37 @@ void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack,G4FastStep& fastStep) fastStep.KillPrimaryTrack(); fastStep.SetPrimaryTrackPathLength(0.0); - ////////////////////////////////////////////////// + ///////////////////////////////////////////////// //////Define the kind of particle to shoot//////// ////////////////////////////////////////////////// // Nucleus 3 - int LightZ = m_Reaction.GetNucleus3().GetZ() ; - int LightA = m_Reaction.GetNucleus3().GetA() ; + int LightZ = m_Reaction.GetNucleus3()->GetZ() ; + int LightA = m_Reaction.GetNucleus3()->GetA() ; static G4IonTable* IonTable = G4ParticleTable::GetParticleTable()->GetIonTable(); - - G4ParticleDefinition* LightName - = IonTable->GetIon(LightZ, LightA, m_Reaction.GetExcitation3()*MeV); - + + G4ParticleDefinition* LightName; + + if(m_Reaction.GetUseExInGeant4()) + LightName = IonTable->GetIon(LightZ, LightA, m_Reaction.GetExcitation3()*MeV); + else + LightName = IonTable->GetIon(LightZ, LightA); + // Nucleus 4 - G4int HeavyZ = m_Reaction.GetNucleus4().GetZ() ; - G4int HeavyA = m_Reaction.GetNucleus4().GetA() ; + G4int HeavyZ = m_Reaction.GetNucleus4()->GetZ() ; + G4int HeavyA = m_Reaction.GetNucleus4()->GetA() ; // Generate the excitation energy if a distribution is given m_Reaction.ShootRandomExcitationEnergy(); - + // Use to clean up the IonTable in case of the Ex changing at every event - G4ParticleDefinition* HeavyName - = IonTable->GetIon(HeavyZ, HeavyA, m_Reaction.GetExcitation4()*MeV); + G4ParticleDefinition* HeavyName; + + if(m_Reaction.GetUseExInGeant4()) + HeavyName = IonTable->GetIon(HeavyZ, HeavyA, m_Reaction.GetExcitation4()*MeV); + else + HeavyName = IonTable->GetIon(HeavyZ, HeavyA); + // Set the Energy of the reaction m_Reaction.SetBeamEnergy(energy); @@ -216,7 +227,6 @@ void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack,G4FastStep& fastStep) m_ReactionConditions->SetBeamEmittancePhi(PrimaryTrack->GetMomentumDirection().phi()/deg); m_ReactionConditions->SetBeamEmittanceThetaX(PrimaryTrack->GetMomentumDirection().angle(U)/deg); m_ReactionConditions->SetBeamEmittancePhiY(PrimaryTrack->GetMomentumDirection().angle(V)/deg); - ////////////////////////////////////////////////////////// ///// Build rotation matrix to go from the incident ////// ///// beam frame to the "world" frame ////// @@ -268,12 +278,16 @@ void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack,G4FastStep& fastStep) // Emitt secondary - G4DynamicParticle particle3(LightName,momentum_kine3_world,Energy3); - fastStep.CreateSecondaryTrack(particle3, localPosition, time); - - G4DynamicParticle particle4(HeavyName,momentum_kine4_world,Energy4); - fastStep.CreateSecondaryTrack(particle4, localPosition, time); - + if(m_Reaction.GetShoot3()){ + G4DynamicParticle particle3(LightName,momentum_kine3_world,Energy3); + fastStep.CreateSecondaryTrack(particle3, localPosition, time); + } + + if(m_Reaction.GetShoot4()){ + G4DynamicParticle particle4(HeavyName,momentum_kine4_world,Energy4); + fastStep.CreateSecondaryTrack(particle4, localPosition, time); + } + // Reinit for next event m_PreviousEnergy=0 ; m_PreviousLength=0 ; @@ -290,8 +304,10 @@ void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack,G4FastStep& fastStep) // Energy 3 and 4 // m_ReactionConditions->SetKineticEnergy(Energy3); m_ReactionConditions->SetKineticEnergy(Energy4); - // ThetaCM // + // ThetaCM and Ex// m_ReactionConditions->SetThetaCM(m_Reaction.GetThetaCM()/deg); + m_ReactionConditions->SetExcitationEnergy3(m_Reaction.GetExcitation3()); + m_ReactionConditions->SetExcitationEnergy4(m_Reaction.GetExcitation4()); // Momuntum X 3 and 4 // m_ReactionConditions->SetMomentumDirectionX(momentum_kine3_world.x()); m_ReactionConditions->SetMomentumDirectionX(momentum_kine4_world.x()); @@ -301,4 +317,5 @@ void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack,G4FastStep& fastStep) // Momuntum Z 3 and 4 // m_ReactionConditions->SetMomentumDirectionZ(momentum_kine3_world.z()); m_ReactionConditions->SetMomentumDirectionZ(momentum_kine4_world.z()); + } diff --git a/NPSimulation/Process/G4DETransport.cc b/NPSimulation/Process/G4DETransport.cc index 2266b7e512a4b1266658a469ff22985e22dfa031..1f501a7bc8e1e420c4ecf3b716c3d21e3e53f318 100644 --- a/NPSimulation/Process/G4DETransport.cc +++ b/NPSimulation/Process/G4DETransport.cc @@ -123,23 +123,23 @@ G4DETransport::PostStepDoIt(const G4Track& aTrack, const G4Step& aStep) G4MaterialPropertiesTable* aMaterialPropertiesTable = aMaterial->GetMaterialPropertiesTable(); - if (!aMaterialPropertiesTable) - return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); - - - if(!aMaterialPropertiesTable->ConstPropertyExists("DE_PAIRENERGY") || - !aMaterialPropertiesTable->ConstPropertyExists("DE_TRANSVERSALSPREAD") || - !aMaterialPropertiesTable->ConstPropertyExists("DE_LONGITUDINALSPREAD") || - !aMaterialPropertiesTable->ConstPropertyExists("DE_DRIFTSPEED") ) - return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); - - - // Electron follow the field direction - // The field direction is taken from the field manager - static G4double* fieldArr = new G4double[6]; - G4double Point[4]={x0.x(),x0.y(),x0.z(),t0}; - G4FieldManager* fMng = pPreStepPoint->GetTouchableHandle()->GetVolume()->GetLogicalVolume()-> - GetFieldManager(); + + if (!aMaterialPropertiesTable) + return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); + + + if(!aMaterialPropertiesTable->ConstPropertyExists("DE_PAIRENERGY") || + !aMaterialPropertiesTable->ConstPropertyExists("DE_TRANSVERSALSPREAD") || + !aMaterialPropertiesTable->ConstPropertyExists("DE_LONGITUDINALSPREAD") || + !aMaterialPropertiesTable->ConstPropertyExists("DE_DRIFTSPEED") ) + return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); + + + // Electron follow the field direction + // The field direction is taken from the field manager + static G4double* fieldArr = new G4double[6]; + G4double Point[4]={x0.x(),x0.y(),x0.z(),t0}; + G4FieldManager* fMng = pPreStepPoint->GetTouchableHandle()->GetVolume()->GetLogicalVolume()->GetFieldManager(); G4ElectroMagneticField* field = (G4ElectroMagneticField*)fMng->GetDetectorField(); field->GetFieldValue(Point,fieldArr) ; diff --git a/NPSimulation/Process/PhysicsList.cc b/NPSimulation/Process/PhysicsList.cc index c830d8b1ce8b5b2b6db62ee163be462f1a2b0d4e..ed1a5bfacfb34a3490a2c58deedddd29c3a9f166 100644 --- a/NPSimulation/Process/PhysicsList.cc +++ b/NPSimulation/Process/PhysicsList.cc @@ -38,13 +38,21 @@ #include "G4ProcessManager.hh" #include "G4FastSimulationManagerProcess.hh" #include "G4StepLimiter.hh" -#include "menate_R.hh" +#include "G4BraggIonGasModel.hh" +#include "G4BetheBlochIonGasModel.hh" +#include "G4IonFluctuations.hh" +#include "G4IonParametrisedLossModel.hh" +#include "G4UniversalFluctuation.hh" + +#include "G4PAIModel.hh" +#include "G4PAIPhotModel.hh" + ///////////////////////////////////////////////////////////////////////////// PhysicsList::PhysicsList() : G4VUserPhysicsList(){ m_EmList = "Option4"; defaultCutValue = 1*mm;//0.2*mm; opticalPhysicsList = NULL; - driftElectronPhysicsList = NULL; + driftElectronPhysicsList = NULL; ReadConfiguration("PhysicsListOption.txt"); G4LossTableManager::Instance(); SetVerboseLevel(0); @@ -64,23 +72,31 @@ PhysicsList::PhysicsList() : G4VUserPhysicsList(){ // Using the more accurate option4 emPhysicsList=NULL; - if(m_EmList == "Option4") + if(m_EmList == "Option4"){ emPhysicsList = new G4EmStandardPhysics_option4(); + cout << "//// Using G4EmStandardPhysics_option4 Physics List ////" << endl; + } - else if(m_EmList== "Livermore") + else if(m_EmList== "Livermore"){ emPhysicsList = new G4EmLivermorePhysics(); + cout << "//// Using G4EmLivermorePhysics Physics List ////" << endl; + } - else if( m_EmList == "Penelope") + else if( m_EmList == "Penelope"){ emPhysicsList = new G4EmPenelopePhysics(); + cout << "//// Using G4EmPenelopePhysics Physics List ////" << endl; + } else{ std::cout << "\r\033[1;31mERROR: User given physics list " << m_EmList << " is not supported, option are Option4 Livermore Penelope\033[0m" <<std::endl; exit(1); } + emConfig = G4LossTableManager::Instance()->EmConfigurator(); // Hadronic physics if(m_IonBinaryCascadePhysics){ m_PhysList["IonBinaryCascadePhysics"] = new G4IonBinaryCascadePhysics(); + cout << "//// Using G4IonBinaryCascadePhysics Physics List ////" << endl; } if(m_EmExtraPhysics) m_PhysList["EmExtraPhysics"]=new G4EmExtraPhysics(); @@ -88,22 +104,30 @@ PhysicsList::PhysicsList() : G4VUserPhysicsList(){ if(m_HadronElasticPhysics){ m_PhysList["G4HadronElasticPhysics"]=new G4HadronElasticPhysics(); m_PhysList["G4IonElasticPhysics"]=new G4IonElasticPhysics(); + cout << "//// Using G4HadronElasticPhysics Physics List ////" << endl; + cout << "//// Using G4IonElasticPhysics Physics List ////" << endl; } - if(m_NPIonInelasticPhysics) + if(m_NPIonInelasticPhysics){ m_PhysList["NPIonInelasticPhysics"]=new NPIonIonInelasticPhysic(); + cout << "//// Using NPIonIonInelasticPhysic Physics List ////" << endl; + } - if(m_StoppingPhysics) + if(m_StoppingPhysics){ m_PhysList["StoppingPhysics"]=new G4StoppingPhysics(); + cout << "//// Using G4StoppingPhysics Physics List ////" << endl; + } if(m_HadronPhysicsINCLXX){ m_PhysList["HadronPhysicsINCLXX"] = new G4HadronPhysicsINCLXX(); m_PhysList["IonPhysicsINCLXX"] = new G4IonINCLXXPhysics(); + cout << "//// Using INCLXX Physics List ////" << endl; } if(m_HadronPhysicsQGSP_BIC_HP){ #if NPS_GEANT4_VERSION_MAJOR > 9 m_PhysList["HadronPhysicsQGSP_BIC_HP"] = new G4HadronPhysicsQGSP_BIC_HP(); + cout << "//// Using QGSP_BIC_HP Physics List ////" << endl; #else std::cout << "\r\032[1;31m Warning: physics list HadronPhysicsQGSP_BIC_HP require Geant4 10, process not activated \033[0m" <<std::endl; @@ -116,12 +140,28 @@ PhysicsList::PhysicsList() : G4VUserPhysicsList(){ opticalPhysicsList->SetScintillationYieldFactor(0.1); opticalPhysicsList->SetTrackSecondariesFirst(kScintillation,true); opticalPhysicsList->SetTrackSecondariesFirst(kCerenkov,true); + + cout << "//// Using Optical Photon Physics List ////" << endl; } - + // Drift electron for gazeous detector simulation if(m_DriftElectronPhysics){ driftElectronPhysicsList = new G4DriftElectronPhysics(0); driftElectronPhysicsList->SetMaxNumDriftElectronPerStep(1e6); + cout << "//// Using Drift Electron Physics List ////" << endl; + } + if(m_IonGasModels){ + AddIonGasModels(); + cout << "//// Using Ion Gas Model Physics List ////" << endl; + } + + if(m_pai){ + AddPAIModel("pai"); + cout << "//// Using PAI Model Physics List ////" << endl; + } + if(m_pai_photon){ + AddPAIModel("pai_photon"); + cout << "//// Using PAI PHOTON Model Physics List ////" << endl; } // Decay physics @@ -153,7 +193,9 @@ void PhysicsList::ReadConfiguration(std::string filename){ m_HadronPhysicsQGSP_BIC_HP = 0; m_HadronPhysicsINCLXX = 0; m_Decay = 0; - m_Menate_R = 0; + m_IonGasModels = 0; + m_pai= 0; + m_pai_photon= 0; std::ifstream file(filename.c_str()); if(!file.is_open()){ @@ -192,8 +234,12 @@ void PhysicsList::ReadConfiguration(std::string filename){ m_HadronPhysicsINCLXX= value; else if (name == "Decay") m_Decay = value; - else if (name == "Menate_R") - m_Menate_R = value; + else if (name == "IonGasModels") + m_IonGasModels= value; + else if (name == "pai") + m_pai = value; + else if (name == "pai_photon") + m_pai_photon = value; else std::cout <<"WARNING: Physics List Token '" << name << "' unknown. Token is ignored." << std::endl; } @@ -210,6 +256,67 @@ void PhysicsList::ReadConfiguration(std::string filename){ PhysicsList::~PhysicsList(){ } +///////////////////////////////////////////////////////////////////////////// +void PhysicsList::AddIonGasModels() +{ + G4ParticleTable::G4PTblDicIterator* particleIterator = G4ParticleTable::GetParticleTable()->GetIterator(); + particleIterator->reset(); + while ((*particleIterator)()) + { + G4ParticleDefinition* particle = particleIterator->value(); + G4String partname = particle->GetParticleName(); + if(partname == "p" || partname == "proton" || partname == "alpha" || partname == "He3" || partname == "GenericIon") { + G4BraggIonGasModel* mod1 = new G4BraggIonGasModel(); + G4BetheBlochIonGasModel* mod2 = new G4BetheBlochIonGasModel(); + G4double eth = 2.*MeV*particle->GetPDGMass()/proton_mass_c2; + emConfig->SetExtraEmModel(partname,"ionIoni",mod1,"",0.0,eth,new G4IonFluctuations()); + emConfig->SetExtraEmModel(partname,"ionIoni",mod2,"",eth,100*TeV,new G4UniversalFluctuation()); + } + } +} + +///////////////////////////////////////////////////////////////////////////// +void PhysicsList::AddPAIModel(const G4String& modname) +{ + G4ParticleTable::G4PTblDicIterator* particleIterator = G4ParticleTable::GetParticleTable()->GetIterator(); + particleIterator->reset(); + while ((*particleIterator)()) + { + G4ParticleDefinition* particle = particleIterator->value(); + G4String partname = particle->GetParticleName(); + if(partname == "e-" || partname == "e+") { + NewPAIModel(particle, modname, "eIoni"); + + } else if(partname == "mu-" || partname == "mu+") { + NewPAIModel(particle, modname, "muIoni"); + + } else if(partname == "proton" || + partname == "pi+" || + partname == "pi-" + ) { + NewPAIModel(particle, modname, "hIoni"); + } + } +} + +///////////////////////////////////////////////////////////////////////////// +void PhysicsList::NewPAIModel(const G4ParticleDefinition* part, + const G4String& modname, + const G4String& procname) +{ + G4String partname = part->GetParticleName(); + if(modname == "pai"){ + G4PAIModel* pai = new G4PAIModel(part,"PAIModel"); + emConfig->SetExtraEmModel(partname,procname,pai,"GasDetector",0.0,100.*TeV,pai); + } + + else if(modname == "pai_photon") { + G4PAIPhotModel* pai = new G4PAIPhotModel(part,"PAIPhotModel"); + emConfig->SetExtraEmModel(partname,procname,pai,"GasDetector",0.0,100.*TeV,pai); + } +} + + ///////////////////////////////////////////////////////////////////////////// void PhysicsList::ConstructParticle(){ if(m_OpticalPhysics){ @@ -217,11 +324,11 @@ void PhysicsList::ConstructParticle(){ ((G4VPhysicsConstructor*) opticalPhysicsList)->ConstructParticle(); } - - if(m_DriftElectronPhysics){ + + if(m_DriftElectronPhysics){ ((G4VPhysicsConstructor*) driftElectronPhysicsList)->ConstructParticle(); } - + if(decay_List){ decay_List -> ConstructParticle(); radioactiveDecay_List->ConstructParticle(); @@ -274,7 +381,7 @@ void PhysicsList::ConstructProcess(){ if(driftElectronPhysicsList){ ((G4VPhysicsConstructor*) driftElectronPhysicsList)->ConstructProcess(); } - + // Hadronic physics std::map<std::string,G4VPhysicsConstructor*>::iterator it; for(it = m_PhysList.begin(); it!= m_PhysList.end(); it++){ @@ -288,7 +395,7 @@ void PhysicsList::ConstructProcess(){ em_option.SetAuger(true); AddParametrisation(); - + return; } ///////////////////////////////////////////////////////////////////////////// @@ -296,33 +403,24 @@ void PhysicsList::AddStepMax(){ } ///////////////////////////////////////////////////////////////////////////// void PhysicsList::AddParametrisation(){ - G4FastSimulationManagerProcess* BeamReaction = - new G4FastSimulationManagerProcess("NPSimulationProcess"); - -// For 10.3 and higher -#ifndef theParticleIterator - G4ParticleTable::G4PTblDicIterator* theParticleIterator = GetParticleIterator(); + G4FastSimulationManagerProcess* BeamReaction = + new G4FastSimulationManagerProcess("NPSimulationProcess"); + + // For 10.3 and higher +#ifndef theParticleIterator + G4ParticleTable::G4PTblDicIterator* theParticleIterator = GetParticleIterator(); #endif - - theParticleIterator->reset(); - while ((*theParticleIterator)()){ - G4ParticleDefinition* particle = theParticleIterator->value(); - G4ProcessManager* pmanager = particle->GetProcessManager(); - std::string name = particle->GetParticleName(); - pmanager->AddDiscreteProcess(BeamReaction); - // Add a Step limiter to the beam particle. - // This will be used to limit the step of the beam in the target - pmanager->AddProcess(new G4StepLimiter,-1,-1,5); - - if(m_Menate_R > 0 && name == "neutron") { - menate_R* theMenate = new menate_R("menateR_neutron"); - theMenate->SetMeanFreePathCalcMethod("ORIGINAL"); - pmanager->AddDiscreteProcess(theMenate); - std::cout <<"||--------------------------------------------------||" << std::endl; - std::cout <<" MENATE_R Added to Process Manager " << std::endl; - std::cout <<"||--------------------------------------------------||" << std::endl; - } - } + + theParticleIterator->reset(); + while ((*theParticleIterator)()){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + std::string name = particle->GetParticleName(); + pmanager->AddDiscreteProcess(BeamReaction); + // Add a Step limiter to the beam particle. + // This will be used to limit the step of the beam in the target + pmanager->AddProcess(new G4StepLimiter,-1,-1,5); + } } @@ -344,5 +442,3 @@ void PhysicsList::SetCuts(){ void PhysicsList::BiasCrossSectionByFactor(double factor){ factor++; } - - diff --git a/NPSimulation/Process/PhysicsList.hh b/NPSimulation/Process/PhysicsList.hh index 53242275a9ef62540f8a1cae96a0071cce86b5ac..37e6b6da840c410fd0bc38dba3f262a984ee1186 100644 --- a/NPSimulation/Process/PhysicsList.hh +++ b/NPSimulation/Process/PhysicsList.hh @@ -84,6 +84,9 @@ class PhysicsList: public G4VUserPhysicsList{ void AddParametrisation(); void AddPackage(const G4String& name); void BiasCrossSectionByFactor(double factor); + void AddIonGasModels(); + void AddPAIModel(const G4String& modname); + void NewPAIModel(const G4ParticleDefinition* part, const G4String& modname,const G4String& procname); private: std::map<std::string,G4VPhysicsConstructor*> m_PhysList; @@ -96,7 +99,8 @@ class PhysicsList: public G4VUserPhysicsList{ G4VPhysicsConstructor* emPhysicsList; G4VPhysicsConstructor* decay_List; G4VPhysicsConstructor* radioactiveDecay_List; - + G4EmConfigurator* emConfig; + private: // Physics option std::string m_EmList; double m_IonBinaryCascadePhysics; @@ -105,12 +109,14 @@ class PhysicsList: public G4VUserPhysicsList{ double m_HadronElasticPhysics; double m_HadronInelasticPhysics; double m_StoppingPhysics; - double m_OpticalPhysics; + double m_OpticalPhysics; double m_DriftElectronPhysics; double m_HadronPhysicsQGSP_BIC_HP; double m_HadronPhysicsINCLXX; double m_Decay; - double m_Menate_R; + double m_IonGasModels; + double m_pai; + double m_pai_photon; }; diff --git a/NPSimulation/Scorers/CMakeLists.txt b/NPSimulation/Scorers/CMakeLists.txt index 2c28e73ab043081956d0b9eef56959f0e618b6b9..b7924685f0116ec8b86cd7bb96c2dd8ff8d39ee6 100644 --- a/NPSimulation/Scorers/CMakeLists.txt +++ b/NPSimulation/Scorers/CMakeLists.txt @@ -1,2 +1,6 @@ +<<<<<<< HEAD add_library(NPSScorers SHARED NPSHitsMap.hh CalorimeterScorers.cc SiliconScorers.cc PhotoDiodeScorers.cc ObsoleteGeneralScorers.cc DriftElectronScorers.cc TPCScorers.cc MDMScorer.cc NeutronDetectorScorers.cc ) +======= +add_library(NPSScorers SHARED NPSHitsMap.hh CalorimeterScorers.cc InteractionScorers.cc DSSDScorers.cc SiliconScorers.cc PhotoDiodeScorers.cc ObsoleteGeneralScorers.cc DriftElectronScorers.cc TPCScorers.cc MDMScorer.cc ) +>>>>>>> b55c970220ed010e24e3a5ac9f01b96f9c840b16 target_link_libraries(NPSScorers ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPInitialConditions -lNPInteractionCoordinates) diff --git a/NPSimulation/Scorers/CalorimeterScorers.cc b/NPSimulation/Scorers/CalorimeterScorers.cc index 7557796bf15981905b792e6481b043c701d95701..f02767659316c997393d71521dc731885870f612 100644 --- a/NPSimulation/Scorers/CalorimeterScorers.cc +++ b/NPSimulation/Scorers/CalorimeterScorers.cc @@ -21,168 +21,88 @@ *****************************************************************************/ #include "CalorimeterScorers.hh" #include "G4UnitsTable.hh" -using namespace CALORIMETERSCORERS ; +using namespace CalorimeterScorers ; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PS_Calorimeter::PS_Calorimeter(G4String name, vector<G4int> NestingLevel,G4int depth) -:G4VPrimitiveScorer(name, depth),HCID(-1){ - m_NestingLevel = NestingLevel; -} +unsigned int CalorimeterData::CalculateIndex(const vector<unsigned int>& level){ -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PS_Calorimeter::~PS_Calorimeter(){ + unsigned int size = level.size(); + unsigned int result = 0; + unsigned int multiplier =1; + for(unsigned int i = 0 ; i < size ; i++){ + result+=level[i]*multiplier; + multiplier*=1000; + } + return result; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool PS_Calorimeter::ProcessHits(G4Step* aStep, G4TouchableHistory*){ - // Contain Energy, Time + as many copy number as nested volume - unsigned int mysize = m_NestingLevel.size(); - G4double* Infos = new G4double[2+mysize]; - Infos[0] = aStep->GetTotalEnergyDeposit(); - Infos[1] = aStep->GetPreStepPoint()->GetGlobalTime(); - - for(unsigned int i = 0 ; i < mysize ; i++){ - Infos[i+2] = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i]); - } - - m_Index = 0 ; - G4int multiplier = 1; - for(unsigned int i = 0 ; i < mysize ; i++){ - m_Index+= aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i])*multiplier; - multiplier*=10; - } - - // Check if the particle has interact before, if yes, add up the energies. - map<G4int, G4double**>::iterator it; - it= EvtMap->GetMap()->find(m_Index); - if(it!=EvtMap->GetMap()->end()){ - G4double* dummy = *(it->second); - Infos[0]+=dummy[0]; - } - - EvtMap->set(m_Index, Infos); - return TRUE; +vector<CalorimeterData>::iterator CalorimeterDataVector::find(const unsigned int& index){ + for(vector<CalorimeterData>::iterator it= m_Data.begin() ; it !=m_Data.end() ; it++){ + if((*it).GetIndex()==index) + return it; + } + return m_Data.end(); } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_Calorimeter::Initialize(G4HCofThisEvent* HCE){ - EvtMap = new NPS::HitsMap<G4double*>(GetMultiFunctionalDetector()->GetName(), GetName()); - if (HCID < 0) { - HCID = GetCollectionID(0); - } - HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap); -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_Calorimeter::EndOfEvent(G4HCofThisEvent*){ -} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_Calorimeter::clear(){ - std::map<G4int, G4double**>::iterator MapIterator; - for (MapIterator = EvtMap->GetMap()->begin() ; MapIterator != EvtMap->GetMap()->end() ; MapIterator++){ - delete *(MapIterator->second); - } - - EvtMap->clear(); -} +PS_Calorimeter::PS_Calorimeter(G4String name, vector<G4int> NestingLevel,G4int depth) + :G4VPrimitiveScorer(name, depth){ + m_NestingLevel = NestingLevel; + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_Calorimeter::DrawAll(){ - +PS_Calorimeter::~PS_Calorimeter(){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_Calorimeter::PrintAll(){ - G4cout << " MultiFunctionalDet " << detector->GetName() << G4endl ; - G4cout << " PrimitiveScorer " << GetName() << G4endl ; - G4cout << " Number of entries " << EvtMap->entries() << G4endl ; -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PS_CalorimeterWithInteraction::PS_CalorimeterWithInteraction(G4String name, vector<G4int> NestingLevel,G4int depth) -:G4VPrimitiveScorer(name, depth),HCID(-1){ - m_NestingLevel = NestingLevel; -} +G4bool PS_Calorimeter::ProcessHits(G4Step* aStep, G4TouchableHistory*){ + // Contain Energy, Time + as many copy number as nested volume + static unsigned int mysize = m_NestingLevel.size(); + t_Energy = aStep->GetTotalEnergyDeposit(); + t_Time = aStep->GetPreStepPoint()->GetGlobalTime(); -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PS_CalorimeterWithInteraction::~PS_CalorimeterWithInteraction(){ -} + for(unsigned int i = 0 ; i < mysize ; i++){ + t_Level.push_back(aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i])); + } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4bool PS_CalorimeterWithInteraction::ProcessHits(G4Step* aStep, G4TouchableHistory*){ - - // Contain Energy, Time + as many copy number as nested volume - unsigned int mysize = m_NestingLevel.size(); - G4double* Infos = new G4double[7+mysize]; - Infos[0] = aStep->GetTotalEnergyDeposit(); - Infos[1] = aStep->GetPreStepPoint()->GetGlobalTime(); - - - // Interaction coordinates (used to fill the InteractionCoordinates branch) - m_Position = aStep->GetPreStepPoint()->GetPosition(); - - Infos[2] = m_Position.x(); - Infos[3] = m_Position.y(); - Infos[4] = m_Position.z(); - Infos[5] = m_Position.theta(); - Infos[6] = m_Position.phi(); - - for(unsigned int i = 0 ; i < mysize ; i++){ - Infos[i+7] = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i]); - } - - m_Index = 0 ; - G4int multiplier = 1; - for(unsigned int i = 0 ; i < mysize ; i++){ - m_Index+= aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i])*multiplier; - multiplier*=10; + + // Check if the particle has interact before, if yes, add up the energies. + vector<CalorimeterData>::iterator it; + it = m_Data.find(CalorimeterData::CalculateIndex(t_Level)); + if(it!=m_Data.end()){ + it->Add(t_Energy); } - - // Check if the particle has interact before, if yes, add up the energies. - map<G4int, G4double**>::iterator it; - it= EvtMap->GetMap()->find(m_Index); - if(it!=EvtMap->GetMap()->end()){ - G4double* dummy = *(it->second); - Infos[0]+=dummy[0]; + else{ + m_Data.Set(t_Energy,t_Time,t_Level); } - - EvtMap->set(m_Index, Infos); - return TRUE; + + return TRUE; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_CalorimeterWithInteraction::Initialize(G4HCofThisEvent* HCE){ - EvtMap = new NPS::HitsMap<G4double*>(GetMultiFunctionalDetector()->GetName(), GetName()); - if (HCID < 0) { - HCID = GetCollectionID(0); - } - HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap); +void PS_Calorimeter::Initialize(G4HCofThisEvent* HCE){ + m_Data.clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_CalorimeterWithInteraction::EndOfEvent(G4HCofThisEvent*){ +void PS_Calorimeter::EndOfEvent(G4HCofThisEvent*){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_CalorimeterWithInteraction::clear(){ - std::map<G4int, G4double**>::iterator MapIterator; - for (MapIterator = EvtMap->GetMap()->begin() ; MapIterator != EvtMap->GetMap()->end() ; MapIterator++){ - delete *(MapIterator->second); - } - - EvtMap->clear(); +void PS_Calorimeter::clear(){ + m_Data.clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_CalorimeterWithInteraction::DrawAll(){ - +void PS_Calorimeter::DrawAll(){ + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_CalorimeterWithInteraction::PrintAll(){ - G4cout << " MultiFunctionalDet " << detector->GetName() << G4endl ; - G4cout << " PrimitiveScorer " << GetName() << G4endl ; - G4cout << " Number of entries " << EvtMap->entries() << G4endl ; +void PS_Calorimeter::PrintAll(){ } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Scorers/CalorimeterScorers.hh b/NPSimulation/Scorers/CalorimeterScorers.hh index 9b561b96bef3b702666ca188d9ea7145d9d42eb3..8525e52951cdeaa53f53c005d4fccb8f9f151c33 100644 --- a/NPSimulation/Scorers/CalorimeterScorers.hh +++ b/NPSimulation/Scorers/CalorimeterScorers.hh @@ -32,7 +32,58 @@ using namespace std; using namespace CLHEP; -namespace CALORIMETERSCORERS { +namespace CalorimeterScorers { + // Hold One hit info + class CalorimeterData{ + public: + CalorimeterData(const double& Energy,const double& Time,const vector<unsigned int>& Nesting){ + m_Index=CalculateIndex(Nesting); + m_Level=Nesting; + m_Energy=Energy; + m_Time=Time; + }; + ~CalorimeterData(){}; + + private: + unsigned int m_Index; + vector<unsigned int> m_Level; + double m_Energy; + double m_Time; + + public: + static unsigned int CalculateIndex(const vector<unsigned int>& Nesting); + + public: + inline unsigned int GetIndex() const {return m_Index;} + inline vector<unsigned int> GetLevel() const {return m_Level;}; + inline double GetEnergy() const {return m_Energy;}; + inline double GetTime() const {return m_Time;}; + + public: + void Add(const double& Energy) {m_Energy+=Energy;}; + }; + + // Manage a vector of DSSD hit + class CalorimeterDataVector{ + public: + CalorimeterDataVector(){}; + ~CalorimeterDataVector(){}; + + private: + vector<CalorimeterData> m_Data; + + public: + vector<CalorimeterData>::iterator find(const unsigned int& index) ; + inline void clear(){m_Data.clear();} ; + inline vector<CalorimeterData>::iterator end() {return m_Data.end();}; + inline vector<CalorimeterData>::iterator begin() {return m_Data.begin();}; + inline unsigned int size() {return m_Data.size();}; + inline void Add(const unsigned int& index,const double& Energy) {find(index)->Add(Energy);}; + inline void Set(const double& Energy, const double& Time, const vector<unsigned int>& Nesting) {m_Data.push_back(CalorimeterData(Energy,Time,Nesting));}; + CalorimeterData* operator[](const unsigned int& i){return &m_Data[i];}; + }; + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... class PS_Calorimeter : public G4VPrimitiveScorer{ @@ -57,37 +108,16 @@ namespace CALORIMETERSCORERS { vector<G4int> m_NestingLevel; G4int m_Index; - private: // inherited from G4VPrimitiveScorer - G4int HCID; - NPS::HitsMap<G4double*>* EvtMap; - }; - - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - class PS_CalorimeterWithInteraction : public G4VPrimitiveScorer{ - - public: // with description - PS_CalorimeterWithInteraction(G4String name, vector<G4int> NestingLevel,G4int depth=0); - ~PS_CalorimeterWithInteraction(); - - protected: // with description - G4bool ProcessHits(G4Step*, G4TouchableHistory*); - G4ThreeVector m_Position; + private: + CalorimeterDataVector m_Data; + double t_Energy; + double t_Time; + vector<unsigned int> t_Level; public: - void Initialize(G4HCofThisEvent*); - void EndOfEvent(G4HCofThisEvent*); - void clear(); - void DrawAll(); - void PrintAll(); - - private: // How much level of volume nesting should be considered - // Give the list of the nesting level at which the copy number should be return. - // 0 is the lowest level possible (the actual volume copy number in which the interaction happen) - vector<G4int> m_NestingLevel; - G4int m_Index; - - private: // inherited from G4VPrimitiveScorer - G4int HCID; - NPS::HitsMap<G4double*>* EvtMap; + inline unsigned int GetMult() {return m_Data.size();}; + inline double GetEnergy(const unsigned int& i) {return m_Data[i]->GetEnergy();}; + inline double GetTime(const unsigned int& i) {return m_Data[i]->GetTime();}; + inline vector<unsigned int> GetLevel(const unsigned int& i) {return m_Data[i]->GetLevel();}; }; } diff --git a/NPSimulation/Scorers/DSSDScorers.cc b/NPSimulation/Scorers/DSSDScorers.cc new file mode 100644 index 0000000000000000000000000000000000000000..dec8a8e7c7e670ee6e22ae3e9fe80e2aab3f57f7 --- /dev/null +++ b/NPSimulation/Scorers/DSSDScorers.cc @@ -0,0 +1,422 @@ +/***************************************************************************** + * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : February 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * File old the scorer specific to the Sharc Detector * + * * + *---------------------------------------------------------------------------* + * Comment: * + * This new type of scorer is aim to become the standard for DSSD,SSSD and * + * PAD detector (any Silicon Detector) * + *****************************************************************************/ +#include "DSSDScorers.hh" +#include "G4UnitsTable.hh" +using namespace DSSDScorers ; +vector<DSSDData>::iterator DSSDDataVector::find(const unsigned int& index){ + for(vector<DSSDData>::iterator it= m_Data.begin() ; it !=m_Data.end() ; it++){ + if((*it).GetIndex()==index) + return it; + } + return m_Data.end(); +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Images::PS_Images(G4String name, string imageFront,string imageBack,double scalingFront, double scalingBack, double centerOffsetX,double centerOffsetY,unsigned int ignoreValue, G4int depth) :G4VPrimitiveScorer(name, depth){ + m_ImageFront = new NPL::Image(imageFront,scalingFront,scalingFront); + m_ImageBack = new NPL::Image(imageBack,scalingBack,scalingBack); + m_ScalingFront = scalingFront; + m_ScalingBack = scalingBack; + m_CenterOffsetX = centerOffsetX; + m_CenterOffsetY = centerOffsetY; + m_IgnoreValue = ignoreValue; + m_Level = depth; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4bool PS_Images::ProcessHits(G4Step* aStep, G4TouchableHistory*){ + + // contain Energy Time, DetNbr, PixelFront and PixelBack + t_Energy = aStep->GetTotalEnergyDeposit(); + t_Time = aStep->GetPreStepPoint()->GetGlobalTime(); + + t_DetectorNbr = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_Level); + t_Position = aStep->GetPreStepPoint()->GetPosition(); + + // transforming the position to the local volume + t_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(t_Position); + t_PixelFront = m_ImageFront->GetPixelAtCoordinate(t_Position.x(),t_Position.y()); + t_PixelBack = m_ImageBack->GetPixelAtCoordinate(t_Position.x(),t_Position.y()); + + // If front and back are in inactive part of the wafer, + // nothing is added to the unordered_map + if(t_PixelFront == m_IgnoreValue && t_PixelBack == m_IgnoreValue) + return FALSE; + + + // Check if the particle has interact before, if yes, add up the energies. + vector<DSSDData>::iterator it; + + it= m_HitFront.find(DSSDData::CalculateIndex(t_PixelFront,t_DetectorNbr)); + if(it!=m_HitFront.end()){ + it->Add(t_Energy); + } + + else{ + m_HitFront.Set(t_Energy,t_Time,t_PixelFront,t_DetectorNbr); + } + + // Check if the particle has interact before, if yes, add up the energies. + it= m_HitBack.find(DSSDData::CalculateIndex(t_PixelBack,t_DetectorNbr)); + if(it!=m_HitBack.end()){ + it->Add(t_Energy); + } + + else{ + m_HitBack.Set(t_Energy,t_Time,t_PixelBack,t_DetectorNbr); + } + + return TRUE; + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Images::Initialize(G4HCofThisEvent*){ + clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Images::EndOfEvent(G4HCofThisEvent*){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Images::clear(){ + m_HitFront.clear(); + m_HitBack.clear(); +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Images::GetARGBFront(unsigned int& i,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b){ + unsigned int Info = m_HitFront[i]->GetStrip(); + a = (Info>>24)&0xff; + r = (Info>>16)&0xff; + g = (Info>>8)&0xff; + b = (Info>>0)&0xff; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Images::GetARGBBack(unsigned int& i,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b){ + unsigned int Info = m_HitBack[i]->GetStrip(); + a = (Info>>24)&0xff; + r = (Info>>16)&0xff; + g = (Info>>8)&0xff; + b = (Info>>0)&0xff; +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Rectangle::PS_Rectangle(G4String name,G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth,G4String axis) + :G4VPrimitiveScorer(name, depth){ + m_StripPlaneLength = StripPlaneLength; + m_StripPlaneWidth = StripPlaneWidth; + m_NumberOfStripLength = NumberOfStripLength; + m_NumberOfStripWidth = NumberOfStripWidth; + m_StripPitchLength = m_StripPlaneLength / m_NumberOfStripLength; + m_StripPitchWidth = m_StripPlaneWidth / m_NumberOfStripWidth; + m_Level = Level; + if(axis=="xy") + m_Axis=ps_xy; + else if(axis=="yz") + m_Axis=ps_yz; + else if(axis=="xz") + m_Axis=ps_xz; + + + } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Rectangle::~PS_Rectangle(){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4bool PS_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){ + + // contain Energy Time, DetNbr, StripFront and StripBack + t_Energy = aStep->GetTotalEnergyDeposit(); + t_Time = aStep->GetPreStepPoint()->GetGlobalTime(); + + t_DetectorNumber = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_Level); + t_Position = aStep->GetPreStepPoint()->GetPosition(); + + t_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(t_Position); + + if(m_Axis==ps_xy){ + t_StripLengthNumber = (int)((t_Position.x() + m_StripPlaneLength / 2.) / m_StripPitchLength ) + 1 ; + t_StripWidthNumber = (int)((t_Position.y() + m_StripPlaneWidth / 2.) / m_StripPitchWidth ) + 1 ; + } + else if(m_Axis==ps_yz){ + t_StripLengthNumber = (int)((t_Position.y() + m_StripPlaneLength / 2.) / m_StripPitchLength ) + 1 ; + t_StripWidthNumber = (int)((t_Position.z() + m_StripPlaneWidth / 2.) / m_StripPitchWidth ) + 1 ; + } + else if(m_Axis==ps_xz){ + t_StripLengthNumber = (int)((t_Position.x() + m_StripPlaneLength / 2.) / m_StripPitchLength ) + 1 ; + t_StripWidthNumber = (int)((t_Position.z() + m_StripPlaneWidth / 2.) / m_StripPitchWidth ) + 1 ; + } + + //Rare case where particle is close to edge of silicon plan + if (t_StripLengthNumber > m_NumberOfStripLength) t_StripLengthNumber = m_NumberOfStripLength; + if (t_StripWidthNumber > m_NumberOfStripWidth) t_StripWidthNumber = m_NumberOfStripWidth; + + // Check if the particle has interact before, if yes, add up the energies. + vector<DSSDData>::iterator it; + // Length + it = m_HitLength.find(DSSDData::CalculateIndex(t_StripLengthNumber,t_DetectorNumber)); + if(it!=m_HitLength.end()){ + it->Add(t_Energy); + } + else + m_HitLength.Set(t_Energy,t_Time,t_StripLengthNumber,t_DetectorNumber); + // Width + it = m_HitWidth.find(DSSDData::CalculateIndex(t_StripWidthNumber,t_DetectorNumber)); + if(it!=m_HitWidth.end()){ + it->Add(t_Energy); + } + else + m_HitWidth.Set(t_Energy,t_Time,t_StripWidthNumber,t_DetectorNumber); + + +return TRUE; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Rectangle::Initialize(G4HCofThisEvent*){ + clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Rectangle::EndOfEvent(G4HCofThisEvent*){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Rectangle::clear(){ + m_HitLength.clear(); + m_HitWidth.clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Rectangle::DrawAll(){ + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Rectangle::PrintAll(){ +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Annular::PS_Annular(G4String name,G4int Level, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double PhiStart,G4double PhiStop, G4int NumberOfStripRing,G4int NumberOfStripSector,G4int NumberOfQuadrant,G4int depth) + :G4VPrimitiveScorer(name, depth){ + + m_StripPlaneInnerRadius = StripPlaneInnerRadius; + m_StripPlaneOuterRadius = StripPlaneOuterRadius; + m_PhiStart = PhiStart; + m_PhiStop = PhiStop; + m_NumberOfStripRing = NumberOfStripRing; + m_NumberOfStripSector = NumberOfStripSector; + m_NumberOfStripQuadrant = NumberOfQuadrant; + m_StripPitchRing = (m_StripPlaneOuterRadius-m_StripPlaneInnerRadius)/m_NumberOfStripRing; + m_StripPitchSector = (m_PhiStop-m_PhiStart)/m_NumberOfStripSector; + m_StripPitchQuadrant = (m_PhiStop-m_PhiStart)/m_NumberOfStripQuadrant; + m_Level = Level; + + m_uz = G4ThreeVector(0,0,1); + } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Annular::~PS_Annular(){ +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4bool PS_Annular::ProcessHits(G4Step* aStep, G4TouchableHistory*){ + t_Energy = aStep->GetTotalEnergyDeposit(); + + t_Time = aStep->GetPreStepPoint()->GetGlobalTime(); + + t_DetectorNumber = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_Level); + t_Position = aStep->GetPreStepPoint()->GetPosition(); + + //Transform into local coordinates + t_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(t_Position); + t_StripRingNumber = (int) ((t_Position.rho() - m_StripPlaneInnerRadius) / m_StripPitchRing ) + 1 ; + + // phi() from G4-CLHEP method return azimuth between [-pi;pi] + // we need it in [0;2pi] to calculate sector nbr in [1,NSectors] + // only add 360 if the value is negative + double phi = (t_Position.phi()<0)? t_Position.phi()+2*pi : t_Position.phi() ; + + // factor out the extra 360 degrees before strip/quad calculation + t_StripSectorNumber = (int) ( fmod((phi - m_PhiStart),2*pi) / m_StripPitchSector ) + 1 ; + t_StripQuadrantNumber = (int) ( fmod((phi - m_PhiStart),2*pi) / m_StripPitchQuadrant) + 1 ; + + //Rare case where particle is close to edge of silicon plan + if (t_StripRingNumber > m_NumberOfStripRing) t_StripRingNumber = m_NumberOfStripRing; + if (t_StripSectorNumber > m_NumberOfStripSector) t_StripSectorNumber = m_NumberOfStripSector; + if (t_StripQuadrantNumber > m_NumberOfStripQuadrant) t_StripQuadrantNumber = m_NumberOfStripQuadrant; + + vector<DSSDData>::iterator it; + // Ring + it = m_HitRing.find(DSSDData::CalculateIndex(t_StripRingNumber,t_DetectorNumber)); + if(it!=m_HitRing.end()){ + it->Add(t_Energy); + } + else + m_HitRing.Set(t_Energy,t_Time,t_StripRingNumber,t_DetectorNumber); + + //Sector + it = m_HitSector.find(DSSDData::CalculateIndex(t_StripSectorNumber,t_DetectorNumber)); + if(it!=m_HitSector.end()){ + it->Add(t_Energy); + } + else + m_HitSector.Set(t_Energy,t_Time,t_StripSectorNumber,t_DetectorNumber); + + //Quadrant + it = m_HitQuadrant.find(DSSDData::CalculateIndex(t_StripQuadrantNumber,t_DetectorNumber)); + if(it!=m_HitQuadrant.end()){ + it->Add(t_Energy); + } + else + m_HitQuadrant.Set(t_Energy,t_Time,t_StripQuadrantNumber,t_DetectorNumber); + + return TRUE; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Annular::Initialize(G4HCofThisEvent*){ + clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Annular::EndOfEvent(G4HCofThisEvent*){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Annular::clear(){ + m_HitRing.clear(); + m_HitSector.clear(); + m_HitQuadrant.clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Annular::DrawAll(){ + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Annular::PrintAll(){ +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Resistive::PS_Resistive(G4String name,G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripWidth,G4int depth) + :G4VPrimitiveScorer(name, depth){ + m_StripPlaneLength = StripPlaneLength; + m_StripPlaneWidth = StripPlaneWidth; + m_NumberOfStripWidth = NumberOfStripWidth; + m_StripPitchWidth = m_StripPlaneWidth / m_NumberOfStripWidth; + m_Level = Level; + + t_Position = G4ThreeVector(-1000,-1000,-1000); + t_DetectorNumber = -1; + t_StripWidthNumber = -1; + } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Resistive::~PS_Resistive(){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4bool PS_Resistive::ProcessHits(G4Step* aStep, G4TouchableHistory*){ + + // contain Energy Total, E1, E2, Time, DetNbr, and StripWidth + t_Energy = aStep->GetTotalEnergyDeposit(); + t_Time = aStep->GetPreStepPoint()->GetGlobalTime(); + + t_DetectorNumber = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_Level); + t_Position = aStep->GetPreStepPoint()->GetPosition(); + t_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(t_Position); + + t_StripWidthNumber = (int)((t_Position.x() + m_StripPlaneWidth / 2.) / m_StripPitchWidth ) + 1 ; + + // The energy is divided in two depending on the position + // position along the resistive strip + double P = (t_Position.z())/(0.5*m_StripPlaneLength); + // Energy + t_EnergyUp = aStep->GetTotalEnergyDeposit()*(1+P)*0.5; + t_EnergyDown = t_Energy-t_EnergyUp; + + //Rare case where particle is close to edge of silicon plan + if (t_StripWidthNumber > m_NumberOfStripWidth) t_StripWidthNumber = m_NumberOfStripWidth; + + + // Up + vector<DSSDData>::iterator it; + it = m_HitUp.find(DSSDData::CalculateIndex(t_DetectorNumber,t_StripWidthNumber)); + if(it!=m_HitUp.end()) + it->Add(t_EnergyUp); + else + m_HitUp.Set(t_EnergyUp,t_Time,t_DetectorNumber,t_StripWidthNumber); + + // Down + it = m_HitDown.find(DSSDData::CalculateIndex(t_DetectorNumber,t_StripWidthNumber)); + if(it!=m_HitDown.end()) + it->Add(t_EnergyDown); + else + m_HitDown.Set(t_EnergyDown,t_Time,t_DetectorNumber,t_StripWidthNumber); + + // Back + it = m_HitBack.find(DSSDData::CalculateIndex(t_DetectorNumber,t_StripWidthNumber)); + if(it!=m_HitBack.end()) + it->Add(t_Energy); + else + m_HitBack.Set(t_Energy,t_Time,t_DetectorNumber,1); + + + + return TRUE; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Resistive::Initialize(G4HCofThisEvent* HCE){ + m_HitUp.clear(); + m_HitDown.clear(); + m_HitBack.clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Resistive::EndOfEvent(G4HCofThisEvent*){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Resistive::clear(){ + m_HitUp.clear(); + m_HitDown.clear(); + m_HitBack.clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Resistive::DrawAll(){ + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Resistive::PrintAll(){ +} diff --git a/NPSimulation/Scorers/DSSDScorers.hh b/NPSimulation/Scorers/DSSDScorers.hh new file mode 100644 index 0000000000000000000000000000000000000000..3447ed112e7dec4e9ec6f03b6689ba64d9ec2330 --- /dev/null +++ b/NPSimulation/Scorers/DSSDScorers.hh @@ -0,0 +1,360 @@ +#ifndef DSSDScorers_h +#define DSSDScorers_h 1 +/***************************************************************************** + * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : February 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * File old the scorer specific to the Silicon Detector * + * * + *---------------------------------------------------------------------------* + * Comment: * + * This new style of scorer is aim to become the standard way of doing scorer* + * in NPTool. * + *The index is build using the TrackID, Detector Number and Strip Number. * + *The scorer Hold Energy and time together * + *Only one scorer is needed for a detector * + *****************************************************************************/ +#include "G4VPrimitiveScorer.hh" +#include "NPSHitsMap.hh" +#include "NPImage.h" +#include <unordered_map> +using namespace std; +using namespace CLHEP; + +namespace DSSDScorers { + // Hold data for DSSD hit + class DSSDData{ + public: + DSSDData(){}; + DSSDData(const double& Energy, const double& Time, const unsigned int& Strip, const unsigned int& Detector){ + m_Energy=Energy; + m_Time=Time; + m_Strip=Strip; + m_Detector=Detector; + m_Index = CalculateIndex(m_Strip,m_Detector); + } + + ~DSSDData(){}; + + private: + unsigned int m_Index; + double m_Energy; + double m_Time; + unsigned int m_Strip; + unsigned int m_Detector; + + public : // Modifier + inline void Set(const double& Energy, const double& Time, const unsigned int& Strip, const unsigned int& Detector){ + m_Energy=Energy; + m_Time=Time; + m_Strip=Strip; + m_Detector=Detector; + m_Index = CalculateIndex(m_Strip,m_Detector); + } + + inline void Add(const double& Energy) {m_Energy+=Energy;}; + + public: // Accessor + inline unsigned int GetIndex() const {return m_Index;}; + inline double GetEnergy() const {return m_Energy;}; + inline double GetTime() const {return m_Time;}; + inline unsigned int GetStrip() const {return m_Strip;}; + inline unsigned int GetDetector() const {return m_Detector;}; + + public: + static unsigned int CalculateIndex(const unsigned int& Strip,const unsigned int& Detector) {return Detector*1e6+Strip;} + + }; + + // Manage a vector of DSSD hit + class DSSDDataVector{ + public: + DSSDDataVector(){}; + ~DSSDDataVector(){}; + + private: + vector<DSSDData> m_Data; + + public: + vector<DSSDData>::iterator find(const unsigned int& index) ; + inline void clear(){m_Data.clear();} ; + inline vector<DSSDData>::iterator end() {return m_Data.end();}; + inline vector<DSSDData>::iterator begin() {return m_Data.begin();}; + inline unsigned int size() {return m_Data.size();}; + inline void Add(const unsigned int& index,const double& Energy) {find(index)->Add(Energy);}; + inline void Set(const double& Energy, const double& Time, const unsigned int& Strip, const unsigned int& Detector) {m_Data.push_back(DSSDData(Energy,Time,Strip,Detector));}; + DSSDData* operator[](const unsigned int& i){return &m_Data[i];}; + }; + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class PS_Images : public G4VPrimitiveScorer{ + + public: // with description + PS_Images(G4String name, string imageFront,string imageBack,double scalingFront, double scalingBack, double centerOffsetX,double centerOffsetY,unsigned int ignoreValue, G4int depth=0); + ~PS_Images(){}; + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(){}; + void PrintAll(){}; + + private: // Geometry of the detector + NPL::Image* m_ImageFront; + NPL::Image* m_ImageBack; + double m_ScalingFront; + double m_ScalingBack; + double m_CenterOffsetX; + double m_CenterOffsetY; + unsigned int m_IgnoreValue; + + // Level at which to find the copy number linked to the detector number + G4int m_Level; + + private: // inherited from G4VPrimitiveScorer + DSSDDataVector m_HitFront; + DSSDDataVector m_HitBack; + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector t_Position; + unsigned int t_Index; + double t_Energy; + double t_Time; + unsigned int t_DetectorNbr; + unsigned int t_PixelFront; + unsigned int t_PixelBack; + + public: // information accessor + inline unsigned int GetFrontMult() {return m_HitFront.size();}; + inline unsigned int GetStripFront(const unsigned int& i){return m_HitFront[i]->GetStrip();}; + inline unsigned int GetDetectorFront(const unsigned int& i){return m_HitFront[i]->GetDetector();}; + inline double GetEnergyFront(const unsigned int& i){return m_HitFront[i]->GetEnergy();}; + inline double GetTimeFront(const unsigned int& i){return m_HitFront[i]->GetTime();}; + inline unsigned int GetBackMult() {return m_HitBack.size();}; + inline unsigned int GetStripBack(const unsigned int& i){return m_HitBack[i]->GetStrip();}; + inline unsigned int GetDetectorBack(const unsigned int& i){return m_HitBack[i]->GetDetector();}; + inline double GetEnergyBack(const unsigned int& i){return m_HitBack[i]->GetEnergy();}; + inline double GetTimeBack(const unsigned int& i){return m_HitBack[i]->GetTime();}; + + void GetARGBFront(unsigned int& i,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b); + void GetARGBBack(unsigned int& i,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b); + }; + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class PS_Rectangle : public G4VPrimitiveScorer{ + + public: // with description + PS_Rectangle(G4String name, G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth=0,G4String axis="xy"); + ~PS_Rectangle(); + + private: + enum psAxis{ps_xy,ps_yz,ps_xz}; + psAxis m_Axis; + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: // Geometry of the detector + double m_StripPlaneLength; + double m_StripPlaneWidth; + unsigned int m_NumberOfStripLength; + unsigned int m_NumberOfStripWidth; + double m_StripPitchLength; + double m_StripPitchWidth; + // Level at which to find the copy number linked to the detector number + int m_Level; + + private: // inherited from G4VPrimitiveScorer + DSSDDataVector m_HitLength; + DSSDDataVector m_HitWidth; + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector t_Position; + unsigned int t_Index; + double t_Energy; + double t_Time; + unsigned int t_DetectorNumber; + unsigned int t_StripLengthNumber; + unsigned int t_StripWidthNumber; + + public: + inline unsigned int GetLengthMult() {return m_HitLength.size();}; + inline unsigned int GetStripLength(const unsigned int& i){return m_HitLength[i]->GetStrip();}; + inline unsigned int GetDetectorLength(const unsigned int& i){return m_HitLength[i]->GetDetector();}; + inline double GetEnergyLength(const unsigned int& i){return m_HitLength[i]->GetEnergy();}; + inline double GetTimeLength(const unsigned int& i){return m_HitLength[i]->GetTime();}; + inline unsigned int GetWidthMult() {return m_HitWidth.size();}; + inline unsigned int GetStripWidth(const unsigned int& i){return m_HitWidth[i]->GetStrip();}; + inline unsigned int GetDetectorWidth(const unsigned int& i){return m_HitWidth[i]->GetDetector();}; + inline double GetEnergyWidth(const unsigned int& i){return m_HitWidth[i]->GetEnergy();}; + inline double GetTimeWidth(const unsigned int& i){return m_HitWidth[i]->GetTime();}; + + + public: + static unsigned int CalculateIndex(const unsigned int& Strip,const unsigned int& Detector) {return Detector*1e6+Strip;} + + + }; + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class PS_Annular : public G4VPrimitiveScorer{ + + public: // with description + PS_Annular(G4String name,G4int Level, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double PhiStart,G4double PhiStop, G4int NumberOfStripRing,G4int NumberOfStripSector=1, G4int NumberOfQuadrant=1,G4int depth=0); + ~PS_Annular(); + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: // Geometry of the detector + double m_StripPlaneInnerRadius; + double m_StripPlaneOuterRadius; + double m_PhiStart; + double m_PhiStop; + unsigned int m_NumberOfStripRing; + unsigned int m_NumberOfStripSector; + unsigned int m_NumberOfStripQuadrant; + double m_StripPitchRing; + double m_StripPitchSector; + double m_StripPitchQuadrant; + string m_Axis; + // Level at which to find the copy number linked to the detector number + int m_Level; + + + private: // inherited from G4VPrimitiveScorer + DSSDDataVector m_HitRing; + DSSDDataVector m_HitSector; + DSSDDataVector m_HitQuadrant; + + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector t_Position; + unsigned int t_Index; + double t_Energy; + double t_Time; + unsigned int t_DetectorNumber; + unsigned int t_StripRingNumber; + unsigned int t_StripSectorNumber; + unsigned int t_StripQuadrantNumber; + + public: + inline unsigned int GetRingMult() {return m_HitRing.size();}; + inline unsigned int GetStripRing(const unsigned int& i){return m_HitRing[i]->GetStrip();}; + inline unsigned int GetDetectorRing(const unsigned int& i){return m_HitRing[i]->GetDetector();}; + inline double GetEnergyRing(const unsigned int& i){return m_HitRing[i]->GetEnergy();}; + inline double GetTimeRing(const unsigned int& i){return m_HitRing[i]->GetTime();}; + inline unsigned int GetSectorMult() {return m_HitSector.size();}; + inline unsigned int GetStripSector(const unsigned int& i){return m_HitSector[i]->GetStrip();}; + inline unsigned int GetDetectorSector(const unsigned int& i){return m_HitSector[i]->GetDetector();}; + inline double GetEnergySector(const unsigned int& i){return m_HitSector[i]->GetEnergy();}; + inline double GetTimeSector(const unsigned int& i){return m_HitSector[i]->GetTime();}; + inline unsigned int GetQuadrantMult() {return m_HitQuadrant.size();}; + inline unsigned int GetStripQuadrant(const unsigned int& i){return m_HitQuadrant[i]->GetStrip();}; + inline unsigned int GetDetectorQuadrant(const unsigned int& i){return m_HitQuadrant[i]->GetDetector();}; + inline double GetEnergyQuadrant(const unsigned int& i){return m_HitQuadrant[i]->GetEnergy();}; + inline double GetTimeQuadrant(const unsigned int& i){return m_HitQuadrant[i]->GetTime();}; + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector m_uz ; + + public: + static unsigned int CalculateIndex(const unsigned int& Strip,const unsigned int& Detector) {return Detector*1e6+Strip;} + + + }; + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class PS_Resistive : public G4VPrimitiveScorer{ + + public: // with description + PS_Resistive(G4String name, G4int Level, + G4double StripPlaneLength, G4double StripPlaneWidth, + G4int NumberOfStripWidth,G4int depth=0); + + ~PS_Resistive(); + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: // Geometry of the detector + double m_StripPlaneLength; + double m_StripPlaneWidth; + unsigned int m_NumberOfStripWidth; + double m_StripPitchWidth; + // Level at which to find the copy number linked to the detector number + G4int m_Level; + + private: + // Up and Down are each extremities of the resistive strip + DSSDDataVector m_HitUp; + DSSDDataVector m_HitDown; + DSSDDataVector m_HitBack; + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector t_Position; + double t_Energy; + double t_EnergyUp; + double t_EnergyDown; + double t_Time; + unsigned int t_DetectorNumber; + unsigned int t_StripWidthNumber; + unsigned int t_Index; + public: + inline unsigned int GetUpMult() {return m_HitUp.size();}; + inline unsigned int GetStripUp(const unsigned int& i){return m_HitUp[i]->GetStrip();}; + inline unsigned int GetDetectorUp(const unsigned int& i){return m_HitUp[i]->GetDetector();}; + inline double GetEnergyUp(const unsigned int& i){return m_HitUp[i]->GetEnergy();}; + inline double GetTimeUp(const unsigned int& i){return m_HitUp[i]->GetTime();}; + inline unsigned int GetDownMult() {return m_HitDown.size();}; + inline unsigned int GetStripDown(const unsigned int& i){return m_HitDown[i]->GetStrip();}; + inline unsigned int GetDetectorDown(const unsigned int& i){return m_HitDown[i]->GetDetector();}; + inline double GetEnergyDown(const unsigned int& i){return m_HitDown[i]->GetEnergy();}; + inline double GetTimeDown(const unsigned int& i){return m_HitDown[i]->GetTime();}; + inline unsigned int GetBackMult() {return m_HitBack.size();}; + inline unsigned int GetStripBack(const unsigned int& i){return m_HitBack[i]->GetStrip();}; + inline unsigned int GetDetectorBack(const unsigned int& i){return m_HitBack[i]->GetDetector();}; + inline double GetEnergyBack(const unsigned int& i){return m_HitBack[i]->GetEnergy();}; + inline double GetTimeBack(const unsigned int& i){return m_HitBack[i]->GetTime();}; + + + }; + +} + + +#endif diff --git a/NPSimulation/Scorers/DriftElectronScorers.cc b/NPSimulation/Scorers/DriftElectronScorers.cc index 81c12c928d2969937aa6909d24ffe6ac2791c68e..916581839056999932c05f87cd00b36c0788c3fe 100644 --- a/NPSimulation/Scorers/DriftElectronScorers.cc +++ b/NPSimulation/Scorers/DriftElectronScorers.cc @@ -141,7 +141,8 @@ G4bool PS_DEDigitizer::ProcessHits(G4Step* aStep, G4TouchableHistory*){ Infos[7] = m_DetectorNumber; m_Index = aStep->GetTrack()->GetTrackID() + m_DetectorNumber*1e6 ; - G4String PID = aStep->GetTrack()->GetDefinition()->GetParticleName(); + static string PID ; + PID = aStep->GetTrack()->GetDefinition()->GetParticleName(); if(PID=="driftelectron"){ Infos[0] = aStep->GetTrack()->GetWeight(); diff --git a/NPSimulation/Scorers/InteractionScorers.cc b/NPSimulation/Scorers/InteractionScorers.cc new file mode 100644 index 0000000000000000000000000000000000000000..ee474ca5047124a1de06942512390bf3261960bb --- /dev/null +++ b/NPSimulation/Scorers/InteractionScorers.cc @@ -0,0 +1,79 @@ +/***************************************************************************** + * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : February 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * File old the scorer to record Hit energy,time and position * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include "InteractionScorers.hh" +#include "G4UnitsTable.hh" +using namespace InteractionScorers ; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +vector<InteractionData>::iterator InteractionDataVector::find(const unsigned int& index){ + for(vector<InteractionData>::iterator it= m_Data.begin() ; it !=m_Data.end() ; it++){ + if((*it).GetIndex()==index) + return it; + } + return m_Data.end(); +} + + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Interactions::PS_Interactions(G4String name,TInteractionCoordinates* Inter, int depth) :G4VPrimitiveScorer(name, depth){ + m_Level = depth; + m_InterractionCoordinates=Inter; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4bool PS_Interactions::ProcessHits(G4Step* aStep, G4TouchableHistory*){ + static G4StepPoint* point; + point = aStep->GetPreStepPoint(); + t_Energy = aStep->GetTotalEnergyDeposit(); + t_Time = point->GetGlobalTime(); + t_Position = point->GetPosition(); + t_Index = aStep->GetTrack()->GetTrackID(); + vector<InteractionData>::iterator it; + it = m_DataVector.find(t_Index); + if(it!=m_DataVector.end()) + it->Add(t_Energy); + else + m_DataVector.Set(t_Index,t_Energy,t_Time,t_Position.x(),t_Position.y(),t_Position.z(),t_Position.theta(),t_Position.phi()); + + + return TRUE; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Interactions::Initialize(G4HCofThisEvent*){ + // Clear is called by EventAction +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Interactions::EndOfEvent(G4HCofThisEvent*){ + unsigned int size = m_DataVector.size(); + + for(unsigned int i = 0 ; i < size ; i++) + m_InterractionCoordinates->SetInteraction(m_DataVector[i]->GetEnergy(),m_DataVector[i]->GetTime(),m_DataVector[i]->GetPositionX(),m_DataVector[i]->GetPositionY(),m_DataVector[i]->GetPositionZ(),m_DataVector[i]->GetTheta()/deg,m_DataVector[i]->GetPhi()/deg); + + m_DataVector.clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Interactions::clear(){ + m_DataVector.clear(); +} diff --git a/NPSimulation/Scorers/InteractionScorers.hh b/NPSimulation/Scorers/InteractionScorers.hh new file mode 100644 index 0000000000000000000000000000000000000000..2a091e17bc7f0265cd4675d61631654da3b47d97 --- /dev/null +++ b/NPSimulation/Scorers/InteractionScorers.hh @@ -0,0 +1,139 @@ +#ifndef InteractionScorers_h +#define InteractionScorers_h 1 +/***************************************************************************** + * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : February 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * File old the scorer to record Hit energy,time and position * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include "G4VPrimitiveScorer.hh" +#include "TInteractionCoordinates.h" +#include "NPImage.h" +#include <map> +using namespace std; +using namespace CLHEP; + +namespace InteractionScorers { + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class InteractionData{ + public: + InteractionData(){m_Index=0;}; + InteractionData(const unsigned int& Index ,const double& Energy, const double& Time , const double& PositionX, const double& PositionY, const double& PositionZ, const double& Theta, const double& Phi){ + m_Index = Index; + m_Energy = Energy; + m_Time = Time; + m_PositionX = PositionX;; + m_PositionY = PositionY; + m_PositionZ = PositionZ; + m_Theta = Theta; + m_Phi = Phi; + } + + ~InteractionData(){}; + + private: + unsigned int m_Index; + double m_Energy; + double m_Time; + double m_PositionX; + double m_PositionY; + double m_PositionZ; + double m_Theta; + double m_Phi; + + public: + unsigned int GetIndex() const{return m_Index;}; + double GetEnergy() const{return m_Energy;}; + double GetTime() const{return m_Time;}; + double GetPositionX() const{return m_PositionX;}; + double GetPositionY() const{return m_PositionY;}; + double GetPositionZ() const{return m_PositionZ;}; + double GetTheta() const{return m_Theta;}; + double GetPhi() const{return m_Phi;}; + + + public: + void Set(const unsigned int& Index, const double& Energy, const double& Time , const double& PositionX, const double& PositionY, const double& PositionZ, const double& Theta, const double& Phi){ + m_Index = Index; + m_Energy = Energy; + m_Time = Time; + m_PositionX = PositionX;; + m_PositionY = PositionY; + m_PositionZ = PositionZ; + m_Theta = Theta; + m_Phi = Phi; + } + void Add(const double& Energy){m_Energy+=Energy;}; + unsigned int GetIndex(){return m_Index;}; + }; + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + // Manage a vector of Interaction hit + class InteractionDataVector{ + public: + InteractionDataVector(){}; + ~InteractionDataVector(){}; + + private: + vector<InteractionData> m_Data; + + public: + vector<InteractionData>::iterator find(const unsigned int& index) ; + void clear(){m_Data.clear();} ; + vector<InteractionData>::iterator end() {return m_Data.end();}; + vector<InteractionData>::iterator begin() {return m_Data.begin();}; + unsigned int size() {return m_Data.size();}; + void Add(const unsigned int& index,const double& Energy) {find(index)->Add(Energy);}; + void Set(const unsigned int& index,const double& Energy, const double& Time , const double& PositionX, const double& PositionY, const double& PositionZ, const double& Theta, const double& Phi) {m_Data.push_back(InteractionData(index,Energy,Time,PositionX,PositionY,PositionZ,Theta,Phi));}; + InteractionData* operator[](const unsigned int& i){return &m_Data[i];}; + }; + + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class PS_Interactions : public G4VPrimitiveScorer{ + + public: // with description + PS_Interactions(G4String name, TInteractionCoordinates* Inter,G4int depth=0); + ~PS_Interactions(){}; + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(){}; + void PrintAll(){m_InterractionCoordinates->Dump();}; + + // Level at which to find the copy number linked to the detector number + G4int m_Level; + + private: + InteractionDataVector m_DataVector; + TInteractionCoordinates* m_InterractionCoordinates; + unsigned int t_Index; + double t_Energy; + double t_Time; + G4ThreeVector t_Position; + }; + +} + + +#endif diff --git a/NPSimulation/Scorers/TPCScorers.cc b/NPSimulation/Scorers/TPCScorers.cc index 29b4557181ad5edb45a0052b27ce7d0a21feb305..8fdad11fd127519790d9d45a933df1f6dbe6571e 100644 --- a/NPSimulation/Scorers/TPCScorers.cc +++ b/NPSimulation/Scorers/TPCScorers.cc @@ -1,6 +1,5 @@ /***************************************************************************** * Copyright (C) 2009-2016 this file is part of the NPTool Project * - * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ @@ -21,12 +20,21 @@ *****************************************************************************/ #include "TPCScorers.hh" #include "G4UnitsTable.hh" -using namespace TPCSCORERS ; +using namespace TPCScorers; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +vector<CathodeData>::iterator CathodeDataVector::find(const unsigned int& index){ + for(vector<CathodeData>::iterator it= m_Data.begin() ; it !=m_Data.end() ; it++){ + if((*it).GetIndex()==index) + return it; + } + return m_Data.end(); +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PS_TPCCathode::PS_TPCCathode(G4String name,G4int depth) -:G4VPrimitiveScorer(name, depth),HCID(-1){ - m_Index = -1 ; +:G4VPrimitiveScorer(name, depth){ m_Level = depth; } @@ -36,60 +44,39 @@ PS_TPCCathode::~PS_TPCCathode(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4bool PS_TPCCathode::ProcessHits(G4Step* aStep, G4TouchableHistory*){ - - // contain Energy Time, DetNbr, StripFront and StripBack - G4double* Infos = new G4double[10]; - Infos[0] = 0; - Infos[1] = aStep->GetPreStepPoint()->GetProperTime(); - - m_DetectorNumber = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_Level); - m_Position = aStep->GetPreStepPoint()->GetPosition(); - - // Interaction coordinates (used to fill the InteractionCoordinates branch) - Infos[2] = m_Position.x(); - Infos[3] = m_Position.y(); - Infos[4] = m_Position.z(); - Infos[5] = m_Position.theta(); - Infos[6] = m_Position.phi(); - Infos[7] = m_DetectorNumber; - - + + G4String PID = aStep->GetTrack()->GetDefinition()->GetParticleName(); - m_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(m_Position); - - - Infos[8] = (int)((m_Position.z()+128)/2); - Infos[9] = (int)((m_Position.x()+128)/2); - - m_Index = Infos[8] + 128*Infos[9] ; - - - if(PID=="driftelectron"){ - Infos[0] = aStep->GetTrack()->GetWeight(); + if(PID!="driftelectron"){ + return false; } + + // contain Energy Time, DetNbr, StripFront and StripBack + t_Charge = aStep->GetTrack()->GetWeight(); + t_Time = aStep->GetPreStepPoint()->GetProperTime(); - // Check if the particle has interact before, if yes, add up the number of electron. - map<G4int, G4double**>::iterator it; - it= EvtMap->GetMap()->find(m_Index); - if(it!=EvtMap->GetMap()->end()){ - G4double* dummy = *(it->second); - Infos[0]+=dummy[0]; - Infos[1]=dummy[1]; - delete dummy; - } + t_Detector = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_Level); + t_Position = aStep->GetPreStepPoint()->GetPosition(); + t_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(t_Position); - EvtMap->set(m_Index, Infos); + t_PadX = (int)((t_Position.z()+128)/2); + t_PadY = (int)((t_Position.x()+128)/2); + + vector<CathodeData>::iterator it; + it = m_Data.find(CathodeData::CalculateIndex(t_Detector,t_PadX,t_PadY)); + if(it!= m_Data.end()) + it->Add(t_Charge); + + else + m_Data.Set(t_Charge,t_Time,t_Detector,t_PadX,t_PadY); + return TRUE; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PS_TPCCathode::Initialize(G4HCofThisEvent* HCE){ - EvtMap = new NPS::HitsMap<G4double*>(GetMultiFunctionalDetector()->GetName(), GetName()); - if (HCID < 0) { - HCID = GetCollectionID(0); - } - HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap); +void PS_TPCCathode::Initialize(G4HCofThisEvent*){ + m_Data.clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -98,12 +85,7 @@ void PS_TPCCathode::EndOfEvent(G4HCofThisEvent*){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PS_TPCCathode::clear(){ - std::map<G4int, G4double**>::iterator MapIterator; - for (MapIterator = EvtMap->GetMap()->begin() ; MapIterator != EvtMap->GetMap()->end() ; MapIterator++){ - delete *(MapIterator->second); - } - - EvtMap->clear(); + m_Data.clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -113,8 +95,5 @@ void PS_TPCCathode::DrawAll(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PS_TPCCathode::PrintAll(){ - G4cout << " MultiFunctionalDet " << detector->GetName() << G4endl ; - G4cout << " PrimitiveScorer " << GetName() << G4endl ; - G4cout << " Number of entries " << EvtMap->entries() << G4endl ; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Scorers/TPCScorers.hh b/NPSimulation/Scorers/TPCScorers.hh index 6a3bc6db43e35d97a891b0535a412382d4d3f036..fdb3b25238b709ad3f57efadf0984cb1620f77d5 100644 --- a/NPSimulation/Scorers/TPCScorers.hh +++ b/NPSimulation/Scorers/TPCScorers.hh @@ -30,65 +30,133 @@ using namespace std; using namespace CLHEP; -namespace TPCSCORERS { -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - class PS_TPCCathode : public G4VPrimitiveScorer{ - - public: // with description - PS_TPCCathode(G4String name,G4int depth=0); - ~PS_TPCCathode(); - - protected: // with description - G4bool ProcessHits(G4Step*, G4TouchableHistory*); +namespace TPCScorers{ + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class CathodeData{ + public: + CathodeData(){}; + CathodeData(const double& Charge, const double& Time,const unsigned int& Detector, const unsigned int& PadX, const unsigned int& PadY){ + m_Charge = Charge; + m_Time = Time; + m_Detector = Detector; + m_PadX = PadX; + m_PadY = PadY; + m_Index = CalculateIndex(m_Detector,m_PadX,m_PadY); + } + ~CathodeData(){}; - public: - void Initialize(G4HCofThisEvent*); - void EndOfEvent(G4HCofThisEvent*); - void clear(); - void DrawAll(); - void PrintAll(); + private: + unsigned int m_Index; + double m_Charge; + double m_Time; + unsigned int m_Detector; + unsigned int m_PadX; + unsigned int m_PadY; + + public: + static unsigned int CalculateIndex(const unsigned int& DetectorNumber,const unsigned int& PadX, const unsigned int& PadY){return DetectorNumber+PadX*1e3+PadY*3e6;}; + inline unsigned int GetIndex() const {return m_Index;}; + inline double GetCharge() const {return m_Charge;}; + inline double GetTime() const {return m_Time;}; + inline unsigned int GetDetector() const {return m_Detector;}; + inline unsigned int GetPadX() const {return m_PadX;}; + inline unsigned int GetPadY() const {return m_PadY;}; + void Add(const double& Charge){m_Charge+=Charge;}; + }; + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + // Manage a vector of Cathode hit + class CathodeDataVector{ + public: + CathodeDataVector(){}; + ~CathodeDataVector(){}; + + private: + vector<CathodeData> m_Data; + + public: + vector<CathodeData>::iterator find(const unsigned int& index) ; + void clear(){m_Data.clear();} ; + vector<CathodeData>::iterator end() {return m_Data.end();}; + vector<CathodeData>::iterator begin() {return m_Data.begin();}; + unsigned int size() {return m_Data.size();}; + void Add(const unsigned int& index,const double& Charge) {find(index)->Add(Charge);}; + void Set(const double& Charge, const double& Time, const unsigned int& Detector, const unsigned int& PadX, const unsigned int& PadY) {m_Data.push_back(CathodeData(Charge,Time,Detector,PadX,PadY));}; + CathodeData* operator[](const unsigned int& i){return &m_Data[i];}; + }; + + -private: // inherited from G4VPrimitiveScorer - G4int HCID; - NPS::HitsMap<G4double*>* EvtMap; - - private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) - G4int m_Index; - G4int m_Level; - G4int m_DetectorNumber; - G4ThreeVector m_Position; + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class PS_TPCCathode : public G4VPrimitiveScorer{ + + public: // with description + PS_TPCCathode(G4String name,G4int depth=0); + ~PS_TPCCathode(); + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: + CathodeDataVector m_Data; + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + unsigned int m_Level; + double t_Charge; + double t_Time; + unsigned int t_Detector; + unsigned int t_PadX; + unsigned int t_PadY; + G4ThreeVector t_Position; + public: + unsigned int GetMult(){return m_Data.size();}; + double GetCharge(const double& i) {return m_Data[i]->GetCharge();}; + double GetTime(const double& i) {return m_Data[i]->GetTime();}; + unsigned int GetDetector(const unsigned int& i) {return m_Data[i]->GetDetector();}; + unsigned int GetPadX(const unsigned int& i) {return m_Data[i]->GetPadX();}; + unsigned int GetPadY(const unsigned int& i) {return m_Data[i]->GetPadY();}; + + }; -//////////////////////////////////////////////////////////////////////////////// +/* //////////////////////////////////////////////////////////////////////////////// class PS_DEDigitizer : public G4VPrimitiveScorer{ - - public: // with description - PS_DEDigitizer(G4String name,G4int depth=0); - ~PS_DEDigitizer(); - - protected: // with description - G4bool ProcessHits(G4Step*, G4TouchableHistory*); - - public: - void Initialize(G4HCofThisEvent*); - void EndOfEvent(G4HCofThisEvent*); - void clear(); - void DrawAll(); - void PrintAll(); - -private: // inherited from G4VPrimitiveScorer + + public: // with description + PS_DEDigitizer(G4String name,G4int depth=0); + ~PS_DEDigitizer(); + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: // inherited from G4VPrimitiveScorer G4int HCID; NPS::HitsMap<G4double*>* EvtMap; - - private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) G4int m_Index; G4int m_Level; G4int m_DetectorNumber; G4ThreeVector m_Position; - + }; - +*/ } #endif diff --git a/NPSimulation/Simulation.cc b/NPSimulation/Simulation.cc index b15420bc908d392d02336750a1a3d417ed9d7c72..03a09d5c51b8458fed8a9c024043595f98a21032 100644 --- a/NPSimulation/Simulation.cc +++ b/NPSimulation/Simulation.cc @@ -118,7 +118,6 @@ int main(int argc, char** argv){ UImanager->ApplyCommand("/control/execute " +Path_Macro+"verbose.mac"); #ifdef G4VIS_USE - UImanager->ApplyCommand("/control/execute " +Path_Macro+"aliases.mac"); visManager = new G4VisExecutive("Quiet"); visManager->Initialize(); @@ -136,6 +135,9 @@ int main(int argc, char** argv){ #endif } + else{// if batch mode do not accumulate any track + UImanager->ApplyCommand("/vis/scene/endOfEventAction accumulate 0"); + } // Execute user macro if(!OptionManager->IsDefault("G4MacroPath")){ UImanager->ApplyCommand("/control/execute "+ OptionManager->GetG4MacroPath()); diff --git a/NPSimulation/ressources/macro/vis.mac.in b/NPSimulation/ressources/macro/vis.mac.in index 1f5278571fefb39eff468cba0f429b8e3b83c887..90eb72614f2f1685cf5abb97e95c0c5f7db76154 100644 --- a/NPSimulation/ressources/macro/vis.mac.in +++ b/NPSimulation/ressources/macro/vis.mac.in @@ -49,7 +49,7 @@ /vis/modeling/trajectories/select DrawByParentID # To superimpose all of the events from a given run: -/vis/scene/endOfEventAction accumulate +/vis/scene/endOfEventAction accumulate 10 # Re-establish auto refreshing and verbosity: /vis/viewer/set/autoRefresh true diff --git a/Outputs/.gitignore b/Outputs/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Outputs/Analysis/.gitignore b/Outputs/Analysis/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Outputs/Simulation/.gitignore b/Outputs/Simulation/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Projects/Actar/Analysis.cxx b/Projects/Actar/Analysis.cxx index 871dc451858b90a42ee543559542a2325ca1bdea..95729ddb778e98cea987a50662eda505a0a419a2 100644 --- a/Projects/Actar/Analysis.cxx +++ b/Projects/Actar/Analysis.cxx @@ -39,34 +39,42 @@ Analysis::~Analysis(){ //////////////////////////////////////////////////////////////////////////////// void Analysis::Init(){ Actar= (TActarPhysics*) m_DetectorManager->GetDetector("Actar"); - + ReactionConditions = new TReactionConditions(); + Actar->ReadAnalysisConfig(); if(Actar->GetRansacStatus()){ Actar->SetRansacParameter("./configs/RansacConfig.dat"); } - + DriftVelocity = Actar->GetDriftVelocity(); PadSizeX = Actar->GetPadSizeX(); PadSizeY = Actar->GetPadSizeY(); NumberOfPadsX = Actar->GetNumberOfPadsX(); NumberOfPadsY = Actar->GetNumberOfPadsY(); - - EnergyLoss_3He = NPL::EnergyLoss("EnergyLossTable/He3_D2_6.24151e+08_295.G4table","G4Table",100); - EnergyLoss_17C = NPL::EnergyLoss("EnergyLossTable/C17_D2_6.24151e+08_295.G4table","G4Table",100); + + EnergyLoss_3He = NPL::EnergyLoss("./EnergyLossTable/He3_D2_6.24151e+08_295.G4table","G4Table",100); + EnergyLoss_17C = NPL::EnergyLoss("./EnergyLossTable/C17_D2_6.24151e+08_295.G4table","G4Table",100); TheReaction = new NPL::Reaction("17C(d,3He)16B@510"); - + InitOutputBranch(); + InitInputBranch(); } //////////////////////////////////////////////////////////////////////////////// void Analysis::TreatEvent(){ ReInitValue(); + if(ReactionConditions->GetParticleMultiplicity()>0){ + InitXVertex = ReactionConditions->GetVertexPositionZ(); + InitE3 = ReactionConditions->GetKineticEnergy(0); + InitTheta3 = ReactionConditions->GetTheta(0); + } + int TrackMult = Actar->GetTrackMult(); - + TVector3 vX = TVector3(1,0,0); TVector3 aTrack, vB; - + if(TrackMult>1){ vTrack = Actar->GetTracks(); double scalarproduct=0; @@ -83,37 +91,37 @@ void Analysis::TreatEvent(){ scalarproduct=scalar; } } - + double XBeam = vTrack[BeamTrack].GetDirectionVector().X(); double YBeam = vTrack[BeamTrack].GetDirectionVector().Y(); double ZBeam = vTrack[BeamTrack].GetDirectionVector().Z(); TVector3 vBeam = TVector3(XBeam,YBeam,ZBeam); - + double XBeamPoint = vTrack[BeamTrack].GetXh(); double YBeamPoint = vTrack[BeamTrack].GetYh(); double ZBeamPoint = vTrack[BeamTrack].GetZh(); TVector3 vBeamPos = TVector3(XBeamPoint,YBeamPoint,ZBeamPoint); - + vB = TVector3(XBeam*PadSizeX, YBeam*PadSizeY,ZBeam*DriftVelocity); BeamAngle = (vX.Angle(vB))*180/TMath::Pi(); - + for(unsigned int i=0; i<TrackMult; i++){ if(i!=BeamTrack){ double Xdir = vTrack[i].GetDirectionVector().X(); double Ydir = vTrack[i].GetDirectionVector().Y(); double Zdir = vTrack[i].GetDirectionVector().Z(); - + XVertex.push_back(vTrack[i].GetVertexPostion(vBeam,vBeamPos).X()*PadSizeX); YVertex.push_back(vTrack[i].GetVertexPostion(vBeam,vBeamPos).Y()*PadSizeY); ZVertex.push_back(vTrack[i].GetVertexPostion(vBeam,vBeamPos).Z()*DriftVelocity); - + aTrack = TVector3(Xdir*PadSizeX, Ydir*PadSizeY, Zdir*DriftVelocity); - - + + double angle = vX.Angle(aTrack)*180/TMath::Pi(); - //double angle = vX.Angle(aTrack)*180/TMath::Pi(); + //double angle = vB.Angle(aTrack)*180/TMath::Pi(); if(angle>90) angle = 180-angle; - + double x1 = vTrack[i].GetXm()*PadSizeX; double x2 = vTrack[i].GetXh()*PadSizeX; double y1 = vTrack[i].GetYm()*PadSizeY-0.5*NumberOfPadsY*PadSizeY; @@ -122,30 +130,30 @@ void Analysis::TreatEvent(){ //double z2 = -(vTrack[i].GetZh()-256)*DriftVelocity; double z1 = vTrack[i].GetZm()*DriftVelocity; double z2 = vTrack[i].GetZh()*DriftVelocity; - + GetMayaSiHitPosition(x1,x2,y1,y2,z1,z2); - + if(XVertex[i]>0 && XVertex[i]<256){ - double SiDistanceToPadPlane = 47*mm; - double LengthInGas = 256-XVertex[i] + SiDistanceToPadPlane; + double LengthInGas = fSiDistanceX - XVertex[i]; for(unsigned int k=0; k<Actar->Si_E.size(); k++){ - ESi.push_back(Actar->Si_E[k]); - SiNumber.push_back(Actar->Si_Number[k]); - DE.push_back(vTrack[i].GetPartialCharge(108,128)/(20./cos(angle*TMath::Pi()/180))); - double E3 = EnergyLoss_3He.EvaluateInitialEnergy(Actar->Si_E[k]*MeV,LengthInGas*mm,angle*TMath::Pi()/180); - double BeamEnergy = EnergyLoss_17C.Slow(510*MeV,(XVertex[i]+60)*mm, BeamAngle*TMath::Pi()/180); - TheReaction->SetBeamEnergy(BeamEnergy); - ELab.push_back(E3); - ThetaLab.push_back(angle); - TheReaction->SetNuclei3(E3,angle*TMath::Pi()/180); - Ex.push_back(TheReaction->GetExcitation4()); - ThetaCM.push_back(TheReaction->GetThetaCM()*180./TMath::Pi()); + ESi.push_back(Actar->Si_E[k]); + SiNumber.push_back(Actar->Si_Number[k]); + + DE.push_back(vTrack[i].GetPartialCharge(108,128)/(20./cos(angle*TMath::Pi()/180))); + double E3 = EnergyLoss_3He.EvaluateInitialEnergy(Actar->Si_E[k]*MeV,LengthInGas*mm,angle*TMath::Pi()/180); + double BeamEnergy = EnergyLoss_17C.Slow(510*MeV,(XVertex[i]+60)*mm, BeamAngle*TMath::Pi()/180); + TheReaction->SetBeamEnergy(BeamEnergy); + ELab.push_back(E3); + ThetaLab.push_back(angle); + TheReaction->SetNuclei3(E3,angle*TMath::Pi()/180); + Ex.push_back(TheReaction->GetExcitation4()); + ThetaCM.push_back(TheReaction->GetThetaCM()*180./TMath::Pi()); } } } } } - + //for(unsigned int i=0; i<Actar->PadX.size(); i++){ //cout << "X= " << Actar->PadX[i] << endl; //} @@ -154,17 +162,47 @@ void Analysis::TreatEvent(){ //////////////////////////////////////////////////////////////////////////////// void Analysis::GetMayaSiHitPosition(double xm, double xh, double ym, double yh, double zm, double zh) { - double l = xm-xh; - double L = fSiDistanceX-xm; - - double t = (l+L)/l; - //double t = L/l; - - double zf = zh + (zm-zh)*t; - double yf = yh + (ym-yh)*t; - - //cout << zf << " " << yf << endl; - + double X1, X2, Y1, Y2, Z1, Z2; + + if(xm>xh){ + X1 = xh; + Y1 = yh; + Z1 = zh; + + X2 = xm; + Y2 = ym; + Z2 = zm; + } + else if(xh>xm){ + X1 = xm; + Y1 = ym; + Z1 = zm; + + X2 = xh; + Y2 = yh; + Z2 = zh; + } + + double l, L, t; + double zf, yf; + + if(fSiDistanceX>X2){ + L = fSiDistanceX-X2; + l = X2 - X1; + t = (l+L)/l; + + zf = Z1 + (Z2-Z1)*t; + yf = Y1 + (Y2-Y1)*t; + } + else if(fSiDistanceX<X2){ + L = X2 - fSiDistanceX; + l = fSiDistanceX - X1; + t = (l+L)/l; + + zf = Z1 + (Z2-Z1)/t; + yf = Y1 + (Y2-Y1)/t; + } + SiPosY.push_back(yf); SiPosZ.push_back(zf); } @@ -173,6 +211,12 @@ void Analysis::GetMayaSiHitPosition(double xm, double xh, double ym, double yh, void Analysis::End(){ } +//////////////////////////////////////////////////////////////////////////////// +void Analysis::InitInputBranch() { + RootInput::getInstance()->GetChain()->SetBranchStatus("ReactionConditions",true); + RootInput::getInstance()->GetChain()->SetBranchStatus("fRC_*",true); + RootInput::getInstance()->GetChain()->SetBranchAddress("ReactionConditions",&ReactionConditions); +} //////////////////////////////////////////////////////////////////////////////// void Analysis::InitOutputBranch() { RootOutput::getInstance()->GetTree()->Branch("DE",&DE); @@ -189,6 +233,9 @@ void Analysis::InitOutputBranch() { RootOutput::getInstance()->GetTree()->Branch("BeamAngle",&BeamAngle,"BeamAngle/D"); RootOutput::getInstance()->GetTree()->Branch("SiPosY",&SiPosY); RootOutput::getInstance()->GetTree()->Branch("SiPosZ",&SiPosZ); + RootOutput::getInstance()->GetTree()->Branch("InitXVertex",&InitXVertex,"InitXVertex/D"); + RootOutput::getInstance()->GetTree()->Branch("InitE3",&InitE3,"InitE3/D"); + RootOutput::getInstance()->GetTree()->Branch("InitTheta3",&InitTheta3,"InitTheta3/D"); } @@ -208,6 +255,9 @@ void Analysis::ReInitValue(){ SiPosY.clear(); SiPosZ.clear(); BeamAngle=-1000; + InitXVertex=-1000; + InitE3=-1000; + InitTheta3=-1000; } @@ -228,6 +278,6 @@ extern "C"{ NPL::AnalysisFactory::getInstance()->SetConstructor(Analysis::Construct); } }; - + proxy p; } diff --git a/Projects/Actar/Analysis.h b/Projects/Actar/Analysis.h index f7b74f42e40fe1c2b10285358372898c8fee2d46..b06fb6cfd6f25d1b0d51a2f06981d591737a087b 100644 --- a/Projects/Actar/Analysis.h +++ b/Projects/Actar/Analysis.h @@ -26,6 +26,7 @@ #include "NPEnergyLoss.h" #include "NPReaction.h" #include "NPTrack.h" +#include "TReactionConditions.h" @@ -33,35 +34,39 @@ class Analysis: public NPL::VAnalysis{ public: Analysis(); ~Analysis(); - + public: void Init(); void TreatEvent(); void End(); void InitOutputBranch(); + void InitInputBranch(); void ReInitValue(); void GetMayaSiHitPosition(double xm, double xh, double ym, double yh, double zm, double zh); - - + + static NPL::VAnalysis* Construct(); - + public: double DriftVelocity; double PadSizeX; double PadSizeY; int NumberOfPadsX; int NumberOfPadsY; - - + + private: - double fSiDistanceX=128+47; - + double fSiDistanceX=256+47; + TActarPhysics* Actar; - + vector<NPL::Track> vTrack; - + double BeamAngle; + double InitXVertex; + double InitE3; + double InitTheta3; vector<double> vScalar; vector<double> ThetaLab; vector<double> ELab; @@ -75,11 +80,13 @@ private: vector<double> ZVertex; vector<double> SiPosY; vector<double> SiPosZ; - + NPL::EnergyLoss EnergyLoss_3He; NPL::EnergyLoss EnergyLoss_17C; NPL::Reaction* TheReaction; - - + + TReactionConditions* ReactionConditions; + + }; #endif diff --git a/Projects/Actar/configs/ConfigActar.dat b/Projects/Actar/configs/ConfigActar.dat index f05aaed2abe78979e80a3c9bfe018d46dafc7001..206903cb7980904998c38ae98050304d0536b6a2 100644 --- a/Projects/Actar/configs/ConfigActar.dat +++ b/Projects/Actar/configs/ConfigActar.dat @@ -8,9 +8,8 @@ NumberOfPadsX= 128 NumberOfPadsY= 128 PadSizeX= 2 PadSizeY= 2 -%Gas= iC4H10 -Gas= D2 +Gas= iC4H10 +%Gas= D2 %Pressure in mbar -Pressure= 1000 -%mm/time bucket +Pressure= 100 DriftVelocity= 2.66 diff --git a/Projects/SharcEfficiency/configs/ConfigSharc.dat b/Projects/SharcEfficiency/configs/ConfigSharc.dat index 9c7ea5ce7ca5a0d3cdca49be2792c1abdbe5850d..9b31fee3485f90ad6670ff19f9479b29001d88ed 100644 --- a/Projects/SharcEfficiency/configs/ConfigSharc.dat +++ b/Projects/SharcEfficiency/configs/ConfigSharc.dat @@ -1,8 +1,9 @@ +%%% ConfigSharc.dat %%% ConfigSharc - STRIP_ENERGY_MATCHING_NUMBER_OF_SIGMA 20 + STRIP_ENERGY_MATCHING_NUMBER_OF_SIGMA 15 STRIP_ENERGY_MATCHING_SIGMA 0.060 % Detector 1 - DISABLE_CHANNEL SH01STRF7 + DISABLE_CHANNEL SH10STRF7 DISABLE_CHANNEL SH01STRF13 % Detector 2 DISABLE_CHANNEL SH02STRF1 @@ -71,14 +72,9 @@ ConfigSharc % Detector 9 DISABLE_ALL SH09 % Detector 10 - DISABLE_CHANNEL SH10STRF7 - DISABLE_CHANNEL SH10STRB1 - DISABLE_CHANNEL SH10STRB2 - DISABLE_CHANNEL SH10STRB3 - DISABLE_CHANNEL SH10STRB4 - DISABLE_CHANNEL SH10STRB8 - DISABLE_CHANNEL SH10STRB17 - DISABLE_CHANNEL SH10STRB36 + DISABLE_CHANNEL SH10STRF24 + DISABLE_CHANNEL SH10STRB8 + DISABLE_CHANNEL SH10STRB4 % Detector 11 DISABLE_ALL SH11 % Detector 12 @@ -91,9 +87,6 @@ ConfigSharc DISABLE_CHANNEL SH12STRB28 DISABLE_CHANNEL SH12STRB29 DISABLE_CHANNEL SH12STRB36 - DISABLE_CHANNEL SH12STRB45 - DISABLE_CHANNEL SH12STRB46 - DISABLE_CHANNEL SH12STRB47 DISABLE_CHANNEL SH12STRB48 -% PAD threshold - PAD_E_THRESHOLD 0.3 + +