获取每个箱子中的所有y值

时间:2017-06-16 13:30:10

标签: c++ loops

我的问题如下:我已经从具有x和y值的文本文件中绘制了一个图表。图表本身是log(y / x)vs x。接下来,我定义“bin number”和“bin width”,即我想将x轴分成几个特定宽度的片段并得到所有相应的y值。现在我不停地将所有值都放在一定范围内 - 我只为每个“bin宽度”获得一个值。下面是代码的一部分(C ++ + ROOT) - 所以如果我打印vx [0],vy [0],我从文本文件中得到第一个条目,但是我想首先检查代码是否为x值在第一个bin中(从0.3到0.9),如果是,则打印所有相应的y值。然后检查x值是否在第二个bin(0.9-1.5)中,依此类推。有关如何做到这一点的任何建议都非常欢迎! :)

Float_t xmin = 0.3; //x-range starts at 0.3
Float_t xmax = 60.;  //x-range ends at 60
const Int_t bins = 100; //the x range divided into 100 pieces
Float_t binW = (xmax-xmin)/(float)bins; // bin width ~0.6


Double_t xv[bins], yv[bins];
Double_t *xntuple = ntuple->GetVal(0); //1. column in txt file
Double_t *yntuple = ntuple->GetVal(1); //log(y/x)
Double_t xaxis, yaxis;


Float_t s = xmin;

for(Int_t i=0; i<bins; i++){
    yaxis = yntuple[i];
    yv[i] = yaxis;
    xv[i] = s;  
    s += binW;  //bin width ~0.6
  }
cout << xv[0] << " and " << yv[0] << endl;
}

1 个答案:

答案 0 :(得分:0)

我不知道您对ROOT的约束是什么,但您可以这样做:为每个bin创建向量;然后遍历所有数据并检查X值是否在当前bin的范围内。如果没有,请转到下一个垃圾箱。

这样的事情:

// Bins
std::vector<std::vector<Double_T>> vx, vy;
vx.resize(bins);
vy.resize(bins);

Float_T currentBinStart = xmin;
int currentBinNr = 0;

for (Int_T i = 0; i < numberOfValues; ++i) {
   // Check if value is in range
   if (xntuple[i] > currentBinStart+binWidth) {
      // No => go to next bin
      currentBinStart += binWidth;
      currentBinNr++;
   }
   vx[currentBinNr].push_back(xntuple[i]);
   vy[currentBinNr].push_back(yntuple[i]);
}

注意:这假设X值按升序排序!

相关问题