ROOT logo
#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;i<fNSample;i++) {
    buffer[i] = gRandom->Landau(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; i<fNSample; i++){
    Float_t amp  = buffer[index[i]];
    Float_t lamp = median*TMath::Log(1.+amp/median);
    if (i<0.6*fNSample){
      sum06[0]+= amp;
      sum06[1]+= amp*amp;
      sum06[2]+= amp*amp*amp;
      sum06[3]++;
      suml06[0]+= lamp;
      suml06[1]+= lamp*lamp;
      suml06[2]+= lamp*lamp*lamp;
      suml06[3]++;
    }

    if (i<0.7*fNSample){
      sum07[0]+= amp;
      sum07[1]+= amp*amp;
      sum07[2]+= amp*amp*amp;
      sum07[3]++;
      suml07[0]+= lamp;
      suml07[1]+= lamp*lamp;
      suml07[2]+= lamp*lamp*lamp;
      suml07[3]++;
    }
    if (i<0.8*fNSample){
      sum08[0]+= amp;
      sum08[1]+= amp*amp;
      sum08[2]+= amp*amp*amp;
      sum08[3]++;
      suml08[0]+= lamp;
      suml08[1]+= lamp*lamp;
      suml08[2]+= lamp*lamp*lamp;
      suml08[3]++;
    }
    if (i<1*fNSample){
      sum010[0]+= amp;
      sum010[1]+= amp*amp;
      sum010[2]+= amp*amp*amp;
      sum010[3]++;
      suml010[0]+= lamp;
      suml010[1]+= lamp*lamp;
      suml010[2]+= lamp*lamp*lamp;
      suml010[3]++;

    }
  }
  //  
  fMedian3 = median;
  //
  Moment3(sum06[0],sum06[1],sum06[2],sum06[3],fTM_0_6);  
  Moment3(sum07[0],sum07[1],sum07[2],sum07[3],fTM_0_7);  
  Moment3(sum08[0],sum08[1],sum08[2],sum08[3],fTM_0_8);  
  Moment3(sum010[0],sum010[1],sum010[2],sum010[3],fTM_0_10);  
  //

  Moment3(suml06[0],suml06[1],suml06[2],suml06[3],fLM_0_6);  
  Moment3(suml07[0],suml07[1],suml07[2],suml07[3],fLM_0_7);  
  Moment3(suml08[0],suml08[1],suml08[2],suml08[3],fLM_0_8);  
  Moment3(suml010[0],suml010[1],suml010[2],suml010[3],fLM_0_10);  
  //
  fLM_0_6[0] = (TMath::Exp(fLM_0_6[0]/median)-1.)*median;
  fLM_0_7[0] = (TMath::Exp(fLM_0_7[0]/median)-1.)*median;
  fLM_0_8[0] = (TMath::Exp(fLM_0_8[0]/median)-1.)*median;
  fLM_0_10[0] = (TMath::Exp(fLM_0_10[0]/median)-1.)*median;
  //
  delete [] buffer;
}   


