Ejemplo n.º 1
0
int main(int argc, char *argv[]) {

  Teuchos::GlobalMPISession mpiSession(&argc, &argv);

  // This little trick lets us print to std::cout only if a (dummy) command-line argument is provided.
  int iprint     = argc - 1;
  Teuchos::RCP<std::ostream> outStream;
  Teuchos::oblackholestream bhs; // outputs nothing
  if (iprint > 0)
    outStream = Teuchos::rcp(&std::cout, false);
  else
    outStream = Teuchos::rcp(&bhs, false);

  int errorFlag  = 0;

  // *** Example body.

  try {
    
    std::string filename = "input.xml";
    Teuchos::RCP<Teuchos::ParameterList> parlist = Teuchos::rcp( new Teuchos::ParameterList() );
    Teuchos::updateParametersFromXmlFile( filename, parlist.ptr() );

    RealT V_th      = parlist->get("Thermal Voltage", 0.02585);
    RealT lo_Vsrc   = parlist->get("Source Voltage Lower Bound", 0.0);
    RealT up_Vsrc   = parlist->get("Source Voltage Upper Bound", 1.0);
    RealT step_Vsrc = parlist->get("Source Voltage Step", 1.e-2);

    RealT true_Is = parlist->get("True Saturation Current", 1.e-12);
    RealT true_Rs = parlist->get("True Saturation Resistance", 0.25);
    RealT init_Is = parlist->get("Initial Saturation Current", 1.e-12);
    RealT init_Rs = parlist->get("Initial Saturation Resistance", 0.25);
    RealT lo_Is   = parlist->get("Saturation Current Lower Bound", 1.e-16);
    RealT up_Is   = parlist->get("Saturation Current Upper Bound", 1.e-1);
    RealT lo_Rs   = parlist->get("Saturation Resistance Lower Bound", 1.e-2);
    RealT up_Rs   = parlist->get("Saturation Resistance Upper Bound", 30.0);

    // bool use_lambertw   = parlist->get("Use Analytical Solution",true); 
    bool use_scale      = parlist->get("Use Scaling For Epsilon-Active Sets",true);
    bool use_sqp        = parlist->get("Use SQP", true);
    // bool use_linesearch = parlist->get("Use Line Search", true);
    // bool datatype       = parlist->get("Get Data From Input File",false);
    // bool use_adjoint    = parlist->get("Use Adjoint Gradient Computation",false);
    // int  use_hessvec    = parlist->get("Use Hessian-Vector Implementation",1); // 0 - FD, 1 - exact, 2 - GN
    // bool plot           = parlist->get("Generate Plot Data",false);
    // RealT noise         = parlist->get("Measurement Noise",0.0);

    
    EqualityConstraint_DiodeCircuit<RealT> con(V_th,lo_Vsrc,up_Vsrc,step_Vsrc);

    RealT alpha = 1.e-4; // regularization parameter (unused)
    int ns = 101; // number of Vsrc components
    int nz = 2; // number of optimization variables

    Objective_DiodeCircuit<RealT> obj(alpha,ns,nz);
    
    // Initialize iteration vectors.
    Teuchos::RCP<std::vector<RealT> > z_rcp    = Teuchos::rcp( new std::vector<RealT> (nz, 0.0) );
    Teuchos::RCP<std::vector<RealT> > yz_rcp   = Teuchos::rcp( new std::vector<RealT> (nz, 0.0) );
    Teuchos::RCP<std::vector<RealT> > soln_rcp = Teuchos::rcp( new std::vector<RealT> (nz, 0.0) );
    (*z_rcp)[0]     = init_Is;
    (*z_rcp)[1]     = init_Rs;
    (*yz_rcp)[0]    = init_Is;
    (*yz_rcp)[1]    = init_Rs;
    (*soln_rcp)[0]  = true_Is;
    (*soln_rcp)[1]  = true_Rs;
    ROL::StdVector<RealT> z(z_rcp);
    ROL::StdVector<RealT> yz(yz_rcp);
    ROL::StdVector<RealT> soln(soln_rcp);
    Teuchos::RCP<ROL::Vector<RealT> > zp  = Teuchos::rcp(&z,false);
    Teuchos::RCP<ROL::Vector<RealT> > yzp = Teuchos::rcp(&yz,false);

    Teuchos::RCP<std::vector<RealT> > u_rcp  = Teuchos::rcp( new std::vector<RealT> (ns, 0.0) );
    Teuchos::RCP<std::vector<RealT> > yu_rcp = Teuchos::rcp( new std::vector<RealT> (ns, 0.0) );
    std::ifstream input_file("measurements.dat");
    RealT temp, temp_scale;
    for (int i=0; i<ns; i++) {
      input_file >> temp;
      input_file >> temp;
      temp_scale = pow(10,int(log10(temp)));
      (*u_rcp)[i] = temp_scale*(RealT)rand()/(RealT)RAND_MAX;
      (*yu_rcp)[i] = temp_scale*(RealT)rand()/(RealT)RAND_MAX;
    }
    input_file.close();
    ROL::StdVector<RealT> u(u_rcp);
    ROL::StdVector<RealT> yu(yu_rcp);
    Teuchos::RCP<ROL::Vector<RealT> > up  = Teuchos::rcp(&u,false);
    Teuchos::RCP<ROL::Vector<RealT> > yup = Teuchos::rcp(&yu,false);

    Teuchos::RCP<std::vector<RealT> > jv_rcp  = Teuchos::rcp( new std::vector<RealT> (ns, 1.0) );
    ROL::StdVector<RealT> jv(jv_rcp);
    Teuchos::RCP<ROL::Vector<RealT> > jvp = Teuchos::rcp(&jv,false);

    ROL::Vector_SimOpt<RealT> x(up,zp);
    ROL::Vector_SimOpt<RealT> y(yup,yzp);

    // Check derivatives
    obj.checkGradient(x,x,y,true,*outStream);
    obj.checkHessVec(x,x,y,true,*outStream);

    con.checkApplyJacobian(x,y,jv,true,*outStream);
    con.checkApplyAdjointJacobian(x,yu,jv,x,true,*outStream);
    con.checkApplyAdjointHessian(x,yu,y,x,true,*outStream);
    // Check consistency of Jacobians and adjoint Jacobians.
    con.checkAdjointConsistencyJacobian_1(jv,yu,u,z,true,*outStream);
    con.checkAdjointConsistencyJacobian_2(jv,yz,u,z,true,*outStream);
    // Check consistency of solves.
    con.checkSolve(u,z,jv,true,*outStream);
    con.checkInverseJacobian_1(jv,yu,u,z,true,*outStream);
    con.checkInverseAdjointJacobian_1(yu,jv,u,z,true,*outStream);

    // Initialize reduced objective function.
    Teuchos::RCP<std::vector<RealT> > p_rcp  = Teuchos::rcp( new std::vector<RealT> (ns, 0.0) );
    ROL::StdVector<RealT> p(p_rcp);
    Teuchos::RCP<ROL::Vector<RealT> > pp  = Teuchos::rcp(&p,false);
    Teuchos::RCP<ROL::Objective_SimOpt<RealT> > pobj = Teuchos::rcp(&obj,false);
    Teuchos::RCP<ROL::EqualityConstraint_SimOpt<RealT> > pcon = Teuchos::rcp(&con,false);
    ROL::Reduced_Objective_SimOpt<RealT> robj(pobj,pcon,up,pp);
    // Check derivatives.
    *outStream << "Derivatives of reduced objective" << std::endl;
    robj.checkGradient(z,z,yz,true,*outStream);
    robj.checkHessVec(z,z,yz,true,*outStream);
    
    // Bound constraints
    RealT tol = 1.e-12;
    Teuchos::RCP<std::vector<RealT> > g0_rcp = Teuchos::rcp( new std::vector<RealT> (nz, 0.0) );;
    ROL::StdVector<RealT> g0p(g0_rcp);
    robj.gradient(g0p,z,tol);
    *outStream << std::scientific <<  "Initial gradient = " << (*g0_rcp)[0] << " " << (*g0_rcp)[1] << "\n";
    *outStream << std::scientific << "Norm of Gradient = " << g0p.norm() << "\n";

    // Define scaling for epsilon-active sets (used in inequality constraints)
    RealT scale;
    if(use_scale){ scale = 1.0e-2/g0p.norm();}
    else{ scale = 1.0;}
    *outStream << std::scientific << "Scaling: " << scale << "\n";

    /// Define constraints on Is and Rs
    BoundConstraint_DiodeCircuit<RealT> bcon(scale,lo_Is,up_Is,lo_Rs,up_Rs);
    //bcon.deactivate();
    
    // Optimization 
    *outStream << "\n Initial guess " << (*z_rcp)[0] << " " << (*z_rcp)[1] << std::endl;
      
    if (!use_sqp){    
      // Trust Region
      ROL::Algorithm<RealT> algo_tr("Trust Region",*parlist);
      std::clock_t timer_tr = std::clock();
      algo_tr.run(z,robj,bcon,true,*outStream);
      *outStream << "\n Solution " << (*z_rcp)[0] << " " << (*z_rcp)[1] << "\n" << std::endl;
      *outStream << "Trust-Region required " << (std::clock()-timer_tr)/(RealT)CLOCKS_PER_SEC
                 << " seconds.\n";
    }
    else{
      // SQP.
      //Teuchos::RCP<std::vector<RealT> > gz_rcp = Teuchos::rcp( new std::vector<RealT> (nz, 0.0) );
      //ROL::StdVector<RealT> gz(gz_rcp);
      //Teuchos::RCP<ROL::Vector<RealT> > gzp = Teuchos::rcp(&gz,false);
      Teuchos::RCP<std::vector<RealT> > gu_rcp = Teuchos::rcp( new std::vector<RealT> (ns, 0.0) );
      ROL::StdVector<RealT> gu(gu_rcp);
      Teuchos::RCP<ROL::Vector<RealT> > gup = Teuchos::rcp(&gu,false);
      //ROL::Vector_SimOpt<RealT> g(gup,gzp);
      ROL::Vector_SimOpt<RealT> g(gup,zp);
      Teuchos::RCP<std::vector<RealT> > c_rcp = Teuchos::rcp( new std::vector<RealT> (ns, 0.0) );
      Teuchos::RCP<std::vector<RealT> > l_rcp = Teuchos::rcp( new std::vector<RealT> (ns, 0.0) );
      ROL::StdVector<RealT> c(c_rcp);
      ROL::StdVector<RealT> l(l_rcp);
      
      ROL::Algorithm<RealT> algo_cs("Composite Step",*parlist);
      //x.zero();
      std::clock_t timer_cs = std::clock();
      algo_cs.run(x,g,l,c,obj,con,true,*outStream);
      *outStream << "\n Solution " << (*z_rcp)[0] << " " << (*z_rcp)[1] << "\n" << std::endl;
      *outStream << "Composite Step required " << (std::clock()-timer_cs)/(RealT)CLOCKS_PER_SEC
		 << " seconds.\n";
    }
    soln.axpy(-1.0, z);
    *outStream << "Norm of error: " << soln.norm() << std::endl;
    if (soln.norm() > 1e4*ROL::ROL_EPSILON) {
      errorFlag = 1;
    }
  }
  catch (std::logic_error err) {
    *outStream << err.what() << "\n";
    errorFlag = -1000;
  }; // end try

  if (errorFlag != 0)
    std::cout << "End Result: TEST FAILED\n";
  else
    std::cout << "End Result: TEST PASSED\n";

  return 0;

}
Ejemplo n.º 2
0
 Cir Frame::icyz() const { return Ro::round( bound(), yz() ); }     ///< yz circle (imaginary, direct)
