Ejemplo n.º 1
0
void BuildAPdf() {
    // Build the pdf
    AxisCollection ax;
    ax.AddAxis(PdfAxis("energy", 0, 3, 100));
    ax.AddAxis(PdfAxis("radius", 0, 1, 100));
    ax.AddAxis(PdfAxis("psd", 0, 1, 100));
    ax.AddAxis(PdfAxis("psd2", 0, 1, 100));
    BinnedPdf pdf(ax);
    std::vector<size_t> indicies;
    indicies.push_back(0);
    indicies.push_back(1);
    indicies.push_back(2);
    indicies.push_back(3);
    pdf.SetDataRep(DataRepresentation(indicies));


    // Get the data
    ROOTHandle rHandle(fileName, treeName);
    unsigned nEntries = rHandle.GetNEntries();
    std::cout << nEntries << " Entries to fill" << std::endl;
    // Fill the Pdf
    for(size_t i = 0; i < nEntries; i++) {
        pdf.Fill(rHandle.GetEntry(i));
    }

    return;
}
Ejemplo n.º 2
0
int main(){        
    ////////////////////        
    // 1. Set Up PDFs //        
    ////////////////////        
         
    // Set up binning        
    AxisCollection axes;        
    axes.AddAxis(PdfAxis("energy", 2, 3, 10, "Energy"));               
         
    // Only interested in first bit of data ntuple        
    DataRepresentation dataRep(0);        
         
    // Set up pdf with these bins in this observable        
    BinnedPdf bgPdf(axes);      bgPdf.SetDataRep(dataRep);        
    BinnedPdf signalPdf(axes);  signalPdf.SetDataRep(dataRep);        
         
    std::cout << "Initialised Pdfs" << std::endl;        
         
    /////////////////////////////////////        
    // 2. Fill with data and normalise //        
    /////////////////////////////////////        
         
    ROOTNtuple bgMC("filename.root", "treename");        
    ROOTNtuple signalMC("filename.root", "treename");        
         
    for(size_t i = 0; i < 10; i++){        
        bgPdf.Fill(bgMC.GetEntry(i));        
    }        
          
    for(size_t i = 0; i < 10; i++){        
        signalPdf.Fill(signalMC.GetEntry(i));        
    }        
             
         
    bgPdf.Normalise();        
    signalPdf.Normalise();        
         
    std::cout << "Filled pdfs " << std::endl;        
         
    ////////////////////////////        
    // 3. Set Up LH function  //        
    ////////////////////////////        
         
    BinnedNLLH lhFunction;        
    lhFunction.SetDataSet(&signalMC); // initialise withe the data set        
    lhFunction.AddPdf(bgPdf);        
    lhFunction.AddPdf(signalPdf);        
    
         
    std::cout << "Built LH function " << std::endl;        
         
    // Set up the optimisation        
    GridSearch gSearch(&lhFunction);        
             
    std::vector<double> minima(2, 0);        
    std::vector<double> maxima(2, 100);        
    std::vector<double> stepsizes(2, 1);        
         
    gSearch.SetMaxima(maxima);        
    gSearch.SetMinima(minima);        
    gSearch.SetStepSizes(stepsizes);        
    
         
    ////////////        
    // 4. Fit //        
    ////////////        
    gSearch.Optimise();        
         
    std::vector<double> fit = gSearch.GetFitResult().GetBestFit();        
             
    std::cout << "Best Fit: " << std::endl;        
    for(size_t i = 0; i < fit.size(); i++)        
        std::cout << fit.at(i) << "\t";        
    std::cout << std::endl;        
    
    return 0;        
}
Ejemplo n.º 3
0
BinnedED
BinnedEDShrinker::ShrinkDist(const BinnedED& dist_) const{

    // No buffer no problem. FIXME: what about if all the values are zero?
    if (!fBuffers.size())
        return dist_;
    
    size_t nDims = dist_.GetNDims();

    // FIXME Add a check to see if the non zero entries of fBuffers are in the pdf and give warning

    // 1. Build new axes. ShrinkPdf method just makes a copy if buffer size is zero
    AxisCollection newAxes;
    const std::vector<size_t> distDataIndices = dist_.GetObservables().GetIndices();
    size_t dataIndex = 0;
    
    for(size_t i = 0; i < nDims; i++){
        dataIndex = distDataIndices.at(i);
        if (!fBuffers.count(dataIndex))
            newAxes.AddAxis(dist_.GetAxes().GetAxis(i));
        else
            newAxes.AddAxis(ShrinkAxis(dist_.GetAxes().GetAxis(i), 
                                       fBuffers.at(dataIndex).first,  
                                       fBuffers.at(dataIndex).second));
    }

    // 2. Initialise the new pdf with same data rep
    BinnedED newDist(dist_.GetName() + "_shrunk", newAxes);
    newDist.SetObservables(dist_.GetObservables());

    // 3. Fill the axes
    std::vector<size_t> newIndices(dist_.GetNDims());  // same as old, just corrected for overflow
    int   offsetIndex = 0; // note taking difference of two unsigneds
    size_t newBin = 0;     //  will loop over dims and use this to assign bin # corrected for overflow

    const AxisCollection& axes = dist_.GetAxes();
    double content = 0;
    // bin by bin of old pdf
    for(size_t i = 0; i < dist_.GetNBins(); i++){
        content = dist_.GetBinContent(i);
        if(!content) // no content no problem
            continue;

        // work out the index of this bin in the new shrunk pdf. 
        for(size_t j = 0; j < nDims; j++){
            offsetIndex = axes.UnflattenIndex(i, j);            // the index in old pdf
            if (fBuffers.count(distDataIndices.at(j)))          // offset by lower buffer if nonzero
                offsetIndex -= fBuffers.at(distDataIndices.at(j)).first;

            // Correct the ones that fall in the buffer regions
            // bins in the lower buffer have negative index. Put in first bin in fit region or ignore
            if (offsetIndex < 0){
                offsetIndex = 0;
                if(!fUsingOverflows)
                    content = 0;

            }

            // bins in the upper buffer have i > number of bins in axis j. Do the same
            if (offsetIndex >= newAxes.GetAxis(j).GetNBins()){
                offsetIndex = newAxes.GetAxis(j).GetNBins() - 1;

                if (!fUsingOverflows)
                    content = 0;
            }

            newIndices[j] = offsetIndex;
        }
        // Fill 
        newBin = newAxes.FlattenIndices(newIndices);
        newDist.AddBinContent(newBin, content);
    }

    return newDist;
}