#include "TH1.h" #include "TH2.h" #include "TFile.h" #include "TTree.h" #include "TRandom.h" #include "TPad.h" #include "TCanvas.h" class TLandauMean: public TObject { public: void Init(Int_t n, Float_t mean, Float_t sigma); // initial parameters void Gener(); // gener sample // void Anal(); // Int_t fNSample; // number of samples Float_t fLMean; // landau mean Float_t fLSigma; // landau sigma // Float_t fTM_0_6[3]; // truncated method - first 3 momenta Float_t fTM_0_7[3]; // truncated method - first 3 momenta Float_t fTM_0_8[3]; // truncated method - first 3 momenta Float_t fTM_0_10[3]; // truncated method - first 3 momenta // Float_t fLM_0_6[3]; // truncated log. method - first 3 momenta Float_t fLM_0_7[3]; // truncated log. method - first 3 momenta Float_t fLM_0_8[3]; // truncated log. method - first 3 momenta Float_t fLM_0_10[3]; // truncated log. method - first 3 momenta Float_t fMedian3; // median 3 value private: Float_t Moment3(Float_t sum1, Float_t sum2, Float_t sum3, Int_t n, Float_t m[3]); ClassDef(TLandauMean,1) }; ClassImp(TLandauMean) void TLandauMean::Init(Int_t n, Float_t mean, Float_t sigma) { // //init parameters fNSample = n; fLMean = mean; fLSigma = sigma; } Float_t TLandauMean::Moment3(Float_t sumi1, Float_t sumi2, Float_t sumi3, Int_t sum, Float_t m[3]) { Float_t m3=0; // m3 = (sumi3-3*pos*sumi2+3*pos*pos*sumi-pos*pos*pos*sum)/sum; Float_t pos = sumi1/sum; m[0] = pos; m[1] = sumi2/sum-pos*pos; if (m[1]<=0){ printf("pici pici\n"); } else m[1] = TMath::Sqrt(m[1]); m3 = (sumi3-3*pos*sumi2+3*pos*pos*sumi1-pos*pos*pos*sum)/sum; Float_t sign = m3/TMath::Abs(m3); m3 = TMath::Power(sign*m3,1/3.); m3*=sign; m[2] = m3; return m3; } void TLandauMean::Gener() { // // generate sample Float_t * buffer = new Float_t[fNSample]; for (Int_t i=0;iLandau(fLMean,fLSigma); if (buffer[i]>1000) buffer[i]=1000; } Int_t *index = new Int_t[fNSample]; TMath::Sort(fNSample,buffer,index,kFALSE); // Float_t median = buffer[index[fNSample/3]]; // Float_t sum06[4] = {0.,0.,0.,0.}; Float_t sum07[4] = {0.,0.,0.,0.}; Float_t sum08[4] = {0.,0.,0.,0.}; Float_t sum010[4] = {0.,0.,0.,0.}; // Float_t suml06[4] = {0.,0.,0.,0.}; Float_t suml07[4] = {0.,0.,0.,0.}; Float_t suml08[4] = {0.,0.,0.,0.}; Float_t suml010[4] = {0.,0.,0.,0.}; // for (Int_t i =0; iBranch("Landau","TLandauMean",&landau); for (Int_t i=0;iRndm()*150); Float_t mean = 40. +gRandom->Rndm()*50.; Float_t sigma = 5. +gRandom->Rndm()*15.; landau->Init(n, mean, sigma); landau->Gener(); tree->Fill(); } tree->Write(); f.Close(); } TH1F * LandauTest(Float_t meano, Float_t sigma, Float_t meanlog0, Int_t n,Float_t ratio) { // // test for different approach of de dx resolution // meano, sigma - mean value of Landau distribution and sigma // meanlog0 - scaling factor for logarithmic mean value // n - number of used layers // ratio - ratio of used amplitudes for truncated mean // TCanvas * pad = new TCanvas("Landau test"); pad->Divide(2,2); TH1F * h1 = new TH1F("h1","Logarithmic mean",300,0,4*meano); TH1F * h2 = new TH1F("h2","Logarithmic amplitudes",300,0,8*meano); TH1F * h3 = new TH1F("h3","Mean",300,0,4*meano); TH1F * h4 = new TH1F("h4","Amplitudes",300,0,8*meano); for(Int_t j=0;j<10000;j++){ //generate sample and sort it Float_t * buffer = new Float_t[n]; Float_t * buffer2= new Float_t[n]; for (Int_t i=0;iLandau(meano,sigma); buffer2[i] = buffer[i]; } //add crosstalk for (Int_t i=1;iFill(amp); h4->Fill(buffer[index[i]]); } } mean = sum/used; mean = (TMath::Exp(mean/meanlog)-1)*meanlog; Float_t mean2 = sum2/used; //mean2 = (mean+mean2)/2.; h1->Fill(mean); h3->Fill(mean2); } pad->cd(1); h1->Draw(); pad->cd(2); h2->Draw(); pad->cd(3); h3->Draw(); pad->cd(4); h4->Draw(); return h1; }