Ejemplo n.º 3
0
int main(int argc, char *argv[]) {

  Teuchos::GlobalMPISession mpiSession(&argc, &argv);

  // This little trick lets us print to std::cout only if a (dummy) command-line argument is provided.
  int iprint = argc - 1;
  Teuchos::RCP<std::ostream> outStream;
  Teuchos::oblackholestream bhs; // outputs nothing
  if (iprint > 0)
    outStream = Teuchos::rcp(&std::cout, false);
  else
    outStream = Teuchos::rcp(&bhs, false);

  int errorFlag = 0;

  // *** Example body.

  try {
    // Initialize full objective function.
    int nx      = 256;   // Set spatial discretization.
    RealT alpha = 1.e-3; // Set penalty parameter.
    RealT nu    = 1e-2;  // Viscosity parameter.
    Objective_BurgersControl<RealT> obj(alpha,nx);
    // Initialize equality constraints
    EqualityConstraint_BurgersControl<RealT> con(nx,nu);
    Teuchos::ParameterList list;
    list.sublist("SimOpt").sublist("Solve").set("Residual Tolerance",1.e2*ROL::ROL_EPSILON);
    con.setSolveParameters(list);
    // Initialize iteration vectors.
    Teuchos::RCP<std::vector<RealT> > z_rcp  = Teuchos::rcp( new std::vector<RealT> (nx+2, 1.0) );
    Teuchos::RCP<std::vector<RealT> > gz_rcp = Teuchos::rcp( new std::vector<RealT> (nx+2, 1.0) );
    Teuchos::RCP<std::vector<RealT> > yz_rcp = Teuchos::rcp( new std::vector<RealT> (nx+2, 1.0) );
    for (int i=0; i<nx+2; i++) {
      (*z_rcp)[i]  = (RealT)rand()/(RealT)RAND_MAX;
      (*yz_rcp)[i] = (RealT)rand()/(RealT)RAND_MAX;
    }
    ROL::StdVector<RealT> z(z_rcp);
    ROL::StdVector<RealT> gz(gz_rcp);
    ROL::StdVector<RealT> yz(yz_rcp);
    Teuchos::RCP<ROL::Vector<RealT> > zp  = Teuchos::rcp(&z,false);
    Teuchos::RCP<ROL::Vector<RealT> > gzp = Teuchos::rcp(&z,false);
    Teuchos::RCP<ROL::Vector<RealT> > yzp = Teuchos::rcp(&yz,false);

    Teuchos::RCP<std::vector<RealT> > u_rcp  = Teuchos::rcp( new std::vector<RealT> (nx, 1.0) );
    Teuchos::RCP<std::vector<RealT> > gu_rcp = Teuchos::rcp( new std::vector<RealT> (nx, 1.0) );
    Teuchos::RCP<std::vector<RealT> > yu_rcp = Teuchos::rcp( new std::vector<RealT> (nx, 1.0) );
    for (int i=0; i<nx; i++) {
      (*u_rcp)[i]  = (RealT)rand()/(RealT)RAND_MAX;
      (*yu_rcp)[i] = (RealT)rand()/(RealT)RAND_MAX;
    }
    ROL::StdVector<RealT> u(u_rcp);
    ROL::StdVector<RealT> gu(gu_rcp);
    ROL::StdVector<RealT> yu(yu_rcp);
    Teuchos::RCP<ROL::Vector<RealT> > up  = Teuchos::rcp(&u,false);
    Teuchos::RCP<ROL::Vector<RealT> > gup = Teuchos::rcp(&u,false);
    Teuchos::RCP<ROL::Vector<RealT> > yup = Teuchos::rcp(&yu,false);

    Teuchos::RCP<std::vector<RealT> > c_rcp = Teuchos::rcp( new std::vector<RealT> (nx, 1.0) );
    Teuchos::RCP<std::vector<RealT> > l_rcp = Teuchos::rcp( new std::vector<RealT> (nx, 1.0) );
    ROL::StdVector<RealT> c(c_rcp);
    ROL::StdVector<RealT> l(l_rcp);

    ROL::Vector_SimOpt<RealT> x(up,zp);
    ROL::Vector_SimOpt<RealT> g(gup,gzp);
    ROL::Vector_SimOpt<RealT> y(yup,yzp);

    // Check derivatives.
    obj.checkGradient(x,x,y,true,*outStream);
    obj.checkHessVec(x,x,y,true,*outStream);
    con.checkApplyJacobian(x,y,c,true,*outStream);
    con.checkApplyAdjointJacobian(x,yu,c,x,true,*outStream);
    con.checkApplyAdjointHessian(x,yu,y,x,true,*outStream);

    // Initialize reduced objective function.
    Teuchos::RCP<std::vector<RealT> > p_rcp  = Teuchos::rcp( new std::vector<RealT> (nx, 1.0) );
    ROL::StdVector<RealT> p(p_rcp);
    Teuchos::RCP<ROL::Vector<RealT> > pp  = Teuchos::rcp(&p,false);
    Teuchos::RCP<ROL::Objective_SimOpt<RealT> > pobj = Teuchos::rcp(&obj,false);
    Teuchos::RCP<ROL::EqualityConstraint_SimOpt<RealT> > pcon = Teuchos::rcp(&con,false);
    ROL::Reduced_Objective_SimOpt<RealT> robj(pobj,pcon,up,pp);
    // Check derivatives.
    robj.checkGradient(z,z,yz,true,*outStream);
    robj.checkHessVec(z,z,yz,true,*outStream);

    // Get parameter list.
    std::string filename = "input.xml";
    Teuchos::RCP<Teuchos::ParameterList> parlist = Teuchos::rcp( new Teuchos::ParameterList() );
    Teuchos::updateParametersFromXmlFile( filename, parlist.ptr() );
    parlist->sublist("Status Test").set("Gradient Tolerance",1.e-14);
    parlist->sublist("Status Test").set("Constraint Tolerance",1.e-14);
    parlist->sublist("Status Test").set("Step Tolerance",1.e-16);
    parlist->sublist("Status Test").set("Iteration Limit",1000);
    // Declare ROL algorithm pointer.
    Teuchos::RCP<ROL::Algorithm<RealT> > algo;

    // Run optimization with Composite Step.
    algo = Teuchos::rcp(new ROL::Algorithm<RealT>("Composite Step",*parlist,false));
    RealT zerotol = std::sqrt(ROL::ROL_EPSILON);
    z.zero();
    con.solve(c,u,z,zerotol);
    c.zero(); l.zero();
    algo->run(x, g, l, c, obj, con, true, *outStream);
    Teuchos::RCP<ROL::Vector<RealT> > zCS = z.clone();
    zCS->set(z);

    // Run Optimization with Trust-Region algorithm.
    algo = Teuchos::rcp(new ROL::Algorithm<RealT>("Trust Region",*parlist,false));
    z.zero();
    algo->run(z,robj,true,*outStream);

    // Check solutions.
    Teuchos::RCP<ROL::Vector<RealT> > err = z.clone();
    err->set(*zCS); err->axpy(-1.,z);
    errorFlag += ((err->norm()) > 1.e-8) ? 1 : 0;
  }
  catch (std::logic_error err) {
    *outStream << err.what() << "\n";
    errorFlag = -1000;
  }; // end try

  if (errorFlag != 0)
    std::cout << "End Result: TEST FAILED\n";
  else
    std::cout << "End Result: TEST PASSED\n";

  return 0;

}
Ejemplo n.º 4
0
 Cir Frame::cyz() const { return Ro::round( ibound(), yz() ); }     ///< yz circle (real, direct)
