Hi, I have discovered that TMinuit will cause a Floating Point Exception (FPE) with a rare combination of numbers. I am using root 3.05/05 on SuSE 8.2 Linux but I believe it is a generic problem. In order to see this FPE you have to set the flag (sigfpe?) that causes a program to crash when it happens (the safest option!). Once you have turned on FPE trapping then the macro pasted below will crash. Here is the trace from gdb: Program received signal SIGFPE, Arithmetic exception. [Switching to Thread 16384 (LWP 22186)] 0x428cdbb4 in TMinuit::mnmigr() () from /usr/local/root_3_05_05/root/lib/libMinuit.so (gdb) up #1 0x428c5c44 in TMinuit::mnexcm(char const*, double*, int, int&) () from /usr/local/root_3_05_05/root/lib/libMinuit.so (gdb) up #2 0x428bc5cf in TFitter::ExecuteCommand(char const*, double*, int) () from /usr/local/root_3_05_05/root/lib/libMinuit.so (gdb) #3 0x41cb8f94 in TGraph::Fit(TF1*, char const*, char const*, double, double) () from /usr/local/root_3_05_05/root/lib/libGraf.so (gdb) Hope you can fix it! Thanks, Jeff. Here is the macro: { //there are two steps to this //1.) slightly modify the values used to make fit not fpe //2.) use the values that cause the fpe float oddplanes[30] = {0}; float oddstrips[30] = {0}; int oddcnt = 0; //set up a particular senario oddcnt=4; oddplanes[0]=15; oddplanes[1]=17; oddplanes[2]=19; oddplanes[3]=21; oddstrips[0]=1; oddstrips[1]=3; oddstrips[2]=6; oddstrips[3]=9; TF1* form=new TF1("form","pol1",0,60); for (Int_t i=0;i<oddcnt;i++){ cout<<"oddcnt="<<oddcnt <<", plane="<<oddplanes[i] <<", strip="<<oddstrips[i]<<endl; //hack to make it work oddplanes[i]+=0.00001; oddstrips[i]+=0.00001; cout<<"After hack: oddcnt="<<oddcnt <<", plane="<<oddplanes[i] <<", strip="<<oddstrips[i]<<endl; } TGraph* oddgr=new TGraph(oddcnt,oddplanes,oddstrips); cout<<"Created graph"<<endl; oddgr->Fit(form); cout<<"Fitted graph"<<endl<<endl; //set up the particular senario again oddcnt=4; oddplanes[0]=15; oddplanes[1]=17; oddplanes[2]=19; oddplanes[3]=21; oddstrips[0]=1; oddstrips[1]=3; oddstrips[2]=6; oddstrips[3]=9; for (Int_t i=0;i<oddcnt;i++){ cout<<"oddcnt="<<oddcnt <<", plane="<<oddplanes[i] <<", strip="<<oddstrips[i]<<endl; //oddplanes[i]+=0.0001; //oddstrips[i]+=0.0001; cout<<"oddcnt="<<oddcnt <<", plane="<<oddplanes[i] <<", strip="<<oddstrips[i]<<endl; } TGraph* oddgr=new TGraph(oddcnt,oddplanes,oddstrips); cout<<"Created graph"<<endl; cout<<"I will FPE here..."<<endl; oddgr->Fit(form); cout<<"Fitted graph"<<endl; cout<<"Finished macro"<<endl; }
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:14 MET