Saving ROOT::Math::DistSampler * sampler, in TTree

I have been trying to save a set of trained sampler pointer objects to TTree. The point of saving them is to bypass the training time of these sampler. So I have got 10k such trained samplers for different scattering processes, background temperature and leading parton energies.
I have made a class and have generated a dictionary for this class

#pragma once
#include “Math/DistSampler.h”

class SamplerData{
public:
double ENERGY;
double TEMPERATURE;
int PROCESSID;
ROOT::Math::DistSampler* SAMPLER;
double INTEGRATEDVALUE;

SamplerData()
: ENERGY(0.0), TEMPERATURE(0.0), PROCESSID(0), SAMPLER(nullptr), INTEGRATEDVALUE(0.0) {}
SamplerData(double e, double t, int pid, ROOT::Math::DistSampler* s, double value)
: ENERGY(e), TEMPERATURE(t), PROCESSID(pid), SAMPLER(s), INTEGRATEDVALUE(value) {}

void printer();    

};

The execution:

  	for(int i=0;i<3;i++){
  		for (int i0=1;i0<=tapmaan[i];i0++){
  			for (int i1=0;i1<9;i1++){
  				p_proc=Integrator_(i0*0.5,temp_ar[i],Proc[i1]);
  				s_proc=i0*0.5;
  				t_proc=temp_ar[i];
  				r_proc=i1;
  				ROOT::Math::DistSampler * sampler = ROOT::Math::Factory::CreateDistSampler("Foam");

  				JSINFO<<"i "<<i<<" i0 "<<i0<<" i1 "<<i1;
  				double xmin[]={0.0, 0.0, 0.0, 0.0};
  				double xmax[]={M_PI, M_PI, 2*M_PI, i0*0.5+temp_ar[i]};
  				double par0[]={i0*0.5,temp_ar[i],Proc[i1]};
  				f1->SetParameters(par0);
  				sampler->SetFunction(*f1,4);
  				sampler->SetRange(xmin,xmax);	
  				ret=sampler->Init();	
  				samplerdata.ENERGY=s_proc;
  				samplerdata.TEMPERATURE=t_proc;
  				samplerdata.PROCESSID=r_proc;
  				JSINFO<<"LUSSSSSSh";
  				samplerdata.SAMPLER=sampler;
  				JSINFO<<"LUUUUUUS TWO";
  				samplerdata.INTEGRATEDVALUE=p_proc;
  				JSINFO<<"LUSH FIVVVVE";
  				//file->WriteObjectAny(&samplerdata, "SamplerData", "samplerdata");
  				tree->Fill();				
  				JSINFO<<"LUSH FOOOOUR";	
  			}
  		}
  	}

  	tree->Write();
  	//file->Close();

  	auto stop = std::chrono::high_resolution_clock::now();
  	auto duration = duration_cast<std::chrono::microseconds>(stop - start);
  	JSINFO<<"time for rates "<<duration.count();	

After doing so, I am getting this error:

Warning in TBufferFile::WriteObjectAny: since ROOT::Math::WrappedMultiFunction<TF1&> has no public constructor
which can be called without argument, objects of this class
can not be read with the current library. You will need to
add a default constructor before attempting to read it.

Is there a way to circumvent this problem?

_ROOT Version: 6.26/06
Platform: Ventura 13.4 (22F66)
_Compiler: Apple clang version 14.0.0

Hi,
The problem is saving the function that you provide to the DistSampler. In the general case only a TF1 constructed with a string formula can be properly saved to disk.
I possible work around that might work is to call again the DistSampler::SetFunction method again when you read the object from the file.

Best regards

Lorenzo

Thanks a lot!

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.