Ejemplo n.º 5
0
void invmasscomb::Loop()
{
//   In a ROOT session, you can do:
//      Root > .L invmasscomb.C
//      Root > invmasscomb t
//      Root > t.GetEntry(12); // Fill t data members with entry number 12
//      Root > t.Show();       // Show values of entry 12
//      Root > t.Show(16);     // Read and show values of entry 16
//      Root > t.Loop();       // Loop on all entries
//

//     This is the loop skeleton where:
//    jentry is the global entry number in the chain
//    ientry is the entry number in the current Tree
//  Note that the argument to GetEntry must be:
//    jentry for TChain::GetEntry
//    ientry for TTree::GetEntry and TBranch::GetEntry
//
//       To read only selected branches, Insert statements like:
// METHOD1:
//    fChain->SetBranchStatus("*",0);  // disable all branches
//    fChain->SetBranchStatus("branchname",1);  // activate branchname
// METHOD2: replace line
//    fChain->GetEntry(jentry);       //read all branches
//by  b_branchname->GetEntry(ientry); //read only this branch
    if (fChain == 0) return;

    double maxE(10.);

    TH1D massPi0("massPi0","masspi0",100,0.,1.);
    TH1D massPi0_2("massPi0_2","masspi0_2",150,0.,.4);
    TH1D massPi0full("massPi0full","masspi0full",200,0.4,2.5);
    TH1D masseta("masseta","masseta",50,0.25,.75);
    TH1D massetafull("massetafull","massetafull",100,0.4,2.5);
    TH1D masseta3pi0("masseta3pi0","masseta",30,0.15,1.2);
    TH1D masseta3pi0full("masseta3pi0full","masseta",100,0.,3.);
    TH1D masspi01("masspi01","",50,0.,.4);
    TH1D masspi02("masspi02","",50,0.,.4);
    TH2D mp01mp02("mp01mp02","",50,0.,.4,50,0.,.4);
    TH1D distance("distance","distance",100,0.,50.);
    TH1D energypi0("energypi0","",50,0.,maxE*1.1);
    TH1D x("x","x",50,130.,140.);
    TH1D y("y","y",50,-20.,30.);
    TH1D z("z","z",50,50.,200.);
    TH2D yz("yz","yz",30,-30.,30.,30,0.,250.);
    TH2D yzeta("yzeta","yz",30,-30.,30.,30,0.,250.);
    TH2D yz3pi0("yz3pi0","yz",30,-30.,30.,30,0.,250.);
    TH1D phi("phi","phi",50,-.15,.15);
    TH1D eta("eta","eta",50,0.,1.4);

    TH2D massPi0vsE("massPi0vsE","masspi0 vs E",150,0.,.4,15,0.,maxE*1.1);
    TH2D massPi0vsE1("massPi0vsE1","masspi0 vs E",150,0.,.4,15,0.,maxE*1.);
    TH2D massPi0vsE2("massPi0vsE2","masspi0 vs E",150,0.,.4,15,0.,maxE*1.);
    TH2D massPi0vsECE("massPi0vsECE","masspi0 vs E",150,0.,.4,15,0.,maxE*1.1);
    TH2D massPi0vsEDF("massPi0vsEDF","masspi0 vs E",150,0.,.4,15,0.,maxE*1.1);
    TH2D massPi0vsE_2("massPi0vsE_2","masspi0 vs E",50,0.,1.,50,0.,maxE*1.1);
    TH2D massPi0vsdistance("massPi0vsdistance","masspi0 vs D",150,0.,.4,10,0.,70.);
    TH2D massPi0vsy("massPi0vsy","masspi0 vs y",150,0.,.4,20,-15.,25.);
    TH2D massPi0vsz("massPi0vsz","masspi0 vs z",150,0.,.4,20,80.,180.);

    TH2D xyA("xyA","xy A",100,-40.,40.,100,-40.,40.);
    TH2D xyB("xyB","xy B",100,-40.,40.,100,-40.,40.);

    TH1D Y1vsE("Y1vsE","yield1 vs E",15,0.,maxE*1.1);
    TH1D Y1vsEbis("Y1vsEbis","yield1 vs E",15,0.,maxE*1.1);
    TH1D Y1vsECE("Y1vsECE","yield1 vs E",15,0.,maxE*1.1);
    TH1D Y1vsEDF("Y1vsEDF","yield1 vs E",15,0.,maxE*1.1);
    TH1D Y2vsE("Y2vsE","yield2 vs E",15,0.,maxE*1.1);
    TH1D Y1vsE1("Y1vsE1","yield1 vs E1",15,0.,maxE*1.);
    TH1D Y1vsE2("Y1vsE2","yield1 vs E2",15,0.,maxE*1.);

    TH1D Y1vsdist("Y1vsdist","yield1 vs dist",10,0.,70.);
    TH1D Y2vsdist("Y2vsdist","yield2 vs dist",10,0.,70.);
    TH1D s1_1p("s1_1p","S1 ADC",100,0.,2000);
    TH1D s2_1p("s2_1p","S2 ADC",100,0.,2000);
    TH1D s1_2p("s1_2p","S1 ADC",100,0.,2000);
    TH1D s2_2p("s2_2p","S2 ADC",100,0.,2000);
    TH2D masss1("masss1","mass vs S1 ADC",150,0.,.4,100,0.,2000);
    TH2D masss2("masss2","mass vs S2 ADC",150,0.,.4,100,0.,2000);
    TH2D s1s2_1p("s1s2_1p","S1 vs S2 ADC",100,0.,2000,100,0.,2000);
    TH2D s1s2_2p("s1s2_2p","S1 vs S2 ADC",100,0.,2000,100,0.,2000);

    TH1D massPi0Pi0("massPi0Pi0","masspi0pi0",33,0.5,2.5);
    TH1D massPi0Pi0full("massPi0Pi0full","masspi0pi0",50,0.,3.);
    TH1D n_Pi0("n_Pi0","npi0",8,2.,10.0);

    Long64_t nentries = fChain->GetEntriesFast();

    cout << nentries << endl;

    Long64_t nbytes = 0, nb = 0;
    for (Long64_t jentry=0; jentry<nentries; jentry++) {
        Long64_t ientry = LoadTree(jentry);
        if (ientry < 0) break;
        nb = fChain->GetEntry(jentry);
        nbytes += nb;
        // if (Cut(ientry) < 0) continue;

        int nPi0(0);
        double mpi01, mpi02;
        double px_pi0[100],py_pi0[100],pz_pi0[100],E_pi0[100];
        int index1_pi0[100], index2_pi0[100];

        if(nClu!=2) continue;
        //     if(nClu<2) continue;

        double  distance_pivot_target(270.3);

        //SELECT CHARGE EXCHANGE OR DIFFRACTION
        if (scint1>140. && scint2>220.) distance_pivot_target = 376.8;
        else if(scint2<110.) distance_pivot_target = 376.8;
        else if(scint1<140. && scint2>400.) distance_pivot_target = 376.8;
        else if(scint1<140. && scint2>100. && scint2<220.) distance_pivot_target = 270.3;
        else continue;

        for (int ii=0; ii<nClu; ii++) {
            for (int jj=0; jj<nClu; jj++) {
                if(jj>49) continue;
                if(ii>=jj) continue;

                if(amplClu[ii]<.025*maxE) continue;
                if(amplClu[jj]<.025*maxE) continue;
                // 	 if(amplClu[ii]+amplClu[jj]<0.35*maxE) continue;
                if(nCryClu[ii]<7) continue;
                if(nCryClu[jj]<7) continue;

                double dist =
                    sqrt(pow((xClu[ii]-xClu[jj]),2) + pow((yClu[ii]-yClu[jj]),2) + pow((zClu[ii]-zClu[jj]),2));

                double x_pivot = 135.4;
                double y_pivot = 4.;
                double z_pivot = 135.;
                double distance_pivot = sqrt(pow(x_pivot,2)+pow(y_pivot,2)+pow(z_pivot,2));
                double x_versor = x_pivot / distance_pivot;
                double y_versor = y_pivot / distance_pivot;
                double z_versor = z_pivot / distance_pivot;


                double newx0 = xClu[ii] + x_versor * distance_pivot_target;
                double newy0 = yClu[ii] + y_versor * distance_pivot_target;
                double newz0 = zClu[ii] + z_versor * distance_pivot_target;

                double newx1 = xClu[jj] + x_versor * distance_pivot_target;
                double newy1 = yClu[jj] + y_versor * distance_pivot_target;
                double newz1 = zClu[jj] + z_versor * distance_pivot_target;

                double cost = newx0 * newx1 + newy0 * newy1 + newz0 * newz1;
                cost = cost / (sqrt(pow(newx0,2)+pow(newy0,2)+pow(newz0,2)) * sqrt(pow(newx1,2)+pow(newy1,2)+pow(newz1,2)));

                double masspi0;
                masspi0 = sqrt(2*amplClu[ii]*amplClu[jj]*(1-cost));

                double lenght0 = sqrt(pow(newx0,2)+pow(newy0,2)+pow(newz0,2));
                double px0 = newx0 * amplClu[ii] / lenght0;
                double py0 = newy0 * amplClu[ii] / lenght0;
                double pz0 = newz0 * amplClu[ii] / lenght0;
                double lenght1 = sqrt(pow(newx1,2)+pow(newy1,2)+pow(newz1,2));
                double px1 = newx1 * amplClu[jj] / lenght1;
                double py1 = newy1 * amplClu[jj] / lenght1;
                double pz1 = newz1 * amplClu[jj] / lenght1;

                double pxpi0 = px0+px1;
                double pypi0 = py0+py1;
                double pzpi0 = pz0+pz1;

                double ppi0 = sqrt(pow(pxpi0,2)+pow(pypi0,2)+pow(pzpi0,2));
                double enepi0 = amplClu[ii] + amplClu[jj];

                double xpi0 = pxpi0 / ppi0 * (distance_pivot_target + distance_pivot);
                double ypi0 = pypi0 / ppi0 * (distance_pivot_target + distance_pivot);
                double zpi0 = pzpi0 / ppi0 * (distance_pivot_target + distance_pivot);
// 	 double xpi0 = pxpi0 / ppi0;
// 	 double ypi0 = pypi0 / ppi0;
// 	 double zpi0 = pzpi0 / ppi0;

// 	 cout << "X = " << xpi0 << ", " <<newx0 << ", " << newx1 << "    Y = " << ypi0 << ", " << newy0 << ", " << newy1 << "    Z = " << zpi0 << ", " << newz0 << ", " << newz1 << endl;

// 	 cout << lenght0 << "   "  << lenght1 << "   "  << sqrt(pow(xpi0,2)+pow(ypi0,2)+pow(zpi0,2)) << endl;


// 	 if(!abs((lenght0 + lenght1)/2 - sqrt(pow(xpi0,2)+pow(ypi0,2)+pow(zpi0,2)))>5) continue;
//  	 if(!(x_wcA[0]>-20.&&x_wcA[0]<20.)) continue;
// 	 if(!(y_wcA[0]>-20.&&y_wcA[0]<20.)) continue;
// 	 if(!(x_wcB[0]>-20.&&x_wcB[0]<20.)) continue;
//  	 if(!(y_wcB[0]>-20.&&y_wcB[0]<20.)) continue;

                massPi0.Fill(masspi0);
                massPi0_2.Fill(masspi0);
                massPi0full.Fill(masspi0);
                if(amplClu[ii]+amplClu[jj]>0.55*maxE) {
                    masseta.Fill(masspi0);
                    massetafull.Fill(masspi0);
                }
                massPi0vsE.Fill(masspi0,amplClu[ii]+amplClu[jj]);
                massPi0vsE1.Fill(masspi0,amplClu[ii]);
                massPi0vsE2.Fill(masspi0,amplClu[jj]);
                if(distance_pivot_target == 273.8)
                    massPi0vsECE.Fill(masspi0,amplClu[ii]+amplClu[jj]);
                else
                    massPi0vsEDF.Fill(masspi0,amplClu[ii]+amplClu[jj]);
                massPi0vsE_2.Fill(masspi0,amplClu[ii]+amplClu[jj]);
                massPi0vsdistance.Fill(masspi0,dist);

                masss1.Fill(masspi0,scint1);
                masss2.Fill(masspi0,scint2);

                if(masspi0>0.104&&masspi0<0.176) {
                    if(masspi0>0.120&&masspi0<0.145) {
                        distance.Fill(dist);
                        energypi0.Fill(amplClu[ii]+amplClu[jj]);
                        x.Fill(xClu[ii]);
                        y.Fill(yClu[ii]);
                        z.Fill(zClu[ii]);
                        yz.Fill(yClu[ii],zClu[ii]);
                        x.Fill(xClu[jj]);
                        y.Fill(yClu[jj]);
                        z.Fill(zClu[jj]);
                        yz.Fill(yClu[jj],zClu[jj]);
                        phi.Fill(phiClu[ii]);
                        phi.Fill(phiClu[jj]);
                        eta.Fill(etaClu[ii]);
                        eta.Fill(etaClu[jj]);
                        xyA.Fill(x_wcA[0],y_wcA[0]);
                        xyB.Fill(x_wcB[0],y_wcB[0]);
                        s1_1p.Fill(scint1);
                        s2_1p.Fill(scint2);
                        s1s2_1p.Fill(scint1,scint2);
                        px_pi0[nPi0] = pxpi0;
                        py_pi0[nPi0] = pypi0;
                        pz_pi0[nPi0] = pzpi0;
                        index1_pi0[nPi0] = ii;
                        index2_pi0[nPi0] = jj;
                        E_pi0[nPi0] = amplClu[ii]+amplClu[jj];
                        nPi0++;
                        if(nPi0==1) mpi01 = masspi0;
                        if(nPi0==2) mpi02 = masspi0;
                    }
                    if(masspi0>0.150&&masspi0<0.170) {
                        s1_2p.Fill(scint1);
                        s2_2p.Fill(scint2);
                        s1s2_2p.Fill(scint1,scint2);
                    }
                }
                if(masspi0>0.500&&masspi0<0.560&&amplClu[ii]+amplClu[jj]>0.55*maxE) {
                    yzeta.Fill(yClu[ii],zClu[ii]);
                    yzeta.Fill(yClu[jj],zClu[jj]);
                }
            }
        }
        if(nPi0==2) {
            masspi01.Fill(mpi01);
            masspi02.Fill(mpi02);
            mp01mp02.Fill(mpi01,mpi02);
        }
        n_Pi0.Fill(nPi0);
        //     if(nPi0==2){
        for(int yy=0; yy<nPi0; yy++) {
            for (int kk=0; kk<nPi0; kk++) {
                if(kk>99) continue;
                if(yy>=kk) continue;
                if(index1_pi0[yy] == index1_pi0[kk]) continue;
                if(index1_pi0[yy] == index2_pi0[kk]) continue;
                if(index2_pi0[yy] == index1_pi0[kk]) continue;
                double px_pp = px_pi0[yy] + px_pi0[kk];
                double py_pp = py_pi0[yy] + py_pi0[kk];
                double pz_pp = pz_pi0[yy] + pz_pi0[kk];
                double p_pp = sqrt(pow(px_pp,2)+pow(py_pp,2)+pow(pz_pp,2));
                double E_pp = E_pi0[yy] + E_pi0[kk];
                double masspi0pi0 = sqrt(E_pp*E_pp - p_pp*p_pp);

                if(E_pi0[yy]<.05*maxE) continue;
                if(E_pi0[kk]<.05*maxE) continue;

                if(E_pp>.75*maxE) {
                    massPi0Pi0.Fill(masspi0pi0);
                    massPi0Pi0full.Fill(masspi0pi0);
                }
// 	   double m1 = sqrt(pow(E_pi0[yy],2)-pow(px_pi0[yy],2)-pow(py_pi0[yy],2)-pow(pz_pi0[yy],2));
// 	   double m2 = sqrt(pow(E_pi0[kk],2)-pow(px_pi0[kk],2)-pow(py_pi0[kk],2)-pow(pz_pi0[kk],2));
// 	   cout << m1 << "  " << m2 << "   "  << sqrt(pow(px_pi0[yy],2)+pow(py_pi0[yy],2)+pow(pz_pi0[yy],2)) << "   "  << E_pi0[yy] << "   "  << sqrt(pow(px_pi0[kk],2)+pow(py_pi0[kk],2)+pow(pz_pi0[kk],2)) << "   "  << E_pi0[kk] << "   "  << p_pp << "   " <<  E_pp << "   "  << p_pp << endl;
            }
        }
        //       if(nPi0==3){
        for(int yy=0; yy<nPi0; yy++) {
            for (int kk=0; kk<nPi0; kk++) {
                for (int ii=0; ii<nPi0; ii++) {
                    if(kk>99) continue;
                    if(yy>=kk) continue;
                    if(kk>=ii) continue;
                    if(index1_pi0[yy] == index1_pi0[kk]) continue;
                    if(index1_pi0[yy] == index2_pi0[kk]) continue;
                    if(index2_pi0[yy] == index1_pi0[kk]) continue;
                    if(index1_pi0[yy] == index1_pi0[ii]) continue;
                    if(index1_pi0[yy] == index2_pi0[ii]) continue;
                    if(index2_pi0[yy] == index1_pi0[ii]) continue;
                    if(index1_pi0[ii] == index1_pi0[kk]) continue;
                    if(index1_pi0[ii] == index2_pi0[kk]) continue;
                    if(index2_pi0[ii] == index1_pi0[kk]) continue;
                    double px_pp = px_pi0[ii] +px_pi0[yy] + px_pi0[kk];
                    double py_pp = py_pi0[ii] +py_pi0[yy] + py_pi0[kk];
                    double pz_pp = pz_pi0[ii] +pz_pi0[yy] + pz_pi0[kk];
                    double p_pp = sqrt(pow(px_pp,2)+pow(py_pp,2)+pow(pz_pp,2));
                    double E_pp = E_pi0[ii] + E_pi0[yy] + E_pi0[kk];
                    double masspi0pi0pi0 = sqrt(E_pp*E_pp - p_pp*p_pp);

                    if(E_pi0[yy]<.08*maxE) continue;
                    if(E_pi0[kk]<.08*maxE) continue;
                    if(E_pi0[ii]<.08*maxE) continue;

                    if(E_pp>.55*maxE) {
                        masseta3pi0.Fill(masspi0pi0pi0);
                        masseta3pi0full.Fill(masspi0pi0pi0);
                        if(masspi0pi0pi0<.65) {
                            yz3pi0.Fill(yClu[index1_pi0[kk]],zClu[index1_pi0[kk]]);
                            yz3pi0.Fill(yClu[index2_pi0[kk]],zClu[index2_pi0[kk]]);
                            yz3pi0.Fill(yClu[index1_pi0[yy]],zClu[index1_pi0[yy]]);
                            yz3pi0.Fill(yClu[index2_pi0[yy]],zClu[index2_pi0[yy]]);
                            yz3pi0.Fill(yClu[index1_pi0[ii]],zClu[index1_pi0[ii]]);
                            yz3pi0.Fill(yClu[index2_pi0[ii]],zClu[index2_pi0[ii]]);
                        }
                    }
                    cout << masspi0pi0pi0 << "  " <<  E_pi0[yy] << "   " << E_pi0[kk] << "   "  << E_pi0[ii] <<  endl;
                }
            }
        }
    }

    TCanvas *c0 = new TCanvas("c1"," ",200,10,500,500);
    c0->Clear();

    massPi0.SetXTitle("m(#pi^{0}) [GeV]");
    massPi0.SetStats(0);
    massPi0.SetTitle("");
    massPi0.Draw();

    c0->SaveAs("masspi0.eps");

    TF1 *gaussian_p;
    gaussian_p = new TF1("gaupoly2",gaup2,0.03,2.8, 9) ;
    gaussian_p->SetLineColor(kBlue);
    gaussian_p->SetParNames ("Mean1","Sigma1","Norm1","p0","p1","p2","Mean2","Sigma2","Norm2");
    gaussian_p->SetParameter(0, .132);
    gaussian_p->SetParLimits(0, 0.12,0.145);
    gaussian_p->SetParLimits(1, 0.003,0.015);
    gaussian_p->SetParameter(2, 10.);
    gaussian_p->SetParLimits(2, 0.,1000.);
    gaussian_p->SetParameter(3, 1.);
    gaussian_p->SetParameter(4, 0.);
    gaussian_p->SetParameter(5, 0.);
    gaussian_p->SetParameter(6, .132);
    gaussian_p->SetParLimits(6, 0.12,0.145);
    gaussian_p->SetParameter(7, .020);
    gaussian_p->SetParLimits(7, 0.015,0.1);
    gaussian_p->SetParameter(8, 10.);
    gaussian_p->SetParLimits(8, 0.,1000.);

    massPi0_2.SetStats(0);
    massPi0_2.SetXTitle("m(#gamma#gamma) [GeV/c^{2}]");
    massPi0_2.SetYTitle("events/2.7MeV/c^{2}");
    massPi0_2.SetTitleOffset(1.8,"Y");
    massPi0_2.SetTitle("");
    //   massPi0_2.SetMarkerSize(1.);
    massPi0_2.Fit ("gaupoly2","L","",.03,.4) ;
    //   massPi0_2.SetAxisRange(.0,.35);
    //   massPi0_2.Draw("pe");

    double mpi0= gaussian_p->GetParameter(0);
    double errmpi0= gaussian_p->GetParError(0);

    double smpi0= gaussian_p->GetParameter(1);
    double errsmpi0= gaussian_p->GetParError(1);

    double events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
    double errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);

    char line[100];

    TText tl;
    tl.SetTextSize(.03);
    sprintf(line, "mass1 = (%7.1f +/- %5.1f) MeV", mpi0*1000, errmpi0*1000);
    tl.DrawTextNDC(.5, 0.85, line);
    sprintf(line, "sigma1 = (%7.1f +/- %5.1f) MeV", smpi0*1000, errsmpi0*1000);
    tl.DrawTextNDC(.5, 0.79, line);
    sprintf(line, "N(ev1) = %7.1f +/- %5.1f", events, errevents);
    tl.DrawTextNDC(.5, 0.73, line);

    c0->SaveAs("masspi0_comb.eps");

    massPi0_2.SetMarkerSize(1.);
    massPi0_2.SetAxisRange(.03,.4);
    massPi0_2.Draw("pe");

    TF1 *gaussian3_p;
    gaussian3_p = new TF1("gaupoly3_p",gaup2,0.03,2.8, 9) ;

    gaussian3_p->SetParNames ("Mean1","Sigma1","Norm1","p0","p1","p2","Mean2","Sigma2","Norm2");
    gaussian3_p->SetParameter(0, .131);
    gaussian3_p->SetParameter(1, 1.);
    gaussian3_p->SetParameter(2, 0.);
    gaussian3_p->SetParameter(3, gaussian_p->GetParameter(3));
    gaussian3_p->SetParameter(4, gaussian_p->GetParameter(4));
    gaussian3_p->SetParameter(5, gaussian_p->GetParameter(5));
    gaussian3_p->SetParameter(6, 0.);
    gaussian3_p->SetParameter(7, 0.);
    gaussian3_p->SetParameter(8, 0.);

