#include #include // #include #include #include // ROOT #include "TH1.h" #include "TF1.h" #include "TCanvas.h" #include "TMath.h" #include "TRandom.h" #include "TThread.h" #include "TMutex.h" #include "TROOT.h" #include "TPluginManager.h" #include "TStopwatch.h" #include "Math/WrappedTF1.h" #include "Math/WrappedMultiTF1.h" #include "Fit/BinData.h" #include "Fit/UnBinData.h" #include "HFitInterface.h" #include "Fit/Fitter.h" void test_portable() { ROOT::TThreadExecutor t; ROOT::TThreadedObject testfit("myfit", "[4]*ROOT::Math::crystalball_function(x,[0],[1],[2],[3])",0,14); //parameters [3] and [4] are time shift and scale respectively TF1* flocalgen = new TF1("flocalgen", "[4]*ROOT::Math::crystalball_function(x,[0],[1],[2],[3])",0,14); //parameters [3] and [4] are time shift and scale respectively flocalgen->FixParameter(0,-0.5); //alpha flocalgen->FixParameter(1,2.08); //n flocalgen->FixParameter(2,1.2); //sigma flocalgen->SetParameter(3,7); //mu flocalgen->SetParameter(4,2000); //mu ROOT::EnableThreadSafety(); for (int q = 0; q < 100;q++) { // T->GetEntry(q); cout << q << endl; std::vector> vectors; for (int j = 0; j < 64;j++) { std::vector v; for (int i = 0; i < 31;i++) { v.push_back(flocalgen->Eval(i)); } v.push_back(j); //Last element in array is an index vectors.push_back(v); v.clear(); } auto func = [&](std::vector &v) { int size = v.size(); float totalvalue = 0; int maxheight = 1000; int maxbin = 0; if (size < 1) {v.push_back(0);return;} for (int i = 0; i < size-1;i++) // exclude memory location item { if (v.at(i)>maxheight) { maxheight = v.at(i); maxbin = i; } } if (maxheight < 1001){v.push_back(0); return;} if (maxbin > 15 || maxbin < 6) {v.push_back(0); return;} int binshift = maxbin - 6; stringstream aa; auto f = testfit.Get(); f->FixParameter(0,-0.5); //alpha f->FixParameter(1,2.08); //n f->FixParameter(2,1.2); //sigma f->SetParameter(3,5); //mu f->SetParameter(4,4000); //mu ROOT::Math::WrappedMultiTF1 fitFunction(*f, f->GetNdim() ); ROOT::Fit::Fitter fitter; // ROOT::Fit::DataOptions opt; // ROOT::Fit::DataRange range(0,15); ROOT::Fit::BinData data(v.size(),1); float pedestal = 0.5* ( v.at(maxbin - 4) + v.at(maxbin-5)); for (int i = maxbin-5;i < maxbin+10;i++) { data.Add(i-binshift-0.5,v.at(i)); } fitter.LikelihoodFit(data,fitFunction,true); totalvalue = f->GetParameter(4); v.push_back(totalvalue); }; t.Foreach(func, vectors); for (int i = 0;i < vectors.size(); i++) { // cout << i << " , " << (vectors.at(i)).size() << endl; std::vector v = vectors.at(i); int lastelement = v.size() -1; if (v.at(lastelement) ==0) {continue;} cout << "extracted signal is: " << i << " , " << v.at(lastelement) << endl; } vectors.clear(); } }