Hello Yves, I looked into your code. When you use the gradient option, you use indices out of the array boundary in AliPHOSTrackSegmentMakerv1::UnfoldingChiSquare. You have a piece of code that looks like: iParam = 0 ; while(iParam < NPar ){ ..... Grad[iParam++] += Epar * shape * deriv * (xpar - xDigit) ; Grad[iParam++] += Epar * shape * deriv * (zpar - zDigit) ; Grad[iParam++] += shape ; } Clearly iParam will be bigger than NPar. Fix your algorithm. Rene Brun Yves SCHUTZ wrote: > > Hi Folks, > > I am fighting with a seemingly TMinuit problem. I > am using it within the aliroot context and root > 2.23/08 on a Linux PC. He re is the error message: > > Fatal in <operator delete>: storage area > overwritten > > It happens only after several call to the > minimzation. > > Everything goes allright if I do not calculate my > own gradient, i.e., remove le line : > > gMinuit->mnexcm("SET GRA", &p1, 1, ierflg) ; // > force TMinuit to use my gradient > > Next you find the backtrace from the debugger and > the relevant part of the source code. > > Help is welcome .... thanks ..... Yves > > ============= this is the part of the backtrace > result ======= > #0 0x441bf111 in __kill () > #1 0x441bed66 in raise (sig=6) at > ../sysdeps/posix/raise.c:27 > #2 0x441c0447 in abort () at > ../sysdeps/generic/abort.c:88 > #3 0x42d613cd in TUnixSystem::Abort () > #4 0x42c5159a in DefaultErrorHandler () > #5 0x42c51650 in ErrorHandler () > #6 0x42c51748 in Fatal () > #7 0x42bbc0fa in __builtin_delete () > #8 0x42bbc228 in __builtin_vec_delete () > #9 0x43526ade in TMinuit::DeleteArrays () > #10 0x43526017 in TMinuit::~TMinuit () > #11 0x41883abb in > AliPHOSTrackSegmentMakerv1::FindFit () > #12 0x41884d93 in > AliPHOSTrackSegmentMakerv1::UnfoldClusters () > etc....... > > ============= this is part of the code relevant to > TMinuit ======== > TMinuit Minuit(NPar) ; > > gMinuit->SetPrintLevel(-1) ; // No > Printout > gMinuit->SetFCN(UnfoldingChiSquare) ; // To set > the address of the minimization function > gMinuit->SetObjectFit(emcRP) ; // To > tranfer pointer to UnfoldingChiSquare > > gMinuit->mnparm(index, "x", x, 0.1, 0, 0, > ierflg) ; > index++ ; > gMinuit->mnparm(index, "z", z, 0.1, 0, 0, > ierflg) ; > index++ ; > gMinuit->mnparm(index, "Energy", Energy , > 0.05*Energy, 0., 4.*Energy, ierflg) ; > index++ ; > Double_t p0 = 0.1 ; // "Tolerance" Evaluation > stops when EDM = 0.0001*p0 ; The number of > function call slightly > // depends on it. > Double_t p1 = 1.0 ; > Double_t p2 = 0.0 ; > > gMinuit->mnexcm("SET STR", &p2, 0, ierflg) ; > // force TMinuit to reduce function calls > gMinuit->mnexcm("SET GRA", &p1, 1, ierflg) ; > // force TMinuit to use my gradient > gMinuit->SetMaxIterations(5); > gMinuit->mnexcm("SET NOW", &p2 , 0, ierflg) ; > // No Warnings > gMinuit->mnexcm("MIGRAD", &p0, 0, ierflg) ; > // minimize > > ============= this is part of the minimazation > method relevant to the gradient calculation ====== > > void UnfoldingChiSquare(Int_t &NPar, Double_t > *Grad, Double_t & fret, Double_t *x, Int_t iflag) > { > if(iflag == 2) > for(iparam = 0 ; iparam < NPar ; iparam++) > Grad[iparam] = 0 ; // Will evaluate gradient > > if(iflag == 2){ // calculate gradient > while(iParam < NPar ){ > Grad[iParam] = .... > } > etc ... > } > > -- > > __________________________________________________________________ > |Yves SCHUTZ (IN2P3 - CNRS) collaboration > TAPS/WA98/ALICE | > |SUBATECH > | > |Ecole des Mines de Nantes Telephone: (+33/0) 2 51 > 85 84 71 | > |4, rue Alfred Kastler Fax : (+33/0) 2 51 > 85 84 79 | > |F-44070 Nantes cedex 03 e-mail : > yves.schutz@subatech.in2p3.fr| > |__________________________________________________________________|
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:16 MET