//    gaussian3_p->SetLineStyle(3);
//    gaussian3_p->SetFillStyle(34);
//    gaussian3_p->SetFillColor(kRed);

    gaussian3_p->SetLineStyle(3);
    gaussian3_p->Draw("same");

    TPad *npad = new TPad("npad", "", 0.45, 0.45, 0.89, 0.89);
    npad->Draw();
    npad->cd();
    masseta.SetYTitle("events/10MeV/c^{2}");
    masseta.SetTitleSize(0.06,"X");
    masseta.SetTitleSize(0.06,"Y");
    masseta.SetTitleOffset(.8,"X");
    masseta.SetTitleOffset(1.,"Y");

    gaussian_p->SetParameter(0, .55);
    gaussian_p->SetParameter(1, .03);
    gaussian_p->SetParLimits(0, 0.5,0.6);
    gaussian_p->SetParLimits(1, 0.005,0.04);
    gaussian_p->SetParameter(6, .65);
    gaussian_p->SetParLimits(6, 0.55,0.7);
    gaussian_p->SetParameter(7, .03);
    gaussian_p->SetParLimits(7, 0.05,0.03);
    gaussian_p->FixParameter(8, 0.);

    masseta.SetXTitle("m(#gamma#gamma) [GeV/c^{2}]");
    //   masseta.SetTitleSize(.4);
    masseta.SetStats(0);
    masseta.SetMarkerSize(.8);
    masseta.SetTitle("");
    masseta.SetAxisRange(.38,.72);
    masseta.Fit ("gaupoly2","L","",.38,.72) ;
    masseta.Draw("pe");
