using namespace std; 

struct myTree_t {
  UInt_t run_number;
  Float_t p_px;
  Float_t p_py;
  Float_t p_pz;
  Float_t p_E;

  Float_t kp_px;
  Float_t kp_py;
  Float_t kp_pz;
  Float_t kp_E;
  Float_t mass_kp;
  Float_t kp_P;
  Float_t pip_P;
  Float_t kp_P_mult;
  Float_t pip_P_mult;
  Float_t p_P_mult;

  Float_t km_px;
  Float_t km_py;
  Float_t km_pz;
  Float_t km_E;
  Float_t mass_km;
  Float_t km_P;
  Float_t pim_P;
  Float_t pi0_px;
  Float_t pi0_py;
  Float_t pi0_pz;
  Float_t pi0_E;

  Float_t m_kpkmpi0;
  Float_t m_kppi0;
  Float_t m_kmpi0;
  Float_t m_kpkm;
  Float_t t_mandelstam;
  Float_t s_mandelstam;
  Float_t beam_energy;
  bool TOF_bool;
  bool ST_bool;
  bool NULL_bool;
  Float_t polarization;
  Float_t weight;


  Float_t theta;
  Float_t cosTheta;
  Float_t phi;

  Float_t theta_H;
  Float_t cosTheta_H;
  Float_t phi_H;

  Float_t thetaGJ;
  Float_t cosThetaGJ;
  Float_t phiGJ;

  Float_t thetaGJ_H;
  Float_t cosThetaGJ_H;
  Float_t phiGJ_H;

};

void getBranchesStage1(TTree *inTree, myTree_t *myTree){

  inTree->SetBranchAddress("run_number",&myTree->run_number);
          
  inTree->SetBranchAddress("p_px",&myTree->p_px);
  inTree->SetBranchAddress("p_py",&myTree->p_py);
  inTree->SetBranchAddress("p_pz",&myTree->p_pz);
  inTree->SetBranchAddress("p_E",&myTree->p_E);

  inTree->SetBranchAddress("kp_px",&myTree->kp_px);
  inTree->SetBranchAddress("kp_py",&myTree->kp_py);
  inTree->SetBranchAddress("kp_pz",&myTree->kp_pz);
  inTree->SetBranchAddress("kp_E",&myTree->kp_E);

  inTree->SetBranchAddress("mass_kp",&myTree->mass_kp);
  inTree->SetBranchAddress("kp_P",&myTree->kp_P);
  inTree->SetBranchAddress("pip_P",&myTree->pip_P);
  inTree->SetBranchAddress("kp_P_mult",&myTree->kp_P_mult);
  inTree->SetBranchAddress("pip_P_mult",&myTree->pip_P_mult);
  inTree->SetBranchAddress("p_P_mult",&myTree->p_P_mult);


  inTree->SetBranchAddress("km_px",&myTree->km_px);
  inTree->SetBranchAddress("km_py",&myTree->km_py);
  inTree->SetBranchAddress("km_pz",&myTree->km_pz);
  inTree->SetBranchAddress("km_E",&myTree->km_E);

  inTree->SetBranchAddress("mass_km",&myTree->mass_km);
  inTree->SetBranchAddress("km_P",&myTree->km_P);
  inTree->SetBranchAddress("pim_P",&myTree->pim_P);

  inTree->SetBranchAddress("pi0_px",&myTree->pi0_px);
  inTree->SetBranchAddress("pi0_py",&myTree->pi0_py);
  inTree->SetBranchAddress("pi0_pz",&myTree->pi0_pz);
  inTree->SetBranchAddress("pi0_E",&myTree->pi0_E);

  inTree->SetBranchAddress("m_kpkmpi0",&myTree->m_kpkmpi0);
  inTree->SetBranchAddress("m_kppi0",&myTree->m_kppi0);
  inTree->SetBranchAddress("m_kmpi0",&myTree->m_kmpi0);
  inTree->SetBranchAddress("m_kpkm",&myTree->m_kpkm);

  inTree->SetBranchAddress("t_mandelstam",&myTree->t_mandelstam);
  inTree->SetBranchAddress("s_mandelstam",&myTree->s_mandelstam);
  inTree->SetBranchAddress("beam_energy",&myTree->beam_energy);

  inTree->SetBranchAddress("TOF_bool",&myTree->TOF_bool);
  inTree->SetBranchAddress("ST_bool",&myTree->ST_bool);
  inTree->SetBranchAddress("NULL_bool",&myTree->NULL_bool);

  inTree->SetBranchAddress("polarization",&myTree->polarization);
  inTree->SetBranchAddress("weight",&myTree->weight);
}

