Comments (6)
Becky's first shot.
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cstring>
#include <string>
#include "TROOT.h"
#include "TSystem.h"
#include "TTree.h"
#include "TFile.h"
#include "TH1F.h"
#include "TH2F.h"
using namespace std;
class BinHistoFunc2 {
public:
// BinHistoFunc(){} // Constructor without arguments
float histoFunc(std::string histtype, std::string filename, std::string histname){ //histogram function that takes two file arguments
TFile *F = TFile::Open(filename.c_str());
float val;
if (histtype=="1D"){
TH1F *hist = (TH1F *)F->Get(histname.c_str());
int binsx = hist->GetNbinsX();
std::cout << "hi" << std::endl;
// std::cout << F << std::endl;
std::cout << binsx << std::endl;
for(int b = 1; b < binsx; b++){
float val = hist->GetBinContent(b);
std::cout << "val is " << val << std::endl;
std::cout << "bin is " << b << std::endl;
};
}
else if (histtype=="2D"){
TH2F *hist = (TH2F *)F->Get(histname.c_str());
int binsx = hist->GetNbinsX();
int binsy = hist->GetNbinsY();
// std::cout << "hi" << std::endl;
// std::cout << F << std::endl;
// std::cout << binsx << std::endl;
for(int bx = 1; bx < binsx; bx++){
for(int by = 1; by < binsy; by++){
float val = hist->GetBinContent(bx, by);
std::cout << "val is " << val << std::endl;
// std::cout << "bin is " << b << std::endl;
};
};
}
return val;
}
};
BinHistoFunc2 obj;
float a = obj.histoFunc("2D", "example.root", "MtwvMtPass");
from timber.
There are some other tricks we can do though to make it even better
Like we can ask the type of the histogram passed in the argument to see if it inherits from TH1, TH2, or TH3 to get the dimensionality (and then you don't need it as an argument)
I'll make like a to-do list.
from timber.
- Determine type from object passed in argument. There's something called
dynamic_cast
which can change an objects type to a type from which it inherits but returns NULL if it won't work. So likedynamic_cast<const TH2*>(hist)
would return NULL if hist isn'tTH2I
,TH2F
, etc because those all inherit from the base classTH2
. We have to be careful though because all histograms in ROOT (no matter the dimension) inherit fromTH1
so any if statement should check first if the histogram can be cast toTH3
orTH2
and then doTH1
s as theelse
at the end. - Setup the constructor to take the file and histogram names as input. Constructor will just load the histogram
- Setup
histoFunc
to return the bin contents of the loaded histogram. May be more appropriate to renamehistoFunc
toGetBinContent
- Have a second function to look up bin content by axis value instead of bin number
The 1st is probably the trickiest so feel free to go out of order.
An explicit example for the first might be:
if (<dynamic_cast>(const TH3*) F->Get(histname.c_str()) != NULL) {
stuff...
} else if (<dynamic_cast>(const TH2*) F->Get(histname.c_str()) != NULL) {
stuff...
} else {
stuff..
}
No promises that it compiles though :-)
from timber.
Version with dynamic cast
BinHistoFunc_New.txt
from timber.
This looks great! The only thing is that I don't think I was clear about was the desired output from the functions. What you've written is actually doing more than what's needed. We just need to return a specific requested bin value (by bin number or axis value) and we don't need to loop over all bins. I'll try to explain by example. This is the beginning of your GetBinContents() function (dropping the std::cout)
float GetBinContents(void){
float val;
if (hist1 != 0) {
int binsx = hist1->GetNbinsX();
for(int b = 1; b < binsx; b++){
val = hist1->GetBinContent(b);
}
}
...
return val;
This can be simplified to this (note I also changed the function arguments):
float GetBinContents(int xbin, int ybin = 0, int zbin = 0){
float val;
if (hist1 != 0) {
val = hist1->GetBinContent(xbin);
}
...
return val;
Let me know if that makes sense and feel free to send questions, obviously. But next step is to have GetBinContents and and GetBinContentsByAxis to just be the specific bin lookup. Then I think we can drop it in to the repo!
from timber.
Added in PR #19
from timber.
Related Issues (20)
- Module for HEM issue
- Top tagging SF module
- W tagging SF module
- Create full b*->tW all-hadronic example HOT 1
- New JME module constructors that don't use collection structs
- Adjust clang reader warning about matching columns
- Add either a DeepAK8 SF module or pieces to existing modules
- TopTag_SF: Secondary constructor which takes in tau32 cut value rather than WP code
- P_T reordering for JES/R and HEM modules
- Allow SetActiveNode to take in str with Node name
- Create way for AddCorrection to load existing columns HOT 1
- Speed up Prefire module with non-collection version
- Add CondorHelper as a subpackage
- Add automatic reporting to CL for selection on final RDataFrame node
- Runs tree not saved when using "RECREATE" to snapshot
- Swig (or other) GenMatching functionality for simple python experimenting
- CompareShapes y-axis title from A.U. to Events
- Docstring for analyzer.Apply() incomplete
- Consider an APV flag w/ provenance
- Fix conflict between snapshotting all columns and collection structs
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from timber.