//    gaussian_p->SetLineColor(kBlue);
//    gaussian_p->Draw("same");

    c0->SaveAs("masspi0_times.eps");


    gaussian_p->SetParameter(0, .131);
    gaussian_p->SetParameter(1, .008);
    gaussian_p->SetParameter(2, 10.);
    gaussian_p->SetParLimits(2, 0.,1000.);
    gaussian_p->SetParameter(3, 1.);
    gaussian_p->SetParameter(4, 0.);
    gaussian_p->SetParameter(5, 0.);
    gaussian_p->SetParameter(6, .159);
    gaussian_p->SetParameter(7, .008);
    gaussian_p->SetParameter(8, 10.);
    gaussian_p->SetParLimits(8, 0.,1000.);
    gaussian_p->SetParLimits(0, 0.12,0.145);
    gaussian_p->SetParLimits(6, 0.145,0.6);
    gaussian_p->FixParameter(6, .135);
    gaussian_p->FixParameter(7, .022);

    massPi0_2.SetXTitle("m(#pi^{0}) [GeV]");
    massPi0_2.SetStats(0);
    massPi0_2.SetTitle("");
    massPi0_2.Fit ("gaupoly2","L","",.05,.4) ;

    cout << massPi0_2.Integral() << endl;

    mpi0= gaussian_p->GetParameter(0);
    errmpi0= gaussian_p->GetParError(0);

    smpi0= gaussian_p->GetParameter(1);
    errsmpi0= gaussian_p->GetParError(1);

    double mpi1= gaussian_p->GetParameter(6);
    double errmpi1= gaussian_p->GetParError(6);

    double smpi1= gaussian_p->GetParameter(7);
    double errsmpi1= gaussian_p->GetParError(7);

    events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
    errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);

    double events1= gaussian_p->GetParameter(8)/massPi0_2.GetBinWidth(1);
    double errevents1 = gaussian_p->GetParError(8)/massPi0_2.GetBinWidth(1);


    tl.SetTextSize(.03);
    sprintf(line, "mass1 = (%7.1f +/- %5.1f) MeV", mpi0*1000, errmpi0*1000);
    tl.DrawTextNDC(.5, 0.85, line);
    sprintf(line, "sigma1 = (%7.1f +/- %5.1f) MeV", smpi0*1000, errsmpi0*1000);
    tl.DrawTextNDC(.5, 0.79, line);
    sprintf(line, "N(ev1) = %7.1f +/- %5.1f", events, errevents);
    tl.DrawTextNDC(.5, 0.73, line);
    sprintf(line, "mass2 = (%7.1f +/- %5.1f) MeV", mpi1*1000, errmpi1*1000);
    tl.DrawTextNDC(.5, 0.67, line);
    sprintf(line, "sigma2 = (%7.1f +/- %5.1f) MeV", smpi1*1000, errsmpi1*1000);
    tl.DrawTextNDC(.5, 0.61, line);
    sprintf(line, "N(ev2) = %7.1f +/- %5.1f", events1, errevents1);
    tl.DrawTextNDC(.5, 0.55, line);

    c0->SaveAs("masspi0_2.eps");


    for (int h=2; h<16; h++) {
        TH1D tmpmass("tmpmass","mass",150,0.,.4);
        for (int j=1; j<150; j++) {
            tmpmass.SetBinContent(j,massPi0vsE.GetBinContent(j,h));
        }
        gaussian_p->SetParameter(0, .132);
        gaussian_p->SetParameter(1, .008);
        gaussian_p->SetParameter(2, 10.);
        gaussian_p->SetParLimits(2, 0.,1000.);
        gaussian_p->SetParameter(3, 1.);
        gaussian_p->SetParameter(4, 0.);
        gaussian_p->SetParameter(5, 0.);
        gaussian_p->SetParLimits(3, 0.,1000.);
        gaussian_p->SetParLimits(4, -100.,100.);
        gaussian_p->SetParLimits(5, -100.,100.);
        gaussian_p->SetParameter(6, .132);
        gaussian_p->SetParameter(7, .020);
        gaussian_p->SetParameter(8, 10.);
        gaussian_p->SetParLimits(8, 0.,1000.);
        gaussian_p->SetParLimits(0, 0.125,0.14);
        gaussian_p->SetParLimits(1, 0.003,0.01);
        gaussian_p->SetParLimits(6, 0.125,0.14);
        gaussian_p->SetParLimits(7, 0.01,0.1);

        tmpmass.Fit ("gaupoly2","LQ","",.05,.4) ;
        events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
        errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);
        events1= gaussian_p->GetParameter(8)/massPi0_2.GetBinWidth(1);
        errevents1 = gaussian_p->GetParError(8)/massPi0_2.GetBinWidth(1);
        if(tmpmass.Integral(45,55)>2.) {
            Y1vsE.SetBinContent(h,events);
            Y1vsE.SetBinError(h,errevents);
            Y1vsEbis.SetBinContent(h,events);
        } else {
            Y1vsE.SetBinContent(h,0);
            Y1vsE.SetBinError(h,0);
            Y1vsEbis.SetBinError(h,0);
        }

        Y2vsE.SetBinContent(h,events1);
        Y2vsE.SetBinError(h,errevents1);

        char tempchar[100];
        sprintf(tempchar,"%d%s",h,"masspi0_2.eps");
        c0->SaveAs(tempchar);
    }

    for (int h=2; h<16; h++) {
        TH1D tmpmass("tmpmass","mass",150,0.,.4);
        for (int j=1; j<150; j++) {
            tmpmass.SetBinContent(j,massPi0vsE1.GetBinContent(j,h));
        }
        gaussian_p->SetParameter(0, .132);
        gaussian_p->SetParameter(1, .008);
        gaussian_p->SetParameter(2, 10.);
        gaussian_p->SetParLimits(2, 0.,1000.);
        gaussian_p->SetParameter(3, 1.);
        gaussian_p->SetParameter(4, 0.);
        gaussian_p->SetParameter(5, 0.);
        gaussian_p->SetParLimits(3, 0.,1000.);
        gaussian_p->SetParLimits(4, -100.,100.);
        gaussian_p->SetParLimits(5, -100.,100.);
        gaussian_p->SetParameter(6, .132);
        gaussian_p->SetParameter(7, .020);
        gaussian_p->SetParameter(8, 10.);
        gaussian_p->SetParLimits(8, 0.,1000.);
        gaussian_p->SetParLimits(0, 0.125,0.14);
        gaussian_p->SetParLimits(1, 0.003,0.01);
        gaussian_p->SetParLimits(6, 0.125,0.14);
        gaussian_p->SetParLimits(7, 0.01,0.1);

        tmpmass.Fit ("gaupoly2","LQ","",.05,.4) ;
        events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
        errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);
        events1= gaussian_p->GetParameter(8)/massPi0_2.GetBinWidth(1);
        errevents1 = gaussian_p->GetParError(8)/massPi0_2.GetBinWidth(1);
        if(tmpmass.Integral(45,55)>2.) {
            Y1vsE1.SetBinContent(h,events);
            Y1vsE1.SetBinError(h,errevents);
        } else {
            Y1vsE1.SetBinContent(h,0);
            Y1vsE1.SetBinError(h,0);
        }
    }

    for (int h=2; h<16; h++) {
        TH1D tmpmass("tmpmass","mass",150,0.,.4);
        for (int j=1; j<150; j++) {
            tmpmass.SetBinContent(j,massPi0vsE2.GetBinContent(j,h));
        }
        gaussian_p->SetParameter(0, .132);
        gaussian_p->SetParameter(1, .008);
        gaussian_p->SetParameter(2, 10.);
        gaussian_p->SetParLimits(2, 0.,1000.);
        gaussian_p->SetParameter(3, 1.);
        gaussian_p->SetParameter(4, 0.);
        gaussian_p->SetParameter(5, 0.);
        gaussian_p->SetParLimits(3, 0.,1000.);
        gaussian_p->SetParLimits(4, -100.,100.);
        gaussian_p->SetParLimits(5, -100.,100.);
        gaussian_p->SetParameter(6, .132);
        gaussian_p->SetParameter(7, .020);
        gaussian_p->SetParameter(8, 10.);
        gaussian_p->SetParLimits(8, 0.,1000.);
        gaussian_p->SetParLimits(0, 0.125,0.14);
        gaussian_p->SetParLimits(1, 0.003,0.01);
        gaussian_p->SetParLimits(6, 0.125,0.14);
        gaussian_p->SetParLimits(7, 0.01,0.1);

        tmpmass.Fit ("gaupoly2","LQ","",.05,.4) ;
        events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
        errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);
        events1= gaussian_p->GetParameter(8)/massPi0_2.GetBinWidth(1);
        errevents1 = gaussian_p->GetParError(8)/massPi0_2.GetBinWidth(1);
        if(tmpmass.Integral(45,55)>2.) {
            Y1vsE2.SetBinContent(h,events);
            Y1vsE2.SetBinError(h,errevents);
        } else {
            Y1vsE2.SetBinContent(h,0);
            Y1vsE2.SetBinError(h,0);
        }
    }

    for (int h=2; h<16; h++) {
        TH1D tmpmass("tmpmass","mass",150,0.,.4);
        for (int j=1; j<150; j++) {
            tmpmass.SetBinContent(j,massPi0vsECE.GetBinContent(j,h));
        }
        gaussian_p->SetParameter(0, .132);
        gaussian_p->SetParameter(1, .008);
        gaussian_p->SetParameter(2, 10.);
        gaussian_p->SetParLimits(2, 0.,1000.);
        gaussian_p->SetParameter(3, 1.);
        gaussian_p->SetParameter(4, 0.);
        gaussian_p->SetParameter(5, 0.);
        gaussian_p->SetParLimits(3, 0.,1000.);
        gaussian_p->SetParLimits(4, -100.,100.);
        gaussian_p->SetParLimits(5, -100.,100.);
        gaussian_p->SetParameter(6, .132);
        gaussian_p->SetParameter(7, .020);
        gaussian_p->SetParameter(8, 10.);
        gaussian_p->SetParLimits(8, 0.,1000.);
        gaussian_p->SetParLimits(0, 0.125,0.14);
        gaussian_p->SetParLimits(1, 0.003,0.01);
        gaussian_p->SetParLimits(6, 0.125,0.14);
        gaussian_p->SetParLimits(7, 0.01,0.1);

        tmpmass.Fit ("gaupoly2","LQ","",.05,.4) ;
        events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
        errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);
        if(tmpmass.Integral(45,55)>2.) {
            Y1vsECE.SetBinContent(h,events);
            Y1vsECE.SetBinError(h,errevents);
        } else {
            Y1vsECE.SetBinContent(h,0);
            Y1vsECE.SetBinError(h,0);
        }
