这是我在ROOT框架中使用C ++和一些预定义类编写的宏的一部分。在包含下面标记的行(从minv = ...
开始)时,我得到一个浮点异常。这个错误的原因是什么?
Double_t ppx[3000],ppy[3000],ppz[3000],pE[3000];
Double_t m = 0.000511;
Double_t minv,epx,epy,epz,eE;
for(Int_t n = 0; n < nEvents; n++) {
inTree->GetEntry(n);
Int_t nTracks = trackArray->GetEntries();
htrack->Fill(nTracks);
for(Int_t i = 0; i < nTracks; i++) {
Track* trackData = (Track*)trackArray->At(i);
if(trackData->fCharge ==1)
{
ppx[i] = (trackData->fPt) * TMath::Cos(trackData->fPhi);
ppy[i] = (trackData->fPt) * TMath::Sin(trackData->fPhi);
ppz[i] = (trackData->fPt) * sinh(trackData->fEta);
pE[i] = m * m - ppx[i] * ppx[i] - ppy[i] * ppy[i] - ppz[i] * ppz[i];
}
hPt->Fill(trackData->fPt);
}
for(Int_t i = 0; i < nTracks; i++) {
Track* trackData = (Track*)trackArray->At(i);
if(trackData->fCharge == -1)
for (Int_t k=0;k<nTracks;k++){
epx = (trackData->fPt) * TMath::Cos(trackData->fPhi);
epy = (trackData->fPt) * TMath::Sin(trackData->fPhi);
epz = (trackData->fPt) * sinh(trackData->fEta);
eE = m*m - epx *epx - epy * epy - epz * epz;
// the following two lines cause the exception:
minv = ((eE +pE[k]) * (eE + pE[k])) - ((epx + ppx[k]) * (epx + ppx[k])) - ((epy + ppy[k]) * (epy + ppy[k])) - ((epz + ppz[k]) * (epz + ppz[k]) );
invm->Fill(minv);
}
}
}
nEventsProcessed++;
}
PS:我知道编码不是很有效,我是初学者。
我打印出了minv的值。这是一个表示输出的小样本
-0.225634
-0.657662
-0.225634
1.53201
-0.225634
nan
-0.630927
-0.225634
-0.225634
-0.225634
-0.225634
-0.228794
-0.225634
-0.7196
-0.225634
-0.225634
-0.520265
-0.228796
0.608326
-0.225634
-0.225634
-0.225634
-0.733564
2.74301
-0.763932
-0.225634
-0.225634
nan
-0.228643
-0.225634
-0.225634
-0.225634
-0.584549
另外:nan的很奇怪。它们附近的数字看起来很正常,这不是一个爆炸的函数,所以我使用的是数组的垃圾值吗?
答案 0 :(得分:1)
在所有轨道的第一个循环中,如果轨道电荷为正,则仅填充阵列。在第二个循环中,无论第k个轨道的电荷是否为正,都可以访问阵列。
如果您只想为反向充电的轨道填充minv
(我猜不变质量),请移除检查正电荷的第一个if
并将最后一个循环更改为:
for (Int_t i=0; i<nTracks; i++) {
Track* trackData = (Track*)trackArray->At(i);
for (Int_t k=0; k<nTracks; k++){
Track* trackData2 = (Track*)trackArray->At(k);
if (trackData->fCharge == trackData2->fCharge)
continue;
// calculate minv here
invm->Fill(minv);
}
}