10 #include "Math/Interpolator.h"
11 #include "Math/InterpolationTypes.h"
15 using namespace ROOT::Math;
19 TFile f(inputfilename,
"READ");
21 cerr <<
"Could not read data file. Exit." << endl;
24 TTree *t = (TTree*) f.Get(
"tBcDensAverage");
25 if ( t->IsZombie() ) {
26 cerr <<
"Could not find data tree \"tBcDensAverage\". Exit." << endl;
30 Int_t cell_id[msSize];
38 t->SetBranchAddress(
"sPos", cell_id);
39 t->SetBranchAddress(
"sRin", &r_min);
40 t->SetBranchAddress(
"sRout", &r_max);
41 t->SetBranchAddress(
"sSphi", &s_phi);
42 t->SetBranchAddress(
"sDphi", &d_phi);
43 t->SetBranchAddress(
"sEnDens", &en_dens);
44 t->SetBranchAddress(
"sEnDensErr", &en_dens_err);
46 Int_t ne = t->GetEntries();
48 for (
int ie = 0; ie<ne; ie++){
53 for (
int i = 0; i<msSize; i++){ cell->
Id[i] = cell_id[i]; }
54 cell->
R = 0.5*( r_max + r_min );
55 cell->
Phi = s_phi + 0.5*d_phi;
59 mCellStorage.push_back(cell);
61 if ( (cell_id[0] == 1) && (cell_id[2] == 0) ) {
62 mSegmentDeltaPhi.push_back(d_phi);
63 if ( cell_id[1] == 0 ) {
66 mRingDeltaR = r_max - r_min;
71 mNumberOfRings = mSegmentDeltaPhi.size();
72 mNumbersOfSegments.assign(mNumberOfRings, 0);
74 for (
int ie = 0; ie<ne; ie++){
79 if ( cell_id[1] == ( mNumberOfRings - 1 ) ){
83 if ( cell_id[0] == 1 ) {
84 mNumbersOfSegments.at(cell_id[1]) += 1;
92 vector<CellType*>::iterator it;
93 for (it = mCellStorage.begin(); it!=mCellStorage.end(); it++){
100 const Double_t& rRadius,
const Double_t& rPhi,
101 Double_t* pEnDens, Double_t* pEnDensError)
const
107 Double_t the_phi = rPhi;
111 the_cell = GetCellNumber(rLayer, rRadius, the_phi);
112 if ( the_cell < 0 )
return false;
113 Int_t the_ring = mCellStorage.at(the_cell)->Id[1];
115 *pEnDens = mCellStorage.at(the_cell)->EnDens;
116 *pEnDensError = mCellStorage.at(the_cell)->EnDensErr;
121 const Int_t nsegs = 3;
122 const Int_t nrings = 3;
123 Int_t i_cell[nrings][nsegs];
126 for (
int ir = 0; ir<nrings; ir++ ){
127 for (
int is = 0; is<nsegs; is++ ){
128 Double_t radius = rRadius + (ir - 1)*mRingDeltaR;
129 Int_t i_ring = the_ring + ir - 1;
130 if ( i_ring < 0 || i_ring >= mNumberOfRings ){
133 Double_t phi = the_phi + (is - 1)*mSegmentDeltaPhi.at(i_ring);
134 i_cell[ir][is] = GetCellNumber(rLayer, radius, phi);
139 vector<double> phis[nrings];
140 vector<ValErrType> en_dens[nrings];
142 for (
int is = 0; is<nsegs; is++){
143 for (
int ir = 0; ir<nrings; ir++){
144 if ( !( i_cell[ir][is]<0 ) ){
145 CellType *cell = mCellStorage.at(i_cell[ir][is]);
146 Double_t phi = cell->
Phi;
147 if ( the_phi < mSegmentDeltaPhi.at(the_ring + ir - 1) && is == 0 ) {
148 phi -= 2*TMath::Pi();
150 if ( 2*TMath::Pi() - the_phi < mSegmentDeltaPhi.at(the_ring + ir - 1)
152 phi += 2*TMath::Pi();
154 phis[ir].push_back(phi);
158 ed.
Lb = ed.
Val - ed_err;
159 ed.
Ub = ed.
Val + ed_err;
160 en_dens[ir].push_back(ed);
167 vector<ValErrType> ed_int_by_phi;
168 for (
int ir=0; ir<nrings; ir++){
169 if ( en_dens[ir].size() != 0 && i_cell[ir][1] > 0 ){
170 r.push_back(mCellStorage.at(i_cell[ir][1])->R);
172 Bool_t int_result = MakeInterpolation(the_phi, phis[ir], en_dens[ir], &ed_int);
174 ed_int_by_phi.push_back(ed_int);
176 cerr <<
"Interpolation failed." << endl;
182 if (ed_int_by_phi.size()!=0){
184 Bool_t int_result = MakeInterpolation(rRadius, r, ed_int_by_phi, &ed_int);
186 *pEnDens = ed_int.
Val;
187 *pEnDensError = 0.5*(ed_int.
Ub - ed_int.
Lb);
189 cerr <<
"Interpolation failed." << endl;
202 const Double_t& rPhi)
const
204 unsigned int cell_cnt = 0;
206 if ( rRadius < mRMin || rRadius > mRMax )
return -1;
208 Int_t layer_number = TMath::Abs(rLayer) - 1;
209 Int_t layer_sign = ( rLayer>0 ) ? 0 : 1;
210 Int_t ring_number = (Int_t) TMath::Floor( (rRadius - mRMin)/mRingDeltaR );
211 double phi = ( rPhi < mPhiMin) ? rPhi + 2*TMath::Pi() : rPhi;
213 (Int_t) TMath::Floor( (phi - mPhiMin)/mSegmentDeltaPhi.at(ring_number) );
214 if ( segm_number >= mNumbersOfSegments.at(ring_number) )
return -1;
216 Int_t n_in_layer = 0;
217 for (
int ir=0; ir<mNumberOfRings; ir++){
218 n_in_layer += mNumbersOfSegments.at(ir);
221 for (
int ir=0; ir<ring_number; ir++){
222 cell_cnt += mNumbersOfSegments.at(ir);
224 cell_cnt += n_in_layer*layer_number + segm_number;
226 cell_cnt += layer_sign;
228 if ( cell_cnt > mCellStorage.size() )
return -1;
234 const vector<Double_t>& rXData,
235 const vector<ValErrType>& rYData,
258 Interpolation::Type interp_type = Interpolation::kLINEAR;
262 Interpolator *interp=0;
265 vector<double> y_data;
266 for (
size_t i=0; i<rYData.size(); i++) y_data.push_back(rYData.at(i).Val);
267 interp =
new Interpolator (rXData, y_data, interp_type);
270 pResult->
Val = interp->Eval(rX);
275 for (
size_t i=0; i<rYData.size(); i++) y_data.push_back(rYData.at(i).Lb);
276 interp =
new Interpolator (rXData, y_data, interp_type);
279 pResult->
Lb = interp->Eval(rX);
284 for (
size_t i=0; i<rYData.size(); i++) y_data.push_back(rYData.at(i).Ub);
285 interp =
new Interpolator (rXData, y_data, interp_type);
288 pResult->
Ub = interp->Eval(rX);
Bool_t GetEnergyDensity(const Int_t &rLayer, const Double_t &rRadius, const Double_t &rPhi, Double_t *pEnDens, Double_t *pEnDensError) const
Bool_t MakeInterpolation(const Double_t &rX, const vector< Double_t > &rXData, const vector< ValErrType > &rYData, ValErrType *pResult) const
void Init(const char *inputfilename)
Int_t GetCellNumber(const Int_t &rLayer, const Double_t &rRadius, const Double_t &rPhi) const