//      char tempchar[100];
//      sprintf(tempchar,"%d%s",h,"masspi0_2_CE.eps");
//      c0->SaveAs(tempchar);
    }

    for (int h=2; h<16; h++) {
        TH1D tmpmass("tmpmass","mass",150,0.,.4);
        for (int j=1; j<150; j++) {
            tmpmass.SetBinContent(j,massPi0vsEDF.GetBinContent(j,h));
        }
        gaussian_p->SetParameter(0, .132);
        gaussian_p->SetParameter(1, .008);
        gaussian_p->SetParameter(2, 10.);
        gaussian_p->SetParLimits(2, 0.,1000.);
        gaussian_p->SetParameter(3, 1.);
        gaussian_p->SetParameter(4, 0.);
        gaussian_p->SetParameter(5, 0.);
        gaussian_p->SetParLimits(3, 0.,1000.);
        gaussian_p->SetParLimits(4, -100.,100.);
        gaussian_p->SetParLimits(5, -100.,100.);
        gaussian_p->SetParameter(6, .132);
        gaussian_p->SetParameter(7, .020);
        gaussian_p->SetParameter(8, 10.);
        gaussian_p->SetParLimits(8, 0.,1000.);
        gaussian_p->SetParLimits(0, 0.125,0.14);
        gaussian_p->SetParLimits(1, 0.003,0.01);
        gaussian_p->SetParLimits(6, 0.125,0.14);
        gaussian_p->SetParLimits(7, 0.01,0.1);

        tmpmass.Fit ("gaupoly2","LQ","",.05,.4) ;
        events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
        errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);
        if(tmpmass.Integral(45,55)>2.) {
            Y1vsEDF.SetBinContent(h,events);
            Y1vsEDF.SetBinError(h,errevents);
        } else {
            Y1vsEDF.SetBinContent(h,0);
            Y1vsEDF.SetBinError(h,0);
        }

//      char tempchar[100];
//      sprintf(tempchar,"%d%s",h,"masspi0_2_CE.eps");
//      c0->SaveAs(tempchar);
    }

    for (int h=1; h<11; h++) {
        TH1D tmpmass("tmpmass","mass",150,0.,.4);
        for (int j=1; j<150; j++) {
            tmpmass.SetBinContent(j,massPi0vsdistance.GetBinContent(j,h));
        }

        gaussian_p->SetParameter(0, .132);
        gaussian_p->SetParameter(1, .008);
        gaussian_p->SetParameter(2, 10.);
        gaussian_p->SetParLimits(2, 0.,1000.);
        gaussian_p->SetParameter(3, 1.);
        gaussian_p->SetParameter(4, 0.);
        gaussian_p->SetParameter(5, 0.);
        gaussian_p->SetParLimits(3, 0.,1000.);
        gaussian_p->SetParLimits(4, -100.,100.);
        gaussian_p->SetParLimits(5, -100.,100.);
        gaussian_p->SetParameter(6, .132);
        gaussian_p->SetParameter(7, .020);
        gaussian_p->SetParameter(8, 10.);
        gaussian_p->SetParLimits(8, 0.,1000.);
        gaussian_p->SetParLimits(0, 0.125,0.14);
        gaussian_p->SetParLimits(1, 0.003,0.01);
        gaussian_p->SetParLimits(6, 0.125,0.14);
        gaussian_p->SetParLimits(7, 0.01,0.1);
        tmpmass.Fit ("gaupoly2","LQ","",.05,.4) ;
        events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
        errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);
        events1= gaussian_p->GetParameter(8)/massPi0_2.GetBinWidth(1);
        errevents1 = gaussian_p->GetParError(8)/massPi0_2.GetBinWidth(1);
        Y1vsdist.SetBinContent(h,events);
        Y1vsdist.SetBinError(h,errevents);
        Y2vsdist.SetBinContent(h,events1);
        Y2vsdist.SetBinError(h,errevents1);

        cout << "1 gauss " << events << "+/-" << errevents << endl;
        cout << "2 gauss " << events1 << "+/-" << errevents1 << endl;
    }

//    gaussian_p->FixParameter(0, .1305);
//    gaussian_p->FixParameter(6, .1595);

//    for (int h=2;h<12;h++){
//      TH1D tmpmass("tmpmass","mass",150,0.,.4);
//      for (int j=1;j<150;j++){
//        tmpmass.SetBinContent(j,massPi0vsE.GetBinContent(j,h));
//      }
//      gaussian_p->FixParameter(1, .008);
//      gaussian_p->FixParameter(7, .009);
//      gaussian_p->SetParameter(2, 10.);
//      gaussian_p->SetParameter(3, 1.);
//      gaussian_p->SetParameter(4, 0.);
//      gaussian_p->SetParameter(5, 0.);
//      gaussian_p->SetParameter(8, 10.);
//      //     gaussian_p->FixParameter(8, .0);
//      tmpmass.Fit ("gaupoly2","L","",.05,.4) ;
//      events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
//      errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);
//      events1= gaussian_p->GetParameter(8)/massPi0_2.GetBinWidth(1);
//      errevents1 = gaussian_p->GetParError(8)/massPi0_2.GetBinWidth(1);
//      Y1vsE.SetBinContent(h,events);
//      Y1vsE.SetBinError(h,errevents);
//      Y2vsE.SetBinContent(h,events1);
//      Y2vsE.SetBinError(h,errevents1);

//      cout << "1 gauss " << events << "+/-" << errevents << endl;
//      cout << "2 gauss " << events1 << "+/-" << errevents1 << endl;
//      char tempchar[100];
//      sprintf(tempchar,"%d%s",h,"masspi0_2.eps");
//      c0->SaveAs(tempchar);
//    }

