Причина исключения с плавающей запятой? - PullRequest
0 голосов
/ 22 августа 2011

Это часть макроса, который я пишу в 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

Дополнение: Наны очень странные.Числа в их окрестностях выглядят нормально, и это не взрывная функция, так что я использую в ненужные значения массива?

1 Ответ

1 голос
/ 20 сентября 2011

В первом цикле по всем дорожкам вы заполняете массивы только в том случае, если заряд дорожек положительный. Во втором цикле вы получаете доступ к массивам независимо от того, является ли заряд 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);
    }
}
...