void GenerLandau(Int_t nsamples)
{
  TLandauMean * landau = new TLandauMean;
  TFile f("Landau.root","recreate");
  TTree * tree = new TTree("Landau","Landau");
  tree->Branch("Landau","TLandauMean",&landau); 
  
  for (Int_t i=0;i<nsamples;i++){
    Int_t   n     = 20 + Int_t(gRandom->Rndm()*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;i<n;i++) {
      buffer[i] = gRandom->Landau(meano,sigma); 
      buffer2[i] = buffer[i];    
    }
    //add crosstalk
    for (Int_t i=1;i<n-1;i++) {
      buffer[i] =    buffer2[i]*1.0+ buffer2[i-1]*0.0+ buffer2[i+1]*0.0;
      buffer[i] = TMath::Min(buffer[i],1000.); 
    }
    Int_t *index = new Int_t[n];
    TMath::Sort(n,buffer,index,kFALSE);

    //calculate mean
    Float_t sum;
    sum=0;
    Float_t mean;
    Float_t used = 0;
    for (Int_t i=0;i<n*ratio;i++) {
      if (buffer[index[i]]<1000.){
	Float_t amp = meanlog0*TMath::Log(1+buffer[index[i]]/meanlog0);
	sum += amp;            
	used++;
      }
    }
    mean = sum/used;
    //
    sum=0;
    used=0;
    Float_t sum2=0;
    Float_t meanlog =meanlog0;
    for (Int_t i=0;i<n*ratio;i++) {
      if (buffer[index[i]]<1000.){
	Float_t amp = meanlog*TMath::Log(1.+buffer[index[i]]/(meanlog));
	sum +=amp;
	sum2+=buffer[index[i]];
	used++;
	h2->Fill(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;

}

 LandauTest.C:1
 LandauTest.C:2
 LandauTest.C:3
 LandauTest.C:4
 LandauTest.C:5
 LandauTest.C:6
 LandauTest.C:7
 LandauTest.C:8
 LandauTest.C:9
 LandauTest.C:10
 LandauTest.C:11
 LandauTest.C:12
 LandauTest.C:13
 LandauTest.C:14
 LandauTest.C:15
 LandauTest.C:16
 LandauTest.C:17
 LandauTest.C:18
 LandauTest.C:19
 LandauTest.C:20
 LandauTest.C:21
 LandauTest.C:22
 LandauTest.C:23
 LandauTest.C:24
 LandauTest.C:25
 LandauTest.C:26
 LandauTest.C:27
 LandauTest.C:28
 LandauTest.C:29
 LandauTest.C:30
 LandauTest.C:31
 LandauTest.C:32
 LandauTest.C:33
 LandauTest.C:34
 LandauTest.C:35
 LandauTest.C:36
 LandauTest.C:37
 LandauTest.C:38
 LandauTest.C:39
 LandauTest.C:40
 LandauTest.C:41
 LandauTest.C:42
 LandauTest.C:43
 LandauTest.C:44
 LandauTest.C:45
 LandauTest.C:46
 LandauTest.C:47
 LandauTest.C:48
 LandauTest.C:49
 LandauTest.C:50
 LandauTest.C:51
 LandauTest.C:52
 LandauTest.C:53
 LandauTest.C:54
 LandauTest.C:55
 LandauTest.C:56
 LandauTest.C:57
 LandauTest.C:58
 LandauTest.C:59
 LandauTest.C:60
 LandauTest.C:61
 LandauTest.C:62
 LandauTest.C:63
 LandauTest.C:64
 LandauTest.C:65
 LandauTest.C:66
 LandauTest.C:67
 LandauTest.C:68
 LandauTest.C:69
 LandauTest.C:70
 LandauTest.C:71
 LandauTest.C:72
 LandauTest.C:73
 LandauTest.C:74
 LandauTest.C:75
 LandauTest.C:76
 LandauTest.C:77
 LandauTest.C:78
 LandauTest.C:79
 LandauTest.C:80
 LandauTest.C:81
 LandauTest.C:82
 LandauTest.C:83
 LandauTest.C:84
 LandauTest.C:85
 LandauTest.C:86
 LandauTest.C:87
 LandauTest.C:88
 LandauTest.C:89
 LandauTest.C:90
 LandauTest.C:91
 LandauTest.C:92
 LandauTest.C:93
 LandauTest.C:94
 LandauTest.C:95
 LandauTest.C:96
 LandauTest.C:97
 LandauTest.C:98
 LandauTest.C:99
 LandauTest.C:100
 LandauTest.C:101
 LandauTest.C:102
 LandauTest.C:103
 LandauTest.C:104
 LandauTest.C:105
 LandauTest.C:106
 LandauTest.C:107
 LandauTest.C:108
 LandauTest.C:109
 LandauTest.C:110
 LandauTest.C:111
 LandauTest.C:112
 LandauTest.C:113
 LandauTest.C:114
 LandauTest.C:115
 LandauTest.C:116
 LandauTest.C:117
 LandauTest.C:118
 LandauTest.C:119
 LandauTest.C:120
 LandauTest.C:121
 LandauTest.C:122
 LandauTest.C:123
 LandauTest.C:124
 LandauTest.C:125
 LandauTest.C:126
 LandauTest.C:127
 LandauTest.C:128
 LandauTest.C:129
 LandauTest.C:130
 LandauTest.C:131
 LandauTest.C:132
 LandauTest.C:133
 LandauTest.C:134
 LandauTest.C:135
 LandauTest.C:136
 LandauTest.C:137
 LandauTest.C:138
 LandauTest.C:139
 LandauTest.C:140
 LandauTest.C:141
 LandauTest.C:142
 LandauTest.C:143
 LandauTest.C:144
 LandauTest.C:145
 LandauTest.C:146
 LandauTest.C:147
 LandauTest.C:148
 LandauTest.C:149
 LandauTest.C:150
 LandauTest.C:151
 LandauTest.C:152
 LandauTest.C:153
 LandauTest.C:154
 LandauTest.C:155
 LandauTest.C:156
 LandauTest.C:157
 LandauTest.C:158
 LandauTest.C:159
 LandauTest.C:160
 LandauTest.C:161
 LandauTest.C:162
 LandauTest.C:163
 LandauTest.C:164
 LandauTest.C:165
 LandauTest.C:166
 LandauTest.C:167
 LandauTest.C:168
 LandauTest.C:169
 LandauTest.C:170
 LandauTest.C:171
 LandauTest.C:172
 LandauTest.C:173
 LandauTest.C:174
 LandauTest.C:175
 LandauTest.C:176
 LandauTest.C:177
 LandauTest.C:178
 LandauTest.C:179
 LandauTest.C:180
 LandauTest.C:181
 LandauTest.C:182
 LandauTest.C:183
 LandauTest.C:184
 LandauTest.C:185
 LandauTest.C:186
 LandauTest.C:187
 LandauTest.C:188
 LandauTest.C:189
 LandauTest.C:190
 LandauTest.C:191
 LandauTest.C:192
 LandauTest.C:193
 LandauTest.C:194
 LandauTest.C:195
 LandauTest.C:196
 LandauTest.C:197
 LandauTest.C:198
 LandauTest.C:199
 LandauTest.C:200
 LandauTest.C:201
 LandauTest.C:202
 LandauTest.C:203
 LandauTest.C:204
 LandauTest.C:205
 LandauTest.C:206
 LandauTest.C:207
 LandauTest.C:208
 LandauTest.C:209
 LandauTest.C:210
 LandauTest.C:211
 LandauTest.C:212
 LandauTest.C:213
 LandauTest.C:214
 LandauTest.C:215
 LandauTest.C:216
 LandauTest.C:217
 LandauTest.C:218
 LandauTest.C:219
 LandauTest.C:220
 LandauTest.C:221
 LandauTest.C:222
 LandauTest.C:223
 LandauTest.C:224
 LandauTest.C:225
 LandauTest.C:226
 LandauTest.C:227
 LandauTest.C:228
 LandauTest.C:229
 LandauTest.C:230
 LandauTest.C:231
 LandauTest.C:232
 LandauTest.C:233
 LandauTest.C:234
 LandauTest.C:235
 LandauTest.C:236
 LandauTest.C:237
 LandauTest.C:238
 LandauTest.C:239
 LandauTest.C:240
 LandauTest.C:241
 LandauTest.C:242
 LandauTest.C:243
 LandauTest.C:244
 LandauTest.C:245
 LandauTest.C:246
 LandauTest.C:247
 LandauTest.C:248
 LandauTest.C:249
 LandauTest.C:250
 LandauTest.C:251
 LandauTest.C:252
 LandauTest.C:253
 LandauTest.C:254
 LandauTest.C:255
 LandauTest.C:256
 LandauTest.C:257
 LandauTest.C:258
 LandauTest.C:259
 LandauTest.C:260
 LandauTest.C:261
 LandauTest.C:262
 LandauTest.C:263
 LandauTest.C:264
 LandauTest.C:265
 LandauTest.C:266
 LandauTest.C:267
 LandauTest.C:268
 LandauTest.C:269
 LandauTest.C:270
 LandauTest.C:271
 LandauTest.C:272
 LandauTest.C:273
 LandauTest.C:274
 LandauTest.C:275
 LandauTest.C:276