//    for (int h=1;h<11;h++){
//      TH1D tmpmass("tmpmass","mass",150,0.,.4);
//      for (int j=1;j<150;j++){
//        tmpmass.SetBinContent(j,massPi0vsdistance.GetBinContent(j,h));
//      }
//      gaussian_p->FixParameter(1, .008);
//      gaussian_p->FixParameter(7, .009);
//      gaussian_p->SetParameter(2, 10.);
//      gaussian_p->SetParameter(3, 1.);
//      gaussian_p->SetParameter(4, 0.);
//      gaussian_p->SetParameter(5, 0.);
//      //     gaussian_p->SetParameter(8, 10.);
//      tmpmass.Fit ("gaupoly2","L","",.05,.4) ;
//      events= gaussian_p->GetParameter(2)/massPi0_2.GetBinWidth(1);
//      errevents = gaussian_p->GetParError(2)/massPi0_2.GetBinWidth(1);
//      events1= gaussian_p->GetParameter(8)/massPi0_2.GetBinWidth(1);
//      errevents1 = gaussian_p->GetParError(8)/massPi0_2.GetBinWidth(1);
//      Y1vsdist.SetBinContent(h,events);
//      Y1vsdist.SetBinError(h,errevents);
//      Y2vsdist.SetBinContent(h,events1);
//      Y2vsdist.SetBinError(h,errevents1);

//      cout << "1 gauss " << events << "+/-" << errevents << endl;
//      cout << "2 gauss " << events1 << "+/-" << errevents1 << endl;
//    }

    gaussian_p->SetParameter(0, .55);
    gaussian_p->SetParameter(1, .03);
    gaussian_p->SetParLimits(0, 0.5,0.6);
    gaussian_p->SetParLimits(1, 0.005,0.04);
    gaussian_p->SetParameter(6, .65);
    gaussian_p->SetParLimits(6, 0.55,0.7);
    gaussian_p->SetParameter(7, .03);
    gaussian_p->SetParLimits(7, 0.05,0.03);
    gaussian_p->FixParameter(8, 0.);

    masseta.SetXTitle("m(#eta) [GeV]");
    masseta.SetStats(0);
    masseta.SetMarkerSize(1.);
    masseta.SetTitle("");
    masseta.Fit ("gaupoly2","L","",.3,.68) ;
    masseta.Draw("pe");
    cout << masseta.Integral() << endl;

    mpi0= gaussian_p->GetParameter(0);
    errmpi0= gaussian_p->GetParError(0);

    smpi0= gaussian_p->GetParameter(1);
    errsmpi0= gaussian_p->GetParError(1);

    events= gaussian_p->GetParameter(2)/masseta.GetBinWidth(1);
    errevents = gaussian_p->GetParError(2)/masseta.GetBinWidth(1);


    tl.SetTextSize(.03);
    sprintf(line, "mass = (%7.1f +/- %5.1f) MeV", mpi0*1000, errmpi0*1000);
    tl.DrawTextNDC(.13, 0.85, line);
    sprintf(line, "sigma = (%7.1f +/- %5.1f) MeV", smpi0*1000, errsmpi0*1000);
    tl.DrawTextNDC(.13, 0.79, line);
    sprintf(line, "N(ev) = %7.1f +/- %5.1f", events, errevents);
    tl.DrawTextNDC(.13, 0.73, line);

    c0->SaveAs("masseta.eps");

    gaussian_p->SetParLimits(8, 0.,1000.);

    masseta.Fit ("gaupoly2","L","",.3,.75) ;
    masseta.Draw("pe");
    cout << masseta.Integral() << endl;

    mpi0= gaussian_p->GetParameter(0);
    errmpi0= gaussian_p->GetParError(0);

    smpi0= gaussian_p->GetParameter(1);
    errsmpi0= gaussian_p->GetParError(1);

    events= gaussian_p->GetParameter(2)/masseta.GetBinWidth(1);
    errevents = gaussian_p->GetParError(2)/masseta.GetBinWidth(1);


    tl.SetTextSize(.03);
    sprintf(line, "mass = (%7.1f +/- %5.1f) MeV", mpi0*1000, errmpi0*1000);
    tl.DrawTextNDC(.13, 0.85, line);
    sprintf(line, "sigma = (%7.1f +/- %5.1f) MeV", smpi0*1000, errsmpi0*1000);
    tl.DrawTextNDC(.13, 0.79, line);
    sprintf(line, "N(ev) = %7.1f +/- %5.1f", events, errevents);
    tl.DrawTextNDC(.13, 0.73, line);

    c0->SaveAs("masseta2.eps");

    gaussian_p->SetParLimits(1, 0.005,0.08);
    gaussian_p->SetParLimits(6, 0.4,0.9);
    gaussian_p->SetParameter(6, 0.7);
    gaussian_p->SetParLimits(7, .1,3.0);
    gaussian_p->SetParameter(7, 1.);
    gaussian_p->SetParLimits(8, 0.,1000.);
    gaussian_p->FixParameter(3, 0.);
    gaussian_p->FixParameter(4, 0.);
    gaussian_p->FixParameter(5, 0.);


    masseta3pi0.SetXTitle("m(#eta) [GeV]");
    masseta3pi0.SetStats(0);
    masseta3pi0.SetMarkerSize(1.);
    masseta3pi0.SetTitle("");
    masseta3pi0.Fit ("gaupoly2","L","",.35,1.2) ;
    masseta3pi0.Draw("pe");

    mpi0= gaussian_p->GetParameter(0);
    errmpi0= gaussian_p->GetParError(0);

    smpi0= gaussian_p->GetParameter(1);
    errsmpi0= gaussian_p->GetParError(1);

    events= gaussian_p->GetParameter(2)/masseta3pi0.GetBinWidth(1);
    errevents = gaussian_p->GetParError(2)/masseta3pi0.GetBinWidth(1);

    TF1 *gaussian2_p;
    gaussian2_p = new TF1("gaupoly2_@",gaup2,0.03,2.8, 9) ;

    gaussian2_p->SetParNames ("Mean1","Sigma1","Norm1","p0","p1","p2","Mean2","Sigma2","Norm2");
    gaussian2_p->SetParameter(0, .131);
    gaussian2_p->SetParameter(1, 1.);
    gaussian2_p->SetParameter(2, 0.);
    gaussian2_p->SetParameter(3, 0.);
    gaussian2_p->SetParameter(4, 0.);
    gaussian2_p->SetParameter(5, 0.);
    gaussian2_p->SetParameter(6, gaussian_p->GetParameter(6));
    gaussian2_p->SetParameter(7, gaussian_p->GetParameter(7));
    gaussian2_p->SetParameter(8, gaussian_p->GetParameter(8));

    gaussian2_p->SetLineStyle(3);
    gaussian2_p->Draw("same");

    tl.SetTextSize(.03);
    sprintf(line, "mass = (%7.1f +/- %5.1f) MeV", mpi0*1000, errmpi0*1000);
    tl.DrawTextNDC(.53, 0.85, line);
    sprintf(line, "sigma = (%7.1f +/- %5.1f) MeV", smpi0*1000, errsmpi0*1000);
    tl.DrawTextNDC(.53, 0.79, line);
    sprintf(line, "N(ev) = %7.1f +/- %5.1f", events, errevents);
    tl.DrawTextNDC(.53, 0.73, line);

    c0->SaveAs("masseta3pi0.eps");

    masspi01.SetXTitle("m(#pi^{0}) [GeV]");
    masspi01.SetStats(0);
    masspi01.SetTitle("");
    masspi01.Fit ("gaupoly2","L","",.03,.4) ;
    c0->SaveAs("mpi01.eps");
    masspi02.SetXTitle("m(#pi^{0}) [GeV]");
    masspi02.SetStats(0);
    masspi02.SetTitle("");
    masspi02.Fit ("gaupoly2","L","",.03,.4) ;
    c0->SaveAs("mpi02.eps");

    mp01mp02.SetXTitle("m(#pi^{0})_{1} [GeV]");
    mp01mp02.SetYTitle("m(#pi^{0})_{2} [GeV]");
    mp01mp02.SetStats(0);
    mp01mp02.SetTitle("");
    mp01mp02.Draw("colz") ;
    c0->SaveAs("mpi01mpi02.eps");

    distance.SetXTitle("#Delta(clusters) [cm]");
    distance.SetStats(0);
    distance.SetTitle("");
    distance.Draw();

    c0->SaveAs("distance.eps");

    energypi0.SetXTitle("E(#pi^{0}) [GeV]");
    energypi0.SetStats(0);
    energypi0.SetTitle("");
    energypi0.Draw();

    c0->SaveAs("energypi0.eps");
    x.Draw();
    c0->SaveAs("x.eps");
    y.Draw();
    c0->SaveAs("y.eps");
    z.Draw();
    c0->SaveAs("z.eps");

    yz.Draw("colz");
    c0->SaveAs("yz.eps");
    yzeta.Draw("colz");
    c0->SaveAs("yzeta.eps");
    yz3pi0.Draw("colz");
    c0->SaveAs("yz3pi0.eps");
    phi.Draw();
    c0->SaveAs("phi.eps");
    eta.Draw();
    c0->SaveAs("eta.eps");
    xyA.Draw("box");
    c0->SaveAs("xyA.eps");
    xyB.Draw("box");
    c0->SaveAs("xyB.eps");
    massPi0vsE.SetStats(0);
    massPi0vsE.SetXTitle("m(#pi^{0}) [GeV]");
    massPi0vsE.SetYTitle("E(#pi^{0}) [GeV]");
    massPi0vsE.Draw("colz");
    c0->SaveAs("massvsE.eps");
    massPi0vsE_2.SetStats(0);
    massPi0vsE_2.SetXTitle("m(#pi^{0}) [GeV]");
    massPi0vsE_2.SetYTitle("E(#pi^{0}) [GeV]");
    massPi0vsE_2.Draw("colz");
    c0->SaveAs("massvsE_2.eps");
    massPi0vsdistance.SetStats(0);
    massPi0vsdistance.SetXTitle("m(#pi^{0}) [GeV]");
    massPi0vsdistance.SetYTitle("distance [cm]");
    massPi0vsdistance.Draw("colz");
    c0->SaveAs("massvsdist.eps");
    Y1vsE.SetMaximum(Y1vsE.GetMaximum()*1.3);
    Y1vsE.SetMinimum(0.);
    Y1vsE.SetMarkerSize(1.);
    Y1vsE.SetStats(0);
    Y1vsE.SetTitle("");
    Y1vsE.SetXTitle("E(#pi^{0}) [GeV]");
    Y1vsE.Draw("pe");
    c0->SaveAs("Y1vsE.eps");
    Y1vsECE.SetMaximum(Y1vsECE.GetMaximum()*1.3);
    Y1vsECE.SetMinimum(0.);
    Y1vsECE.SetMarkerSize(1.);
    Y1vsECE.SetStats(0);
    Y1vsECE.SetTitle("");
    Y1vsECE.SetXTitle("E(#pi^{0}) [GeV]");
    Y1vsECE.Draw("pe");
    c0->SaveAs("Y1vsECE.eps");
    Y1vsEDF.SetMaximum(Y1vsEDF.GetMaximum()*1.3);
    Y1vsEDF.SetMinimum(0.);
    Y1vsEDF.SetMarkerSize(1.);
    Y1vsEDF.SetStats(0);
    Y1vsEDF.SetTitle("");
    Y1vsEDF.SetXTitle("E(#pi^{0}) [GeV]");
    Y1vsEDF.Draw("pe");
    c0->SaveAs("Y1vsEDF.eps");
    Y1vsE.Draw("pe");
    Y1vsECE.SetFillColor(38);
    Y1vsEbis.SetFillColor(38);
    Y1vsEbis.Draw("same");
    Y1vsEDF.SetFillColor(kYellow);
    Y1vsEDF.Draw("same");
    Y1vsE.Draw("pesame");
    TLegendEntry *legge;
    TLegend *leg;
    leg = new TLegend(0.16,0.63,0.4,0.89);
    leg->SetFillStyle(0);
    leg->SetBorderSize(0.);
    leg->SetTextSize(0.06);
    leg->SetFillColor(0);
    legge = leg->AddEntry(&Y1vsECE, "charge ex.", "f");
    legge = leg->AddEntry(&Y1vsEDF, "diffr.", "f");
    legge = leg->AddEntry(&Y1vsE, "all", "p");
    leg->Draw();
    Y1vsE1.SetMaximum(Y1vsE1.GetMaximum()*1.3);
    Y1vsE1.SetMinimum(0.);
    Y1vsE1.SetMarkerSize(1.);
    Y1vsE1.SetStats(0);
    Y1vsE1.SetTitle("");
    Y1vsE1.SetXTitle("E1(#gamma) [GeV]");
    Y1vsE1.Draw("pe");
    c0->SaveAs("Y1vsE1.eps");
    Y1vsE2.SetMaximum(Y1vsE2.GetMaximum()*1.3);
    Y1vsE2.SetMinimum(0.);
    Y1vsE2.SetMarkerSize(1.);
    Y1vsE2.SetStats(0);
    Y1vsE2.SetTitle("");
    Y1vsE2.SetXTitle("E2(#gamma) [GeV]");
    Y1vsE2.Draw("pe");
    c0->SaveAs("Y1vsE2.eps");

    c0->SaveAs("Y1vsEcomb.eps");
    Y2vsE.SetMaximum(Y2vsE.GetMaximum()*1.3);
    Y2vsE.SetMinimum(0.);
    Y2vsE.SetStats(0);
    Y2vsE.SetTitle("");
    Y2vsE.SetMarkerSize(1.);
    Y2vsE.SetXTitle("E(#pi^{0}) [GeV]");
    Y2vsE.Draw("pe");
    c0->SaveAs("Y2vsE.eps");
    Y1vsdist.SetMaximum(Y1vsdist.GetMaximum()*1.3);
    Y1vsdist.SetMinimum(0.);
    Y1vsdist.SetStats(0);
    Y1vsdist.SetTitle("");
    Y1vsdist.SetMarkerSize(1.);
    Y1vsdist.SetXTitle("distance [cm]");
    Y1vsdist.Draw("pe");
    c0->SaveAs("Y1vsdist.eps");
    Y2vsdist.SetMaximum(Y2vsdist.GetMaximum()*1.3);
    Y2vsdist.SetMinimum(0.);
    Y2vsdist.SetStats(0);
    Y2vsdist.SetTitle("");
    Y2vsdist.SetMarkerSize(1.);
    Y2vsdist.SetXTitle("distance [cm]");
    Y2vsdist.Draw("pe");
    c0->SaveAs("Y2vsdist.eps");

    s1_1p.SetXTitle("ADC counts");
    s1_1p.Draw();
    c0->SaveAs("s1_1p.eps");

    s2_1p.SetXTitle("ADC counts");
    s2_1p.Draw();
    c0->SaveAs("s2_1p.eps");

    s1_2p.SetXTitle("ADC counts");
    s1_2p.Draw();
    c0->SaveAs("s1_2p.eps");

    s2_2p.SetXTitle("ADC counts");
    s2_2p.Draw();
    c0->SaveAs("s2_2p.eps");

    masss1.SetXTitle("m(#pi^{0})_{1} [GeV]");
    masss1.SetYTitle("S1 ADC counts");
    masss1.SetStats(0);
    masss1.SetTitle("");
    masss1.Draw("colz") ;
    c0->SaveAs("massvsS1.eps");

    masss2.SetXTitle("m(#pi^{0})_{1} [GeV]");
    masss2.SetYTitle("S2 ADC counts");
    masss2.SetStats(0);
    masss2.SetTitle("");
    masss2.Draw("colz") ;
    c0->SaveAs("massvsS2.eps");

    s1s2_1p.SetXTitle("S1 ADC counts 1' peak");
    s1s2_1p.SetYTitle("S2 ADC counts 1' peak");
