예제 #1
0
void TH2TAPS::DrawShape(TH2DrawTool& c, bool isBaF2) {
    if(isBaF2) 
        c.Draw(TH2TAPS::baf2_shape);
    else 
        c.Draw(TH2TAPS::pbwo4_shape);
    c.FinishShape();
 
    // FinishShape adds the bin, so we get it here again
    TH2PolyBin* bin_obj = (TH2PolyBin*) fBins->Last();
    TGraph* polygon = (TGraph*)bin_obj->GetPolygon();
    if(isBaF2)
        polygon->SetNameTitle("", Form("Element %d (BaF2)",fBins->GetEntries()-1));
    else
        polygon->SetNameTitle("", Form("Element %d (PbWO4)",fBins->GetEntries()-1));
}
예제 #2
0
TGraph* makeGraph(const vector<T> &v, const char *name = "vectorGraph")
{
  TObject *obj = gROOT->FindObjectAny(name);
  if (obj) {
    obj->Delete();
  }
  TGraph *graph = new TGraph(v.size());
  graph->SetNameTitle(name, name);

  for (Int_t i=0; i < v.size(); i++) {
    graph->SetPoint(i, i, v.at(i));
  }

  return graph;
}
int main(int argc, char** argv)
{
    // read config files to see which nuclei should be used for calculation
    string configFileName = "config/filesToRead.txt";
    ifstream configFile(configFileName);

    if(!configFile.is_open())
    {
        cerr << "Error: failed to open " << configFileName << "; exiting..." << endl;
        exit(1);
    }

    string relativeFileName = "config/relativePlots.txt";
    ifstream relativeFile(relativeFileName);

    if(!relativeFile.is_open())
    {
        cerr << "Error: failed to open " << relativeFileName << "; exiting..." << endl;
        exit(1);
    }

    string buffer;
    vector<string> nuclides;
    vector<pair<string,string>> relativeDiffNames;

    while(getline(configFile, buffer))
    {
        nuclides.push_back(buffer);
    }

    while(getline(relativeFile, buffer))
    {
        vector<string> tokens;
        istringstream iss(buffer);
        copy(istream_iterator<string>(iss),
                istream_iterator<string>(),
                back_inserter(tokens));

        relativeDiffNames.push_back(make_pair(tokens[0], tokens[1]));
    }

    // begin cross section calculation
    vector<CrossSection> crossSections;

    for(auto& nucleus : nuclides)
    {
        Nucleus N("config/" + nucleus + ".txt");

        cout << "Producing cross section for " << N.Name << endl;

        // define energy range
        vector<double> energyRange;

        double startingPoint = log(1);
        double stepSize = (log(500)-log(1))/100;

        for(unsigned int i=0; i<100; i++)
        {
            energyRange.push_back(exp(i*stepSize+startingPoint));
        }

        // identify which optical model should be used for cross section
        // calculation, and perform calculation
        string argument = argv[1];

        if(argument == "SA")
        {
            // strongly absorbing disk model

            crossSections.push_back(calculateCS_SA(N, energyRange));
        }

        else if(argument == "ROP")
        {
            // optical potential with only a real, Woods-Saxon part

            OpticalPotential OP("config/" + nucleus + "_ROP.txt");
            crossSections.push_back(calculateCS_ROP(N, OP, energyRange));
        }

        else if(argument == "COP")
        {
            // optical potential with real and imaginary Woods-Saxon parts

            OpticalPotential OP("config/" + nucleus + "_COP.txt");
            crossSections.push_back(calculateCS_COP(N, OP, energyRange));
        }

        else if(argument == "COPS")
        {
            // optical potential with real and imaginary Woods-Saxon and surface
            // (derivative of Woods-Saxon) parts

            OpticalPotential OP("config/" + nucleus + "_COPS.txt");
            crossSections.push_back(calculateCS_COPS(N, OP, energyRange));
        }

        else
        {
            cerr << "Error: argument describing the optical potential to be used must be supplied." << endl;
        return 1;
        }
    }

    // cross sections have been calculated; make plots
    TFile* file = new TFile("opticalModel.root","RECREATE");

    for(auto& cs : crossSections)
    {
        TGraph* graph = new TGraph(
                cs.getDataSet().getNumberOfPoints(),
                &cs.getDataSet().getXValues()[0],
                &cs.getDataSet().getYValues()[0]);

        graph->SetNameTitle(cs.name.c_str(), cs.name.c_str());
        graph->Write();
    }

    for(auto& pair : relativeDiffNames)
    {
        CrossSection firstCS;
        CrossSection secondCS;

        for(auto& cs : crossSections)
        {
            if(cs.name == pair.first)
            {
                firstCS = cs;
            }

            if(cs.name == pair.second)
            {
                secondCS = cs;
            }
        }

        if(firstCS.name=="" || secondCS.name=="")
        {
            cerr << "Error: failed to find both cross sections \""
                << pair.first << "\", \"" << pair.second
                << " needed to calculate relative difference." << endl;

            break;
        }

        CrossSection relativeDiff = calculateRelativeDiff(firstCS, secondCS);
        relativeDiff.name = "relativeDiff(" + pair.first + "," + pair.second + ")";
        TGraph* graph = new TGraph(
                relativeDiff.getDataSet().getNumberOfPoints(),
                &relativeDiff.getDataSet().getXValues()[0],
                &relativeDiff.getDataSet().getYValues()[0]);

        graph->SetNameTitle(relativeDiff.name.c_str(), relativeDiff.name.c_str());
        graph->Write();
    }

    file->Close();

    return 0;
}
예제 #4
0
void genieta16calib()
{
  glob_t globbuf;

  int stat = glob (fileglob.c_str(), GLOB_MARK, NULL, &globbuf);
  if (stat) {
    switch (stat) {
    case GLOB_NOMATCH: cerr << "No file matching glob pattern "; break;
    case GLOB_NOSPACE: cerr << "glob ran out of memory "; break;
    case GLOB_ABORTED: cerr << "glob read error "; break;
    default: cerr << "unknown glob error stat=" << stat << " "; break;
    }
    cerr << fileglob << endl;
    exit(-1);
  }
  if (gl_verbose)
    cout<<globbuf.gl_pathc<<" files match the glob pattern"<<endl;
      
  for (size_t i=0; i<std::max((size_t)1,globbuf.gl_pathc); i++) {
    TVectorD vxday,vyfcamp,vzlumi;

    string path = globbuf.gl_pathv[i];

    // pick out day of year and mean(sum(fC))
    loadVectorsFromFile(path.c_str(),"%*lf %lf %lf %*lf %*s %*s %lf",vxday,vzlumi,vyfcamp);
    TGraph *pwg = new TGraph(vxday,vyfcamp);
    pwg->SetNameTitle(path.c_str(),path.c_str());

    //pwg->Print();

    v_graphs.push_back(pwg);

    optimizenorm(i,path);

    //pwg->Print();
  }

  // calc average and rms
  int ngraphs = (int)v_graphs.size();
  int npts    = v_graphs[0]->GetN();
  cout << ngraphs << " graphs, " << npts << " points per graph" << endl;
  TVectorD vx(npts),vyavg(npts),vyrms(npts), vxerr(npts);
  for (int i=0; i<npts; i++) {
    double x,y;
    v_graphs[0]->GetPoint(i,x,y);
    vx[i] = x;
    vxerr[i]=0;
    double yavg = y;
    for (int j=1; j<ngraphs; j++) {
      v_graphs[j]->GetPoint(i,x,y);
      if (x!=vx[i]) {
	cerr << x << " != " << vx[i] << endl;
	exit(-1);
      }
      yavg += y;
    }
    yavg /= (double)ngraphs;
    vyavg[i] = yavg;
    double var = 0.0;
    for (int j=0; j<ngraphs; j++) {
      v_graphs[j]->GetPoint(i,x,y);
      var += (y-yavg)*(y-yavg);
    }
    vyrms[i] = sqrt(var/(double)ngraphs);
  }

  TCanvas *c1 = new TCanvas("c1","c1",1500,600);
  v_graphs[0]->Draw("ALP");
  v_graphs[0]->GetHistogram()->GetYaxis()->SetRangeUser(0.0,2.0);
  v_graphs[0]->SetTitle("Average laser response from i#eta=-16 depth 3 over 2016, selected channels; Day # ; Arbitrary norm");
  for (int i=1; i<ngraphs; i++) {
    v_graphs[i]->Draw("LP same");
    v_graphs[i]->SetLineColor(15);
  }

  TGraphErrors *gravg = new TGraphErrors(vx,vyavg,vxerr,vyrms);

  gravg->Draw("LPE same");
  gravg->SetLineWidth(2);
  gPad->SetRightMargin(0.03);
  gPad->SetLeftMargin(0.08);
  gPad->Update();
  gPad->SaveAs("ieta-16calib.png");

  gravg->Print();
}
예제 #5
0
/*
root -l 'sigmapeak.C+(0.025)'
// 
Processing sigmapeak.C+(0.025)...
background only: bkg_nsigma_0_99 = -0.352803
sig_nsigma_0_59  = -0.608621
sig_nsigma_0_99  = 2.1472
sig_nsigma_60_99 = 4.14042
sig_nsigma_70_90 = 5.57689
sig_nsigma_75_85 = 8.056
*/
void sigmapeak(Double_t signal_area=0.025)
{
   Double_t bkg_mean = 0;
   Double_t bkg_sigma = 0.001;

   Double_t x[100];
   Double_t y[100];
   Int_t np = 100;
   
   TRandom3 rand;
   
   for (int i=0; i<np; ++i) {
      x[i] = i;
      y[i] = rand.Gaus(bkg_mean,bkg_sigma);
   }
   
   TGraph* gr = new TGraph(np,x,y);
   gr->SetNameTitle("gr",Form("#sigma = %0.1f",bkg_sigma));
   gr->SetMarkerStyle(7);
   gr->SetMarkerColor(46);
   new TCanvas();
   gr->Draw("ap");

   Double_t bkg_nsigma_0_99 = Nsigma(gr->GetY(), 0,99, bkg_sigma);
   cout<< "background only: bkg_nsigma_0_99 = " << bkg_nsigma_0_99 <<endl;

   // add signal

   Double_t signal_mean = 80;
   Double_t signal_sigma = 3;

   for (int i=0; i<gr->GetN(); ++i) {
      Double_t xx = (gr->GetX()[i] - signal_mean)/signal_sigma;
      Double_t arg = 0.5*xx*xx;
      Double_t exp = arg < 50? TMath::Exp(-arg): 0;
      Double_t signal = signal_area/(TMath::Sqrt(TMath::TwoPi())*signal_sigma) * exp;
      gr->SetPoint(i, gr->GetX()[i], gr->GetY()[i] + signal);
   }

   gr->SetTitle(Form("#sigma_{bkg} = %0.3f signal: area = %0.3f mean = %0.0f sigma = %0.1f", bkg_sigma,signal_area,signal_mean,signal_sigma));

   gr->Draw("apl");
   gr->Fit("gaus", "R", "", signal_mean - 5*signal_sigma, signal_mean+5*signal_sigma);
   Double_t fit_area = 2.5 * gr->GetFunction("gaus")->GetParameter("Constant") * gr->GetFunction("gaus")->GetParameter("Sigma");
   cout<< "Area under fitted gaussian = " << fit_area <<endl;

   // titmax();
   gPad->Modified();    // to create box (NB: the pad was not drawn yet at this point!)
   gPad->Update();
   TPaveText* tit = (TPaveText*)gPad->GetPrimitive("title");
   tit->SetX1NDC(0.);
   tit->SetX2NDC(1.);
   tit->SetY1NDC(0.9);
   tit->SetY2NDC(1.);
   gPad->Modified();    // to update the pad
   gPad->Update();

   Double_t sig_nsigma_0_59 = Nsigma(gr->GetY(), 0,59, bkg_sigma);
   cout<< "sig_nsigma_0_59  = " << sig_nsigma_0_59 <<endl;

   Double_t sig_nsigma_0_99 = Nsigma(gr->GetY(), 0,99, bkg_sigma);
   cout<< "sig_nsigma_0_99  = " << sig_nsigma_0_99 <<endl;

   Double_t sig_nsigma_60_99 = Nsigma(gr->GetY(), 60,99, bkg_sigma);
   cout<< "sig_nsigma_60_99 = " << sig_nsigma_60_99 <<endl;

   Double_t sig_nsigma_70_90 = Nsigma(gr->GetY(), 70,90, bkg_sigma);
   cout<< "sig_nsigma_70_90 = " << sig_nsigma_70_90 <<endl;

   Double_t sig_nsigma_75_85 = Nsigma(gr->GetY(), 75,85, bkg_sigma);
   cout<< "sig_nsigma_75_85 = " << sig_nsigma_75_85 <<endl;

   Double_t ys5[100];
   smooth5(np, gr->GetY(), ys5);
   TGraph* gr5 = new TGraph(np, x, ys5);
   gr5->SetNameTitle("gr5","smoothed on 5 points");
   gr5->SetMarkerStyle(7);
   gr5->SetMarkerColor(2);
   gr5->SetLineColor(2);
   new TCanvas;
   gr5->Draw("apl");

   Double_t ys7[100];
   smooth7(np, gr->GetY(), ys7);
   TGraph* gr7 = new TGraph(np, x, ys7);
   gr7->SetNameTitle("gr7","smoothed on 7 points");
   gr7->SetMarkerStyle(7);
   gr7->SetMarkerColor(8);
   gr7->SetLineColor(8);
   new TCanvas;
   gr7->Draw("apl");

   Double_t ys7a[100];
   smooth7a(np, gr->GetY(), ys7a);
   TGraph* gr7a = new TGraph(np, x, ys7a);
   gr7a->SetNameTitle("gr7a","smoothed on 7a points");
   gr7a->SetMarkerStyle(7);
   gr7a->SetMarkerColor(3);
   gr7a->SetLineColor(3);
   new TCanvas;
   gr7a->Draw("apl");

   Double_t ys5g[100];
   smooth5g(np, gr->GetY(), ys5g);
   TGraph* gr5g = new TGraph(np, x, ys5g);
   gr5g->SetNameTitle("gr5g","smoothed on 5g points");
   gr5g->SetMarkerStyle(7);
   gr5g->SetMarkerColor(4);
   gr5g->SetLineColor(4);
   new TCanvas;
   gr5g->Draw("apl");

   Double_t ys5a[100];
   smooth5a(np, gr->GetY(), ys5a);
   TGraph* gr5a = new TGraph(np, x, ys5a);
   gr5a->SetNameTitle("gr5a","smoothed on 5a points");
   gr5a->SetMarkerStyle(7);
   gr5a->SetMarkerColor(6);
   gr5a->SetLineColor(6);
   new TCanvas;
   gr5a->Draw("apl");
}
예제 #6
0
void TH2CB::Build()
{
    TH2DrawTool tool(this);

    const vec& a(shape.at(1));
    const vec& b(shape.at(2));



    std::set<Int_t>::const_iterator nexthole = bins_in_holes.begin();
    UInt_t vbins=0;

    tool.PushMatrix();
    for(int i=0;i<4;++i) {

        for( int j=0; j<2; ++j) {
            MakeLevel(tool,1,nexthole,vbins);
            tool.Translate(a);
            tool.Scale(-1,-1);
            MakeLevel(tool,1,nexthole,vbins);
            tool.Translate(b);
            tool.Scale(-1,-1);
        }
        tool.Translate(2.0*b-a);
    }
    tool.PopMatrix();

    tool.Translate(-1.0*a);

    for( int j=0; j<2; ++j) {
        MakeLevel(tool,1,nexthole,vbins);
        tool.Translate(a);
        tool.Scale(-1,-1);
        MakeLevel(tool,1,nexthole,vbins);
        tool.Translate(b);
        tool.Scale(-1,-1);
    }

    SetStats(kFALSE);
    GetXaxis()->SetTickLength(0);
    GetXaxis()->SetLabelSize(0);
    GetYaxis()->SetTickLength(0);
    GetYaxis()->SetLabelSize(0);

    TText* inlabel = new TText(3.24,-0.43,"Beam In");
    inlabel->SetTextSize(0.03);
    inlabel->SetTextAlign(22);  // middle, middle
    GetListOfFunctions()->Add(inlabel);

    TText* outlabel = new TText(0.73,-0.43,"Beam out");
    outlabel->SetTextSize(0.03);
    outlabel->SetTextAlign(22);  // middle, middle
    GetListOfFunctions()->Add(outlabel);

    for( int major=1;major<=20;++major){
        for( int minor=1;minor<=4;++minor) {
            for( int crystal=1;crystal<=9;++crystal) {

                const Int_t bin = GetBinOfMMC(major, minor, crystal);

                if( bin >0) {

                    TH2PolyBin* bin_obj = ((TH2PolyBin*) fBins->At(bin-1));
                    TGraph* graph = (TGraph*) bin_obj->GetPolygon();

                    const Int_t vbin = GetVBinOfMMC(major,minor,crystal);
                    if( vbin >=0 ) {
                        Int_t element = GetElementOfCrystal(vbin-1);

                        graph->SetNameTitle("", Form("Element %d (%d/%d/%d)",element, major, minor, crystal));
                    }
                }
            }

        }
    }

}