void setBranchesHitToGo(TTree *outTree, myTree_t *myTree){

  outTree->Branch("run_number",&myTree->run_number,"run_number/i");

  outTree->Branch("p_px",&myTree->p_px,"p_px/F");
  outTree->Branch("p_py",&myTree->p_py,"p_py/F");
  outTree->Branch("p_pz",&myTree->p_pz,"p_pz/F");
  outTree->Branch("p_E",&myTree->p_E,"p_E/F");

  outTree->Branch("kp_px",&myTree->kp_px,"kp_px/F");
  outTree->Branch("kp_py",&myTree->kp_py,"kp_py/F");
  outTree->Branch("kp_pz",&myTree->kp_pz,"kp_pz/F");
  outTree->Branch("kp_E",&myTree->kp_E,"kp_E/F");
  outTree->Branch("mass_kp",&myTree->mass_kp,"mass_kp/F");
  outTree->Branch("kp_P",&myTree->kp_P,"kp_P/F");
  outTree->Branch("pip_P",&myTree->pip_P,"pip_P/F");
  outTree->Branch("kp_P_mult",&myTree->kp_P_mult,"kp_P_mult/F");
  outTree->Branch("pip_P_mult",&myTree->pip_P_mult,"pip_P_mult/F");
  outTree->Branch("p_P_mult",&myTree->p_P_mult,"p_P_mult/F");

  outTree->Branch("km_px",&myTree->km_px,"km_px/F");
  outTree->Branch("km_py",&myTree->km_py,"km_py/F");
  outTree->Branch("km_pz",&myTree->km_pz,"km_pz/F");
  outTree->Branch("km_E",&myTree->km_E,"km_E/F");
  outTree->Branch("mass_km",&myTree->mass_km,"mass_km/F");
  outTree->Branch("km_P",&myTree->km_P,"km_P/F");
  outTree->Branch("pim_P",&myTree->pim_P,"pim_P/F");

  outTree->Branch("pi0_px",&myTree->pi0_px,"pi0_px/F");
  outTree->Branch("pi0_py",&myTree->pi0_py,"pi0_py/F");
  outTree->Branch("pi0_pz",&myTree->pi0_pz,"pi0_pz/F");
  outTree->Branch("pi0_E",&myTree->pi0_E,"pi0_E/F");

  outTree->Branch("m_kpkmpi0",&myTree->m_kpkmpi0,"m_kpkmpi0/F");
  outTree->Branch("m_kppi0",&myTree->m_kppi0,"m_kppi0/F");
  outTree->Branch("m_kmpi0",&myTree->m_kmpi0,"m_kmpi0/F");
  outTree->Branch("m_kpkm",&myTree->m_kpkm,"m_kpkm/F");
  outTree->Branch("t_mandelstam",&myTree->t_mandelstam,"t_mandelstam/F");
  outTree->Branch("s_mandelstam",&myTree->s_mandelstam,"s_mandelstam/F");
  outTree->Branch("beam_energy",&myTree->beam_energy,"beam_enrgy/F");
  outTree->Branch("TOF_bool",&myTree->TOF_bool,"TOF_bool/O");
  outTree->Branch("ST_bool",&myTree->ST_bool,"ST_bool/O");
  outTree->Branch("NULL_bool",&myTree->NULL_bool,"NULL_bool/O");
  outTree->Branch("polarization",&myTree->polarization,"polarization/F");
  outTree->Branch("weight",&myTree->weight,"weight/F");

  outTree->Branch("theta",&myTree->theta,"theta/F");
  outTree->Branch("cosTheta",&myTree->cosTheta,"cosTheta/F");
  outTree->Branch("phi",&myTree->phi,"phi/F");

  outTree->Branch("theta_H",&myTree->theta_H,"theta_H/F");
  outTree->Branch("cosTheta_H",&myTree->cosTheta_H,"cosTheta_H/F");
  outTree->Branch("phi_H",&myTree->phi_H,"phi_H/F");

  outTree->Branch("thetaGJ",&myTree->thetaGJ,"thetaGJ/F");
  outTree->Branch("cosThetaGJ",&myTree->cosThetaGJ,"cosThetaGJ/F");
  outTree->Branch("phiGJ",&myTree->phiGJ,"phiGJ/F");

  outTree->Branch("thetaGJ_H",&myTree->thetaGJ_H,"thetaGJ_H/F");
  outTree->Branch("cosThetaGJ_H",&myTree->cosThetaGJ_H,"cosThetaGJ_H/F");
  outTree->Branch("phiGJ_H",&myTree->phiGJ_H,"phiGJ_H/F");

}