//    s1s2_1p.SetStats(0);
    s1s2_1p.SetTitle("");
    s1s2_1p.Draw("colz") ;
    c0->SaveAs("s1s2_1p.eps");

    s1s2_2p.SetXTitle("S1 ADC counts 2' peak");
    s1s2_2p.SetYTitle("S2 ADC counts 2' peak");
//    s1s2_2p.SetStats(0);
    s1s2_2p.SetTitle("");
    s1s2_2p.Draw("colz") ;
    c0->SaveAs("s1s2_2p.eps");


    gaussian_p->SetParameter(0, 1.27);
    gaussian_p->SetParameter(1, .1);
    gaussian_p->SetParameter(2, 1.);
    gaussian_p->SetParameter(3, 1.);
    gaussian_p->SetParameter(4, 0.);
    gaussian_p->SetParameter(5, 0.);
    gaussian_p->SetParLimits(3, -1000.,1000.);
    gaussian_p->SetParLimits(4, -1000.,1000.);
    gaussian_p->SetParLimits(5, -1000.,1000.);
    gaussian_p->SetParLimits(0, 1.2,1.4);
    gaussian_p->SetParLimits(1, 0.03,0.2);
//    gaussian_p->FixParameter(0, 1.27);
//    gaussian_p->FixParameter(1, .1);
    gaussian_p->FixParameter(6, 1.);
    gaussian_p->FixParameter(7, 1.);
    gaussian_p->FixParameter(8, 0.);

    massPi0Pi0.SetXTitle("m(#pi^{0}#pi^{0}) [GeV]");
    massPi0Pi0.SetStats(0);
    massPi0Pi0.SetTitle("");
    massPi0Pi0.SetMarkerSize(1.);
    massPi0Pi0.Fit ("gaupoly2","L","",.75,2.2) ;
    massPi0Pi0.Draw("pe");

    mpi0= gaussian_p->GetParameter(0);
    errmpi0= gaussian_p->GetParError(0);

    smpi0= gaussian_p->GetParameter(1);
    errsmpi0= gaussian_p->GetParError(1);

    events= gaussian_p->GetParameter(2)/massPi0Pi0.GetBinWidth(1);
    errevents = gaussian_p->GetParError(2)/massPi0Pi0.GetBinWidth(1);


    tl.SetTextSize(.03);
    sprintf(line, "mass = (%7.1f +/- %5.1f) MeV", mpi0*1000, errmpi0*1000);
    tl.DrawTextNDC(.5, 0.85, line);
    sprintf(line, "sigma = (%7.1f +/- %5.1f) MeV", smpi0*1000, errsmpi0*1000);
    tl.DrawTextNDC(.5, 0.79, line);
    sprintf(line, "N(ev) = %7.1f +/- %5.1f", events, errevents);
    tl.DrawTextNDC(.5, 0.73, line);

    c0->SaveAs("masspi0pi0.eps");
//    massPi0Pi0.SetXTitle("m(#pi^{0}#pi^{0}) [GeV]");
//    //   massPi0Pi0.SetStats(0);
//    massPi0Pi0.SetTitle("");
//    massPi0Pi0.Draw();

//    c0->SaveAs("masspi0pi0.eps");

    n_Pi0.SetXTitle("N(#pi^{0})");
    n_Pi0.SetTitle("");
    n_Pi0.Draw();

    c0->SaveAs("nPi0.eps");

    massPi0full.SetXTitle("m(#gamma #gamma) [GeV]");
    massPi0full.SetStats(0);
    massPi0full.SetTitle("");
    massPi0full.Draw("") ;
    c0->SaveAs("massPi0full.eps");

    massPi0Pi0full.SetXTitle("m(#pi^{0} #pi^{0}) [GeV]");
    massPi0Pi0full.SetStats(0);
    massPi0Pi0full.SetTitle("");
    massPi0Pi0full.Draw("") ;
    c0->SaveAs("massPi0Pi0full.eps");

    massetafull.SetXTitle("m(#gamma #gamma) [GeV]");
    massetafull.SetStats(0);
    massetafull.SetTitle("");
    massetafull.Draw("") ;
    c0->SaveAs("massetafull.eps");

    masseta3pi0full.SetXTitle("m(#eta #rightarrow #pi^{0} #pi^{0} #pi^{0}) [GeV]");
    masseta3pi0full.SetStats(0);
    masseta3pi0full.SetTitle("");
    masseta3pi0full.Draw("") ;
    c0->SaveAs("masseta3pi0full.eps");
}