Axel, Philippe,
Could you follow this problem that seems to appear only on 32 bits machines?
Rene
attached mail follows:
Hi Rene,
that's very unfortunate... so far I've tested the macro on different
platforms with different root-versions; all with the same result:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
Any guess what could cause this behavior? Any help is greatly appreciated.
Cheers, Stephan
On 2/27/2010 5:21 AM, Rene Brun wrote:
> Hi Stephan,
>
> I cannot reproduce the problem. Executing your script, I get:
> root [0] .L henry.C
> root [1] henry()
> initial chi2/Ndf: 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> Chi2/Ndf 528.202
> root [2] .q
>
> I tried too with ACLIC and get the same result. To use it with ACLIC, I
> had to make 2 small changes in the includes, see attachment.
>
> Rene
>
> Stephan Zimmer wrote:
>> Oh sorry for that.
>> The script to call is henry.C and the dat-file henry.dat (see
>> attachment) I just wonder whether I did something stupid in my code.
>> Thank you very much.
>> The same behavior happens under 5.18/5.22/5.26
>> Cheers, Stephan
>>
>> On 2/27/2010 5:01 AM, Rene Brun wrote:
>>
>>> Could you provide a complete script and the data file to execute it?
>>>
>>> Rene
>>>
>>> Stephan Zimmer wrote:
>>>
>>>> Hi ROOTers,
>>>> I wonder if someone of you might understand why the following code
>>>> crashes...
>>>>
>>>> double CotTheta(const double x_i, const double alpha[2]){
>>>> // returns the estimate y(x_i) based on the theoretical distribution
>>>> return alpha[0]*x_i - alpha[1]*pow(x_i,-1);
>>>> }
>>>>
>>>> double CalculateChi2(const vector<double> x, const vector<double> y,
>>>> const vect\
>>>> or<double> yError, const double alpha[2]){
>>>> // returns the chi2 value for a given set of parameters
>>>> double sumchi2=0;
>>>> for (unsigned int i = 0; i<x.size(); i++){
>>>>
>>>> sumchi2=sumchi2+(pow(yError[i],-2)*pow(y[i]-CotTheta(x[i],alpha),2));
>>>> }
>>>> return sumchi2;
>>>> }
>>>>
>>>> void littleHenry(){
>>>>
>>>> TVirtualFitter::SetDefaultFitter("Minuit");
>>>>
>>>> // readout henry.dat
>>>> vector<double> xVec;
>>>> vector<double> xEVec;
>>>> vector<double> yVec;
>>>> vector<double> yEVec;
>>>> double x(0),y(0),xE(0), yE(0);
>>>> double output[3];
>>>> FILE *data;
>>>> char datafname[]="henry.dat";
>>>>
>>>> data = fopen(datafname,"r");
>>>> while (fscanf(data, "%lf %lf %lf %lf",&x,&xE,&y,&yE) != EOF) {
>>>> xVec.push_back(x);
>>>> yVec.push_back(y);
>>>> xEVec.push_back(xE);
>>>> yEVec.push_back(yE);
>>>> }
>>>> double alpha[2];
>>>> double chi2;
>>>> alpha[0]=1e-4;
>>>> alpha[1]=1e2;
>>>> CalculateChi2(xVec,yVec,yEVec,alpha);
>>>> --> that works...
>>>>
>>>>
>>>> However, once I want to execute the routine CalculateChi2 more than
>>>> twice, by putting it inside a loop I get a weird error message:
>>>> for (int i = 0; i<5; i++){
>>>> chi2=CalculateChi2(xVec,yVec,yEVec,alpha);
>>>> cout << "Chi2/Ndf " << chi2/xVec.size() << endl;
>>>> }
>>>> ----> OUTPUT <-------
>>>> Processing littleHenry.C...
>>>> Chi2/Ndf 528.202
>>>> Chi2/Ndf 528.202
>>>> Error: Can't call vector<double,allocator<double>
>>>>
>>>>
>>>>> ::vector<double,allocator<double> >((class
>>>>>
>>>> vector<double>***&)148530456) in current scope littleHenry.C:34:
>>>> Possible candidates are...
>>>> (in vector<double,allocator<double> >)
>>>> vector.dll -1:-1 0 public: vector<double,allocator<double> >
>>>> vector<double,allocator<double> >::vector<double,allocator<double>
>>>>
>>>>> (void);
>>>>>
>>>> vector.dll -1:-1 0 public: vector<double,allocator<double> >
>>>> vector<double,allocator<double> >::vector<double,allocator<double>
>>>>
>>>>
>>>>> (vector<double,allocator<double> >::size_type n,const double&
>>>>>
>>>> value=double());
>>>> vector.dll -1:-1 0 public: vector<double,allocator<double> >
>>>> vector<double,allocator<double> >::vector<double,allocator<double>
>>>>
>>>>
>>>>> (const vector<double,allocator<double> >& x);
>>>>>
>>>> vector.dll -1:-1 0 public: vector<double,allocator<double> >
>>>> vector<double,allocator<double> >::vector<double,allocator<double>
>>>>
>>>>
>>>>> (vector<double,allocator<double> >::const_iterator
>>>>>
>>>> first,vector<double,allocator<double> >::const_iterator last);
>>>> *** Interpreter error recovered ***
>>>>
>>>> I wonder if I somehow run out of the boundaries of the vector but that
>>>> should not happen as they are not touched and treated as constants...
>>>> Any ideas?
>>>>
>>>> Cheers,
>>>> Stephan
>>>>
>>>>
This archive was generated by hypermail 2.2.0 : Sun Feb 28 2010 - 17:50:01 CET